Commodore 64 > Programmazione, Grafica e Musica
Routine Di Delete
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
Vai alla versione completa