    Die zusätzlichen Befehle das HD64180

    Helmut Bernhardt

    Wer in seinem Cmoputer den Z80 durch einen HD64180 ersetzt hat, wird
    sicher schon ein plötzliches Booten oder einen Absturz bei Aufruf von
    bestimmten Programmen  bemerkt haben, die vorher mit dem Z80 einwand-
    frei zusamnmengearbeitet 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 die die Illegals mit Doppelbyte-Op-
    -codes.

    Hitachi hat nun andere Vorstellungen entwickelt, wie diese freien Op-
    codes verwendet werden können, und eine Reihe dieser Codes den in 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 hinzugekommene Multi-
    plikation ist leider nur auf 8Bit-Faktoren beschränt 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 Zeropake-Ports ausgibt, wobei die Adres-
    se des ersten Ports in C vortugeben ist. Damit kann z.B. der DMA-Con-
    troller schnell mit Parmetern für eine Übertragung versorgt werden.

    In mc 1/87, S.74 wurde gezeigt, wie die Illegals durch nrmale Befehle
    ersetzt werden können. Danach kann man von Hand entprechende Prgram-
    me auf normale  Befehle umstellen. Was der Normalverbraucher zu Fuß
    macht, läßt der Experte die CPU zur Laufzeit des Illegal-verseuchten
    Programms selbst machen. Eventuell schreibt Gerald dazu nochmal was.

    Bei Erreichen eines unbekannten Opcodes wird der höchstpriorisierte
    TRAP-Interrupt ausgeführt, der einen CALL 0000H gleichkommt. Er ist
    mit einem RESET vergleichbar, nur dass 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 ROM 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 entprechend 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 Sinle 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
    darus ein /RESET-Signal).

    Natürlich funktioniert der TRAP-Interrupt nur bei den Z80-Illegls,
    für die der HD64180 keine neuen Befehle eingeführt hat. Wenn ein
    illegaler Opcode auftaucht, der einem HD64180-Befehl entpricht, 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.

    Zusätzliche Befehle des HD64180

    Multiplikation

    ED 4C      MULT  BC    ;BC := B * C          |  17 Taktzyklen
    ED 5C      MULT  DE    ;DE ;= D * E          |
    ED 6C      MULT  HL    ;HL := H * L          |
    ED 7C      MULT  SP    ;SP := SPhigh * SPlow |

    Logisches AND zum Setzen der Flags, ohne die Register zu verändern

    ED 04      TEST  B     ; A and B             |  7 TaktzyXlen
    ED 0C      TEST  C     ; A and C             |
    ED 14      TEST  D     ; A and D             |
    ED 1C      TEST  E     ; A and E             |
    ED 24      TEST  H     ; A and H             |
    ED 2C      TEST  L     ; A and L             |
    ED 3C      TEST  n     ; A and A             |
    ED 34      TE5T  (HL)  ; A and (HL)          |  10 Takt2yklen
    ED 64 nn   TEST  nn    ; A and nn            |   9 Taktzyklen
    ED 74 pp   TESTIO pp   ; (C) and pp          |  12 Taktzyklen

    Zeropage I/O-Befehle

    ED 00 pp    IN0  B, {pp)    ; B := (pp)      |  12 Taktzyklen
    ED 08 pp    IN0  C, (pp)    ; C := (pp)      |
    ED 10 pp    IN0  D, (pp)    ; D := (pp)      |
    ED 18 pp    IN0  E, (pp)    ; E := (pp)      |
    ED 20 pp    IN0  H, (pp)    ; H := (pp)      |
    ED 28 pp    IN0  L, (pp)    ; L := (pp)      |
    ED 30 pp    IN0  F, (pp)    ; S,Z,P <- (pp)  |
    ED 38 pp    IN0  A, (pp)    ; A := (pp)      |

    ED 01 pp    OUT0 (pp),B     ; (pp) := B      |  13 TaXt2yklen
    ED 09 pp    OUT0 (pp),C     ; (pp) := C      |
    ED 11 pp    OUT0 (pp),D     ; (pp) := D      |
    ED 19 pp    OUT0 (pp),E     ; (pp) := E      |
    ED 21 pp    OUT0 (pp),H     ; (pp) := H      |
    ED 29 pp    OUT0 (pp),L     ; (pp) := L      |
    ED 39 pp    OUT0 (pp),A     ; (pp} := A      |

    ED 83       OTIM     ; (C) := (HL), HL:= HL+1, C := C+1, B := B-1
    						14 Taktzyklen
    ED 93       OTIMR    ; (C)..(C+B) := (HL)..(HL+B), B:=0
                         ; oder: (C):=(HL), C:=C+1, HL:=HL+1, B:BB-1
                         ; wiederhole bis B=0	B*16 Taktzyklen
    ED 8B       OTDM     ; (C):=(HL), HL:=HL-1, C;=C-1, B:=B-1
    						14 Taktzyklen
    ED 9B       OTDMR    ; (C)..(C-B) := (H).. (HL-B),  B:=0
                         ; oder: (C):=(HL), C:=C-1, HL:=HL-1, B:=B-1
    						B*16 Taktzyklen

    ED 76       SLP      ; Sleep: Einstellen aller Aktivitäten incl.
                         ; Refresh, bis /RESET oder /IMT eintritt