\r
; Some greneral definitions\r
\r
-TAB equ 9\r
-LF equ 10\r
-CR equ 13\r
+BS equ 08h\r
+TAB equ 09h\r
+CR equ 0dh\r
+LF equ 0ah\r
+DEL equ 7fh\r
+CNTRX equ 'X'-'@'\r
\r
; 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_CIN equ 1 ;Console Input\r
-BDOS_COUT equ 2 ;Console Output\r
BDOS_PSTR equ 9 ;Print String\r
-BDOS_CBUF equ 10 ;Read Console Buffer\r
-BDOS_CSTAT equ 11 ;Get Console Status\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
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 8 ;Size of a breakpoint record\r
-YREG_CNT equ 10 ;Number of Y registers (0..9)\r
+BP_SIZE equ 4 ;Size of a breakpoint record\r
\r
;-------------------------------------------------------------------------------\r
\r
db 0c3h\r
reg.pc: dw TPA\r
var.$: dw 0000h\r
-var.@: dw 0\r
\r
cmd_rpt:dw mainloop\r
\r
ld sp,stack\r
exx\r
ld de,ddtz_base\r
- or a\r
- sbc hl,de\r
- add hl,de\r
+ call cp_hl_de\r
jr c,l0079h\r
ex de,hl\r
l0079h:\r
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: 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 cmd_@ ;examine/substitute the displacement register @\r
+ dw ERROR ;cmd_@ ;examine/substitute the displacement register @\r
dw ERROR ;cmd_A ;Assemble\r
dw cmd_B ;Breakpoints display/set/clear\r
- dw cmd_C ;trace over Calls\r
+ 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
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 cmd_Y ;examine [and substitute] Y variables\r
+ dw ERROR ;cmd_Y ;examine [and substitute] Y variables\r
dw cmd_Z ;Zap (fill) memory with a byte string\r
\r
ERROR:\r
call bp_clr_temporary\r
ld hl,(cmd_rpt)\r
ld de,mainloop\r
+ push de\r
call cp_hl_de\r
ld a,'>'\r
call outchar\r
call get_line\r
call skipbl\r
jr z,exe_hl\r
- ld hl,mainloop\r
+ pop hl\r
+ push hl\r
ld (cmd_rpt),hl\r
inc de\r
sub '@'\r
inc hl\r
ld h,(hl)\r
ld l,a\r
-\r
exe_hl:\r
- call CALL_HL\r
- jr mainloop\r
+ jp (hl)\r
\r
;-------------------------------------------------------------------------------\r
\r
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
-out.hl.@:\r
- call out_hl\r
- push de\r
- push hl\r
- ld de,(var.@)\r
- ld a,d\r
- or e\r
- jr z,l01bfh\r
- call outbl\r
- call pstr_inl\r
- dc '@'\r
- and a\r
- sbc hl,de\r
- call out_hl\r
-l01bfh:\r
- pop hl\r
- pop de\r
- ret\r
-\r
sub_01d9h:\r
call pstr_inl\r
dc '-'\r
push bc\r
push af\r
and 07fh\r
- ld e,a\r
- ld c,BDOS_COUT\r
- call ddtz_bdos\r
+ ld c,a\r
+ call ?cono\r
ld hl,con_col\r
inc (hl)\r
pop af\r
and a\r
ret z\r
call outchar\r
- and a\r
ret m\r
jr pstr\r
\r
\r
;-------------------------------------------------------------------------------\r
\r
+incharw:\r
+ call inchar\r
+ jr nc,incharw\r
+ ret\r
+\r
+;-------------------------------------------------------------------------------\r
+\r
inchar:\r
push ix\r
push hl\r
push de\r
push bc\r
- ld c,BDOS_CSTAT\r
- call ddtz_bdos\r
+ call ?const\r
and a\r
- jr z,l0284h\r
- ld c,BDOS_CIN\r
- call ddtz_bdos\r
+ jr z,inch1\r
+ call ?conin\r
scf\r
-l0284h:\r
+inch1:\r
pop bc\r
pop de\r
pop hl\r
pop ix\r
ret\r
\r
+;-------------------------------------------------------------------------------\r
+\r
+DELC:\r
+ ld a,b\r
+ or a\r
+ ret z\r
+ call DELC1\r
+ dec hl\r
+ dec b\r
+ inc c\r
+ ld a,(hl)\r
+ cp ' '\r
+ ret nc\r
+DELC1:\r
+ call pstr_inl\r
+ dc BS,' ',BS\r
+ ret\r
+\r
+DELL:\r
+ ld a,b ;\r
+ or a ;\r
+ ret z ;\r
+ call DELC ;\r
+ jr DELL ;\r
+\r
+;-------------------------------------------------------------------------------\r
+\r
get_line:\r
- push hl\r
- ld de,conbuf\r
- ld c,BDOS_CBUF\r
- call ddtz_bdos\r
- call crlf\r
- ld hl,conbuf+1\r
- ld e,(hl)\r
- xor a\r
- ld d,a\r
+ push hl ;\r
+ ld hl,conbuf ;\r
+ ld c,(hl) ;\r
+ inc hl ;\r
+ ld b,000h ;\r
+ inc hl ;\r
+inlnxtch:\r
+ ld a,c ;\r
+ or a ;\r
+ jr z,inl_e ;\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 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
+ cp CNTRX ;\r
+ jr nz,gl_3 ;\r
+ call DELL ;Delete Line\r
+ jr inlnxtch ;\r
+gl_3:\r
+ cp TAB ;\r
+ jr nz,gl_4 ;\r
+ ld a,' ' ;\r
+gl_4:\r
+ ld (hl),a ;\r
+ cp ' ' ;\r
+ jr nc,gl_5 ;\r
+ ld a,'^' ;Controll characters\r
+ call outchar ;\r
+ ld a,(hl) ;\r
+ add a,'@' ;\r
+gl_5:\r
+ call outchar ;\r
+ inc hl ;\r
+ inc b ;\r
+ dec c ;\r
+ jr inlnxtch ;\r
+\r
+inl_e:\r
+ ld (hl),0\r
+ ld hl,conbuf+1 ;\r
+ ld (hl),b ;\r
+ call CRLF ;\r
inc hl\r
ex de,hl\r
- add hl,de\r
- ld (hl),a\r
- pop hl\r
- ret\r
+ pop hl ;\r
+ ret ;\r
\r
;-------------------------------------------------------------------------------\r
\r
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
sub_0303h:\r
ld hl,t_reg_names\r
ld b,07fh\r
- jr l030ch\r
-\r
-sub_030ah:\r
- ld b,0ffh\r
l030ch:\r
inc b\r
ld a,(hl)\r
res 7,b\r
ret\r
\r
-sub_0318h:\r
- push bc\r
- res 7,b\r
- defb 03eh ;ld a,nn\r
sub_031ch:\r
push bc\r
push de\r
ld hl,TPA\r
cp 'L'\r
ret z\r
- ld hl,(var.@)\r
- cp '@'\r
- ret z\r
ld hl,(var.$)\r
cp '$'\r
ret z\r
jr z,fact_factor\r
cp '^'\r
jr z,fact_reg.CPU\r
- cp 'Y'\r
- jr z,fact_reg.Y\r
cp '('\r
jr z,fact_mem\r
cp '['\r
\r
;-------------------------------------------------------------------------------\r
\r
-fact_reg.Y:\r
- call get.decdigit\r
- jr c,error1\r
- inc de\r
-get_y_val:\r
- add a,a\r
- ld hl,reg_Y\r
- call add_hl_a\r
- ld a,(hl)\r
- inc hl\r
- ld h,(hl)\r
- ld l,a\r
- and a\r
- ret\r
-\r
fact_factstring:\r
ld hl,0\r
l054bh:\r
l063eh:\r
call p_regs\r
djnz l063eh\r
+ call outbl6\r
push hl\r
push de\r
ld iy,(reg.pc)\r
djnz l065bh\r
pop af\r
pop hl\r
- call nz,outbl6\r
- call nz,p_offset\r
jp crlf\r
\r
p_f:\r
inc hl\r
ld d,(hl)\r
ex de,hl\r
- dec a\r
- jr z,l06d9h\r
- call out.hl.@\r
- call z,outbl6\r
- jr l06e2h\r
-l06d9h:\r
call out_hl\r
jr l06e2h\r
l06deh:\r
\r
cmd_G:\r
sub a\r
- ld (trace_call_flag),a\r
ld (bp_p_cpu_flag),a\r
call expr\r
jr c,l0740h\r
ld a,(ix+000h)\r
and 0f1h\r
ld (ix+000h),a\r
- call bp_clr_condition\r
\r
call bpl_next\r
ret\r
; 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
-; [R] expression [I condition]\r
+; breakp can be any valid expression\r
\r
cmd_B:\r
call skipbl\r
jr nz,l07aeh\r
l07a7h:\r
ld (ix+000h),000h\r
- call bp_clr_condition\r
l07aeh:\r
pop af\r
call bpl_next\r
ret\r
\r
bp_print:\r
+ ld c,0\r
call bpl_init\r
\r
bit 0,(ix+000h)\r
jr z,bp_pr_cont\r
- ld a,'R'\r
- bit 4,(ix+000h)\r
- jr nz,l07cdh\r
- ld a,' '\r
-l07cdh:\r
- call outchar\r
- call outbl\r
ld l,(ix+002h)\r
ld h,(ix+003h)\r
- call out.hl.@\r
- call pstr_inl\r
- dc ' :'\r
- ld l,(ix+004h)\r
- ld h,(ix+005h)\r
call out_hl\r
- ld l,(ix+006h)\r
- ld h,(ix+007h)\r
- ld a,h\r
- or l\r
- jr z,l0805h\r
- call outbl4\r
- call pstr_inl\r
- dc 'I '\r
- call pstr\r
-l0805h:\r
- call crlf\r
+ call outbl2\r
+ inc c\r
bp_pr_cont:\r
call bpl_next\r
+ ld a,c\r
+ or a\r
+ call nz,crlf\r
ret\r
\r
;-------------------------------------------------------------------------------\r
ld b,a\r
call skipbl\r
ret z\r
- cp 'R'\r
- jr nz,bp_e_1\r
- inc de\r
- set 4,b\r
-bp_e_1:\r
+\r
push bc\r
call expr\r
jr c,error12\r
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 bp_get_condition\r
- ld (ix+006h),l\r
- ld (ix+007h),h\r
call next_arg\r
pop af\r
ld (ix+000h),a\r
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
-bp_get_condition:\r
- call skipbl\r
- cp 'I'\r
- ld hl,0\r
- ret nz\r
- inc de\r
- call skipbl\r
- push de\r
- call expr\r
- jr c,error12\r
- ex de,hl\r
- pop de\r
- push de\r
- sbc hl,de\r
- ld b,h\r
- ld c,l\r
- ld hl,(expr_p1)\r
- push hl\r
- add hl,bc\r
- ld de,expr_bufe\r
- call cp_hl_de\r
- jr nc,error12\r
- pop de\r
- pop hl\r
- push de\r
- ldir\r
- ex de,hl\r
- ld (hl),c ; trailing 0\r
- inc hl\r
- ld (expr_p1),hl\r
- pop hl\r
- ret\r
\r
;-------------------------------------------------------------------------------\r
; Breakpoint handling routine.\r
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+006h)\r
- ld d,(ix+007h)\r
- ld a,d\r
- or e\r
- ld hl,0ffffh\r
- call nz,expr\r
- ld a,h\r
- or l\r
- jr z,l0969h\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
-l0969h:\r
- bit 4,(ix+000h)\r
- ret z\r
- ld a,001h\r
- ld (bp_p_cpu_flag),a\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
\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 (ix+006h),000h\r
- ld (ix+007h),000h\r
ld a,(b_21e2_start)\r
and a\r
ld a,008h\r
ld sp,(reg_sp)\r
jp reg.iff\r
\r
-;-------------------------------------------------------------------------------\r
-\r
-bp_clr_condition:\r
- ld a,(ix+000h)\r
- and 003h\r
- ret nz\r
- ld e,(ix+006h)\r
- ld d,(ix+007h)\r
- ld a,d\r
- or e\r
- ret z\r
- push bc\r
- ld h,d\r
- ld l,e\r
- sub a\r
- ld (ix+006h),a\r
- ld (ix+007h),a\r
- ld bc,0ffffh\r
- cpir\r
-l0a7dh:\r
- push de\r
- ld de,(expr_p1)\r
- call cp_hl_de\r
- pop de\r
- jr nc,l0a93h\r
- call sub_0a99h\r
-l0a8bh:\r
- ld a,(hl)\r
- ldi\r
- and a\r
- jr nz,l0a8bh\r
- jr l0a7dh\r
-l0a93h:\r
- ld (expr_p1),de\r
- pop bc\r
- ret\r
-\r
-sub_0a99h:\r
- ld iy,bp_tab\r
- push de\r
-l0a9eh:\r
- ld e,(iy+006h)\r
- ld d,(iy+007h)\r
- call cp_hl_de\r
- jr z,l0ab0h\r
- ld de,BP_SIZE\r
- add iy,de\r
- jr l0a9eh\r
-l0ab0h:\r
- pop de\r
- ld (iy+006h),e\r
- ld (iy+007h),d\r
- ret\r
-\r
;-------------------------------------------------------------------------------\r
; > Y\r
; examine all Y variables\r
; > Y[0..9]\r
; examine (and substitute) an Y variable\r
\r
-cmd_Y:\r
- call get.decdigit\r
- jr c,l0bc3h\r
- inc de\r
- push af\r
- call assert_eol\r
- pop af\r
- call sub_0bdch\r
- jp l0c15h\r
-l0bc3h:\r
- call assert_eol\r
- xor a\r
-l0bc7h:\r
- push af\r
- call sub_0bdch\r
- call outbl4\r
- pop af\r
- inc a\r
- bit 0,a\r
- push af\r
- call z,crlf\r
- pop af\r
- cp YREG_CNT\r
- jr c,l0bc7h\r
- ret\r
-\r
-sub_0bdch:\r
- ld c,a\r
- ld b,0\r
- add a,'0'+080h\r
- ld de,msg_Y+1\r
- ld (de),a\r
- dec de\r
- ld hl,reg_Y\r
- add hl,bc\r
- add hl,bc\r
- ex de,hl\r
- ld c,003h\r
- jp l0c33h\r
\r
;-------------------------------------------------------------------------------\r
; > X\r
ex de,hl\r
ld hl,t_reg_names\r
call sel_dc_string\r
-l0c12h:\r
call l0c33h\r
-l0c15h:\r
+\r
call outbl\r
push de\r
push bc\r
ld a,(de)\r
dec de\r
ld h,a\r
- bit 1,c\r
- jp z,out_hl\r
- jp out.hl.@\r
+ jp out_hl\r
\r
l0c4fh:\r
call p_f\r
call get_lastarg_def\r
l0d60h:\r
ld (last_S),hl\r
- call out.hl.@\r
+ call out_hl\r
call outbl\r
ld a,(hl)\r
call out_hex\r
; > @\r
; examine (substitute) displacement register @\r
\r
-cmd_@:\r
- call assert_eol\r
- ld hl,msg_@\r
- ld de,var.@\r
- ld c,001h\r
- jp l0c12h\r
-\r
-msg_@:\r
- dc '@'\r
+;cmd_@:\r
\r
;-------------------------------------------------------------------------------\r
; >>I [port]\r
; Input a byte from port\r
\r
cmd_I:\r
- ld hl,cmd_I\r
ld (cmd_rpt),hl\r
ld hl,(last_I)\r
call get_lastarg_def\r
; Output a byte to a port\r
\r
cmd_O:\r
- ld hl,cmd_O\r
ld (cmd_rpt),hl\r
ld hl,(last_O_val)\r
call get_arg_def\r
cp b\r
jr z,l0e10h\r
ld c,a\r
- call out.hl.@\r
+ call out_hl\r
call outbl\r
ld a,b\r
call out_hex\r
call out_hex\r
call outbl\r
ex de,hl\r
- call out.hl.@\r
+ call out_hl\r
ex de,hl\r
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
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
; off all loaded files, and Top address of available memory\r
; > H expression\r
; evaluate expression and display result in hex, decimal and other formats\r
-; > H expression expression\r
-; display sum und difference of expressions\r
\r
cmd_H:\r
call expr\r
jp c,p_max_high0\r
- call next_arg\r
- push hl\r
- call expr\r
- push af\r
call assert_eol\r
- pop af\r
- ex de,hl\r
- pop hl\r
- jr c,l0e5eh\r
- push hl\r
- push de\r
- add hl,de\r
- call l0e5eh\r
- pop de\r
- pop hl\r
- and a\r
- sbc hl,de\r
-l0e5eh:\r
call out_hl\r
call outbl2\r
call out_hl_neg\r
; 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
- jr nz,l0eb0h\r
+ push hl\r
+ push de\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
- call sub_0f58h\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
+ ld bc,16\r
+ and a ;clear carry\r
+ call sub_0f58h\r
pop bc\r
l0eb0h:\r
inc hl\r
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
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
; Display memory in hex and ASCII\r
\r
cmd_D:\r
- ld hl,cmd_D\r
ld (cmd_rpt),hl\r
ld hl,(last_D)\r
ld bc,128\r
push hl\r
push af\r
l0f5ch:\r
- call out.hl.@\r
- call z,outbl2\r
- call outbl\r
+ call out_hl\r
+ call outbl2\r
ld de,0\r
l0f68h:\r
ld a,(hl)\r
; > Fcommandline\r
; specifiy filenames and command line\r
\r
-cmd_F:\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
- inc hl\r
- inc de\r
- and a\r
- jr nz,l0fb6h\r
- ld a,l\r
- sub DMA_BUF+2\r
- ld (DMA_BUF),a\r
- pop hl\r
- ld de,dfcb1\r
- call parse_filename\r
- ld de,dfcb2\r
- ;fall thru\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
- ret\r
+;cmd_F:\r
\r
;-------------------------------------------------------------------------------\r
+; > R [displacement]\r
+; Read Intel Hex File from console [add displacement]\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
-\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
+cmd_R:\r
+ ld hl,0\r
+ call get_lastarg_def ;get offset from command line\r
push hl\r
- add a,07fh\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
- ld h,000h\r
- ld a,(hl)\r
- pop hl\r
- cp 01ah\r
- ret\r
-\r
-read_sector:\r
- push hl\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
- 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
+ push hl\r
+ add hl,de\r
+ call i.storebyte\r
pop hl\r
- ret\r
-\r
-cmdR_storebyte:\r
- push af\r
- push de\r
- ld de,TPA\r
- call cp_hl_de\r
- jr c,error2\r
- ld de,(BDOS+1)\r
- call cp_hl_de\r
- jr nc,error2\r
- ld de,(high_load)\r
- call cp_hl_de\r
- jr c,l1157h\r
- ld (high_load),hl\r
-l1157h:\r
- ld de,(max_load)\r
- call cp_hl_de\r
- jr c,l1163h\r
- ld (max_load),hl\r
-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
+ djnz l16c6h ;repeat for record len\r
+ call i.gethexbyte ;checksum\r
+ ld a,c\r
+ and a\r
+ jp nz,ERROR ;exit if checksum error\r
+ jr w_recstart ;next record\r
+rdhex_done:\r
+ pop hl\r
+ call i.gethexbyte\r
+ jp p_max_high\r
\r
-read_hexchar:\r
- call read_hexdigit\r
+i.gethexbyte:\r
+ call sub_16f6h\r
rlca\r
rlca\r
rlca\r
rlca\r
ld d,a\r
- call read_hexdigit\r
+ call sub_16f6h\r
add a,d\r
ld d,a\r
add a,c\r
ld a,d\r
ret\r
\r
-read_hexdigit:\r
- call read_byte\r
+sub_16f6h:\r
+ call i.getchar\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
+i.getchar:\r
+ call incharw\r
+ cp 01ah\r
+ ret\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
+i.storebyte:\r
+ push af\r
+ push de\r
+ ld de,TPA ;lowest allowed load address\r
+ call cp_hl_de\r
+ jr c,error2\r
+ ld de,(BDOS+1) ;highest allowed load address\r
+ call cp_hl_de\r
+ jr nc,error2\r
+ ld de,(high_load)\r
+ call cp_hl_de\r
+ jr c,l1157h\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
+l1157h:\r
+ ld de,(max_load)\r
+ call cp_hl_de\r
+ jr c,l1163h\r
+ ld (max_load),hl\r
+l1163h:\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
+ pop af\r
+ ld (hl),a ;store byte\r
ret\r
\r
;-------------------------------------------------------------------------------\r
; > 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
; List disassembled code\r
\r
cmd_L:\r
- ld hl,cmd_L\r
ld (cmd_rpt),hl\r
call expr\r
jr nc,l18dbh\r
\r
p_disas_line:\r
call outbl2\r
- call out.hl.@\r
+ call out_hl\r
call z,outbl\r
call outbl\r
sub a\r
call p_goto_col\r
; fall thru\r
;-------------------------------------------------------------------------------\r
-\r
-p_offset:\r
- ld de,(var.@)\r
- ld a,d\r
- or e\r
- ret z\r
- call pstr_inl\r
- dc '(@'\r
- and a\r
- sbc hl,de\r
- call out_hl\r
- add hl,de\r
- jp out_rparen\r
+ ret\r
\r
;-------------------------------------------------------------------------------\r
\r
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
;-------------------------------------------------------------------------------\r
; call mn call cc,mn\r
l2080h:\r
- ld a,(b_21e2_start)\r
- and a\r
- jr nz,l208bh\r
- ld a,(trace_call_flag)\r
- and a\r
- ret nz\r
\r
; jp mn jp cc,mn\r
l208bh:\r
jp (hl)\r
\r
l20dch:\r
- ld a,(b_21e2_start)\r
- and a\r
- jr nz,l20edh\r
- ld a,(trace_call_flag)\r
- and a\r
- jr z,l20edh\r
- call l20edh\r
- pop hl\r
- ret\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
ld h,000h\r
ld a,(b_21e2_start)\r
and a\r
- jr nz,l2113h\r
- ld a,(trace_call_flag)\r
- and a\r
- ret nz\r
-l2113h:\r
+ ret z\r
+\r
scf\r
ret\r
\r
; >>C[N][J] U expression\r
; trace over Calls [No list] [Jumps only] /.While./.Until.\r
\r
-cmd_C:\r
- ld hl,cmd_C\r
- ld a,1\r
- jr cmd_tc\r
\r
;-------------------------------------------------------------------------------\r
; >>T[N][J] [steps]\r
; Trace [no List] [Jumps only] / .While. / .Until.\r
\r
cmd_T:\r
- xor a\r
- ld hl,cmd_T\r
-cmd_tc:\r
ld (cmd_rpt),hl\r
- ld (trace_call_flag),a\r
- call get_char_upper\r
- sub 'N'\r
- jr nz,tc_non\r
- inc de\r
-tc_non:\r
- ld (trace_N_flag),a\r
- call get_char_upper\r
- sub 'J'\r
- jr nz,tc_noj\r
- inc de\r
-tc_noj:\r
- ld (trace_J_flag),a\r
- call tc_chk_u_or_w\r
- jr z,tc_save_uw_expr_ptr\r
ld hl,1 ;default: 1 step\r
call get_lastarg_def\r
-tc_save_uw_expr_ptr:\r
ld (trace_cnt_or_ptr),hl\r
sub a\r
ld (bp_p_cpu_flag),a\r
-l214ch:\r
call tc_set_bp\r
jr user_go1\r
\r
l2151h:\r
call bp_clr_temporary\r
- ld a,(trace_J_flag)\r
- and a\r
- jr nz,l216bh\r
- ld iy,(reg.pc)\r
- call sub_21c8h\r
- jr z,l216bh\r
- ld hl,b_2048_start\r
- call lookup_opc\r
- jr nc,l214ch\r
-l216bh:\r
- ld a,(trace_UW_flag) ;0 or 'U' or 'W'\r
- and a\r
- jr z,tc_cnt ;flag is 0, check for step count.\r
- ld de,(trace_cnt_or_ptr)\r
- call expr\r
- ld a,h\r
- or l\r
- add a,0ffh\r
- sbc a,a\r
- ld hl,trace_UW_flag ;'U' or 'W'\r
- xor (hl)\r
- bit 1,a ;'U' = 55H, 'W' = 57H\r
- jr z,l2193h\r
-do_break0: ;print registers and go to main loop\r
- jp do_break\r
-\r
-tc_cnt:\r
ld hl,(trace_cnt_or_ptr)\r
dec hl\r
ld (trace_cnt_or_ptr),hl\r
ld a,h\r
or l\r
- jr z,do_break0\r
-l2193h:\r
+ jp z,do_break\r
+\r
call tc_set_bp\r
- jr nc,do_break0\r
- ld a,(trace_N_flag)\r
- ld b,a\r
- ld a,(bp_p_cpu_flag)\r
- or b\r
+ jp nc,do_break\r
+ sbc a,a\r
ld (bp_p_cpu_flag),a\r
user_go1:\r
jp user_go\r
\r
-tc_chk_u_or_w:\r
- call skipbl\r
- xor a\r
- ld (trace_UW_flag),a\r
- call get_char_upper\r
- cp 'U'\r
- jr z,l21b5h\r
- cp 'W'\r
- ret nz\r
-l21b5h:\r
- inc de\r
- push af\r
- push de\r
- call expr\r
- jp c,ERROR\r
- call assert_eol\r
- pop hl\r
- pop af\r
- ld (trace_UW_flag),a\r
- sub a\r
- ret\r
-\r
-sub_21c8h:\r
- ld a,(iy+000h)\r
- cp 0edh\r
- jr z,l21dah\r
- and 0dfh\r
- cp 0ddh\r
- ret nz\r
- ld a,(iy+001h)\r
- cp 0e9h\r
- ret\r
-l21dah:\r
- ld a,(iy+001h)\r
- and 0f7h\r
- cp 045h\r
- ret\r
-\r
;-------------------------------------------------------------------------------\r
\r
con_col:\r
\r
b_21e2_start:\r
db 0\r
-trace_call_flag:\r
- db 0 ;1=call, 0=trace\r
-trace_UW_flag:\r
- db 0 ;0 or 'U' or 'W'\r
trace_cnt_or_ptr:\r
dw 0\r
-trace_N_flag:\r
- db 0 ;0 if 'N'\r
-trace_J_flag:\r
- db 0 ;0 if 'J'\r
\r
bp_p_cpu_flag:\r
db 0\r
endm\r
endm\r
\r
-expr_p1:\r
- dw expr_buf\r
-\r
expr_buf:\r
current_cseg defl $ - current_cseg\r
.phase current_phase + current_cseg\r
\r
;-------------------------------------------------------------------------------\r
\r
-msg_Y:\r
- dc 'Yn'\r
-reg_Y:\r
- rept YREG_CNT\r
- dw 0\r
- endm\r
-\r
last_S:\r
dw TPA\r
\r
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
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