Da der C 128 über 128 KByte RAM und 48 KByte ROM verfügt, sein
Prozessor aber normalerweise lediglich 64 KByte adressieren
kann, besitzt er eine spezielle Verwaltungseinheit, die
MMU(Memory-Management-Unit). In diesem Teil wird ihre
Registerbelegung beschrieben, im nächsten folgen die
Betriebssystem-Routinen, die einen beim Arbeiten mit den
verschiedenen Speicherkonfigurationen unterstützen.
Um auf den kompletten Speicher zugreifen zu können, müssen
zwangsläufig einige Bereiche mehrfach verwendet werden: Die
RAM-Bänke 0 und 1 belegen beide die kompletten 64 KByte von
$0000-$FFFF, das ROM liegt ab $4000 parallel dazu, und von
$D000-$DFFF befindet sich zusätzlich noch der
Ein-/Ausgabe(I/O)-Bereich. Was davon für die CPU "sichtbar" ist,
bestimmt die MMU. Sie wird über die 12 Adressen $D500-$D50B im
I/O-Bereich sowie weitere fünf Speicherstellen ab $FF00
angesprochen. Letztere sind dabei unabhängig von der
eingestellten Konfiguration immer erreichbar. Die MMU-Register
haben folgende Bedeutung:
Konfigurations-Register(CR, $D500/$FF00):
Dies ist das zentrale Register der MMU. Es bestimmt, welche
Speicherkomponenten wo aktiv sind. Die Belegung der einzelnen
Bits ist:
Bit 0: Adressbereich $D000-$DFFF
0=I/O-Bereich, 1=RAM oder ROM(s. Bit 4/5)
Bit 1: Adressbereich $4000-$7FFF
0=System-ROM, 1=RAM
Bit 2/3: Adressbereich $8000-$BFFF
00=System-ROM, 01=internes Funktions-ROM
10=externes Funktions-ROM, 11=RAM
Bit 4/5: Adressbereich $C000-$FFFF
wie Bit 2/3
Bit 6/7: RAM-Bank für alle aktivierten RAM-Bereiche
00=Bank 0, 01=Bank 1, 10=Bank 2, 11=Bank 3
Da die RAM-Bänke 2 und 3 nicht existieren, werden dort wieder
die Bänke 0 und 1 eingespiegelt.
Präkonfigurations-Register(PCR, $D501-$D504) und Lade-
Konfigurations-Register(LCR, $FF01-$FF04):
In den PCRs können vier vordefinierte Werte für das
Konfigurations-Register abgespeichert werden. Aktiviert werden
sie durch Schreiben eines beliebigen Wertes in das zugehörige
LCR: "STA $FF02" kopiert also den Inhalt von $D502 in das CR.
Achtung: Bei der Benutzung des BASIC-Interpreters sind die PCRs
mit den Werten $3F, $7F, $01 und $41 vorbelegt und dürfen nicht
geändert werden!
Modus-Konfigurations-Register(MCR, $D505):
Wählt den aktiven Prozessor und den Computermodus(C 64/C 128),
überprüft das Vorhandensein eines C 64-Moduls, überwacht die
40-/80-Zeichen-Taste und wird für den Burst-Modus beim IEC-Bus
benutzt.
Bit 0: 0=Z80-Prozessor, 1=8502
Bit 1/2: unbenutzt
Bit 3: Kontrollbit für schnellen Disketten-Zugriff
Bit 4/5: Zustand der GAME- und EXROM-Leitungen des Expansions-
ports, die das Vorhandensein eines C 64-Moduls
anzeigen
Bit 6: 0=C 128-Modus, 1=C 64-Modus
Bit 7: 0=40-/80-Zeichen-Taste gedrückt, 1=nicht gedrückt
Wechselt man von einer CPU zur anderen, so macht die nun aktive
an der Stelle weiter, wo sie vorher gestoppt wurde. Nach dem
Einschalten ist dies für den Z80 die Adresse $FFEE(in Bank 0).
Legt man also hier einen Sprungbefehl zu einer Z80-Routine ab,
so wird diese nach Löschen von Bit 0 im MCR abgearbeitet. Zum
8502-Prozessor kommt man durch einen "JP $FFE0"-Befehl zurück.
Die genaue Prozedur ist im Programm "Z80.OBJ" zu finden
(Quelltext "Z80.SRC" im Hypra-Ass-Format bzw. als ASCII-Datei
"Z80.TXT"). Der Start erfolgt mit "BANK 15:SYS 10000".
RAM-Konfigurations-Register(RCR, $D506):
Am Speicheranfang und -ende kann ein gemeinsamer
Bereich(Common-Area) für alle RAM-Bänke definiert werden, in dem
immer auf Bank 0 zugegriffen wird. Außerdem wird mit diesem
Register die Lage des VIC-RAMs beeinflußt.
Bit 0/1: Größe des gemeinsamen Speicherbereichs
00=1 KByte, 01=2 KByte, 10=4 KByte, 11=16 KByte
Bit 2: gemeinsamer Bereich am Speicheranfang aus/ein(0/1)
Bit 3: gemeinsamer Bereich am Speicherende aus/ein(0/1)
Bit 4/5: unbelegt
Bit 6/7: Speicherbank für VIC-RAM
X0=Bank 0, X1=Bank 1(Bit 7 nicht implementiert)
Standardmäßig ist ein 1 KByte großes Common-Area am
Speicheranfang eingestellt.
Zero-Page-Zeiger(P0L/P0H, $D507/$D508):
Erlaubt das Verschieben der Zero-Page($0000-$00FF) an eine
andere Speicherposition. P0H enthält die RAM-Bank, P0L das
High-Byte der neuen Adresse. P0H sollte immer zuerst geändert
werden, da dieser Wert bis zum Beschreiben von P0L
zwischengespeichert und erst dann aktiviert wird. Danach werden
alle folgenden Zero-Page-Zugriffe an die neue Adresse
umgeleitet.
Prozessorstack-Zeiger(P1L/P1H, $D509/$D50A):
Analog zu P0L/P0H für den Prozessorstack($0100-$01FF).
Versions-Register(VR, $D50B):
Enthält in den unteren vier Bits die MMU-Version, in den oberen
die Speichergröße in 64 KByte-Blöcken. Bei allen verkauften
C 128-Typen erhält man den Wert $20.
Thomas Klein
Dateien:
Z80.OBJ: Beispiel zum Ein-/Ausschalten der Z80-CPU
Z80.SRC: Quelltext dazu im Hypra-Ass-Format
Z80.TXT: Quelltext als formatierte ASCII-Datei