TITLE 'Z80-Disassembler' ; 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 vorne und hinten ausgeben PRVH: CALL PRNB ; Byte vorne ausgeben ; 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 !!! DEFS 256 - ($ & 0FFH) MNETAB: ; Tabelle mit den Z80-Mnemonics DEFM 'ADD ADC ' DEFM 'SUB SBC ' DEFM 'AND XOR ' DEFM 'OR CP ' DEFM 'JR NOP ' DEFM 'DJNZEX ' DEFM 'RLCARLA ' DEFM 'DAA SCF ' DEFM 'RRCARRA ' DEFM 'CPL CCF ' DEFM 'LD INC ' DEFM 'DEC HALT' DEFM 'RET POP ' DEFM 'JP OUT ' DEFM 'EX DI ' DEFM 'CALLPUSH' DEFM 'RST EXX ' DEFM 'IN EX ' DEFM 'EI LDI ' DEFM 'LDIRINI ' DEFM 'INIROUTI' DEFM 'OTIRNEG ' DEFM 'RETNRRD ' DEFM 'LDD LDDR' DEFM 'CPD CPDR' DEFM 'IND INDR' DEFM 'OTDROUTD' DEFM 'RETIRLD ' DEFM 'BIT RES ' DEFM 'SET ????' DEFM 'CPI CPIR' DEFM 'IM ----' 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 ; LDD 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 SPRTAB: ; Tabelle der Sprungbedingungen DEFM 'NZNCPOPEPM' DEFB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH REGTAB: ; Tabelle der Register DEFM 'BCDEHLSPAFIXIYIR' 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) - - - - CBMTAB: ; Tabelle der Mnemonics mit Praefix CB DEFM 'RLC RRC ' DEFM 'RL RR ' DEFM 'SLA SRA ' DEFM '????SRL ' NL: ; Null-terminiertes Newline fuers Terminal DEFB 10,13,0 WRKS: DEFS 34 ; Workspace zur Aufbereitung einer Ausgabezeile PRTMP: DEFS 2 ; temoraerer Speicher fuer Printposition DADR: DEFS 2 ; Disassemblier-Adresse