X-Git-Url: http://cloudbase.mooo.com/gitweb/ddt180.git/blobdiff_plain/0716e83405615829229aaf71eafe57a37068dab6..d0ff7c76b85c1d1f7e76672462c0ba85861ab9b3:/ddt180.z80 diff --git a/ddt180.z80 b/ddt180.z80 index 079ef7e..da5cfe6 100644 --- a/ddt180.z80 +++ b/ddt180.z80 @@ -9,12 +9,12 @@ ;------------------------------------------------------------------------------- ; Relocation loader ; - TPA equ 0100h cseg .phase TPA jp start + ds 3 ldr_end: ldr_size equ $ - TPA @@ -58,12 +58,11 @@ BDOS_SETDMA equ 26 ;Set DMA Address ; ddtz specific definitions -STACK_SIZE equ 64 ;ddtz internal stack +STACK_SIZE equ 80 ;ddtz internal stack CONBUF_SIZE equ 80 ;Size of console input buffer EXPR_BUF_SIZE equ 128 ;expressen buffer for conditional breakpoints BP_CNT equ 12 ;Number of breakpoints BP_SIZE equ 8 ;Size of a breakpoint record -YREG_CNT equ 10 ;Number of Y registers (0..9) ;------------------------------------------------------------------------------- @@ -71,7 +70,7 @@ ddtz_base: jp ddtz_bdos l0003h: rst 30h -sub_0004h: +di_or_ei: nop ret ddtz_bdos: @@ -80,8 +79,11 @@ ddtz_bdos: current_cseg defl $ - current_cseg .phase current_phase + current_cseg signon: - db 'DDT/180',TAB - db '[8101] 002',CR,LF,'$' + db 'DDTZ/180' + db ' - Version ' + maclib version.inc + defvers + db CR,LF,'$' msgz80: db 'Z80 or better required!',cr,lf,'$' @@ -116,22 +118,20 @@ reg_sp: dw TPA reg.iff: db 0f3h db 0c3h -REG.PC: dw TPA -l0062h: dw 0000h -offs.@: dw 0 +reg.pc: dw TPA +var.$: dw 0000h -CMD_ERR:dw l0146h cmd_rpt:dw mainloop +;------------------------------------------------------------------------------- + conbuf: db CONBUF_SIZE ld sp,stack exx ld de,ddtz_base - or a - sbc hl,de - add hl,de + call cp_hl_de jr c,l0079h ex de,hl l0079h: @@ -153,11 +153,10 @@ l007ch: ld a,0fbh l0093h: ld (reg.iff),a - call sub_0004h + call di_or_ei ld hl,ddtz_base ld l,000h ld (reg_sp),hl - call cpy_fcb2 ld a,(dfcb1+1) cp ' ' ld hl,0 @@ -166,15 +165,50 @@ l0093h: ds CONBUF_SIZE + 3 - ($ - conbuf) +;------------------------------------------------------------------------------- + +CMDTAB: + dw ERROR ;cmd_@ ;examine/substitute the displacement register @ + dw ERROR ;cmd_A ;Assemble + dw cmd_B ;Breakpoints display/set/clear + dw cmd_C ;trace over Calls + dw cmd_D ;Display memory in hex and ascii + dw ERROR ; + dw cmd_F ;specify Filename and command line + dw cmd_G ;Go + dw cmd_H ;compute Hex and other expressions + dw cmd_I ;Input a byte from port + dw ERROR ; + dw ERROR ; + dw cmd_L ;List disassembled code + dw cmd_M ;Move memory [and verify] + dw ERROR ; + dw cmd_O ;Output a byte to port + dw ERROR ; + dw cmd_Q ;Qery memory for byte string + dw cmd_R ;Read binary or hex file + dw cmd_S ;Substitute memory + dw cmd_T ;Trace + dw ERROR ; + dw cmd_V ;Verify (compare) two memory areas + dw cmd_W ;Write a file to disk + dw cmd_X ;eXamine [and substitute] registers + dw ERROR ;cmd_Y ;examine [and substitute] Y variables + dw cmd_Z ;Zap (fill) memory with a byte string + +ERROR: +p_msg_error: + call pstr_inl + dc '?',CR,LF + ;fall thru mainloop: ld sp,stack - ld hl,l0146h - ld (CMD_ERR),hl - ld hl,(REG.PC) - ld (l0062h),hl + ld hl,(reg.pc) + ld (var.$),hl call bp_clr_temporary ld hl,(cmd_rpt) ld de,mainloop + push de call cp_hl_de ld a,'>' call outchar @@ -183,7 +217,8 @@ mainloop: call get_line call skipbl jr z,exe_hl - ld hl,mainloop + pop hl + push hl ld (cmd_rpt),hl inc de sub '@' @@ -197,165 +232,43 @@ mainloop: inc hl ld h,(hl) ld l,a - jr exe_hl -ERROR: - ld hl,(CMD_ERR) -exe_hl: - call CALL_HL - jr mainloop -CMDTAB: - dw cmd_@ - dw cmd_A - dw cmd_B - dw cmd_C - dw cmd_D - dw ERROR - dw cmd_F - dw cmd_G - dw cmd_H - dw cmd_I - dw ERROR - dw ERROR - dw cmd_L - dw cmd_M - dw ERROR - dw cmd_O - dw ERROR - dw cmd_Q - dw cmd_R - dw cmd_S - dw cmd_T - dw ERROR - dw cmd_V - dw cmd_W - dw cmd_X - dw cmd_Y - dw cmd_Z - -l0146h: - ld a,'?' - call outchar - jp crlf -get_line: - push hl - ld de,conbuf - ld c,BDOS_CBUF - call ddtz_bdos - call crlf - ld de,conbuf+1 - ld a,(de) - ld b,a - ld c,0 - inc b -l0162h: - inc de - dec b - jr z,l0194h - ld a,(de) - bit 0,c - call z,toupper - ld (de),a - cp '''' - jr nz,l0162h - push de - dec de - ld a,(de) - cp '''' - jr z,l0190h - dec de - ld a,(de) - cp '^' - jr z,l0184h - dec de - ld a,(de) - cp '^' - jr nz,l0190h -l0184h: - inc de - push bc - call sub_0303h - pop bc - dec de - ld a,(de) - cp '''' - jr z,l0191h -l0190h: - inc c -l0191h: - pop de - jr l0162h -l0194h: - xor a - ld (de),a - ld de,conbuf+2 - pop hl - ret +exe_hl: + jp (hl) -toupper: - cp 'a' - ret c - cp 'z'+1 - ret nc - and 05fh - ret +;------------------------------------------------------------------------------- -out.hl.@: - call out_hl - push de - push hl - ld de,(offs.@) - ld a,d - or e - jr z,l01bfh - call outbl - ld a,'@' - call outchar - and a - sbc hl,de - call out_hl -l01bfh: - pop hl - pop de +crlf: + call pstr_inl + dc CR,LF + call inchar + ld a,0 + ld (con_col),a + jr c,mainloop ret -out.bin.w: - ld a,h - call out.bin.b - ld a,l -out.bin.b: - ld b,8 -l01c9h: - add a,a - push af - ld a,00 - adc a,a - call out_dgt - pop af - djnz l01c9h - ld a,'"' - jp outchar sub_01d9h: - ld a,'-' - call outchar + call pstr_inl + dc '-' dec hl jp cpl.hl out_hl_dec_neg: push hl call sub_01d9h - defb 03eh + defb 03eh ;ld a,.. swallow push hl out.hl.dec: push hl ld b,006h call sub_01f9h pop hl - ld a,'.' - call outchar + call pstr_inl + dc '.' l01f3h: call outbl djnz l01f3h ret + sub_01f9h: dec b push de @@ -390,49 +303,70 @@ out_hex: pop af out_dgt: - and 0fh - cp 10 - jr c,l0229h - add a,007h -l0229h: - add a,'0' + or 0f0h + daa + add a,0a0h + adc a,040h jr outchar -l022dh: - ld a,'-' - call outchar - ld a,040h + +out.bin.w: + ld a,h + call out.bin.b + ld a,l +out.bin.b: + ld b,8 +l01c9h: + rlca + push af + ld a,'0'/2 + adc a,a + call outchar + pop af + djnz l01c9h + ld a,'"' + jr outchar + out.ascii: - ex af,af' - call outquote - ex af,af' - push af + push bc + ld c,a res 7,a cp ' ' + push af + call nc,outbl + call outquote + pop af jr nc,l0242h sub 0c0h + ld b,a + call pstr_inl + dc '^' + ld a,b l0242h: call outchar - push af cp '''' call z,outchar - pop af - ex af,af' call outquote - pop af - or a + sla c + pop bc + ret nc ld a,'.' - call m,outchar - ex af,af' - jr c,l022dh - ret + jr outchar -p_char_lparen: - ld a,'(' +outbl6: + call outbl2 +outbl4: + call outbl2 +outbl2: + call outbl +outbl: + ld a,' ' jr outchar outquote: ld a,'''' outchar: + push ix + push iy push hl push de push bc @@ -447,9 +381,38 @@ outchar: pop bc pop de pop hl + pop iy + pop ix + ret + +pstr: + ld a,(hl) + inc hl + and a + ret z + call outchar + and a + ret m + jr pstr + +pstr_inl: + ex (sp),hl + call pstr + ex (sp),hl ret +p_goto_col: + ld a,(con_col) + cp c + ret nc + ret z + call outbl + jr p_goto_col + +;------------------------------------------------------------------------------- + inchar: + push ix push hl push de push bc @@ -464,60 +427,46 @@ l0284h: pop bc pop de pop hl + pop ix ret -pstr: - ld c,0 -l028ah: - ld a,(hl) - inc hl - and a - ret z - call outchar - inc c - and a - ret m - jr l028ah -pstr_inl: - ex (sp),hl - call pstr - ex (sp),hl +get_line: + push hl + ld de,conbuf + ld c,BDOS_CBUF + call ddtz_bdos + call crlf + ld hl,conbuf+1 + ld e,(hl) + xor a + ld d,a + inc hl + ex de,hl + add hl,de + ld (hl),a + pop hl ret -outbl6: - call outbl2 -outbl4: - call outbl2 -outbl2: - call outbl -outbl: - ld a,' ' - jr outchar -crlf: - call inchar - ld a,CR - call outchar - ld a,LF - call outchar - ld a,0 - ld (con_col),a - jp c,mainloop - ret +;------------------------------------------------------------------------------- -add_hl_a: - add a,l - ld l,a - ret nc - inc h +get_char_upper: + ld a,(de) +toupper: + cp 'a' + ret c + cp 'z'+1 + ccf + ret c + and 05fh ret +;------------------------------------------------------------------------------- + skipbl0: inc de skipbl: - ld a,(de) - cp ' ' - jr z,skipbl0 - cp TAB + call get_char_upper + call test_whitespace jr z,skipbl0 or a ret @@ -537,23 +486,35 @@ assert_eol: to_error: jp ERROR -chk_sp: +;------------------------------------------------------------------------------- + +chk_stack: push hl push de ld hl,0 add hl,sp - ld de,stack-40 + ld de,stack-(STACK_SIZE-28) call cp_hl_de pop de pop hl jr c,to_error ret +;------------------------------------------------------------------------------- + +add_hl_a: + add a,l + ld l,a + ret nc + inc h + ret + cp_hl_de: and a sbc hl,de add hl,de ret +;------------------------------------------------------------------------------- lookupch: ld b,0 @@ -561,7 +522,7 @@ l02f5h: ld a,(hl) and a ret z - ld a,(de) + call get_char_upper cp (hl) jr z,l0300h inc hl @@ -573,12 +534,8 @@ l0300h: ret sub_0303h: - ld hl,b_0cc3_start + ld hl,t_reg_names ld b,07fh - jr l030ch - -sub_030ah: - ld b,0ffh l030ch: inc b ld a,(hl) @@ -589,15 +546,11 @@ l030ch: res 7,b ret -sub_0318h: - push bc - res 7,b - defb 03eh sub_031ch: push bc push de l031eh: - ld a,(de) + call get_char_upper xor (hl) and 07fh jr nz,l0336h @@ -679,7 +632,7 @@ sub_0377h: jr l0366h b_037c_start: - defb 0e6h + defb 0e6h ;and a,.. clear carry get_arg_range: scf ex af,af' @@ -691,7 +644,7 @@ get_arg_range: jr c,error0 ex af,af' pop hl - defb 03eh + defb 03eh ;ld a,.. swallow pop af l038ch: pop af call get_range @@ -712,14 +665,14 @@ get_range: inc de l03a2h: push hl - push af + push af ;'S' flag call expr jr c,l03b8h ld b,h ld c,l pop af pop hl - jr z,l03b6h + jr z,l03b6h ;'S'? ld a,c sub l ld c,a @@ -733,11 +686,13 @@ l03b6h: l03b8h: pop af pop hl - jr z,error0 + jr z,error0 ;'S', but no expression following scf ret -expr: +;------------------------------------------------------------------------------- + +expr: call skipbl expr1: call do_subexpr @@ -756,6 +711,8 @@ expr1: pop de ret +;------------------------------------------------------------------------------- + do_op_eq: jr z,l03edh jr l03ech @@ -894,40 +851,33 @@ doop_mod: ; de: r (x%y) div_hl_de: - push bc - ex de,hl - ld b,h - ld c,l - ld hl,0 - ld a,16 + push bc + ex de,hl ;de: x + ld b,h ;bc: y + ld c,l + ld hl,0 ;hl: r + ld a,16 ; de: x (x shifted out, q shifted in) ; bc: y ; hl: r (initially 0) -l047eh: - push af - add hl,hl - ex de,hl - xor a - add hl,hl - ex de,hl - adc a,l - sub c - ld l,a - ld a,h - sbc a,b - ld h,a - inc de - jr nc,l048fh - add hl,bc - dec de -l048fh: - pop af - dec a - jr nz,l047eh - ex de,hl - pop bc +div_lp: + ex de,hl + add hl,hl ;x <<= 1 + ex de,hl + adc hl,hl ;r <<= 1 + inc de + or a + sbc hl,bc + jr nc,div_norestore + dec de + add hl,bc +div_norestore: + dec a + jr nz,div_lp + ex de,hl + pop bc ret doop_and: @@ -985,13 +935,15 @@ tblf_opa: dw doop_xor dw 0 +;------------------------------------------------------------------------------- + fact_factor: call do_factor ret nc jp ERROR do_factor: - call chk_sp + call chk_stack call get.number ret nc inc de @@ -1007,12 +959,12 @@ do_factor: ld hl,TPA cp 'L' ret z - ld hl,(offs.@) - cp '@' - ret z - ld hl,(l0062h) + ld hl,(var.$) cp '$' ret z + ld hl,ddtz_base + cp 'Z' + ret z cp '-' jr z,fact_factneg cp '~' @@ -1021,31 +973,17 @@ do_factor: jr z,fact_factor cp '^' jr z,fact_reg.CPU - cp 'Y' - jr z,fact_reg.Y cp '(' jr z,fact_mem cp '[' - jp z,expr_brckt + jr z,expr_brckt cp '''' jr z,fact_factstring dec de scf ret -fact_reg.Y: - call get.decdigit - jp c,ERROR - inc de - add a,a - ld hl,reg_Y - call add_hl_a - ld a,(hl) - inc hl - ld h,(hl) - ld l,a - and a - ret +;------------------------------------------------------------------------------- fact_factstring: ld hl,0 @@ -1074,7 +1012,7 @@ l0557h: fact_reg.CPU: call sub_0caeh - jr nc,error4 + jr nc,error1 ld a,(hl) inc hl ld h,(hl) @@ -1103,10 +1041,10 @@ fact_factinv: fact_mem: call expr1 - jr c,error4 + jr c,error1 ld a,(de) cp ')' - jr nz,error4 + jr nz,error1 inc de ld a,(hl) inc hl @@ -1123,14 +1061,16 @@ fact_mem: expr_brckt: call expr1 - jr c,error4 + jr c,error1 ld a,(de) cp ']' inc de ret z -error4: +error1: jp ERROR +;------------------------------------------------------------------------------- + get.number: call get.hexdigit ret c @@ -1174,7 +1114,7 @@ l05dbh: jr next_bindigit l05e4h: cp '"' - jp nz,ERROR + jr nz,error11 call get.bindigit jr nc,l05dbh or a @@ -1199,16 +1139,18 @@ next_decdigit: decnum_done: cp '.' ret z +error11: jp ERROR sub_060ch: - ld a,(de) - cp '[' + call get_char_upper + cp 'Z'+1 jr l0614h get.hexdigit: ld a,(de) hex_digit: + call toupper cp 'F'+1 l0614h: ccf @@ -1219,13 +1161,13 @@ l0614h: ret get.decdigit: - ld a,(de) + call get_char_upper l061eh: cp '9'+1 jr l0625h get.bindigit: - ld a,(de) + call get_char_upper cp '1'+1 l0625h: ccf @@ -1235,6 +1177,8 @@ l0625h: sub '0' ret +;------------------------------------------------------------------------------- + p_cpustat0: call assert_eol p_cpustat: @@ -1246,28 +1190,23 @@ p_cpustat: l063eh: call p_regs djnz l063eh + call outbl6 push hl push de - ld iy,(REG.PC) + ld iy,(reg.pc) call p_disas_instr - exx - ex af,af' + pop de + ex (sp),hl + push af call crlf call p_f2 call outbl2 - pop de - pop hl ld b,7 l065bh: call p_regs djnz l065bh - exx - ex af,af' - and a - jr z,l066bh - call outbl6 - call p_offset -l066bh: + pop af + pop hl jp crlf p_f: @@ -1282,32 +1221,33 @@ p_f2: ld a,(reg.f2) call p_flags jp outbl + p_flags: - ld b,a - ld a,'S' - call sub_06aah - ld a,'Z' - call sub_06aah - rl b - ld a,'H' - call sub_06aah - rl b - ld a,'V' - call sub_06aah - ld a,'N' - call sub_06aah - ld a,'C' -sub_06aah: - rl b - jp c,outchar - jp outbl + push hl + ld hl,t_flag_names+7 + ld c,a + ld b,8 +fl_loop: + ld a,' ' + cp (hl) + ld a,c + rlca + ld c,a + jr z,fl_skip + ld a,(hl) + call c,outchar + call nc,outbl +fl_skip: + dec hl + djnz fl_loop + pop hl + ret p_regs: - push bc push de call pstr - ld a,'=' - call outchar + call pstr_inl + dc '=' ex (sp),hl ld e,(hl) inc hl @@ -1318,19 +1258,11 @@ p_regs: push hl and a jr z,l06deh - push af - ld a,(de) - ld l,a - inc de - ld a,(de) - ld h,a - pop af - dec a - jr z,l06d9h - call out.hl.@ - call z,outbl6 - jr l06e2h -l06d9h: + ex de,hl + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl call out_hl jr l06e2h l06deh: @@ -1340,7 +1272,6 @@ l06e2h: call outbl pop de pop hl - pop bc ret b_06e9_start: @@ -1370,7 +1301,7 @@ b_0709_start: db 001h dw reg_sp db 001h - dw REG.PC + dw reg.pc db 002h dw reg.a2 db 000h @@ -1388,63 +1319,102 @@ b_0709_start: db 000h db 000h +;------------------------------------------------------------------------------- +; > G [startaddr] [;breakp..] +; Go [to start] [with temporary breakpoints] + cmd_G: sub a ld (trace_call_flag),a - ld (l0941h),a + ld (bp_p_cpu_flag),a call expr jr c,l0740h - ld (REG.PC),hl + ld (reg.pc),hl l0740h: call skipbl - jp z,user_go + jr z,user_go0 cp ';' jp nz,ERROR inc de ld a,002h call bp_enter +user_go0: jp user_go +;------------------------------------------------------------------------------- + +bpl_init: + ld b,BP_CNT + ld ix,bp_tab + ex (sp),hl + ld (pbl_loop_adr),hl + ex (sp),hl + ret + +bpl_next: + ld de,BP_SIZE + push af + add ix,de + pop af + dec b + ret z + + ex (sp),hl + ld hl,(pbl_loop_adr) + ex (sp),hl + ret + bp_clr_temporary: - ld b,BP_CNT - ld ix,bp_tab -l075ah: + call bpl_init + ld a,(ix+000h) and 0f1h ld (ix+000h),a call bp_clr_condition - ld de,BP_SIZE - add ix,de - djnz l075ah + + call bpl_next ret +;------------------------------------------------------------------------------- +; > B +; display all breakpoints +; > B breakp [breakp..] +; set breakpoints +; > BX +; clear all breakpoints +; > BX address [address..] +; clear breakpoints +; +; where breakp is: +; [R] expression [I condition] + cmd_B: call skipbl - jr z,l07b7h + jr z,bp_print inc de cp 'X' - jr z,l077dh + jr z,bp_clr0 dec de ld a,001h jp bp_enter -l077dh: + +bp_clr0: call skipbl jr z,bp_clr_all -l0782h: +bp_clr_next: call expr jp c,assert_eol push de call bp_clr pop de call next_arg - jr l0782h + jr bp_clr_next bp_clr_all: scf bp_clr: - ld b,BP_CNT - ld ix,bp_tab -l0799h: + call bpl_init + push af jr c,l07a7h ld e,(ix+002h) @@ -1455,18 +1425,15 @@ l07a7h: ld (ix+000h),000h call bp_clr_condition l07aeh: - ld de,BP_SIZE - add ix,de pop af - djnz l0799h + call bpl_next ret -l07b7h: - ld b,BP_CNT - ld ix,bp_tab -l07bdh: +bp_print: + call bpl_init + bit 0,(ix+000h) - jr z,l0808h + jr z,bp_pr_cont ld a,'R' bit 4,(ix+000h) jr nz,l07cdh @@ -1476,10 +1443,9 @@ l07cdh: call outbl ld l,(ix+002h) ld h,(ix+003h) - call out.hl.@ - call outbl2 - ld a,':' - call outchar + call out_hl + call pstr_inl + dc ' :' ld l,(ix+004h) ld h,(ix+005h) call out_hl @@ -1489,18 +1455,16 @@ l07cdh: or l jr z,l0805h call outbl4 - ld a,'I' - call outchar - call outbl2 + call pstr_inl + dc 'I ' call pstr l0805h: call crlf -l0808h: - ld de,BP_SIZE - add ix,de - djnz l07bdh +bp_pr_cont: + call bpl_next ret +;------------------------------------------------------------------------------- ; Add break points to list ; A = 1 Permanent (B command) ; A = 2 Temporary (G command) @@ -1510,13 +1474,13 @@ bp_enter: call skipbl ret z cp 'R' - jr nz,l081ch + jr nz,bp_e_1 inc de set 4,b -l081ch: +bp_e_1: push bc call expr - jp c,ERROR + jr c,error12 pop bc bit 0,b push bc @@ -1541,17 +1505,14 @@ l081ch: jr bp_enter bp_get_freeslot: - ld b,BP_CNT - ld ix,bp_tab -l085ah: + call bpl_init + ld a,(ix+000h) and 00fh ret z - push bc - ld bc,BP_SIZE - add ix,bc - pop bc - djnz l085ah + + call bpl_next +error12 jp ERROR bp_get_count: @@ -1561,7 +1522,7 @@ bp_get_count: ret nz inc de call expr - jp c,ERROR + jr c,error12 ret bp_get_condition: @@ -1573,7 +1534,7 @@ bp_get_condition: call skipbl push de call expr - jp c,ERROR + jr c,error12 ex de,hl pop de push de @@ -1585,25 +1546,26 @@ bp_get_condition: add hl,bc ld de,expr_bufe call cp_hl_de - jp nc,ERROR - pop hl - ld (expr_p2),hl - pop de - ex de,hl + jr nc,error12 + pop de + pop hl + push de ldir - xor a - ld (de),a - inc de ex de,hl + ld (hl),c ; trailing 0 + inc hl ld (expr_p1),hl - ld hl,(expr_p2) + pop hl ret +;------------------------------------------------------------------------------- +; Breakpoint handling routine. + bpddtz: ld (reg.l),hl pop hl dec hl - ld (REG.PC),hl + ld (reg.pc),hl ld (reg_sp),sp ld sp,reg.l push de @@ -1612,13 +1574,13 @@ bpddtz: push ix push iy ld a,i - call sub_0004h + call di_or_ei ld h,a ld l,000h push hl - ld a,0f3h + ld a,0f3h ; EI jp po,l08dfh - ld a,0fbh + ld a,0fbh ; DI l08dfh: ld (reg.iff),a ex af,af' @@ -1627,18 +1589,18 @@ l08dfh: push bc push de push hl - call sub_097ah + call bp_restore_mem ld a,(b_21e2_start) dec a jr z,l090bh - call inchar - jr c,l0902h + call inchar ;Keyboard hit? + jr c,do_break ;yes call sub_0913h and a jp z,user_go and 083h jp z,l2151h -l0902h: +do_break: call bp_clr_temporary call p_cpustat jp mainloop @@ -1652,24 +1614,22 @@ sub_0913h: ld a,080h ex af,af' sub a - ld (l0941h),a - ld b,BP_CNT - ld ix,bp_tab -l0920h: + ld (bp_p_cpu_flag),a + call bpl_init + ld a,(ix+000h) and 007h jr z,l0938h ld e,(ix+002h) ld d,(ix+003h) - ld hl,(REG.PC) + ld hl,(reg.pc) call cp_hl_de push bc call z,sub_0942h pop bc l0938h: - ld de,BP_SIZE - add ix,de - djnz l0920h + + call bpl_next ex af,af' ret @@ -1698,7 +1658,7 @@ l0969h: bit 4,(ix+000h) ret z ld a,001h - ld (l0941h),a + ld (bp_p_cpu_flag),a ret l0974h: ex af,af' @@ -1706,10 +1666,9 @@ l0974h: ex af,af' ret -sub_097ah: - ld b,BP_CNT - ld ix,bp_tab -l0980h: +bp_restore_mem: + call bpl_init + bit 5,(ix+000h) res 5,(ix+000h) jr z,l099ah @@ -1722,32 +1681,28 @@ l0980h: ld (hl),a l099ah: res 3,(ix+000h) - ld de,BP_SIZE - add ix,de - djnz l0980h + + call bpl_next ret -sub_09a6h: - ld b,BP_CNT - ld ix,bp_tab -l09ach: +bp_tst_@pc: + call bpl_init + ld a,(ix+000h) and 003h - jr z,l09c0h + jr z,bp_tst_e ld e,(ix+002h) ld d,(ix+003h) - ld hl,(REG.PC) + ld hl,(reg.pc) call cp_hl_de ret z -l09c0h: - ld de,BP_SIZE - add ix,de - djnz l09ach +bp_tst_e: + call bpl_next sub a inc a ret -sub_09cah: +bp_trace_enter: call bp_get_freeslot ld (ix+004h),001h ld (ix+005h),000h @@ -1758,16 +1713,15 @@ sub_09cah: ld a,(b_21e2_start) and a ld a,008h - jr nz,l09edh - ld a,004h -l09edh: + jr nz,bp_t_e + rra +bp_t_e: ld (ix+000h),a ret -sub_09f1h: - ld b,BP_CNT - ld ix,bp_tab -l09f7h: +bp_set_to_mem: + call bpl_init + ld a,(ix+000h) and c jr z,l0a1dh @@ -1788,26 +1742,27 @@ l09f7h: inc hl ld (hl),d l0a1dh: - ld de,BP_SIZE - add ix,de - djnz l09f7h + + call bpl_next ret +;------------------------------------------------------------------------------- + user_go: sub a ld (b_21e2_start),a - ld a,(l0941h) + ld a,(bp_p_cpu_flag) and a call nz,p_cpustat - call sub_09a6h + call bp_tst_@pc ld c,007h jr nz,l0a41h ld a,001h ld (b_21e2_start),a - call sub_1ffeh + call tc_set_bp ld c,008h l0a41h: - call sub_09f1h + call bp_set_to_mem ld sp,reg.l2 pop hl pop de @@ -1826,6 +1781,8 @@ l0a41h: ld sp,(reg_sp) jp reg.iff +;------------------------------------------------------------------------------- + bp_clr_condition: ld a,(ix+000h) and 003h @@ -1878,45 +1835,20 @@ l0ab0h: ld (iy+007h),d ret -cmd_Y: - call get.decdigit - jr c,l0bc3h - inc de - push af - call assert_eol - pop af - call sub_0bdch - jp l0c15h -l0bc3h: - call assert_eol - xor a -l0bc7h: - push af - call sub_0bdch - call outbl4 - pop af - inc a - bit 0,a - push af - call z,crlf - pop af - cp YREG_CNT - jr c,l0bc7h - ret +;------------------------------------------------------------------------------- +; > Y +; examine all Y variables +; > Y[0..9] +; examine (and substitute) an Y variable + + +;------------------------------------------------------------------------------- +; > X +; eXamine (display) all cpu registers and +; the instruction at the current program counter +; > X register +; eXamine (and substitute) a register -sub_0bdch: - ld c,a - ld b,0 - add a,'0'+080h - ld de,msg_Y+1 - ld (de),a - dec de - ld hl,reg_Y - add hl,bc - add hl,bc - ex de,hl - ld c,003h - jp l0c33h cmd_X: call skipbl @@ -1931,11 +1863,11 @@ cmd_X: cp 01dh jp z,ERROR ex de,hl - ld hl,b_0cc3_start + ld hl,t_reg_names call sel_dc_string l0c12h: call l0c33h -l0c15h: + call outbl push de push bc @@ -1943,15 +1875,14 @@ l0c15h: call skipbl jr z,l0c30h call sub_0363h - ld b,h - ld c,l - pop af + ex de,hl + pop bc pop hl - ld (hl),c - bit 0,a + ld (hl),e + bit 0,c ret z inc hl - ld (hl),b + ld (hl),d ret l0c30h: pop af @@ -1959,21 +1890,18 @@ l0c30h: ret l0c33h: - ld b,c call pstr - ld a,'=' - call outchar + call pstr_inl + dc '=' ld a,(de) - bit 0,b + bit 0,c jp z,out_hex ld l,a inc de ld a,(de) dec de ld h,a - bit 1,b - jp z,out_hl - jp out.hl.@ + jp out_hl l0c4fh: call p_f @@ -1989,43 +1917,44 @@ l0c5fh: call sub_0c6ah ld (reg.f2),a ret + sub_0c6ah: - ex af,af' - ld b,000h + push af call outbl call assert_eol call get_line + pop af + ex af,af' + ld b,0 l0c76h: call skipbl ld a,b ret z push bc - ld hl,b_0ca4_start + ld hl,t_flag_names call lookupch jp nc,ERROR - ld a,b - cp 008h - jr z,l0c97h - pop bc - rlca - rlca - rlca - add a,0c0h - ld (l0c94h),a - defb 0cbh -l0c94h: - defb 0c0h + inc b + xor a + scf +nxt_f: + rla + djnz nxt_f + pop bc + jr c,l0c97h + or b + ld b,a jr l0c76h + l0c97h: ex af,af' jp nc,ERROR ex af,af' ld a,0fbh ld (reg.iff),a - pop bc jr l0c76h -b_0ca4_start: +t_flag_names: db 'CNV H ZSE',0 sub_0caeh: @@ -2045,7 +1974,7 @@ sub_0caeh: scf ret -b_0cc3_start: +t_reg_names: DC 'BC''' DC 'DE''' DC 'HL''' @@ -2128,7 +2057,7 @@ b_0cfa_start: db 003h dw reg_sp db 003h - dw REG.PC + dw reg.pc db 003h dw reg.ix db 003h @@ -2136,7 +2065,7 @@ b_0cfa_start: db 003h dw reg_sp db 003h - dw REG.PC + dw reg.pc db 000h dw reg.i db 003h @@ -2146,12 +2075,16 @@ b_0cfa_start: db 000h dw reg.f +;------------------------------------------------------------------------------- +; > S [startaddr] +; Substitute memory + cmd_S: ld hl,(last_S) call get_lastarg_def l0d60h: ld (last_S),hl - call out.hl.@ + call out_hl call outbl ld a,(hl) call out_hex @@ -2163,10 +2096,16 @@ l0d60h: dec hl inc de cp '.' + jr nz,cmds_dash + call get_char_upper + or a + jr nz,l0d8ah + ret +cmds_dash: jp z,assert_eol cp '-' jr nz,l0d8ah - ld a,(de) + call get_char_upper or a dec hl jr z,l0d60h @@ -2176,18 +2115,17 @@ l0d8ah: call sub_0ef8h jr l0d60h -cmd_@: - call assert_eol - ld hl,msg_offset - ld de,offs.@ - ld c,001h - jp l0c12h +;------------------------------------------------------------------------------- +; > @ +; examine (substitute) displacement register @ -msg_offset: - dc '@' +;cmd_@: + +;------------------------------------------------------------------------------- +; >>I [port] +; Input a byte from port cmd_I: - ld hl,cmd_I ld (cmd_rpt),hl ld hl,(last_I) call get_lastarg_def @@ -2202,8 +2140,11 @@ cmd_I: call out.bin.b jp crlf +;------------------------------------------------------------------------------- +; >>O [byte] [port] +; Output a byte to a port + cmd_O: - ld hl,cmd_O ld (cmd_rpt),hl ld hl,(last_O_val) call get_arg_def @@ -2220,6 +2161,10 @@ cmd_O: out (c),a ret +;------------------------------------------------------------------------------- +; > Vstartaddr endaddr targetaddr +; Verify (compare) two memory areas + cmd_V: call sub_034eh l0dedh: @@ -2229,7 +2174,7 @@ l0dedh: cp b jr z,l0e10h ld c,a - call out.hl.@ + call out_hl call outbl ld a,b call out_hex @@ -2238,7 +2183,7 @@ l0dedh: call out_hex call outbl ex de,hl - call out.hl.@ + call out_hl ex de,hl call crlf l0e10h: @@ -2251,8 +2196,12 @@ l0e10h: jr nz,l0dedh ret +;------------------------------------------------------------------------------- +; > M[V] startaddr endaddr destaddr +; Move memory [and verify] + cmd_M: - ld a,(de) + call get_char_upper cp 'V' jr nz,l0e1fh inc de @@ -2263,7 +2212,7 @@ l0e1fh: push de push bc call cp_hl_de - jr nc,$+11 + jr nc,cmdm_up add hl,bc ex de,hl add hl,bc @@ -2271,7 +2220,9 @@ l0e1fh: dec hl dec de lddr - ld bc,0b0edh + db 01h ;swallow ldir instruction (ld bc,...) +cmdm_up: + ldir pop bc pop de pop hl @@ -2279,27 +2230,17 @@ l0e1fh: jr z,l0dedh ret +;------------------------------------------------------------------------------- +; > H +; display Highest load address of last filed loaded, Maximum "High" +; off all loaded files, and Top address of available memory +; > H expression +; evaluate expression and display result in hex, decimal and other formats + cmd_H: call expr jp c,p_max_high0 - call next_arg - push hl - call expr - push af call assert_eol - pop af - ex de,hl - pop hl - jr c,l0e5eh - push hl - push de - add hl,de - call l0e5eh - pop de - pop hl - and a - sbc hl,de -l0e5eh: call out_hl call outbl2 call out_hl_neg @@ -2314,8 +2255,12 @@ l0e5eh: call out.ascii jp crlf +;------------------------------------------------------------------------------- +; > Q[J] startaddr endaddr bytes +; Query memory for a byte string [Justified] + cmd_Q: - ld a,(de) + call get_char_upper sub 'J' ld (cmd_Q_jopt),a jr nz,l0e8dh @@ -2353,6 +2298,10 @@ l0eb0h: pop bc ret +;------------------------------------------------------------------------------- +; > Z startaddr endaddr bytes +; Zap (fill) memory with a byte string + cmd_Z: call get_arg_range push bc @@ -2466,8 +2415,11 @@ l0f42h: ld (last_S),hl ret +;------------------------------------------------------------------------------- +; >>D [startaddr] [endaddr] +; Display memory in hex and ASCII + cmd_D: - ld hl,cmd_D ld (cmd_rpt),hl ld hl,(last_D) ld bc,128 @@ -2477,9 +2429,9 @@ sub_0f58h: push bc push de push hl - ex af,af' + push af l0f5ch: - call out.hl.@ + call out_hl call z,outbl2 call outbl ld de,0 @@ -2509,15 +2461,16 @@ l0f86h: inc hl dec e jr nz,l0f86h - ex af,af' + pop af + push af jr nc,l0f97h ld (last_D),hl l0f97h: - ex af,af' call crlf ld a,b or c jr nz,l0f5ch + pop af pop hl pop de pop bc @@ -2533,13 +2486,17 @@ l0fach: ld a,'.' ret +;------------------------------------------------------------------------------- +; > Fcommandline +; specifiy filenames and command line + cmd_F: push de ld hl,DMA_BUF+1 ld (hl),' ' inc hl l0fb6h: - ld a,(de) + call get_char_upper ld (hl),a inc hl inc de @@ -2552,16 +2509,8 @@ l0fb6h: ld de,dfcb1 call parse_filename ld de,dfcb2 - call parse_filename ;fall thru -cpy_fcb2: - ld hl,dfcb2 - ld de,fcbsym - ld bc,16 - ldir - ret - parse_filename: call sub_102ch push de @@ -2630,6 +2579,7 @@ sub_1012h: cp '.' ret z ld c,'?' + call toupper cp '*' ret @@ -2661,6 +2611,8 @@ sub_1043h: cp ',' ret +;------------------------------------------------------------------------------- + setup_fcb: push de ld hl,12 @@ -2677,6 +2629,8 @@ l1052h: pop de ret +;------------------------------------------------------------------------------- + file_open: ld (cur_fcb),de call setup_fcb @@ -2693,6 +2647,7 @@ read_byte: cp 080h jr nz,l1111h call read_sector + ld a,01ah ret z sub a l1111h: @@ -2714,9 +2669,9 @@ read_sector: ld de,(cur_fcb) ld c,BDOS_READ call ddtz_bdos - dec a + sub a,1 jr z,l1132h - jp p,ERROR + jr nc,error2 l1132h: pop bc pop de @@ -2728,10 +2683,10 @@ cmdR_storebyte: push de ld de,TPA call cp_hl_de - jp c,ERROR + jr c,error2 ld de,(BDOS+1) call cp_hl_de - jp nc,ERROR + jr nc,error2 ld de,(high_load) call cp_hl_de jr c,l1157h @@ -2776,38 +2731,22 @@ read_hexchar: read_hexdigit: call read_byte - jr z,error8 + jr z,error2 hex_digit_v: call hex_digit ret nc -error8: +error2: jp ERROR -read_hexbyte: - call read_byte -read_hexbyte0: - push bc - call hex_digit_v - rlca - rlca - rlca - rlca - ld c,a - call read_byte - call hex_digit_v - or c - pop bc - ret +;------------------------------------------------------------------------------- +; > R [displacement] +; Read a binary or hex file [add displacement] cmd_R: ld hl,0 call get_lastarg_def read_file: - ld de,dfcb1+1 - ld a,(de) - cp '?' - jr z,read_symfile - dec de + ld de,dfcb1 push hl ld hl,0 ld (high_load),hl @@ -2819,12 +2758,15 @@ read_file: pop hl jr z,read_hexfile ld de,TPA - add hl,de push hl + add hl,de l108eh: call read_sector + jr nz,read_file_nxt pop hl - jr z,read_symfile + jp p_max_high + +read_file_nxt: ld de,DMA_BUF ld b,080h l109ah: @@ -2833,29 +2775,28 @@ l109ah: inc de inc hl djnz l109ah - push hl jr l108eh read_hexfile: push hl l10aeh: - call read_byte + call read_byte ; RECORD MARK jr z,rdhex_done cp ':' jr nz,l10aeh ld c,0 - call read_hexchar + call read_hexchar ; RECLEN ld b,a - call read_hexchar + call read_hexchar ; LOAD ADDR H ld h,a - call read_hexchar + call read_hexchar ; LOAD ADDR L ld l,a ld a,b and a jr z,rdhex_done - call read_hexchar + call read_hexchar ; RECTYP l10cch: - call read_hexchar + call read_hexchar ; DATA pop de push de push hl @@ -2864,103 +2805,22 @@ l10cch: pop hl inc hl djnz l10cch - call read_hexchar + call read_hexchar ; CHKSUM ld a,c and a - jr nz,error9 + jp nz,ERROR jr l10aeh rdhex_done: pop hl - jr read_symfile + jp p_max_high -read_symfile: - ld de,fcbsym+1 - ld a,(de) - cp ' ' - jp z,p_max_high - - call pstr_inl - db 'SYMBOLS',CR,LF+80h - - dec de - call file_open -;------------------------------------------------------------------------ -rs_1: - call read_byte -rs_2: - cp 1ah - jr z,p_max_high - cp '!' - jr c,rs_1 - call read_hexbyte0 - ld d,a - call read_hexbyte ; symval - ld e,a - push de ; symval - call read_byte +test_whitespace: cp ' ' - jr z,rs_4 - pop hl ; discard symval -rs_3: call read_byte - cp ' ' - jr c,rs_2 - jr rs_3 -; -rs_4: ld hl,(BDOS+1) ; - ld e,0 ; setup symlen -rs_5: dec hl ; - call read_byte ; - cp TAB ; - jr z,rs_6 ; - cp CR ; - jr z,rs_6 ; - cp '!' ; - jr c,error9 ; - ld (hl),a ; - inc e ; symlen++ - ld a,e ; - cp 10h+1 ; - jr c,rs_5 ; -error9: - jp ERROR ; -; -rs_6: push de ; symlen - push hl ; - ex de,hl ; - ld hl,(BDOS+1) ; - inc hl ; - ld e,(hl) ; - inc hl ; - ld d,(hl) ; - pop hl ; - ld (hl),d ; - dec hl ; - ld (hl),e ; - dec hl ; - ld (hl),0c3h ; - - ld de,(max_load) ; - call cp_hl_de ; - jr c,error9 ; - - ld de,(reg_sp) ; - call cp_hl_de ; - jr nc,rs_61 ; - ld (reg_sp),hl ; -rs_61: - - ld de,(BDOS+1) ; - ld (BDOS+1),hl ; - ex de,hl ; - pop de ; - ld (hl),e ; symlen - inc hl ; - pop de ; symval - ld (hl),e ; - inc hl ; - ld (hl),d ; - jp rs_1 ; -;------------------------------------------------------------------------ + ret z + cp TAB + ret + +;------------------------------------------------------------------------------- p_max_high0: call assert_eol @@ -2973,8 +2833,16 @@ p_max_high: DC ' Max = ' ld hl,(max_load) call out_hl + call pstr_inl + DC ' Top = ' + ld hl,(BDOS+1) + call out_hl jp crlf +;------------------------------------------------------------------------------- +; > Wstartaddr endaddr +; Write a file to disk + cmd_W: call get_arg_range call assert_eol @@ -2989,7 +2857,7 @@ l11adh: push bc ld a,(dfcb1+1) cp ' ' - jr z,error5 + jr z,error4 ld de,dfcb1 call setup_fcb push de @@ -2999,7 +2867,7 @@ l11adh: ld c,BDOS_CREATE call ddtz_bdos inc a - jr z,error5 + jr z,error4 pop bc pop hl l11cch: @@ -3028,7 +2896,7 @@ write_sector: and a ret z call close_file -error5: +error4: jp ERROR close_file: @@ -3036,1158 +2904,40 @@ close_file: ld c,BDOS_CLOSE jp ddtz_bdos -cmd_A: - ld hl,(last_A) - call get_lastarg_def - push hl - pop iy - ld hl,l1259h - ld (CMD_ERR),hl - ld (l1262h),sp -l1211h: - push iy - pop hl - ld (last_A),hl - ld (l0062h),hl - push hl - call p_disas_line - pop iy - ld c,b - ld de,(offs.@) - ld a,d - or e - ld b,011h - jr z,l122dh - ld b,019h -l122dh: - call outbl - ld a,(con_col) - cp b - jr c,l122dh - push bc - call get_line - pop bc - call skipbl - cp '.' - ret z - cp '-' - jr nz,l124bh - ld iy,(cmd_A_prev) - jr l1211h -l124bh: - and a - call nz,sub_1268h - ld (cmd_A_prev),iy - ld b,0 - add iy,bc - jr l1211h -l1259h: - call l0146h - ld sp,(l1262h) - jr l1211h - -sub_1268h: - call skipbl - ld hl,t_MNEMONICS - call sub_030ah - jp nc,ERROR - call skipbl - push de - ld a,b - add a,b - add a,b - ld hl,b_1289_start - call add_hl_a - ld e,(hl) - inc hl - ld d,(hl) - inc hl - ld b,(hl) - ex de,hl - pop de - -CALL_HL: - jp (hl) - -b_1289_start: - dw as.ADC_SBC ;ADC - db 088h ; - dw as.ADD ;ADD - db 080h ; - dw as.AND_CP_OR_SUB_XOR ;AND - db 0a0h ; - dw as.BITOP ;BIT - db 040h ; - dw as.CALL ;CALL - db 0c4h ; - dw as.opc.noarg ;CCF - db 03fh ; - dw as.AND_CP_OR_SUB_XOR ;CP - db 0b8h ; - dw gen.opc.ED2 ;CPD - db 0a9h ; - dw gen.opc.ED2 ;CPDR - db 0b9h ; - dw gen.opc.ED2 ;CPI - db 0a1h ; - dw gen.opc.ED2 ;CPIR - db 0b1h ; - dw as.opc.noarg ;CPL - db 02fh ; - dw as.opc.noarg ;DAA - db 027h ; - dw as.DEC_INC ;DEC - db 005h ; - dw as.opc.noarg ;DI - db 0f3h ; - dw as.DJNZ ;DJNZ - db 010h ; - dw as.opc.noarg ;EI - db 0fbh ; - dw as.EX ;EX - db 0e3h ; - dw as.opc.noarg ;EXX - db 0d9h ; - dw as.opc.noarg ;HALT - db 076h ; - dw as.IM ;IM - db 046h ; - dw as.IN ;IN - db 040h ; - dw as.DEC_INC ;INC - db 004h ; - dw gen.opc.ED2 ;IND - db 0aah ; - dw gen.opc.ED2 ;INDR - db 0bah ; - dw gen.opc.ED2 ;INI - db 0a2h ; - dw gen.opc.ED2 ;INIR - db 0b2h ; - dw as.JP ;JP - db 0c2h ; - dw as.JR ;JR - db 020h ; - dw as.LD ;LD - db 040h ; - dw gen.opc.ED2 ;LDD - db 0a8h ; - dw gen.opc.ED2 ;LDDR - db 0b8h ; - dw gen.opc.ED2 ;LDI - db 0a0h ; - dw gen.opc.ED2 ;LDIR - db 0b0h ; - dw gen.opc.ED2 ;NEG - db 044h ; - dw as.opc.noarg ;NOP - db 000h ; - dw as.AND_CP_OR_SUB_XOR ;OR - db 0b0h ; - dw gen.opc.ED2 ;OTDR - db 0bbh ; - dw gen.opc.ED2 ;OTIR - db 0b3h ; - dw as.OUT ;OUT - db 041h ; - dw gen.opc.ED2 ;OUTD - db 0abh ; - dw gen.opc.ED2 ;OUTI - db 0a3h ; - dw as.POP_PUSH ;POP - db 0c1h ; - dw as.POP_PUSH ;PUSH - db 0c5h ; - dw as.BITOP ;RES - db 080h ; - dw as.RET ;RET - db 0c0h ; - dw gen.opc.ED2 ;RETI - db 04dh ; - dw gen.opc.ED2 ;RETN - db 045h ; - dw as.SHIFTOP ;RL - db 010h ; - dw as.opc.noarg ;RLA - db 017h ; - dw as.SHIFTOP ;RLC - db 000h ; - dw as.opc.noarg ;RLCA - db 007h ; - dw gen.opc.ED2 ;RLD - db 06fh ; - dw as.SHIFTOP ;RR - db 018h ; - dw as.opc.noarg ;RRA - db 01fh ; - dw as.SHIFTOP ;RRC - db 008h ; - dw as.opc.noarg ;RRCA - db 00fh ; - dw gen.opc.ED2 ;RRD - db 067h ; - dw as.RST ;RST - db 0c7h ; - dw as.ADC_SBC ;SBC - db 098h ; - dw as.opc.noarg ;SCF - db 037h ; - dw as.BITOP ;SET - db 0c0h ; - dw as.SHIFTOP ;SLA - db 020h ; - dw as.SHIFTOP ;SRA - db 028h ; - dw as.SHIFTOP ;SRL - db 038h ; - dw as.AND_CP_OR_SUB_XOR ;SUB - db 090h ; - dw as.AND_CP_OR_SUB_XOR ;XOR - db 0a8h ; - - dw as.IN0 ;IN0 - db 000h ; - dw as.MLT ;MLT - db 04ch ; - dw gen.opc.ED2 ;OTDM - db 08bh ; - dw gen.opc.ED2 ;OTDMR - db 09bh ; - dw gen.opc.ED2 ;OTIM - db 083h ; - dw gen.opc.ED2 ;OTIMR - db 093h ; - dw as.OUTO ;OUT0 - db 001h ; - dw gen.opc.ED2 ;SLP - db 076h ; - dw as.TST ;TST - db 004h ; - dw as.TSTIO ;TSTIO - db 074h ; - -as.TST: - call arg.r_HL_A ; - jr nc,as.tst_0 - rlca - rlca - rlca - add a,b - ld b,a - jp gen.opc.ED2 -as.tst_0: - ld b,064h -as.TSTIO: - call arg.imm_8bit ; - jr as.store_io0 - -as.IN0: - call arg.r_HL_A ; - jr nc,error7 - cp 006h - jr z,error7 - rlca - rlca - rlca - add a,b - ld b,a - call assert_comma ; - call arg.addr_8bit ; - jr as.store_io0 - -as.OUTO: - call arg.addr_8bit ; - call assert_comma ; - call arg.r_HL_A ; - jr nc,error7 - cp 006h - jr z,error7 - rlca - rlca - rlca - add a,b - ld b,a - -as.store_io0: - call assert_eol - ld (iy+000h),0edh - ld (iy+001h),b - ld (iy+002h),l - ld c,003h - ret - -as.MLT: - call arg.ww ; - jr nc,error7 - add a,b - ld b,a - jp gen.opc.ED2 - -error7: - jp ERROR - -as.LD: - call arg.r_HL_A - jr c,l13d4h - call arg.IDX_displcmnt - jp c,l1471h - call arg.ww - jp c,l149ch - call arg.IX_IY - jp c,l14f5h - ld a,(de) - cp 'I' - jp z,l1511h - cp 'R' - jp z,l1519h - cp '(' - jp nz,ERROR - inc de - call arg.ww - jp c,l1528h - call test_expr - call test_paren_close - call assert_comma - call arg.ww - jr c,l13c2h - call arg.IX_IY - jr nc,l13aah - ld b,022h -l1395h: - call assert_eol - ld a,(prefix_ixiy) -l139bh: - ld (iy+000h),a - ld (iy+001h),b - ld (iy+002h),l - ld (iy+003h),h - ld c,004h - ret -l13aah: - ld a,(de) - cp 'A' - jp nz,ERROR - inc de - ld b,032h -as.store_3: - call assert_eol - ld (iy+000h),b - ld (iy+001h),l - ld (iy+002h),h - ld c,003h - ret -l13c2h: - cp 020h - jr z,l13d0h - add a,043h - ld b,a -l13c9h: - call assert_eol - ld a,0edh - jr l139bh -l13d0h: - ld b,022h - jr as.store_3 -l13d4h: - ld b,a - call assert_comma - call arg.r_HL_A - jr nc,l13f0h - push af - ld a,b - rlca - rlca - rlca - ld b,a - pop af - add a,b - add a,040h - cp 076h - jp z,ERROR -l13ech: - ld b,a - jp as.opc.noarg -l13f0h: - call arg.IDX_displcmnt - jr nc,l1413h - ld a,b - rlca - rlca - rlca - add a,046h - cp 076h - jp z,ERROR - -l1400h: - ld b,a - call assert_eol - ld (iy+001h),b - ld (iy+002h),c - ld a,(prefix_ixiy) - ld (iy+000h),a - ld c,003h - ret -l1413h: - ld a,(de) - cp 'I' - jr z,l1426h - cp 'R' - jr nz,l1432h - ld a,b - cp 007h - jp nz,ERROR - ld b,05fh - jr l142eh -l1426h: - ld a,b - cp 007h - jp nz,ERROR - ld b,057h -l142eh: - inc de - jp gen.opc.ED2 -l1432h: - cp '(' - jr z,l144ch - call arg.imm_8bit - ld a,b - rlca - rlca - rlca - add a,006h -l143fh: - ld b,a -as.store_2: - call assert_eol - ld (iy+000h),b - ld (iy+001h),l - ld c,002h - ret -l144ch: - inc de - ld a,b - cp 007h - jp nz,ERROR - call arg.ww - jr nc,l1466h - cp 030h - jp nc,ERROR - add a,00ah - ld b,a - call test_paren_close - jp as.opc.noarg -l1466h: - call test_expr - call test_paren_close - ld b,03ah - jp as.store_3 - -l1471h: - call assert_comma - call arg.r_HL_A - jr nc,l1483h - cp 006h - jp z,ERROR - add a,070h - jp l1400h - -l1483h: - call arg.imm_8bit - call assert_eol - ld a,(prefix_ixiy) - ld (iy+000h),a - ld (iy+001h),036h - ld (iy+002h),c - ld (iy+003h),l - ld c,004h - ret -l149ch: - ld b,a - call assert_comma - ld hl,t_HL.AF - call sub_0318h - jr c,l14c3h - call arg.IX_IY - jr nc,l14cch - ld a,b - cp 030h - jr nz,error6 - ld b,0f9h -l14b4h: - call assert_eol - ld a,(prefix_ixiy) - ld (iy+000h),a - ld (iy+001h),b - ld c,002h - ret -l14c3h: - ld a,b - cp 030h - jr nz,error6 - ld b,0f9h - jr as.opc.noarg ;14ca -l14cch: - ld a,(de) - cp '(' - jr nz,l14e8h - inc de - call test_expr - call test_paren_close - ld a,b - cp 020h - jr z,l14e3h - add a,04bh - ld b,a - jp l13c9h -l14e3h: - ld b,02ah - jp as.store_3 -l14e8h: - call test_expr - call assert_eol - ld a,001h - add a,b - ld b,a - jp as.store_3 -l14f5h: - call assert_comma - ld a,(de) - cp '(' - jr nz,l1509h - inc de - call test_expr - call test_paren_close - ld b,02ah - jp l1395h -l1509h: - call test_expr - ld b,021h - jp l1395h -l1511h: - inc de - call assert_comma - ld b,047h - jr l151fh -l1519h: - inc de - call assert_comma - ld b,04fh -l151fh: - ld a,(de) - inc de - cp 'A' - jr z,gen.opc.ED2 -error6: - jp ERROR - -l1528h: - cp 020h - jr nc,error6 - add a,002h - ld b,a - call test_paren_close - call assert_comma - ld a,(de) - cp 'A' - jr nz,error6 - inc de -as.opc.noarg: - call assert_eol - ld (iy+000h),b - ld c,001h - ret - -gen.opc.ED2: - call assert_eol - ld (iy+000h),0edh - ld (iy+001h),b - ld c,002h - ret - -as.ADC_SBC: - ld hl,t_HL.AF - call sub_0318h - jr nc,as.AND_CP_OR_SUB_XOR - call assert_comma - call arg.ww - jp nc,ERROR - push af - ld a,b - cp 088h - ld b,04ah - jr z,l156ch - ld b,042h -l156ch: - pop af - add a,b -l156eh: - ld b,a - jr gen.opc.ED2 -as.ADD: - ld hl,t_HL.AF - call sub_0318h - jr c,l159ah - call arg.IX_IY - jr nc,as.AND_CP_OR_SUB_XOR - call assert_comma - ld hl,t_BC.DE.IX.SP - ld a,(prefix_ixiy) - cp 0fdh - jr nz,l158eh - ld hl,t_BC.DE.IY.SP -l158eh: - call arg.reg_16bit - jp nc,ERROR - add a,009h -l1596h: - ld b,a - jp l14b4h -l159ah: - call assert_comma - call arg.ww - jp nc,ERROR - add a,009h - jp l13ech -as.AND_CP_OR_SUB_XOR: - ld a,(de) - cp 'A' - jr nz,l15b8h - push de - inc de - call next_arg - jr z,l15b7h - pop de - jr l15b8h -l15b7h: - pop af -l15b8h: - call arg.r_HL_A - jr c,l15cbh - call arg.IDX_displcmnt - jr c,l15cfh - call arg.imm_8bit - ld a,b - add a,046h - jp l143fh -l15cbh: - add a,b - jp l13ech -l15cfh: - ld a,b - add a,006h - jp l1400h - -as.SHIFTOP: - call arg.r_HL_A - jr c,l15fah - call arg.IDX_displcmnt - jp nc,ERROR - ld a,b - add a,006h - ld b,a -l15e4h: - call assert_eol - ld a,(prefix_ixiy) - ld (iy+000h),a - ld (iy+001h),0cbh - ld (iy+002h),c - ld (iy+003h),b - ld c,004h - ret - -l15fah: - add a,b -l15fbh: - ld b,a - call assert_eol - ld (iy+001h),b - ld (iy+000h),0cbh - ld c,002h - ret - -as.BITOP: - call arg.bit - call assert_comma - call arg.r_HL_A - jr c,l1624h - call arg.IDX_displcmnt - jp nc,ERROR - ld a,l - rlca - rlca - rlca - add a,006h - add a,b - ld b,a - jr l15e4h -l1624h: - add a,b - ld b,a - ld a,l - rlca - rlca - rlca - add a,b - jr l15fbh - -as.CALL: - push de - call arg.cc_ZCPS - jr nc,l163ch - add a,b - ld b,a - call next_arg - jr z,l163eh - pop de - push de -l163ch: - ld b,0cdh -l163eh: - pop af - call test_expr - jp as.store_3 - -as.RET: - call arg.cc_ZCPS - jr nc,l164eh - add a,b - ld b,a - jr l1650h -l164eh: - ld b,0c9h -l1650h: - jp as.opc.noarg - -as.JP: - push de - call arg.cc_ZCPS - jr c,l1666h -l1659h: - pop de - ld hl,l168ch - call sub_030ah - jr c,l1674h - ld b,0c3h - jr l166eh - -l1666h: - add a,b - ld b,a - call next_arg - jr nz,l1659h - pop af -l166eh: - call test_expr - jp as.store_3 -l1674h: - call assert_eol - ld a,b - and a - jr nz,l1680h - ld b,0e9h - jp as.opc.noarg -l1680h: - ld b,0ddh - dec a - jr z,l1687h - ld b,0fdh -l1687h: - ld l,0e9h - jp as.store_2 - -l168ch: - DC '(HL)' - DC '(IX)' - DC '(IY)' - DB 0 - -as.DJNZ: - call next_arg - ld b,010h - jr l16aeh -as.JR: - call arg.cc_ZC - jr c,l16a9h - ld b,018h - jr l16aeh -l16a9h: - add a,b - ld b,a - call assert_comma -l16aeh: - call arg.j_displ - jp as.store_2 - -as.IM: - call arg.imm_8bit - ld a,l - cp 003h - jr nc,error2 - and a - jr z,l16c7h - ld b,056h - cp 001h - jr z,l16c7h - ld b,05eh -l16c7h: - jp gen.opc.ED2 - -as.RST: - call arg.imm_8bit - ld a,l - push af - add a,b - ld b,a - pop af - and 0c7h - jr nz,error2 - jp as.opc.noarg - -as.POP_PUSH: - call arg.IX_IY - jr c,l16e7h - call arg.zz - jr nc,error2 - add a,b - jp l13ech -l16e7h: - ld a,b - add a,020h - jp l1596h - -as.IN: - call arg.r_HL_A - jr nc,error2 - cp 006h - jr z,error2 - rlca - rlca - rlca - add a,b - ld b,a - cp 078h - jr nz,l170fh - call assert_comma - call sub_171bh - jr c,l1715h - call arg.addr_8bit - ld b,0dbh - jp as.store_2 -l170fh: - call assert_comma - call sub_171bh -l1715h: - jp c,gen.opc.ED2 -error2: - jp ERROR - -sub_171bh: - ld hl,t__C_ - jp sub_0318h - -as.OUT: - call sub_171bh - jr nc,l1739h - call assert_comma - call arg.r_HL_A - jr nc,error2 - cp 006h - jr z,error2 - rlca - rlca - rlca - add a,b - jp l156eh - -l1739h: - call arg.addr_8bit - call assert_comma - cp 'A' - jr nz,error2 - inc de - ld b,0d3h - jp as.store_2 - -as.EX: - ld hl,b_176d_start - call sub_030ah - jp nc,ERROR - ld c,b - call assert_eol - ld b,000h - ld hl,l178eh - add hl,bc - add hl,bc - ld a,(hl) - ld (iy+000h),a - ld c,001h - inc hl - ld a,(hl) - and a - ret z - ld (iy+001h),a - ld c,002h - ret - -b_176d_start: - DC 'AF,AF''' -l1773h: - DC 'DE,HL' - DC '(SP),HL' - DC '(SP),IX' - DC '(SP),IY' - db 0 -l178eh: - db 008h,000h - db 0ebh,000h - db 0e3h,000h - db 0ddh,0e3h - db 0fdh,0e3h - -as.DEC_INC: - call arg.IX_IY - jr c,l17b3h - call arg.ww - jr c,l17bfh - call arg.r_HL_A - jr c,l17cch - call arg.IDX_displcmnt - jp nc,ERROR - ld a,b - add a,030h - jp l1400h -l17b3h: - ld a,b - ld b,023h - cp 004h - jr z,l17bch - ld b,02bh -l17bch: - jp l14b4h -l17bfh: - push af - ld a,b - ld b,003h - cp 004h - jr z,l17c9h - ld b,00bh -l17c9h: - pop af - jr l17cfh -l17cch: - rlca - rlca - rlca -l17cfh: - add a,b - jp l13ech - -arg.bit: - call arg.imm_8bit - ld a,l - cp 008h - jr nc,error3 - ret - -arg.j_displ: - call test_expr - push bc - push iy - pop bc - and a - sbc hl,bc - dec hl - dec hl - pop bc - call sub_1802h - ld a,h - xor l - bit 7,a - jr nz,error3 - ret - -arg.addr_8bit: - ld a,(de) - cp '(' - jr nz,arg.imm_8bit - inc de - call arg.imm_8bit - jp test_paren_close - -arg.imm_8bit: - call test_expr -sub_1802h: - ld a,h - and a - ret z - inc a - ret z - jr error3 - -test_expr: - push bc - call expr - pop bc - ret nc -error3: - jp ERROR - -arg.zz: - push hl - ld hl,t_BC.DE.HL.AF - jr l181fh - -arg.reg_16bit: - push hl - jr l181fh - -arg.ww: - push hl - ld hl,t_BC.DE.HL.SP -l181fh: - push bc - call sub_030ah - jr nc,l182bh - ld a,b - rlca - rlca - rlca - rlca - scf -l182bh: - pop bc - pop hl - ret - -arg.r_HL_A: - call skipbl - push bc - push hl - ld hl,t_BCDEHL_HL_A - call sub_030ah - ld a,b - pop hl - pop bc - ret - -arg.IX_IY: - push hl - push bc - ld hl,t_IX.IY - call sub_030ah - jr nc,l1852h - ld a,0ddh - dec b - jr nz,l184eh - ld a,0fdh -l184eh: - ld (prefix_ixiy),a - scf -l1852h: - pop bc - pop hl - ret +;------------------------------------------------------------------------------- +; > A [startaddr] +; Assemble Zilog Z180 mnemonics -arg.IDX_displcmnt: - push hl - push bc - ld a,(de) - cp '(' - jr nz,l18a1h - push de - inc de - ld hl,t_IX.IY - call sub_030ah - jr nc,l18a0h - pop af - ld a,0ddh - dec b - jr nz,l186eh - ld a,0fdh -l186eh: - ld (prefix_ixiy),a - ld a,(de) - cp '+' - jr z,l1882h - cp ')' - ld hl,0 - jr z,l189ah - cp '-' - jp nz,ERROR -l1882h: - push af - inc de - call arg.imm_8bit - pop af - cp '+' - jr z,l1894h - ld b,h - ld c,l - ld hl,0 - and a - sbc hl,bc -l1894h: - ld a,(de) - cp ')' - jp nz,ERROR -l189ah: - inc de - pop bc - ld c,l - pop hl - scf - ret -l18a0h: - pop de -l18a1h: - pop bc - pop hl - and a - ret +;cmd_A: -arg.cc_ZCPS: - ld hl,t_tstfl_ZCPS - ld c,007h - jr l18b1h -arg.cc_ZC: - ld hl,t_tstfl_ZC - ld c,003h -l18b1h: - push bc - call sub_030ah - ld a,b - pop bc - ret nc - and c - rlca - rlca - rlca - scf - ret +CALL_HL: + jp (hl) -assert_comma: - call next_arg - ret z -l18c2h: - jp ERROR +;------------------------------------------------------------------------------- -test_paren_close: - ld a,(de) - cp ')' - jr nz,l18c2h - inc de - ret + + + +b_176d_start: + DC 'AF,AF''' +l1773h: + DC 'DE,HL' + DC '(SP),HL' + DC '(SP),IX' + DC '(SP),IY' + db 0 + +;------------------------------------------------------------------------------- +; >>L [startaddr] [endaddr] +; List disassembled code cmd_L: - ld hl,cmd_L ld (cmd_rpt),hl call expr jr nc,l18dbh ld hl,(last_L) l18dbh: - push hl - pop iy call next_arg call get_range jr nc,l1905h @@ -4195,94 +2945,82 @@ l18dbh: ld b,16 l18ebh: push bc - push iy - pop hl - push hl - call p_disas_line - call crlf - pop iy - ld c,b - ld b,0 - add iy,bc - ld (last_L),iy + call cmdl_p_line pop bc djnz l18ebh ret + l1905h: call assert_eol - ld h,b - ld l,c - ld a,b - or c - jr nz,l190fh - dec hl + ld d,h + ld e,l + add hl,bc + ex de,hl l190fh: - push hl - push iy - pop hl - push hl - call p_disas_line - call crlf - pop iy - ld e,b - ld d,000h - add iy,de - ld (last_L),iy - pop hl - and a - sbc hl,de - ret z - ret c - jr l190fh + push de + call cmdl_p_line + pop de + call cp_hl_de + jr c,l190fh + ret + +;------------------------------------------------------------------------------- + +cmdl_p_line: + push hl + call p_disas_line + call crlf + pop hl + ld c,b + ld b,0 + add hl,bc + ld (last_L),hl + ret p_disas_line: - call out.hl.@ + call outbl2 + call out_hl call z,outbl call outbl sub a ld (con_col),a + push hl + pop iy call p_disas_instr - and a ret z -l193fh: - call outbl - ld a,(con_col) - cp 16 - jr c,l193fh + ld c,15 + call p_goto_col + ; fall thru +;------------------------------------------------------------------------------- + ret -p_offset: - ld de,(offs.@) - ld a,d - or e - ret z - call p_char_lparen - ld a,'@' - call outchar - and a - sbc hl,de - call out_hl - jp out_rparen +;------------------------------------------------------------------------------- p_disas_instr: sub a - ld (l1ffdh),a + ld (disas_argtype),a call disas_get_instrlen jr nc,l197fh - push bc - call p_mnemonic + push bc + ld a,(con_col) + add a,5 + ld c,a + call pstr + call p_goto_col ex de,hl call call_hl pop bc - ld a,(l1ffdh) - ld hl,(l1ffbh) + ld a,(disas_argtype) + ld hl,(disas_arg_16) + or a scf ret l197fh: call pstr_inl DC '???' - ld b,001h + ld b,1 sub a ret @@ -4318,6 +3056,8 @@ l19b1h: scf ret +;------------------------------------------------------------------------------- + disas_pfx.DDFD: inc iy ld hl,b_19ef_start @@ -4344,6 +3084,7 @@ l19edh: and a ret +;------------------------------------------------------------------------------- ; DD/FD 3 byte (ix+d)/(iy+d) b_19ef_start: db 034h @@ -4391,6 +3132,8 @@ l1a0ah: db 0f9h db 0 +;------------------------------------------------------------------------------- + disas_pfx.ED: inc iy ld hl,b_1bc9_start @@ -4411,6 +3154,8 @@ disas_pfx.ED: ld b,4 ret +;------------------------------------------------------------------------------- + disas_pfx.CB: push iy inc iy @@ -4425,6 +3170,8 @@ l1a42h: ld b,2 ret +;------------------------------------------------------------------------------- + disas_nopfx: ld hl,b_1b54_start call lookup_opc @@ -4444,6 +3191,8 @@ disas_nopfx: ld b,3 ret +;------------------------------------------------------------------------------- + sub_1a72h: ld a,(hl) cp 0ffh @@ -4454,14 +3203,11 @@ sub_1a72h: inc hl jr sub_1a72h l1a7fh: + ld de,l1c97h inc hl ld c,(hl) - ld hl,t_MNEMONICS - ld b,0 - add hl,bc - ld de,l1c97h - scf - ret + jr get_mnemonic + test_DDFD: ld a,(hl) @@ -4487,6 +3233,7 @@ lookup_opc: and a jr nz,lookup_opc ret + l1aa8h: inc hl ld c,(hl) @@ -4494,12 +3241,14 @@ l1aa8h: ld e,(hl) inc hl ld d,(hl) +get_mnemonic: ld hl,t_MNEMONICS - ld b,000h + ld b,0 add hl,bc scf ret +;------------------------------------------------------------------------------- ; 1 byte opcodes (no parameters) ; Format: db opcode, t_MNEMONICS-index b_1ab6_start: @@ -4519,7 +3268,7 @@ b_1ab6_start: db 0ffh -; 1 byte opcodes +; 1 byte opcodes ; Format: db mask, match, t_MNEMONICS-index ; dw argument formating fuction b_1ad1_start: @@ -4577,7 +3326,7 @@ b_1ad1_start: dw l1ce5h db 0 -; 2 byte opdodes +; 2 byte opdodes b_1b54_start: db 0c7h,006h,056h ;ld r,nn dw l1cfah @@ -4598,18 +3347,18 @@ b_1b54_start: db 0ffh,0feh,013h ;cp a,nn dw l1d09h db 0ffh,010h,02eh ;djnz - dw l1d1ah + dw p_arg_jrel db 0ffh,018h,054h ;jr - dw l1d1ah - db 0e7h,020h,054h ;jr,cc - dw l1d0fh + dw p_arg_jrel + db 0e7h,020h,054h ;jr cc, + dw p_arg_cc_jrel db 0ffh,0d3h,076h ;out (nn),a dw l1d37h db 0ffh,0dbh,03fh ;in a,(nn) dw l1d29h db 0 -; 3 byte opcodes +; 3 byte opcodes b_1b9b_start: db 0c7h,0c2h,052h ;jp cc,mn dw p_arg_cc_mn @@ -4753,6 +3502,8 @@ b_1c55_start: dw p_arg_bitop db 0 +;------------------------------------------------------------------------------- + p_arg_r_r: call p_arg_r call p_char_comma @@ -4815,8 +3566,7 @@ l1ce5h: sub_1ce8h: call p_char_lparen call p_arg_ww -out_rparen: - jp p_char_rparen + jr out_rparen l1cf5h: call p_A_comma @@ -4833,12 +3583,12 @@ l1d09h: l1d0ch: jp out_hex -l1d0fh: +p_arg_cc_jrel: ld a,(iy+000h) and 018h call p_arg_cc0 call p_char_comma -l1d1ah: +p_arg_jrel: ld c,(iy+001h) ld a,c rla @@ -4850,12 +3600,17 @@ l1d1ah: inc hl inc hl jr l1d4eh + l1d29h: call p_A_comma sub_1d2ch: call p_char_lparen ld a,(iy+001h) - jp l1e6bh +p_arg_nn_rp: + call out_hex +out_rparen: + jr p_char_rparen + l1d37h: call sub_1d2ch jr p_char_comma_A @@ -4869,49 +3624,53 @@ p_arg_mn: l1d4eh: ld a,002h sub_1d50h: - ld (l1ffdh),a - ld (l1ffbh),hl - call out_hl - ret + ld (disas_argtype),a + ld (disas_arg_16),hl + jp out_hl + p_arg_ww_mn: call p_arg_ww call p_char_comma jr p_arg_mn p_arg_addr_hl: - call sub_1e13h + call p_arg_addr call p_char_comma jp p_arg_hlixiy + p_arg_hl_addr: call p_arg_hlixiy call p_char_comma - jp sub_1e13h + jp p_arg_addr p_arg_addr_a: - call sub_1e13h + call p_arg_addr p_char_comma_A: call p_char_comma + jr p_char_A + +p_A_comma: + call p_char_A +p_char_comma: + ld a,',' + db 021h p_char_A: ld a,'A' - jr outchar1 -p_arg_a_addr: - call p_A_comma - jp sub_1e13h + db 021h l1d85h: ld a,'0' - jr outchar1 + db 021h l1d89h: ld a,'1' - jr outchar1 + db 021h l1d8dh: ld a,'2' - jr outchar1 - -p_A_comma: - call p_char_A -p_char_comma: - ld a,',' -outchar1: + db 021h +p_char_rparen: + ld a,')' + db 021h +p_char_lparen: + ld a,'(' jp outchar l1d92h: @@ -4955,14 +3714,24 @@ l1dcah: jp p_arg_ww p_arg_addr_ww: - call sub_1e13h + call p_arg_addr call p_char_comma jp p_arg_ww p_arg_ww_addr: call p_arg_ww call p_char_comma - jr sub_1e13h + jr p_arg_addr + +p_arg_a_addr: + call p_A_comma +p_arg_addr: + call p_char_lparen + ld l,(iy+001h) + ld h,(iy+002h) + ld a,001h + call sub_1d50h + jr p_char_rparen p_arg_bitop: ld a,(isprefix_ixiy) @@ -4995,17 +3764,6 @@ l1e0eh: l1e11h: jr p_arg_r0 -sub_1e13h: - call p_char_lparen - ld l,(iy+001h) - ld h,(iy+002h) - ld a,001h - call sub_1d50h - -p_char_rparen: - ld a,')' - jp outchar - p_arg_r: ld a,(iy+000h) rra @@ -5030,20 +3788,18 @@ p_arg_r0: l1e4dh: call pstr ld a,(iy+001h) - and a - jp m,l1e61h + push af + rlca ld a,'+' - call outchar - ld a,(iy+001h) - jr l1e6bh -l1e61h: + jr nc,l1e61h + pop af + neg + push af ld a,'-' +l1e61h: call outchar - ld a,(iy+001h) - neg -l1e6bh: - call out_hex - jr p_char_rparen + pop af + jp p_arg_nn_rp p_arg_r1: ld hl,t_BCDEHL_HL_A @@ -5087,15 +3843,7 @@ p_arg: call sel_dc_string jp pstr -p_mnemonic: - call pstr -l1ebch: - call outbl - inc c - ld a,c - cp 5 - jr c,l1ebch - ret +;------------------------------------------------------------------------------- t_MNEMONICS: DC 'ADC' @@ -5196,38 +3944,16 @@ t_BC.DE.HL.SP: t_BC.DE.HL.AF: DC 'BC' DC 'DE' -t_HL.AF: + DC 'HL' DC 'AF' DB 0 -t_BC.DE.IY.SP: - DC 'BC' - DC 'DE' - DC 'IY' - DC 'SP' - DB 0 -t_BC.DE.IX.SP: - DC 'BC' - DC 'DE' - DC 'IX' - DC 'SP' - DB 0 t_HL.IX.IY: DC 'HL' -t_IX.IY: + DC 'IX' DC 'IY' DB 0 -t_tstfl_ZC: - DC 'NZ' - DC 'Z' - DC 'NC' - DC 'C' - DC 'NE' - DC 'EQ' - DC 'GE' - DC 'LT' - DB 0 t_tstfl_ZCPS: DC 'NZ' DC 'Z' @@ -5248,8 +3974,10 @@ t__C_: DC '(C)' DB 0 -sub_1ffeh: - ld hl,(REG.PC) +;------------------------------------------------------------------------------- + +tc_set_bp: + ld hl,(reg.pc) ld a,h or l jr z,l2037h @@ -5258,15 +3986,15 @@ sub_1ffeh: sbc hl,de ld hl,l20edh jr z,l2031h - ld iy,(REG.PC) + ld iy,(reg.pc) call disas_get_instrlen jp nc,ERROR ld c,b - ld b,000h - ld hl,(REG.PC) + ld b,0 + ld hl,(reg.pc) add hl,bc - call sub_09cah - ld iy,(REG.PC) + call bp_trace_enter + ld iy,(reg.pc) ld hl,b_2039_start call lookup_opc ccf @@ -5274,11 +4002,13 @@ sub_1ffeh: ex de,hl l2031h: call CALL_HL - call c,sub_09cah + call c,bp_trace_enter l2037h: scf ret +;------------------------------------------------------------------------------- + b_2039_start: db 0ffh,0ddh,000h ;Prefix DD dw l20a7h @@ -5298,20 +4028,22 @@ b_2048_start: dw l20dch db 0ffh,0cfh,000h ;rst 8 dw l2115h - db 0c7h,0c7h,000h ; + db 0c7h,0c7h,000h ;rst n dw l20f9h - db 0c7h,0c4h,000h ; + db 0c7h,0c4h,000h ;call cc,mn dw l2080h - db 0f7h,010h,000h ; + db 0f7h,010h,000h ;djnz d; jr d dw l2093h - db 0e7h,020h,000h ; + db 0e7h,020h,000h ;jr cc,d dw l2093h - db 0c7h,0c2h,000h ; + db 0c7h,0c2h,000h ;jp cc,mn dw l208bh - db 0c7h,0c0h,000h ; + db 0c7h,0c0h,000h ;ret cc dw l20c5h db 0 +;------------------------------------------------------------------------------- +; call mn call cc,mn l2080h: ld a,(b_21e2_start) and a @@ -5319,44 +4051,54 @@ l2080h: ld a,(trace_call_flag) and a ret nz + +; jp mn jp cc,mn l208bh: ld l,(iy+001h) ld h,(iy+002h) scf ret + l2093h: ld c,(iy+001h) ld a,c rla sbc a,a ld b,a - ld hl,(REG.PC) + ld hl,(reg.pc) add hl,bc inc hl inc hl scf ret + +; jp (hl) l20a2h: ld hl,(reg.l) scf ret + +; Prefix DD l20a7h: ld hl,(reg.ix) jr l20afh +; Prefix FD l20ach: ld hl,(reg.iy) l20afh: ld a,(iy+001h) - cp 0e9h + cp 0e9h ; jp (ix); jp (iy) scf ret z and a ret + +; Prefix ED l20b8h: ld a,(iy+001h) - cp 04dh + cp 04dh ; reti jr z,l20dch - cp 045h + cp 045h ; retn jr z,l20dch and a ret @@ -5393,7 +4135,8 @@ l20edh: inc hl ld d,(hl) ex de,hl - call sub_09cah + call bp_trace_enter +l2115h: and a ret @@ -5414,93 +4157,103 @@ l20f9h: l2113h: scf ret -l2115h: - and a - ret + +;------------------------------------------------------------------------------- +; >>C[N][J] [steps] +; >>C[N][J] W expression +; >>C[N][J] U expression +; trace over Calls [No list] [Jumps only] /.While./.Until. + cmd_C: - ld hl,cmd_C - ld a,001h - jr l2122h + ld a,1 + jr cmd_tc + +;------------------------------------------------------------------------------- +; >>T[N][J] [steps] +; >>T[N][J] W expression +; >>T[N][J] U expression +; Trace [no List] [Jumps only] / .While. / .Until. + cmd_T: xor a - ld hl,cmd_T -l2122h: +cmd_tc: ld (cmd_rpt),hl ld (trace_call_flag),a - ld a,(de) + call get_char_upper sub 'N' - jr nz,l212eh + jr nz,tc_non inc de -l212eh: +tc_non: ld (trace_N_flag),a - ld a,(de) + call get_char_upper sub 'J' - jr nz,l2137h + jr nz,tc_noj inc de -l2137h: +tc_noj: ld (trace_J_flag),a - call sub_21a6h - jr z,l2145h - ld hl,1 + call tc_chk_u_or_w + jr z,tc_save_uw_expr_ptr + ld hl,1 ;default: 1 step call get_lastarg_def -l2145h: - ld (trace_count),hl +tc_save_uw_expr_ptr: + ld (trace_cnt_or_ptr),hl sub a - ld (l0941h),a + ld (bp_p_cpu_flag),a l214ch: - call sub_1ffeh - jr l21a3h + call tc_set_bp + jr user_go1 l2151h: call bp_clr_temporary ld a,(trace_J_flag) and a jr nz,l216bh - ld iy,(REG.PC) + ld iy,(reg.pc) call sub_21c8h jr z,l216bh ld hl,b_2048_start call lookup_opc jr nc,l214ch l216bh: - ld a,(trace_UW_flag) + ld a,(trace_UW_flag) ;0 or 'U' or 'W' and a - jr z,l2188h - ld de,(trace_count) + jr z,tc_cnt ;flag is 0, check for step count. + ld de,(trace_cnt_or_ptr) call expr ld a,h or l add a,0ffh sbc a,a - ld hl,trace_UW_flag + ld hl,trace_UW_flag ;'U' or 'W' xor (hl) - bit 1,a + bit 1,a ;'U' = 55H, 'W' = 57H jr z,l2193h -l2185h: - jp l0902h -l2188h: - ld hl,(trace_count) +do_break0: ;print registers and go to main loop + jp do_break + +tc_cnt: + ld hl,(trace_cnt_or_ptr) dec hl - ld (trace_count),hl + ld (trace_cnt_or_ptr),hl ld a,h or l - jr z,l2185h + jr z,do_break0 l2193h: - call sub_1ffeh - jr nc,l2185h + call tc_set_bp + jr nc,do_break0 ld a,(trace_N_flag) ld b,a - ld a,(l0941h) + ld a,(bp_p_cpu_flag) or b - ld (l0941h),a -l21a3h: + ld (bp_p_cpu_flag),a +user_go1: jp user_go -sub_21a6h: +tc_chk_u_or_w: call skipbl xor a ld (trace_UW_flag),a - ld a,(de) + call get_char_upper cp 'U' jr z,l21b5h cp 'W' @@ -5534,25 +4287,27 @@ l21dah: cp 045h ret +;------------------------------------------------------------------------------- + +con_col: + db 0 + +;------------------------------------------------------------------------------- + b_21e2_start: db 0 trace_call_flag: db 0 ;1=call, 0=trace trace_UW_flag: db 0 ;0 or 'U' or 'W' -trace_count: +trace_cnt_or_ptr: dw 0 trace_N_flag: db 0 ;0 if 'N' trace_J_flag: db 0 ;0 if 'J' -;------------------------------------------------------------------------------- - -con_col: - db 0 - -l0941h: +bp_p_cpu_flag: db 0 bp_tab: @@ -5564,8 +4319,6 @@ bp_tab: expr_p1: dw expr_buf -expr_p2: - dw expr_buf expr_buf: current_cseg defl $ - current_cseg @@ -5652,12 +4405,7 @@ current_cseg defl $ ds EXPR_BUF_SIZE - ($ - expr_buf) expr_bufe: -msg_Y: - dc 'Yn' -reg_Y: - rept YREG_CNT - dw 0 - endm +;------------------------------------------------------------------------------- last_S: dw TPA @@ -5684,29 +4432,20 @@ high_load: max_load: dw TPA -l1262h: - dw 0 -last_A: - dw TPA -cmd_A_prev: - dw TPA - -prefix_ixiy: - db 0 - isprefix_ixiy: db 0 last_L: dw TPA -l1ffbh: +disas_arg_16: dw 0 -l1ffdh: +disas_argtype: db 0 +pbl_loop_adr: + dw 0 + cur_fcb: dw 0 -fcbsym: - ds 33 ddtz_size equ $-ddtz_base ddtz_end: