Commodore 64 > Programmazione, Grafica e Musica

Routine Di Delete

<< < (2/3) > >>

Alberto:
 Ciao a tutti

Ecco il disassemblato della routine che mi hai chiesto


--- Codice: ---c000   JSR $AEFD
c003   JSR $A96B  ; legge primo parametro della SYS
c006   JSR $A613  ; cerca la linea basic corrispondente al primo numero
c009   LDA $5F
c00b   STA $FB  
c00d   LDA $60
c00f   STA $FC    ; ($FB) = indirizzo di partenza della riga di testo
c011   LDA #$AB
c013   JSR $AEFF(?); CHR$(171)??
c016   JSR $A96B
c019   LDA $14
c01b   ORA $15
c01d   BNE $C034  ; secondo parametro presente,salta
c01f   LDA $2E
c021   STA $60
c023   LDX $2D
c025   CPX #$02
c027   BCS $C02B
c029   DEC $60
c02b   DEX
c02c   DEX        ; protegge l'area variabili
c02d   STX $5F    
c02f   LDY #$00
c031   JMP $C045  ; secondo parametro nullo,vai fino alla fine
c034   JSR $A613  ; cerca la linea basic corrispondente al secondo numero
c037   LDY #$00
c039   LDA ($5F),Y
c03b   PHA
c03c   INY
c03d   LDA ($5F),Y
c03f   STA $60      
c041   PLA
c042   STA $5F    ; metti l'indirizzo finale in $5F-$60          
c044   DEY
c045   LDA $FC
c047   CMP $60    
c049   BEQ $C04E
c04b   BCC $C054
c04d   RTS
c04e   LDA $FB
c050   CMP $5F    ; ultima riga?
c052   BCS $C04D  ; sì,torna
c054   LDA $5F
c056   CMP $2D    
c058   BNE $C060
c05a   LDA $60
c05c   CMP $2E    ; è stata raggiunta l'area delle variabili?
c05e   BEQ $C072  ; sì,stop
c060   LDA ($5F),Y
c062   STA ($FB),Y; no,cancella la riga basic riempiendo lo spazio vuoto  
c064   INC $FB
c066   BNE $C06A
c068   INC $FC
C06a   INC $5F
C06c   BNE $C054
C06e   INC $60
c070   BNE $C054
c072   LDA $FB
c074   STA $2D
c076   LDA $FC
c078   STA $2E    ; setta il nuovo indirizzo per l'area delle variabili
c07a   JSR $A660
c07d   JSR $A533; aggiorna i link del programma
c080   JMP $A7AE; esegue la prossima istruzione

--- Termina codice ---

L'ho esaminata velocemente...molto probabilmente si tratta di una routine per cancellare il contenuto delle linee Basic indicate come parametri della SYS.
Lo spazio occupato dalle righe cancellate viene occupato dalle righe successive;ad esempio,poni di avere questo listato

10 PRINT "CIAO"
20 A=10
30 PRINT A+2
40 GOTO 30

impartendo SYS 49152,20-30 vengono cancellate le linee 20-30;lo spazio precedentemente occupato in memoria da queste 2 linee,al termine della routine è occupato dalla linea 40.
Impartendo solo SYS 49152,20 vengono cancellate tutte le righe dalla 20 fino alla fine del programma.
Al termine della routine viene aggiornato l'indirizzo dell'area delle variabili ( che risulterà inferiore al vecchio indirizzo,essendo il programma più corto ).
Ci sono comunque un paio di istruzioni nebulose ( come LDA #$AB seguito da JMP $AEFF,invece di un logico JMP $AEFD,e un JMP ($E6E6) ).
Con ogni probabilità,la routine faceva parte di un listato più ampio,che può ( forse ) spiegare queste incongruenze...

iAN CooG:
 
--- Citazione ---sono comunque un paio di istruzioni nebulose ( come LDA #$AB seguito da JMP $AEFF
--- Termina citazione ---
Ho controllato, $AB e' il token basic di "-"
Ad esempio nella routine del FOR viene fatto un

--- Codice: ---A76D   A9 A4      LDA #$A4; token di "TO"
A76F   20 FF AE   JSR $AEFF
A772   20 8D AD   JSR $AD8D

--- Termina codice ---

Ci deve essere qualcosa che non va con tuo disassemblatore perche' il codice

--- Codice: ---c06a            INC $5F
c06c            JMP ($E6E6)
c06f            RTS

--- Termina codice ---
in realta' e'

--- Codice: ---C06A  E6 5F     INC $5F
C06C  D0 E6     BNE $C054
C06E  E6 60     INC $60

--- Termina codice ---

Alberto:
 Ciao Ian

Grazie della correzione...adesso si spiega quel #$AB ( è il token - tra i due parametri della SYS ;) )
Inoltre,mi chiedevo perchè non venisse incrementato il byte alto dell'indirizzo da copiare ($60)...

--- Citazione ---C06E  E6 60     INC $60

--- Termina citazione ---
;)

--- Citazione ---Ci deve essere qualcosa che non va con tuo disassemblatore
--- Termina citazione ---
Il disassemblatore funziona bene,semplicemente ho inserito un 'data' sbagliato nel caricatore Basic ( 108,che è l'opcode del JMP indiretto,invece di 208 che è l'opcode della BNE,le giornate pesanti mi fanno brutti scherzi  :sonno: )...
Uh,mitico il marchio del C= ( l'ho notato adesso ...)!!!
Ciauz

Alberto:
 Ok,ho corretto le righe errate ;)
 

Roberto:
 In pratica non ho ancora capito cosa fa questo programma, e come mai l'hanno messo alla fine di una cassetta che contiene solo giochi. :fagiano:  

Navigazione

[0] Indice dei post

[#] Pagina successiva

[*] Pagina precedente

Vai alla versione completa