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
10 LOAD"ROUTINELM",8,1
20 rem resto del prog
continuera' all'infinito a caricare la routine...
si puo' ovviare scrivendola cosi':
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.
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:
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.