🗺️Speicherkarte & Bank-Umschaltung

Der Z80 sieht nur 64 KB. Der CPC 6128 hat aber 128 KB RAM und 32 KB ROM (plus Erweiterungs-ROMs) – der Trick heißt Einblenden: Lesezugriffe können ROM sehen, Schreibzugriffe gehen immer ins RAM darunter.

📐Aufteilung der 64 KB (nach SOFT 968, Abschnitt 2.1)

&C000–&FFFF
Bildschirmspeicher (16 KB)
Standardlage; darüber einblendbar: oberes ROM (BASIC, AMSDOS, Erweiterungen)
&B100–&BFFF
Stapel, Firmware-Daten und Sprungleisten
&B900 High Kernel · &BB00 Hauptsprungleiste · &BDCD Indirections · Stapel wächst von &C000 abwärts
&AC00–&B0FF
Vordergrund-Daten (Standard: BASIC)
untere Grenze &AC00 ist Voreinstellung, nicht fest
…–&ABFF
Hintergrund-Daten der Erweiterungs-ROMs
z. B. &504 Bytes für AMSDOS (Größe hängt von den ROMs ab)
&0040–…
freier Speicher für Programme („Memory Pool“)
hier landen eigene Programme, z. B. bei &4000; BASIC-Programme beginnen bei &0170
&0000–&003F
Low Kernel: Restarts RST 0–7
im RAM und im unteren ROM gleich, darüber einblendbar: unteres ROM &0000–&3FFF (Firmware)
💡 Lesen vs. Schreiben
Ist das obere ROM eingeblendet, liefert LD A,(&C000) ein ROM-Byte – LD (&C000),Aschreibt trotzdem in den Bildschirmspeicher. Genau deshalb schaltet jeder Firmware-Einsprung (LOW JUMP) das obere ROM ab.
✅ RAM unter dem ROM lesen
RST 4 (RAM LAM) liest das Byte bei (HL) mit abgeschalteten ROMs, KL LDIR/KL LDDR kopieren ebenso.

🏦RAM-Organisationen &C0–&C7 (nur CPC 6128)

Die zusätzlichen 64 KB (Blöcke 4–7) werden über den Port &7Fxx mit dem Wert &C0 + Organisation eingeblendet. Beim 6128 übernimmt das ein PAL-Baustein am selben Port wie das Gate Array.
Adressraum der CPU (64 KB)
&0000–&3FFFBlock 0
&4000–&7FFFBlock 1
&8000–&BFFFBlock 2
&C000–&FFFFBlock 3
RAM-Chips: 8 Blöcke à 16 KB (128 KB)
Block 0
bei &0000
Block 1
bei &4000
Block 2
bei &8000
Block 3
bei &C000
Block 4
ausgeblendet
Block 5
ausgeblendet
Block 6
ausgeblendet
Block 7
ausgeblendet
; Organisation 0 per Firmware (nur 6128):
        ld a,0
        call &bd5b      ; KL BANK SWITCH
; … oder direkt über den Port (Befehl &C0+n):
        ld bc,&7fc0
        out (c),c

Tabelle aus SOFT 968, Abschnitt 2.5. Beim Einschalten gilt Organisation 0; die Blöcke 0 und 2 enthalten Firmware-Variablen, Sprungleisten und Stapel und müssen für Firmware-Aufrufe an ihrem Platz bleiben. Der Bildschirm kann nur in den Blöcken 0–3 liegen.

🎛️Gate Array: Modus und ROM-Auswahl

Ein einziges Byte an Port &7Fxx schaltet Bildschirmmodus und beide ROMs – Bits 7 und 6 wählen die Funktion (00 Stift wählen, 01 Farbe, 10 Modus/ROM, 11 RAM-Organisation).
Bit 7
1
1
Bit 6
0
0
Bit 5
0
–
Bit 4
0
INT-Reset
Bit 3
1
oberes ROM aus
Bit 2
1
unteres ROM aus
Bit 1
0
Modus
Bit 0
1
Modus
        ld bc,&7f8d      ; B = &7F: Gate Array, C = Wert &8D
        out (c),c

Funktion „Modus und ROM-Auswahl“ (Bits 7/6 = 1 0). Die Firmware merkt sich diesen Wert in C' – wer ihn direkt schreibt, sollte C' anpassen (SOFT 968, Appendix XI).

🔢Welches obere ROM?

; Oberes ROM auswählen: Port &DFxx
        ld bc,&df07     ; ROM 7 = AMSDOS beim 6128
        out (c),c
; Firmware-Weg (merkt sich die alte Auswahl):
        ld c,7
        call &b90f      ; KL ROM SELECT
        …
        call &b918      ; KL ROM DESELECT
💡 ROM-Nummern
ROM 0 ist BASIC (Vordergrund-ROM), beim 664/6128 liegt AMSDOS als Hintergrund-ROM auf Nummer 7. Jedes Erweiterungs-ROM beginnt bei &C000 mit Typ, Mark, Version, Änderungsstand und der Adresse seiner Befehlstabelle (SOFT 968, Abschnitt 10.2). Im Simulator enthält das obere ROM nur den Präfix aus dem Handbuchbeispiel (&80, 1, 0, 0).

Quellen: SOFT 968 Abschnitte 2.1–2.5, 10.2, Appendix XI; Gate-Array-Register nach K. Thacker „Amstrad CPC Gate-Array“ (cpctech.cpcwiki.de).