Commodore 64 > Programmazione, Grafica e Musica

Unire Routine Lm E Basic

(1/2) > >>

bridge:
Salve,domanda per voi forse banale,
Vorrei usare una routine in lm,usando l'istruzione sys 49152 (ind. di partenza)
da un listato basic.
Prima di tutto non so come far caricare routine in questione dal disco,dopo il run del listato basic,una riga con un load"routine lm" non va.
Anche caricando manualmente prima la routine e poi il basic e lanciandolo,alla prima riga con l'istruzione sys,il programma si pianta e non apre la routine.
qalcuno mi puo' aiutare?
Ciao e grazie

iAN CooG:
 Quando si carica un programma i puntatori di fine basic/inizio variabili vengono settati all'indirizzo finale del file caricato. Se tu carichi un prg che parte da 49152 ($c000) il basic si ritrovera' senza spazio variabili (la cui fine e' settata a $9fff)
Quindi prima carichi la rountine, dai NEW per ripristinare i puntatori BASIC, poi carichi il programma basic.
Si puo' caricare da programma? Certo. Pero', a complicare le cose, il LOAD forza un RUN a fine esecuzione, quindi un prg che inizia con la riga

--- Codice: ---10 LOAD"ROUTINELM",8,1
20 rem resto del prog

--- Termina codice ---
continuera' all'infinito a caricare la routine...
si puo' ovviare scrivendola cosi':

--- Codice: ---10 IF A=0 THEN A=1:LOAD"ROUTINELM",8,1

--- Termina codice ---
Si puo' usare questo metodo, che consiste nel chiamare le routine di SETNAM e LOAD tramite SYS.

--- Codice: ---10 SYS57812"ROUTINELM",dv,0:POKE780,0:POKE781,0:POKE782,192:SYS65493

--- Termina codice ---
SYS57812 serve per caricare il file indicato tra"", dal device dv e all'indirizzo preferito (,0) bypassando il normale indirizzo memorizzato nei primi 2 byte del file.
POKE780,0 setta il Load (1 per verify)
POKE781,0:POKE782,192 significano che voglio caricare "RoutineLM" a $c000 (49152 e' = 0+192*256)
SYS65493 infine effettua il comando, ma senza gli effetti collaterali del comando LOAD.

dv e' l'unita' disco da cui hai caricato il main program, la puoi ottenere prendendo il valore dell'ultima unita' usata:

--- Codice: ---dv=PEEK(186)

--- Termina codice ---
cosi' da ottenere un prg che funziona da qualsiasi device tu l'abbia caricato.

Tutto questo lo si puo' evitare usando un linker e comprimendo il file finale.

MarC=ello:
 In generale io ho un dubbio che mi assale: come è il formato PRG?
Ora spiego meglio il mio dubbio.
Supponiamo di avere il seguente programma in assembler:


--- Codice: ---* = $C000
lda #$01
sta $d020
rts

--- Termina codice ---

il quale setta a "bianco" il colore del bordo. Il dump decimale è:


--- Codice: ---169, 1, 141, 32,208,96
--- Termina codice ---

(ho disassemblato a memoria... spero di avere fatto bene...).

Supponiamo di caricare i valori da 49152 in poi:


--- Codice: --- 5 C=0: REM FACOLTATIVO
10 READA
15 POKE49152+C,A:IFA=96THENEND
18 C=C+1:GOTO10
20 DATA 169,1,141,32,208,96

--- Termina codice ---

Digitando SYS 49152, il programma viene eseguito... e fino a qui, nessun dubbio.

Ecco, come va scritta una routine (ad esempio, per semplicità, in BASIC) che salvi questo programma su disco? Come è il formato del file .prg che dovrò costruire?
In altre parole, voglio salvare i dati numerici in modo tale che, digitando LOAD "nomefile",8,1 questi vengano caricati alla locazione 49152.

Ringrazio di cuore chi mi vorrà aiutare. Ciao!
 ;)  

Alberto:
 Ciao Marcello!

Puoi usare il seguente listato macchina

LDX #$08
JSR $FFBA            ; chiama la 'setlfs' su disco
LDA len_nome      ; carica in A la lunghezza del nome del file
LDX # nome       ; carica in X e Y l'indirizzo di partenza del nome del file
JSR $FFBD            ; chiama la 'setnam'
LDA #$00
LDX #$C0       ; A e X  contengono l'indirizzo di partenza da cui salvare la routine
STA $02
STX $03        
LDA #$02       ; setta il puntatore all'indirizzo di partenza
LDX #$06    
LDY #$C0      ; X e Y contengono l'indirizzo finale della routine da salvare
JSR $FFD8     ; chiama la 'SAVE'

o,equivalentamente,il listato Basic

5 POKE 781,8
10 SYS 65466
15 POKE 780,len_nome (in decimale)
20 POKE 781, #nome (in decimale)
30 SYS 65469
35 POKE 2,0:POKE 3,192
40 POKE 780,2
45 POKE 781,6
50 POKE 782,192
55 SYS 65496


--- Citazione ---Come è il formato del file .prg che dovrò costruire?

--- Termina citazione ---
Non devi preoccuparti del formato del file prg;questo conterrà semplicemente l'indirizzo di partenza della routine ( che verà letto non appena darai LOAD"",8,1 ) e i codici macchina del programma ;)


Ciauz!

iAN CooG:
 
--- Citazione da: "Alberto" ---15 POKE 780,len_nome (in decimale)
20 POKE 781, #nome (in decimale)
30 SYS 65469

--- Termina citazione ---
Da basic la vedo un po' dura dare i valori corretti da mettere in 781/782 specie se si tratta di una variabile.

100 SYS 57812 N$,8,1
101 POKE 193,0:POKE 194,192
102 POKE 174,6:POKE 175,192
103 SYS 62957

e il gioco e' fatto :)

Navigazione

[0] Indice dei post

[#] Pagina successiva

Vai alla versione completa