; 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
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
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
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 ERROR ;cmd_Y ;examine [and substitute] Y variables\r
dw cmd_Z ;Zap (fill) memory with a byte string\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
and a\r
ret z\r
call outchar\r
- and a\r
ret m\r
jr pstr\r
\r
\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
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
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
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
ld hl,conbuf+1 ;\r
ld (hl),b ;\r
call CRLF ;\r
-\r
inc hl\r
ex de,hl\r
pop hl ;\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
; 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
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
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
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
\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
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
; 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
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
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
; > 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
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
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
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