Bank Switching
Moderator: Rockford
- Dr. Irata
- Beiträge: 1047
- Registriert: 24.08.2021 14:40
- Has thanked: 145 times
- Been thanked: 309 times
- Kontaktdaten:
Bank Switching
... 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
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
- andymanone
- Beiträge: 3242
- Registriert: 17.08.2021 12:34
- Wohnort: Berlin - Suburban
- Has thanked: 714 times
- Been thanked: 1151 times
- Kontaktdaten:
Re: Bank Switching
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:
Meintest Du das?
Oder habe ich die Frage falsch verstanden ?
Gtx.,
andY
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:
Meintest Du das?
Oder habe ich die Frage falsch verstanden ?
Gtx.,
andY
Ressortleiter Hardware - Save the past and use the future!© andYManOne / Demozoo / My brandnew, experimental Album "Apocalyptic Symphony" / Zur Zeit keine POKEY´s ab Lager - Warteliste
- Olix
- Beiträge: 1743
- Registriert: 17.08.2021 07:06
- Has thanked: 225 times
- Been thanked: 1171 times
- Kontaktdaten:
Re: Bank Switching
Was ist das denn für ein Dokument "130 XE Handbuch" ?
Das kenn ich noch gar nicht.
Gibts das wo als PDF Download?
Das kenn ich noch gar nicht.
Gibts das wo als PDF Download?
- andymanone
- Beiträge: 3242
- Registriert: 17.08.2021 12:34
- Wohnort: Berlin - Suburban
- Has thanked: 714 times
- Been thanked: 1151 times
- Kontaktdaten:
Re: Bank Switching
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
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
Ressortleiter Hardware - Save the past and use the future!© andYManOne / Demozoo / My brandnew, experimental Album "Apocalyptic Symphony" / Zur Zeit keine POKEY´s ab Lager - Warteliste
- Dr. Irata
- Beiträge: 1047
- Registriert: 24.08.2021 14:40
- Has thanked: 145 times
- Been thanked: 309 times
- Kontaktdaten:
Re: Bank Switching
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??
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??
- Kveldulfur
- Beiträge: 844
- Registriert: 17.08.2021 02:32
- Has thanked: 357 times
- Been thanked: 290 times
- Kontaktdaten:
Re: Bank Switching
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
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
Meine Projekte findest Du hier...
- Dr. Irata
- Beiträge: 1047
- Registriert: 24.08.2021 14:40
- Has thanked: 145 times
- Been thanked: 309 times
- Kontaktdaten:
Re: Bank Switching
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".
- Kveldulfur
- Beiträge: 844
- Registriert: 17.08.2021 02:32
- Has thanked: 357 times
- Been thanked: 290 times
- Kontaktdaten:
Re: Bank Switching
Ja, musste auch etwas tüffteln.
Dabei kam folgender Code heraus, wobei das meiste nur der Demonstration dient:
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
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
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
Meine Projekte findest Du hier...
- Kveldulfur
- Beiträge: 844
- Registriert: 17.08.2021 02:32
- Has thanked: 357 times
- Been thanked: 290 times
- Kontaktdaten:
Re: Bank Switching
Kleine Ergänzung:
Das Macro ist nicht besonders kompliziert und da ich ungerne Macros einsetze, hier eine Version ohne Macro:
Edit um 15:23 Uhr: Fehler im Code bereinigt
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
Meine Projekte findest Du hier...
- Dr. Irata
- Beiträge: 1047
- Registriert: 24.08.2021 14:40
- Has thanked: 145 times
- Been thanked: 309 times
- Kontaktdaten:
Re: Bank Switching
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!
Gruß
Peter
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
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast