Autore Topic: esecuzione di una subroutina in Assembly  (Letto 194 volte)

input

  • Neo-iscritto
  • *
  • Post: 35
  • Gioco Preferito: arkanoid
esecuzione di una subroutina in Assembly
« il: 10 Aprile 2021, 00:22:16 »
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

  • Administrator
  • Utente
  • *****
  • Post: 696
  • Gioco Preferito: Impossible Mission
Re:esecuzione di una subroutina in Assembly
« Risposta #1 il: 10 Aprile 2021, 16:34:56 »
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.
Non rispondo a richieste private, di qualunque genere esse siano.
Per domande tecniche leggete le FAQ e usate l'apposito forum.
Per questioni amministrative contattate lo staff tramite il form Contatti sul sito.