Autore Topic: Unire Routine Lm E Basic  (Letto 5282 volte)

bridge

  • Neo-iscritto
  • *
  • Post: 9
Unire Routine Lm E Basic
« il: 12 Aprile 2004, 01:19:56 »
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

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Unire Routine Lm E Basic
« Risposta #1 il: 12 Aprile 2004, 04:07:13 »
 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: [Seleziona]
10 LOAD"ROUTINELM",8,1
20 rem resto del prog
continuera' all'infinito a caricare la routine...
si puo' ovviare scrivendola cosi':
Codice: [Seleziona]
10 IF A=0 THEN A=1:LOAD"ROUTINELM",8,1
Si puo' usare questo metodo, che consiste nel chiamare le routine di SETNAM e LOAD tramite SYS.
Codice: [Seleziona]
10 SYS57812"ROUTINELM",dv,0:POKE780,0:POKE781,0:POKE782,192:SYS65493
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: [Seleziona]
dv=PEEK(186)
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.
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

MarC=ello

  • Utente
  • **
  • Post: 337
  • Gioco Preferito: CBM BASIC 2.0
Unire Routine Lm E Basic
« Risposta #2 il: 12 Aprile 2004, 14:49:00 »
 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: [Seleziona]
* = $C000
lda #$01
sta $d020
rts

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

Codice: [Seleziona]
169, 1, 141, 32,208,96
(ho disassemblato a memoria... spero di avere fatto bene...).

Supponiamo di caricare i valori da 49152 in poi:

Codice: [Seleziona]
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

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!
 ;)  
-=MarC=ellO=-

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Unire Routine Lm E Basic
« Risposta #3 il: 12 Aprile 2004, 16:18:10 »
 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
LDY ># 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)
25 POKE 782, >#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?
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

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Unire Routine Lm E Basic
« Risposta #4 il: 12 Aprile 2004, 18:23:25 »
 
Citazione da: "Alberto"
15 POKE 780,len_nome (in decimale)
20 POKE 781, <# nome (in decimale)
25 POKE 782, >#nome (in decimale)
30 SYS 65469
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 :)
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

MarC=ello

  • Utente
  • **
  • Post: 337
  • Gioco Preferito: CBM BASIC 2.0
Unire Routine Lm E Basic
« Risposta #5 il: 14 Aprile 2004, 00:00:19 »
 Ciao Alberto!

Grazie per i consigli gentilmente forniti... sei stato molto gentile: un ripasso al KERNAL è sempre molto gradito!  ;)

Tuttavia il dubbio mi rimane. Forse non ho formulato la domanda in maniera corretta. Quello che mi chiedo è: come sono strutturati i file PRG?

Ad esempio, considerato questo microscopico programma in l.m:
169,1,96

che pone il valore 1 entro l'accumulatore,

per memorizzarlo occorrerà usare un prg BASIC (per esempio) del tipo il seguente:

10 OPEN 1,8,1,"PROGRAMMA1"
20 REM devo salvare il byte alto e basso dell'indirizzo di partenza del progr?
30 PRINT#1, 169,1,96
40 CLOSE 1

Il problema è la linea 20... prima del codice linguaggio macchina, devo memorizzare la locazione di partenza del programma? Siccome mi trovo disorientato su questo argomento, prego qualcuno di informarmi riguardo alla struttura di un file PRG. Grazie.  ;)

Cioè, mi chiedo, come il KERNAL memorizza i file PRG. Quali dati memorizza? Come è strutturato un file PRG?
-=MarC=ellO=-

MarC=ello

  • Utente
  • **
  • Post: 337
  • Gioco Preferito: CBM BASIC 2.0
Unire Routine Lm E Basic
« Risposta #6 il: 14 Aprile 2004, 00:01:58 »
 Ho provato a mettere l'indirizzo di partenza prima del codice (come byte alto e byte basso) ma non ho ottenuto i risultati sperati...
-=MarC=ellO=-

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Unire Routine Lm E Basic
« Risposta #7 il: 14 Aprile 2004, 02:49:09 »
 
Citazione
Il problema è la linea 20... prima del codice linguaggio macchina, devo memorizzare la locazione di partenza del programma?
Si.
Citazione
Come è strutturato un file PRG?
Indirizzo di partenza in formato byte basso/byte alto poi tutti i bytes.
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

MarC=ello

  • Utente
  • **
  • Post: 337
  • Gioco Preferito: CBM BASIC 2.0
Unire Routine Lm E Basic
« Risposta #8 il: 14 Aprile 2004, 23:15:48 »
 Grazie! ;)

 
-=MarC=ellO=-