Bank Switching

Moderator: Rockford

Antworten
Benutzeravatar
Dr. Irata
Beiträge: 937
Registriert: 24.08.2021 14:40
Has thanked: 110 times
Been thanked: 268 times
Kontaktdaten:

Bank Switching

Beitrag von Dr. Irata »

... hat eigentlich hier jemand Erfahrung mit Bank-Switching??
Von der Theorie ist das schon klar, aber wenn ich jetzt ein Programm in MADS unter Eclipse/WUDSN schreibe, wie sage ich denn dem System, daß er jetzt zB. irgendwelche Daten in den "hohen" Bereich legen soll? Mit org $186A0 für 100000. wird das wohl nicht gehen...

Gruß

Peter

Online
Benutzeravatar
andymanone
Beiträge: 2498
Registriert: 17.08.2021 12:34
Wohnort: Berlin - Suburban
Has thanked: 491 times
Been thanked: 789 times
Kontaktdaten:

Re: Bank Switching

Beitrag von andymanone »

Mit Mads hab ich noch nichts gemacht,
aber damals in ATMAS II eine Stereo-Sound-Sampledemo für 320k mal programmiert...

Prinzipiell blendet man einfach (per PIA Port B) eine der zusätzlichen 16k-RAM Bänke im untern (normalen) RAM-Bereich ein (die Daten im ursprünglichen 16k-Block bleiben weiterhin bestehen) und schreibt dann die Daten dort weiter an die gleichen Adressen,
bis der Bereich voll ist und blendet dann den nächsten (X+1) RAM-Bereich wieder ein.

Hier im 130XE Handbuch ist das recht simpel erklärt:
Bankswitching 139XE.jpg
Meintest Du das?
Oder habe ich die Frage falsch verstanden :)?

Gtx.,
andY
Ressortleiter Hardware - Save the past and use the future!© andYManOne / Demozoo / Youtube

Benutzeravatar
Olix
Beiträge: 987
Registriert: 17.08.2021 07:06
Has thanked: 117 times
Been thanked: 405 times
Kontaktdaten:

Re: Bank Switching

Beitrag von Olix »

Was ist das denn für ein Dokument "130 XE Handbuch" ?

Das kenn ich noch gar nicht.
Gibts das wo als PDF Download?

Online
Benutzeravatar
andymanone
Beiträge: 2498
Registriert: 17.08.2021 12:34
Wohnort: Berlin - Suburban
Has thanked: 491 times
Been thanked: 789 times
Kontaktdaten:

Re: Bank Switching

Beitrag von andymanone »

Ja,

das war früher bei jedem 130XE dabei ;)

Hier nur als "mittelmäßiger" Scan (gibts sicher irgendwo noch besser ;) ), aber man kann es lesen...

Ich hänge das hier mal mit an...

Die englische Version (in etwas besserer Qualität) hab ich auch noch irgendwo, bei Bedarf schick ich die noch nach....


Gtx.,
andY
ATARI130XE-HandbuchDE.pdf
(11.4 MiB) 55-mal heruntergeladen
Ressortleiter Hardware - Save the past and use the future!© andYManOne / Demozoo / Youtube


Benutzeravatar
Dr. Irata
Beiträge: 937
Registriert: 24.08.2021 14:40
Has thanked: 110 times
Been thanked: 268 times
Kontaktdaten:

Re: Bank Switching

Beitrag von Dr. Irata »

Vielen Dank für die Antworten! Das hilft schon mal weiter.
Allerdings habe ich noch folgendes Problem:

Wenn ich auf MADS nun ein Programm in Assembler schreibe und irgendwann an die natürliche Speicher grenze komme (wie bei BoE passiert), dann wäre es doch ganz normal auf dem Atari 130 XE System die übrigen Banks zu nutzen. Aber wie sage ich MADS, daß das Programm (oder Programmteile) jetzt in den anderen Banks liegen. Wenn ich z.B. eine oder mehrere Subroutinen "nach oben" auslagern will??

Benutzeravatar
Kveldulfur
Beiträge: 624
Registriert: 17.08.2021 02:32
Has thanked: 237 times
Been thanked: 163 times
Kontaktdaten:

Re: Bank Switching

Beitrag von Kveldulfur »

Hallo!

Ich glaube, dass was Du suchst steht hier:
https://mads.atari8.info/mads_eng.html#banks

Mein Englisch ist leider nicht so gut, aber dort wird beschrieben, wie Du in Mads für die unterschiedlichen Bänke daten kompilieren kannst.

Grüße
Janko

Benutzeravatar
Dr. Irata
Beiträge: 937
Registriert: 24.08.2021 14:40
Has thanked: 110 times
Been thanked: 268 times
Kontaktdaten:

Re: Bank Switching

Beitrag von Dr. Irata »

Danke Janko, das habe ich mir auch schon durchgelesen aber ich verstehe es nicht. Die Assembler-Hilfe von Mads finde ich auch echt "rudimentär".

Benutzeravatar
Kveldulfur
Beiträge: 624
Registriert: 17.08.2021 02:32
Has thanked: 237 times
Been thanked: 163 times
Kontaktdaten:

Re: Bank Switching

Beitrag von Kveldulfur »

Ja, musste auch etwas tüffteln.
Dabei kam folgender Code heraus, wobei das meiste nur der Demonstration dient:

Code: Alles auswählen

		OPT B+
		
		ORG $2000

ROWCRS		EQU $0054
COLCRS		EQU $0055
SAVMSC		EQU $0058
IOCB0		EQU $0340
PORTB		EQU $d301
CIOV		EQU $e456

@PROC_ADD_BANK 	EQU PAB		; Label muss fürs Macro @BANK_ADD definiert sein
@TAB_MEM_BANKS  EQU TMB		; dito
		
		ICL "MACROS\@bank_add.mac"
		
		; Speicherplatz reservieren
PAB		DTA "0123456789"

		; Definitionen der Banken an PORTB
TMB		DTA B($FF)	; Keine Bank
		DTA B($C3)	; Bank 1
		DTA B($C7)	; Bank 2
		DTA B($CB)	; Bank 3
		DTA B($CF)	; Bank 4
		
		.proc MAIN
		
		JSR Graphics0
		
		LDX #0		; Bank 0 auswählen
		JSR SW_BANK
		
		LDA #0		; Text 0 ausgeben
		LDX #2
		LDY #4
		JSR TextAusgabe

		LDA #1		; Text 1 ausgeben
		LDX #2
		LDY #6
		JSR TextAusgabe

		LDX #1		; Bank 1 auswählen
		JSR SW_BANK

		LDA #0		; Text 0 ausgeben
		LDX #2
		LDY #12
		JSR TextAusgabe

		LDA #1		; Text 1 ausgeben
		LDX #2
		LDY #14
		JSR TextAusgabe
		
Loop		JMP Loop		
		
		.endp
		
		run MAIN
		

; ##################################################################################################################				
; #### Aktive Bank auswählen
; ####
		.proc SW_BANK

 		LDA @TAB_MEM_BANKS,X	; Register X gibt die gewünschte Bank an
 		STA PORTB
 		
 		RTS

 		.endp
				
; ##################################################################################################################				
; #### Graphics per CIOV
; ####
        	.proc Graphics0
        	
		LDX #$60
		LDA #12		
		STA IOCB0+2,X	
		JSR CIOV
		LDA #0		
		STA IOCB0+$B,X	
		AND #$F0
		EOR #$10
		ORA #$0C
		STA IOCB0+$A,X
		LDA #3		
		STA IOCB0+2,X
		LDA #<DEVICE
		STA IOCB0+4,X
		LDA #>DEVICE
		STA IOCB0+5,X
		JSR CIOV
		RTS

DEVICE		DTA 'S:', $9B        	

		.endp
; ##################################################################################################################				
; #### Text - Ausgabe per CIOV
; ####
        	.proc TextAusgabe
        	
		STX COLCRS
		STY ROWCRS
		
		TAX		
		LDA TextLo,X        	
        	STA IOCB0+4  
		LDA TextHi,X        	
		STA IOCB0+5
		LDA #09 
		STA IOCB0+2
		LDA #100 
		STA IOCB0+8
		LDA #0
		STA IOCB0+9
		LDX #0 
		JSR CIOV 
		RTS

TextLo		DTA <Text1, <Text2         	
TextHi		DTA >Text1, >Text2         	

		.endp
		
; ##################################################################################################################				
; #### Daten in verschiedenen Banken				
; ####

		LMB #0, $4000
		
Text1		DTA c"Dies sind die Daten aus der Bank 0",$9b        	
Text2		DTA c"Einem reichen Manne, dem wurde seine Frau krank, und als sie fuehlte, dass ihr Ende....'",$9b        	


		LMB #1, $4000
		
Text3		DTA c"Dies sind die Daten aus der Bank 1",$9b        	
Text4		DTA c"Darauf tat sie die Augen zu und verschied. Das Maedchen ging jeden Tag hinaus zu dem Grabe...",$9b        	

Du musst das Macro "@bank_add.mac" einbinden, welches bei MADS mit beigefügt ist.
Bei mir war es im Pfad "C:\jac\wudsn\Tools\ASM\MADS\examples\MACROS". Ich habe es dann in mein Projekt umkopiert.

Mit "LMB #BANKNR, $4000" kannst Du innerhalb Deines Quellcodes definieren, wo dieser liegen soll.
Mit meiner Routine "SW_BANK", kannst Du dann während der Ausführung die Bank wechseln.

Viel Spaß beim Testen
Janko

Benutzeravatar
Kveldulfur
Beiträge: 624
Registriert: 17.08.2021 02:32
Has thanked: 237 times
Been thanked: 163 times
Kontaktdaten:

Re: Bank Switching

Beitrag von Kveldulfur »

Kleine Ergänzung:

Das Macro ist nicht besonders kompliziert und da ich ungerne Macros einsetze, hier eine Version ohne Macro:

Code: Alles auswählen

		OPT B+
		
		ORG $2000

ROWCRS		EQU $0054
COLCRS		EQU $0055
SAVMSC		EQU $0058
IOCB0		EQU $0340
PORTB		EQU $d301
CIOV		EQU $e456

		; Speicher reservieren
PMB		DTA "0123456789"	

		; Definitionen der Banken an PORTB
TMB		DTA B($FF)	; Keine Bank
		DTA B($C3)	; Bank 1
		DTA B($C7)	; Bank 2
		DTA B($CB)	; Bank 3
		DTA B($CF)	; Bank 4
		
		.proc MAIN
		
		LDA $d301
		STA $0600
		
		JSR Graphics0
		
		LDX #0		; Bank 0 auswählen
		JSR SW_BANK
		
		LDA #0		; Text 0 ausgeben
		LDX #2
		LDY #4
		JSR TextAusgabe

		LDA #1		; Text 1 ausgeben
		LDX #2
		LDY #6
		JSR TextAusgabe

		LDX #1		; Bank 1 auswählen
		JSR SW_BANK

		LDA #0		; Text 0 ausgeben
		LDX #2
		LDY #12
		JSR TextAusgabe

		LDA #1		; Text 1 ausgeben
		LDX #2
		LDY #14
		JSR TextAusgabe
		
Loop		JMP Loop		
		
		.endp
		
		run MAIN
		

; ##################################################################################################################				
; #### Aktive Bank auswählen
; ####
		.proc SW_BANK

 		LDA TMB,X	; Register X gibt die gewünschte Bank an
 		STA PORTB
 		
 		RTS

 		.endp
				
; ##################################################################################################################				
; #### Graphics per CIOV
; ####
        	.proc Graphics0
        	
		LDX #$60
		LDA #12		
		STA IOCB0+2,X	
		JSR CIOV
		LDA #0		
		STA IOCB0+$B,X	
		AND #$F0
		EOR #$10
		ORA #$0C
		STA IOCB0+$A,X
		LDA #3		
		STA IOCB0+2,X
		LDA #<DEVICE
		STA IOCB0+4,X
		LDA #>DEVICE
		STA IOCB0+5,X
		JSR CIOV
		RTS

DEVICE		DTA 'S:', $9B        	

		.endp
; ##################################################################################################################				
; #### Text - Ausgabe per CIOV
; ####
        	.proc TextAusgabe
        	
		STX COLCRS
		STY ROWCRS
		
		TAX		
		LDA TextLo,X        	
        	STA IOCB0+4  
		LDA TextHi,X        	
		STA IOCB0+5
		LDA #09 
		STA IOCB0+2
		LDA #100 
		STA IOCB0+8
		LDA #0
		STA IOCB0+9
		LDX #0 
		JSR CIOV 
		RTS

TextLo		DTA <Text1, <Text2         	
TextHi		DTA >Text1, >Text2         	

		.endp
		
; ##################################################################################################################				
; #### Daten in verschiedenen Banken				
; ####
; #### Es muss immer erst die kleine Initialisierungsroutine ausgeführt werden, da diese während des Ladevorgangs  
; #### die Speicherbank wechselt.
; #### Damit dies funktioniert, muss die Routine außerhalb der Bank ($4000-$7FFF) liegen.
; ####

		; Bank im Ladevorgang wechseln
		ORG PMB
		LDA TMB+0			; Bank 0 auswählen
 		STA PORTB
 		RTS
		INI PMB

		ORG $4000   	
		
Text1		DTA c"Dies sind die Daten aus der Bank 0",$9b        	
Text2		DTA c"Einem reichen Manne, dem wurde seine Frau krank, und als sie fuehlte, dass ihr Ende....'",$9b     


		; Bank im Ladevorgang wechseln
		ORG PMB
		LDA TMB+1			; Bank 1 auswählen
 		STA PORTB
 		RTS
		INI PMB
		
		ORG $4000   	
		
Text3		DTA c"Dies sind die Daten aus der Bank 1",$9b        	
Text4		DTA c"Darauf tat sie die Augen zu und verschied. Das Maedchen ging jeden Tag hinaus zu dem Grabe...",$9b
Edit um 15:23 Uhr: Fehler im Code bereinigt :-)

Benutzeravatar
Dr. Irata
Beiträge: 937
Registriert: 24.08.2021 14:40
Has thanked: 110 times
Been thanked: 268 times
Kontaktdaten:

Re: Bank Switching

Beitrag von Dr. Irata »

vielen Dank, Janko... das hilft und jetzt habe ich die Systematik verstanden!!

Benutzeravatar
Dr. Irata
Beiträge: 937
Registriert: 24.08.2021 14:40
Has thanked: 110 times
Been thanked: 268 times
Kontaktdaten:

Re: Bank Switching

Beitrag von Dr. Irata »

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

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast