home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / emulator / unix / z80pack / z80src / z80dis.asm < prev    next >
Encoding:
Assembly Source File  |  1992-07-09  |  21.2 KB  |  639 lines

  1.     TITLE   'Z80-Disassembler'
  2.  
  3. ;    Hardware-unabhaengiger, ROM-faehiger Z80-Disassembler
  4. ;
  5. ;    Die Adresse, ab der disassembliert serden soll, ist in der
  6. ;    16-Bit Speicherzelle DADR abzulegen. Danach kann eines der
  7. ;    Entrys DISSCR (Ausgabe eines Bildschirms) oder DISLIN
  8. ;    (Ausgabe einer Zeile) aufgerufen werden. Da die Folgeadressen
  9. ;    durch das Programm ebenfalls wieder in der Speicherzelle
  10. ;    DADR abgelegt werden, ist mehrfacher Aufruf ohne Laden
  11. ;    von neuen Adressen moeglich.
  12. ;    Zur Ausgabe muss ein Unterprogramm mit dem Namen PRTSTR
  13. ;    erstellt werden, dem in HL die Adresse eines Null-terminierten
  14. ;    Strings uebergeben wird.
  15. ;
  16. ;    27-JUN-89    Udo Munk
  17.  
  18. LPP     EQU     15              ; Anzahl Zeilen/Bildschirm Ausgabe
  19. MNEPOS    EQU    11H        ; Offset des Mnemonics in Ausgabe-Workspace
  20.  
  21.     ; Disassembliere einen Bildschirm voll
  22. DISSCR:    LD    B,LPP        ; einen Bildschirm mit LPP Zeilen
  23. $DLP1:    PUSH    BC        ; disassemblieren
  24.     CALL    DISLIN
  25.     POP    BC
  26.     DJNZ    $DLP1
  27.     RET
  28.  
  29.     ; Disassembliere eine Zeile
  30. DISLIN:    CALL    CLWO        ; Workspace fuer eine Zeile Ausgabe loeschen
  31.     LD    HL,WRKS        ; Adresse der Ausgabe-Workspace -> HL
  32.     LD    DE,(DADR)    ; Disassemblier-Adresse -> DE
  33.     CALL    PRBY        ; Adresse in DE ausgeben
  34.     INC    HL        ; Blank ausgeben
  35.     LD    (PRTMP),HL    ; vordere Printposition retten
  36.     LD    C,0        ; Steuerflag loeschen
  37.     DEC    DE        ; laufende Adr.-1 -> DE
  38. $DL13:    CALL    PRNB        ; laufendes Byte ausgeben
  39.     LD    A,(DE)        ; laufendes Byte -> A
  40.     LD    B,A        ; und in B retten
  41.     CP    0EDH        ; Preafix ED ?
  42.     JR    NZ,$DL14    
  43.     SET    4,C        ; ja, ED-Flag setzen
  44.     JR    $DL13        ; und naechstes Byte bearbeiten
  45. $DL14:    CP    0FDH        ; Preafix FD ?
  46.     JR    NZ,$DL15
  47.     SET    6,C        ; ja, FD-Flag setzen
  48.     JR    $DL16        ; und Index-Flag setzen
  49. $DL15:    CP    0DDH        ; Preafix DD ?
  50.     JR    NZ,$DL17
  51. $DL16:    SET    5,C        ; Index-Flag fuer IX/IY-Adressierung setzen
  52.     LD    HL,(PRTMP)    ; vordere Printposition -> HL
  53.     JR    $DL13        ; naechstes Byte bearbeiten
  54. $DL17:    LD    HL,WRKS+MNEPOS    ; HL auf Operator Position setzen
  55.  
  56.     ; nach Praefix CB
  57. CB:    LD    A,B        ; Befehlsbyte aus B holen
  58.     CP    0CBH        ; Preafix CB ?
  59.     JP    NZ,OHNE
  60.     INC    DE        ; ja, Pointer auf naechstes Byte setzen
  61.     BIT    5,C        ; IX/IY-Flag ?
  62.     JR    Z,$DL18
  63.     INC    DE        ; ja, Pointer auf naechstes Byte setzen
  64. $DL18:    LD    A,(DE)        ; naechstes Byte -> A
  65.     LD    B,A        ; und in B retten
  66.     PUSH    DE        ; Disassemblieradr. retten
  67.     LD      D,MNETAB > 8    ; High-Byte Operatorentabelle -> D
  68.     LD    E,0E8H        ; DE = Pointer auf "SET"
  69.     CP    0C0H        ; SET ?
  70.     JR    NC,$DL19
  71.     LD    E,0E4H        ; nein, DE = Pointer auf "RES"
  72.     CP    80H        ; RES ?
  73.     JR    NC,$DL19
  74.     LD    E,0E0H        ; nein, DE = Pointer auf "BIT"
  75.     CP    40H        ; BIT ?
  76.     JR    NC,$DL19
  77.     AND    38H        ; loesche Bits 0..2 und 6..7
  78.     RRCA            ; Division durch 2
  79.     ADD     A,CBMTAB & 0FFH ; zur Basis der CB-Mnemonics addieren
  80.     LD    E,A
  81.     LD      D,CBMTAB > 8    ; DE = Pointer auf CB-Mnemonic
  82. $DL19:    CALL    TRBY        ; Mnemonic ausgeben
  83.     POP    DE        ; akt. Disassemblieradr. wieder -> DE
  84.     LD    A,B        ; Byte wieder -> A
  85.     BIT    5,C        ; IX/IY-Flag ?
  86.     JR    Z,$DL20
  87.     DEC    DE        ; eins zurueck bei IX/IY-Adressierung
  88. $DL20:    DEC    DE        ; Pointer wieder auf CB-Preafix
  89.     CP    40H        ; CB-Befehl < 40H ?
  90.     JR    C,$DL21
  91.     AND    38H        ; nein, Bits 0..2 und 6..7 loeschen
  92.     RRCA            ; Division durch 8 -> 1. Operanden
  93.     RRCA
  94.     RRCA
  95.     CALL    PRO1        ; 1. Operanden ausgeben
  96.     LD    A,B        ; Byte wieder -> A
  97.     SET    7,C        ; Komma-Flag setzen
  98. $DL21:    AND    7        ; Bits 3..7 loeschen -> 2. Operanden
  99.     SET    4,A        ; Buchstaben-Flag setzen
  100.     CALL    PRO1        ; 2. Operanden ausgeben
  101.     CALL    PRNB        ; Befehlsbyte vorne ausgeben
  102.     JP    INAD        ; fertig, Adresse merken und Workspace ausgeben
  103.  
  104.     ; ohne Preafix CB/ED
  105. OHNE:    PUSH    DE        ; Disassemblieradr. retten
  106.     BIT    4,C        ; ED-Flag ?
  107.     JP    NZ,ED
  108.     CP    40H        ; nein, < 40H ?
  109.     JR    C,$DL25
  110.     CP    80H        ; nein, > 80H ?
  111.     JR    NC,$DL23
  112.     LD    E,50H        ; nein, DE = Pointer auf "LD"
  113.     CP    76H        ; HALT ?
  114.     JR    NZ,$DL22
  115.     LD    E,5CH        ; nein, DE = Pointer auf "HALT"
  116. $DL22:    JR    $DL26        ; Mnemonic ausgeben
  117. $DL23:    CP    0C0H        ; > C0H ?
  118.     JR    NC,$DL24
  119.     AND    38H        ; ja, Bits 0..2 und 6..7 loeschen
  120.     RRCA            ; Division durch 2 -> Operator
  121.     LD    E,A        ; Operator -> E
  122.     JR    $DL26        ; Mnemonic ausgeben
  123. $DL24:    SUB    80H        ; wenn > C0H, -80 -> Tabellenoperator
  124. $DL25:    LD    E,A        ; Operator -> E
  125.     LD      D,CODTAB > 8    ; High-Byte Operatortabelle -> D
  126.     LD    A,(DE)        ; LSB Mnemonic-Adresse -> A
  127.     LD    E,A        ; und nach E
  128. $DL26:  LD      D,MNETAB > 8    ; MSB Mnemonic-Adresse -> D
  129.     CALL    TRBY        ; Mnemonic ausgeben
  130.     POP    DE        ; akt. Disassemblieradr. wieder -> DE
  131.     LD    A,B        ; Befehlsbyte wieder -> A
  132.     PUSH    DE        ; Disassemblieradr. retten
  133.     CP    40H        ; Byte < 40 ?
  134.     JR    C,$DL30
  135.     CP    80H        ; nein, > 80 ?
  136.     JR    NC,$DL28
  137.     CP    76H        ; nein, HALT ?
  138.     JR    NZ,$DL27
  139.     LD    A,0FFH        ; ja, leeren Operanden -> A
  140.     JR    $DL31        ; Operanden ausgeben
  141. $DL27:    AND    38H        ; loesche Bits 0..2 und 6..7
  142.     RRCA            ; Division durch 8 -> 1. Operanden
  143.     RRCA
  144.     RRCA
  145.     SET    4,A        ; Buchstabenflag setzen
  146.     JR    $DL31        ; Operanden ausgeben
  147. $DL28:    CP    0C0H        ; > C0 ?
  148.     JR    NC,$DL29
  149.     CP    90H        ; > 90 ?
  150.     JR    C,$DL51
  151.     AND    0F8H        ; ja, Register-Bits loeschen
  152.     CP    98H        ; "SBC" ?
  153.     JR    Z,$DL51
  154.     LD    A,B        ; Byte wieder -> A
  155.     AND    7        ; nur Register Bits uebrig lassen
  156.     SET    4,A        ; Buchstaben-Flag setzen
  157.     JR    $DL52
  158. $DL51:    LD    A,17H        ; ja, 17 = Register A ausgeben
  159.     JR    $DL31        ; Operanden ausgeben
  160. $DL29:    SUB    80H        ; wenn > C0, -80 -> Operandentabelle
  161. $DL30:    LD    E,A        ; LSB Operandentabelle -> E
  162.     LD      D,OPETAB > 8    ; MSB Operandentabelle -> D
  163.     LD    A,(DE)        ; 1. Operanden -> A
  164. $DL31:    POP    DE        ; akt. Disassemblieradr. wieder -> DE
  165.     CALL    PRO1        ; 1. Operanden ausgeben
  166.     LD    A,B        ; Befehlsbyte wieder -> A
  167.     PUSH    DE        ; akt. Disassemblieradr. retten
  168.     CP    40H        ; < 40 ?
  169.     JR    C,$DL34
  170.     CP    0C0H        ; nein, < C0 ?
  171.     JR    NC,$DL33
  172.     CP    76H        ; ja, HALT ?
  173.     JR    NZ,$DL32
  174.     LD    A,0FFH        ; ja, wieder leeren Operanden -> A
  175.     JR    $DL35        ; Operanden ausgeben
  176. $DL32:    AND    7        ; loesche Bits 3..7, -> 2. Operanden
  177.     SET    4,A        ; Buchstabenflag setzen
  178.     JR    $DL35        ; Operanden ausgeben
  179. $DL33:    SUB    80H        ; wenn > C0 : 80 abziehen
  180. $DL34:    ADD    A,80H        ; LSB Operandentabelle -> A
  181.     LD    E,A        ; und -> E
  182.     LD      D,OPETAB > 8    ; MSB Operandentabelle -> D
  183.     LD    A,(DE)        ; 2. Operanden -> A
  184. $DL35:    POP    DE        ; akt. Disassemblieradr. wieder -> DE
  185.     SET    7,C        ; Komma-Flag setzen
  186.     CALL    PRO1        ; 2. Operanden ausgeben
  187.     JP    INAD        ; fertig, Adresse merken und Workspace ausgeben
  188.     
  189.     ; nach Preafix ED
  190. ED:    SUB    40H        ; 40 vom 2. Byte subtrahieren
  191.     JP    C,ERRO        ; Fehler wenn carry
  192.     CP    60H        ; 2. Byte < A0 ?
  193.     JR    NC,$DL36
  194.     CP    40H        ; ja, >= 60 ?
  195.     JP    NC,ERRO        ; ja, Fehler
  196.     JR    $DL37        ; nein, weiter
  197. $DL36:    SUB    20H        ; aus 60..7F wird 00..20
  198. $DL37:    ADD    A,80H        ; LSB Operatortabelle -> A
  199.     LD    E,A        ; und -> E
  200.     LD      D,CODTAB > 8    ; MSB Operatortabelle -> D
  201.     LD    A,(DE)        ; LSB Mnemonic-Adresse -> A
  202.     CP    0FFH        ; leer ?
  203.     JP    Z,ERRO        ; ja, Fehler
  204.     LD    E,A        ; nein, -> E
  205.     LD      D,MNETAB > 8    ; MSB Mnemonic-Adresse -> D
  206.     CALL    TRBY        ; Mnemonic ausgeben
  207.     POP    DE        ; Disassemblieradr. wieder -> DE
  208.     LD    A,B        ; Befehlsbyte wieder -> A
  209.     CP    80H        ; < 80 ?
  210.     JP    NC,INAD        ; nein, Workspace ausgeben und fertig
  211.     PUSH    DE        ; Disassemblieradr. retten
  212.     SUB    40H        ; LSB 1. Operanden in A
  213.     LD    E,A        ; und -> E
  214.     LD      D,OP2TAB > 8    ; MSB 2. Operanden -> D
  215.     LD    A,(DE)        ; 1. Operanden -> A
  216.     POP    DE        ; akt. Disassemblieradr. wieder -> DE
  217.     CALL    PRO1        ; 1. Operanden ausgeben
  218.     LD    A,B        ; Befehlsbyte wieder -> A
  219.     CP    80H        ; < 80 ?
  220.     JP    NC,INAD        ; ja, Workspace ausgeben und fertig
  221.     PUSH    DE        ; akt. Disassemblieradr. retten
  222.     LD    E,A        ; LSB Operandentabelle -> E
  223.     LD      D,OP2TAB > 8    ; MSB Operandentabelle -> D
  224.     LD    A,(DE)        ; 2. Operanden -> A
  225.     SET    7,C        ; Buchstabenflag setzen
  226. $DL52:    POP    DE        ; akt. Disassemblieradr. retten
  227.     CALL    PRO1        ; 2. Operanden ausgeben
  228.     JP    INAD        ; fertig, Adresse merken und Workspace ausgeben
  229.  
  230.     ; Operand 1 ausgeben
  231. PRO1:    CP    0FFH        ; leere Operand ?
  232.     RET    Z        ; ja, fertig
  233.     CP    17H        ; nein, Register "A" ausgeben ?
  234.     JR    NZ,$DL01
  235.     LD    A,18H        ; ja, umkodieren
  236. $DL01:    CP    16H        ; Register "(HL)" ausgeben ?
  237.     JR    NZ,$DL02
  238.     LD    A,0B4H        ; ja, umkodieren
  239. $DL02:    BIT    7,C        ; 2. Operand ?
  240.     JR    Z,$DL03
  241.     LD    (HL),','    ; ja, "," ausgeben
  242.     INC    HL        ; naechste Printposition -> HL
  243. $DL03:    BIT    7,A        ; "(...)" ?
  244.     JR    Z,$DL04
  245.     LD    (HL),'('    ; ja, "(" ausgeben
  246.     INC    HL        ; naechste Printposition -> HL
  247. $DL04:    BIT    4,A        ; Buchstabe ?
  248.     JR    NZ,PRBU        ; ja, Buchstaben ausgeben
  249.     BIT    6,A        ; nein, Bitnummer/RST-Adresse ?
  250.     JR    NZ,DIST        ; ja, Distanz ausgeben
  251.     BIT    5,A        ; nein, Bitnummer ?
  252.     JR    NZ,PRO2        ; ja, RST ausgeben
  253.     AND    7        ; nein, Bits 3..7 loeschen
  254.     CALL    PRCH        ; Hexbyte ausgeben
  255.     RET
  256.  
  257.     ; RST ausgeben
  258. PRO2:    PUSH    AF        ; A retten
  259.     AND    6        ; loesche Bits 0 und 4..7
  260.     RRCA            ; Division durch 2
  261.     CALL    PRCH        ; oberes Nibble ausgeben
  262.     POP    AF        ; A wieder herstellen
  263.     BIT    0,A        ; RST x8 ?
  264.     LD    A,'0'        ; nein, "0" -> A
  265.     JR    Z,$DL05
  266.     LD    A,'8'        ; ja, "8" -> A
  267. $DL05:    LD    (HL),A        ; "0" oder "8" ausgeben
  268.     INC    HL        ; naechste Printposition -> HL
  269.     RET
  270.  
  271.     ; Distanz ausgeben
  272. DIST:    BIT    0,A        ; relative Distanz ?
  273.     JR    Z,PR_N        ; nein, N ausgeben
  274.     CALL    PRNB        ; Byte vorne ausgeben
  275.     PUSH    DE        ; akt. Disassemblieradr. retten
  276.     LD    A,(DE)        ; Distanzbyte -> A
  277.     INC    DE        ; Disassemblieradr. erhoehen
  278.     RLCA            ; Bit 7 Distanzbyte -> carry
  279.     RRCA
  280.     JR    NC,$DL06    ; Vorwaertsprung
  281.     SET    0,C        ; Flag fuer Rueckwaertssprung setzen
  282. $DL06:    ADD    A,E        ; Distanz zu PC addieren
  283.     LD    E,A
  284.     BIT    0,C        ; Flag testen
  285.     JR    NC,$DL07    ; kein Ueberlauf
  286.     JR    NZ,$DL08    ; Rueckwaertssprung
  287.     INC    D        ; MSB PC erhoehen
  288.     JR    $DL08        ; Zieladresse ausgeben
  289. $DL07:    JR    Z,$DL08        ; bei Vorwaertssprung Zieladresse ausgeben
  290.     DEC    D        ; sonst MSB PC erniedrigen
  291. $DL08:    CALL    PRBY        ; Zieladresse in DE ausgeben
  292.     POP    DE        ; akt. Disassemblieradresse wieder -> DE
  293.     RET
  294.  
  295.     ; N ausgeben
  296. PR_N:    PUSH    AF        ; A retten
  297.     BIT    1,A        ; N ?
  298.     JR    Z,PRNN        ; nein, NN ausgeben
  299.     CALL    PRVH        ; ja, Byte vorne und hinten ausgeben
  300.     JR    $DL12        ; ")" bearbeiten
  301.  
  302.     ; NN ausgeben
  303. PRNN:    CALL    PRNB        ; Byte vorne ausgeben
  304.     CALL    PRVH        ; Byte vorne und hinten ausgeben
  305.     DEC    DE        ; DE -> LSB von NN
  306.     CALL    PRBH        ; Byte hinten ausgeben
  307.     INC    DE        ; akt. Disassemblieradr. wieder -> DE
  308.     JR    $DL12        ; ")" bearbeiten
  309.  
  310.     ; Buchstaben ausgeben
  311. PRBU:    PUSH    AF        ; A retten
  312.     PUSH    BC        ; Flags in C retten
  313.     PUSH    DE        ; akt. Disassemblieradr. retten
  314.     LD    B,1        ; Anzahl = 1
  315.     LD    DE,REGTAB    ; DE zeigt auf die Register-Namen
  316.     BIT    5,A        ; 2 Buchstaben ?
  317.     JR    Z,$DL09
  318.     INC    B        ; ja, Anzahl erhoehen
  319. $DL09:    BIT    6,A        ; Sprungbedingung ?
  320.     JR    Z,$DL10
  321.     LD    DE,SPRTAB    ; ja, DE zeigt auf Condition-Namen
  322. $DL10:    RES    7,A        ; Klammer-Bit loeschen
  323.     CP    34H        ; "(HL)" ?
  324.     JR    NZ,$DL11
  325.     BIT    5,C        ; ja, Indexregister ?
  326.     JR    Z,$DL11
  327.     LD    A,0AH        ; ja, A -> IX-Register
  328.     BIT    6,C        ; IY-Register ?
  329.     JR    Z,$DL11
  330.     LD    A,0CH        ; ja, A -> IY-Register
  331. $DL11:    AND    0FH        ; loesche oberes Nibble
  332.     ADD    A,E        ; und addiere zur Basis in DE
  333.     LD    E,A
  334. $DL50:    LD    A,(DE)        ; Zeichen -> A
  335.     LD    (HL),A        ; Zeichen ausgeben
  336.     INC    DE        ; Tabellen-Adresse erhoehen
  337.     INC    HL        ; naechste Printposition
  338.     DJNZ    $DL50        ; naechstes Zeichen
  339.     POP    DE        ; Register wieder herstellen
  340.     POP    BC
  341.     POP    AF
  342.     PUSH    AF        ; A retten
  343.     CP    0B4H        ; "(HL)" ?
  344.     JR    NZ,$DL12
  345.     BIT    5,C        ; nein, Indexregister ?
  346.     JR    Z,$DL12
  347.     LD    A,(DE)        ; ja, Befehlsbyte nach DD/FD -> A
  348.     CP    0E9H        ; "JP (IX/IY)" ?
  349.     JR    Z,$DL12
  350.     LD    (HL),'+'    ; nein, "+" ausgeben
  351.     INC    HL        ; naechste Printposition
  352.     CALL    PRVH        ; Offset ausgeben
  353. $DL12:    POP    AF        ; A wieder herstellen
  354.     BIT    7,A        ; "()" ?
  355.     RET    Z        ; nein, fertig
  356.     LD    (HL),')'    ; ja, ")" ausgeben
  357.     INC    HL        ; naechste Printposition
  358.     RET
  359.  
  360.     ; Error
  361. ERRO:    LD    DE,CBMTAB+24    ; Pointer auf "????" -> DE
  362.     CALL    TRBY        ; als Mnemonic ausgeben
  363.     POP    DE        ; akt. Disassemblieradr. vom Stack holen
  364.     
  365.     ; Disassemblier-Adresse erhoehen und merken
  366. INAD:    INC    DE
  367.     LD    (DADR),DE
  368.  
  369.     ; Workspace ausgeben
  370. PRWO:    PUSH    AF        ; Register retten
  371.     PUSH    BC
  372.     PUSH    DE
  373.     PUSH    HL
  374.     LD    HL,WRKS        ; Adresse Workspace -> HL
  375.     CALL    PRTSTR        ; Workspace aufs Terminal ausgeben
  376.     LD    HL,NL        ; Adresse Newline-String -> HL
  377.     CALL    PRTSTR        ; Newline ausgeben
  378.     POP    HL        ; Register wieder herstellen
  379.     POP    DE
  380.     POP    BC
  381.     POP    AF
  382.     RET
  383.     
  384.     ; Workspace loeschen
  385. CLWO:    LD    HL,WRKS        ; Workspace mit Space fuellen
  386.     LD    DE,WRKS+1    ; und mit Null terminieren
  387.     LD      (HL),32
  388.     LD    BC,32
  389.     LDIR
  390.     XOR    A
  391.     LD    (DE),A
  392.     RET
  393.  
  394.     ; 4 Bytes transferieren
  395. TRBY:    PUSH    BC        ; BC retten
  396.     LD    BC,4        ; 4 Bytes 
  397.     EX    DE,HL        ; DE=Printposition, HL=Mnemonic
  398.     LDIR            ; Bytes transferieren
  399.     EX    DE,HL        ; HL ist wieder Printposition
  400.     POP    BC        ; BC wieder herstellen
  401.     INC    HL        ; Leerzeichen
  402.     RET
  403.  
  404.     ; Byte vorne und hinten ausgeben
  405. PRVH:    CALL    PRNB        ; Byte vorne ausgeben
  406.  
  407.     ; Byte hinten ausgeben
  408. PRBH:    PUSH    AF        ; A retten
  409.     LD    A,(DE)        ; Byte -> A
  410.     CALL    PRAK        ; A ausgeben
  411.     POP    AF        ; A wieder herstellen
  412.     RET
  413.  
  414.     ; Byte vorne ausgeben
  415. PRNB:    PUSH    AF        ; A retten
  416.     INC    DE        ; DE auf naechstes Byte setzen
  417.     PUSH    HL        ; akt. Printposition retten
  418.     LD    HL,(PRTMP)    ; vordere Printposition -> HL
  419.     LD    A,(DE)        ; Byte -> A
  420.     CALL    PRAK        ; A ausgeben
  421.     INC HL            ; Leerzeichen
  422.     LD    (PRTMP),HL    ; vordere Printposition retten
  423.     POP    HL        ; akt. Printposition wieder -> HL
  424.     POP    AF        ; A wieder herstellen
  425.     RET
  426.  
  427.     ; DE ausgeben
  428. PRBY:    LD    A,D        ; MSB -> A
  429.     CALL    PRAK        ; A ausgeben
  430.     LD    A,E        ; LSB -> A
  431.  
  432.     ; A ausgeben
  433. PRAK:    PUSH    AF        ; A retten
  434.     RRCA            ; oberes Nibble ins untere schieben
  435.     RRCA
  436.     RRCA
  437.     RRCA
  438.     CALL    PRCH        ; oberes Nibble ausgeben
  439.     POP    AF        ; A wieder herstellen
  440.     CALL    PRCH        ; unteres Nibble ausgeben
  441.     RET
  442.  
  443.     ; unteres Nibble in ASCII-Hex umwandeln und in Workspace schreiben
  444. PRCH:    AND    0FH
  445.     ADD    A,90H
  446.     DAA
  447.     ADC    A,40H
  448.     DAA
  449.          LD    (HL),A        ; ASCII-Ziffer in Workspace schreiben
  450.     INC    HL        ; Printposition erhoehen
  451.     RET
  452.  
  453.     ; Die hier folgenden Tabellen muessen am Anfang einer Page
  454.     ; beginnen, und die Reihenfolge der Tabellen darf auf keinen
  455.     ; Fall geaendert werden, weil das LSB der Tabellenadressen
  456.     ; durch arithmetische Operationen mit den Op-Codes berechnet
  457.     ; wird !!!
  458.  
  459.     DEFS    256 - ($ & 0FFH)
  460.  
  461. MNETAB:        ; Tabelle mit den Z80-Mnemonics
  462.     DEFM    'ADD ADC '
  463.     DEFM    'SUB SBC '
  464.     DEFM    'AND XOR '
  465.     DEFM    'OR  CP  '
  466.     DEFM    'JR  NOP '
  467.     DEFM    'DJNZEX  '
  468.     DEFM    'RLCARLA '
  469.     DEFM    'DAA SCF '
  470.     DEFM    'RRCARRA '
  471.     DEFM    'CPL CCF '
  472.     DEFM    'LD  INC '
  473.     DEFM    'DEC HALT'
  474.     DEFM    'RET POP '
  475.     DEFM    'JP  OUT '
  476.     DEFM    'EX  DI  '
  477.     DEFM    'CALLPUSH'
  478.     DEFM    'RST EXX '
  479.     DEFM    'IN  EX  '
  480.     DEFM    'EI  LDI '
  481.     DEFM    'LDIRINI '
  482.     DEFM    'INIROUTI'
  483.     DEFM    'OTIRNEG '
  484.     DEFM    'RETNRRD '
  485.     DEFM    'LDD LDDR'
  486.     DEFM    'CPD CPDR'
  487.     DEFM    'IND INDR'
  488.     DEFM    'OTDROUTD'
  489.     DEFM    'RETIRLD '
  490.     DEFM    'BIT RES '
  491.     DEFM    'SET ????'
  492.     DEFM    'CPI CPIR'
  493.     DEFM    'IM  ----'
  494.  
  495. CODTAB:        ; LSB-Adressen der Mnemonics in MNETAB fuer
  496.         ; Befehle 00..3F ohne Preafix ED/CB
  497.  
  498.     DEFB    024H,050H,050H,054H,054H,058H,050H,030H    ; NOP  LD   LD   INC  INC  DEC  LD   RLCA
  499.     DEFB    070H,000H,050H,058H,054H,058H,050H,040H    ; EX   ADD  LD   DEC  INC  DEC  LD   RRCA
  500.     DEFB    028H,050H,050H,054H,054H,058H,050H,034H    ; DJNZ LD   LD   INC  INC  DEC  LD   RLA
  501.     DEFB    020H,000H,050H,058H,054H,058H,050H,044H    ; JR   ADD  LD   DEC  INC  DEC  LD   RRA
  502.     DEFB    020H,050H,050H,054H,054H,058H,050H,038H    ; JR   LD   LD   INC  INC  DEC  LD   DAA
  503.     DEFB    020H,000H,050H,058H,054H,058H,050H,048H    ; JR   ADD  LD   DEC  INC  DEC  LD   CPL
  504.     DEFB    020H,050H,050H,054H,054H,058H,050H,03CH    ; JR   LD   LD   INC  INC  DEC  LD   SCF
  505.     DEFB    020H,000H,050H,058H,054H,058H,050H,04CH    ; JR   ADD  LD   DEC  INC  DEC  LD   CCF
  506.  
  507.         ; LSB-Adressen der Mnemonics in MNETAB fuer
  508.         ; Befehle C0..FF ohne Preafix ED/CB
  509.  
  510.     DEFB    060H,064H,068H,068H,078H,07CH,000H,080H    ; RET  POP  JP   JP   CALL PUSH ADD  RET
  511.     DEFB    060H,060H,068H,0F1H,078H,078H,004H,080H    ; RET  RET  JP   (CB) CALL CALL ADC  RST
  512.     DEFB    060H,064H,068H,06CH,078H,07CH,008H,080H    ; RET  POP  JP   OUT  CALL PUSH SUB  RST
  513.     DEFB    060H,084H,068H,088H,078H,0F0H,00CH,080H    ; RET  EXX  JP   IN   CALL (DD) SBC  RST
  514.     DEFB    060H,064H,068H,070H,078H,07CH,010H,080H    ; RET  POP  JP   EX   CALL PUSH AND  RST
  515.     DEFB    060H,068H,068H,02CH,078H,0F2H,014H,080H    ; RET  JP   JP   EX   CALL (ED) XOR  RST
  516.     DEFB    060H,064H,068H,074H,078H,07CH,018H,080H    ; RET  POP  JP   DI   CALL PUSH OR   RST
  517.     DEFB    060H,050H,068H,090H,078H,0F8H,01CH,080H    ; RET  LD   JP   EI   CALL (FD) CP   RST
  518.  
  519.         ; LSB-Adressen der Mnemonics in MNETAB fuer
  520.         ; Befehle 40..7F mit Preafix ED
  521.  
  522.     DEFB    088H,06CH,00CH,050H,0ACH,0B0H,0F8H,050H    ; IN   OUT  SBC  LD   NEG  RETN IM   LD
  523.     DEFB    088H,06CH,004H,050H,0FFH,0D8H,0FFH,050H    ; IN   OUT  ADC  LD        RETI      LD
  524.     DEFB    088H,06CH,00CH,050H,0FFH,0FFH,0F8H,050H    ; IN   OUT  SBC  LD             IM   LD
  525.     DEFB    088H,06CH,004H,050H,0FFH,0FFH,0F8H,050H    ; IN   OUT  ADC  LD             IM   LD
  526.     DEFB    088H,06CH,00CH,0FFH,0FFH,0FFH,0FFH,0B4H    ; IN   OUT  SBC                      RRD
  527.     DEFB    088H,06CH,004H,0FFH,0FFH,0FFH,0FFH,0DCH    ; IN   OUT  ADC                      RLD
  528.     DEFB    0FFH,0FFH,00CH,050H,0FFH,0FFH,0FFH,0FFH    ;           SBC  LD
  529.     DEFB    088H,06CH,004H,050H,0FFH,0FFH,0FFH,0FFH    ; IN   OUT  ADC  LD
  530.  
  531.         ; LSB-Adressen der Mnemonics in MNETAB fuer
  532.         ; Befehle A0..BF mit Praefix ED
  533.  
  534.     DEFB    094H,0F0H,09CH,0A4H,0FFH,0FFH,0FFH,0FFH    ; LDI  CPI  INI  OUTI
  535.     DEFB    0B8H,0C0H,0C8H,0D4H,0FFH,0FFH,0FFH,0FFH    ; LDD  CPD  IND  OUTD
  536.     DEFB    098H,0F4H,0A0H,0A8H,0FFH,0FFH,0FFH,0FFH    ; LDIR CPIR INIR OTIR
  537.     DEFB    0BCH,0C4H,0CCH,0D0H,0FFH,0FFH,0FFH,0FFH    ; LDDR CPDR INDR OTDR
  538.  
  539. SPRTAB:        ; Tabelle der Sprungbedingungen
  540.  
  541.     DEFM    'NZNCPOPEPM'
  542.     DEFB    0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
  543.  
  544. REGTAB:        ; Tabelle der Register
  545.  
  546.     DEFM    'BCDEHLSPAFIXIYIR'
  547.  
  548. OPETAB:        ; Tabelle der Operanden:
  549.         ;    Bit 7: Zahl/Buchstabe
  550.         ;    Bit 6: einfach/doppelt
  551.         ;    Bit 5: Register/Sprungbedingung
  552.         ;    Bit 4: ohne/mit Klammer
  553.         ;    Bit 0..3: Offset in der Tabelle der Registernamen
  554.  
  555.         ; Befehle 00..3F ohne Preafix ED/CB
  556.         ; 1. Operand
  557.  
  558.     DEFB    0FFH,030H,0B0H,030H,010H,010H,010H,0FFH    ; -    BC   (BC) BC   B    B    B    -
  559.     DEFB    038H,034H,017H,030H,011H,011H,011H,0FFH    ; AF   HL   A    BC   C    C    C    -
  560.     DEFB    041H,032H,0B2H,032H,012H,012H,012H,0FFH    ; DIS  DE   (DE) DE   D    D    D    -
  561.     DEFB    041H,034H,017H,032H,013H,013H,013H,0FFH    ; DIS  HL   A    DE   E    E    E    -
  562.     DEFB    070H,034H,0C4H,034H,014H,014H,014H,0FFH    ; NZ   HL   (NN) HL   H    H    H    -
  563.     DEFB    051H,034H,034H,034H,015H,015H,015H,0FFH    ; Z    HL   HL   HL   L    L    L    -
  564.     DEFB    072H,036H,0C4H,036H,016H,016H,016H,0FFH    ; NC   SP   (NN) SP   (HL) (HL) (HL) -
  565.     DEFB    011H,034H,017H,036H,017H,017H,017H,0FFH    ; C    HL   A    SP   A    A    A    -
  566.  
  567.         ; Befehle C0..FF ohne Preafix ED/CB
  568.         ; 1. Operand
  569.  
  570.     DEFB    070H,030H,070H,044H,070H,030H,017H,020H    ; NZ   BC   NZ   NN   NZ   BC   A    00
  571.     DEFB    051H,0FFH,051H,0F1H,051H,044H,017H,021H    ; Z    -    Z    *CB  Z    NN   A    08
  572.     DEFB    072H,032H,072H,0C2H,072H,032H,042H,022H    ; NC   DE   NC   (N)  NC   DE   N    10
  573.     DEFB    053H,0FFH,053H,017H,053H,0F2H,017H,023H    ; C    -    C    A    C    *DD  A    18
  574.     DEFB    074H,034H,074H,0B6H,074H,034H,042H,024H    ; PO   HL   PO   (SP) PO   HL   N    20
  575.     DEFB    076H,016H,076H,032H,076H,0F4H,042H,025H    ; PE   (HL) PE   DE   PE   *ED  N    28
  576.     DEFB    058H,038H,058H,0FFH,058H,038H,042H,026H    ; P    AF   P    -    P    AF   N    30
  577.     DEFB    059H,036H,059H,0FFH,059H,0F8H,042H,027H    ; M    SP   M    -    M    *FD  N    38
  578.  
  579.         ; Befehle 00..3F ohne Preafix ED/CB
  580.         ; 2. Operand
  581.  
  582.     DEFB    0FFH,044H,017H,0FFH,0FFH,0FFH,042H,0FFH    ; -    NN   A    -    -    -    N    -
  583.     DEFB    038H,030H,0B0H,0FFH,0FFH,0FFH,042H,0FFH    ; AF   BC   (BC) -    -    -    N    -
  584.     DEFB    0FFH,044H,017H,0FFH,0FFH,0FFH,042H,0FFH    ; -    NN   A    -    -    -    N    -
  585.     DEFB    0FFH,032H,0B2H,0FFH,0FFH,0FFH,042H,0FFH    ; -    DE   (DE) -    -    -    N    -
  586.     DEFB    041H,044H,034H,0FFH,0FFH,0FFH,042H,0FFH    ; DIS  NN   HL   -    -    -    N    -
  587.     DEFB    041H,034H,0C4H,0FFH,0FFH,0FFH,042H,0FFH    ; DIS  HL   (NN) -    -    -    N    -
  588.     DEFB    041H,044H,017H,0FFH,0FFH,0FFH,042H,0FFH    ; DIS  NN   A    -    -    -    N    -
  589.     DEFB    041H,036H,0C4H,0FFH,0FFH,0FFH,042H,0FFH    ; DIS  SP   (NN) -    -    -    N    -
  590.  
  591.         ; Befehle C0..FF ohne Praefix ED/CB
  592.         ; 2. Operand
  593.  
  594.     DEFB    0FFH,0FFH,044H,0FFH,044H,0FFH,042H,0FFH    ; -    -    NN   -    NN   -    N    -
  595.     DEFB    0FFH,0FFH,044H,0FFH,044H,0FFH,042H,0FFH    ; -    -    NN   *CB  NN   -    N    -
  596.     DEFB    0FFH,0FFH,044H,017H,044H,0FFH,0FFH,0FFH    ; -    -    NN   A    NN   -    -    -
  597.     DEFB    0FFH,0FFH,044H,0C2H,044H,0FFH,042H,0FFH    ; -    -    NN   (N)  NN   *DD  N    -
  598.     DEFB    0FFH,0FFH,044H,034H,044H,0FFH,0FFH,0FFH    ; -    -    NN   HL   NN   -    -    -
  599.     DEFB    0FFH,0FFH,044H,034H,044H,0FFH,0FFH,0FFH    ; -    -    NN   HL   NN   *ED  -    -
  600.     DEFB    0FFH,0FFH,044H,0FFH,044H,0FFH,0FFH,0FFH    ; -    -    NN   -    NN   -    -    -
  601.     DEFB    0FFH,034H,044H,0FFH,044H,0FFH,0FFH,0FFH    ; -    HL   NN   -    NN   *FD  -    -
  602.  
  603. OP2TAB:        ; Befehle 40..7F mit Praefix ED
  604.         ; 1. Operand
  605.  
  606.     DEFB    010H,091H,034H,0C4H,0FFH,0FFH,000H,01EH    ; B    (C)  HL   (NN) -    -    0    I
  607.     DEFB    011H,091H,034H,030H,0FFH,0FFH,0FFH,01FH    ; C    (C)  HL   BC   -    -    -    R
  608.     DEFB    012H,091H,034H,0C4H,0FFH,0FFH,001H,017H    ; D    (C)  HL   (NN) -    -    1    A
  609.     DEFB    013H,091H,034H,032H,0FFH,0FFH,002H,017H    ; E    (C)  HL   DE   -    -    2    A
  610.     DEFB    014H,091H,034H,0C4H,0FFH,0FFH,076H,0FFH    ; H    (C)  HL   -    -    -    -    -
  611.     DEFB    015H,091H,034H,0FFH,0FFH,0FFH,0FFH,0FFH    ; L    (C)  HL   -    -    -    -    -
  612.     DEFB    0FFH,0FFH,034H,0C4H,0FFH,0FFH,0FFH,0FFH    ; -    -    HL   (NN) -    -    -    -
  613.     DEFB    017H,091H,034H,036H,0FFH,0FFH,0FFH,0FFH    ; A    (C)  HL   SP   -    -    -    -
  614.  
  615.         ; Befehle 40..7F mit Preafix ED
  616.         ; 2. Operand
  617.  
  618.     DEFB    091H,010H,030H,030H,0FFH,0FFH,0FFH,017H    ; (C)  B    BC   BC   -    -    -    A
  619.     DEFB    091H,011H,030H,0C4H,0FFH,0FFH,0FFH,017H    ; (C)  C    BC   (NN) -    -    -    A
  620.     DEFB    091H,012H,032H,032H,0FFH,0FFH,0FFH,01EH    ; (C)  D    DE   DE   -    -    -    I
  621.     DEFB    091H,013H,032H,0C4H,0FFH,0FFH,0FFH,01FH    ; (C)  E    DE   (NN) -    -    -    R
  622.     DEFB    091H,014H,034H,034H,0FFH,0FFH,0FFH,0FFH    ; (C)  H    HL   -    -    -    -    -
  623.     DEFB    091H,015H,034H,0FFH,0FFH,0FFH,0FFH,0FFH    ; (C)  L    HL   -    -    -    -    -
  624.     DEFB    0FFH,0FFH,036H,036H,0FFH,0FFH,0FFH,0FFH    ; -    -    SP   SP   -    -    -    -
  625.     DEFB    091H,017H,036H,0C4H,0FFH,0FFH,0FFH,0FFH    ; (C)  A    SP   (NN) -    -    -    -
  626.  
  627. CBMTAB:        ; Tabelle der Mnemonics mit Praefix CB
  628.     DEFM    'RLC RRC '
  629.     DEFM    'RL  RR  '
  630.     DEFM    'SLA SRA '
  631.     DEFM    '????SRL '
  632.  
  633. NL:        ; Null-terminiertes Newline fuers Terminal
  634.     DEFB    10,13,0
  635.  
  636. WRKS:    DEFS    34        ; Workspace zur Aufbereitung einer Ausgabezeile
  637. PRTMP:    DEFS    2        ; temoraerer Speicher fuer Printposition
  638. DADR:    DEFS    2        ; Disassemblier-Adresse
  639.