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.