Bankgeheimnisse (Teil 1)
C 128-Speicherverwaltung 1: MMU
 
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

  Zurück zum Index  
Home | Cat's Eye | Kimagure | Fotos | Computer | NiNuM | TSP | Kontakt