Die MMU (Memory Management Unit) des HD64180

Helmut Bernhardt

Der auch vom HD4180 benutzte Befehlssatz des Z80 kennt nur 64K-umfas-
sende Adressoperanden. Die Software kann nur 64K-Byte Speicher adres-
sieren. Durch die MMU ist es möglich, Anteile dieses logichen 64K-
Adreßraumes in verschiedene Bereiche des physikalischen 512K-Adreß-
raumes zu legen.

Der durch Software ansprechbare logische 64K-Adreßraum kann in bis zu
3 Bereiche unterteilt werden: Common0, Bank und Common1. Common0 be-
ginnt immer bei 0000H und kann in 4K-Schritten beliebig groß angelegt
werden. Common1 liegt immer unter der oberen Grenze FFFFH des
logischen Adreßraumes und kann ebenfalls in 4K-Schritten beliebig weit
nach unten reichend vorgegeben werden. Bank umfaßt den Bereich
zwscchen Common0 und Common1. Für die Aufteilung des logischen Adreß-
raumes sind folgende Konfigurationen möglich:

+---------+	+---------+	+---------+	+---------+
| Common1 |	| Common1 |	| Common1 |	| Common1 |
+---------+	|	  |	|	  |	|	  |
| Bank	  |	+---------+	+---------+	|	  |
+---------+	|	  |	|	  |	|	  |
| Conmon0 |	| Bank	  |	| Common0 |	|	  |
+---------+	+---------+	+---------+	+---------+

Während Common 1 mit einer Größe von minimal 4K unterhalb von FFFFH
immer vorhanden ist, lassen sich die Bereiche Commn0 und Bank auch
ganz unterdrücken. Die Adressen der Grenzen zwischen den einzelnen Be-
reichen lassen sich in 4K-Schritten verschieben. Über je 4 Bits des
CBAR-Registers Port 3AH werden die Adressen A15-A12 der Untergrenzen
der Bereiche Common1 und Bank festgelegt.

CBAR, (Common/Bank Base Register), Port 3AH

    Bit       7    6    5    4    3    2    1    0
    Name     CA3  CA2  CA1  CA0  BA3  BA2  BA1  BA0
    Zugriff  R/W  R/W  R/W  R/W  R/W  R/W  R/W  R/W

Dabei represetieren  D7-D4 die Adressen A15-A12 die Untergrenze des
Common1-Bereichs und D3-D0 die Adressen A15-A12 der Untergrenze des
Bank-Bereichs. Nach RESET wird dieses Register immer mit F0 initiali-
siert. Damit ist die für ein gebanktes CP/M 3.0 günstigste Einteilung
in Common1 bei F000H-FFFFH und Bank bei 0000H-EFFFH vorgegeben.

Wenn z.B. C4H an CBAR ausgegeben wird, liegt die Untergrenze von Com-
mon 1 bei C000H und die Untergrene von Bank bei 4000. Die resultie-
rende Speicheraufteilung sieht dann so aus:

    Common1  C000H-FFFFH
    Bank     4000H-BFFFH
    Common0  0000H-3FFFH

Die Nibble des Bytes an CBAR sind die oberen Adreß-Digits der Unter-
grenzen von Common1 (oberes Nibble) und Bank (unteres Nible).

Eine Ausagbe von F0H an CBAR bedeutet, daß Common1 bei F000H-FFFFH
liegt und der restliche Speicher 0000G-EFFFH Bank-Bereich ist. Common0
existiert dann nicht (durch RESET voreingetellt).

Eine dem GDOS 2.4 des GENIE IIIs ähnliche Configuration (Common bei
0000h-3FFFH und Bank bei 4000H-FFFFH läßt sich  mit 44H an CBAR ein-
stellen. Hier fallen die Untergrenzen von Common1 und Bank beide auf
die Adresse 4000H. Der Bank-Bereich existiert dann nicht, Common0 wird
als Common benutzt und Banking erfolgt mit Verschieben des Common1-
Bereichs im physikalischen Speicher.

Um eine dem 256K-(1MB-)Banker für Z80-Systeme ähnliche Konfiguration
vorzueben müßte (8H in CBAR eingetragen werden. Dann liegt die
Grenze zwischen den beiden existierenden Bereichen CommonO und Common1
be8000H. Das Banking erfolgt auch hier durch Verschieben von Common1
im physikalischen Adreßraum.

Adreßübersetzung

Common0, soweit es durch die Untergrene von Bank zugelassen ist, be-
ginnt hier an der physikalischen Adresse 00000H des 512K-Speichers.
Die Bereiche Bank und Common1 lassen sich in verschiedene Stellen in
den physikalischen Speicher legen. Die physikalische Adressen, bei der
diese Bereiche anfangen, lassen sich auch wieder in 4K-Schritten an
beliebiger Stelle festlegen und ändern. Dazu dienen die Ports BBR und
CBR. Die Bits 6-0 in diesen Registern geben den physikalischen Adreß-
-Offset vor, der bei Zugriff auf logische Adressen im Common1- bzw. im
Bank-Bereich zu den logischen Adressen addiert werden. D6-DO dieser
Ports legen die Adressen A18-A12 dieses Offsets fest.

    CBR Common Base Register), Port 38H

    Bit       7    6    5    4    3    2    1    O
    Name      -   CB6  CB5  CB4  CB3  C82  CB1  CB0
    Zugriff       R/W  R/W  R/W  R/W  R/W  R/W  R/W

    BBR (Bank Base Register), Port 39H

    Bit       7    6    5    4    3    2    1    O
    Name      -   BB6  BB5  BB4  BB3  BB2  BB1  BB0
    Zugiff        R/W  R/W  R/W  R/W  R/W  R/W  R/W

Nach einem RESET sind alle Bits in CBR und BBR low. In dieser Konfgu-
ration erfolgt bei Zugriff auf den Common1-Bereich und den Bank-
Bereich keine Adreßtranslation. Die logische Adresse ist gleichzeitig
auch die physikasische Adresse. A18-A16 werden stänig low ausgegeben.

Bei Zugriff auf eine logische Adresse im Bank-Bereich  wird zu dieser
Adresse die in BBR für A18-A12 festgelegte Offset-Adresse addiert und
der Speicherzugriff erfolgt an der physikalischen  Adresse, die die
Summe aus logischer Adresse und Offset ist. Das läßt sich an einem
Beispiel einfacher erklären.

Die MMU-Register seien folgendermaßen belegt:
CBAR: C4H    BBR: 40H    CBR:  00H
Damit (siehe obiges Beispiel für CBAR) liegt der Bank-Bereich logisch
bei 4000H-BFFFH. Der Adreß-Offset für logische Zugriffe auf den Bank-
Bereich beträgt 40000H. Wenn nun an der Adresse 9C84H, die im logi-
schen  Bank-Bereich liegt, ein Byte gelesen oder abgelegt werden soll,
oder an diese Adresse gesprungen werden soll (im Programm), dann wird
tatsächlich die Adresse 49C84H ausgegeben.

logische Adresse    9C84H          1001 1100 1000 0100 B
Adreß-Offset       40000H      100 0000 0000 0000 0000 B 
		+  ------    + -------------------------
physik. Adresse    49C84H      100 1001 1100 1000 0100 B

mit 00H in CBR erfolgt bei Zuriff auf logische Adressen im Common1-
Bereich keine Addreßübersetzung (der Offset ist 00000H).Banking er-
folgt durch Ausgabe verschiedener Addreß-Offsets an das BBR-Register.
Durch die Auflösung in 4K-Schritte für die Vorgabe des Offets lassen
sich auch Banks einstellen, die sich mit anderen (vorher oder- nachher
eingestellten) Banks oder mit Common 1 überschneiden.

Speicher-Konfiguration bei       +---------+ 7FFFFH  Speichergrenze
    CBAR : C4H                   |         |
    BBR  : 40H                   |         |
    CBR  : 00H                   +---------+ 4COOOH
                                 |  Bank   |
                                 |         |
                                 +---------+ 4C400H
                                 |         |
                                 +---------+ 40000H Offset durch BBR
                                 |         |
                                 |         |
FFFFH +---------+                +---------+ OFFFFH
      | Common1 |                | Common1 |        kein Offset in CBR
C000H +---------+                +---------+ 0C000H
      |  Bank   |                |         |
      |         |                |         |
0000H +---------+                +---------+ 04000H
      |         |                | Common0 |
      +---------+----------------+---------+ 00000H Common0 beginnt
                                                    immer bei 00000h
logischer Adreßraum        physkalischer Adreßraum 

Um bei dieser (zugegeben etwas unsinnigen) Speicherkonfiguration den
512K-Adreßraum durch Banking des Bereichs 4000H-BFFFH sinnvoll aus-
zunutzen, kann fo1gende Speicheraufteilung in Banks angewandt werden:

Bank	phys. Anfangs-	   Adreß-Offset	 Byte 
Nr.	u. End-adresse			 an BBR
------------------------------------------------
  0     04000H	0BFFFH	   00000H         00H
  1	10000H	17FFFH	   0C000H         0CH
  2	18000H	1FFFFH     14000H         14H
  3	20000H	27FFFH     1C000H         1CH
	 ....    ....       ....          ...
 13     70000H	77FFFH     6C000H         6CH
 14     78000H	7FFFFH     74000H         74H
------------------------------------------------

Unter Aussparung des Cmonon0- und des Common1-Bereichs bei 00000H und
bei 0C000H mit je 16K Größe füllen die Banks lückenlos den physika-
lischen Speicher aus.

Es sind aber auch Einstellungen möglich, bei denen sich die Bereiche
von Banks oder einer Bank und einem Common-Bereich überschneiden. Wenn
für das Einschalten von Bank1 in obiger Tabelle anstelle von 0CH der
Wert 08H an BBR ausgegeben wird, liegt der physikalische Adreßbereich
der Bank bei 0C000H-13FFFH. Ein Zugriff auf den logischen Bereich
4000H-7FFFH bedeutet dann einen Zugriff auf den physikalischen Bereich
0C000H-0FFFFH, dies ist der Bereich von Common1. Die unterschied-
lichen logischen Adreßbereiche 3000H-7FFFH und C000H-FFFFH sin physi-
kalisch identisch. Die Programmierung der MMU des H64180 sollte also
nicht durch Ausprobieren sondern durch gründliches Überlegen der Wenns
und Abers erfolgen.

Den DMA-Controller interessieren die Einstellungen der MMU-Register
nicht, er arbeitet mit 19Bit-Speicheradressen, die direkt als physika-
lische Adressen ausgegeben werden.

Der neuere PLCC-Typ des HD4180 hat bei 68 Pins auch noch den Adreßpin
A19 herausgeführ. Dadurch erhalten dort die Bits D7 in BBR und CBR
(und auch die Bits D3 in den DMAC-Adreßregister-Zusatzbytes) die
Funktion, einen 1MB-Seicherraum adressieren zu können. Dort ist für
eine 1MB-Speicheradressierung keine zusätzliche Logik mehr nötig.