Innanzi tutto, l'immagine CRT della AR6 la puoi
scaricare da qui.Poi ti confermo tutti i miei sospetti: il codice DASM originale del loader contenente le subroutine per la gestione dello scrolltext, grafica e musica, contiene una MONTAGNA DI FUFFA.
Sono partito dal mio "multiloader" e ho ricostruito un loader concettualmente identico, ma con codice nuovo.
Ne trovi un esempio con musica e scrolltext
scaricabile da qui.
Da notare che il mio codice non compie nessuna "raffinatezza" nel codice d'uscita: setta $01, "spegne" il SID e salta brutalmente all'indirizzo di partenza del programma linkato.
Ho semplificato molto le cose: un trigger per ogni file che viene attivato DOPO il load del file stesso (eh...si... prima si carica la musica e poi la si esegue... oppure prima si carica un file e poi si fa partire lo scrolltext...).
Non riesco a capire perchè l'autore originario l'abbia pensata diversamente, ma io mi limito a lanciare l'esecuzione dopo il caricamento delll'ultimo file.
A quel punto si presuppone che tutto sia in memoria e che si possa andar tranquilli...
Cose da sistemare: resettare ai valori di default i registri CIA e Vettori IRQ prima di lanciare il programma caricato. Il codice originale DASM, fra i vari macelli che fa, non si preoccupa minimamente di ripristinare le cose e, molto probabilmente, i problemi che hai "post loading" sono dati dai vettori IRQ che puntano lanciati verso il nulla cosmico.
(Quando sarò soddisftatto di come funziona posto anche una versione completa... ma per ora:)
-Nucleo principale del mio loader-
;-------------------
JSR INIT_TURBO
LDY #FILES_TO_LOAD
STY FILE_N_BUFFER
JSR TURBO_LOAD
;-------------------
LDA #PROGRAM_01
STA $01
JSR $E544
JMP PROGRAM_START
Cioè: "quanti files devo caricare?", "Ok, li carico", "...bene... ho finito di caricare, setto $01 e lancio il programma".
"Main" part che gestisce il caricamento dei files, -interfacciandosi- col codice che gira in IRQ:
;---------------------------------------
; TURBO_LOAD
; Entered with "Y" equals number of files
; to load
;-------------------
TURBO_LOAD
BIT $D011
BPL TURBO_LOAD
TURBO_WAIT
BIT $D011
BMI TURBO_WAIT
;-------------------
MUSIC_FLAG = *+$0001
LDA #$00
BEQ MUSIC_DISABLED
JSR MUSIC_PLAY
MUSIC_DISABLED
;-------------------
SCROLL_FLAG = *+$0001
LDA #$00
BEQ SCROLL_DISABLED
JSR SMOOTH_SCROLL
LDA $D016 ; do the hardware x scroll
AND #%11111000
SMOOTH_X = *+$0001
ORA #$00
STA $D016
;-------------------
SCROLL_DISABLED
LDX LOAD_FLAG ; wait for nonzero ($FF) loadflag value
BEQ TURBO_LOAD
INX ; reset loadflag
STX LOAD_FLAG
;-------------------
ACTUAL_FILE = *+$0001
LDX #$00
LDA FILE_TRIGGERS,X ; see if anything is required to happen
BEQ NO_TRIGGER
ASL
TAX
LDA ROUT_LOOKUP,X ; do any routines required
STA JUMPVEC_1+$0001
LDA ROUT_LOOKUP+$0001,X
STA JUMPVEC_1+$0002
JUMPVEC_1
JSR $DEAD ; self modified
;-------------------
NO_TRIGGER
INC ACTUAL_FILE
FILE_N_BUFFER = *+$0001
LDY #$00
DEY
STY FILE_N_BUFFER
BNE TURBO_LOAD
Come vedi, niente di trascendentale:
Soliti BIT $D011 per sincronizzarsi al VB (al posto di quel macello di CMP e OVERLAY che usa l'originale), semplici FLAGS per lanciare musica, scrolltext e quant'altro, e lo stesso codice di TRIGGERING.
Ovviamente oltre a questo, c'è il codice di INIT dell'IRQ e il codice IRQ vero e proprio, che è lo stesso dell'originale.
Quindi il "SAVER" funziona correttamente... i problemi li crea tutti il LOADER.