Sonderheft HD
H
H ID 6 4 11 8 O
Ii^terne Ports
MMU
DMftC
Serie tte Schlittetet (eh
Timer
Port 3FH) vervollständigt. D5 (IOSTP) - 0 ermöglicht den normalen Be­
trieb der HD64180-internen Peripherie-Ports (Einstellung nach RESET).
Wenn IOSTP auf 1 gesetzt wird, sind die Funktionen von ASCI, CSI/O und,.
PRT (serielle Schnittstellen und Reload-Timer) unterbunden.
*3
Dio internen Ports des HD64180
Helmut Bernhardt
Sämtliche gegenüber dem Z8Ü zusätzlich
im HD64180 zur Verfügung ge­
stellten Leistungen sind über Portadressen zu progammieren. 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 (Cl.A sinnvoll sein. Bei
diesen Befehlen werden die
Inhalte der Register C (A0-A7)
und B
(A8-A15)
als Adressen auf den Bus gelegt.
Bei den normalen IN- und
OUT-Befehlen mit Angabe einer 8Bit-Portadresse
im Befehlsoperanden
wird der Inhalt des Accu auf A8-A15 des Adreßbus gelegt. Diese Befehle
sind in Systemen, 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-I/O-Adreßraums.
Um diese internen Ports zu lesen und zu
schreiben.
hat der HD64180 spezielle Befehle, die automatisch A8-A15
low ausgeben, wenn auf die interne Ports zugegriffen wird.
Traditionsbedingt decodieren aber sämtliche
I/O-mapped Peripherie-Geräte für Z80-Systeme nur A0-A7 und beschranken den I/O-Adreßraum
damit auf 256 Ports.
Diese Baugruppen fühlen sich bei Zugriffen auf
die internen Ports ebenfalls angesprochen,
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 HD64180 eingebaut wäre.
Der zusammenhängende Adreßbereich von 3FH Zero-Page-Ports für die
Register des HD64180 beginnt default bei 00H. Durch Andern der Bits 7
und 6 des 1CR-Registers
(3FH) lassen sich die 3FH Ports innerhalb der
Zero-Page verschieben.
D7
Do
Adreßbereich der internen Ports
0
0
1
1
0
1
0
1
00
40
80
C0
-
3F
7F
BF
FF
(nach RESET)
seien die Angaben
zum ICR-Register
D7
Db
0
0
1
1
0
1
0
1
D5
D4
0
0
1
1
0
1
0
1
Anzahl WAITs bei memory mapped Adressierung
0
1
2
3
(nach RESET)
Anzahl WAITs bei
/ INTO-Acknowledge
1/O-Zugriffen
2
4
5
6
1
2
3
4
(nach RESET)
Bei 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 Synchronisation mit
der CPU eingefügt.
Die Bits 0-3 von DCNTL
werden dort behandelt.
dienen
der Steuerung
des DMA-Betriebs
und
RCR. Refresh Control Rgister, Port 36H
Gegenüber dem Hidden Refresh des Z80 während jeden Ml-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-Speichei— Chips ohne zusätzliche Refresh-Logik verwendet werden.
Ein Refresh erfolgt asynchron zur CPU-Arbeit nach einer über RCR. DO
und Dl eingestellten Anzahl von Taktzyklen:
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 Prof180-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
Damit ein bei 9,216MHz Taktrate tickender HD64180 auch mit langsamer
Peripherie
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 und I/O-mapped Zugriffen unterschieden wird.
Mit dem oberen Nibble von Port 32H (DCNTL)
lassen sich unter­
schiedliche Anzahlen WAITs einstellen:
(I/O Control
Register.
Dl
DO
0
0
1
1
0
1
0
1
Anzahl Takte zwischen zwei Refresh-Zyklen
10
20
40
80
(nach RESET)
Mit D7-0 an RCR wird der Refresh-Controller abgeschaltet
(für sta­
tische RAMs kann das Refreshing entfallen. D7-1 (nach RESET) aktiviert
den Refresh-Controller.
Mit D6 laßt sich das Refresh Timing den Möglichkeiten des Speichers
anpassen:
D6 - 0 : Refresh ist 2 Taktzyklen lang
D6 - 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 ZBO-Befehle).
Durch einen OUTO-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
auf trat.
Bytes liefern den Vektor für /1NT2. 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—Bytes—Tabe1—
le 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 /INTI, /INT2 und die
internen Interrupts ab Adresse XJC00H 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 32Byte-Gruppe in der Ta­
belle vor. Die Tabelle 2.7.2 des HD64180-Handbuchs
(die hier ohne
freundliche Genehmigung von Hitachi wiedergegeben ist) gibt die
Reihenfolge der Einträge für die Interrupt-Quellen und die damit
verknüpfte Pnoritäts-Hirarchie vor.
D6 erlaubt die Korrektur des beim Trap auf den Stack geretteten Pro­
gram-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
faschen Befehls. D6 kann nur gelesen werden.
Table 2.7.2 Interrupt Source and Lower Vector
1nterrupt-Source
Priority
DO, Dl und D2 können zur Maskierung der externen Interrupts /INTO.
/1NT1 und /INT2 verwendet werden. Wenn das entsprechende Bit auf 0 ge­
setzt
ist. ist der Interrupt gesperrt;
auf 1 gesetzt wird der ent­
sprechende Interrupt freigegeben.
Nach RESET ist nur /INTO freigege­
ben (DO-1) und /1NT1 und /INT2 sind gesperrt (D1.D2-0).
/ INTl
/INT2
PRT channe1 0
PRT channel 1
DMA Channel 0
DMA channel 1
CSI/Ü
ASC'l channel 0
ASCI channel 1
highest
IL. Interrupt Vector Low Register. Port 33H
Die externen Interrupts /INTO im Mode 2 sowie /INT1 und /INT2 grund­
sätzlich und alle internen Interrupts werden von Service-Routinen be­
dient, deren Startadressen in einer Tabelle abgelegt sind. Die Technik
ist die des IM2 beim Z80.
Im I-Register der CPU werden die oberen 8
Bit (A8-A15) der Adresse der Vektor-Tabelle abgelegt.
Die unteren 8
Bit der Adresse (Pointer in die Vektor-Tabelle) liefert das Interrupt-auslösende Peripherie-Gerät beim Interrupt-Acknowledge
über den
Datenbus.
Die CPU ignoriert davon DO, um eine gerade Adresse zu er­
zeugen, und bildet aus den beiden Hälften einen Pointer in die Vektor-Tabelle.
Die dort in der Tabelle abgelegte Adresse ist die Start­
adresse der Service-Routine.
Beim HD64180 benötigt nur der /INTO, der dem /INT des Z80 im Mode 2
entspricht,
einen extern gelieferten Adreßanteil
(A1-A7 über D1-D7)
des Datenbus), um in der Vektor-Tabelle die Adresse der Service-Routi­
ne zu finden.
Damit können abwechselnd mehrere INT-Qellen über nur
.einen Interrupt-Eingang der CPU angeschlossen werden.
i
tt'e"Adressen der übrigen Interrupt-Quellen des HD64180 sind (mit ge­
wissen Freiheiten) festgelegt.
So stellen die ersten beiden Bytes der Tabelle (Adresse mit A0-A7 - 0)
die Adresse mit der Service-Routine für /INT1 dar. Die nächsten beiden
lowest
IL
b7 b6 b5
Fixed Code
b4 b3 b2 bl bO
0
0
0
0
0
0
0
0
1
0
0
0
0
1
1
1
1
Ü
0
0
1
1
0
0
1
1
Ü
0
1
0
1
0
1
0
1
0
0
0
0
0
0
0
0
0
0
Außer den maskierten Interrupts gibt es noch den oben erwähnten Trap,
der eine Verzweigung zur logischen Adresse Ü000H zur Folge hat. Wenn
diese logische Adresse mit der physikalischen Adresse 00000H 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 vor1iegt.
Ein /NMI bewirkt wie beim Z80 einen CALL 66H, wobei auch hier die
logische Adresse innerhalb der eingestellten Bank und nicht unbedingt
die absolute Adresse 00066H relevant ist.
Der /INTO kennt wie der /INT des Z80 noch die Modi 0 und 1.
Mode 0 : Beim Acknowledge wird ein lByte-Befehl vom Datenbus gelesen
und ausgeführt (RST XX). Dieses Byte muß die Interrupt-Quelle
liefern.
Mode 1 : Bei einem Interrupt am /INTO-Pin erfolgt ein RST 38H. Die
Adresse 0038H liegt in der per MMU eingestellten Bank (logt'
sehe Adresse).
Weitere Steuerungen der internen Interrupts werden bei der Beschrei­
bung der jeweiligen Funktionsgruppen gezeigt. Dazu aber erst im nächs­
ten Info.
T able 2.5.1
Internal I/O R e g iste r A d d r e ss M a p (1)
Register
A SC I
CSt'O
Mnemonic
CNTLAO
XXOOOOOO
OOH
A S C I Control Register A Ch 1
CNTLA1
X X 0 0 0 00 1
01H
A SC I Control Register B Ch 0
CNTLBO
XX000010
02H
A S C I Control Register B Ch 1
CNTLB1
X X 0 0 0 01 1
03H
A S C I Status Register Ch 0
ST A T O
XX000100
04 H
A S C I Status Register Ch 1
STA TI
X X 0 0 0 10 1
05H
A S C I Transmit Data Register Ch 0
TDRO
XX000110
06H
A S C I Transmit Data Register Ch 1
TDR1
X X 0 0 0 1 11
07H
A S C I Receive Data Register Ch 0
RDRO
XX001000
OSH
A S C I Receive Data Register Ch 1
RDR1
XX001001
09H
OAH
CSI/O Control Register
C NTR
XX001010
CSI/O Transmit/Receive Data Register
TRDR
X X 0 0 1 01 1
OBH
Timer Data Register Ch OL
TMDROL
xxoonoo
OCH
Timer Data Register Ch OH
TMDROH
X X 0 0 1 10 1
OOH
Reload Register Ch OL
RLDROL
XX001110
0€H
Reload Register Ch OH
RLDROH
x x ooi m
OFH
T*ner Control Register
TCR
X X O 1 0000
10H
XX0 1 0 00 1
11H
Timer
5
5
X X O 10011
13H
14H
Timer Data Register Ch 1L
TM DR1L
XX010100
Timer Data Register Ch 1H
TM DR 1H
XX0 1 0 10 1
15H
Reload Register Ch 1L
RLDR1L
XX010110
16H
Reload Register Ch 1H
RLDR1H
XX0 1 0 11 1
17H
Free Running Counter
FRC
XX011000
18H
X X O 11001
19H
Reserved
Others
J
S
XX0 1 1 11 1
1FH
20H
D M A Source Address Register Ch OL
SA R O L
X X 1 00 0 00
D M A Source Address Register Ch OH
SARO H
X X 100001
21H
D M A Source Address Register Ch OB
SARO B
X X 1 00 0 10
22H
23H
D M A Destination Address Register Ch OL
DAROL
XX1 0 0 01 1
D M A Destination Address Register Ch OH
DAROH
X X 1 00100
24H
D M A Destination Address Register Ch OB
DAROB
XX1 0 0 10 1
25H
D M A Byte Count Register Ch OL
BCROL
XX100110
26H
D M A Byte Count Register Ch OH
BCROH
XX1 0 0 11 1
27H
D M A Memory Address Register Ch 1L
M AR1L
XX101000
28H
D M A Memory Address Register Ch 1H
M AR1H
XX1 0 1 00 1
29H
2AH
D M A Memory Address Register Ch 1B
MARI B
XX101010
D M A I/O Address Register Ch 1L
IAR1L
XX1 0 1 01 1
2BH
D M A I/O Address Register Ch 1H
IAR1H
XX101100
2CH
XX1 0 1 10 1
2DH
Reserved
INT
Hexadecimal
A S C I Control Register A C h O
Reserved
DM A
Address
Binary
D M A Byte Count Register Ch 1L
BCR1L
XX101110
2EH
D M A Byte Count Register Ch 1H
BCR1H
XX1 0 1 11 1
2FH
30H
D M A Status Register
DSTAT
X X 110000
D M A Mode Register
DM O DE
XX1 1 0 00 1
31H
DM A/W AIT Control Register
DCNTL
XX110010
32H
33H
L Register (Interrupt Vector Low Register)
1
XX110011
NT/TRAP Control Register
ITC
X X I 1 0100
34H
X X 1 10101
35H
Reserved
Address
Register
Refresh
MMU
Refresh Control Register
RCR
Reserved
Binary
Hexadecimal
XX110110
36H
XX110111
37H
M M U Common Base Register
CBR
X X 1 11000
38H
M M U Bank Base Register
BBR
XX111001
39H
M M U Common/Bank Area Register
CBAR
XX111010
3AH
XX111011
3BH
Reserved
$
I/O
I/O Control Register
ICR
S
XX111110
3EH
X X 1 11111
3FH
Die seriellen Schnittstellen (ASCI und CSI/O) des HD64180
von Gerald Schröder
C W T L B
Der HD64180 stellt drei serielle Schnittstellen zur Verfügung. Bei zweien
handelt es sich u« "Asynchronous Serial Communication Interfaces" (wie
RS-232/V24) und die dritte heißt "Clocked Serial Input/Output".
Asynchronous Serial Communication Interfaces
Aufgabe dieser beiden Schnittstellen ist die serielle Verbindung zu einem
Modem, Terminal, (RS-232-)Drucker o.ä. Zusätzlich gibt es einen "Multiprozessor-Modus", mit dem sich leicht ein System mit mehreren HD64180S auf­
bauen ließe, wobei die ASCIs dann als (Verbindung zum) System-Bus dienen
würden.
7
MPBT
Name
CNTLA0
CNTLB0
STAT0
TDR0
RDR0
CNTLA1
CNTLB1
STAT1
TDR1
RDR1
Port
0
2
4
6
8
1
3
5
7
9
Bezeichnung
Control Register A Channel 0
Control Register B Channel 0
Status Register Channel 0
Transmit Data Register Channel 0
Receive Data Register Channel 0
Control Register A Channel 1
Control Register B Channel 1
Status Register Channel 1
Transmit Data Register Channel 1
Receive Data Register Channel 1
7
MPE
6
RE
MPE
RE
TE
RTSO*
CKA1D
MPBR
EFR
MODx
4
Kanal 0: RTSO*
Kanal 1: CKA1D
D5
0
1
3
Read: MPBR
Write: EFR
2
MOD 2
3
DR
2
SS2
1
SSI
0
SSO
(Status)
6
OVRN
5
PE
4
FE
3
RIE
2
Kanal 0: DCDO*
Kanal 1: CTS1E
1
TDRE
0
TIE
= Receive Data Register Full (nur lesbar)
= Overrun Error (nur lesbar)
= Parity Error (nur lesbar)
= Framing Error (nur lesbar)
= Receive Interrupt Enable
= Data Carrier Detect (aktiv LOW, nur lesbar, nur Kanal 0!)
= Clear To Send Channel 1 Enable (nur Kanal 1!)
= Transmit Data Register Empty (nur lesbar)
= Transmit Interrupt Enable
Über CNTLB wird die Baudrate, der Multiprozessor-Mode und die Parität
festgelegt. DO bis D3 und D5 sind für die Baudrate zuständig. Sie legen
fest, durch welche Werte die Taktfrequenz geteilt wird.
(Control A)
5
TE
4
PEO
Einstellung der Kanäle
Die einzelnen Bits der Ports:
C H T L A
7
RDRF
RDRF
OVRN
PE
FE
RIE
DCDO*
CTS1E
TDRE
TIE
Die einzelnen Ports (Kanal 0 und Kanal 1):
5
Read: CTS*
Write: PS
6
MP
MPBT
= Multiprocessor Bit Transmit
MP
= Multiprocessor Mode
CTS = Clear To Send (nur beim Lesen!)
PS
= Prescale (nur beim Schreiben!)
PEO
= Parity Even/Odd
DR
= Divide Ratio
SSx
= Source/Speed Select
S T A T
Jeder Kanal belegt 5 Ports: einen zum Lesen und einen zum Schreiben der
Daten, einen für den Status (Zustand) des Kanals, zwei für die Einstellung
des Kanals (Baudrate usw.) und einige Zusatz-Informationen. Die Kanäle
unterscheiden sich in einigen Features, was ich aber jeweils anmerken
werde.
(Control B)
1
MODI
0
MODO
= Multiprocessor Mode Enable
= Receiver Enable
= Transmitter Enable
= Request To Send Channel 0 (aktiv LOW, nur Kanal 0!)
= Asynchronous Clock Channel 1 Disable (nur Kanal 1!)
= Multiprocessor Bit Receive (nur beim Lesen!)
= Error Flag Reset (nur beim Schreiben!)
= ASCII Data Format Mode
Anmerkung: Bit 4 (D4) hat bei Kanal 0 eine andere Bedeutung als bei Kanal
1. Bit 3 (D3) bedeutet beim Schreiben etwas ganz anderes als beim Lesen.
1.Teiler
10
30
D3
0
1
2.Teiler
16
64
D2 Dl DO
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
3.Teiler
1
2
4
8
16
32
64
externer Takt
Der externe Takt wird von den Pins CKAO (gemultiplext mit DREQO*) bzw.
CKA1 (gemultiplext mit TENDO*) abgenommen, wobei sich die Baudrate aus dem
externen Takt geteilt durch 16 oder 64 (abhängig von D3) ergibt. Dies ist
der Reset-Zustand. Falls die Baudrate vom System-Takt abgeleitet wird, wird
der resultierende Takt über CKA0/1 ausgegeben!
Zwei Rechenbeispiele (bei einem Systemtakt von 9.216 Mhz):
19200 Baud: 19200 = 9.216.000 DIV 30 DIV 16 DIV 1 => D5-D0 = 1x0000
300 Baud:
300 = 9.216.000 DIV 30 DIV 64 DIV 16 => D5-D0 = 1x1100
D4 ist für die Art der Parität zuständig, falls Paritäts-Prüfung gewünscht
wird: D4=0: gerade Parität (EVEN); D4=l: ungerade Parität (ODD).
Zu guter Letzt D6 und D7, die für den Multiprozessor-Modus zuständig sind:
Wenn D6=l, dann wird statt des Paritäts-Bits ein Multiprozessor-Bit gesendet/empfangen. Wenn D7=l, wird beim Senden das Multiprozessor-Bit auf 1
gesetzt. Das könnte z.B. bedeuten: "Achtung, an alle anderen Prozessoren,
es kommt was für alle!"
Weitere Einstellungen erfolgen über CNTLA.
format festgelegt:
Mit
D2 bis DO wird das Daten­
Bit______ bedeutet______
D2=0
7-Bit-Daten
=1
8-Bit-Daten
D1=0
keine Parität
=1
Parität
D0=0
1 Stop-Bit
=1
2 Stop-Bits
Wenn D3 mit 0 beschrieben wird, werden alle Fehler-Meldungen für diesen
Kanal (im Register STATO/1) gelöscht. Mit D4 kann bei Kanal 0 der Pin RTSO*
gesetzt/gelöscht werden (Request To Send = Gegenseite darf senden). Bei
Kanal 1 hingegen erfolgt hier die Auswahl, ob der Pin CKA1/TEND0** als Takt­
eingang (CKA1, D4=0) oder als Kennung für das Ende eines Blocktransfers
(TENDO*, D4=l) benutzt wird.
Mit D5 wird der Sender ein/ausgeschaltet, mit D6 der Empfänger. D7 hat nur
im Multiprozessor-Modus eine Funktion. Wenn D7=l, werden nur Daten mit
gesetztem MPB-Bit (s. D7 in CNTLB) angenommen, z.B. im Modus: "Empfange
nur Daten für alle Prozessoren!”. Bei D7=0 werden alle Daten angenommen. So
ist folgende Kommunikation denkbar: Der Master-Prozessor sendet an alle
Prozessoren (durch gesetztes MPB-Bit gekennzeichnet), welche beiden Prozes­
soren sich unterhalten dürfen. Diese schalten dann D7 auf 0 und wickeln
ihre Kommunikation ohne MPB-Bit ab. Dann schalten sie D7 auf 1 und der
Master-Prozessor wird benachrichtigt, die Sache wieder zu übernehmen.
Zu guter Letzt noch die Einstellungen, die über das Status-Register STAT
vorgenommen werden. DO legt fest, ob ein Interrupt erfolgt, wenn der Kanal
sendebereit ist. Wenn D3=l, wird auch ein Interrupt ausgelöst, wenn ein
Zeichen empfangen wurde oder ein Fehler auftrat. Bei Kanal 1 kann über D2
angewählt werden, ob der Pin CTS1*/RXS als CTS* (D2=l, Clear To Send =
HD64180 darf senden) oder als Daten-Empfangs-Pin für CSI/O (D2=0) dient.
Senden/Empf angen
Der Status des Kanals kann über STAT abgefragt werden. Dl=l bedeutet, daP
Daten gesendet werden dürfen. Wenn dann ein Byte in das Sende-Register
TDR geschrieben wird, geht Dl auf 0, bis das Zeichen gesendet wurde.
D7=l bedeutet, dap ein Zeichen empfangen wurde und jetzt aus dem EmpfangsRegister RDR gelesen werden kann oder daP beim Empfangen ein Fehler auf­
getreten ist. Nach dem Lesen des Bytes aus RDR wird D7 gelöscht. Folgende
Fehler werden erkannt:
D6 Overrun (letztes Byte wurde nicht schnell genug aus RDR geholt)
D5 Parity (das Paritäts-Bit des Zeichens war falsch)
D4 Framing (das/die Stop-Bits stimmten nicht)
Falls ein Fehler auftrat, muP dieser gelöscht werden, indem D3 von CNTLA
mit 0 beschrieben wird. Achtung: dabei werden dann auch die anderen Ein­
stellungen von CNTLA geändert!
Ober D2 aus STAT kann bei Kanal 0 noch der Zustand des Signals "Data
Carrier Detect" abgefragt werden. D2 wird auf 1 gesetzt, wenn das Signal am
Pin DCDO* irgendwann mal HIGH war oder noch ist. D2 wird nach dem Lesen auf
0 gesetzt, wenn inzwischen DCDO*=LOV ist. Solange D2=l, wird nichts empfan­
gen. D i e s e V e r b i n d u n g ist nur bei b e s t i m m t e n Modems sinnvoll.
Ober D3 aus CNTLA kann das Multiprozessor-Bit des letzten empfangenen
Bytes abgefragt werden. D5 aus CNTLB gibt Auskunft über den Zustand des
Pins CTS* Für Kanal 0 gilt, dap der Kanal erst sendebereit wird (STATO,
Dl=l), wenn der Pin CTS0*=0. CTS1* kann nur abgefragt werden und hat nur
einen EinfluP auf die Sendebereitschaft, wenn wenn D2 aus STAT1 auf 1 ge­
setzt wurde (CTS1E = CTS-Enable Kanal 1).
Clocked Serial Input/Output
Diese Schnittstelle dient zur Verbindung mehrerer Prozessoren, wobei die
anderen Prozessoren nicht unbedingt HD64180s sein müssen. Aber sie müssen
über eine gemeinsame (synchronisierte) Taktquelle verfügen und die Sende-/
Empfangs-Operation mup in beiden Prozessoren gleichzeitig beginnen!
Der HD64180 kann nicht gleichzeitig empfangen und senden. Es gibt nur ein
Sende-/Empfangsregister: TRDR (Transmit/Receive Data Register), Port OBh.
Es sind auch nur wenige Einstellungen möglich, so daP nur ein KontrollRegister nötig ist: CNTR (Control), Port OAh. Der Aufbau dieses Registers:
C N T R
_7
EF
EF
EIE
RE
TE
SSx
(Control)
6
EIE
=
=
=
=
=
5
RE
4
TE
3
“
2
SS2
1
SSI
0
SSO
End Flag (nur lesbar)
End Interrupt Enable
Receive Enable
Transmit Enable
Speed Select
Einstellungen
Es kann nur
wird, sollte
werden. Der
9.216 Mhz):
SS2 SSI SSO
0
0
0
0
0
1
0
1
0
0
1
1
0
0
1
0
1
1
1
1
0
1
1
1
die Baudrate eingestellt werden. Venn die Baudrate neu gesetzt
nicht gleichzeitig ein Sende-/Empfangs-Zyklus (s.u.) gestartet
System-Takt wird durch den folgenden Vert geteilt (hier für
Teiler ergibt Baudrate
20
460800
40
230400
80
115200
160
57600
320
28800
640
14400
1280
7200
externer Takt! (kleiner ,
Bei 111 wird der externe Takt wird über den Pin CKS eingelesen; ansonsten
wird der resultierende Takt hier ausgegeben.
Die Timer des HD64180
von Gerald Schröder
Der HD64180 verfügt über zwei programmierbare 16-Bit-Zähler und einen
nicht-programmierbaren 8-Bit-Zähler. Der 8-Bit-Zähler wird alle 10 Takte
dekrementiert und kann nur gelesen werden, und zwar über Port 18h. Das
Beschreiben dieses Ports kann Fehler im Timing des HD64180 verursachen.
Empfangen/Senden
Zuerst muß abgefragt werden, ob der Sender gerade aktiv ist. Erst wenn D7
aus CNTR gesetzt ist, kann die Operation beginnen. Zum Senden wird das
Byte in TRDR geschrieben und dann D4 in. CNTR gesetzt. Gleichzeitig wird
die Baudrate (wieder) gesetzt. Sie sollte aber nicht verändert werden, da
es sonst Sende-Probleme geben kann. Die Operation ist erst beendet, wenn D7
wieder auf 1 geht. Falls D6 gesetzt wurde, wird dann ein Interrupt ausge­
löst.
Bein Empfangen wird D5 gesetzt (zusammen mit der Baudrate). Nun beginnt
der Empfangs-Vorgang,
der immer gleich lang dauert. Wenn
D7 wieder auf 1
geht, kann das Byte
aus TRDR gelesen
werden. Wenn vordem Empfangen D6
gesetzt wurde, wird ein Interrupt ausgelöst, sobald D7 auf 1 springt. Es
ist zu beachten, daß
der Empfangs-Pin (RXS) mit CTS* für
Kanal 1 gemultiplext ist. Vor dem Empfang muß also über D2 von STAT1 die Funktion "Pin
RXS/CTS1* als RXS" ausgewählt werden.
Die 16-Bit-Zähler werden alle 20 Takte dekrementiert. Einer der 16-BitZähler kann über den Pin TOUT an einen anderen Chip melden, daß er den
Zählerstand 0000 erreicht hat. Beide Zähler können einen Interrupt auslösen,
wenn sie 0000 erreichen.
Die Ports
Port
OCh
ODh
OEh
OFh
10h
14h
15h
16h
17h
T C R
0
TDE0
Name
Timer Data Register Channel
Timer Data Register Channel
Reload Data Register Channel
Reload Data Register Channel
Timer Control Register
Timer Data Register Channel
Timer Data Register Channel
Reload Data Register Channel
Reload Data Register Channel
Abk.
TMDR0L
TMDR0H
RLDR0L
RLDR0H
TCR
TMDR1L
TMDR1H
RLDR1L
RLDR1H
0
0
0
0
Low
High
Low
High
1
1
1
1
Low
High
Low
High
(Control)
1
TDE1
TDE0/1
TOC0,l
TIE0/1
TIF0/1
2
TOCO
Timer
Timer
Timer
Timer
3
TOC1
4
TIE0
5
TIE1
6
TIF0
7
TIF1
Decrement Enable Channel 0/1
Output Control (beide für Kanal 1!)
Interrupt Enable Channel 0/1
Interrupt Flag Channel 0/1
Programmierung
Zuerst sollte der Timer gestoppt werden indem TDE in TCR auf 0 gesetzt
wird. Dann das gewünschte Zählintervall in RLDR und (!) TMDR eintragen; die
Eintragung in TMDR ist nötig, weil der Zähler sonst bei dem alten Wert
startet. Es handelt sich hier um 16-Bit-Werte, so daß bei einem Takt von
9,216 Mhz Warteschleifen von ca. 2,2 Microsekunden bis ca. 0,142 Sekunden
realisiert werden können; bzw. der Zähler erreicht 460800 (Intervall 0001)
bis 7,03125 (Intervall FFFFh) Mal in der Sekunde den Stand 0000.
Der Zähler TMDR darf zwischendurch ausgelesen werden, aber nur in der
Reihenfolge Low-Byte und dann High-Byte. Sobald TMDR den Zählerstand 0000
erreicht, wird der in RLDR stehende Wert in TMDR geladen und es wird wieder
mit dem Zählen angefangen. Außerdem wird TIF in TCR gesetzt. Falls vorher
TIE gesetzt wurde, wird auch ein Interrupt ausgelöst.
TIF wird erst gelöscht, wenn zuerst (!) TCR und dann TMDR (in der Reihen­
folge Low-/High-Byte) gelesen werden. Ansonsten bleibt es gesetzt, was bei
der Rückkehr von einer Interrupt-Routine sofort einen neuen Interrupt ver­
ursacht!
Der Zähler fängt erst an zu zählen, wenn TDE in TCR auf 1 gesetzt wird.
Gleichzeitig wird über TIE ausgewählt, ob ein Interrupt ausgelöst werden
soll, wenn TMDR den Zählerstand 0000 erreicht. Für Kanal 1 kann über TOC
noch ausgewählt werden, welche Reaktion am Pin TOUT (Timer Output) beim
Erreichen von 0000 erfolgt (Achtung: TOUT ist mit Adreßbit A18 gemultiplext):
TOCO TOC1
0
0
0
1
0
1
1
1
Reaktion TOUT
keine (Pin als A18)
TOUT wird getoggelt (0
TOUT auf 0
TOUT auf 1
Die zusätzlichen Befehle des HD64180
Helmut Bernhardt
Wer in seinem Computer den Z80 durch einen HD64180 ersetzt hat, wird
feicher schon ein plötzliches Booten oder einen Absturz beim Aufruf von
bestimmten Programmen bemerkt haben, die vorher mit dem Z80 einwand­
frei zusammengearbeitet haben.
Zu solchen Programmen zählen REZILOG
unter CP/M oder ZEUS unter NEWDOS/80.
Der Fehler liegt nicht am Pro­
zessor sondern am Programm.
Der Programmierer hat dort Befehle
benutzt, die von Zilog nicht dokumentiert sind aber trotzdem auf dem
Z80 zur Verfügung stehen. Es sind dies die Illegals mit Doppelbyte-Op-codes.
Zusätzliche Befehle des HD64180
22
Mutiplikation
ED
ED
ED
ED
4C
5C
6C
4C
MULT
MULT
MULT
MULT
BC
DE
HL
SP
BC
DE
HL
SP
B * C
D * E
H * L
SPhigh * SP low
17 Taktzyklen
Logisches AND zum Setzen der Flags ohne die Register zu verändern
Hitachi hat nun andere Vorstellungen entwickelt, wie diese freien Op­
codes verwendet werden können, und eine Reihe dieser Codes den im An­
hang zusammengestellten Befehlen zugeordnet.
Gegenüber den Illegals
des Z80 sind das sinnvolle Ergänzungen, die der Architektur des
HD64180 entgegenkommen und u.a. eine elegante Programmierung der in­
ternen Ports der CPU ermöglichen. Die ebenfalls hinzugekomnene Multi­
plikation ist leider nur auf 8Bit-Faktoren beschränkt geblieben.
Der wichtigste Befehl ist OTIMR, der eine Anzahl von Bytes, die in B
vorgegeben wird, ab einer Adresse im Speicher, auf die HL zeigt, an
aufeinander folgende interne Zeropage-Ports ausgibt, wobei die Adres­
se des ersten Ports in C vorzugeben ist. Damit kann z.B. der DMA-Controller schnell mit Parametern für eine Übertragung versorgt werden.
In mc 1/87, S.74 wurde gezeigt, wie die Illegals durch normale Befehle
ersetzt werden können. Danach kann man von Hand entsprechende Program­
me auf normale Befehle umstellen.
Was der Normalverbraucher zu Fuß
macht, läßt der Experte die CPU zur Laufzeit des IIlegal-verseuchten
Programms selbst machen. Eventuell schreibt Gerald dazu nochmal was.
Bei Erreichen eines unbekannten Opcodes wird der höchstpriorisierte
TRAP-Interrupt ausgeführt, der einem CALL 0000H gleichkommt.
Er ist
mit einem RESET vergleichbar, nur daß kein richtiges /RESET-Signal er­
folgt, das die gesamte Hardware zurücksetzt. Dadurch wird auch kein
Floppy-Controller in den Einschaltzustand zurückgesetzt und auch kein
ausgeblendetes EPROM wieder eingeschaltet.
Bei 0000H liegt dann RAM vor. Dort kann bei der Initialisierung ein
Sprung auf die TRAP-Service-Routine gepatcht werden.
Diese Routine
kann mit dem Stack und den Flags im TRAP-Register herausfinden, ob ein
TRAP die Ursache des Aufrufs war, oder ob die Adresse 0000H durch
Software aufgerufen wurde; bei einem Trap kann sie ermitteln, welches
Byte im Programm den TRAP auslöste und dem entsprechend alternative
normale Befehle abarbeiten,
und anschließend wieder die Kontrolle an
das unterbrochene Programm zurückgeben.
Wenn eine solche TRAP-Service-Routine nicht vorliegt, bedeutet der
CALL 0000H einen Warmstart unter CP/M oder einen Absturz unter
NEWDOS/80, weil die BOOT-Routine im ROM nicht den Floppy-Controller
auf Single Density zurücksetzt
(deshalb funktioniert beim GENIE auch
der Befehl BOOT oder ein JP 0000H nicht, wenn mit einem Doubler
gearbeitet wird; der TRS 80 decodiert die Adresse 0000H und erzeugt
daraus ein /RESET-Signal).
ED
ED
ED
ED
ED
ED
ED
ED
ED
ED
04
OC
14
1C
24
2C
3C
34
64 nn
74 PP
A and B
A and C
V and D
A and E
A and H
\ and L
A and A
A and (HL)
A and nn
(C) and pp
1
1
1
i
!
:
!
7 Taktzyklen
10 Taktzyklen
9 Taktzyklen
12 Taktzyklen
Zeropage I/O-Befehle
ED
ED
ED
ED
ED
ED
ED
ED
00
08
10
18
20
28
30
38
ED
ED
ED
ED
ED
ED
ED
01
09
11
19
21
29
39
pp
pp
pp
pp
pp
pp
pp
pp
pp
pp
pp
pp
pp
pp
pp
INO
INO
INO
INO
INO
INO
INO
INO
OUTO
OUTO
OUTO
OUTO
OUTO
OUTO
OUTO
B,(pp)
B
C,(pp)
D,(pp)
E,(pp)
H,(pp)
L,(pp)
F,(pp)
A,(pp)
C
(pp)
D
(pp)
E :- (pp)
H
(pp)
L :- (pp)
S.Z.P <- (pp)
A
(pp)
(pp),B
(PP).c
(pp).D
(PP),E
(pp),H
(pp).L
(pp)
(PP)
(pp)
(pp)
(pp)
(pp)
(pp),A
ED 83
OTIM
ED 93
OTIMR
;
ED 8B
OTDM
;
ED 9B
OTDMR
;
;
ED 76
Natürlich funktioniert der TRAP-Interrupt nur bei den Z80-I1legals,
für die der HD64180 keine neuen Befehle eingeführt hat. Wenn ein
illegaler Opcode auftaucht, der einem HD64180-Befehl entspricht,
so
wird dieser Befehl nach Hitachi's Vorstellung ordnungsgemäß ausge­
führt.
Der Erfolg ist dann aber nicht der, den sich der Illegal-Programmierer einst gedacht hat.
TEST B
TEST C
TEST D
TEST E
TEST H
TEST L
TEST A
TEST (HL)
TEST nn
TESTIO pp
SLP
(pp)
::::-
B
C
D
E
H
:- L
(pp) :- A
12 Taktzyklen
13 Taktzyklen
(C) -(HL), HL:-HL+1, C :-C+l, B:-B-l
14 Taktzyklen
(HL)..(HL+B), B:-0
(C) .(C+B)
oder;
(C) :- (HL), C:-C+l, HL:-HL+1, B :—B—1
wiederhole bis B-0
B*16 Taktzyklen
(C) -(HL), H L :-HL—1, C:-C--1. B: -B—1
14 Taktzyklen
(HL)-.(HL-B) . B :—0
(C) ..(C-B)
oder:
(C).--(HL). C:-C-l, H L :-HL-1, B :-B—1
B*16 Taktzyklen
; Sleep: Einstellen aller Aktivitäten incl.
; RAM-Refresh, bis /RESET oder /INT eintritt
Was this manual useful for you? yes no
Thank you for your participation!

* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project

Download PDF

advertisement