; Hardware-unabhaengiger, ROM-faehiger Z80-Disassembler
;
; Die Adresse, ab der disassembliert serden soll, ist in der
; 16-Bit Speicherzelle DADR abzulegen. Danach kann eines der
; Entrys DISSCR (Ausgabe eines Bildschirms) oder DISLIN
; (Ausgabe einer Zeile) aufgerufen werden. Da die Folgeadressen
; durch das Programm ebenfalls wieder in der Speicherzelle
; DADR abgelegt werden, ist mehrfacher Aufruf ohne Laden
; von neuen Adressen moeglich.
; Zur Ausgabe muss ein Unterprogramm mit dem Namen PRTSTR
; erstellt werden, dem in HL die Adresse eines Null-terminierten
; Strings uebergeben wird.
;
; 27-JUN-89 Udo Munk
LPP EQU 15 ; Anzahl Zeilen/Bildschirm Ausgabe
MNEPOS EQU 11H ; Offset des Mnemonics in Ausgabe-Workspace
; Disassembliere einen Bildschirm voll
DISSCR: LD B,LPP ; einen Bildschirm mit LPP Zeilen
$DLP1: PUSH BC ; disassemblieren
CALL DISLIN
POP BC
DJNZ $DLP1
RET
; Disassembliere eine Zeile
DISLIN: CALL CLWO ; Workspace fuer eine Zeile Ausgabe loeschen
LD HL,WRKS ; Adresse der Ausgabe-Workspace -> HL
LD DE,(DADR) ; Disassemblier-Adresse -> DE
CALL PRBY ; Adresse in DE ausgeben
INC HL ; Blank ausgeben
LD (PRTMP),HL ; vordere Printposition retten
LD C,0 ; Steuerflag loeschen
DEC DE ; laufende Adr.-1 -> DE
$DL13: CALL PRNB ; laufendes Byte ausgeben
LD A,(DE) ; laufendes Byte -> A
LD B,A ; und in B retten
CP 0EDH ; Preafix ED ?
JR NZ,$DL14
SET 4,C ; ja, ED-Flag setzen
JR $DL13 ; und naechstes Byte bearbeiten
$DL14: CP 0FDH ; Preafix FD ?
JR NZ,$DL15
SET 6,C ; ja, FD-Flag setzen
JR $DL16 ; und Index-Flag setzen
$DL15: CP 0DDH ; Preafix DD ?
JR NZ,$DL17
$DL16: SET 5,C ; Index-Flag fuer IX/IY-Adressierung setzen
LD HL,(PRTMP) ; vordere Printposition -> HL
JR $DL13 ; naechstes Byte bearbeiten
$DL17: LD HL,WRKS+MNEPOS ; HL auf Operator Position setzen
; nach Praefix CB
CB: LD A,B ; Befehlsbyte aus B holen
CP 0CBH ; Preafix CB ?
JP NZ,OHNE
INC DE ; ja, Pointer auf naechstes Byte setzen
BIT 5,C ; IX/IY-Flag ?
JR Z,$DL18
INC DE ; ja, Pointer auf naechstes Byte setzen
$DL18: LD A,(DE) ; naechstes Byte -> A
LD B,A ; und in B retten
PUSH DE ; Disassemblieradr. retten
LD D,MNETAB > 8 ; High-Byte Operatorentabelle -> D
LD E,0E8H ; DE = Pointer auf "SET"
CP 0C0H ; SET ?
JR NC,$DL19
LD E,0E4H ; nein, DE = Pointer auf "RES"
CP 80H ; RES ?
JR NC,$DL19
LD E,0E0H ; nein, DE = Pointer auf "BIT"
CP 40H ; BIT ?
JR NC,$DL19
AND 38H ; loesche Bits 0..2 und 6..7
RRCA ; Division durch 2
ADD A,CBMTAB & 0FFH ; zur Basis der CB-Mnemonics addieren
LD E,A
LD D,CBMTAB > 8 ; DE = Pointer auf CB-Mnemonic
$DL19: CALL TRBY ; Mnemonic ausgeben
POP DE ; akt. Disassemblieradr. wieder -> DE
LD A,B ; Byte wieder -> A
BIT 5,C ; IX/IY-Flag ?
JR Z,$DL20
DEC DE ; eins zurueck bei IX/IY-Adressierung
$DL20: DEC DE ; Pointer wieder auf CB-Preafix
CP 40H ; CB-Befehl < 40H ?
JR C,$DL21
AND 38H ; nein, Bits 0..2 und 6..7 loeschen
RRCA ; Division durch 8 -> 1. Operanden
RRCA
RRCA
CALL PRO1 ; 1. Operanden ausgeben
LD A,B ; Byte wieder -> A
SET 7,C ; Komma-Flag setzen
$DL21: AND 7 ; Bits 3..7 loeschen -> 2. Operanden
SET 4,A ; Buchstaben-Flag setzen
CALL PRO1 ; 2. Operanden ausgeben
CALL PRNB ; Befehlsbyte vorne ausgeben
JP INAD ; fertig, Adresse merken und Workspace ausgeben
; ohne Preafix CB/ED
OHNE: PUSH DE ; Disassemblieradr. retten
BIT 4,C ; ED-Flag ?
JP NZ,ED
CP 40H ; nein, < 40H ?
JR C,$DL25
CP 80H ; nein, > 80H ?
JR NC,$DL23
LD E,50H ; nein, DE = Pointer auf "LD"
CP 76H ; HALT ?
JR NZ,$DL22
LD E,5CH ; nein, DE = Pointer auf "HALT"
$DL22: JR $DL26 ; Mnemonic ausgeben
$DL23: CP 0C0H ; > C0H ?
JR NC,$DL24
AND 38H ; ja, Bits 0..2 und 6..7 loeschen
RRCA ; Division durch 2 -> Operator
LD E,A ; Operator -> E
JR $DL26 ; Mnemonic ausgeben
$DL24: SUB 80H ; wenn > C0H, -80 -> Tabellenoperator
$DL25: LD E,A ; Operator -> E
LD D,CODTAB > 8 ; High-Byte Operatortabelle -> D
LD A,(DE) ; LSB Mnemonic-Adresse -> A
LD E,A ; und nach E
$DL26: LD D,MNETAB > 8 ; MSB Mnemonic-Adresse -> D
CALL TRBY ; Mnemonic ausgeben
POP DE ; akt. Disassemblieradr. wieder -> DE
LD A,B ; Befehlsbyte wieder -> A
PUSH DE ; Disassemblieradr. retten
CP 40H ; Byte < 40 ?
JR C,$DL30
CP 80H ; nein, > 80 ?
JR NC,$DL28
CP 76H ; nein, HALT ?
JR NZ,$DL27
LD A,0FFH ; ja, leeren Operanden -> A
JR $DL31 ; Operanden ausgeben
$DL27: AND 38H ; loesche Bits 0..2 und 6..7
RRCA ; Division durch 8 -> 1. Operanden
RRCA
RRCA
SET 4,A ; Buchstabenflag setzen
JR $DL31 ; Operanden ausgeben
$DL28: CP 0C0H ; > C0 ?
JR NC,$DL29
CP 90H ; > 90 ?
JR C,$DL51
AND 0F8H ; ja, Register-Bits loeschen
CP 98H ; "SBC" ?
JR Z,$DL51
LD A,B ; Byte wieder -> A
AND 7 ; nur Register Bits uebrig lassen
SET 4,A ; Buchstaben-Flag setzen
JR $DL52
$DL51: LD A,17H ; ja, 17 = Register A ausgeben
JR $DL31 ; Operanden ausgeben
$DL29: SUB 80H ; wenn > C0, -80 -> Operandentabelle
$DL30: LD E,A ; LSB Operandentabelle -> E
LD D,OPETAB > 8 ; MSB Operandentabelle -> D
LD A,(DE) ; 1. Operanden -> A
$DL31: POP DE ; akt. Disassemblieradr. wieder -> DE
CALL PRO1 ; 1. Operanden ausgeben
LD A,B ; Befehlsbyte wieder -> A
PUSH DE ; akt. Disassemblieradr. retten
CP 40H ; < 40 ?
JR C,$DL34
CP 0C0H ; nein, < C0 ?
JR NC,$DL33
CP 76H ; ja, HALT ?
JR NZ,$DL32
LD A,0FFH ; ja, wieder leeren Operanden -> A
JR $DL35 ; Operanden ausgeben
$DL32: AND 7 ; loesche Bits 3..7, -> 2. Operanden
SET 4,A ; Buchstabenflag setzen
JR $DL35 ; Operanden ausgeben
$DL33: SUB 80H ; wenn > C0 : 80 abziehen
$DL34: ADD A,80H ; LSB Operandentabelle -> A
LD E,A ; und -> E
LD D,OPETAB > 8 ; MSB Operandentabelle -> D
LD A,(DE) ; 2. Operanden -> A
$DL35: POP DE ; akt. Disassemblieradr. wieder -> DE
SET 7,C ; Komma-Flag setzen
CALL PRO1 ; 2. Operanden ausgeben
JP INAD ; fertig, Adresse merken und Workspace ausgeben
; nach Preafix ED
ED: SUB 40H ; 40 vom 2. Byte subtrahieren
JP C,ERRO ; Fehler wenn carry
CP 60H ; 2. Byte < A0 ?
JR NC,$DL36
CP 40H ; ja, >= 60 ?
JP NC,ERRO ; ja, Fehler
JR $DL37 ; nein, weiter
$DL36: SUB 20H ; aus 60..7F wird 00..20
$DL37: ADD A,80H ; LSB Operatortabelle -> A
LD E,A ; und -> E
LD D,CODTAB > 8 ; MSB Operatortabelle -> D
LD A,(DE) ; LSB Mnemonic-Adresse -> A
CP 0FFH ; leer ?
JP Z,ERRO ; ja, Fehler
LD E,A ; nein, -> E
LD D,MNETAB > 8 ; MSB Mnemonic-Adresse -> D
CALL TRBY ; Mnemonic ausgeben
POP DE ; Disassemblieradr. wieder -> DE
LD A,B ; Befehlsbyte wieder -> A
CP 80H ; < 80 ?
JP NC,INAD ; nein, Workspace ausgeben und fertig
PUSH DE ; Disassemblieradr. retten
SUB 40H ; LSB 1. Operanden in A
LD E,A ; und -> E
LD D,OP2TAB > 8 ; MSB 2. Operanden -> D
LD A,(DE) ; 1. Operanden -> A
POP DE ; akt. Disassemblieradr. wieder -> DE
CALL PRO1 ; 1. Operanden ausgeben
LD A,B ; Befehlsbyte wieder -> A
CP 80H ; < 80 ?
JP NC,INAD ; ja, Workspace ausgeben und fertig
PUSH DE ; akt. Disassemblieradr. retten
LD E,A ; LSB Operandentabelle -> E
LD D,OP2TAB > 8 ; MSB Operandentabelle -> D
LD A,(DE) ; 2. Operanden -> A
SET 7,C ; Buchstabenflag setzen
$DL52: POP DE ; akt. Disassemblieradr. retten
CALL PRO1 ; 2. Operanden ausgeben
JP INAD ; fertig, Adresse merken und Workspace ausgeben
; Operand 1 ausgeben
PRO1: CP 0FFH ; leere Operand ?
RET Z ; ja, fertig
CP 17H ; nein, Register "A" ausgeben ?
JR NZ,$DL01
LD A,18H ; ja, umkodieren
$DL01: CP 16H ; Register "(HL)" ausgeben ?
JR NZ,$DL02
LD A,0B4H ; ja, umkodieren
$DL02: BIT 7,C ; 2. Operand ?
JR Z,$DL03
LD (HL),',' ; ja, "," ausgeben
INC HL ; naechste Printposition -> HL
$DL03: BIT 7,A ; "(...)" ?
JR Z,$DL04
LD (HL),'(' ; ja, "(" ausgeben
INC HL ; naechste Printposition -> HL
$DL04: BIT 4,A ; Buchstabe ?
JR NZ,PRBU ; ja, Buchstaben ausgeben
BIT 6,A ; nein, Bitnummer/RST-Adresse ?
JR NZ,DIST ; ja, Distanz ausgeben
BIT 5,A ; nein, Bitnummer ?
JR NZ,PRO2 ; ja, RST ausgeben
AND 7 ; nein, Bits 3..7 loeschen
CALL PRCH ; Hexbyte ausgeben
RET
; RST ausgeben
PRO2: PUSH AF ; A retten
AND 6 ; loesche Bits 0 und 4..7
RRCA ; Division durch 2
CALL PRCH ; oberes Nibble ausgeben
POP AF ; A wieder herstellen
BIT 0,A ; RST x8 ?
LD A,'0' ; nein, "0" -> A
JR Z,$DL05
LD A,'8' ; ja, "8" -> A
$DL05: LD (HL),A ; "0" oder "8" ausgeben
INC HL ; naechste Printposition -> HL
RET
; Distanz ausgeben
DIST: BIT 0,A ; relative Distanz ?
JR Z,PR_N ; nein, N ausgeben
CALL PRNB ; Byte vorne ausgeben
PUSH DE ; akt. Disassemblieradr. retten
LD A,(DE) ; Distanzbyte -> A
INC DE ; Disassemblieradr. erhoehen
RLCA ; Bit 7 Distanzbyte -> carry
RRCA
JR NC,$DL06 ; Vorwaertsprung
SET 0,C ; Flag fuer Rueckwaertssprung setzen
$DL06: ADD A,E ; Distanz zu PC addieren
LD E,A
BIT 0,C ; Flag testen
JR NC,$DL07 ; kein Ueberlauf
JR NZ,$DL08 ; Rueckwaertssprung
INC D ; MSB PC erhoehen
JR $DL08 ; Zieladresse ausgeben
$DL07: JR Z,$DL08 ; bei Vorwaertssprung Zieladresse ausgeben
DEC D ; sonst MSB PC erniedrigen
$DL08: CALL PRBY ; Zieladresse in DE ausgeben
POP DE ; akt. Disassemblieradresse wieder -> DE
RET
; N ausgeben
PR_N: PUSH AF ; A retten
BIT 1,A ; N ?
JR Z,PRNN ; nein, NN ausgeben
CALL PRVH ; ja, Byte vorne und hinten ausgeben
JR $DL12 ; ")" bearbeiten
; NN ausgeben
PRNN: CALL PRNB ; Byte vorne ausgeben
CALL PRVH ; Byte vorne und hinten ausgeben
DEC DE ; DE -> LSB von NN
CALL PRBH ; Byte hinten ausgeben
INC DE ; akt. Disassemblieradr. wieder -> DE
JR $DL12 ; ")" bearbeiten
; Buchstaben ausgeben
PRBU: PUSH AF ; A retten
PUSH BC ; Flags in C retten
PUSH DE ; akt. Disassemblieradr. retten
LD B,1 ; Anzahl = 1
LD DE,REGTAB ; DE zeigt auf die Register-Namen
BIT 5,A ; 2 Buchstaben ?
JR Z,$DL09
INC B ; ja, Anzahl erhoehen
$DL09: BIT 6,A ; Sprungbedingung ?
JR Z,$DL10
LD DE,SPRTAB ; ja, DE zeigt auf Condition-Namen
$DL10: RES 7,A ; Klammer-Bit loeschen
CP 34H ; "(HL)" ?
JR NZ,$DL11
BIT 5,C ; ja, Indexregister ?
JR Z,$DL11
LD A,0AH ; ja, A -> IX-Register
BIT 6,C ; IY-Register ?
JR Z,$DL11
LD A,0CH ; ja, A -> IY-Register
$DL11: AND 0FH ; loesche oberes Nibble
ADD A,E ; und addiere zur Basis in DE
LD E,A
$DL50: LD A,(DE) ; Zeichen -> A
LD (HL),A ; Zeichen ausgeben
INC DE ; Tabellen-Adresse erhoehen
INC HL ; naechste Printposition
DJNZ $DL50 ; naechstes Zeichen
POP DE ; Register wieder herstellen
POP BC
POP AF
PUSH AF ; A retten
CP 0B4H ; "(HL)" ?
JR NZ,$DL12
BIT 5,C ; nein, Indexregister ?
JR Z,$DL12
LD A,(DE) ; ja, Befehlsbyte nach DD/FD -> A
CP 0E9H ; "JP (IX/IY)" ?
JR Z,$DL12
LD (HL),'+' ; nein, "+" ausgeben
INC HL ; naechste Printposition
CALL PRVH ; Offset ausgeben
$DL12: POP AF ; A wieder herstellen
BIT 7,A ; "()" ?
RET Z ; nein, fertig
LD (HL),')' ; ja, ")" ausgeben
INC HL ; naechste Printposition
RET
; Error
ERRO: LD DE,CBMTAB+24 ; Pointer auf "????" -> DE
CALL TRBY ; als Mnemonic ausgeben
POP DE ; akt. Disassemblieradr. vom Stack holen
; Disassemblier-Adresse erhoehen und merken
INAD: INC DE
LD (DADR),DE
; Workspace ausgeben
PRWO: PUSH AF ; Register retten
PUSH BC
PUSH DE
PUSH HL
LD HL,WRKS ; Adresse Workspace -> HL
CALL PRTSTR ; Workspace aufs Terminal ausgeben
LD HL,NL ; Adresse Newline-String -> HL
CALL PRTSTR ; Newline ausgeben
POP HL ; Register wieder herstellen
POP DE
POP BC
POP AF
RET
; Workspace loeschen
CLWO: LD HL,WRKS ; Workspace mit Space fuellen
LD DE,WRKS+1 ; und mit Null terminieren
LD (HL),32
LD BC,32
LDIR
XOR A
LD (DE),A
RET
; 4 Bytes transferieren
TRBY: PUSH BC ; BC retten
LD BC,4 ; 4 Bytes
EX DE,HL ; DE=Printposition, HL=Mnemonic
LDIR ; Bytes transferieren
EX DE,HL ; HL ist wieder Printposition
POP BC ; BC wieder herstellen
INC HL ; Leerzeichen
RET
; Byte hinten ausgeben
PRBH: PUSH AF ; A retten
LD A,(DE) ; Byte -> A
CALL PRAK ; A ausgeben
POP AF ; A wieder herstellen
RET
; Byte vorne ausgeben
PRNB: PUSH AF ; A retten
INC DE ; DE auf naechstes Byte setzen
PUSH HL ; akt. Printposition retten
LD HL,(PRTMP) ; vordere Printposition -> HL
LD A,(DE) ; Byte -> A
CALL PRAK ; A ausgeben
INC HL ; Leerzeichen
LD (PRTMP),HL ; vordere Printposition retten
POP HL ; akt. Printposition wieder -> HL
POP AF ; A wieder herstellen
RET
; DE ausgeben
PRBY: LD A,D ; MSB -> A
CALL PRAK ; A ausgeben
LD A,E ; LSB -> A
; A ausgeben
PRAK: PUSH AF ; A retten
RRCA ; oberes Nibble ins untere schieben
RRCA
RRCA
RRCA
CALL PRCH ; oberes Nibble ausgeben
POP AF ; A wieder herstellen
CALL PRCH ; unteres Nibble ausgeben
RET
; unteres Nibble in ASCII-Hex umwandeln und in Workspace schreiben
PRCH: AND 0FH
ADD A,90H
DAA
ADC A,40H
DAA
LD (HL),A ; ASCII-Ziffer in Workspace schreiben
INC HL ; Printposition erhoehen
RET
; Die hier folgenden Tabellen muessen am Anfang einer Page
; beginnen, und die Reihenfolge der Tabellen darf auf keinen
; Fall geaendert werden, weil das LSB der Tabellenadressen
; durch arithmetische Operationen mit den Op-Codes berechnet
; wird !!!
CODTAB: ; LSB-Adressen der Mnemonics in MNETAB fuer
; Befehle 00..3F ohne Preafix ED/CB
DEFB 024H,050H,050H,054H,054H,058H,050H,030H ; NOP LD LD INC INC DEC LD RLCA
DEFB 070H,000H,050H,058H,054H,058H,050H,040H ; EX ADD LD DEC INC DEC LD RRCA
DEFB 028H,050H,050H,054H,054H,058H,050H,034H ; DJNZ LD LD INC INC DEC LD RLA
DEFB 020H,000H,050H,058H,054H,058H,050H,044H ; JR ADD LD DEC INC DEC LD RRA
DEFB 020H,050H,050H,054H,054H,058H,050H,038H ; JR LD LD INC INC DEC LD DAA
DEFB 020H,000H,050H,058H,054H,058H,050H,048H ; JR ADD LD DEC INC DEC LD CPL
DEFB 020H,050H,050H,054H,054H,058H,050H,03CH ; JR LD LD INC INC DEC LD SCF
DEFB 020H,000H,050H,058H,054H,058H,050H,04CH ; JR ADD LD DEC INC DEC LD CCF
; LSB-Adressen der Mnemonics in MNETAB fuer
; Befehle C0..FF ohne Preafix ED/CB
DEFB 060H,064H,068H,068H,078H,07CH,000H,080H ; RET POP JP JP CALL PUSH ADD RET
DEFB 060H,060H,068H,0F1H,078H,078H,004H,080H ; RET RET JP (CB) CALL CALL ADC RST
DEFB 060H,064H,068H,06CH,078H,07CH,008H,080H ; RET POP JP OUT CALL PUSH SUB RST
DEFB 060H,084H,068H,088H,078H,0F0H,00CH,080H ; RET EXX JP IN CALL (DD) SBC RST
DEFB 060H,064H,068H,070H,078H,07CH,010H,080H ; RET POP JP EX CALL PUSH AND RST
DEFB 060H,068H,068H,02CH,078H,0F2H,014H,080H ; RET JP JP EX CALL (ED) XOR RST
DEFB 060H,064H,068H,074H,078H,07CH,018H,080H ; RET POP JP DI CALL PUSH OR RST
DEFB 060H,050H,068H,090H,078H,0F8H,01CH,080H ; RET LD JP EI CALL (FD) CP RST
; LSB-Adressen der Mnemonics in MNETAB fuer
; Befehle 40..7F mit Preafix ED
DEFB 088H,06CH,00CH,050H,0ACH,0B0H,0F8H,050H ; IN OUT SBC LD NEG RETN IM LD
DEFB 088H,06CH,004H,050H,0FFH,0D8H,0FFH,050H ; IN OUT ADC LD RETI LD
DEFB 088H,06CH,00CH,050H,0FFH,0FFH,0F8H,050H ; IN OUT SBC LD IM LD
DEFB 088H,06CH,004H,050H,0FFH,0FFH,0F8H,050H ; IN OUT ADC LD IM LD
DEFB 088H,06CH,00CH,0FFH,0FFH,0FFH,0FFH,0B4H ; IN OUT SBC RRD
DEFB 088H,06CH,004H,0FFH,0FFH,0FFH,0FFH,0DCH ; IN OUT ADC RLD
DEFB 0FFH,0FFH,00CH,050H,0FFH,0FFH,0FFH,0FFH ; SBC LD
DEFB 088H,06CH,004H,050H,0FFH,0FFH,0FFH,0FFH ; IN OUT ADC LD
; LSB-Adressen der Mnemonics in MNETAB fuer
; Befehle A0..BF mit Praefix ED
DEFB 094H,0F0H,09CH,0A4H,0FFH,0FFH,0FFH,0FFH ; LDI CPI INI OUTI
DEFB 0B8H,0C0H,0C8H,0D4H,0FFH,0FFH,0FFH,0FFH ; L
DD CPD IND OUTD
DEFB 098H,0F4H,0A0H,0A8H,0FFH,0FFH,0FFH,0FFH ; LDIR CPIR INIR OTIR
DEFB 0BCH,0C4H,0CCH,0D0H,0FFH,0FFH,0FFH,0FFH ; LDDR CPDR INDR OTDR
OPETAB: ; Tabelle der Operanden:
; Bit 7: Zahl/Buchstabe
; Bit 6: einfach/doppelt
; Bit 5: Register/Sprungbedingung
; Bit 4: ohne/mit Klammer
; Bit 0..3: Offset in der Tabelle der Registernamen
; Befehle 00..3F ohne Preafix ED/CB
; 1. Operand
DEFB 0FFH,030H,0B0H,030H,010H,010H,010H,0FFH ; - BC (BC) BC B B B -
DEFB 038H,034H,017H,030H,011H,011H,011H,0FFH ; AF HL A BC C C C -
DEFB 041H,032H,0B2H,032H,012H,012H,012H,0FFH ; DIS DE (DE) DE D D D -
DEFB 041H,034H,017H,032H,013H,013H,013H,0FFH ; DIS HL A DE E E E -
DEFB 070H,034H,0C4H,034H,014H,014H,014H,0FFH ; NZ HL (NN) HL H H H -
DEFB 051H,034H,034H,034H,015H,015H,015H,0FFH ; Z HL HL HL L L L -
DEFB 072H,036H,0C4H,036H,016H,016H,016H,0FFH ; NC SP (NN) SP (HL) (HL) (HL) -
DEFB 011H,034H,017H,036H,017H,017H,017H,0FFH ; C HL A SP A A A -
; Befehle C0..FF ohne Preafix ED/CB
; 1. Operand
DEFB 070H,030H,070H,044H,070H,030H,017H,020H ; NZ BC NZ NN NZ BC A 00
DEFB 051H,0FFH,051H,0F1H,051H,044H,017H,021H ; Z - Z *CB Z NN A 08
DEFB 072H,032H,072H,0C2H,072H,032H,042H,022H ; NC DE NC (N) NC DE N 10
DEFB 053H,0FFH,053H,017H,053H,0F2H,017H,023H ; C - C A C *DD A 18
DEFB 074H,034H,074H,0B6H,074H,034H,042H,024H ; PO HL PO (SP) PO HL N 20
DEFB 076H,016H,076H,032H,076H,0F4H,042H,025H ; PE (HL) PE DE PE *ED N 28
DEFB 058H,038H,058H,0FFH,058H,038H,042H,026H ; P AF P - P AF N 30
DEFB 059H,036H,059H,0FFH,059H,0F8H,042H,027H ; M SP M - M *FD N 38
; Befehle 00..3F ohne Preafix ED/CB
; 2. Operand
DEFB 0FFH,044H,017H,0FFH,0FFH,0FFH,042H,0FFH ; - NN A - - - N -
DEFB 038H,030H,0B0H,0FFH,0FFH,0FFH,042H,0FFH ; AF BC (BC) - - - N -
DEFB 0FFH,044H,017H,0FFH,0FFH,0FFH,042H,0FFH ; - NN A - - - N -
DEFB 0FFH,032H,0B2H,0FFH,0FFH,0FFH,042H,0FFH ; - DE (DE) - - - N -
DEFB 041H,044H,034H,0FFH,0FFH,0FFH,042H,0FFH ; DIS NN HL - - - N -
DEFB 041H,034H,0C4H,0FFH,0FFH,0FFH,042H,0FFH ; DIS HL (NN) - - - N -
DEFB 041H,044H,017H,0FFH,0FFH,0FFH,042H,0FFH ; DIS NN A - - - N -
DEFB 041H,036H,0C4H,0FFH,0FFH,0FFH,042H,0FFH ; DIS SP (NN) - - - N -
; Befehle C0..FF ohne Praefix ED/CB
; 2. Operand
DEFB 0FFH,0FFH,044H,0FFH,044H,0FFH,042H,0FFH ; - - NN - NN - N -
DEFB 0FFH,0FFH,044H,0FFH,044H,0FFH,042H,0FFH ; - - NN *CB NN - N -
DEFB 0FFH,0FFH,044H,017H,044H,0FFH,0FFH,0FFH ; - - NN A NN - - -
DEFB 0FFH,0FFH,044H,0C2H,044H,0FFH,042H,0FFH ; - - NN (N) NN *DD N -
DEFB 0FFH,0FFH,044H,034H,044H,0FFH,0FFH,0FFH ; - - NN HL NN - - -
DEFB 0FFH,0FFH,044H,034H,044H,0FFH,0FFH,0FFH ; - - NN HL NN *ED - -
DEFB 0FFH,0FFH,044H,0FFH,044H,0FFH,0FFH,0FFH ; - - NN - NN - - -
DEFB 0FFH,034H,044H,0FFH,044H,0FFH,0FFH,0FFH ; - HL NN - NN *FD - -
OP2TAB: ; Befehle 40..7F mit Praefix ED
; 1. Operand
DEFB 010H,091H,034H,0C4H,0FFH,0FFH,000H,01EH ; B (C) HL (NN) - - 0 I
DEFB 011H,091H,034H,030H,0FFH,0FFH,0FFH,01FH ; C (C) HL BC - - - R
DEFB 012H,091H,034H,0C4H,0FFH,0FFH,001H,017H ; D (C) HL (NN) - - 1 A
DEFB 013H,091H,034H,032H,0FFH,0FFH,002H,017H ; E (C) HL DE - - 2 A
DEFB 014H,091H,034H,0C4H,0FFH,0FFH,076H,0FFH ; H (C) HL - - - - -
DEFB 015H,091H,034H,0FFH,0FFH,0FFH,0FFH,0FFH ; L (C) HL - - - - -
DEFB 0FFH,0FFH,034H,0C4H,0FFH,0FFH,0FFH,0FFH ; - - HL (NN) - - - -
DEFB 017H,091H,034H,036H,0FFH,0FFH,0FFH,0FFH ; A (C) HL SP - - - -
; Befehle 40..7F mit Preafix ED
; 2. Operand
DEFB 091H,010H,030H,030H,0FFH,0FFH,0FFH,017H ; (C) B BC BC - - - A
DEFB 091H,011H,030H,0C4H,0FFH,0FFH,0FFH,017H ; (C) C BC (NN) - - - A
DEFB 091H,012H,032H,032H,0FFH,0FFH,0FFH,01EH ; (C) D DE DE - - - I
DEFB 091H,013H,032H,0C4H,0FFH,0FFH,0FFH,01FH ; (C) E DE (NN) - - - R
DEFB 091H,014H,034H,034H,0FFH,0FFH,0FFH,0FFH ; (C) H HL - - - - -
DEFB 091H,015H,034H,0FFH,0FFH,0FFH,0FFH,0FFH ; (C) L HL - - - - -
DEFB 0FFH,0FFH,036H,036H,0FFH,0FFH,0FFH,0FFH ; - - SP SP - - - -
DEFB 091H,017H,036H,0C4H,0FFH,0FFH,0FFH,0FFH ; (C) A SP (NN) - - - -