Commodore 64 > Aiuto & Domande
esecuzione di una subroutina in Assembly
(1/1)
input:
buonasera , chiedevo perche nell eseguire il programma essso funziona solo se inserisco rts(RETURN) alla fine del programma , e funziona parzialmente se lo inserito dopo la fine della subroutina , dove credo che sia giusto che venga messo ,
; 10 SYS (4096)
*=$0801
BYTE $0E, $08, $0A, $00, $9E, $20, $28, $34, $30, $39, $36, $29, $00, $00, $00
;-----------------------------------------------------------------
; UTILIZzo UNA SOTTOPROCEDURA(SUBROUTINE ) IN L.M:
;1° (assegna i colori al bordo e allo sfondo)
;2° (salta alla :dho:gosub come in basic)
;3° con rts conclude il programma
;-----------------------------------------------------------------
*=$1000
;---------------------------------------------------------------
;1° ad essere eseguito salta alla sobrutina con Gosub (come il Basic)
jsr gosub ;
;---------------------------------------------------------------
lda#$07 ;7 = colore giallo
sta$d020 ;Poke53280,7 (colora il bordo di giallo)
lda#$02 ;2 = colore rossso
sta$d021 ;Poke53281,2 (colora òo sfondo di rosso)
;----------------------------------------------------------------
;2° ad essere eseguito
;----------------------------------------------------------------
gosub lda#32 ;32 = SPACE (cancella le prime 255 locazioni )
ldx#$00 ;x=0
go sta$0400,x ;Poke1024+x,32
inx ;X=x+1
cpx#250 ;confronta X con 250
bne go ;if <=250 vai al go altrimenti segui il flusso dopo rts
; rts (RETURN) finita la sobrutina dovrebbe proseguire il programma , ma non mi
;funziona se attivo questo rts
;----------------------
;3° ad essere eseguito
;----------------------
lda#$04 ;7 = colore giallo
sta$0400 ;Poke53280,7 (colora il bordo di giallo)
lda#$03 ;2 = colore rossso
sta$d800 ;Poke53281,2 (colora òo sfondo di rosso)
rts ;SE INSERITO SOLO QUA IL PROGRAMMA FUNZIONA CORRETTAMENTE
eregil:
Se metti la RTS alla subroutine, il terzo blocco non viene mai eseguito. Questo perché dopo l'esecuzione del primo blocco, poiché non c'è alcun salto (JMP) al terzo, l'esecuzione passa nuovamente alla "subroutine" senza che sia stata eseguita la JSR, perciò il blocco viene eseguito come se fosse parte del programma principale, e la RTS viene interpretata come fine del programma, con ritorno al BASIC se avevi chiamato il programma con una SYS.
Quindi, tieni la RTS della subroutine, ma aggiungi una JMP prima della subroutine per passare dal primo al terzo blocco, oppure (meglio) riorganizza i blocchi in maniera più organica.
Navigazione
[0] Indice dei post
Vai alla versione completa