Die internen Ports des HD64180

Helmut Bernhardt

Sämtliche gegenüber dem Z80 zusätzlich im HD64180 zur Verfügung ge-
stellten Leistungen sind über Portadressen zu programmieren. Für diese
internen Ports der CPU wird ein I/O-Adreßbereich von 3FH Ports ver-
braucht.

Wie prinzipiell auch schon beim Z80 kann mit dem HD64180 ein I/O-
Adreßraum von 64K-Ports differenziert werden. Beim Z80 werden dafür
ausschließlich die Befehle IN A,(C) und OUT (C),A sinnvoll sein. Bei
diesen Befehlen werden die Inhalte der Register C (AO-A7) und B
(A8-A15) als Adressen auf den Bus gelegt. Bei den normalen In- und
OUT - Befehlen mit Ausgabe einer 8Bit-Portaddesse im Befehlsoperanden
wird der Inhalt des Accu auf A8-A15 des Adressbus gelegt. Diese Befehle
sind in Sytemen, deren I/O-Adreßdecoding auf 16Bit-Adressen aufbaut
nicht verwendbar.

Die internen Ports des HD64180 liegen in der Zero-Page (A8-A15 sind
low) des 64K-Adreßdreßraums. Um diese internen Ports zu lesen und zu
schreiben, hat der HD64180 spezielle Befehle, die automatisch A8-A15
low ausgeben, wenn auf die internen Ports zugegriffen wird.

Traditionsbedingt decodieren aber sämtliche I/O-mapped Periherie-
Geräte für Z80-Systeme nur A0-A7 und beschränken den I/O-Adreßraum
damit auf 256 Ports. Diese Baugruppen fühlen sich bei Zugriffen auf
die internen Ports ebenfalls angesrochen, wenn ihre 8Bit-Adresse mit
der zero-Page-Adresse des angesprochenen internen Ports übereinstimmt.
Beim Lesen eines internen Ports werden deshalb die Datentreiber des
HD64180-Chips zur Umwelt geschlossen, so daß keine Kollisionen von
internen und externen Daten möglich sind. Beim Schreiben gelangen aber
die Daten, die für die internen Ports bestimmt sind, auch nach außen
und werden von einem auf gleicher Adresse liegenden externen Port auch
vereinnahmt. Verrückt spielende Peripherie-Geräte wären die Folge,
wenn nicht noch eine zusätzliche Sicherung im HD6418O eingebaut wäre.

Der zusammenhängende Adreßbereich von 3FH Zero-Page-Ports für die
Register des HD64180 beginnt default bei 00H. Durch Ändern der Bits 7
und 6 des IRC-Registers (3FH) lassen sich die 3FH Ports innerhalb der
Zero-Page verschieben.

D7  D6   Adreßbereich der internen Ports
---------------------------------------------------
0   0    00 - 3F  (nach RESET)
0   1    40 - 7F
1   0    80 - BF
1   1    C0 - FF
---------------------------------------------------

Die im folgenden benutzte Angabe von Portadressen geht davon aus, daß
D6 und D7 von ICR beide low sind und die internen Ports bei 00-3F in
der Zero-Page liegen. Die relativen Adressen und Funktionen sind in
der Tabelle aus dem Prof-180-Handbuch zu ersehen. Mit dieser Tabelle
alleine ist man aber noch lange nicht in der Lage, die internen Ports
sinnvoll zu programmieren. Vielleicht helfen die folgenden Ausfüh-
rungen da weiter:

Zunächst seien die Angaben zum IRC-Register, 'I/O Control Register',
Port 3H) vervollständigt. D5 (IOSTP) = 0 ermöglicht den normalen Be-
trieb der H64180-internen Peripherie-Ports (Einstellung nachRESET).
Wenn ISTP auf 1 gesetzt wird, sind die Funktionen von ASC1, CSi/0 und
PRT (serielje Schnittstellen und Reload-Timer unterbunden.

Damit ein bei 9,26 MHz Taktrate  tickender  HD64180 auch mit langsamer
Perpherie laufen kann, gibt es nicht nur den WAiT-Pin, über den die
Peripherie die CPU um Geduld bitten kann; die CPU (und auch die inter-
nen DMA-Kanäle) können auch selbständig  WAIT-Zyklen einlegen, wobei
zwischen memory-mapped I/O und I/O-mapped Zugriffen unterschieden wird.
Mit dem oberen Nibble von Port 32H (DCNTL) lassen sich unterschiedliche
Anzahlen WAITs einstellen;

D7  D6   Anzahl WAITs bei memory mapped Adressierung
---------------------------------------------------
0   0    0
0   1    1
1   0    2
1   1    3     (nach RESET)
---------------------------------------------------


              Anzahl WAITs bei
---------------------------------------------------
D5  D4   I/O Zugriffen    /INT0-Acknowledge
0   0    1                 2
0   1    2                 4
1   0    3                 5
1   i    4                 6
---------------------------------------------------

Be Zugriff auf die internen Ports werden unabhängig von D5 und D4
keine WAITs eingefügt. Nur für die Datenregister von ASCI, CSI/O und
PRT werden je nach Zustand bis zu 4 WAITs für die Synchronisatin
mit der CPU eingefügt.

Die  Bits 0-3 von DCNTL dienen der Steuerung des DMA-Betriebs und
werden dort behandelt.


RCR, Refresh Control Register, Port 36H

Gegenüber dem Hidden Refresh des Z80 während jeden M1-Zyklus' gibt der
HD64180 jeweils nach einer bestimmten Anzahl von Taktzyklen eine 8Bit-
-Refreshadresse aus. Durch die 8Bit-Adresse können 256K-Bit- und 1M-
Bit-Speicher-Chips ohne zusätzliche Refresh-Logik verwendet werden.
Ein Refresh erfolgt asynchron zur CPU-Arbeit nach einer über RCR D0
und D1 eingestellten Anzahl von Taktzyklen:


D1   D0   Anzahl Takte zwischen zwei Refresh-Zyklen
---------------------------------------------------
0    0    10
0    1    20
1    0    40
1    1    80
---------------------------------------------------

Mit D7 = 0 an RCR wird der Refresh-Controller abgeschaltet  (für sta-
ttische RAMs kann das Refreshing entfallen. D7= 1 (nach RESET)
aktiviert den Refresh-Controller.
#####################
Mit D0 läßt sich das Refresh-Timing den Möglichkeiten des Speichers
anpassen:

    D0 = 0 : Refresh ist 2 Taktzyklen lang
    D0 = 1 : Refresh ist 3 Taktzyklen lang (nach RESET voreingestellt)

D2-D5 im RCR-Register haben keine Funktion.


ICT, Interrupt/Trap-Register, Port 34H

D7 (Trap) wird immer dann von der CPU auf 1 gesetzt, wenn diese auf
einen illegalen Befehl gestoßen ist (z.B. undefinierte Z80-Befehle).
Durch einen OUT0-Befehl kann D7 wieder auf 0 gesetzt werden (nicht
aber auf 1). Nach RESET ist D7=0.

Ein illegaler Op-Code löst den für den HD64180 höchst priorisierten
Trap-Interrupt aus. Die Service Routine kann dann aus dem Zustand von
D6 (UFO) erkennen, ob der Fehler im 2ten oder 3ten Byte des Op-Codes
auftrat.

D6 erlaubt die Korrektur des beim Trap auf den Stack geretteten Pro-
gramm-Counters. Bei D6=0 zeigt der gerettete PC auf das zweite Byte
des als falsch erkannten Befehls. Bei D6=1 zeigt der PC auf das 3. Byte
des falschen Befehls. D6 kann nur gelesen werden.

D0, D1 ubd D2 können zur Maskierung des externen Interrups /INT0,
/INT1 und /INT2 verwendet werden. Wenn das entsprechende Bit auf 0
gestzt ist, ist der Interrupt gesperrt: auf 1 gesetzt wird der ent-
sprechende Interrupt freigegeben. Nach RESET ist nur /INT0 freige-
geben (D0=1) und /INT1 und /INT2 sind gesperrt (D1, D2 = 0).


IL, Interrupt Vector Low Register, Port 33H

Die externen Interrupts /INT0 im Mode 2 sowie /INT1 und /INT2 grund-
sätzlich und alle internen Interrupts werden von Service-Routinen be-
dient, deren Startadressen in e3iner Tabelle abgelegt sind. Die Technik
ist die des IN2 beim Z80. Im I-Register der CPU werden die oberen 8
Bit (A8-A15) der Adresse der Vector-Tabelle abgelegt. Die unteren 8
Bit der Adresse (Pointer in die Vector-Tabelle) liefert das Interrupt-
auslösende Peripherie-Gerät beim Interrupt-Ackowledge über den Daten-
bus. Die CPU ignoriert davon D0, um eine gerade Adresse zu erzeugen,
und bildet aus den beiden Hälften einen Pointer in die Vectortabelle.
Die dort in der Tabelle abgelegte Adresse ist die Startadresse der
Service-Routine.

Beim HD64180 benötigt nur der /INT0, der dem /INT des Z80 im Mode 2
entspricht, einen extern gelieferten Adreßanteil (A0-A7 uber D0-D7)
des Datenbus, um in der Vectortabelle die Adresse der Service-Rou-
tine zu finden. Damit können abwechselnd mehrere INT-Quellen über nur
einen Interrupt-Eingang der CPU angeschlossen werden.

Die Adressen der übrigen Interrupt-Quellen des HD64180 sind (mit
gewissen Freiheiten) festgelegt.
So stellen die ersten beiden Bytes der Tabelle (Adresse mit A0-A7=0)
die Adresse mit der Service-Routine füt /INT1 dar. Die nächsten beiden
Bytes liefern den Vektor für /INT2. Die Reihenfolge der Vektoren ist
durch die Interrupt-Quellen festgelegt; es läßt sich aber die relative
Lage der Gruppe von Vektoren (32 Bytes) innerhalb der 256-Byte-Tabelle
in 32-Bytes-Schritten verschieben. Wo diese Adressengruppe relativ
in der Tabelle liegt, wird durch D7-D5 des IL-Registers vorgegeben
(nach RESET sind diese low und die Gruppe liegt am Anfang der Vektor-
-Tabelle).

wenn D7-D5 alle low sind, liegen die Vektoren für /INT1, /INT2 und die
internen Interrupts ab Adresse XX00H in der Tabelle; wenn D7-D5 das
Bitmuster 001 haben, liegen diese Vektoren ab XX20H in der Tabelle;
u.s.w

Die Bits 0-4 werden von der internen Interrupt-Quelle selbst erzeugt
und geben die relative Adresse innerhalb der 32-Byte-Gruppe in der Ta-
belle vor. Die Tabelle 2.7.2 des 64180-Handbuchs (die hier ohne
freundliche Genehmigung von Hitachi wiedergegeben ist) gibt die
Reihenfolge der Einträge für die Interruptquellen und die damit
verknüfte Prioritäts-Hirarchie vor.

Table 2.7.2 Interrupt Source and Lower Vector
--------------------------------------------------
Interrupt-      Priority    IL        Fixed Code
-Source                  b7 b6 b5   b4 b3 b2 b1 b0
/INT1           highest  .  .  .    0  0  0  0  0
/INT2                    .  .  .    0  0  0  1  0
PRT channel 0            .  .  .    0  0  1  0  0
PRT channel 1            .  .  .    0  0  1  1  0
DMA channel 0            .  .  .    0  1  0  0  0
DMA channel 1            .  .  .    0  1  0  1  0
CSI/0                    .  .  .    0  1  1  0  0
ASCI channel 0           .  .  .    0  1  1  1  0
ASCI channel 1  lowest   .  .  .    1  0  0  0  0
--------------------------------------------------

Außer den maskierten Interrupts gibt es noch den oben erwähnten Trap,
der eine Verzweigung zur logischen Adresse 0000H zur Folge hat. Wenn
diese logische Adresse mit der pysikalischen Adresse 0000H identisch
ist (Banking), entspricht dies dem /RESET-Vektor. Durch Prüfen von
D7 in Port 32H (ICT) kann erkannt werden, ob ein Trap oder ein RESET
vorliegt.

Ein /NMI bewirkt, wie beim Z80 einen CALL 00066H, wobei auch hier die
logische Adresse innerhalb der eingestellten Bank und nicht unbedingt
die absolute Adresse 00066H relevant ist.

Der /INT0 kennt wie der /INT des Z80 noch die Modi 0 und 1
Mode 0 : Beim Acknowledge wird ein 1Byte-Befehl vom Datenbus gelesen
         Und ausgeführt (RST XX) Dieses Byte muss die Interrupt-Quelle
         liefern.

Mode 1 : Bei einem Interrupt am /INT0-Pin erfolgt ein RST 38H. Die
         Adresse 0038H liegt in der per MMU eingestellte Bank (logi-
         sche Adresse).

Weitere Steuerungen der internen Interrupts werden bei der Beschrei-
bung der jeweiligen Funktionsgruppen gezeigt. Dazu aber erst im nächs-
ten Info.

Table 2.5.1  Internal I/O Register Address Map (1)

        Register           			Mnemonic Address	
ASCI	ASCI Control Regitser A Ch 0		CNTLA0	 00H
	AStI Control Register A Ch 1		CNTLA1	 01H
	ASCI Control Register B Ch 0		CNTLBO	 02H
	ASCI Control Register B Ch 1		CNTLB1	 03H
	ASCI Status Register Ch 0		STATO	 04H
	ASCI Status Register Ch 1		STAT1	 05H
	ASCI Transmit Data Register Ch 0	TOR0	 06H
	ASCl Transmit Data Register Ch 1        TDR1	 07H
	ASCI Receive Data Register Ch 0		RDR0	 08H
	ASCI Receive DBta Register Ch 1		RDR1	 09H
CSI/O	CSI/O Control Register            	CNTR	 0AH
	CSI/O Transmit/Receive Data Reister     TRDR	 0BH
Timer	Timer Data Register Ch OL		TMDROL	 0CH
	Timer Data Register Ch OH		TMDROH	 0DH
	Reload Register Ch OL            	RLDROL	 0EH
	Reload Register Ch OH			RLDRoD	 0FH
	Timer Control Register			TCR	 10H
	(Reserved)					 11H
						     12H-13H
	Timer Data Register Ch 1L          	TMDROL	 14H
	Timer Data Register Ch 1H		TMDROH	 15H
	Reload Register Ch 1L			RLDROL	 16H
	Reload Register Ch 1H			RLDROH	 17H
Outhers	Free Running Counter			FRC	 18H
	(Reserved)				     19H-1FH

DMA	DMA Source Address Register Ch OL	SAROL	 20H
	DMA Source Address Register Ch OH	SAROH	 21H
	DMA Source Address Register th OB	SAROB	 22H
	DMA Destination Address Register Ch OL	DAROL	 13H
	DMA Destination Address Register Ch OH	DAROH	 24H
	DMA Destination Address Register Ch OB	DAROB	 25H
	DMA Byte Count Register Ch OL		BCROL	 26H
	DNA Byte Count Register Ch OH		BCROH	 27H
	DMA Memory Address Register Ch 1L	MARIL	 28H
	DMA Memory Address Register Ch 1H	MARLH	 29H
	DMA Memory Address Register Ch 1B	MARIB	 2AH
	DMA I/O Address Register Ch 1L		IAR1L	 2BH
	DMA I/O Address Register Ch 1H		IAR1H	 2CH
	(Reserved)					 2DH
	DMA Byte Count Register Ch 1L		BCR1L	 2EH
	DMA Byte Count Register Ch 1H		BCR1H	 2FH
	DMA Status Register			DSTAT	 30H
	DMA Mode Register			DMODE	 31H
	DM/WAITE Control Register		DCNTL	 32H
INT	IL Register Interrupt Vector Low Reg.		 33H
	INT/TRAP Register				 34H
	(Reserved)					 35H
Refresh	Refresh Control Register		RCR	 36H
	(Reserved)					 37H
MMU	MMU Common Base Register		CBR	 38H
	MMU Bank Base Register			BBR	 39H
	MMU Common/Bank Area Register		CBAR	 3AH
I/O	(Reserved)				     38H-3EH
	I/O Control Register			ICR	 3FH

