ich wollte hier mal ein Problem diskutieren, was mich im aktuellen Projekt schon lange beschäftigt und auch schon diverse Abstürze und schlaflose Nächte gekostet hat... es wird aber nur diejenigen interessieren, die verschiedene Banks benutzen.
Hintergrund:
CavernsOfEris nutzt neben RAM unter ROM auch alle Banks. Normalerweise ist Bank 0 aktiv, die liegt zwischen $4000 und $7fff - nutzt man die übrigen Banks nicht, dann kann man hier ohne Einschränkung den Speicher $4000-$7FFF mit Programmcode betreiben. Braucht man die anderen Banks, dann schaltet man ja die jeweiligen Banks im Bereich $4000-$7FFF aktiv und der Code z.B. in Bank 0 wird ausgeblendet. Der ist quasi weg... bis man die Bank 0 wieder anschaltet.
Bei einem Atari 130 XE kann ich also nur partiell auf die 81920 Bytes zugreifen, 65536 Bytes sind quasi immer ausgeblendet.
Jetzt könnte es mal notwendig sein, daß ein gerade ausgeführter Code in Bank3 (diese ist gerade eingeblendet) auf einen Code in Bank0 zugreifen will - z.B. mit einem JSR - danach soll der Code in Bank3 nach Ausführung des Codes in Bank0 weiterlaufen... das geht natürlich nicht, da sich der Rechner im Nirwana verliert, wenn ich die Bank3 abschalte und Bank0 einschalte und dann noch den JSR von Bank3 aus in Bank0 ausführen möchte!!
Was tun?
Meine Lösung:
bankq ist die Quelle - also von welcher Bank komme ich (hier im Beispiel Bank3)
bankz ist das Ziel - also in welcher Bank (hier Bank1) soll das Unterprogramm ausgeführt werden
Man geht über eine Brücke im Hauptprogramm außerhalb der Banks... die Brücke liegt also außerhalb $4000-$7FFF
die Brücke sieht folgendermaßen aus:
Code: Alles auswählen
.proc banksw
lda bankz
sta portb
ladenjsr jsrziel = *+1
jsr $ffff
lda bankq
sta portb
rts
.endp
Code: Alles auswählen
lda #$cb ;der Aufruf kommt von Bank3
sta bankq
lda #$c3 ;Bank 1 ($c3) auswählen
sta bankz
mwa #beispiel banksw.jsrziel ;hier wird jetzt jsr beispiel initialisiert
jsr banksw ;Sprung zur Brücke, jsr beispiel wird in Bank1 ausgeführt, danach geht es zurück zum
....... ;zum Code in Bank3
Gruß
Peter