sample: added disassembler by Udo Munk
[urasm.git] / samples / z80asmdis / z80dis.zas
blob111f811b80740c0d98acee6bf11d6729e777808b
1 ; hardware-unabhaengiger, ROM-faehiger Z80-disassembler
3 ; die adresse, ab der disassembliert serden soll, ist in der
4 ; 16-bit Speicherzelle DADR abzulegen. danach kann eines der
5 ; entrys DISSCR (ausgabe eines bildschirms) oder DISLIN
6 ; (ausgabe einer zeile) aufgerufen werden. da die Folgeadressen
7 ; durch das programm ebenfalls wieder in der Speicherzelle
8 ; DADR abgelegt werden, ist mehrfacher aufruf ohne laden
9 ; von neuen adressen moeglich.
10 ; zur ausgabe muss ein Unterprogramm mit dem Namen PRTSTR
11 ; erstellt werden, dem in hl die adresse eines Null-terminierten
12 ; Strings uebergeben wird.
14 ; 27-JUN-89 Udo munk
16 LPP    equ 15     ; anzahl zeilen/bildschirm ausgabe
17 MNEPOS equ 11h    ; Offset des mnemonics in ausgabe-Workspace
19 ; disassembliere einen bildschirm voll
20 DISSCR:
21   ld   b,LPP      ; einen bildschirm mit LPP zeilen
22 .DLP1:
23   push bc         ; disassemblieren
24   call DISLIN
25   pop  bc
26   djnz .DLP1
27   ret
29 ; disassembliere eine zeile
30 DISLIN:
31   call CLWO       ; Workspace fuer eine zeile ausgabe loeschen
32   ld   hl,WRKS    ; adresse der ausgabe-Workspace -> hl
33   ld   de,(DADR)  ; disassemblier-adresse -> de
34   call PRBY       ; adresse in de ausgeben
35   inc  hl         ; blank ausgeben
36   ld   (PRTMP),hl ; vordere printposition retten
37   ld   c,0        ; Steuerflag loeschen
38   dec  de         ; laufende adr.-1 -> de
39 .DL13:
40   call PRNB       ; laufendes byte ausgeben
41   ld   a,(de)     ; laufendes byte -> a
42   ld   b,a        ; und in b retten
43   cp   0EDH       ; preafix ED ?
44   jr   nz,.DL14
45   set  4,c        ; ja, ED-Flag setzen
46   jr  .DL13       ; und naechstes byte bearbeiten
47 .DL14:
48   cp   0FDH       ; preafix FD ?
49   jr   nz,.DL15
50   set  6,c        ; ja, FD-Flag setzen
51   jr   .DL16      ; und Index-Flag setzen
52 .DL15:
53   cp   0DDH       ; preafix DD ?
54   jr   nz,.DL17
55 .DL16:
56   set  5,c        ; Index-Flag fuer ix/iy-adressierung setzen
57   ld   hl,(PRTMP) ; vordere printposition -> hl
58   jr   .DL13      ; naechstes byte bearbeiten
59 .DL17:
60   ld   hl,WRKS+MNEPOS  ; hl auf Operator position setzen
61 ; nach praefix CB
62 ;.PFXCB:
63   ld   a,b        ; befehlsbyte aus b holen
64   cp   0CBH       ; preafix CB ?
65   jp   nz,OHNE
66   inc  de         ; ja, pointer auf naechstes byte setzen
67   bit  5,c        ; ix/iy-Flag ?
68   jr   z,.DL18
69   inc  de         ; ja, pointer auf naechstes byte setzen
70 .DL18:
71   ld   a,(de)     ; naechstes byte -> a
72   ld   b,a        ; und in b retten
73   push de         ; disassemblieradr. retten
74   ld   d,high(MNETAB)
75   ld   e,0E8H     ; de = pointer auf "set"
76   cp   0C0H       ; set ?
77   jr   nc,.DL19
78   ld   e,0E4H     ; nein, de = pointer auf "res"
79   cp   80h        ; res ?
80   jr   nc,.DL19
81   ld   e,0E0H     ; nein, de = pointer auf "bit"
82   cp   40h        ; bit ?
83   jr   nc,.DL19
84   and  38h        ; loesche bits 0..2 und 6..7
85   rrca            ; division durch 2
86   add  a,low(CBMTAB)
87   ld   e,a
88   ld   d,high(CBMTAB)  ; de = pointer auf CB-mnemonic
89 .DL19:
90   call TRBY       ; mnemonic ausgeben
91   pop  de         ; akt. disassemblieradr. wieder -> de
92   ld   a,b        ; byte wieder -> a
93   bit  5,c        ; ix/iy-Flag ?
94   jr   z,.DL20
95   dec  de         ; eins zurueck bei ix/iy-adressierung
96 .DL20:
97   dec  de         ; pointer wieder auf CB-preafix
98   cp   40h        ; CB-befehl < 40h ?
99   jr   c,.DL21
100   and  38h        ; nein, bits 0..2 und 6..7 loeschen
101   rrca            ; division durch 8 -> 1. Operanden
102   rrca
103   rrca
104   call PRO1       ; 1. Operanden ausgeben
105   ld   a,b        ; byte wieder -> a
106   set  7,c        ; Komma-Flag setzen
107 .DL21:
108   and  7          ; bits 3..7 loeschen -> 2. Operanden
109   set  4,a        ; buchstaben-Flag setzen
110   call PRO1       ; 2. Operanden ausgeben
111   call PRNB       ; befehlsbyte vorne ausgeben
112   jp   INAD       ; fertig, adresse merken und Workspace ausgeben
114 ; ohne preafix CB/ED
115 OHNE:
116   push de         ; disassemblieradr. retten
117   bit  4,c        ; ED-Flag ?
118   jp   nz,@PFXED
119   cp   40h        ; nein, < 40h ?
120   jr   c,.DL25
121   cp   80h        ; nein, > 80h ?
122   jr   nc,.DL23
123   ld   e,50h      ; nein, de = pointer auf "ld"
124   cp   76h        ; halt ?
125   jr   nz,.DL22
126   ld   e,5CH      ; nein, de = pointer auf "halt"
127 .DL22:
128   jr   .DL26      ; mnemonic ausgeben
129 .DL23:
130   cp   0C0H       ; > C0H ?
131   jr   nc,.DL24
132   and  38h        ; ja, bits 0..2 und 6..7 loeschen
133   rrca            ; division durch 2 -> Operator
134   ld   e,a        ; Operator -> e
135   jr   .DL26      ; mnemonic ausgeben
136 .DL24:
137   sub  80h        ; wenn > C0H, -80 -> Tabellenoperator
138 .DL25:
139   ld   e,a        ; Operator -> e
140   ld   d,high(CODTAB)
141   ld   a,(de)     ; LSB mnemonic-adresse -> a
142   ld   e,a        ; und nach e
143 .DL26:
144   ld   d,high(MNETAB)
145   call TRBY       ; mnemonic ausgeben
146   pop  de         ; akt. disassemblieradr. wieder -> de
147   ld   a,b        ; befehlsbyte wieder -> a
148   push de         ; disassemblieradr. retten
149   cp   40h        ; byte < 40 ?
150   jr   c,.DL30
151   cp   80h        ; nein, > 80 ?
152   jr   nc,.DL28
153   cp   76h        ; nein, halt ?
154   jr   nz,.DL27
155   ld   a,0FFH     ; ja, leeren Operanden -> a
156   jr   .DL31      ; Operanden ausgeben
157 .DL27:
158   and  38h        ; loesche bits 0..2 und 6..7
159   rrca            ; division durch 8 -> 1. Operanden
160   rrca
161   rrca
162   set  4,a        ; buchstabenflag setzen
163   jr   .DL31      ; Operanden ausgeben
164 .DL28:
165   cp   0C0H       ; > C0 ?
166   jr   nc,.DL29
167   cp   90h        ; > 90 ?
168   jr   c,.DL51
169   and  0F8H       ; ja, Register-bits loeschen
170   cp   98h        ; "sbc" ?
171   jr   z,.DL51
172   ld   a,b        ; byte wieder -> a
173   and  7          ; nur Register bits uebrig lassen
174   set  4,a        ; buchstaben-Flag setzen
175   jr   @DL52
176 .DL51:
177   ld   a,17h      ; ja, 17 = Register a ausgeben
178   jr   .DL31      ; Operanden ausgeben
179 .DL29:
180   sub  80h        ; wenn > C0, -80 -> Operandentabelle
181 .DL30:
182   ld   e,a        ; LSB Operandentabelle -> e
183   ld   d,high(OPETAB)
184   ld   a,(de)     ; 1. Operanden -> a
185 .DL31:
186   pop  de         ; akt. disassemblieradr. wieder -> de
187   call PRO1       ; 1. Operanden ausgeben
188   ld   a,b        ; befehlsbyte wieder -> a
189   push de         ; akt. disassemblieradr. retten
190   cp   40h        ; < 40 ?
191   jr   c,.DL34
192   cp   0C0H       ; nein, < C0 ?
193   jr   nc,.DL33
194   cp   76h        ; ja, halt ?
195   jr   nz,.DL32
196   ld   a,0FFH     ; ja, wieder leeren Operanden -> a
197   jr   .DL35      ; Operanden ausgeben
198 .DL32:
199   and  7          ; loesche bits 3..7, -> 2. Operanden
200   set  4,a        ; buchstabenflag setzen
201   jr   .DL35      ; Operanden ausgeben
202 .DL33:
203   sub  80h        ; wenn > C0 : 80 abziehen
204 .DL34:
205   add  a,80h      ; LSB Operandentabelle -> a
206   ld   e,a        ; und -> e
207   ld   d,high(OPETAB)
208   ld   a,(de)     ; 2. Operanden -> a
209 .DL35:
210   pop  de         ; akt. disassemblieradr. wieder -> de
211   set  7,c        ; Komma-Flag setzen
212   call PRO1       ; 2. Operanden ausgeben
213   jp   INAD       ; fertig, adresse merken und Workspace ausgeben
215 ; nach preafix ED
216 @PFXED:
217   sub  40h        ; 40 vom 2. byte subtrahieren
218   jp   c,ERRO     ; Fehler wenn carry
219   cp   60h        ; 2. byte < A0 ?
220   jr   nc,.DL36
221   cp   40h        ; ja, >= 60 ?
222   jp   nc,ERRO    ; ja, Fehler
223   jr   .DL37      ; nein, weiter
224 .DL36:
225   sub  20h        ; aus 60..7F wird 00..20
226 .DL37:
227   add  a,80h      ; LSB Operatortabelle -> a
228   ld   e,a        ; und -> e
229   ld   d,high(CODTAB)
230   ld   a,(de)     ; LSB mnemonic-adresse -> a
231   cp   0FFH       ; leer ?
232   jp   z,ERRO     ; ja, Fehler
233   ld   e,a        ; nein, -> e
234   ld   d,high(MNETAB)
235   call TRBY       ; mnemonic ausgeben
236   pop  de         ; disassemblieradr. wieder -> de
237   ld   a,b        ; befehlsbyte wieder -> a
238   cp   80h        ; < 80 ?
239   jp   nc,INAD    ; nein, Workspace ausgeben und fertig
240   push de         ; disassemblieradr. retten
241   sub  40h        ; LSB 1. Operanden in a
242   ld   e,a        ; und -> e
243   ld   d,high(OP2TAB)
244   ld   a,(de)     ; 1. Operanden -> a
245   pop  de         ; akt. disassemblieradr. wieder -> de
246   call PRO1       ; 1. Operanden ausgeben
247   ld   a,b        ; befehlsbyte wieder -> a
248   cp   80h        ; < 80 ?
249   jp   nc,INAD    ; ja, Workspace ausgeben und fertig
250   push de         ; akt. disassemblieradr. retten
251   ld   e,a        ; LSB Operandentabelle -> e
252   ld   d,high(OP2TAB)
253   ld   a,(de)     ; 2. Operanden -> a
254   set  7,c        ; buchstabenflag setzen
255 @DL52:
256   pop  de         ; akt. disassemblieradr. retten
257   call PRO1       ; 2. Operanden ausgeben
258   jp   INAD       ; fertig, adresse merken und Workspace ausgeben
260 ; Operand 1 ausgeben
261 PRO1:
262   cp   0FFH       ; leere Operand ?
263   ret  z          ; ja, fertig
264   cp   17h        ; nein, Register "a" ausgeben ?
265   jr   nz,.DL01
266   ld   a,18h      ; ja, umkodieren
267 .DL01:
268   cp   16h        ; Register "(hl)" ausgeben ?
269   jr   nz,.DL02
270   ld   a,0B4H     ; ja, umkodieren
271 .DL02:
272   bit  7,c        ; 2. Operand ?
273   jr   z,.DL03
274   ld   (hl),','   ; ja, "," ausgeben
275   inc  hl         ; naechste printposition -> hl
276 .DL03:
277   bit  7,a        ; "(...)" ?
278   jr   z,.DL04
279   ld   (hl),'('   ; ja, "(" ausgeben
280   inc  hl         ; naechste printposition -> hl
281 .DL04:
282   bit  4,a        ; buchstabe ?
283   jr   nz,PRBU    ; ja, buchstaben ausgeben
284   bit  6,a        ; nein, bitnummer/rst-adresse ?
285   jr   nz,DIST    ; ja, distanz ausgeben
286   bit  5,a        ; nein, bitnummer ?
287   jr   nz,PRO2    ; ja, rst ausgeben
288   and  7          ; nein, bits 3..7 loeschen
289   call PRCH       ; hexbyte ausgeben
290   ret
292 ; rst ausgeben
293 PRO2:
294   push af         ; a retten
295   and  6          ; loesche bits 0 und 4..7
296   rrca            ; division durch 2
297   call PRCH       ; oberes Nibble ausgeben
298   pop  af         ; a wieder herstellen
299   bit  0,a        ; rst x8 ?
300   ld   a,'0'      ; nein, "0" -> a
301   jr   z,.DL05
302   ld   a,'8'      ; ja, "8" -> a
303 .DL05:
304   ld   (hl),a     ; "0" oder "8" ausgeben
305   inc  hl         ; naechste printposition -> hl
306   ret
308 ; distanz ausgeben
309 DIST:
310   bit  0,a        ; relative distanz ?
311   jr   z,PR_N     ; nein, N ausgeben
312   call PRNB       ; byte vorne ausgeben
313   push de         ; akt. disassemblieradr. retten
314   ld   a,(de)     ; distanzbyte -> a
315   inc  de         ; disassemblieradr. erhoehen
316   rlca            ; bit 7 distanzbyte -> carry
317   rrca
318   jr   nc,.DL06   ; Vorwaertsprung
319   set  0,c        ; Flag fuer Rueckwaertssprung setzen
320 .DL06:
321   add  a,e        ; distanz zu PC addieren
322   ld   e,a
323   bit  0,c        ; Flag testen
324   jr   nc,.DL07   ; kein Ueberlauf
325   jr   nz,.DL08   ; Rueckwaertssprung
326   inc  d          ; MSB PC erhoehen
327   jr   .DL08      ; zieladresse ausgeben
328 .DL07:
329   jr   z,.DL08    ; bei Vorwaertssprung zieladresse ausgeben
330   dec  d          ; sonst MSB PC erniedrigen
331 .DL08:
332   call PRBY       ; zieladresse in de ausgeben
333   pop  de         ; akt. disassemblieradresse wieder -> de
334   ret
336 ; N ausgeben
337 PR_N:
338   push af         ; a retten
339   bit  1,a        ; N ?
340   jr   z,PRNN     ; nein, NN ausgeben
341   call PRVH       ; ja, byte vorne und hinten ausgeben
342   jr   @DL12      ; ")" bearbeiten
344 ; NN ausgeben
345 PRNN:
346   call PRNB       ; byte vorne ausgeben
347   call PRVH       ; byte vorne und hinten ausgeben
348   dec  de         ; de -> LSB von NN
349   call PRBH       ; byte hinten ausgeben
350   inc  de         ; akt. disassemblieradr. wieder -> de
351   jr   @DL12      ; ")" bearbeiten
353 ; buchstaben ausgeben
354 PRBU:
355   push af         ; a retten
356   push bc         ; Flags in c retten
357   push de         ; akt. disassemblieradr. retten
358   ld   b,1        ; anzahl = 1
359   ld   de,REGTAB  ; de zeigt auf die Register-Namen
360   bit  5,a        ; 2 buchstaben ?
361   jr   z,.DL09
362   inc  b          ; ja, anzahl erhoehen
363 .DL09:
364   bit  6,a        ; Sprungbedingung ?
365   jr   z,.DL10
366   ld   de,SPRTAB  ; ja, de zeigt auf condition-Namen
367 .DL10:
368   res  7,a        ; Klammer-bit loeschen
369   cp   34h        ; "(hl)" ?
370   jr   nz,.DL11
371   bit  5,c        ; ja, Indexregister ?
372   jr   z,.DL11
373   ld   a,0AH      ; ja, a -> ix-Register
374   bit  6,c        ; iy-Register ?
375   jr   z,.DL11
376   ld   a,0CH      ; ja, a -> iy-Register
377 .DL11:
378   and  0FH        ; loesche oberes Nibble
379   add  a,e        ; und addiere zur basis in de
380   ld   e,a
381 .DL50:
382   ld   a,(de)     ; zeichen -> a
383   ld   (hl),a     ; zeichen ausgeben
384   inc  de         ; Tabellen-adresse erhoehen
385   inc  hl         ; naechste printposition
386   djnz .DL50      ; naechstes zeichen
387   pop  de         ; Register wieder herstellen
388   pop  bc
389   pop  af
390   push af         ; a retten
391   cp   0B4H       ; "(hl)" ?
392   jr   nz,@DL12
393   bit  5,c        ; nein, Indexregister ?
394   jr   z,@DL12
395   ld   a,(de)     ; ja, befehlsbyte nach DD/FD -> a
396   cp   0E9H       ; "jp (ix/iy)" ?
397   jr   z,@DL12
398   ld   (hl),'+'   ; nein, "+" ausgeben
399   inc  hl         ; naechste printposition
400   call PRVH       ; Offset ausgeben
401 @DL12:
402   pop  af         ; a wieder herstellen
403   bit  7,a        ; "()" ?
404   ret  z          ; nein, fertig
405   ld   (hl),')'   ; ja, ")" ausgeben
406   inc  hl         ; naechste printposition
407   ret
409 ; error
410 ERRO:
411   ld   de,CBMTAB+24  ; pointer auf "????" -> de
412   call TRBY       ; als mnemonic ausgeben
413   pop  de         ; akt. disassemblieradr. vom Stack holen
415 ; disassemblier-adresse erhoehen und merken
416 INAD:
417   inc  de
418   ld   (DADR),de
420 ; Workspace ausgeben
421 PRWO:
422   push af,bc,de,hl
423   ld   hl,WRKS      ; adresse Workspace -> hl
424   call TrimString32 ; remove trailing spaces
425   call PRTSTR       ; Workspace aufs Terminal ausgeben
426   ld   a,13
427   rst  #10
428   pop  hl,de,bc,af
429   ret
431 ; remove trailing spaces
432 TrimString32:
433   push hl,bc
434   ld   bc,32
435   add  hl,bc
436   ld   b,c
437 .loop:
438   dec  hl
439   ld   a,(hl)
440   cp   32
441   jr   nz,.setzero
442   djnz .loop
443 .quit:
444   pop  bc,hl
445   ret
446 .setzero:
447   inc  hl
448   ld   (hl),0
449   jr   .quit
451 ; Workspace loeschen
452 CLWO:
453   ld   hl,WRKS    ; Workspace mit Space fuellen
454   ld   de,WRKS+1  ; und mit Null terminieren
455   ld   bc,32
456   ld   (hl),c
457   ldir
458   xor  a
459   ld   (de),a
460   ret
462 ; 4 bytes transferieren
463 TRBY:
464   push bc         ; bc retten
465   ld   bc,4       ; 4 bytes
466   ex   de,hl      ; de=printposition, hl=mnemonic
467   ldir            ; bytes transferieren
468   ex   de,hl      ; hl ist wieder printposition
469   pop  bc         ; bc wieder herstellen
470   inc  hl         ; leerzeichen
471   ret
473 ; byte vorne und hinten ausgeben
474 PRVH:
475   call PRNB       ; byte vorne ausgeben
477 ; byte hinten ausgeben
478 PRBH:
479   push af         ; a retten
480   ld   a,(de)     ; byte -> a
481   call PRAK       ; a ausgeben
482   pop  af         ; a wieder herstellen
483   ret
485 ; byte vorne ausgeben
486 PRNB:
487   push af         ; a retten
488   inc  de         ; de auf naechstes byte setzen
489   push hl         ; akt. printposition retten
490   ld   hl,(PRTMP) ; vordere printposition -> hl
491   ld   a,(de)     ; byte -> a
492   call PRAK       ; a ausgeben
493   inc  hl         ; leerzeichen
494   ld   (PRTMP),hl ; vordere printposition retten
495   pop  hl         ; akt. printposition wieder -> hl
496   pop  af         ; a wieder herstellen
497   ret
499 ; de ausgeben
500 PRBY:
501   ld   a,d        ; MSB -> a
502   call PRAK       ; a ausgeben
503   ld   a,e        ; LSB -> a
505 ; a ausgeben
506 PRAK:
507   push af         ; a retten
508   rrca            ; oberes Nibble ins untere schieben
509   rrca
510   rrca
511   rrca
512   call PRCH       ; oberes Nibble ausgeben
513   pop  af         ; a wieder herstellen
514   call PRCH       ; unteres Nibble ausgeben
515   ret
517 ; unteres Nibble in ASCII-hex umwandeln und in Workspace schreiben
518 PRCH:
519   and  0FH
520   add  a,90h
521   daa
522   adc  a,40h
523   daa
524   ld   (hl),a     ; ASCII-ziffer in Workspace schreiben
525   inc  hl         ; printposition erhoehen
526   ret
528   ; die hier folgenden Tabellen muessen am anfang einer page
529   ; beginnen, und die Reihenfolge der Tabellen darf auf keinen
530   ; Fall geaendert werden, weil das LSB der Tabellenadressen
531   ; durch arithmetische Operationen mit den Op-codes berechnet
532   ; wird !!!
534   defs  256-low($),0
536 ; Tabelle mit den Z80-mnemonics
537 MNETAB:
538   defm  'ADD ADC '
539   defm  'SUB SBC '
540   defm  'AND XOR '
541   defm  'OR  CP  '
542   defm  'JR  NOP '
543   defm  'DJNZEX  '
544   defm  'RLCARLA '
545   defm  'DAA SCF '
546   defm  'RRCARRA '
547   defm  'CPL CCF '
548   defm  'LD  INC '
549   defm  'DEC HALT'
550   defm  'RET POP '
551   defm  'JP  OUT '
552   defm  'EX  DI  '
553   defm  'CALLPUSH'
554   defm  'RST EXX '
555   defm  'IN  EX  '
556   defm  'EI  LDI '
557   defm  'LDIRINI '
558   defm  'INIROUTI'
559   defm  'OTIRNEG '
560   defm  'RETNRRD '
561   defm  'LDD LDDR'
562   defm  'CPD CPDR'
563   defm  'IND INDR'
564   defm  'OTDROUTD'
565   defm  'RETIRLD '
566   defm  'BIT RES '
567   defm  'SET ????'
568   defm  'CPI CPIR'
569   defm  'IM  ----'
571 CODTAB:
572   ; LSB-adressen der mnemonics in MNETAB fuer
573   ; befehle 00..3F ohne preafix ED/CB
574   defb  024h,050h,050h,054h,054h,058h,050h,030h ; nop  ld   ld   inc  inc  dec  ld   rlca
575   defb  070h,000h,050h,058h,054h,058h,050h,040h ; ex   add  ld   dec  inc  dec  ld   rrca
576   defb  028h,050h,050h,054h,054h,058h,050h,034h ; djnz ld   ld   inc  inc  dec  ld   rla
577   defb  020h,000h,050h,058h,054h,058h,050h,044h ; jr   add  ld   dec  inc  dec  ld   rra
578   defb  020h,050h,050h,054h,054h,058h,050h,038h ; jr   ld   ld   inc  inc  dec  ld   daa
579   defb  020h,000h,050h,058h,054h,058h,050h,048h ; jr   add  ld   dec  inc  dec  ld   cpl
580   defb  020h,050h,050h,054h,054h,058h,050h,03CH ; jr   ld   ld   inc  inc  dec  ld   scf
581   defb  020h,000h,050h,058h,054h,058h,050h,04CH ; jr   add  ld   dec  inc  dec  ld   ccf
583   ; LSB-adressen der mnemonics in MNETAB fuer
584   ; befehle C0..FF ohne preafix ED/CB
585   defb  060h,064h,068h,068h,078h,07CH,000h,080h ; ret  pop  jp   jp   call push add  ret
586   defb  060h,060h,068h,0F1H,078h,078h,004h,080h ; ret  ret  jp   (CB) call call adc  rst
587   defb  060h,064h,068h,06CH,078h,07CH,008h,080h ; ret  pop  jp   out  call push sub  rst
588   defb  060h,084h,068h,088h,078h,0F0H,00CH,080h ; ret  exx  jp   in   call (DD) sbc  rst
589   defb  060h,064h,068h,070h,078h,07CH,010h,080h ; ret  pop  jp   ex   call push and  rst
590   defb  060h,068h,068h,02CH,078h,0F2H,014h,080h ; ret  jp   jp   ex   call (ED) xor  rst
591   defb  060h,064h,068h,074h,078h,07CH,018h,080h ; ret  pop  jp   di   call push or   rst
592   defb  060h,050h,068h,090h,078h,0F8H,01CH,080h ; ret  ld   jp   ei   call (FD) cp   rst
594   ; LSB-adressen der mnemonics in MNETAB fuer
595   ; befehle 40..7F mit preafix ED
596   defb  088h,06CH,00CH,050h,0ACH,0B0H,0F8H,050h ; in   out  sbc  ld   neg  retn im   ld
597   defb  088h,06CH,004h,050h,0FFH,0D8H,0FFH,050h ; in   out  adc  ld        reti      ld
598   defb  088h,06CH,00CH,050h,0FFH,0FFH,0F8H,050h ; in   out  sbc  ld             im   ld
599   defb  088h,06CH,004h,050h,0FFH,0FFH,0F8H,050h ; in   out  adc  ld             im   ld
600   defb  088h,06CH,00CH,0FFH,0FFH,0FFH,0FFH,0B4H ; in   out  sbc                      rrd
601   defb  088h,06CH,004h,0FFH,0FFH,0FFH,0FFH,0DCH ; in   out  adc                      rld
602   defb  0FFH,0FFH,00CH,050h,0FFH,0FFH,0FFH,0FFH ;           sbc  ld
603   defb  088h,06CH,004h,050h,0FFH,0FFH,0FFH,0FFH ; in   out  adc  ld
605   ; LSB-adressen der mnemonics in MNETAB fuer
606   ; befehle A0..BF mit praefix ED
607   defb  094h,0F0H,09CH,0A4H,0FFH,0FFH,0FFH,0FFH ; ldi  cpi  ini  outi
608   defb  0B8H,0C0H,0C8H,0D4H,0FFH,0FFH,0FFH,0FFH ; ldd  cpd  ind  outd
609   defb  098h,0F4H,0A0H,0A8H,0FFH,0FFH,0FFH,0FFH ; ldir cpir inir otir
610   defb  0BCH,0C4H,0CCH,0D0H,0FFH,0FFH,0FFH,0FFH ; lddr cpdr indr otdr
612 ; Tabelle der Sprungbedingungen
613 SPRTAB:
614   defm  'NZNCPOPEPM'
615   defb  0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
617 ; Tabelle der Register
618 REGTAB:
619   defm  'BCDEHLSPAFIXIYIR'
621 ; Tabelle der Operanden:
622 ; bit 7: zahl/buchstabe
623 ; bit 6: einfach/doppelt
624 ; bit 5: Register/Sprungbedingung
625 ; bit 4: ohne/mit Klammer
626 ; bit 0..3: Offset in der Tabelle der Registernamen
627 OPETAB:
628   ; befehle 00..3F ohne preafix ED/CB
629   ; 1. Operand
631   defb  0FFH,030h,0B0H,030h,010h,010h,010h,0FFH ; -    bc   (bc) bc   b    b    b    -
632   defb  038h,034h,017h,030h,011h,011h,011h,0FFH ; af   hl   a    bc   c    c    c    -
633   defb  041h,032h,0B2H,032h,012h,012h,012h,0FFH ; DIS  de   (de) de   d    d    d    -
634   defb  041h,034h,017h,032h,013h,013h,013h,0FFH ; DIS  hl   a    de   e    e    e    -
635   defb  070h,034h,0C4H,034h,014h,014h,014h,0FFH ; nz   hl   (NN) hl   h    h    h    -
636   defb  051h,034h,034h,034h,015h,015h,015h,0FFH ; z    hl   hl   hl   l    l    l    -
637   defb  072h,036h,0C4H,036h,016h,016h,016h,0FFH ; nc   sp   (NN) sp   (hl) (hl) (hl) -
638   defb  011h,034h,017h,036h,017h,017h,017h,0FFH ; c    hl   a    sp   a    a    a    -
640   ; befehle C0..FF ohne preafix ED/CB
641   ; 1. Operand
642   defb  070h,030h,070h,044h,070h,030h,017h,020h ; nz   bc   nz   NN   nz   bc   a    00
643   defb  051h,0FFH,051h,0F1H,051h,044h,017h,021h ; z    -    z    *CB  z    NN   a    08
644   defb  072h,032h,072h,0C2H,072h,032h,042h,022h ; nc   de   nc   (N)  nc   de   N    10
645   defb  053h,0FFH,053h,017h,053h,0F2H,017h,023h ; c    -    c    a    c    *DD  a    18
646   defb  074h,034h,074h,0B6H,074h,034h,042h,024h ; po   hl   po   (sp) po   hl   N    20
647   defb  076h,016h,076h,032h,076h,0F4H,042h,025h ; pe   (hl) pe   de   pe   *ED  N    28
648   defb  058h,038h,058h,0FFH,058h,038h,042h,026h ; p    af   p    -    p    af   N    30
649   defb  059h,036h,059h,0FFH,059h,0F8H,042h,027h ; m    sp   m    -    m    *FD  N    38
651   ; befehle 00..3F ohne preafix ED/CB
652   ; 2. Operand
653   defb  0FFH,044h,017h,0FFH,0FFH,0FFH,042h,0FFH ; -    NN   a    -    -    -    N    -
654   defb  038h,030h,0B0H,0FFH,0FFH,0FFH,042h,0FFH ; af   bc   (bc) -    -    -    N    -
655   defb  0FFH,044h,017h,0FFH,0FFH,0FFH,042h,0FFH ; -    NN   a    -    -    -    N    -
656   defb  0FFH,032h,0B2H,0FFH,0FFH,0FFH,042h,0FFH ; -    de   (de) -    -    -    N    -
657   defb  041h,044h,034h,0FFH,0FFH,0FFH,042h,0FFH ; DIS  NN   hl   -    -    -    N    -
658   defb  041h,034h,0C4H,0FFH,0FFH,0FFH,042h,0FFH ; DIS  hl   (NN) -    -    -    N    -
659   defb  041h,044h,017h,0FFH,0FFH,0FFH,042h,0FFH ; DIS  NN   a    -    -    -    N    -
660   defb  041h,036h,0C4H,0FFH,0FFH,0FFH,042h,0FFH ; DIS  sp   (NN) -    -    -    N    -
662   ; befehle C0..FF ohne praefix ED/CB
663   ; 2. Operand
664   defb  0FFH,0FFH,044h,0FFH,044h,0FFH,042h,0FFH ; -    -    NN   -    NN   -    N    -
665   defb  0FFH,0FFH,044h,0FFH,044h,0FFH,042h,0FFH ; -    -    NN   *CB  NN   -    N    -
666   defb  0FFH,0FFH,044h,017h,044h,0FFH,0FFH,0FFH ; -    -    NN   a    NN   -    -    -
667   defb  0FFH,0FFH,044h,0C2H,044h,0FFH,042h,0FFH ; -    -    NN   (N)  NN   *DD  N    -
668   defb  0FFH,0FFH,044h,034h,044h,0FFH,0FFH,0FFH ; -    -    NN   hl   NN   -    -    -
669   defb  0FFH,0FFH,044h,034h,044h,0FFH,0FFH,0FFH ; -    -    NN   hl   NN   *ED  -    -
670   defb  0FFH,0FFH,044h,0FFH,044h,0FFH,0FFH,0FFH ; -    -    NN   -    NN   -    -    -
671   defb  0FFH,034h,044h,0FFH,044h,0FFH,0FFH,0FFH ; -    hl   NN   -    NN   *FD  -    -
673 OP2TAB:
674   ; befehle 40..7F mit praefix ED
675   ; 1. Operand
676   defb  010h,091h,034h,0C4H,0FFH,0FFH,000h,01EH ; b    (c)  hl   (NN) -    -    0    I
677   defb  011h,091h,034h,030h,0FFH,0FFH,0FFH,01FH ; c    (c)  hl   bc   -    -    -    R
678   defb  012h,091h,034h,0C4H,0FFH,0FFH,001h,017h ; d    (c)  hl   (NN) -    -    1    a
679   defb  013h,091h,034h,032h,0FFH,0FFH,002h,017h ; e    (c)  hl   de   -    -    2    a
680   defb  014h,091h,034h,0C4H,0FFH,0FFH,076h,0FFH ; h    (c)  hl   -    -    -    -    -
681   defb  015h,091h,034h,0FFH,0FFH,0FFH,0FFH,0FFH ; l    (c)  hl   -    -    -    -    -
682   defb  0FFH,0FFH,034h,0C4H,0FFH,0FFH,0FFH,0FFH ; -    -    hl   (NN) -    -    -    -
683   defb  017h,091h,034h,036h,0FFH,0FFH,0FFH,0FFH ; a    (c)  hl   sp   -    -    -    -
685   ; befehle 40..7F mit preafix ED
686   ; 2. Operand
687   defb  091h,010h,030h,030h,0FFH,0FFH,0FFH,017h ; (c)  b    bc   bc   -    -    -    a
688   defb  091h,011h,030h,0C4H,0FFH,0FFH,0FFH,017h ; (c)  c    bc   (NN) -    -    -    a
689   defb  091h,012h,032h,032h,0FFH,0FFH,0FFH,01EH ; (c)  d    de   de   -    -    -    I
690   defb  091h,013h,032h,0C4H,0FFH,0FFH,0FFH,01FH ; (c)  e    de   (NN) -    -    -    R
691   defb  091h,014h,034h,034h,0FFH,0FFH,0FFH,0FFH ; (c)  h    hl   -    -    -    -    -
692   defb  091h,015h,034h,0FFH,0FFH,0FFH,0FFH,0FFH ; (c)  l    hl   -    -    -    -    -
693   defb  0FFH,0FFH,036h,036h,0FFH,0FFH,0FFH,0FFH ; -    -    sp   sp   -    -    -    -
694   defb  091h,017h,036h,0C4H,0FFH,0FFH,0FFH,0FFH ; (c)  a    sp   (NN) -    -    -    -
696 ; Tabelle der mnemonics mit praefix CB
697 CBMTAB:
698   defm  'RLC RRC '
699   defm  'RL  RR  '
700   defm  'SLA SRA '
701   defm  'SLI SRL '
703 WRKS:  defs  34,0  ; Workspace zur aufbereitung einer ausgabezeile
704 PRTMP: defs  2,0   ; temoraerer Speicher fuer printposition
705 DADR:  defs  2,0   ; disassemblier-adresse