1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11 $FORTH_CONST (FCB-DISK-BUFFER) fcb_disk_buffer
12 $FORTH_CONST (FCB-DISK-BUFFER-DATA) fcb_disk_buffer+2
18 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
19 ;; sector buffer management
20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
22 ;; ensure that FCB sector is read
23 $FORTH_WORD (FENSURE-SECTOR)
26 (FCB-SECTOR) @ DUP 0BRANCH fensure_sector_nofile
28 (FCB-DISK-BUFFER) @ OVER = TBRANCH fensure_sector_done
30 (.") ~( reading disk sector ~ ;;"
31 DUP U. (.") ~)\x02~ ;;"
34 DUP (FCB-DISK-BUFFER) !
35 1 (FCB-DISK-BUFFER-DATA) TR-SREAD
42 fensure_sector_nofile:
43 (.") ~\x02DISK FILE NOT OPENED!\x02~ ;;"
45 $FORTH_END_WORD (FENSURE-SECTOR)
48 ;; ensure that FCB sector is read, and BLKIN is valid
49 $FORTH_WORD (FENSURE-BLKIN)
53 (FCB-BLEFT) @ 0BRANCH fensure_blkin_eof
54 (FCB-BLKIN) @ LIT 256 < TBRANCH fensure_blkin_sector
62 (FCB-SECTOR) @ 0BRANCH fensure_sector_nofile
64 $FORTH_END_WORD (FENSURE-BLKIN)
67 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
68 ;; dos_close_current_fcb:
69 ;; close current fcb (at `(fcb_curr_addr)`)
70 ;; there is no need to clear fcb, the caller will do it
71 ;; BC must be preserved
72 dos_close_current_fcb:
76 $FORTH_WORD (DOS-ERRMSG)
78 ;; ( errcode -- addr count )
79 DUP -1 = 0BRANCH .not_err1
80 DROP (") ~File not found~ ;;"
83 DROP (") ~DOS error~ ;;"
85 $FORTH_END_WORD (DOS-ERRMSG)
88 $FORTH_WORD (DOS-FOPEN)
90 ;; ( addr len -- 0/errcode )
91 (TR-FFIND) DUP 0< 0BRANCH .found
96 ;; do not read file right now
97 (TR-FILEBUF) 1- (FCB-SECTOR) !
99 (TR-GET-LAST-FSIZE) DUP (FCB-BLEFT) ! (FCB-FSIZE) !
101 $FORTH_END_WORD (DOS-FOPEN)
104 ;; caller must ensure that FCB is valid and the file is open
105 $FORTH_WORD (DOS-FGETCH)
110 (.") ~\x02BLKIN:~ ;;"
112 (.") ~\x02BLEFT:~ ;;"
114 (.") ~\x02SECTOR:~ ;;"
116 (.") ~\x02FSIZE:~ ;;"
120 (FCB-BLEFT) @ TBRANCH freadch_not_eof
122 (.") ~\x02(reading char: EOF)\x02~ ;;"
127 (.") ~\x02(reading char...)\x02~ ;;"
130 DUP LIT 256 < TBRANCH freadch_ok
139 ;; decrement bytes left
142 (FCB-DISK-BUFFER-DATA) + C@
145 DUP XEMIT SPACE DUP U. CR
148 $FORTH_END_WORD (DOS-FGETCH)
151 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
152 ;; convert file name to TR-DOS file name
153 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
155 $FORTH_CONST (TLOAD-NAME-BUF) tload_name_buf
156 ;; 9 bytes: name and ext
157 tload_name_buf: defb 0,0,0,0,0,0,0,0,0
159 $FORTH_WORD (DOS-PARSE-NAME)
161 ;; ( addr len defext -- newaddr len )
162 (TLOAD-NAME-BUF) LIT 9 BLANKS
164 LIT 8 MIN (TLOAD-NAME-BUF) SWAP CMOVE
165 R> ?DUP 0BRANCH trd_parse_name_done
166 (TLOAD-NAME-BUF) LIT 8 + C!
168 (TLOAD-NAME-BUF) LIT 9
170 $FORTH_END_WORD (DOS-PARSE-NAME)
172 $FORTH_WORD (DOS-TYPE-NAME)
175 ?DUP 0BRANCH fword_trd_type_name_skip
176 2DUP 1- -TRAILING XTYPE
177 + 1- C@ DUP 0BRANCH fword_trd_type_name_skip
180 fword_trd_type_name_skip:
183 $FORTH_END_WORD (DOS-TYPE-NAME)