Ready64 Forum
Commodore 64 => Programmazione, Grafica e Musica => Topic aperto da: Roberto - 14 Aprile 2004, 14:14:07
-
Ho trovato su un nastro della Systems la seguente routine. Non avendo la documentazione (cioè la rivista allegata alla cassetta) non ho idea di cosa possa essere. Ho tokenizzato il .prg, ed ecco il listato. A cosa serve??
10 rem *********************
20 rem * *
30 rem * routine di delete *
40 rem * *
41 rem * a cura di *
43 rem * *
45 rem * commodore club *
46 rem * *
47 rem *********************
80 fort=49152to49282:reada:poket,a:p=p+a:next
90 sys49283
140 data32,253,174,32,107,169,32,19,166,165,95,133,251,165,96,133,252,169
141 data171,32,255,174,32,107,169,165,20,5,21,208,21,165,46,133,96,166,45
142 data224,2,176,2,198,96,202,202,134,95,160,0,76,69,192,32,19,166,160,0
143 data177,95,72,200,177,95,133,96,104,133,95,136,165,252,197,96,240,3,144
144 data7,96,165,251,197,95,176,249,165,95,197,45,208,6,165,96,197,46,240
145 data18,177,95,145,251,230,251,208,2,230,252,230,95,208,230,230,96,208
146 data226,165,251,133,45,165,252,133,46,32,96,166,32,51,165,76,174,167
-
Ciao Rob
Ho tokenizzato il .prg, ed ecco il listato. A cosa serve??
Questo ( lo dico anche a beneficio di chi non sa cosa sia ) è un caricatore Basic ( cui abbiamo fatto cenno io,Ian e Marcello nel post 'Ottimizzare i programmi Basic',in questa sezione... ).
In pratica è un programma che legge tutti i valori delle linee 'data' e li mette,uno per uno,nella zona di memoria compresa tra le locazioni 49152 e 49282.
Ogni valore corrisponde al codice di un'istruzione macchina (o di un operando di tale istruzione) ;per capire cosa fa la routine,bisognerebbe vederne il codice in formato simbolico...comunque,dal nome 'delete',suppongo cancelli qualcosa ( probabilmente ripulisce una determinata zona di memoria ...)
90 sys49283
Non ne manca un pezzo? :dotto:
-
non so altro, il programma è piazzato a conclusione della cassetta (che contiene giochi e utility). ho messo online il file per chi fosse interessato a scoprirne di più :D http://ready64.altervista.org/temp/secret/DELETE.PRG (http://ready64.altervista.org/temp/secret/DELETE.PRG)
-
Va bene,più tardi provo a disassemblare il codice... ;)
-
;) okk non c'è fretta
-
Ciao a tutti
Ecco il disassemblato della routine che mi hai chiesto
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
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...
-
sono comunque un paio di istruzioni nebulose ( come LDA #$AB seguito da JMP $AEFF
Ho controllato, $AB e' il token basic di "-"
Ad esempio nella routine del FOR viene fatto un
A76D A9 A4 LDA #$A4; token di "TO"
A76F 20 FF AE JSR $AEFF
A772 20 8D AD JSR $AD8D
Ci deve essere qualcosa che non va con tuo disassemblatore perche' il codice
c06a INC $5F
c06c JMP ($E6E6)
c06f RTS
in realta' e'
C06A E6 5F INC $5F
C06C D0 E6 BNE $C054
C06E E6 60 INC $60
-
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)...
C06E E6 60 INC $60
;)
Ci deve essere qualcosa che non va con tuo disassemblatore
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
-
Ok,ho corretto le righe errate ;)
-
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:
-
E' una routine in linguaggio macchina
Se hai un listato basic in memoria,la routine cancella certe righe del listato.
Ad esempio,impartendo
SYS 49152,20
viene cancellato tutto il listato,a partire dalla riga 20
impartendo invece
SYS 49152,20-40
vengono cancellate solo le righe dalla n.20 alla n.40
Capito adesso? :mattsid:
come mai l'hanno messo alla fine di una cassetta che contiene solo giochi.
Questo non lo so...però mi sembra strano,di solito la systems distribuiva i suoi programmi su disco...
-
Questo non lo so...però mi sembra strano,di solito la systems distribuiva i suoi programmi su disco...
I dischi andavano per la maggiore è vero. Ma ricordo anche io dei tapes della Systems ....
-
Si si, questo era un tape. Magari lo scansiono, può essere interessante.
Tra l'altro alla System hanno utilizzato un turbo un pò particolare, in pratica è un TURBOTAPE (quello con freccia L) modificato con le scritte in italiano che ogni volta introducono il gioco successivo. Insomma, non si tratta di un turbo incorporato nel programma ma appunto di uno esterno (cosa fastidiosa a mio modo di vedere).
-
:huh: se non sbaglio la versione disco costava 24.000 lire e la versione cassetta 12.000 lire della System :confused: o forse mi confondo con la mitica rivista Logica 2000 prima in cassetta e poi in Floppy Disk da 5/1/2 ? :hail: :c64: