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