Programme zwischen Banks ausführen...

Moderator: Rockford

Antworten
Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 274 times
Kontaktdaten:

Programme zwischen Banks ausführen...

Beitrag von Dr. Irata »

Hallöle,
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
Der Aufruf von BankX eines Codes in BankY:

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
... Verbesserungen oder alternative Ideen welcome !!

Gruß
Peter

Benutzeravatar
cas
Beiträge: 832
Registriert: 18.06.2021 21:01
Wohnort: Solar System
Has thanked: 184 times
Been thanked: 370 times
Kontaktdaten:

Re: Programme zwischen Banks ausführen...

Beitrag von cas »

Idee: bankq auf den (Prozessor-) Stack legen statt in einer Speicherstelle speichern. Damit sind auch verschachtelte Aufrufe möglich. Wert für bankq nach der Rückkehr von Stack holen und die Bank umschalten.

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast