From c788b3b79519c9f97c29c8c86f96708eef59a63c Mon Sep 17 00:00:00 2001 From: Leo C Date: Wed, 10 Aug 2016 16:47:42 +0200 Subject: [PATCH] Add symfile read function. --- ddt180.z80 | 534 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 336 insertions(+), 198 deletions(-) diff --git a/ddt180.z80 b/ddt180.z80 index ec59e03..24e2dcc 100644 --- a/ddt180.z80 +++ b/ddt180.z80 @@ -36,8 +36,8 @@ CR equ 13 ; CP/M memory layout BDOS equ 5 -FCB equ 05ch -FCB2 equ 06ch +dfcb1 equ 05ch +dfcb2 equ 06ch DMA_BUF equ 080h TPA equ 0100h @@ -68,12 +68,14 @@ YREG_CNT equ 10 ;Number of Y registers (0..9) ;------------------------------------------------------------------------------- ddtz_base: - jp 0 ;0000 c3 00 00 . . . + jp ddtz_bdos l0003h: - rst 30h ;0003 f7 . + rst 30h sub_0004h: - nop ;0004 00 . - ret ;0005 c9 . + nop + ret +ddtz_bdos: + jp 0 current_cseg defl $ - current_cseg .phase current_phase + current_cseg @@ -124,42 +126,43 @@ cmd_rpt:dw mainloop conbuf: db CONBUF_SIZE - ld sp,stack ;006b 31 46 00 1 F . - exx ;006e d9 . - ld de,ddtz_base ;006f 11 00 00 . . . - or a ;0072 b7 . - sbc hl,de ;0073 ed 52 . R - add hl,de ;0075 19 . - jr c,l0079h ;0076 38 01 8 . - ex de,hl ;0078 eb . + ld sp,stack + exx + ld de,ddtz_base + or a + sbc hl,de + add hl,de + jr c,l0079h + ex de,hl l0079h: - ld de,TPA ;0079 11 00 01 . . . + ld de,TPA l007ch: - dec hl ;007c 2b + - ld (hl),000h ;007d 36 00 6 . - ld a,h ;007f 7c | - sub d ;0080 92 . - ld b,a ;0081 47 G - ld a,l ;0082 7d } - sub e ;0083 93 . - or b ;0084 b0 . - jr nz,l007ch ;0085 20 f5 . - ld a,i ;0087 ed 57 . W - ld (reg.i),a ;0089 32 4f 00 2 O . - ld a,0f3h ;008c 3e f3 > . - jp po,l0093h ;008e e2 93 00 . . . - ld a,0fbh ;0091 3e fb > . + dec hl + ld (hl),000h + ld a,h + sub d + ld b,a + ld a,l + sub e + or b + jr nz,l007ch + ld a,i + ld (reg.i),a + ld a,0f3h + jp po,l0093h + ld a,0fbh l0093h: - ld (reg.iff),a ;0093 32 5e 00 2 ^ . - call sub_0004h ;0096 cd 04 00 . . . - ld hl,ddtz_base ;0099 21 00 00 ! . . - ld l,000h ;009c 2e 00 . . - ld (reg_sp),hl ;009e 22 5c 00 " \ . - ld a,(FCB+1) ;00a1 3a 5d 00 : ] . - cp ' ' ;00a4 fe 20 . - ld hl,0 ;00a6 21 00 00 ! . . - call nz,read_file ;00a9 c4 68 10 . h . - jr mainloop ;00ac 18 0f . . + ld (reg.iff),a + call sub_0004h + ld hl,ddtz_base + ld l,000h + ld (reg_sp),hl + call cpy_fcb2 + ld a,(dfcb1+1) + cp ' ' + ld hl,0 + call nz,read_file + jr mainloop ds CONBUF_SIZE + 3 - ($ - conbuf) @@ -238,7 +241,7 @@ get_line: push hl ;014e e5 . ld de,conbuf ;014f 11 6a 00 . j . ld c,BDOS_CBUF ;0152 0e 0a . . - call ddtz_base ;0154 cd 00 00 . . . + call ddtz_bdos ;0154 cd 00 00 . . . call crlf ;0157 cd a3 02 . . . ld de,conbuf+1 ;015a 11 6b 00 . k . ld a,(de) ;015d 1a . @@ -437,7 +440,7 @@ outchar: and 07fh ;0261 e6 7f .  ld e,a ;0263 5f _ ld c,BDOS_COUT ;0264 0e 02 . . - call ddtz_base ;0266 cd 00 00 . . . + call ddtz_bdos ;0266 cd 00 00 . . . ld hl,con_col ;0269 21 72 02 ! r . inc (hl) ;026c 34 4 pop af ;026d f1 . @@ -451,11 +454,11 @@ inchar: push de ;0274 d5 . push bc ;0275 c5 . ld c,BDOS_CSTAT ;0276 0e 0b . . - call ddtz_base ;0278 cd 00 00 . . . + call ddtz_bdos ;0278 cd 00 00 . . . and a ;027b a7 . jr z,l0284h ;027c 28 06 ( . ld c,BDOS_CIN ;027e 0e 01 . . - call ddtz_base ;0280 cd 00 00 . . . + call ddtz_bdos ;0280 cd 00 00 . . . scf ;0283 37 7 l0284h: pop bc ;0284 c1 . @@ -985,7 +988,7 @@ do_factor: call get.number ;04e7 cd aa 05 . . . ret nc ;04ea d0 . inc de ;04eb 13 . - ld hl,ddtz_base-1 ;04ec 21 ff ff ! . . + ld hl,(BDOS+1) ;04ec 21 ff ff ! . . cp 'T' ;04ef fe 54 . T ret z ;04f1 c8 . ld hl,(high_load) ;04f2 2a 9c 11 * . . @@ -1197,33 +1200,33 @@ sub_060ch: jr l0614h ;060f 18 03 . . get.hexdigit: - ld a,(de) ;0611 1a . + ld a,(de) hex_digit: - cp 'F'+1 ;0612 fe 47 . G + cp 'F'+1 l0614h: - ccf ;0614 3f ? - ret c ;0615 d8 . - cp 'A' ;0616 fe 41 . A - jr c,l061eh ;0618 38 04 8 . - sub 'A'-10 ;061a d6 37 . 7 - ret ;061c c9 . + ccf + ret c + cp 'A' + jr c,l061eh + sub 'A'-10 + ret get.decdigit: - ld a,(de) ;061d 1a . + ld a,(de) l061eh: - cp '9'+1 ;061e fe 3a . : - jr l0625h ;0620 18 03 . . + cp '9'+1 + jr l0625h get.bindigit: - ld a,(de) ;0622 1a . - cp '1'+1 ;0623 fe 32 . 2 + ld a,(de) + cp '1'+1 l0625h: - ccf ;0625 3f ? - ret c ;0626 d8 . - cp '0' ;0627 fe 30 . 0 - ret c ;0629 d8 . - sub '0' ;062a d6 30 . 0 - ret ;062c c9 . + ccf + ret c + cp '0' + ret c + sub '0' + ret p_cpustat0: call assert_eol ;062d cd d6 02 . . . @@ -2523,24 +2526,33 @@ l0fach: ret ;0fae c9 . cmd_F: - push de ;0faf d5 . - ld hl,DMA_BUF+1 ;0fb0 21 81 00 ! . . - ld (hl),' ' ;0fb3 36 20 6 - inc hl ;0fb5 23 # + push de + ld hl,DMA_BUF+1 + ld (hl),' ' + inc hl l0fb6h: - ld a,(de) ;0fb6 1a . - ld (hl),a ;0fb7 77 w - inc hl ;0fb8 23 # - inc de ;0fb9 13 . - and a ;0fba a7 . - jr nz,l0fb6h ;0fbb 20 f9 . - ld a,l ;0fbd 7d } - sub DMA_BUF+2 ;0fbe d6 82 . . - ld (DMA_BUF),a ;0fc0 32 80 00 2 . . - pop hl ;0fc3 e1 . - ld de,FCB ;0fc4 11 5c 00 . \ . - call parse_filename ;0fc7 cd cd 0f . . . - ld de,FCB2 ;0fca 11 6c 00 . l . + ld a,(de) + ld (hl),a + inc hl + inc de + and a + jr nz,l0fb6h + ld a,l + sub DMA_BUF+2 + ld (DMA_BUF),a + pop hl + 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 ;0fcd cd 2c 10 . , . @@ -2641,120 +2653,32 @@ sub_1043h: cp ',' ;1049 fe 2c . , ret ;104b c9 . -fcb_clear_rc: - xor a ;104c af . - ld hl,FCB+12 ;104d 21 68 00 ! h . - ld b,21 ;1050 06 15 . . +setup_fcb: + push de + ld hl,12 + add hl,de + xor a + ld b,21 l1052h: - ld (hl),a ;1052 77 w - inc hl ;1053 23 # - djnz l1052h ;1054 10 fc . . - ld de,DMA_BUF ;1056 11 80 00 . . . - ld c,BDOS_SETDMA ;1059 0e 1a . . - call ddtz_base ;105b cd 00 00 . . . - ld de,FCB ;105e 11 5c 00 . \ . - ret ;1061 c9 . + ld (hl),a + inc hl + djnz l1052h + ld de,DMA_BUF + ld c,BDOS_SETDMA + call ddtz_bdos + pop de + ret -cmd_R: - ld hl,0 ;1062 21 00 00 ! . . - call get_lastarg_def ;1065 cd 69 03 . i . -read_file: - push hl ;1068 e5 . - ld hl,0 ;1069 21 00 00 ! . . - ld (high_load),hl ;106c 22 9c 11 " . . - call fcb_clear_rc ;106f cd 4c 10 . L . +file_open: + ld (cur_fcb),de + call setup_fcb ;106f cd 4c 10 . L . ld c,BDOS_OPEN ;1072 0e 0f . . - call ddtz_base ;1074 cd 00 00 . . . + call ddtz_bdos ;1074 cd 00 00 . . . inc a ;1077 3c < jp z,ERROR ;1078 ca 07 01 . . . - ld hl,FCB+9 ;107b 21 65 00 ! e . - ld de,str_hex ;107e 11 a5 10 . . . - ld b,3 ;1081 06 03 . . - call strncmp ;1083 cd 67 11 . g . - pop hl ;1086 e1 . - jr z,read_hexfile ;1087 28 1f ( . - ld de,TPA ;1089 11 00 01 . . . - add hl,de ;108c 19 . - push hl ;108d e5 . -l108eh: - call read_sector ;108e cd 21 11 . ! . - pop hl ;1091 e1 . - jp z,p_max_high ;1092 ca 72 11 . r . - ld de,DMA_BUF ;1095 11 80 00 . . . - ld b,080h ;1098 06 80 . . -l109ah: - ld a,(de) ;109a 1a . - call cmdR_storebyte ;109b cd 36 11 . 6 . - inc de ;109e 13 . - inc hl ;109f 23 # - djnz l109ah ;10a0 10 f8 . . - push hl ;10a2 e5 . - jr l108eh ;10a3 18 e9 . . - -str_hex: - db 'HEX' ;10a5 48 H E X - -read_hexfile: - push hl ;10a8 e5 . ld a,080h ;10a9 3e 80 > . ld (cmdR_rindex),a ;10ab 32 20 11 2 . -l10aeh: - call read_byte ;10ae cd 05 11 . . . - jr z,rdhex_done ;10b1 28 31 ( 1 - cp ':' ;10b3 fe 3a . : - jr nz,l10aeh ;10b5 20 f7 . - ld c,0 ;10b7 0e 00 . . - call read_hexchar ;10b9 cd e8 10 . . . - ld b,a ;10bc 47 G - call read_hexchar ;10bd cd e8 10 . . . - ld h,a ;10c0 67 g - call read_hexchar ;10c1 cd e8 10 . . . - ld l,a ;10c4 6f o - ld a,b ;10c5 78 x - and a ;10c6 a7 . - jr z,rdhex_done ;10c7 28 1b ( . - call read_hexchar ;10c9 cd e8 10 . . . -l10cch: - call read_hexchar ;10cc cd e8 10 . . . - pop de ;10cf d1 . - push de ;10d0 d5 . - push hl ;10d1 e5 . - add hl,de ;10d2 19 . - call cmdR_storebyte ;10d3 cd 36 11 . 6 . - pop hl ;10d6 e1 . - inc hl ;10d7 23 # - djnz l10cch ;10d8 10 f2 . . - call read_hexchar ;10da cd e8 10 . . . - ld a,c ;10dd 79 y - and a ;10de a7 . - jp nz,ERROR ;10df c2 07 01 . . . - jr l10aeh ;10e2 18 ca . . -rdhex_done: - pop hl ;10e4 e1 . - jp p_max_high ;10e5 c3 72 11 . r . - -read_hexchar: - call read_hexdigit ;10e8 cd f9 10 . . . - rlca ;10eb 07 . - rlca ;10ec 07 . - rlca ;10ed 07 . - rlca ;10ee 07 . - ld d,a ;10ef 57 W - call read_hexdigit ;10f0 cd f9 10 . . . - add a,d ;10f3 82 . - ld d,a ;10f4 57 W - add a,c ;10f5 81 . - ld c,a ;10f6 4f O - ld a,d ;10f7 7a z - ret ;10f8 c9 . - -read_hexdigit: - call read_byte ;10f9 cd 05 11 . . . - jr z,l1102h ;10fc 28 04 ( . - call hex_digit ;10fe cd 12 06 . . . - ret nc ;1101 d0 . -l1102h: - jp ERROR ;1102 c3 07 01 . . . + ret read_byte: ld a,(cmdR_rindex) ;1105 3a 20 11 : . @@ -2779,9 +2703,9 @@ read_sector: push hl ;1121 e5 . push de ;1122 d5 . push bc ;1123 c5 . - ld de,FCB ;1124 11 5c 00 . \ . + ld de,(cur_fcb) ;1124 11 5c 00 . \ . ld c,BDOS_READ ;1127 0e 14 . . - call ddtz_base ;1129 cd 00 00 . . . + call ddtz_bdos ;1129 cd 00 00 . . . dec a ;112c 3d = jr z,l1132h ;112d 28 03 ( . jp p,ERROR ;112f f2 07 01 . . . @@ -2824,6 +2748,212 @@ strncmp: djnz strncmp ;116c 10 f9 . . ret ;116e c9 . +str_hex: + db 'HEX' + +read_hexchar: + call read_hexdigit + rlca + rlca + rlca + rlca + ld d,a + call read_hexdigit + add a,d + ld d,a + add a,c + ld c,a + ld a,d + ret + +read_hexdigit: + call read_byte + jr z,error8 +hex_digit_v: + call hex_digit + ret nc +error8: + 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 + +cmd_R: + ld hl,0 ;1062 21 00 00 ! . . + call get_lastarg_def ;1065 cd 69 03 . i . +read_file: + ld de,dfcb1+1 + ld a,(de) + cp '?' + jr z,read_symfile + dec de + push hl ;1068 e5 . + ld hl,0 ;1069 21 00 00 ! . . + ld (high_load),hl ;106c 22 9c 11 " . . + call file_open + ld hl,dfcb1+9 ;107b 21 65 00 ! e . + ld de,str_hex ;107e 11 a5 10 . . . + ld b,3 ;1081 06 03 . . + call strncmp ;1083 cd 67 11 . g . + pop hl ;1086 e1 . + jr z,read_hexfile ;1087 28 1f ( . + ld de,TPA ;1089 11 00 01 . . . + add hl,de ;108c 19 . + push hl ;108d e5 . +l108eh: + call read_sector ;108e cd 21 11 . ! . + pop hl ;1091 e1 . + jr z,read_symfile ;1092 ca 72 11 . r . + ld de,DMA_BUF ;1095 11 80 00 . . . + ld b,080h ;1098 06 80 . . +l109ah: + ld a,(de) ;109a 1a . + call cmdR_storebyte ;109b cd 36 11 . 6 . + inc de ;109e 13 . + inc hl ;109f 23 # + djnz l109ah ;10a0 10 f8 . . + push hl ;10a2 e5 . + jr l108eh ;10a3 18 e9 . . + +read_hexfile: + push hl ;10a8 e5 . +l10aeh: + call read_byte ;10ae cd 05 11 . . . + jr z,rdhex_done ;10b1 28 31 ( 1 + cp ':' ;10b3 fe 3a . : + jr nz,l10aeh ;10b5 20 f7 . + ld c,0 ;10b7 0e 00 . . + call read_hexchar ;10b9 cd e8 10 . . . + ld b,a ;10bc 47 G + call read_hexchar ;10bd cd e8 10 . . . + ld h,a ;10c0 67 g + call read_hexchar ;10c1 cd e8 10 . . . + ld l,a ;10c4 6f o + ld a,b ;10c5 78 x + and a ;10c6 a7 . + jr z,rdhex_done ;10c7 28 1b ( . + call read_hexchar ;10c9 cd e8 10 . . . +l10cch: + call read_hexchar ;10cc cd e8 10 . . . + pop de ;10cf d1 . + push de ;10d0 d5 . + push hl ;10d1 e5 . + add hl,de ;10d2 19 . + call cmdR_storebyte ;10d3 cd 36 11 . 6 . + pop hl ;10d6 e1 . + inc hl ;10d7 23 # + djnz l10cch ;10d8 10 f2 . . + call read_hexchar ;10da cd e8 10 . . . + ld a,c ;10dd 79 y + and a ;10de a7 . + jr nz,error9 ;10df c2 07 01 . . . + jr l10aeh ;10e2 18 ca . . +rdhex_done: + pop hl ;10e4 e1 . + jr read_symfile ;10e5 c3 72 11 . r . + +read_symfile: + ld de,fcbsym+1 + ld a,(de) + cp ' ' + jp z,p_max_high + + ld hl,msg_symbols + call pstr + + 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 + 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 ; +;------------------------------------------------------------------------ + p_max_high0: call assert_eol ;116f cd d6 02 . . . p_max_high: @@ -2837,6 +2967,8 @@ p_max_high: call out_hl ;1187 cd 13 02 . . . jp crlf ;118a c3 a3 02 . . . +msg_symbols: + db 'SYMBOLS',CR,LF+80h msg_high: DC 'High = ' msg_max: @@ -2854,16 +2986,17 @@ l11adh: and 080h ;11ad e6 80 . . ld c,a ;11af 4f O push bc ;11b0 c5 . - ld a,(FCB+1) ;11b1 3a 5d 00 : ] . + ld a,(dfcb1+1) ;11b1 3a 5d 00 : ] . cp ' ' ;11b4 fe 20 . jr z,error5 ;11b6 28 3b ( ; - call fcb_clear_rc ;11b8 cd 4c 10 . L . + ld de,dfcb1 + call setup_fcb ;11b8 cd 4c 10 . L . push de ;11bb d5 . ld c,BDOS_DELETE ;11bc 0e 13 . . - call ddtz_base ;11be cd 00 00 . . . + call ddtz_bdos ;11be cd 00 00 . . . pop de ;11c1 d1 . ld c,BDOS_CREATE ;11c2 0e 16 . . - call ddtz_base ;11c4 cd 00 00 . . . + call ddtz_bdos ;11c4 cd 00 00 . . . inc a ;11c7 3c < jr z,error5 ;11c8 28 29 ( ) pop bc ;11ca c1 . @@ -2887,9 +3020,9 @@ l11cch: write_sector: push hl ;11e4 e5 . - ld de,FCB ;11e5 11 5c 00 . \ . + ld de,dfcb1 ;11e5 11 5c 00 . \ . ld c,BDOS_WRITE ;11e8 0e 15 . . - call ddtz_base ;11ea cd 00 00 . . . + call ddtz_bdos ;11ea cd 00 00 . . . pop hl ;11ed e1 . and a ;11ee a7 . ret z ;11ef c8 . @@ -2898,9 +3031,9 @@ error5: jp ERROR ;11f3 c3 07 01 . . . close_file: - ld de,FCB ;11f6 11 5c 00 . \ . + ld de,dfcb1 ;11f6 11 5c 00 . \ . ld c,BDOS_CLOSE ;11f9 0e 10 . . - jp ddtz_base ;11fb c3 00 00 . . . + jp ddtz_bdos ;11fb c3 00 00 . . . cmd_A: ld hl,(last_A) ;11fe 2a 64 12 * d . @@ -5468,7 +5601,7 @@ reloc: EXX LD HL,(BDOS+1) - LD (ldr_end+1),HL + LD (ldr_end+(ddtz_bdos+1-ddtz_base)),HL LD BC,ddtz_size-1 LD D,B LD E,0FFH @@ -5580,6 +5713,11 @@ l1ffbh: l1ffdh: db 0 +cur_fcb: + dw 0 +fcbsym: + ds 33 + ddtz_size equ $-ddtz_base ddtz_end: -- 2.39.2