]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/blame - cbios/sdio.180
Reverse local stack patch for sdio/cfio
[z180-stamp-cpm3.git] / cbios / sdio.180
CommitLineData
ea5293bb
L
1 TITLE 'sd disk handler'\r
2\r
3; CP/M-80 Version 3 -- Modular BIOS\r
4\r
5\r
ea5293bb
L
6 ; Disk drive dispatching tables for linked BIOS\r
7\r
8 public sd0,sd1,sd2,sd3\r
b625464d 9 public sd4,sd5,sd6,sd7\r
ea5293bb
L
10\r
11 ; Variables containing parameters passed by BDOS\r
12\r
aeb747d4 13 extrn @xdph,@op\r
ea5293bb 14 extrn @adrv,@rdrv\r
1d26b866
L
15 extrn @trk,@sect,@cnt\r
16 extrn @dma,@dbnk\r
ea5293bb
L
17\r
18 ; System Control Block variables\r
19\r
20 extrn @ermde ; BDOS error mode\r
21\r
aeb747d4 22 ; Utility routines\r
ea5293bb
L
23\r
24 extrn ?wboot ; warm boot vector\r
aeb747d4
L
25 extrn ?pmsg ; print message @<HL>\r
26 extrn pr.idx ; print indexed message\r
27 extrn pr.inln,pr.crlf ; print inline message, print <cr><lf>\r
28 extrn pr.errors ; print BIOS disk error header\r
29 extrn bnk2phy ; translate banked to physical linear address\r
30 extrn msg.sm ; send message to AVR\r
31 extrn msg.recv ; receive message from AVR\r
32 extrn add_hla ; add <A> to <HL>\r
ea5293bb
L
33\r
34\r
35 ; Port Address Equates\r
36\r
37 include config.inc\r
38 include z180reg.inc\r
39\r
40 ; CP/M 3 Disk definition macros\r
41\r
aeb747d4 42 maclib cpm3slr.lib\r
ea5293bb
L
43\r
44 ; Z180 macro library instruction definitions (ignored by slr180)\r
45\r
46 include z180.lib\r
47\r
48 ; common control characters\r
49\r
50cr equ 13\r
51lf equ 10\r
52bell equ 7\r
53\r
54\r
50f3b8f0
L
55 dseg\r
56\r
ea5293bb
L
57 ; Extended Disk Parameter Headers (XPDHs)\r
58\r
1e56f376
L
59 ; dph translate$table, - disk parameter header\r
60 ; disk$parameter$block,\r
61 ; checksum$size, (optional)\r
62 ; alloc$size (optional)\r
63\r
ea5293bb
L
64 dw sd$write\r
65 dw sd$read\r
66 dw sd$login\r
67 dw sd$init0\r
68 db 0,0 ; relative drive zero\r
69sd0: dph 0,dpbsimhd512\r
70\r
71 dw sd$write\r
72 dw sd$read\r
73 dw sd$login\r
74 dw sd$init1\r
75 db 1,0 ; relative drive one\r
76sd1: dph 0,dpbsimhd512\r
77\r
78 dw sd$write\r
79 dw sd$read\r
80 dw sd$login\r
d12d8b38 81 dw sd$init2\r
ea5293bb
L
82 db 2,0 ; relative drive zero\r
83sd2: dph 0,dpbsimhd512\r
84\r
85 dw sd$write\r
86 dw sd$read\r
87 dw sd$login\r
d12d8b38 88 dw sd$init3\r
ea5293bb
L
89 db 3,0 ; relative drive one\r
90sd3: dph 0,dpbsimhd512\r
91\r
92\r
b625464d
L
93 dw sd$write\r
94 dw sd$read\r
95 dw sd$login\r
96 dw sd$init4\r
97 db 4,0 ; relative drive zero\r
98sd4: dph 0,dpbsimhd512\r
99\r
100 dw sd$write\r
101 dw sd$read\r
102 dw sd$login\r
103 dw sd$init5\r
104 db 5,0 ; relative drive one\r
105sd5: dph 0,dpbsimhd512\r
106\r
107 dw sd$write\r
108 dw sd$read\r
109 dw sd$login\r
110 dw sd$init6\r
111 db 6,0 ; relative drive zero\r
112sd6: dph 0,dpbsimhd512\r
113\r
114 dw sd$write\r
115 dw sd$read\r
116 dw sd$login\r
117 dw sd$init7\r
118 db 7,0 ; relative drive one\r
119sd7: dph 0,dpbsimhd512\r
120\r
121\r
ea5293bb
L
122 cseg ; DPB must be resident\r
123\r
1e56f376
L
124 ; dpb physical$sector$size, - disk parameter block\r
125 ; physical$sectors$per$track,\r
126 ; number$tracks,\r
127 ; block$size,\r
128 ; number$dir$entries,\r
129 ; track$offset,\r
130 ; checksum$vec$size (optional)\r
131\r
ea5293bb 132dpbsimhd512:\r
1e56f376 133 dpb 512,8,2048,4096,1024,6,8100h\r
ea5293bb
L
134\r
135\r
136 dseg ; rest is banked\r
137\r
138; Disk I/O routines for standardized BIOS interface\r
139\r
140; Initialization entry point.\r
141; called for first time initialization.\r
142\r
143sd$init0:\r
3ba53775
L
144 call pr.inln ;\r
145 db 'sdio: SD Card driver'cr,lf,0\r
ea5293bb
L
146 ret\r
147\r
148sd$init1:\r
149sd$init2:\r
150sd$init3:\r
b625464d
L
151sd$init4:\r
152sd$init5:\r
153sd$init6:\r
154sd$init7:\r
ea5293bb
L
155 ret ; all initialization done by drive 0\r
156\r
157\r
ea5293bb
L
158; This entry is called when a logical drive is about to\r
159; be logged into for the purpose of density determination.\r
160; It may adjust the parameters contained in the disk\r
161; parameter header pointed at by <DE>\r
a28ee78c
L
162;\r
163; absolute drive number in @adrv (8 bits) +0\r
164; relative drive number in @rdrv (8 bits) +1\r
ea5293bb
L
165\r
166sd$login:\r
1d26b866
L
167 xor a\r
168 ld (residual),a\r
ea5293bb
L
169 ld hl,send_msg+1\r
170 ld (hl),0 ;login function\r
171 inc hl\r
172 ld bc,(@adrv)\r
173 ld (hl),c ;@adrv\r
174 inc hl\r
175 ld (hl),b ;@rdrv\r
176 inc hl\r
177\r
178 ex de,hl ;xdph to hl\r
179 xor a ;bank 0\r
180 call bnk2phy ;phys. linear address\r
181 ex de,hl\r
182 ld (hl),e\r
183 inc hl\r
184 ld (hl),d\r
185 inc hl\r
186 ld (hl),a\r
187\r
188 ld hl,send_msg\r
189 ld b,send_msg_login_len\r
190 call msg.sm\r
191\r
192 ld hl,recv_msg\r
193 ld b,recv_msg_len ; max receive message len\r
194 call msg.recv\r
195\r
a28ee78c
L
196 ld a,(recv_msg_rc)\r
197 or a\r
198 ret z\r
199 ld hl,0\r
200 ld (@xdph),hl\r
ea5293bb
L
201 ret ;\r
202\r
203\r
204\r
205; disk READ and WRITE entry points.\r
206; these entries are called with the following arguments:\r
207;\r
aeb747d4
L
208; operation type (r/w) in @op (8 bits) +0\r
209; absolute drive number in @adrv (8 bits) +1\r
210; relative drive number in @rdrv (8 bits) +2\r
211; disk track address in @trk (16 bits) +3\r
212; disk sector address in @sect(16 bits) +5\r
213; multi sector count in @cnt (8 bits) +7\r
214; disk transfer address in @dma (16 bits) +8\r
215; disk transfer bank in @dbnk (8 bits) +10\r
ea5293bb
L
216; pointer to XDPH in <DE>\r
217;\r
218; they transfer the appropriate data, perform retries\r
219; if necessary, then return an error code in <A>\r
220\r
221sd$read:\r
ea5293bb 222sd$write:\r
3735c546
L
223 ld hl,residual ; remainng sectors from last multi io?\r
224 ld a,(hl)\r
225 sub a,1\r
226 jr c,rwc_new_sectors\r
227\r
228 ld (hl),a\r
229 xor a\r
230 ret\r
1d26b866
L
231\r
232rwc_new_sectors:\r
233 ld b,1 ; assume 1 sector to transfer\r
3735c546
L
234 ld a,(@cnt)\r
235 or a\r
236 jr z,rwc_doit\r
237\r
238 ld b,a ; number of sectors to transfer\r
239 dec a ; save remaining\r
240 ld (hl),a\r
241 xor a ; reset multi sector count\r
242 ld (@cnt),a\r
ea5293bb
L
243\r
244; compute pysical transfer address\r
245; prepare message\r
246; and send it to AVR.\r
247\r
1d26b866 248rwc_doit:\r
1d26b866 249 ld a,b\r
aeb747d4
L
250 ld hl,@op ;address of arguments\r
251 ld de,send_msg+1\r
252 ld bc,7\r
ea5293bb 253 ldir\r
b27f7b99 254 ld (de),a ;number of sectors\r
1d26b866 255 inc de\r
ea5293bb
L
256 push de\r
257 ld e,(hl) ;dma address\r
258 inc hl\r
259 ld d,(hl)\r
260 inc hl\r
261 ld a,(hl) ;bank\r
262 ex de,hl\r
263 call bnk2phy ;phys. linear address\r
264 ex de,hl\r
265 pop hl\r
266 ld (hl),e\r
267 inc hl\r
268 ld (hl),d\r
269 inc hl\r
270 ld (hl),a\r
271\r
04134640 272retry:\r
ea5293bb
L
273\r
274 ld hl,send_msg\r
275 ld b,send_msg_rw_len\r
276 call msg.sm\r
277\r
278 ld hl,recv_msg\r
279 ld b,recv_msg_len ; max receive message len\r
280 call msg.recv\r
281 ld a,(recv_msg_rc)\r
282 or a\r
8d7aab73 283 ret z ; check status and return to BDOS if no error\r
ea5293bb 284\r
aeb747d4
L
285 ld hl,print_details\r
286 call pr.errors\r
c6fa1579 287 jr z,retry ; Yes, then retry once more\r
ea5293bb 288 ; otherwise,\r
04134640
L
289 xor a\r
290 ld (residual),a\r
c6fa1579
L
291 ld a,(recv_msg_rc) ; return hard error to BDOS\r
292 ld c,0ffh\r
293 cp 6 ; media changed?\r
294 jr z,e_exit\r
295 ld c,2\r
296 cp 5 ; disk read only?\r
297 jr z,e_exit\r
298 dec c\r
299e_exit:\r
300 ld a,c\r
04134640 301 ret\r
ea5293bb 302\r
aeb747d4 303;-------------------------------------------------------------------------------\r
04134640 304\r
aeb747d4
L
305print_details:\r
306 ld a,(recv_msg_rc)\r
307 push af\r
308 and a,07fh\r
309 jr z,fatfs_err\r
04134640 310\r
aeb747d4
L
311 ld hl,drvmsg0 ; point at first driver error message\r
312 call pr.idx\r
04134640 313\r
aeb747d4
L
314fatfs_err:\r
315 pop af\r
316 and 080h\r
317 ret z ; no fatfs error\r
04134640 318\r
aeb747d4
L
319 call pr.inln\r
320 db 'FatFs: ',0\r
04134640 321\r
aeb747d4
L
322 ld hl,fr$msg0 ; point at first FatFs message\r
323 ld a,(recv_msg_rc+1)\r
324 jp pr.idx ; return via print routine\r
ea5293bb
L
325\r
326\r
aeb747d4
L
327;-------------------------------------------------------------------------------\r
328\r
1d26b866
L
329residual:\r
330 db 0\r
ea5293bb
L
331\r
332send_msg:\r
333 db 2 ; disk command\r
334 ds 1 ; subcommand (login/read/write)\r
335 ds 1 ; @adrv\r
336 ds 1 ; @rdrv\r
1d26b866
L
337 ; -read/write- -login-\r
338 ds 2 ; @trk xdph address\r
339 ds 2 ; @sect (3 byte)\r
340 ds 1 ; @cnt\r
ea5293bb
L
341 ds 3 ; transfer addr\r
342send_msg_rw_len equ $ - send_msg\r
1d26b866 343send_msg_login_len equ 7\r
ea5293bb
L
344\r
345\r
346recv_msg:\r
347 ds 1 ; len\r
348 ds 1 ; command\r
349 ds 1 ; subcommand\r
350recv_msg_rc:\r
351 ds 1 ; result code\r
352 ds 4 ; room for additional parameter\r
353recv_msg_len equ $ - recv_msg\r
354\r
355\r
aeb747d4
L
356;-------------------------------------------------------------------------------\r
357; error message components\r
c6fa1579
L
358 ; general driver errors\r
359\r
04134640
L
360drvmsg0: db 'Unknown Error, ',0\r
361drvmsg1: db 'Invalid Parameter(s), ',0\r
362drvmsg2: db 'Invalid Drive, ',0\r
363drvmsg3: db 'Bus Timeout, ',0\r
c6fa1579
L
364drvmsg4: db 'Access beyond disk size, ',0\r
365drvmsg5: db 'Write protected, ',0\r
366drvmsg6: db 'No media, ',0\r
aeb747d4 367 db 0\r
04134640 368\r
c6fa1579 369 ; fat file system errors\r
04134640
L
370\r
371fr$msg0: db 'Unknown Error,',0\r
372fr$msg1: db 'DISK_ERR,',0\r
373fr$msg2: db 'INT_ERR,',0\r
374fr$msg3: db 'NOT_READY,',0\r
375fr$msg4: db 'NO_FILE,',0\r
376fr$msg5: db 'NO_PATH,',0\r
377fr$msg6: db 'INVALID_NAME,',0\r
378fr$msg7: db 'DENIED,',0\r
379fr$msg8: db 'EXIST,',0\r
380fr$msg9: db 'INVALID_OBJECT,',0\r
381fr$msg10: db 'WRITE_PROTECTED,',0\r
382fr$msg11: db 'INVALID_DRIVE,',0\r
383fr$msg12: db 'NOT_ENABLED,',0\r
384fr$msg13: db 'NO_FILE_SYSTEM,',0\r
385fr$msg14: db 'MKFS_ABORTED,',0\r
386fr$msg15: db 'TIMEOUT,',0\r
387fr$msg16: db 'LOCKED,',0\r
388fr$msg17: db 'NOT_ENOUGH_CORE,',0\r
389fr$msg18: db 'TOO_MANY_OPEN_FILES,',0\r
390fr$msg19: db 'FR_INVALID_PARAMETER,',0\r
391fr$msg20: db 'short read/write,',0\r
aeb747d4 392 db 0\r
ea5293bb 393\r
ea5293bb 394 end\r