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 18LPP EQU 15 ; Anzahl Zeilen/Bildschirm Ausgabe 19MNEPOS EQU 11H ; Offset des Mnemonics in Ausgabe-Workspace 20 21 ; Disassembliere einen Bildschirm voll 22DISSCR: 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 30DISLIN: 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 57CB: 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 105OHNE: 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 190ED: 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 231PRO1: 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 258PRO2: 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 272DIST: 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 296PR_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 303PRNN: 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 311PRBU: 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 361ERRO: 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 366INAD: INC DE 367 LD (DADR),DE 368 369 ; Workspace ausgeben 370PRWO: 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 385CLWO: 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 395TRBY: 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 405PRVH: CALL PRNB ; Byte vorne ausgeben 406 407 ; Byte hinten ausgeben 408PRBH: 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 415PRNB: 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 428PRBY: LD A,D ; MSB -> A 429 CALL PRAK ; A ausgeben 430 LD A,E ; LSB -> A 431 432 ; A ausgeben 433PRAK: 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 444PRCH: 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 461MNETAB: ; 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 495CODTAB: ; 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 539SPRTAB: ; Tabelle der Sprungbedingungen 540 541 DEFM 'NZNCPOPEPM' 542 DEFB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH 543 544REGTAB: ; Tabelle der Register 545 546 DEFM 'BCDEHLSPAFIXIYIR' 547 548OPETAB: ; 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 603OP2TAB: ; 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 627CBMTAB: ; Tabelle der Mnemonics mit Praefix CB 628 DEFM 'RLC RRC ' 629 DEFM 'RL RR ' 630 DEFM 'SLA SRA ' 631 DEFM '????SRL ' 632 633NL: ; Null-terminiertes Newline fuers Terminal 634 DEFB 10,13,0 635 636WRKS: DEFS 34 ; Workspace zur Aufbereitung einer Ausgabezeile 637PRTMP: DEFS 2 ; temoraerer Speicher fuer Printposition 638DADR: DEFS 2 ; Disassemblier-Adresse 639