DEC B ;Restore the mode byte\r
\r
TABEND:\r
- push af\r
+ push af ;save Z flag\r
+ cp i_opc_bli\r
+ jr c,tabe_0\r
+ ld l,a\r
+ ld a,c\r
+ and 03h\r
+ add a,l\r
+ ld l,a\r
+ ld a,c\r
+ rra\r
+ and 0ch\r
+ add a,l\r
+ jr tabe_1\r
+tabe_0:\r
+ cp i_opc_alu\r
+ jr c,tabe_1\r
+ bit 7,b\r
+ jr nz,tabe_1\r
+ ld l,a\r
+ ld a,c\r
+ rra\r
+ rra\r
+ rra\r
+ and 07h\r
+ add a,l\r
+tabe_1:\r
PUSH DE ;save source pointer\r
ld de,disasbuf ;buffer pointer\r
- LD HL,MONICS\r
+ LD HL,t_MNEMONICS\r
CALL XTRACT ;copy mnemonic to buffer\r
\r
ex de,hl\r
jr c,da_spaces\r
POP DE ;source pointer\r
pop af\r
- or a\r
jr z,OPDONE1\r
\r
LD A,B ;test\r
\r
GROUP2:\r
DB 0C0h,036h ;mask, mode\r
- DB 040h,004h ; bit b,g\r
- DB 080h,02Dh ; res b,g\r
- DB 0C0h,0BEh ; set b,g\r
+ DB 040h,i_BIT ; bit b,g\r
+ DB 080h,i_RES ; res b,g\r
+ DB 0C0h,i_SET+80h ; set b,g\r
DB 0FFh ;\r
- DB 0F8h,006h ;mask, mode\r
- DB 000h,033h ; rlc g\r
- DB 008h,038h ; rrc g\r
- DB 010h,035h ; rl g\r
- DB 018h,03Ah ; rr g\r
- DB 020h,03Fh ; sla g\r
- DB 028h,040h ; sra g\r
- DB 030h,000h ;(sll g)\r
- DB 038h,0C1h ; srl g\r
+ DB 0F8h,000h ;mask, mode\r
+ DB 030h,i_?+80h ; (sll g)\r
+ DB 0FFh ;\r
+ DB 0C0h,006h ;mask, mode\r
+ DB 000h,i_RLC+80h ; rlc g ... srl g\r
\r
; Main group\r
\r
GROUP1:\r
DB 0FFh,000h ;mask, mode\r
- DB 000h,024h ; NOP\r
- DB 007h,032h ; RLCA\r
- DB 00Fh,037h ; RRCA\r
- DB 017h,031h ; RLA\r
- DB 01Fh,036h ; RRA\r
- DB 027h,00Dh ; DAA\r
- DB 02Fh,00Bh ; CPL\r
- DB 037h,03Dh ; SCF\r
- DB 03Fh,006h ; CCF\r
- DB 076h,014h ; HALT\r
- DB 0C9h,030h ; RET\r
- DB 0D9h,012h ; EXX\r
- DB 0F3h,00Fh ; DI\r
- DB 0FBh,091h ; EI\r
-\r
- DB 072h\r
- DB 0C6h,002h\r
- DB 0CEh,001h\r
- DB 0DEh,0BCh\r
-\r
- DB 002h\r
- DB 0D6h,042h\r
- DB 0E6h,003h\r
- DB 0EEh,043h\r
- DB 0F6h,025h\r
- DB 0FEh,08Ch\r
-\r
- DB 004h\r
- DB 008h,093h\r
-\r
+ DB 000h,i_NOP ; NOP\r
+ DB 076h,i_HALT ; HALT\r
+ DB 0C9h,i_RET ; RET\r
+ DB 0D9h,i_EXX ; EXX\r
+ DB 0F3h,i_DI ; DI\r
+ DB 0FBh,i_EI+80h ; EI\r
+\r
+ DB 004h ;mode\r
+ DB 008h,i_EX+80h ;\r
DB 001h\r
- DB 010h,010h\r
- DB 018h,09Dh\r
-\r
+ DB 010h,i_DJNZ\r
+ DB 018h,i_JR+80h\r
DB 0AFh\r
- DB 022h,0A2h\r
-\r
+ DB 022h,i_LD+80h\r
DB 0FAh\r
- DB 02Ah,0A2h\r
-\r
+ DB 02Ah,i_LD+80h\r
DB 0A7h\r
- DB 032h,0A2h\r
+ DB 032h,i_LD+80h\r
DB 07Ah\r
- DB 03Ah,0A2h\r
-\r
+ DB 03Ah,i_LD+80h\r
DB 003h\r
- DB 0C3h,01Ch\r
- DB 0CDh,085h\r
-\r
+ DB 0C3h,i_JP\r
+ DB 0CDh,i_CALL+80h\r
DB 097h\r
- DB 0D3h,0AAh\r
+ DB 0D3h,i_OUT+80h\r
DB 079h\r
- DB 0DBh,09Bh\r
+ DB 0DBh,i_IN+80h\r
DB 05Fh\r
- DB 0E3h,093h\r
+ DB 0E3h,i_EX+80h\r
DB 00Eh\r
- DB 0E9h,09Ch\r
+ DB 0E9h,i_JP+80h\r
DB 005h\r
- DB 0EBh,093h\r
+ DB 0EBh,i_EX+80h ;\r
DB 0DFh\r
- DB 0F9h,0A2h\r
- DB 0FFh\r
-\r
- DB 0C0h\r
- DB 0B6h,\r
- DB 040h,0A2h\r
+ DB 0F9h,i_LD+80h\r
DB 0FFh\r
\r
- DB 0F8h\r
- DB 076h,\r
- DB 080h,002h\r
- DB 088h,001h\r
- DB 098h,0BCh\r
-\r
- DB 006h\r
- DB 090h,042h\r
- DB 0A0h,003h\r
- DB 0A8h,043h\r
- DB 0B0h,025h\r
- DB 0B8h,08Ch\r
+ DB 0C0h ;mask\r
+ DB 0B6h ;mode r[y],r[z]\r
+ DB 040h,i_LD+80h\r
+ DB 006h ;mode alu[y],r[z]\r
+ DB 080h,i_ADD+80h\r
DB 0FFh\r
\r
- DB 0C7h\r
+ DB 0C7h ;mask\r
DB 00Bh\r
- DB 004h,016h\r
- DB 005h,08Eh\r
+ DB 004h,i_INC ; inc r[y]\r
+ DB 005h,i_DEC+80h ; dec r[y]\r
DB 0B2h,\r
- DB 006h,0A2h\r
+ DB 006h,i_LD+80h ; ld r[y],nn\r
+ DB 000h ;mode\r
+ DB 007h,i_RLCA+080h ; rlca ...\r
DB 020h\r
- DB 0C0h,0B0h\r
+ DB 0C0h,i_RET+080h ; ret cc\r
DB 023h\r
- DB 0C2h,01Ch\r
- DB 0C4h,085h\r
+ DB 0C2h,i_JP ; jp cc,mn\r
+ DB 0C4h,i_CALL+080h ; call cc,mn\r
DB 010h\r
- DB 0C7h,0BBh\r
+ DB 0C7h,i_RST+080h ; rst\r
+ DB 002h ;mode alu[y] n\r
+ DB 0C6h,i_ADD+80h ; add ...\r
DB 0FFh\r
\r
DB 0CFh\r
DB 0D3h\r
- DB 001h,0A2h\r
+ DB 001h,i_LD+80h ; ld ww,mn\r
DB 00Dh\r
- DB 003h,016h\r
- DB 00Bh,08Eh\r
+ DB 003h,i_INC ; inc rp\r
+ DB 00Bh,i_DEC+80h ; dec rp\r
DB 0FDh\r
- DB 009h,082h\r
+ DB 009h,i_ADD+80h ; add hl,rp\r
DB 060h\r
- DB 0C1h,02Bh\r
- DB 0C5h,0ACh\r
+ DB 0C1h,i_POP ; pop rp2\r
+ DB 0C5h,i_PUSH+80h ; push rp2\r
DB 0FFh\r
\r
DB 0E7h\r
DB 021h\r
- DB 020h,09Dh\r
+ DB 020h,i_JR+80h ;jr cc,\r
DB 0FFh\r
\r
DB 0EFh\r
DB 0E7h\r
- DB 002h,0A2h\r
+ DB 002h,i_LD+80h ; ld (rp),a ;rp=bc,de\r
DB 07Eh\r
- DB 00Ah,0A2h\r
+ DB 00Ah,i_LD+80h ; ld a,(rp) ;rp=bc,de\r
\r
; ED group\r
\r
GROUP3:\r
DB 0FFh,000h ;\r
- DB 044h,023h ;NEG\r
- DB 045h,02Fh ;RETN\r
- DB 04Dh,02Eh ;RETI\r
- DB 04Eh,000h ;(IM 0)\r
- DB 067h,039h ;RRD\r
- DB 06Fh,034h ;RLD\r
-; DB 070h,000h ;(IN (C))\r
- DB 071h,000h ;(OUT (C),0)\r
- DB 0A0h,021h ;LDI\r
- DB 0A1h,00Ah ;CPI\r
- DB 0A2h,01Ah ;INI\r
- DB 0A3h,029h ;OUTI\r
- DB 0A8h,01Fh ;LDD\r
- DB 0A9h,008h ;CPD\r
- DB 0AAh,018h ;IND\r
- DB 0ABh,028h ;OUTD\r
- DB 0B0h,020h ;LDIR\r
- DB 0B1h,009h ;CPIR\r
- DB 0B2h,019h ;INIR\r
- DB 0B3h,027h ;OTIR\r
- DB 0B8h,01Eh ;LDDR\r
- DB 0B9h,007h ;CPDR\r
- DB 0BAh,017h ;INDR\r
- DB 0BBh,0A6h ;OTDR\r
- DB 0FFh\r
-\r
- DB 0FFh\r
+ DB 044h,i_NEG ; NEG\r
+ DB 045h,i_RETN ; RETN\r
+ DB 04Dh,i_RETI ; RETI\r
+ DB 04Eh,i_? ; (IM 0)\r
+ DB 067h,i_RRD ; RRD\r
+ DB 06Fh,i_RLD ; RLD\r
+ DB 071h,i_?+80h ; (OUT (C),0)\r
DB 080h\r
- DB 070h,09Bh ;IN (C)\r
+ DB 070h,i_IN+80h ; IN (C)\r
DB 0FFh\r
\r
DB 0C7h\r
DB 0B8h\r
- DB 040h,09Bh ;IN r,(C)\r
+ DB 040h,i_IN+80h ; IN r,(C)\r
DB 08Bh ;\r
- DB 041h,0AAh ;OUT (C),r\r
+ DB 041h,i_OUT+80h ; OUT (C),r\r
DB 0FFh ;\r
;\r
DB 0CFh ;\r
DB 0FDh ;\r
- DB 042h,03Ch ;sbc hl,rp\r
- DB 04Ah,081h ;adc hl,rp\r
+ DB 042h,i_SBC ; sbc hl,rp\r
+ DB 04Ah,i_ADC+80h ; adc hl,rp\r
DB 0ADh ;\r
- DB 043h,0A2h ;LD (nn),rp\r
+ DB 043h,i_LD+80h ; LD (nn),rp\r
DB 0DAh ;\r
- DB 04Bh,0A2h ;LD rp,(nn)\r
+ DB 04Bh,i_LD+80h ; LD rp,(nn)\r
DB 0FFh ;\r
;\r
DB 0E7h ;\r
DB 040h ;\r
- DB 046h,095h ;IM x\r
+ DB 046h,i_IM+80h ; IM x\r
DB 0FFh ;\r
;\r
DB 0F7h ;\r
DB 0C7h ;\r
- DB 047h,0A2h ;LD i|r,A\r
+ DB 047h,i_LD+80h ; LD i|r,A\r
DB 07Ch ;\r
- DB 057h,0A2h ;LD A,i|r\r
+ DB 057h,i_LD+80h ; LD A,i|r\r
DB 0FFh\r
+\r
+ DB 0E4h ;\r
+ DB 000h ;\r
+ DB 0A0h,i_LDI+80h ; LDI ...\r
+ DB 0FFh ;\r
+ ;\r
DB 000h\r
\r
-;_______________\r
-\r
-MONICS:\r
- DC 0BFh ; 0 ?\r
- DC 'ADC' ; 1 ADC\r
- DC 'ADD' ; 2 ADD\r
- DC 'AND' ; 3 AND\r
- DC 'BIT' ; 4 BIT\r
- DC 'CALL' ; 5 CALL\r
- DC 'CCF' ; 6 CCF\r
- DC 'CPDR' ; 7 CPDR\r
- DC 'CPD' ; 8 CPD\r
- DC 'CPIR' ; 9 CPIR\r
- DC 'CPI' ;10 CPI\r
- DC 'CPL' ;11 CPL\r
- DC 'CP' ;12 CP\r
- DC 'DAA' ;13 DAA\r
- DC 'DEC' ;14 DEC\r
- DC 'DI' ;15 DI\r
- DC 'DJNZ' ;16 DJNZ\r
- DC 'EI' ;17 EI\r
- DC 'EXX' ;18 EXX\r
- DC 'EX' ;19 EX\r
- DC 'HALT' ;20 HALT\r
- DC 'IM' ;21 IM\r
- DC 'INC' ;22 INC\r
- DC 'INDR' ;23 INDR\r
- DC 'IND' ;24 IND\r
- DC 'INIR' ;25 INIR\r
- DC 'INI' ;26 INI\r
- DC 'IN' ;27 IN\r
- DC 'JP' ;28 JP\r
- DC 'JR' ;29 JR\r
- DC 'LDDR' ;30 LDDR\r
- DC 'LDD' ;31 LDD\r
- DC 'LDIR' ;32 LDIR\r
- DC 'LDI' ;33 LDI\r
- DC 'LD' ;34 LD\r
- DC 'NEG' ;35 NEG\r
- DC 'NOP' ;36 NOP\r
- DC 'OR' ;37 OR\r
- DC 'OTDR' ;38 OTDR\r
- DC 'OTIR' ;39 OTIR\r
- DC 'OUTD' ;40 OUTD\r
- DC 'OUTI' ;41 OUTI\r
- DC 'OUT' ;42 OUT\r
- DC 'POP' ;43 POP\r
- DC 'PUSH' ;44 PUSH\r
- DC 'RES' ;45 RES\r
- DC 'RETI' ;46 RETI\r
- DC 'RETN' ;47 RETN\r
- DC 'RET' ;48 RET\r
- DC 'RLA' ;49 RLA\r
- DC 'RLCA' ;50 RLCA\r
- DC 'RLC' ;51 RLC\r
- DC 'RLD' ;52 RLD\r
- DC 'RL' ;53 RL\r
- DC 'RRA' ;54 RRA\r
- DC 'RRCA' ;55 RA\r
- DC 'RRC' ;56 RRC\r
- DC 'RRD' ;57 RRD\r
- DC 'RR' ;58 RR\r
- DC 'RST' ;59 RST\r
- DC 'SBC' ;60 SBC\r
- DC 'SCF' ;61 SCF\r
- DC 'SET' ;62 SET\r
- DC 'SLA' ;63 SLA\r
- DC 'SRA' ;64 SRA\r
- DC 'SRL' ;65 SRL\r
- DC 'SUB' ;66 SUB\r
- DC 'XOR' ;67 XOR\r
-;Z180\r
- DC 'IN0' ;68 IN0\r
- DC 'MLP' ;69 MLP\r
- DC 'OTDM' ;70 OTDM\r
- DC 'OTDMR' ;71 OTDMR\r
- DC 'OTIM' ;72 OTIM\r
- DC 'OTIMR' ;73 OTIMR\r
- DC 'OUT0' ;74 OUT0\r
- DC 'SLP' ;75 SLP\r
- DC 'TST' ;76 TST\r
- DC 'TSTIO' ;77 TSTIO\r
+;-------------------------------------------------------------------------------\r
+\r
+opc macro x\r
+\r
+i_&x equ opc_index\r
+ dc '&x'\r
+opc_index defl opc_index+1\r
+ endm\r
\r
+t_MNEMONICS:\r
+opc_index defl 0\r
+; 1-byte other\r
+ opc ? ; 0\r
+ opc NOP ; 1\r
+ opc LD ; 2\r
+ opc INC ; 3\r
+ opc DEC ; 4\r
+ opc DJNZ ; 5\r
+ opc JR ; 6\r
+ opc HALT ; 7\r
+\r
+ opc RET ; 8\r
+ opc POP ; 9\r
+ opc JP ;10\r
+ opc CALL ;11\r
+ opc PUSH ;12\r
+ opc RST ;13\r
+ opc OUT ;14\r
+ opc EXX ;15\r
+ opc IN ;16\r
+ opc EX ;17\r
+ opc DI ;18\r
+ opc EI ;19\r
+; CB bit\r
+ opc BIT ;20\r
+ opc RES ;21\r
+ opc SET ;22\r
+; ED\r
+ opc NEG ;23\r
+ opc RETN ;24\r
+ opc RETI ;25\r
+ opc IM ;26\r
+ opc RRD ;27\r
+ opc RLD ;28\r
+; Z180\r
+ opc IN0 ;29\r
+ opc OUT0 ;30\r
+ opc TST ;31\r
+ opc MLT ;32\r
+ opc TSTIO ;33\r
+ opc SLP ;34\r
+ opc OTIM ;35\r
+ opc OTDM ;36\r
+ opc OTIMR ;37\r
+ opc OTDMR ;38\r
+\r
+;opc_index_gap equ 64-opc_index\r
+;opc_index defl 64\r
+i_opc_alu equ opc_index\r
+; 1-byte "alu"\r
+ opc ADD ;72\r
+ opc ADC ;73\r
+ opc SUB ;74\r
+ opc SBC ;75\r
+ opc AND ;76\r
+ opc XOR ;77\r
+ opc OR ;78\r
+ opc CP ;79\r
+; 1-byte no arguments\r
+ opc RLCA ;64\r
+ opc RRCA ;65\r
+ opc RLA ;66\r
+ opc RRA ;67\r
+ opc DAA ;68\r
+ opc CPL ;69\r
+ opc SCF ;70\r
+ opc CCF ;71\r
+; CB rot\r
+ opc RLC ;80\r
+ opc RRC ;81\r
+ opc RL ;82\r
+ opc RR ;83\r
+ opc SLA ;84\r
+ opc SRA ;85\r
+ opc SLL ;86\r
+ opc SRL ;87\r
+\r
+i_opc_bli equ opc_index\r
+; ED Block instr (bli)\r
+ opc LDI ;88\r
+ opc CPI ;89\r
+ opc INI ;90\r
+ opc OUTI ;91\r
+ opc LDD ;92\r
+ opc CPD ;93\r
+ opc IND ;94\r
+ opc OUTD ;95\r
+ opc LDIR ;96\r
+ opc CPIR ;97\r
+ opc INIR ;98\r
+ opc OTIR ;99\r
+ opc LDDR ;100\r
+ opc CPDR ;101\r
+ opc INDR ;102\r
+ opc OTDR ;103\r
\r
;-------------------------------------------------------------------------------\r
;\r