1
2
3	SECTION	code_clib
4	PUBLIC	disz80
5	PUBLIC	_disz80
6	EXTERN	fputc_cons
7
8
9;  This code is been found in a ZX Spectrum tool called UTILITY3 v1.3
10
11
12.disz80
13._disz80
14	pop	hl
15	pop	bc
16	pop	de
17	push	de
18	push	bc
19	push	hl
20	push	ix	;save callers ix
21
22	ld	a,d	;Supplying -1 as the address means we disassemble the following opcode
23	and	e
24	inc	a
25	jr	nz,dizloop
26	ld	hl,2
27	add	hl,sp
28	ld	e,(hl)
29	inc	hl
30	ld	d,(hl)
31
32.dizloop
33	push	bc
34	call	DISASM
35	pop	bc
36	ld	a,13
37	call	CHROP
38	dec	bc
39	ld	a,b
40	or	c
41	jr	nz,dizloop
42	ld	h,d	;Address of next instruction
43	ld	l,e
44	pop	ix	;restore callers ix
45	ret
46
47; ====================
48; DIS-Z80 was published in the SUBSET column of Personal Computer World 1987.
49; The routine disassembles a single Z80 instruction at address DE.
50; It is required to be followed by a routine called CHROP that outputs a
51; single ASCII character.
52; It was originally developed for CP/M on an Amstrad CPC128.
53
54; The original ORG was $0100. I have added $5000 to all addresses.
55; The stated aim was to write a Z80 disassembly routine in as short a space
56; as possible and, at just over 1K (1090 bytes), it is a rather incredible
57; program.
58
59; The SUBSET editor David Barrow was able to trim only one byte from John
60; Kerr's compact code. I've forgotten where so there's a challenge.
61; ====================
62
63.DISASM	CALL 	ADRSP
64       	LD 	BC,$0900
65       	LD 	HL,$2020
66
67.BUFFER	PUSH 	HL
68       	DJNZ 	BUFFER
69       	LD 	H,B
70       	LD 	L,C
71       	ADD 	HL,SP
72
73       	PUSH 	BC
74       	EX 	(SP),IX
75       	PUSH 	BC
76       	PUSH 	BC
77       	ADD 	IX,SP
78
79       	PUSH 	HL
80       	LD 	HL,GROUP3
81
82.TRYNDX	CALL 	FETCH
83
84       	LD 	B,C
85       	CP 	$ED
86       	JR 	Z,CONFLG
87
88       	INC 	B
89       	CP 	$DD
90       	JR 	Z,CONFLG
91
92       	INC 	B
93       	CP 	$FD
94       	JR 	NZ,NOTNDX
95
96.CONFLG	LD 	(IX+1),B
97       	INC 	B
98       	DJNZ 	TRYNDX
99
100       	JR 	NXBYTE
101
102.NOTNDX	LD 	C,A
103       	LD 	A,(IX+1)
104       	OR 	A
105       	JR 	Z,NODISP
106
107       	LD 	A,C
108       	CP 	$CB
109       	JR 	Z,GETDIS
110
111       	AND 	$44
112       	CP 	4
113       	JR 	Z,GETDIS
114
115       	LD 	A,C
116       	AND 	$C0
117       	CP 	$40
118       	JR 	NZ,NODISP
119
120.GETDIS	CALL 	FETCH
121       	LD 	(IX+2),A
122
123.NODISP	LD 	HL,GROUP1
124       	LD 	A,C
125       	CP 	$CB
126       	JR 	NZ,NEWMSK
127
128       	LD 	HL,GROUP2
129
130.NXBYTE	CALL 	FETCH
131       	LD 	C,A
132
133.NEWMSK	LD 	A,(HL)
134       	OR 	A
135       	JR 	Z,TABEND
136
137       	AND 	C
138       	INC 	HL
139
140.NEWMOD	LD 	B,(HL)
141       	INC 	HL
142       	INC 	B
143       	JR 	Z,NEWMSK
144
145.TRYMAT	CP 	(HL)
146       	INC 	HL
147       	JR 	Z,GETNDX
148
149       	BIT 	7,(HL)
150       	INC 	HL
151       	JR 	Z,TRYMAT
152
153       	JR 	NEWMOD
154
155.GETNDX	LD 	A,(HL)
156       	AND 	$7F
157       	DEC 	B
158
159.TABEND	POP 	HL
160       	PUSH 	DE
161       	PUSH 	HL
162
163       	EX 	DE,HL
164       	LD 	HL,MONICS
165       	CALL 	XTRACT
166
167       	POP 	HL
168       	LD 	DE,5
169       	ADD 	HL,DE
170       	POP 	DE
171
172       	LD 	A,B
173       	AND 	$F0
174       	JR 	Z,SECOND
175
176       	RRA
177       	RRA
178       	RRA
179       	RRA
180       	PUSH 	BC
181
182       	LD 	B,A
183       	LD 	A,C
184       	CALL 	OPRND1
185
186       	POP 	BC
187       	LD 	A,B
188       	AND 	$0F
189       	JR 	Z,OPDONE
190
191       	LD 	(HL),44  		;,
192       	INC 	HL
193
194.SECOND	LD 	A,B
195       	AND 	$0F
196
197       	LD 	B,A
198       	LD 	A,C
199       	CALL 	NZ,OPRND2
200
201.OPDONE	LD 	A,3
202       	SUB 	(IX+0)
203
204       	POP 	HL
205       	POP 	HL
206       	POP 	IX
207
208       	JR 	C,OUTEXT
209
210       	INC 	A
211       	LD 	B,A
212       	ADD 	A,B
213       	ADD 	A,B
214       	LD 	B,A
215
216.SPACES	LD 	A,$20
217       	CALL 	CHROP
218       	DJNZ 	SPACES
219
220.OUTEXT	LD 	B,18
221
222.PUTOUT	DEC 	SP
223       	POP 	HL
224       	LD 	A,H
225       	CALL 	CHROP
226       	DJNZ 	PUTOUT
227
228       	RET
229
230;***********************
231
232.GROUP2	defb 	$C0,$36,$40
233	defb 	$04,$80,$2D,$C0,$BE
234	defb 	$FF,$F8,$06,$00,$33
235	defb 	$08,$38,$10,$35,$18
236	defb 	$3A,$20,$3F,$28,$40
237	defb 	$30,$00,$38,$C1
238
239
240.GROUP1	defb 	$FF,$00,$00
241	defb 	$24,$07,$32,$0F,$37
242	defb 	$17,$31,$1F,$36,$27
243	defb 	$0D,$2F,$0B,$37,$3D
244	defb 	$3F,$06,$76,$14,$C9
245	defb 	$30,$D9,$12,$F3,$0F
246	defb 	$FB,$91,$72,$C6,$02
247	defb 	$CE,$01,$DE,$BC,$02
248	defb 	$D6,$42,$E6,$03,$EE
249	defb 	$43,$F6,$25,$FE,$8C
250	defb 	$04,$08,$93,$01,$10
251	defb 	$10,$18,$9D,$AF,$22
252	defb 	$A2,$FA,$2A,$A2,$A7
253	defb 	$32,$A2,$7A,$3A,$A2
254	defb 	$03,$C3,$1C,$CD,$85
255	defb 	$97,$D3,$AA,$79,$DB
256	defb 	$9B,$5F,$E3,$93,$0E
257	defb 	$E9,$9C,$05,$EB,$93
258	defb 	$DF,$F9,$A2,$FF,$C0
259	defb 	$B6,$40,$A2,$FF,$F8
260	defb 	$76,$80,$02,$88,$01
261	defb 	$98,$BC,$06,$90,$42
262	defb 	$A0,$03,$A8,$43,$B0
263	defb 	$25,$B8,$8C,$FF,$C7
264	defb 	$0B,$04,$16,$05,$8E
265	defb 	$B2,$06,$A2,$20,$C0
266	defb 	$B0,$23,$C2,$1C,$C4
267	defb 	$85,$10,$C7,$BB,$FF
268	defb 	$CF,$D3,$01,$A2,$0D
269	defb 	$03,$16,$0B,$8E,$FD
270	defb 	$09,$82,$60,$C1,$2B
271	defb 	$C5,$AC,$FF,$E7,$21
272	defb 	$20,$9D,$FF,$EF,$E7
273	defb 	$02,$A2,$7E,$0A,$A2
274
275
276.GROUP3	defb 	$FF,$00,$44
277	defb 	$23,$45,$2F,$4D,$2E
278	defb 	$4E,$00,$67,$39,$6F
279	defb 	$34,$70,$00,$71,$00
280	defb 	$A0,$21,$A1,$0A,$A2
281	defb 	$1A,$A3,$29,$A8,$1F
282	defb 	$A9,$08,$AA,$18,$AB
283	defb 	$28,$B0,$20,$B1,$09
284	defb 	$B2,$19,$B3,$27,$B8
285	defb 	$1E,$B9,$07,$BA,$17
286	defb 	$BB,$A6,$FF,$C7,$B8
287	defb 	$40,$9B,$8B,$41,$AA
288	defb 	$FF,$CF,$FD,$42,$3C
289	defb 	$4A,$81,$AD,$43,$A2
290	defb 	$DA,$4B,$A2,$FF,$E7
291	defb 	$40,$46,$95,$FF,$F7
292	defb 	$C7,$47,$A2,$7C,$57
293	defb 	$A2,$FF,$00
294
295;_______________
296
297.MONICS	defb 	$BF
298	defb 	'A','D','C'+$80   	; ADC
299	defb 	'A','D','D'+$80   	; ADD
300	defb 	'A','N','D'+$80   	; AND
301	defb 	'B','I','T'+$80   	; BIT
302	defb 	'C','A','L','L'+$80	; CALL
303	defb 	'C','C','F'+$80   	; CCF
304	defb 	'C','P','D','R'+$80	; CPDR
305	defb 	'C','P','D'+$80   	; CPD
306	defb 	'C','P','I','R'+$80	; CPIR
307	defb 	'C','P','I'+$80   	; CPI
308	defb 	'C','P','L'+$80   	; CPL
309	defb 	'C','P'+$80      	; CP
310	defb 	'D','A','A'+$80   	; DAA
311	defb 	'D','E','C'+$80   	; DEC
312	defb 	'D','I'+$80      	; DI
313	defb 	'D','J','N','Z'+$80	; DJNZ
314	defb 	'E','I'+$80      	; EI
315	defb 	'E','X','X'+$80   	; EXX
316	defb 	'E','X'+$80      	; EX
317	defb 	'H','A','L','T'+$80	; HALT
318	defb 	'I','M'+$80      	; IM
319	defb 	'I','N','C'+$80   	; INC
320	defb 	'I','N','D','R'+$80	; INDR
321	defb 	'I','N','D'+$80   	; IND
322	defb 	'I','N','I','R'+$80	; INIR
323	defb 	'I','N','I'+$80   	; INI
324	defb 	'I','N'+$80      	; IN
325	defb 	'J','P'+$80      	; JP
326	defb 	'J','R'+$80      	; JR
327	defb 	'L','D','D','R'+$80	; LDDR
328	defb 	'L','D','D'+$80   	; LDD
329	defb 	'L','D','I','R'+$80	; LDIR
330	defb 	'L','D','I'+$80   	; LDI
331	defb 	'L','D'+$80      	; LD
332	defb 	'N','E','G'+$80   	; NEG
333	defb 	'N','O','P'+$80   	; NOP
334	defb 	'O','R'+$80      	; OR
335	defb 	'O','T','D','R'+$80	; OTDR
336	defb 	'O','T','I','R'+$80	; OTIR
337	defb 	'O','U','T','D'+$80	; OUTD
338	defb 	'O','U','T','I'+$80	; OUTI
339	defb 	'O','U','T'+$80   	; OUT
340	defb 	'P','O','P'+$80   	; POP
341	defb 	'P','U','S','H'+$80	; PUSH
342	defb 	'R','E','S'+$80   	; RES
343	defb 	'R','E','T','I'+$80	; RETI
344	defb 	'R','E','T','N'+$80	; RETN
345	defb 	'R','E','T'+$80   	; RET
346	defb 	'R','L','A'+$80   	; RLA
347	defb 	'R','L','C','A'+$80	; RLCA
348	defb 	'R','L','C'+$80   	; RLC
349	defb 	'R','L','D'+$80   	; RLD
350	defb 	'R','L'+$80      	; RL
351	defb 	'R','R','A'+$80   	; RRA
352	defb 	'R','R','C','A'+$80	; RA
353	defb 	'R','R','C'+$80   	; RRC
354	defb 	'R','R','D'+$80   	; RRD
355	defb 	'R','R'+$80      	; RR
356	defb 	'R','S','T'+$80   	; RST
357	defb 	'S','B','C'+$80   	; SBC
358	defb 	'S','C','F'+$80   	; SCF
359	defb 	'S','E','T'+$80   	; SET
360	defb 	'S','L','A'+$80   	; SLA
361	defb 	'S','R','A'+$80   	; SRA
362	defb 	'S','R','L'+$80   	; SRL
363	defb 	'S','U','B'+$80   	; SUB
364	defb 	'X','O','R'+$80   	; XOR
365
366
367
368;*****************
369
370.OPRND1	DJNZ 	CONDIT
371
372.RSTADR	AND 	$38
373       	JR 	DA
374
375.OPRND2	DJNZ 	DAT8
376
377.RELADR	CALL 	FETCH
378       	LD 	C,A
379       	RLA
380       	SBC 	A,A
381       	LD 	B,A
382       	EX 	DE,HL
383       	PUSH 	HL
384       	ADD 	HL,BC
385       	JR 	DHL
386
387.CONDIT	RRA
388       	RRA
389       	RRA
390       	DJNZ 	BITNUM
391
392       	BIT 	4,A
393       	JR 	NZ,ABS
394
395       	AND 	3
396
397.ABS   	AND 	7
398       	ADD 	A,$14
399       	JR 	PS1
400
401.DAT8  	DJNZ 	DAT16
402
403.D8    	CALL 	FETCH
404       	JR 	DA
405
406.BITNUM	DJNZ 	INTMOD
407       	AND 	7
408
409.DA    	LD 	C,A
410       	SUB 	A
411       	JR 	DAC
412
413.DAT16 	DJNZ 	EXAF
414
415.D16   	CALL 	FETCH
416       	LD 	C,A
417       	CALL 	FETCH
418
419.DAC   	EX 	DE,HL
420       	PUSH 	HL
421       	LD 	H,A
422       	LD 	L,C
423
424.DHL   	LD 	C,$F8
425       	PUSH 	HL
426       	CALL 	CONVHL
427       	POP 	HL
428       	LD 	BC,$000A
429       	OR 	A
430       	SBC 	HL,BC
431       	POP 	HL
432       	EX 	DE,HL
433       	RET 	C
434
435       	LD 	(HL),'H'
436       	INC 	HL
437       	RET
438
439
440.INTMOD	DJNZ 	STKTOP
441       	AND 	3
442       	ADD 	A,$1C
443
444.PS1   	JR 	PS3
445
446.STKTOP	LD 	C,$13
447       	DEC 	B
448       	JR 	Z,PS2
449
450.REG16P	DJNZ 	COMMON
451       	RRA
452       	AND 	3
453       	CP 	3
454       	JR 	NZ,RX
455
456       	DEC 	A
457       	JR 	RNX
458
459.EXAF  	LD 	C,$0A
460       	DEC 	B
461       	JR 	Z,PS2
462
463.EXDE  	INC 	C
464       	DEC 	B
465       	JR 	Z,PS2
466
467.REG8S 	DJNZ 	ACCUM
468
469.R8    	AND 	7
470       	CP 	6
471       	JR 	NZ,PS3
472
473       	LD 	(HL),'('
474       	INC 	HL
475       	CALL 	REGX
476       	LD 	A,(IX+2)
477       	OR 	A
478       	JR 	Z,RP
479
480       	LD 	(HL),43 		;+
481       	RLCA
482       	RRCA
483       	JR 	NC,POS
484
485       	LD 	(HL),45			;-
486       	NEG
487
488.POS   	INC 	HL
489       	EX 	DE,HL
490       	PUSH 	HL
491       	LD 	H,B
492       	LD 	L,A
493       	LD 	C,$FB
494       	CALL 	CONVHL
495       	POP 	HL
496       	EX 	DE,HL
497       	JR 	RP
498
499.ACCUM 	RRA
500       	RRA
501       	RRA
502
503.COMMON	LD 	C,7
504       	DEC 	B
505       	JR 	Z,PS2
506
507.PORTC 	DEC 	C
508       	DJNZ 	IDAT8
509
510.PS2   	LD 	A,C
511.PS3   	JR 	PS4
512
513.IDAT8 	DJNZ 	IDAT16
514       	LD 	(HL),'('
515       	INC 	HL
516       	CALL 	D8
517       	JR 	RP
518
519.IDAT16	DJNZ 	REG8
520       	LD 	(HL),'('
521       	INC 	HL
522       	CALL 	D16
523       	JR 	RP
524
525.REG8  	DEC 	B
526       	JR 	Z,R8
527
528.IPAREF 	DJNZ 	REG16
529       	AND 	9
530       	JR 	PS4
531
532.REG16 	RRA
533       	DJNZ 	IREG16
534
535.R16   	AND 	3
536.RX    	CP  	2
537       	JR 	Z,REGX
538
539.RNX   	ADD 	A,$0C
540       	JR 	PS4
541
542.IREG16	DJNZ 	REGX
543       	LD 	(HL),'('
544       	INC 	HL
545       	CALL 	R16
546
547.RP    	LD 	(HL),')'
548       	INC 	HL
549       	RET
550
551.REGX  	LD 	A,(IX+1)
552       	ADD 	A,$10
553
554.PS4   	EX 	DE,HL
555       	PUSH 	HL
556       	LD 	HL,RGSTRS
557       	CALL 	XTRACT
558       	POP 	HL
559       	EX 	DE,HL
560       	RET
561
562;*************
563
564.RGSTRS	defb 	'B'				+$80
565	defb 	'C'       			+$80
566	defb 	'D'       			+$80
567	defb 	'E'       			+$80
568	defb 	'H'       			+$80
569	defb 	'L'       			+$80
570	defb 	'(','C',')' 			+$80
571	defb 	'A'       			+$80
572	defb 	'I'       			+$80
573	defb 	'R'       			+$80
574	defb 	'A','F',',','A','F','\''		+$80
575	defb 	'D','E',',','H','L'    		+$80
576	defb 	'B','C'             		+$80
577	defb 	'D','E'             		+$80
578	defb 	'A','F'             		+$80
579	defb 	'S','P'             		+$80
580	defb 	'H','L'             		+$80
581	defb 	'I','X'             		+$80
582	defb 	'I','Y'             		+$80
583	defb 	'(','S','P',')'       		+$80
584	defb 	'N','Z'             		+$80
585	defb 	'Z'                		+$80
586	defb 	'N','C'             		+$80
587	defb 	'C'                		+$80
588	defb 	'P','O'             		+$80
589	defb 	'P','E'             		+$80
590	defb 	'P'                		+$80
591	defb 	'M'                		+$80
592	defb 	'0'    				+$80
593	defb 	'?'    				+$80
594	defb 	'1'    				+$80
595	defb 	'2'    				+$80
596
597;********************
598
599.CONVHL	SUB 	A
600
601.CVHL1 	PUSH 	AF
602       	SUB 	A
603       	LD 	B,16
604
605.CVHL2 	ADD 	A,C
606       	JR 	C,CVHL3
607       	SUB 	C
608
609.CVHL3 	ADC 	HL,HL
610       	RLA
611       	DJNZ 	CVHL2
612
613       	JR 	NZ,CVHL1
614
615       	CP 	10
616       	INC 	B
617       	JR 	NC,CVHL1
618
619.CVHL4 	CP 	10
620       	SBC 	A,$69
621       	DAA
622       	LD 	(DE),A
623       	INC 	DE
624       	POP 	AF
625       	JR 	NZ,CVHL4
626
627       	RET
628
629;****************
630
631.XTRACT	OR 	A
632       	JR 	Z,COPY
633
634.SKIP  	BIT 	7,(HL)
635       	INC 	HL
636       	JR 	Z,SKIP
637
638       	DEC 	A
639       	JR 	NZ,SKIP
640
641.COPY  	LD 	A,(HL)
642       	RLCA
643       	SRL 	A
644       	LD 	(DE),A
645
646       	INC 	DE
647       	INC 	HL
648       	JR 	NC,COPY
649
650       	RET
651
652;*******************
653
654.FETCH 	LD 	A,(DE)
655       	INC 	DE
656       	INC 	(IX+0)
657       	PUSH 	AF
658       	CALL 	BYTSP
659       	POP 	AF
660       	RET
661
662.ADRSP 	LD 	A,D
663       	CALL 	BYTOP
664       	LD 	A,E
665
666.BYTSP 	CALL 	BYTOP
667       	LD 	A,$20
668       	JR 	CHROP
669
670.BYTOP 	PUSH 	AF
671       	RRA
672       	RRA
673       	RRA
674       	RRA
675       	CALL 	HEXOP
676       	POP 	AF
677
678.HEXOP 	AND 	$0F
679       	CP 	10
680       	SBC 	A,$69
681       	DAA
682
683; -----------------------------------
684;
685; End of John Kerr's DIS-Z80 routine.
686;
687; The next routine outputs a character.
688;
689; -------------------------------------
690
691.CHROP 	PUSH 	HL
692       	PUSH 	DE
693       	PUSH 	BC
694
695	ld	h,0
696	ld	l,a
697	push	hl		; parameter passing
698       	call 	fputc_cons	; This calls the Z88DK "put char" function
699	pop	hl
700
701       	POP 	BC
702       	POP 	DE
703       	POP 	HL
704
705       	RET
706