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