Hallo in die Runde!
Mein neues Projekt ist ja auf einen Atari 130 mit 128 kB ausgelegt, daher brauche ich das Bank Switching!
Da ich die animierten Daten aktuell aus Bank 0 und Bank 1 (später auch aus Bank 2 und 3) hole, die komplette Hintergrundmusik aber in Bank 4 liegt, muss ich relativ oft die Banks umschalten.
Die Musik (Bank 4) wird über einen DLI aufgerufen - hier wird also ständig "geschaltet".
Nun habe ich letztens bei dem Programmlauf festgestellt, daß relativ zufällig aber dann doch konstant nach recht langer Laufzeit des Programmes (durchaus mal 1-2 Stunden) zunächst der Player abstürzt (bzw. hier falschen Daten reingeschrieben werden) und irgendwann der Rechner / Emulator komplett abstürzt.... ein fieser Bug also.
Die letzten vielen Tage habe ich also mein Code durchforstet, einzelne Subroutinen abgeschaltet, um den Ursprung des Fehlers einzugrenzen und somit zu entdecken... ohne Erfolg. Ich dachte zunächst primär, es liege an der Softwarespriteroutine in Zusammenspiel mit dem Scrolling, aber das bestätigte sich nicht. Den Fehler habe ich einfach nicht gefunden. Den Code habe ich dann Janko geschickt, aber auch er hat zunächst den Fehler in dem schon recht komplexen und langen Code nicht entdecken können...
Ich war schon echt verzweifelt und bereit, das Projekt in dieser Form einzustampfen und völlig neu aufzusetzen, doch dann kam die entscheidende Idee von Janko!!
Ich schalte die Banks nicht korrekt um... es klingt so trivial und logisch, aber manchmal sieht mal den Wald vor lauter Bäumen nicht.
Wenn ich die Bank wechsele, dann muss ich danach natürlich in die Bank zurück wechseln, wo ich gerade war - logisch! Ich bin immer schön in die Hauptbank 0 (wo noch die meisten Daten stehen) zurückgewechselt und natürlich kommt das Programm irgendwann komplett durcheinander. Das Problem war nun schnell behoben und ich poste hier mal, wie man diesen Bank Switch ganz einfach durchführen kann:
Ich definiere 2 Variablen - eine für den Bank Switch, der im Hauptprogramm durchgeführt wird und die andere für den Switch, der durch den DLI erfolgt. Macht man auch noch einen Switch via VBI, dann braucht man wohl noch eine dritte Variable.
In portb steht der Wert für die aktuelle Bank. Diesen Wert einfach auslesen und temporär in die Variable speichern, dann die gewünschte Bank anwählen und in portb neu abspeichern, wenn die ausführende Routine fertig ist, einfach den temporär gespeicherten Wert in portb zurückspeichern!
Ist also recht einfach!
Code: Alles auswählen
portb = $d301
bank .by 00
bankdli .by 00
;Hauptprogramm
;Bank 0 - $ff
;Bank 1 - $c3
;Bank 2 - $c7
;Bank 3 - $cb
;Bank 4 - $cf
start ;hier startet z.B. das Hauptprogramm
.....
;jetzt der Bank Switch
lda portb
sta bank
lda #$cf ;wir laden den Wert für Bank 4
sta portb
.... ;Programmcode wo jetzt Bank 4 aktiv ist
;jetzt soll wieder zurück geschaltet werden
lda bank ;wir laden die Bank, die vor dem Switch aktiv war
sta portb
... ;weiterer Code
jmp start
; ein Bank Switch im dli oder vbi geht identisch, nur hier nimmt man dann
;die Variable bankdli (oder bankvbi)
Gruß
Peter