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