]> cloudbase.mooo.com Git - ddt180.git/blobdiff - ddt180.z80
Reorg dissassembler tables 4 (wip)
[ddt180.git] / ddt180.z80
index 3ab5b88253e3c1dafa55b6605e3bea022917fe65..5e17667aa124973a22d8d89b1d78ecba4f75729e 100644 (file)
@@ -39,21 +39,11 @@ CNTRX               equ     'X'-'@'
 ; CP/M memory layout\r
 \r
 BDOS           equ     5\r
-dfcb1          equ     05ch\r
-dfcb2          equ     06ch\r
-DMA_BUF                equ     080h\r
 TPA            equ     0100h\r
 \r
 ; BDOS function calls\r
 \r
 BDOS_PSTR      equ     9       ;Print String\r
-BDOS_OPEN      equ     15      ;Open File\r
-BDOS_CLOSE     equ     16      ;Close File\r
-BDOS_DELETE    equ     19      ;Delete File\r
-BDOS_READ      equ     20      ;Read Sequential\r
-BDOS_WRITE     equ     21      ;Write Sequential\r
-BDOS_CREATE    equ     22      ;Make File\r
-BDOS_SETDMA    equ     26      ;Set DMA Address\r
 \r
 ; ddtz specific definitions\r
 \r
@@ -61,7 +51,7 @@ STACK_SIZE    equ     80      ;ddtz internal stack
 CONBUF_SIZE    equ     80      ;Size of console input buffer\r
 EXPR_BUF_SIZE  equ     128     ;expressen buffer for conditional breakpoints\r
 BP_CNT         equ     12      ;Number of breakpoints\r
-BP_SIZE                equ     6       ;Size of a breakpoint record\r
+BP_SIZE                equ     4       ;Size of a breakpoint record\r
 \r
 ;-------------------------------------------------------------------------------\r
 \r
@@ -118,7 +108,6 @@ reg.iff:
        db      0f3h\r
        db      0c3h\r
 reg.pc:        dw      TPA\r
-var.$: dw      0000h\r
 \r
 cmd_rpt:dw     mainloop\r
 \r
@@ -156,20 +145,35 @@ l0093h:
        ld hl,ddtz_base\r
        ld l,000h\r
        ld (reg_sp),hl\r
-       ld a,(dfcb1+1)\r
-       cp ' '\r
-       ld hl,0\r
-       call nz,read_file\r
+\r
+       ld hl,(1)               ;wboot addr\r
+       ld de,?const\r
+       ld b,6\r
+vini_l:\r
+       inc     hl\r
+       inc     hl\r
+       inc     hl\r
+       ex      de,hl\r
+       inc     hl\r
+       ld      (hl),e\r
+       inc     hl\r
+       ld      (hl),d\r
+       inc     hl\r
+       ex      de,hl\r
+       djnz    vini_l\r
+\r
        jr mainloop\r
 \r
        ds      CONBUF_SIZE + 3 - ($ - conbuf)\r
 \r
 ;-------------------------------------------------------------------------------\r
 \r
-?const:\r
-?conin:\r
-?cono:\r
-       ret\r
+?const:        jp      0               ; return console input status\r
+?conin:        jp      0               ; return console input character\r
+?cono: jp      0               ; send console output character\r
+?list: jp      0               ; send list output character\r
+?auxo: jp      0               ; send auxiliary output character\r
+?auxi: jp      0               ; return auxiliary input character\r
 \r
 CMDTAB:\r
        dw      ERROR ;cmd_@    ;examine/substitute the displacement register @\r
@@ -178,7 +182,7 @@ CMDTAB:
        dw      ERROR ;cmd_C    ;trace over Calls\r
        dw      cmd_D           ;Display memory in hex and ascii\r
        dw      ERROR           ;\r
-       dw      cmd_F           ;specify Filename and command line\r
+       dw      ERROR ;cmd_F    ;specify Filename and command line\r
        dw      cmd_G           ;Go\r
        dw      cmd_H           ;compute Hex and other expressions\r
        dw      cmd_I           ;Input a byte from port\r
@@ -195,7 +199,7 @@ CMDTAB:
        dw      cmd_T           ;Trace\r
        dw      ERROR           ;\r
        dw      cmd_V           ;Verify (compare) two memory areas\r
-       dw      cmd_W           ;Write a file to disk\r
+       dw      ERROR ;cmd_W    ;Write a file to disk\r
        dw      cmd_X           ;eXamine [and substitute] registers\r
        dw      ERROR ;cmd_Y    ;examine [and substitute] Y variables\r
        dw      cmd_Z           ;Zap (fill) memory with a byte string\r
@@ -208,7 +212,6 @@ p_msg_error:
 mainloop:\r
        ld sp,stack\r
        ld hl,(reg.pc)\r
-       ld (var.$),hl\r
        call bp_clr_temporary\r
        ld hl,(cmd_rpt)\r
        ld de,mainloop\r
@@ -244,9 +247,9 @@ exe_hl:
 crlf:\r
        call    pstr_inl\r
        dc      CR,LF\r
-       call inchar\r
-       ld a,0\r
+       xor a\r
        ld (con_col),a\r
+       call inchar\r
        jr c,mainloop\r
        ret\r
 \r
@@ -387,13 +390,20 @@ outchar:
        pop ix\r
        ret\r
 \r
+pstr_sel:\r
+       inc b\r
+       jr pstr_sel2\r
+pstr_sel1:\r
+       call sub_0345h\r
+pstr_sel2:\r
+       djnz pstr_sel1\r
+       ;fall thru\r
 pstr:\r
        ld a,(hl)\r
        inc hl\r
        and a\r
        ret z\r
        call outchar\r
-       and a\r
        ret m\r
        jr pstr\r
 \r
@@ -413,25 +423,9 @@ p_goto_col:
 \r
 ;-------------------------------------------------------------------------------\r
 \r
-$ci:\r
-       push    hl\r
-       push    de\r
-       push    bc\r
-       call    ?conin\r
-       pop     bc\r
-       pop     de\r
-       pop     hl\r
-       ret\r
-\r
-$co:\r
-       push    hl\r
-       push    de\r
-       push    bc\r
-       ld      c,a\r
-       call    ?cono\r
-       pop     bc\r
-       pop     de\r
-       pop     hl\r
+incharw:\r
+       call inchar\r
+       jr nc,incharw\r
        ret\r
 \r
 ;-------------------------------------------------------------------------------\r
@@ -467,18 +461,8 @@ DELC:
        cp      ' '\r
        ret     nc\r
 DELC1:\r
-       push    de\r
-       push    hl\r
-       push    bc\r
-       ld      c,BS\r
-       call    ?cono\r
-       ld      c,' '\r
-       call    ?cono\r
-       ld      c,BS\r
-       call    ?cono\r
-       pop     bc\r
-       pop     hl\r
-       pop     de\r
+       call    pstr_inl\r
+       dc      BS,' ',BS\r
        ret\r
 \r
 DELL:\r
@@ -501,18 +485,17 @@ inlnxtch:
        ld a,c                  ;\r
        or a                    ;\r
        jr z,inl_e              ;\r
-       call $ci                ;\r
+       call incharw            ;\r
        cp CR                   ;\r
        jr z,inl_e              ;Accept line\r
        cp LF                   ;\r
        jr z,inl_e              ;Accept line\r
+\r
        cp BS                   ;\r
-       jr nz,gl_1              ;\r
-       call DELC               ;Delete Char\r
-       jr inlnxtch             ;\r
-gl_1:\r
+       jr z,gl_1               ;\r
        cp DEL                  ;\r
        jr nz,gl_2              ;\r
+gl_1:\r
        call DELC               ;Delete Char\r
        jr inlnxtch             ;\r
 gl_2:\r
@@ -529,11 +512,11 @@ gl_4:
        cp ' '                  ;\r
        jr nc,gl_5              ;\r
        ld a,'^'                ;Controll characters\r
-       call $co                ;\r
+       call outchar            ;\r
        ld a,(hl)               ;\r
        add a,'@'               ;\r
 gl_5:\r
-       call $co                ;\r
+       call outchar            ;\r
        inc hl                  ;\r
        inc b                   ;\r
        dec c                   ;\r
@@ -544,7 +527,6 @@ inl_e:
        ld hl,conbuf+1          ;\r
        ld (hl),b               ;\r
        call CRLF               ;\r
-\r
        inc     hl\r
        ex      de,hl\r
        pop hl                  ;\r
@@ -569,17 +551,20 @@ skipbl0:
        inc de\r
 skipbl:\r
        call get_char_upper\r
-       call test_whitespace\r
+       cp ' '\r
+       jr z,skipbl0\r
+       cp TAB\r
        jr z,skipbl0\r
        or a\r
        ret\r
 \r
+;-------------------------------------------------------------------------------\r
+\r
 next_arg:\r
        call skipbl\r
        cp ','\r
        ret nz\r
-       inc de\r
-       call skipbl\r
+       call skipbl0\r
        cp a\r
        ret\r
 \r
@@ -677,14 +662,6 @@ l0339h:
        pop bc\r
        ret\r
 \r
-sel_dc_string:\r
-       inc b\r
-l033eh:\r
-       dec b\r
-       ret z\r
-       call sub_0345h\r
-       jr l033eh\r
-\r
 sub_0345h:\r
        ld a,(hl)\r
        and a\r
@@ -798,91 +775,6 @@ l03b8h:
 expr:\r
        call skipbl\r
 expr1:\r
-       call do_subexpr\r
-       ret c\r
-       call do_rel_op\r
-       ret nc\r
-       push bc\r
-       push hl\r
-       call do_subexpr\r
-       jr c,error0\r
-       ex de,hl\r
-       ex (sp),hl\r
-       and a\r
-       sbc hl,de\r
-       ld hl,0ffffh\r
-       pop de\r
-       ret\r
-\r
-;-------------------------------------------------------------------------------\r
-\r
-do_op_eq:\r
-       jr z,l03edh\r
-       jr l03ech\r
-do_op_ne:\r
-       jr nz,l03edh\r
-       jr l03ech\r
-do_op_le:\r
-       jr z,l03edh\r
-do_op_lt:\r
-       jr c,l03edh\r
-       jr l03ech\r
-do_op_gt:\r
-       jr z,l03ech\r
-do_op_ge:\r
-       jr nc,l03edh\r
-l03ech:\r
-       inc hl\r
-l03edh:\r
-       and a\r
-       ret\r
-do_rel_op:\r
-       push hl\r
-       ld hl,tab_eq_le_ge\r
-       call lookupch\r
-       jr nc,l041dh\r
-       ld a,b\r
-       or a\r
-       jr z,l0411h\r
-       ld a,(de)\r
-       cp '='\r
-       jr nz,l0406h\r
-       inc de\r
-       inc b\r
-       inc b\r
-       jr l0411h\r
-l0406h:\r
-       bit 0,b\r
-       jr z,l0411h\r
-       cp '>'\r
-       jr nz,l0411h\r
-       inc de\r
-       ld b,005h\r
-l0411h:\r
-       ld hl,tab_func_eqlege\r
-       ld a,b\r
-       add a,a\r
-       call add_hl_a\r
-       ld c,(hl)\r
-       inc hl\r
-       ld b,(hl)\r
-       scf\r
-l041dh:\r
-       pop hl\r
-       ret\r
-\r
-tab_eq_le_ge:\r
-       db      '=<>',0\r
-\r
-tab_func_eqlege:\r
-       dw      do_op_eq\r
-       dw      do_op_lt\r
-       dw      do_op_gt\r
-       dw      do_op_le\r
-       dw      do_op_ge\r
-       dw      do_op_ne\r
-\r
-do_subexpr:\r
        call do_factor\r
        ret c\r
 l0433h:\r
@@ -1050,7 +942,7 @@ do_factor:
        call get.number\r
        ret nc\r
        inc de\r
-       ld hl,(BDOS+1)\r
+       ld hl,ddtz_base-1\r
        cp 'T'\r
        ret z\r
        ld hl,(high_load)\r
@@ -1062,12 +954,6 @@ do_factor:
        ld hl,TPA\r
        cp 'L'\r
        ret z\r
-       ld hl,(var.$)\r
-       cp '$'\r
-       ret z\r
-       ld hl,ddtz_base\r
-       cp 'Z'\r
-       ret z\r
        cp '-'\r
        jr z,fact_factneg\r
        cp '~'\r
@@ -1483,11 +1369,10 @@ bp_clr_temporary:
 ;      set breakpoints\r
 ; > BX\r
 ;      clear all breakpoints\r
-; > BX address [address..]\r
+; > BX breakp [breakp..]\r
 ;      clear breakpoints\r
 ;\r
-; where breakp is:\r
-;      expression\r
+; breakp can be any valid expression\r
 \r
 cmd_B:\r
        call skipbl\r
@@ -1571,9 +1456,6 @@ bp_enter:
        pop de\r
        ld (ix+002h),l\r
        ld (ix+003h),h\r
-       call bp_get_count\r
-       ld (ix+004h),l\r
-       ld (ix+005h),h\r
        call next_arg\r
        pop af\r
        ld (ix+000h),a\r
@@ -1591,15 +1473,6 @@ bp_get_freeslot:
 error12\r
        jp ERROR\r
 \r
-bp_get_count:\r
-       call skipbl\r
-       ld hl,1\r
-       cp ':'\r
-       ret nz\r
-       inc de\r
-       call expr\r
-       jr c,error12\r
-       ret\r
 \r
 ;-------------------------------------------------------------------------------\r
 ; Breakpoint handling routine.\r
@@ -1667,32 +1540,14 @@ sub_0913h:
        ld d,(ix+003h)\r
        ld hl,(reg.pc)\r
        call cp_hl_de\r
-       push bc\r
-       call z,sub_0942h\r
-       pop bc\r
-l0938h:\r
-\r
-       call    bpl_next\r
-       ex af,af'\r
-       ret\r
-\r
-sub_0942h:\r
+       jr nz,l0938h\r
        ex af,af'\r
        res 7,a\r
-       ex af,af'\r
-       ld e,(ix+004h)\r
-       ld d,(ix+005h)\r
-       dec de\r
-       ld a,d\r
-       or e\r
-       jr z,l0974h\r
-       ld (ix+004h),e\r
-       ld (ix+005h),d\r
-       ret\r
-l0974h:\r
-       ex af,af'\r
        or (ix+000h)\r
        ex af,af'\r
+l0938h:\r
+       call    bpl_next\r
+       ex af,af'\r
        ret\r
 \r
 bp_restore_mem:\r
@@ -1733,8 +1588,6 @@ bp_tst_e:
 \r
 bp_trace_enter:\r
        call bp_get_freeslot\r
-       ld (ix+004h),001h\r
-       ld (ix+005h),000h\r
        ld (ix+002h),l\r
        ld (ix+003h),h\r
        ld a,(b_21e2_start)\r
@@ -1829,15 +1682,13 @@ cmd_X:
        jp nc,p_cpustat0\r
        call assert_eol\r
        ld a,b\r
-       cp 01eh\r
+       cp 25\r
        jr z,l0c5fh\r
-       cp 01fh\r
+       cp 26\r
        jr z,l0c4fh\r
-       cp 01dh\r
-       jp z,ERROR\r
        ex de,hl\r
        ld hl,t_reg_names\r
-       call sel_dc_string\r
+       call pstr_sel\r
        call l0c33h\r
 \r
        call outbl\r
@@ -1862,7 +1713,6 @@ l0c30h:
        ret\r
 \r
 l0c33h:\r
-       call pstr\r
        call    pstr_inl\r
        dc      '='\r
        ld a,(de)\r
@@ -1947,38 +1797,33 @@ sub_0caeh:
        ret\r
 \r
 t_reg_names:\r
-       DC      'BC'''\r
-       DC      'DE'''\r
-       DC      'HL'''\r
-       DC      'BC'\r
-       DC      'DE'\r
-       DC      'HL'\r
-       DC      'A'''\r
-       DC      'B'''\r
-       DC      'C'''\r
-       DC      'D'''\r
-       DC      'E'''\r
-       DC      'H'''\r
-       DC      'L'''\r
-       DC      'A'\r
-       DC      'B'\r
-       DC      'C'\r
-       DC      'D'\r
-       DC      'E'\r
-       DC      'H'\r
-       DC      'L'\r
-       DC      'IX'\r
-       DC      'IY'\r
-       DC      'SP'\r
-       DC      'PC'\r
-       DC      'X'\r
-       DC      'Y'\r
-       DC      'S'\r
-       DC      'P'\r
-       DC      'I'\r
-       DC      'IP'\r
-       DC      'F'''\r
-       DC      'F'\r
+       DC      'BC'''          ;0\r
+       DC      'DE'''          ;1\r
+       DC      'HL'''          ;2\r
+       DC      'BC'            ;3\r
+       DC      'DE'            ;4\r
+       DC      'HL'            ;5\r
+       DC      'A'''           ;6\r
+       DC      'B'''           ;7\r
+       DC      'C'''           ;8\r
+       DC      'D'''           ;9\r
+       DC      'E'''           ;10\r
+       DC      'H'''           ;11\r
+       DC      'L'''           ;12\r
+       DC      'A'             ;13\r
+       DC      'B'             ;14\r
+       DC      'C'             ;15\r
+       DC      'D'             ;16\r
+       DC      'E'             ;17\r
+       DC      'H'             ;18\r
+       DC      'L'             ;19\r
+       DC      'IX'            ;20\r
+       DC      'IY'            ;21\r
+       DC      'SP'            ;22\r
+       DC      'PC'            ;23\r
+       DC      'I'             ;24\r
+       DC      'F'''           ;25\r
+       DC      'F'             ;26\r
        DB      0\r
 \r
 b_0cfa_start:\r
@@ -2030,18 +1875,8 @@ b_0cfa_start:
        dw      reg_sp\r
        db      003h\r
        dw      reg.pc\r
-       db      003h\r
-       dw      reg.ix\r
-       db      003h\r
-       dw      reg.iy\r
-       db      003h\r
-       dw      reg_sp\r
-       db      003h\r
-       dw      reg.pc\r
        db      000h\r
        dw      reg.i\r
-       db      003h\r
-       dw      l004eh\r
        db      000h\r
        dw      reg.f2\r
        db      000h\r
@@ -2160,29 +1995,17 @@ l0dedh:
        call crlf\r
 l0e10h:\r
        pop bc\r
-       inc hl\r
        inc de\r
-       dec bc\r
-       ld a,b\r
-       or c\r
-       jr nz,l0dedh\r
+       cpi\r
+       jp pe,l0dedh\r
        ret\r
 \r
 ;-------------------------------------------------------------------------------\r
-; > M[V] startaddr endaddr destaddr\r
-;      Move memory [and verify]\r
+; > M startaddr endaddr destaddr\r
+;      Move memory\r
 \r
 cmd_M:\r
-       call get_char_upper\r
-       cp 'V'\r
-       jr nz,l0e1fh\r
-       inc de\r
-l0e1fh:\r
-       push af\r
        call sub_034eh\r
-       push hl\r
-       push de\r
-       push bc\r
        call cp_hl_de\r
        jr nc,cmdm_up\r
        add hl,bc\r
@@ -2195,11 +2018,6 @@ l0e1fh:
        db 01h          ;swallow ldir instruction (ld bc,...)\r
 cmdm_up:\r
        ldir\r
-       pop bc\r
-       pop de\r
-       pop hl\r
-       pop af\r
-       jr z,l0dedh\r
        ret\r
 \r
 ;-------------------------------------------------------------------------------\r
@@ -2232,32 +2050,31 @@ cmd_H:
 ;      Query memory for a byte string [Justified]\r
 \r
 cmd_Q:\r
-       call get_char_upper\r
-       sub 'J'\r
-       ld (cmd_Q_jopt),a\r
-       jr nz,l0e8dh\r
-       inc de\r
-l0e8dh:\r
        call get_arg_range\r
        push bc\r
        push hl\r
        call sub_0ee6h\r
        pop hl\r
 l0e96h:\r
-       call sub_0ed7h\r
+       push    hl\r
+       push    de\r
+       push bc\r
+l0edah:\r
+       ld a,(de)\r
+       cp (hl)\r
+       jr nz,l0ee2h\r
+       inc de\r
+       inc hl\r
+       djnz l0edah\r
+l0ee2h:\r
+       pop bc\r
+       pop de\r
+       pop hl\r
        jr nz,l0eb0h\r
        push bc\r
-       push hl\r
-       ld a,(cmd_Q_jopt)\r
-       or a\r
-       jr nz,l0ea7h\r
-       ld bc,-8\r
-       add hl,bc\r
-l0ea7h:\r
        ld bc,16\r
-       and a\r
+       and a                   ;clear carry\r
        call sub_0f58h\r
-       pop hl\r
        pop bc\r
 l0eb0h:\r
        inc hl\r
@@ -2296,23 +2113,6 @@ l0ed3h:
        pop hl\r
        ret\r
 \r
-sub_0ed7h:\r
-       push    hl\r
-       push    de\r
-       push bc\r
-l0edah:\r
-       ld a,(de)\r
-       cp (hl)\r
-       jr nz,l0ee2h\r
-       inc de\r
-       inc hl\r
-       djnz l0edah\r
-l0ee2h:\r
-       pop bc\r
-       pop de\r
-       pop hl\r
-       ret\r
-\r
 sub_0ee6h:\r
        ld hl,conbuf+1\r
        call sub_0ef7h\r
@@ -2323,26 +2123,13 @@ sub_0ee6h:
        ret nz\r
        jp ERROR\r
 \r
-sub_0ef7h:\r
-       db      0e6h            ; and 037h (clear carry)\r
-sub_0ef8h:\r
+sub_0ef7h:                     ;from cmd_Q, cmd_Z\r
+       db      0e6h            ;and 037h (clear carry)\r
+sub_0ef8h:                     ;from cmd_S\r
        scf\r
 l0ef9h:\r
        push af\r
        call next_arg\r
-       cp 'W'\r
-       jr nz,l0f0eh\r
-       inc de\r
-       push hl\r
-       call sub_035dh\r
-       ex de,hl\r
-       ex (sp),hl\r
-       ld (hl),e\r
-       inc hl\r
-       ld a,d\r
-       pop de\r
-       jr l0f1ah\r
-l0f0eh:\r
        cp ''''\r
        jr z,l0f1eh\r
        push hl\r
@@ -2350,7 +2137,6 @@ l0f0eh:
        ld a,l\r
        pop hl\r
        jr c,l0f42h\r
-l0f1ah:\r
        ld (hl),a\r
        inc hl\r
        jr l0f3ah\r
@@ -2404,8 +2190,7 @@ sub_0f58h:
        push af\r
 l0f5ch:\r
        call out_hl\r
-       call z,outbl2\r
-       call outbl\r
+       call outbl2\r
        ld de,0\r
 l0f68h:\r
        ld a,(hl)\r
@@ -2462,201 +2247,89 @@ l0fach:
 ; > Fcommandline\r
 ;      specifiy filenames and command line\r
 \r
-cmd_F:\r
+;cmd_F:\r
+\r
+;-------------------------------------------------------------------------------\r
+; > R [displacement]\r
+;      Read Intel Hex File from console [add displacement]\r
+\r
+cmd_R:\r
+       ld hl,0\r
+       call get_lastarg_def    ;get offset from command line\r
+       push hl\r
+       ld hl,0\r
+       ld (high_load),hl\r
+w_recstart:\r
+       call i.getchar\r
+       jr z,rdhex_done\r
+       cp ':'\r
+       jr nz,w_recstart\r
+       ld c,0                  ;init checksum\r
+       call i.gethexbyte       ;record len\r
+       ld b,a\r
+       call i.gethexbyte       ;address high\r
+       ld h,a\r
+       call i.gethexbyte       ;address low\r
+       ld l,a\r
+       call i.gethexbyte       ;record type (ignored)\r
+       ld a,b\r
+       and a                   ;record len == 0?\r
+       jr z,rdhex_done\r
+l16c6h:\r
+       call i.gethexbyte\r
+       pop de                  ;offset\r
        push de\r
-       ld hl,DMA_BUF+1\r
-       ld (hl),' '\r
-       inc hl\r
-l0fb6h:\r
-       call get_char_upper\r
-       ld (hl),a\r
+       push hl\r
+       add hl,de\r
+       call i.storebyte\r
+       pop hl\r
        inc hl\r
-       inc de\r
+       djnz l16c6h             ;repeat for record len\r
+       call i.gethexbyte       ;checksum\r
+       ld a,c\r
        and a\r
-       jr nz,l0fb6h\r
-       ld a,l\r
-       sub DMA_BUF+2\r
-       ld (DMA_BUF),a\r
+       jp nz,ERROR             ;exit if checksum error\r
+       jr w_recstart           ;next record\r
+rdhex_done:\r
        pop hl\r
-       ld de,dfcb1\r
-       call parse_filename\r
-       ld de,dfcb2\r
-       ;fall thru\r
+       call i.gethexbyte\r
+       jp p_max_high\r
 \r
-parse_filename:\r
-       call sub_102ch\r
-       push de\r
-       push bc\r
-       ld b,(hl)\r
-       inc hl\r
-       ld a,(hl)\r
-       cp ':'\r
-       jr nz,l0fe1h\r
-       inc hl\r
-       ld a,b\r
-       sub 040h\r
-       and 01fh\r
-       jr l0fe3h\r
-l0fe1h:\r
-       dec hl\r
-       xor a\r
-l0fe3h:\r
-       ld (de),a\r
-       inc de\r
-       ld b,8\r
-       call sub_0ff2h\r
-       ld b,3\r
-       call sub_0ff2h\r
-       pop bc\r
-       pop de\r
-       ret\r
-\r
-sub_0ff2h:\r
-       call sub_1012h\r
-       jr z,l0ffeh\r
-       inc hl\r
-       ld (de),a\r
-       inc de\r
-       djnz sub_0ff2h\r
-       jr l1003h\r
-l0ffeh:\r
-       ld a,c\r
-l0fffh:\r
-       ld (de),a\r
-       inc de\r
-       djnz l0fffh\r
-l1003h:\r
-       call sub_1012h\r
-       inc hl\r
-       jr nz,l1003h\r
-       cp '*'\r
-       jr z,l1003h\r
-       cp '.'\r
-       ret z\r
-       dec hl\r
-       ret\r
-\r
-sub_1012h:\r
-       ld a,(hl)\r
-       ld c,' '\r
-       and 01fh\r
-       ret z\r
-       ld a,(hl)\r
-       cp ' '\r
-       ret z\r
-       call sub_1043h\r
-       ret z\r
-       cp '/'\r
-       ret z\r
-       cp '.'\r
-       ret z\r
-       ld c,'?'\r
-       call toupper\r
-       cp '*'\r
-       ret\r
-\r
-l102bh:\r
-       inc hl\r
-sub_102ch:\r
-       ld a,(hl)\r
-       cp '/'\r
-       jr z,l103bh\r
-       call sub_1043h\r
-       jr z,l102bh\r
-l1036h:\r
-       cp ' '\r
-       jr z,l102bh\r
-       ret\r
-\r
-l103bh:\r
-       ld a,(hl)\r
-       cp ' '+1\r
-       jr c,l1036h\r
-       inc hl\r
-       jr l103bh\r
-\r
-sub_1043h:\r
-       cp '='\r
-       ret z\r
-       cp '_'\r
-       ret z\r
-       cp ','\r
-       ret\r
-\r
-;-------------------------------------------------------------------------------\r
-\r
-setup_fcb:\r
-       push de\r
-       ld hl,12\r
-       add hl,de\r
-       xor a\r
-       ld b,21\r
-l1052h:\r
-       ld (hl),a\r
-       inc hl\r
-       djnz l1052h\r
-       ld de,DMA_BUF\r
-       ld c,BDOS_SETDMA\r
-       call ddtz_bdos\r
-       pop de\r
+i.gethexbyte:\r
+       call sub_16f6h\r
+       rlca\r
+       rlca\r
+       rlca\r
+       rlca\r
+       ld d,a\r
+       call sub_16f6h\r
+       add a,d\r
+       ld d,a\r
+       add a,c\r
+       ld c,a\r
+       ld a,d\r
        ret\r
 \r
-;-------------------------------------------------------------------------------\r
-\r
-file_open:\r
-       ld (cur_fcb),de\r
-       call setup_fcb\r
-       ld c,BDOS_OPEN\r
-       call ddtz_bdos\r
-       inc a\r
-       jp z,ERROR\r
-       ld a,080h\r
-       ld (cmdR_rindex),a\r
-       ret\r
+sub_16f6h:\r
+       call i.getchar\r
+       jr z,error2\r
+       call hex_digit\r
+       ret nc\r
+error2:\r
+       jp ERROR\r
 \r
-read_byte:\r
-       ld a,(cmdR_rindex)\r
-       cp 080h\r
-       jr nz,l1111h\r
-       call read_sector\r
-       ld a,01ah\r
-       ret z\r
-       sub a\r
-l1111h:\r
-       inc a\r
-       ld (cmdR_rindex),a\r
-       push hl\r
-       add a,07fh\r
-       ld l,a\r
-       ld h,000h\r
-       ld a,(hl)\r
-       pop hl\r
+i.getchar:\r
+       call incharw\r
        cp 01ah\r
        ret\r
 \r
-read_sector:\r
-       push hl\r
-       push de\r
-       push bc\r
-       ld de,(cur_fcb)\r
-       ld c,BDOS_READ\r
-       call ddtz_bdos\r
-       sub a,1\r
-       jr z,l1132h\r
-       jr nc,error2\r
-l1132h:\r
-       pop bc\r
-       pop de\r
-       pop hl\r
-       ret\r
-\r
-cmdR_storebyte:\r
+i.storebyte:\r
        push af\r
        push de\r
-       ld de,TPA\r
+       ld de,TPA               ;lowest allowed load address\r
        call cp_hl_de\r
        jr c,error2\r
-       ld de,(BDOS+1)\r
+       ld de,(BDOS+1)          ;highest allowed load address\r
        call cp_hl_de\r
        jr nc,error2\r
        ld de,(high_load)\r
@@ -2671,125 +2344,7 @@ l1157h:
 l1163h:\r
        pop de\r
        pop af\r
-       ld (hl),a\r
-       ret\r
-\r
-strncmp:\r
-       ld a,(de)\r
-       cp (hl)\r
-       inc de\r
-       inc hl\r
-       ret nz\r
-       djnz strncmp\r
-       ret\r
-\r
-str_hex:\r
-       db      'HEX'\r
-\r
-read_hexchar:\r
-       call read_hexdigit\r
-       rlca\r
-       rlca\r
-       rlca\r
-       rlca\r
-       ld d,a\r
-       call read_hexdigit\r
-       add a,d\r
-       ld d,a\r
-       add a,c\r
-       ld c,a\r
-       ld a,d\r
-       ret\r
-\r
-read_hexdigit:\r
-       call read_byte\r
-       jr z,error2\r
-hex_digit_v:\r
-       call hex_digit\r
-       ret nc\r
-error2:\r
-       jp ERROR\r
-\r
-;-------------------------------------------------------------------------------\r
-; > R [displacement]\r
-;      Read a binary or hex file  [add displacement]\r
-\r
-cmd_R:\r
-       ld hl,0\r
-       call get_lastarg_def\r
-read_file:\r
-       ld de,dfcb1\r
-       push hl\r
-       ld hl,0\r
-       ld (high_load),hl\r
-       call file_open\r
-       ld hl,dfcb1+9\r
-       ld de,str_hex\r
-       ld b,3\r
-       call strncmp\r
-       pop hl\r
-       jr z,read_hexfile\r
-       ld de,TPA\r
-       push hl\r
-       add hl,de\r
-l108eh:\r
-       call read_sector\r
-       jr nz,read_file_nxt\r
-       pop hl\r
-       jp p_max_high\r
-\r
-read_file_nxt:\r
-       ld de,DMA_BUF\r
-       ld b,080h\r
-l109ah:\r
-       ld a,(de)\r
-       call cmdR_storebyte\r
-       inc de\r
-       inc hl\r
-       djnz l109ah\r
-       jr l108eh\r
-\r
-read_hexfile:\r
-       push hl\r
-l10aeh:\r
-       call read_byte          ; RECORD MARK\r
-       jr z,rdhex_done\r
-       cp ':'\r
-       jr nz,l10aeh\r
-       ld c,0\r
-       call read_hexchar       ; RECLEN\r
-       ld b,a\r
-       call read_hexchar       ; LOAD ADDR H\r
-       ld h,a\r
-       call read_hexchar       ; LOAD ADDR L\r
-       ld l,a\r
-       ld a,b\r
-       and a\r
-       jr z,rdhex_done\r
-       call read_hexchar       ; RECTYP\r
-l10cch:\r
-       call read_hexchar       ; DATA\r
-       pop de\r
-       push de\r
-       push hl\r
-       add hl,de\r
-       call cmdR_storebyte\r
-       pop hl\r
-       inc hl\r
-       djnz l10cch\r
-       call read_hexchar       ; CHKSUM\r
-       ld a,c\r
-       and a\r
-       jp nz,ERROR\r
-       jr l10aeh\r
-rdhex_done:\r
-       pop hl\r
-       jp p_max_high\r
-\r
-test_whitespace:\r
-       cp      ' '\r
-       ret     z\r
-       cp      TAB\r
+       ld (hl),a               ;store byte\r
        ret\r
 \r
 ;-------------------------------------------------------------------------------\r
@@ -2807,7 +2362,7 @@ p_max_high:
        call out_hl\r
        call pstr_inl\r
        DC      '  Top = '\r
-       ld hl,(BDOS+1)\r
+       ld hl,ddtz_base-1\r
        call out_hl\r
        jp crlf\r
 \r
@@ -2815,66 +2370,7 @@ p_max_high:
 ; > Wstartaddr endaddr\r
 ;      Write a file to disk\r
 \r
-cmd_W:\r
-       call get_arg_range\r
-       call assert_eol\r
-       push hl\r
-       ld a,c\r
-       add a,07fh\r
-       jr nc,l11adh\r
-       inc b\r
-l11adh:\r
-       and 080h\r
-       ld c,a\r
-       push bc\r
-       ld a,(dfcb1+1)\r
-       cp ' '\r
-       jr z,error4\r
-       ld de,dfcb1\r
-       call setup_fcb\r
-       push de\r
-       ld c,BDOS_DELETE\r
-       call ddtz_bdos\r
-       pop de\r
-       ld c,BDOS_CREATE\r
-       call ddtz_bdos\r
-       inc a\r
-       jr z,error4\r
-       pop bc\r
-       pop hl\r
-l11cch:\r
-       ld a,b\r
-       or c\r
-       jr z,close_file\r
-       push bc\r
-       ld de,080h              ; DMA_BUF\r
-       ld b,d\r
-       ld c,e\r
-       ldir\r
-       call write_sector\r
-       ex (sp),hl\r
-       ld bc,0ff80h\r
-       add hl,bc\r
-       ex (sp),hl\r
-       pop bc\r
-       jr l11cch\r
-\r
-write_sector:\r
-       push hl\r
-       ld de,dfcb1\r
-       ld c,BDOS_WRITE\r
-       call ddtz_bdos\r
-       pop hl\r
-       and a\r
-       ret z\r
-       call close_file\r
-error4:\r
-       jp ERROR\r
-\r
-close_file:\r
-       ld de,dfcb1\r
-       ld c,BDOS_CLOSE\r
-       jp ddtz_bdos\r
+;cmd_W:\r
 \r
 ;-------------------------------------------------------------------------------\r
 ; > A [startaddr]\r
@@ -2886,19 +2382,6 @@ close_file:
 CALL_HL:\r
        jp (hl)\r
 \r
-;-------------------------------------------------------------------------------\r
-\r
-\r
-\r
-\r
-b_176d_start:\r
-       DC      'AF,AF'''\r
-l1773h:\r
-       DC      'DE,HL'\r
-       DC      '(SP),HL'\r
-       DC      '(SP),IX'\r
-       DC      '(SP),IY'\r
-       db      0\r
 \r
 ;-------------------------------------------------------------------------------\r
 ; >>L [startaddr] [endaddr]\r
@@ -2950,21 +2433,13 @@ cmdl_p_line:
        ret\r
 \r
 p_disas_line:\r
-       call outbl2\r
        call out_hl\r
-       call z,outbl\r
-       call outbl\r
+       call outbl2\r
        sub a\r
        ld (con_col),a\r
        push    hl\r
        pop     iy\r
        call p_disas_instr\r
-       ret z\r
-\r
-       ld      c,15\r
-       call    p_goto_col\r
-       ; fall thru\r
-;-------------------------------------------------------------------------------\r
        ret\r
 \r
 ;-------------------------------------------------------------------------------\r
@@ -3159,7 +2634,6 @@ disas_nopfx:
        ret c\r
        ld hl,b_1b9b_start\r
        call lookup_opc\r
-       ret nc\r
        ld b,3\r
        ret\r
 \r
@@ -3175,7 +2649,7 @@ sub_1a72h:
        inc hl\r
        jr sub_1a72h\r
 l1a7fh:\r
-       ld de,l1c97h\r
+       ld de,p_arg_none\r
        inc hl\r
        ld c,(hl)\r
        jr get_mnemonic\r
@@ -3209,6 +2683,9 @@ lookup_opc:
 l1aa8h:\r
        inc hl\r
        ld c,(hl)\r
+       inc c\r
+       ret z\r
+       dec c\r
        inc hl\r
        ld e,(hl)\r
        inc hl\r
@@ -3224,253 +2701,237 @@ get_mnemonic:
 ; 1 byte opcodes (no parameters)\r
 ; Format: db opcode, t_MNEMONICS-index\r
 b_1ab6_start:\r
-       db 076h,039h            ;halt\r
-       db 0d9h,036h            ;exx\r
-       db 0f3h,02ch            ;di\r
-       db 0fbh,032h            ;ei\r
-       db 000h,069h            ;nop\r
-       db 007h,09eh            ;rlca\r
-       db 00fh,0adh            ;rrca\r
-       db 017h,098h            ;rla\r
-       db 01fh,0a7h            ;rra\r
-       db 027h,026h            ;daa\r
-       db 02fh,023h            ;cpl\r
-       db 037h,0bah            ;scf\r
-       db 03fh,010h            ;ccf\r
+       db 076h,o_HALT          ;halt\r
+       db 0d9h,o_EXX           ;exx\r
+       db 0f3h,o_DI            ;di\r
+       db 0fbh,o_EI            ;ei\r
+       db 000h,o_NOP           ;nop\r
+       db 007h,o_RLCA          ;rlca\r
+       db 00fh,o_RRCA          ;rrca\r
+       db 017h,o_RLA           ;rla\r
+       db 01fh,o_RRA           ;rra\r
+       db 027h,o_DAA           ;daa\r
+       db 02fh,o_CPL           ;cpl\r
+       db 037h,o_SCF           ;scf\r
+       db 03fh,o_CCF           ;ccf\r
+       db 0c9h,o_RET           ;ret\r
        db 0ffh\r
 \r
 \r
 ; 1 byte opcodes\r
 ; Format: db mask, match, t_MNEMONICS-index\r
-;        dw argument formating fuction\r
+;        dw argument formating function\r
 b_1ad1_start:\r
-       db 0c0h,040h,056h       ;ld r,r\r
+       db 0c0h,040h,o_LD       ;ld r,r\r
        dw p_arg_r_r\r
-       db 0f8h,080h,003h       ;add a,r\r
+       db 0f8h,080h,o_ADD      ;add a,r\r
        dw p_arg_a_r\r
-       db 0f8h,088h,000h       ;adc a,r\r
+       db 0f8h,088h,o_ADC      ;adc a,r\r
        dw p_arg_a_r\r
-       db 0f8h,090h,0c9h       ;sub r\r
+       db 0f8h,090h,o_SUB      ;sub r\r
        dw p_arg_rs\r
-       db 0f8h,098h,0b7h       ;sbc a,r\r
+       db 0f8h,098h,o_SBC      ;sbc a,r\r
        dw p_arg_a_r\r
-       db 0f8h,0a0h,006h       ;and r\r
+       db 0f8h,0a0h,o_AND      ;and r\r
        dw p_arg_rs\r
-       db 0f8h,0a8h,0cch       ;xor r\r
+       db 0f8h,0a8h,o_XOR      ;xor r\r
        dw p_arg_rs\r
-       db 0f8h,0b0h,06ch       ;or r\r
+       db 0f8h,0b0h,o_OR       ;or r\r
        dw p_arg_rs\r
-       db 0f8h,0b8h,013h       ;cp r\r
+       db 0f8h,0b8h,o_CP       ;cp r\r
        dw p_arg_rs\r
-       db 0c7h,0c0h,08bh       ;ret cc\r
+       db 0c7h,0c0h,o_RET      ;ret cc\r
        dw p_arg_cc\r
-       db 0c7h,0c7h,0b4h       ;rst\r
-       dw l1c98h\r
-       db 0ffh,0c9h,08bh       ;ret\r
-       dw l1c97h\r
-       db 0cfh,0c1h,081h       ;pop rr\r
+       db 0c7h,0c7h,o_RST      ;rst\r
+       dw p_arg_rst\r
+       db 0cfh,0c1h,o_POP      ;pop rr\r
        dw p_arg_zz\r
-       db 0cfh,0c5h,084h       ;push rr\r
+       db 0cfh,0c5h,o_PUSH     ;push rr\r
        dw p_arg_zz\r
-       db 0ffh,0e3h,034h       ;ex (sp),hl\r
+       db 0ffh,0e3h,o_EX       ;ex (sp),hl\r
        dw l1ca0h\r
-       db 0ffh,0e9h,052h       ;jp (hl)\r
+       db 0ffh,0e9h,o_JP       ;jp (hl)\r
        dw l1caeh\r
-       db 0ffh,0ebh,034h       ;ex de,hl\r
+       db 0ffh,0ebh,o_EX       ;ex de,hl\r
        dw p_arg_ex_dehl\r
-       db 0ffh,0f9h,056h       ;ld sp,hl\r
+       db 0ffh,0f9h,o_LD       ;ld sp,hl\r
        dw l1cc1h\r
-       db 0cfh,003h,041h       ;inc rr\r
+       db 0cfh,003h,o_INC      ;inc rr\r
        dw p_arg_ww\r
-       db 0cfh,00bh,029h       ;dec rr\r
+       db 0cfh,00bh,o_DEC      ;dec rr\r
        dw p_arg_ww\r
-       db 0c7h,004h,041h       ;inc r\r
+       db 0c7h,004h,o_INC      ;inc r\r
        dw p_arg_r\r
-       db 0c7h,005h,029h       ;dec r\r
+       db 0c7h,005h,o_DEC      ;dec r\r
        dw p_arg_r\r
-       db 0ffh,008h,034h       ;ex af,af'\r
+       db 0ffh,008h,o_EX       ;ex af,af'\r
        dw p_arg_ex_afaf\r
-       db 0cfh,009h,003h       ;add hl,rr\r
+       db 0cfh,009h,o_ADD      ;add hl,rr\r
        dw l1cd3h\r
-       db 0efh,002h,056h       ;ld (rr),a ;rr=bc,de\r
+       db 0efh,002h,o_LD       ;ld (rr),a ;rr=bc,de\r
        dw l1cdch\r
-       db 0efh,00ah,056h       ;ld a,(rr) ;rr=bc,de\r
+       db 0efh,00ah,o_LD       ;ld a,(rr) ;rr=bc,de\r
        dw l1ce5h\r
        db 0\r
 \r
 ; 2 byte opdodes\r
 b_1b54_start:\r
-       db 0c7h,006h,056h       ;ld r,nn\r
+       db 0c7h,006h,o_LD       ;ld r,nn\r
        dw l1cfah\r
-       db 0ffh,0c6h,003h       ;add a,nn\r
+       db 0ffh,0c6h,o_ADD      ;add a,nn\r
        dw l1cf5h\r
-       db 0ffh,0ceh,000h       ;adc a,nn\r
+       db 0ffh,0ceh,o_ADC      ;adc a,nn\r
        dw l1cf5h\r
-       db 0ffh,0d6h,0c9h       ;sub a,nn\r
+       db 0ffh,0d6h,o_SUB      ;sub nn\r
        dw l1d09h\r
-       db 0ffh,0deh,0b7h       ;sbc a,nn\r
+       db 0ffh,0deh,o_SBC      ;sbc a,nn\r
        dw l1cf5h\r
-       db 0ffh,0e6h,006h       ;and a,nn\r
+       db 0ffh,0e6h,o_AND      ;and nn\r
        dw l1d09h\r
-       db 0ffh,0eeh,0cch       ;xor nn\r
+       db 0ffh,0eeh,o_XOR      ;xor nn\r
        dw l1d09h\r
-       db 0ffh,0f6h,06ch       ;or nn\r
+       db 0ffh,0f6h,o_OR       ;or nn\r
        dw l1d09h\r
-       db 0ffh,0feh,013h       ;cp a,nn\r
+       db 0ffh,0feh,o_CP       ;cp nn\r
        dw l1d09h\r
-       db 0ffh,010h,02eh       ;djnz\r
+       db 0ffh,010h,o_DJNZ     ;djnz\r
        dw p_arg_jrel\r
-       db 0ffh,018h,054h       ;jr\r
+       db 0ffh,018h,o_JR       ;jr\r
        dw p_arg_jrel\r
-       db 0e7h,020h,054h       ;jr cc,\r
+       db 0e7h,020h,o_JR       ;jr cc,\r
        dw p_arg_cc_jrel\r
-       db 0ffh,0d3h,076h       ;out (nn),a\r
+       db 0ffh,0d3h,o_OUT      ;out (nn),a\r
        dw l1d37h\r
-       db 0ffh,0dbh,03fh       ;in a,(nn)\r
+       db 0ffh,0dbh,o_IN       ;in a,(nn)\r
        dw l1d29h\r
        db 0\r
 \r
 ; 3 byte opcodes\r
 b_1b9b_start:\r
-       db 0c7h,0c2h,052h       ;jp cc,mn\r
+       db 0c7h,0c2h,o_JP       ;jp cc,mn\r
        dw p_arg_cc_mn\r
-       db 0c7h,0c4h,00ch       ;call cc,mn\r
+       db 0c7h,0c4h,o_CALL     ;call cc,mn\r
        dw p_arg_cc_mn\r
-       db 0cfh,001h,056h       ;ld ww,mn\r
+       db 0cfh,001h,o_LD       ;ld ww,mn\r
        dw p_arg_ww_mn\r
-       db 0ffh,0c3h,052h       ;jp mn\r
+       db 0ffh,0c3h,o_JP       ;jp mn\r
        dw p_arg_mn\r
-       db 0ffh,0cdh,00ch       ;call mn\r
+       db 0ffh,0cdh,o_CALL     ;call mn\r
        dw p_arg_mn\r
-       db 0ffh,022h,056h       ;ld (mn),hl\r
+       db 0ffh,022h,o_LD       ;ld (mn),hl\r
        dw p_arg_addr_hl\r
-       db 0ffh,02ah,056h       ;ld hl,(mn)\r
+       db 0ffh,02ah,o_LD       ;ld hl,(mn)\r
        dw p_arg_hl_addr\r
-       db 0ffh,032h,056h       ;ld (mn),a\r
+       db 0ffh,032h,o_LD       ;ld (mn),a\r
        dw p_arg_addr_a\r
-       db 0ffh,03ah,056h       ;ld a,(mn)\r
+       db 0ffh,03ah,o_LD       ;ld a,(mn)\r
        dw p_arg_a_addr\r
        db 0\r
 \r
 ; Prefix ED + 1 byte opcode, no arguments\r
 ; Format: opcode, t_MNEMONICS index\r
 b_1bc9_start:\r
-       db 044h,066h            ;neg\r
-       db 045h,092h            ;retn\r
-       db 04dh,08eh            ;reti\r
-       db 067h,0b1h            ;rrd\r
-       db 06fh,0a2h            ;rld\r
-       db 0a0h,05fh            ;ldi\r
-       db 0a1h,01ch            ;cpi\r
-       db 0a2h,04bh            ;ini\r
-       db 0a3h,07dh            ;outi\r
-       db 0a8h,058h            ;ldd\r
-       db 0a9h,015h            ;cpd\r
-       db 0aah,044h            ;ind\r
-       db 0abh,079h            ;outd\r
-       db 0b0h,062h            ;ldir\r
-       db 0b1h,01fh            ;cpir\r
-       db 0b2h,04eh            ;inir\r
-       db 0b3h,072h            ;otir\r
-       db 0b8h,05bh            ;lddr\r
-       db 0b9h,018h            ;cpdr\r
-       db 0bah,047h            ;indr\r
-       db 0bbh,06eh            ;otdr\r
-       db 08bh,0d5h            ;otdm\r
-       db 09bh,0d9h            ;otdmr\r
-       db 083h,0deh            ;otim\r
-       db 093h,0e2h            ;otimr\r
-       db 076h,0ebh            ;slp\r
+       db 044h,o_NEG           ;neg\r
+       db 045h,o_RETN          ;retn\r
+       db 04dh,o_RETI          ;reti\r
+       db 067h,o_RRD           ;rrd\r
+       db 06fh,o_RLD           ;rld\r
+       db 0a0h,o_LDI           ;ldi\r
+       db 0a1h,o_CPI           ;cpi\r
+       db 0a2h,o_INI           ;ini\r
+       db 0a3h,o_OUTI          ;outi\r
+       db 0a8h,o_LDD           ;ldd\r
+       db 0a9h,o_CPD           ;cpd\r
+       db 0aah,o_IND           ;ind\r
+       db 0abh,o_OUTD          ;outd\r
+       db 0b0h,o_LDIR          ;ldir\r
+       db 0b1h,o_CPIR          ;cpir\r
+       db 0b2h,o_INIR          ;inir\r
+       db 0b3h,o_OTIR          ;otir\r
+       db 0b8h,o_LDDR          ;lddr\r
+       db 0b9h,o_CPDR          ;cpdr\r
+       db 0bah,o_INDR          ;indr\r
+       db 0bbh,o_OTDR          ;otdr\r
+       db 08bh,o_OTDM          ;otdm\r
+       db 09bh,o_OTDMR         ;otdmr\r
+       db 083h,o_OTDM          ;otim\r
+       db 093h,o_OTDMR         ;otimr\r
+       db 076h,o_SLP           ;slp\r
        db 0ffh                 ;<end mark>\r
 \r
 b_1bf4_start:\r
-       db 0e7h,040h,03fh       ;in r,(c) ;r=b,c,d,e\r
+       db 0ffh,070h,0ffh       ;in (c)    ;\r
        dw p_arg_in_c           ;\r
-       db 0f7h,060h,03fh       ;in r,(c) ;r=h,l\r
+       db 0c7h,040h,o_IN       ;in r,(c)  ;r=b,c,d,e,h,l,a\r
        dw p_arg_in_c           ;\r
-       db 0ffh,078h,03fh       ;in r,(c) ;r=a\r
-       dw p_arg_in_c           ;\r
-       db 0e7h,041h,076h       ;out (c),r ;r=b,c,d,e\r
-       dw p_arg_out_c          ;\r
-       db 0f7h,061h,076h       ;out (c),r ;r=h,l\r
+       db 0ffh,071h,0ffh       ;out (c),0 ;\r
        dw p_arg_out_c          ;\r
-       db 0ffh,079h,076h       ;out (c),r ;r=a\r
+       db 0c7h,041h,o_OUT      ;out (c),r ;r=b,c,d,e,h,l,a\r
        dw p_arg_out_c          ;\r
-       db 0cfh,042h,0b7h       ;sbc hl,rr\r
+       db 0cfh,042h,o_SBC      ;sbc hl,rr\r
        dw l1dcah               ;\r
-       db 0cfh,04ah,000h       ;adc hl,rr\r
+       db 0cfh,04ah,o_ADC      ;adc hl,rr\r
        dw l1dcah               ;\r
-       db 0ffh,046h,03dh       ;im 0\r
+       db 0ffh,046h,o_IM       ;im 0\r
        dw l1d85h               ;\r
-       db 0ffh,056h,03dh       ;im 1\r
+       db 0ffh,056h,o_IM       ;im 1\r
        dw l1d89h               ;\r
-       db 0ffh,05eh,03dh       ;im 2\r
+       db 0ffh,05eh,o_IM       ;im 2\r
        dw l1d8dh               ;\r
-       db 0ffh,047h,056h       ;ld i,a\r
-       dw l1d92h               ;\r
-       db 0ffh,057h,056h       ;ld a,i\r
-       dw l1d97h               ;\r
-       db 0ffh,04fh,056h       ;ld r,a\r
-       dw l1d9ch               ;\r
-       db 0ffh,05fh,056h       ;ld a,r\r
-       dw l1da1h\r
-       db 0cfh,04ch,0d2h       ;mlt rr\r
+       db 0e7h,047h,o_LD       ;ld i,a ... ld a,r\r
+       dw p_arg_IR             ;\r
+       db 0cfh,04ch,o_MLT      ;mlt rr\r
        dw p_arg_ww\r
-       db 0c7h,004h,0eeh       ;tst r\r
+       db 0c7h,004h,o_TST      ;tst r\r
        dw p_arg_r\r
        db 0\r
 \r
 l228bh:\r
-       db 0e7h,000h,0cfh       ;in0 r,(m) ;r=b,c,d,e\r
+       db 0ffh,030h,0ffh       ;in0 (m)\r
        dw p_arg_r_m\r
-       db 0f7h,020h,0cfh       ;in0 r,(m) ;r=h,l\r
+       db 0c7h,000h,o_IN       ;in0 r,(m) ;r=b,c,d,e,h,l,a\r
        dw p_arg_r_m\r
-       db 0ffh,038h,0cfh       ;in0 a,(m)\r
-       dw p_arg_r_m\r
-       db 0e7h,001h,0e7h       ;out0 (m),r ;r=b,c,d,e\r
-       dw p_arg_m_r\r
-       db 0f7h,021h,0e7h       ;out0 (m),r ;r=h,l\r
+       db 0ffh,031h,0ffh       ;out0 (m),0\r
        dw p_arg_m_r\r
-       db 0ffh,039h,0e7h       ;out0 (m),a\r
+       db 0ech,001h,o_OUT0     ;out0 (m),r ;r=b,c,d,e\r
        dw p_arg_m_r\r
-       db 0ffh,064h,0eeh       ;tst m\r
+       db 0ffh,064h,o_TST      ;tst m\r
        dw l1d09h\r
-       db 0ffh,074h,0f1h       ;tstio m\r
+       db 0ffh,074h,o_TSTIO    ;tstio m\r
        dw l1d09h\r
        db 0\r
 \r
+; Prefix ED + 1 byte opcode + 2 byte address\r
+; Format: db mask, match, t_MNEMONICS-index\r
+;        dw argument formating function\r
 b_1c40_start:\r
-       db 0efh,043h,056h       ;ld (mn),ww     ;ww=bc,de\r
-       dw p_arg_addr_ww\r
-       db 0ffh,073h,056h       ;ld (mn),sp\r
+       db 0cfh,043h,o_LD       ;ld (mn),ww     ;ww=bc,de,hl,sp\r
        dw p_arg_addr_ww\r
-       db 0efh,04bh,056h       ;ld ww,(mn)     ;ww=bc,de\r
-       dw p_arg_ww_addr\r
-       db 0ffh,07bh,056h       ;ld sp,(mn)\r
+       db 0cfh,04bh,o_LD       ;ld ww,(mn)     ;ww=bc,de,hl,sp\r
        dw p_arg_ww_addr\r
        db 0\r
 \r
 ; CB\r
 b_1c55_start:\r
-       db 0f8h,000h,09bh       ;rlc g\r
+       db 0f8h,000h,o_RLC      ;rlc g\r
        dw l1e03h\r
-       db 0f8h,008h,0aah       ;rrc g\r
+       db 0f8h,008h,o_RRC      ;rrc g\r
        dw l1e03h\r
-       db 0f8h,010h,096h       ;rl g\r
+       db 0f8h,010h,o_RL       ;rl g\r
        dw l1e03h\r
-       db 0f8h,018h,0a5h       ;rr g\r
+       db 0f8h,018h,o_RR       ;rr g\r
        dw l1e03h\r
-       db 0f8h,020h,0c0h       ;sla g\r
+       db 0f8h,020h,o_SLA      ;sla g\r
        dw l1e03h\r
-       db 0f8h,028h,0c3h       ;sra g\r
+       db 0f8h,028h,o_SRA      ;sra g\r
        dw l1e03h\r
-       db 0f8h,038h,0c6h       ;srl g\r
+       db 0f8h,038h,o_SRL      ;srl g\r
        dw l1e03h\r
-       db 0c0h,040h,009h       ;bit b,g\r
+       db 0c0h,040h,o_BIT      ;bit b,g\r
        dw p_arg_bitop\r
-       db 0c0h,080h,088h       ;res b,g\r
+       db 0c0h,080h,o_RES      ;res b,g\r
        dw p_arg_bitop\r
-       db 0c0h,0c0h,0bdh       ;set b,g\r
+       db 0c0h,0c0h,o_SET      ;set b,g\r
        dw p_arg_bitop\r
        db 0\r
 \r
@@ -3483,8 +2944,6 @@ p_arg_r_r:
 p_arg_a_r:\r
        call p_A_comma\r
        jp p_arg_rs\r
-l1c97h:\r
-       ret\r
 \r
 p_arg_r_m:\r
        call p_arg_r\r
@@ -3496,7 +2955,7 @@ p_arg_m_r:
        call p_char_comma\r
        jp p_arg_r\r
 \r
-l1c98h:\r
+p_arg_rst:\r
        ld a,(iy+000h)\r
        and 038h\r
        jp out_hex\r
@@ -3512,8 +2971,10 @@ l1caeh:
        jr out_rparen\r
 \r
 p_arg_ex_dehl:\r
-       ld hl,l1773h\r
-       jp pstr\r
+       call pstr_inl\r
+       DC      'DE,HL'\r
+p_arg_none:\r
+       ret\r
 \r
 l1cc1h:\r
        call pstr_inl\r
@@ -3521,8 +2982,9 @@ l1cc1h:
        jp p_arg_hlixiy\r
 \r
 p_arg_ex_afaf:\r
-       ld hl,b_176d_start\r
-       jp pstr\r
+       call pstr_inl\r
+       DC      'AF,AF'''\r
+       ret\r
 \r
 l1cd3h:\r
        call p_arg_hlixiy\r
@@ -3645,28 +3107,21 @@ p_char_lparen:
        ld a,'('\r
        jp outchar\r
 \r
-l1d92h:\r
-       ld hl,b_1da7_start\r
-       jr l1da4h\r
-l1d97h:\r
-       ld hl,l1daah\r
-       jr l1da4h\r
-l1d9ch:\r
-       ld hl,l1dadh\r
-       jr l1da4h\r
-l1da1h:\r
-       ld hl,l1db0h\r
-l1da4h:\r
-       jp pstr\r
+p_arg_IR:\r
+       ld a,(iy+000h)\r
+       rra\r
+       rra\r
+       rra\r
+       and 03\r
+       ld hl,t_arg_IR\r
+       jp p_arg\r
 \r
-b_1da7_start:\r
+t_arg_IR:\r
        DC      'I,A'\r
-l1daah:\r
-       DC      'A,I'\r
-l1dadh:\r
        DC      'R,A'\r
-l1db0h:\r
+       DC      'A,I'\r
        DC      'A,R'\r
+       db      0\r
 \r
 p_arg_in_c:\r
        call p_arg_r\r
@@ -3747,18 +3202,15 @@ p_arg_rs:
 p_arg_r0:\r
        and 007h\r
        cp 006h\r
-       jr nz,p_arg_r1\r
+       ld b,a\r
+       ld hl,t_BCDEHL_HL_A\r
+       jr nz,p_arg0\r
        ld a,(isprefix_ixiy)\r
        and a\r
-       ld a,006h\r
-       jr z,p_arg_r1\r
-       ld hl,b_1e78_start\r
-       ld a,(isprefix_ixiy)\r
+       jr z,p_arg0\r
+       ld hl,t_lp_IXIY\r
        dec a\r
-       jr z,l1e4dh\r
-       ld hl,l1e7bh\r
-l1e4dh:\r
-       call pstr\r
+       call p_arg\r
        ld a,(iy+001h)\r
        push af\r
        rlca\r
@@ -3773,19 +3225,15 @@ l1e61h:
        pop af\r
        jp p_arg_nn_rp\r
 \r
-p_arg_r1:\r
-       ld hl,t_BCDEHL_HL_A\r
-       jr p_arg\r
-\r
-b_1e78_start:\r
+t_lp_IXIY:\r
        DC      '(IX'\r
-l1e7bh:\r
        DC      '(IY'\r
 \r
 p_arg_hlixiy:\r
        ld a,(isprefix_ixiy)\r
        ld hl,t_HL.IX.IY\r
        jr p_arg\r
+\r
 p_arg_zz:\r
        ld hl,t_BC.DE.HL.AF\r
        jr l1e8eh\r
@@ -3812,89 +3260,131 @@ p_arg_cc0:
        ld hl,t_tstfl_ZCPS\r
 p_arg:\r
        ld b,a\r
-       call sel_dc_string\r
-       jp pstr\r
+p_arg0:\r
+       jp pstr_sel\r
+\r
+if 0\r
+p_bli:\r
+       ld a,(iy+000h)\r
+       rra\r
+       and 00ch\r
+       ld b,a\r
+       ld a,(iy+000h)\r
+       and 003h\r
+       or b\r
+       ld hl,t_mn_bli\r
+       jr p_arg\r
+endif\r
 \r
 ;-------------------------------------------------------------------------------\r
 \r
+opc_index      defl    0\r
+opc_offset     defl    0\r
+\r
+opc    macro   x\r
+       local   pos\r
+pos    defl    $\r
+i_&x   equ     opc_index\r
+o_&x   equ     opc_offset\r
+       dc      '&x'\r
+opc_index      defl    opc_index+1\r
+opc_offset     defl    opc_offset+$-pos\r
+       endm\r
+\r
+\r
 t_MNEMONICS:\r
-       DC      'ADC'\r
-       DC      'ADD'\r
-       DC      'AND'\r
-       DC      'BIT'\r
-       DC      'CALL'\r
-       DC      'CCF'\r
-       DC      'CP'\r
-       DC      'CPD'\r
-       DC      'CPDR'\r
-       DC      'CPI'\r
-       DC      'CPIR'\r
-       DC      'CPL'\r
-       DC      'DAA'\r
-       DC      'DEC'\r
-       DC      'DI'\r
-       DC      'DJNZ'\r
-       DC      'EI'\r
-       DC      'EX'\r
-       DC      'EXX'\r
-       DC      'HALT'\r
-       DC      'IM'\r
-       DC      'IN'\r
-       DC      'INC'\r
-       DC      'IND'\r
-       DC      'INDR'\r
-       DC      'INI'\r
-       DC      'INIR'\r
-       DC      'JP'\r
-       DC      'JR'\r
-       DC      'LD'\r
-       DC      'LDD'\r
-       DC      'LDDR'\r
-       DC      'LDI'\r
-       DC      'LDIR'\r
-       DC      'NEG'\r
-       DC      'NOP'\r
-       DC      'OR'\r
-       DC      'OTDR'\r
-       DC      'OTIR'\r
-       DC      'OUT'\r
-       DC      'OUTD'\r
-       DC      'OUTI'\r
-       DC      'POP'\r
-       DC      'PUSH'\r
-       DC      'RES'\r
-       DC      'RET'\r
-       DC      'RETI'\r
-       DC      'RETN'\r
-       DC      'RL'\r
-       DC      'RLA'\r
-       DC      'RLC'\r
-       DC      'RLCA'\r
-       DC      'RLD'\r
-       DC      'RR'\r
-       DC      'RRA'\r
-       DC      'RRC'\r
-       DC      'RRCA'\r
-       DC      'RRD'\r
-       DC      'RST'\r
-       DC      'SBC'\r
-       DC      'SCF'\r
-       DC      'SET'\r
-       DC      'SLA'\r
-       DC      'SRA'\r
-       DC      'SRL'\r
-       DC      'SUB'\r
-       DC      'XOR'\r
-       DC      'IN0'\r
-       DC      'MLT'\r
-       DC      'OTDM'\r
-       DC      'OTDMR'\r
-       DC      'OTIM'\r
-       DC      'OTIMR'\r
-       DC      'OUT0'\r
-       DC      'SLP'\r
-       DC      'TST'\r
-       DC      'TSTIO'\r
+; 1-byte other\r
+       opc NOP\r
+       opc LD\r
+       opc INC\r
+       opc DEC\r
+       opc DJNZ\r
+       opc JR\r
+       opc HALT\r
+\r
+       opc RLCA\r
+       opc RRCA\r
+       opc RLA\r
+       opc RRA\r
+       opc DAA\r
+       opc CPL\r
+       opc SCF\r
+       opc CCF\r
+\r
+; 1-byte "alu"\r
+       opc ADD\r
+       opc ADC\r
+       opc SUB\r
+       opc SBC\r
+       opc AND\r
+       opc XOR\r
+       opc OR\r
+       opc CP\r
+\r
+       opc RET\r
+       opc POP\r
+       opc JP\r
+       opc CALL\r
+       opc PUSH\r
+       opc RST\r
+       opc OUT\r
+       opc EXX\r
+       opc IN\r
+       opc EX\r
+       opc DI\r
+       opc EI\r
+; CB\r
+       opc RLC\r
+       opc RRC\r
+       opc RL\r
+       opc RR\r
+       opc SLA\r
+       opc SRA\r
+;          SLL\r
+       opc SRL\r
+       opc BIT\r
+       opc RES\r
+       opc SET\r
+\r
+; ED\r
+       opc NEG\r
+       opc RETN\r
+       opc RETI\r
+       opc IM\r
+       opc RRD\r
+       opc RLD\r
+\r
+;Block instructions\r
+t_mn_bli:\r
+       opc LDI\r
+       opc CPI\r
+       opc INI\r
+       opc OUTI\r
+       opc LDD\r
+       opc CPD\r
+       opc IND\r
+       opc OUTD\r
+       opc LDIR\r
+       opc CPIR\r
+       opc INIR\r
+       opc OTIR\r
+       opc LDDR\r
+       opc CPDR\r
+       opc INDR\r
+       opc OTDR\r
+\r
+;Z180\r
+       opc IN0\r
+       opc OUT0\r
+       opc TST\r
+       opc MLT\r
+       opc TSTIO\r
+       opc SLP\r
+       opc OTIM\r
+       opc OTDM\r
+       opc OTIMR\r
+       opc OTDMR\r
+\r
        DB      0\r
 \r
 t_BCDEHL_HL_A:\r
@@ -3916,13 +3406,11 @@ t_BC.DE.HL.SP:
 t_BC.DE.HL.AF:\r
        DC      'BC'\r
        DC      'DE'\r
-\r
        DC      'HL'\r
        DC      'AF'\r
        DB      0\r
 t_HL.IX.IY:\r
        DC      'HL'\r
-\r
        DC      'IX'\r
        DC      'IY'\r
        DB      0\r
@@ -3935,12 +3423,6 @@ t_tstfl_ZCPS:
        DC      'PE'\r
        DC      'P'\r
        DC      'M'\r
-       DC      'NE'\r
-       DC      'EQ'\r
-       DC      'GE'\r
-       DC      'LT'\r
-       DC      'NV'\r
-       DC      'V'\r
        DB      0\r
 t__C_:\r
        DC      '(C)'\r
@@ -3956,7 +3438,7 @@ tc_set_bp:
        ld de,BDOS\r
        and a\r
        sbc hl,de\r
-       ld hl,l20edh\r
+       ld hl,l20edh            ;set break after BDOS call\r
        jr z,l2031h\r
        ld iy,(reg.pc)\r
        call disas_get_instrlen\r
@@ -3967,7 +3449,7 @@ tc_set_bp:
        add hl,bc\r
        call bp_trace_enter\r
        ld iy,(reg.pc)\r
-       ld hl,b_2039_start\r
+       ld hl,t_op_branch\r
        call lookup_opc\r
        ccf\r
        ret c\r
@@ -3981,36 +3463,35 @@ l2037h:
 \r
 ;-------------------------------------------------------------------------------\r
 \r
-b_2039_start:\r
-       db 0ffh,0ddh,000h       ;Prefix DD\r
+t_op_branch:\r
+       db 0ffh,0ddh,0          ;Prefix DD\r
        dw l20a7h\r
-       db 0ffh,0fdh,000h       ;Prefix FD\r
+       db 0ffh,0fdh,0          ;Prefix FD\r
        dw l20ach\r
-       db 0ffh,0edh,000h       ;Prefix ED\r
+       db 0ffh,0edh,0          ;Prefix ED\r
        dw l20b8h\r
-\r
-b_2048_start:\r
-       db 0ffh,0cdh,000h       ;call mn\r
+t_op_branch0:\r
+       db 0ffh,0cdh,0          ;call mn\r
        dw l2080h\r
-       db 0ffh,0c3h,000h       ;jp mn\r
+       db 0ffh,0c3h,0          ;jp mn\r
        dw l208bh\r
-       db 0ffh,0e9h,000h       ;jp ()\r
+       db 0ffh,0e9h,0          ;jp ()\r
        dw l20a2h\r
-       db 0ffh,0c9h,000h       ;ret\r
+       db 0ffh,0c9h,0          ;ret\r
        dw l20dch\r
-       db 0ffh,0cfh,000h       ;rst 8\r
+       db 0ffh,0cfh,0          ;rst 8\r
        dw l2115h\r
-       db 0c7h,0c7h,000h       ;rst n\r
+       db 0c7h,0c7h,0          ;rst n\r
        dw l20f9h\r
-       db 0c7h,0c4h,000h       ;call cc,mn\r
+       db 0c7h,0c4h,0          ;call cc,mn\r
        dw l2080h\r
-       db 0f7h,010h,000h       ;djnz d; jr d\r
+       db 0f7h,010h,0          ;djnz d; jr d\r
        dw l2093h\r
-       db 0e7h,020h,000h       ;jr cc,d\r
+       db 0e7h,020h,0          ;jr cc,d\r
        dw l2093h\r
-       db 0c7h,0c2h,000h       ;jp cc,mn\r
+       db 0c7h,0c2h,0          ;jp cc,mn\r
        dw l208bh\r
-       db 0c7h,0c0h,000h       ;ret cc\r
+       db 0c7h,0c0h,0          ;ret cc\r
        dw l20c5h\r
        db 0\r
 \r
@@ -4087,7 +3568,7 @@ l20d7h:
 \r
 l20dch:\r
 l20edh:\r
-       ld hl,(reg_sp)\r
+       ld hl,(reg_sp)          ;break on return address\r
        ld e,(hl)\r
        inc hl\r
        ld d,(hl)\r
@@ -4108,7 +3589,6 @@ l20f9h:
        ld a,(b_21e2_start)\r
        and a\r
        ret z\r
-\r
        scf\r
        ret\r
 \r
@@ -4271,15 +3751,9 @@ last_O_addr:
 last_O_val:\r
        db      0\r
 \r
-cmd_Q_jopt:\r
-       db      -1\r
-\r
 last_D:\r
        dw      TPA\r
 \r
-cmdR_rindex:\r
-       db      0\r
-\r
 high_load:\r
        dw      TPA\r
 max_load:\r
@@ -4297,9 +3771,6 @@ disas_argtype:
 pbl_loop_adr:\r
        dw      0\r
 \r
-cur_fcb:\r
-       dw      0\r
-\r
 ddtz_size      equ     $-ddtz_base\r
 ddtz_end:\r
 \r