dc ' ('\r
\r
;-------------------------------------------------------------------------------\r
-; Determine current execution position\r
+; Clear old position\r
+\r
+cmde_clr:\r
+ ld (hl),0\r
+ inc hl\r
+ dec bc\r
+ ld a,b\r
+ or c\r
+ jr nz,cmde_clr\r
+\r
+; Determine current position\r
\r
reloc:\r
- ld bc,(0)\r
- ld de,(2)\r
- ld sp,4\r
+ ld bc,(028h-2)\r
+ ld de,(028h)\r
+ ld a,i ;get iff2\r
+ ex af,af'\r
+ di\r
+ ld sp,028h ;rst instr needs a minimal stack\r
ld hl,0e9e1h ;opcpdes pop hl/jp (hl)\r
- ld (0),hl\r
- rst 0\r
+ ld (028h),hl\r
+ rst 028h\r
wearehere:\r
- ld (0),bc\r
- ld (2),de\r
+ ld (028h-2),bc\r
+ ld (028h),de\r
ld de,-(wearehere-ddtz_base)\r
add hl,de ; hl:\r
\r
or a\r
sbc hl,de\r
ex de,hl ; de: reloc offset\r
+ ld hl,stack\r
+ add hl,de\r
+ ld sp,hl\r
+ ex af,af'\r
+ push af\r
+ pop bc\r
+ bit 2,c\r
+ jr z,$+3\r
+ ei\r
ld hl,ddtz_end ;start of reloc bitmap\r
add hl,de\r
- ld a,l\r
- exx\r
- ld l,a\r
- exx\r
- ld a,h\r
+\r
+ push hl\r
exx\r
- ld h,a\r
+ pop hl\r
ld bc,0108h ;init bit counter b (c==reload val)\r
exx\r
+\r
LD HL,ddtz_base\r
add hl,de ;--> ddtz_base\r
ld bc,prog_size\r
;-------------------------------------------------------------------------------\r
\r
\r
-\r
-;-------------------------------------------------------------------------------\r
-\r
-\r
init::\r
LD SP,stack\r
\r
\r
;-------------------------------------------------------------------------------\r
\r
-;; Relocation loader\r
-;;\r
-;ldr_start::\r
-; LD HL,ddtz_end ;start of reloc bitmap\r
-; ld bc,0108h ;init bit counter\r
-;\r
-; EXX\r
-; LD HL,(BDOS+1)\r
-;; LD (ddtz_base+1),HL\r
-; LD BC,prog_size+bitmap_size-1\r
-; LD D,B\r
-; LD E,0FFH\r
-; INC DE ;size rounded up to next page boundary\r
-; INC BC ;ddtz_size\r
-; OR A\r
-; SBC HL,DE ;BDOS - size\r
-;; LD (BDOS+1),HL ;-> new BDOS entry\r
-;\r
-; push hl\r
-; PUSH BC\r
-; ld de,ddtz_base\r
-; sbc hl,de\r
-; EX DE,HL ;-> DE\r
-;; LD HL,ldr_size\r
-;; add hl,bc\r
-;; ld b,h\r
-;; ld c,l\r
-; ld bc,prog_size\r
-;; LD HL,TPA ;--> ddtz_base\r
-;reloc_lp:\r
-; EXX\r
-; djnz reloc_nl\r
-; ld b,c ;reload bit counter\r
-; LD e,(HL) ;get next 8 relocation bits\r
-; INC HL\r
-;reloc_nl:\r
-; sla e\r
-; EXX\r
-; JR NC,reloc_next\r
-; DEC HL\r
-; LD A,(HL)\r
-; ADD A,E\r
-; LD (HL),A\r
-; INC HL\r
-; LD A,(HL)\r
-; ADC A,D\r
-; LD (HL),A\r
-;reloc_next:\r
-; inc hl\r
-; dec bc\r
-; ld a,b\r
-; or c\r
-; jr nz,reloc_lp\r
-; dec hl\r
-;\r
-; POP BC\r
-; pop de\r
-; EX DE,HL\r
-; ADD HL,BC\r
-; EX DE,HL\r
-; DEC DE\r
-; LDDR\r
-; LD HL,conbuf+2-ddtz_base\r
-; ADD HL,DE\r
-; JP (HL)\r
-;\r
-;ldr_end::\r
-;ldr_size equ $ - ldr_start\r
-;\r
-;; Entry from relocator\r
-;;\r
-;; ld sp,stack\r
-;; exx\r
-;; ld de,ddtz_base\r
-;; call cp_hl_de\r
-;; jr c,l0079h\r
-;; ex de,hl\r
-;;l0079h:\r
-;; ld de,TPA\r
-;;l007ch:\r
-;; dec hl\r
-;; ld (hl),000h\r
-;; ld a,h\r
-;; sub d\r
-;; ld b,a\r
-;; ld a,l\r
-;; sub e\r
-;; or b\r
-;; jr nz,l007ch\r
-;\r
-;; jp\r
-;\r
-;-------------------------------------------------------------------------------\r
-\r
CMDTAB::\r
- dw ERROR ;cmd_@ ;examine/substitute the displacement register @\r
- dw ERROR ;cmd_A ;Assemble\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 ERROR ;cmd_C ;trace over Calls\r
dw cmd_D ;Display memory in hex and ascii\r
- dw ERROR ;\r
+ dw cmd_E ;rElocate debugger\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
push hl\r
ld (cmd_rpt),hl\r
inc de\r
- sub '@'\r
+ sub 'B'\r
jr c,ERROR\r
cp 'Z'+1-'@'\r
jr nc,ERROR\r
sub_01d9h:\r
call pstr_inl\r
dc '-'\r
- dec hl\r
- jp cpl.hl\r
+ jp neg.hl\r
\r
out_hl_dec_neg:\r
push hl\r
l01c9h:\r
rlca\r
push af\r
- ld a,'0'/2\r
- adc a,a\r
- call outchar\r
+ and 1\r
+ call out_dgt\r
pop af\r
djnz l01c9h\r
ld a,'"'\r
ret m\r
jr l0348h\r
\r
-sub_034eh:\r
+get_arg_range_target:\r
call get_arg_range\r
push hl\r
push bc\r
call next_arg\r
- call sub_0363h\r
+ call get_arg_final\r
ex de,hl\r
pop bc\r
pop hl\r
jr c,error0\r
ret\r
\r
-sub_0363h:\r
+get_arg_final:\r
call sub_035dh\r
l0366h:\r
jp assert_eol\r
ld h,000h\r
ret\r
\r
+fact_factinv:\r
+ call fact_factor\r
+ jr cpl.hl\r
+\r
fact_factneg:\r
call fact_factor\r
+neg.hl:\r
dec hl\r
cpl.hl:\r
ld a,h\r
ld l,a\r
ret\r
\r
-fact_factinv:\r
- call fact_factor\r
- jr cpl.hl\r
-\r
fact_mem:\r
call expr1\r
jr c,error1\r
db 000h\r
db 000h\r
\r
+;-------------------------------------------------------------------------------\r
+; > E addr\r
+; relocate debugger to addr\r
+; > ER addr\r
+; relocate just below addr\r
+;\r
+; Move debugger to given address and restart.\r
+; New location must not overlap with current location.\r
+\r
+\r
+cmd_E:\r
+ call skipbl\r
+ sub 'R'\r
+ jr nz,$+3\r
+ inc de\r
+ push af\r
+ call get_arg_final\r
+\r
+ ld bc,prog_size+bitmap_size\r
+ pop af\r
+ jr nz,cmde_bottom\r
+ sbc hl,bc\r
+cmde_bottom:\r
+ ld ix,cmde_clr-ddtz_base\r
+ ex de,hl ;de = dst\r
+ add ix,de\r
+ ld hl,ddtz_base ;hl = src\r
+\r
+ push hl\r
+ or a\r
+ sbc hl,de\r
+ call c,neg.hl ;abs(distance)\r
+ or a\r
+ sbc hl,bc\r
+ jp c,error\r
+ pop hl\r
+ push hl\r
+ push bc\r
+ ldir\r
+ pop bc\r
+ pop hl\r
+ jp (ix)\r
+\r
;-------------------------------------------------------------------------------\r
; > G [startaddr] [;breakp..]\r
; Go [to start] [with temporary breakpoints]\r
call get_line\r
call skipbl\r
jr z,l0c30h\r
- call sub_0363h\r
+ call get_arg_final\r
ex de,hl\r
pop bc\r
pop hl\r
ret\r
\r
;-------------------------------------------------------------------------------\r
-; > Vstartaddr endaddr targetaddr\r
+; > V startaddr endaddr targetaddr\r
; Verify (compare) two memory areas\r
\r
cmd_V:\r
- call sub_034eh\r
+ call get_arg_range_target\r
l0dedh:\r
push bc\r
ld a,(de)\r
; Move memory\r
\r
cmd_M:\r
- call sub_034eh\r
+ call get_arg_range_target\r
call cp_hl_de\r
jr nc,cmdm_up\r
add hl,bc\r