1 TITLE 'sd disk handler'
3 ; CP/M-80 Version 3 -- Modular BIOS
6 ; Disk drive dispatching tables for linked BIOS
11 ; Variables containing parameters passed by BDOS
18 ; System Control Block variables
20 extrn @ermde ; BDOS error mode
24 extrn ?wboot ; warm boot vector
25 extrn pr.idx ; print indexed message
26 extrn pr.inln ; print inline message
27 extrn pr.errors ; print BIOS disk error header
28 extrn bnk2phy ; translate banked to physical linear address
29 extrn msg.sm ; send message to AVR
30 extrn msg.recv ; receive message from AVR
31 extrn add_hla ; add <A> to <HL>
34 ; Port Address Equates
39 ; CP/M 3 Disk definition macros
43 ; Z180 macro library instruction definitions (ignored by slr180)
47 ; common control characters
56 ; Extended Disk Parameter Headers (XPDHs)
58 ; dph translate$table, - disk parameter header
59 ; disk$parameter$block,
60 ; checksum$size, (optional)
61 ; alloc$size (optional)
67 db 0,0 ; relative drive zero
68 sd0: dph 0,dpbsimhd512
74 db 1,0 ; relative drive one
75 sd1: dph 0,dpbsimhd512
81 db 2,0 ; relative drive zero
82 sd2: dph 0,dpbsimhd512
88 db 3,0 ; relative drive one
89 sd3: dph 0,dpbsimhd512
96 db 4,0 ; relative drive zero
97 sd4: dph 0,dpbsimhd512
103 db 5,0 ; relative drive one
104 sd5: dph 0,dpbsimhd512
110 db 6,0 ; relative drive zero
111 sd6: dph 0,dpbsimhd512
117 db 7,0 ; relative drive one
118 sd7: dph 0,dpbsimhd512
121 cseg ; DPB must be resident
123 ; dpb physical$sector$size, - disk parameter block
124 ; physical$sectors$per$track,
127 ; number$dir$entries,
129 ; checksum$vec$size (optional)
132 dpb 512,8,2048,4096,1024,6,8100h
135 dseg ; rest is banked
137 ; Disk I/O routines for standardized BIOS interface
139 ; Initialization entry point.
140 ; called for first time initialization.
144 dc 'sdio: SD Card driver',cr,lf
154 ret ; all initialization done by drive 0
157 ; This entry is called when a logical drive is about to
158 ; be logged into for the purpose of density determination.
159 ; It may adjust the parameters contained in the disk
160 ; parameter header pointed at by <DE>
162 ; absolute drive number in @adrv (8 bits) +0
163 ; relative drive number in @rdrv (8 bits) +1
169 ld (hl),0 ;login function
179 call bnk2phy ;phys. linear address
188 ld b,send_msg_login_len
192 ld b,recv_msg_len ; max receive message len
204 ; disk READ and WRITE entry points.
205 ; these entries are called with the following arguments:
207 ; operation type (r/w) in @op (8 bits) +0
208 ; absolute drive number in @adrv (8 bits) +1
209 ; relative drive number in @rdrv (8 bits) +2
210 ; disk track address in @trk (16 bits) +3
211 ; disk sector address in @sect(16 bits) +5
212 ; multi sector count in @cnt (8 bits) +7
213 ; disk transfer address in @dma (16 bits) +8
214 ; disk transfer bank in @dbnk (8 bits) +10
215 ; pointer to XDPH in <DE>
217 ; they transfer the appropriate data, perform retries
218 ; if necessary, then return an error code in <A>
222 ld hl,residual ; remainng sectors from last multi io?
232 ld b,1 ; assume 1 sector to transfer
237 ld b,a ; number of sectors to transfer
238 dec a ; save remaining
240 xor a ; reset multi sector count
243 ; compute pysical transfer address
245 ; and send it to AVR.
249 ld hl,@op ;address of arguments
253 ld (de),a ;number of sectors
256 ld e,(hl) ;dma address
262 call bnk2phy ;phys. linear address
278 ld b,recv_msg_len ; max receive message len
282 ret z ; check status and return to BDOS if no error
286 jr z,retry ; Yes, then retry once more
290 ld a,(recv_msg_rc) ; return hard error to BDOS
292 cp 6 ; media changed?
295 cp 5 ; disk read only?
302 ;-------------------------------------------------------------------------------
310 ld hl,drvmsg0 ; point at first driver error message
316 ret z ; no fatfs error
321 ld hl,fr$msg0 ; point at first FatFs message
323 jp pr.idx ; return via print routine
326 ;-------------------------------------------------------------------------------
333 ds 1 ; subcommand (login/read/write)
336 ; -read/write- -login-
337 ds 2 ; @trk xdph address
338 ds 2 ; @sect (3 byte)
341 send_msg_rw_len equ $ - send_msg
342 send_msg_login_len equ 7
351 ds 4 ; room for additional parameter
352 recv_msg_len equ $ - recv_msg
355 ;-------------------------------------------------------------------------------
356 ; error message components
357 ; general driver errors
359 drvmsg0: dc 'Unknown Error, '
360 drvmsg1: dc 'Invalid Parameter(s), '
361 drvmsg2: dc 'Invalid Drive, '
362 drvmsg3: dc 'Bus Timeout, '
363 drvmsg4: dc 'Access beyond disk size, '
364 drvmsg5: dc 'Write protected, '
365 drvmsg6: dc 'No media, '
368 ; fat file system errors
370 fr$msg0: dc 'Unknown Error,'
371 fr$msg1: dc 'DISK_ERR,'
372 fr$msg2: dc 'INT_ERR,'
373 fr$msg3: dc 'NOT_READY,'
374 fr$msg4: dc 'NO_FILE,'
375 fr$msg5: dc 'NO_PATH,'
376 fr$msg6: dc 'INVALID_NAME,'
377 fr$msg7: dc 'DENIED,'
379 fr$msg9: dc 'INVALID_OBJECT,'
380 fr$msg10: dc 'WRITE_PROTECTED,'
381 fr$msg11: dc 'INVALID_DRIVE,'
382 fr$msg12: dc 'NOT_ENABLED,'
383 fr$msg13: dc 'NO_FILE_SYSTEM,'
384 fr$msg14: dc 'MKFS_ABORTED,'
385 fr$msg15: dc 'TIMEOUT,'
386 fr$msg16: dc 'LOCKED,'
387 fr$msg17: dc 'NOT_ENOUGH_CORE,'
388 fr$msg18: dc 'TOO_MANY_OPEN_FILES,'
389 fr$msg19: dc 'FR_INVALID_PARAMETER,'
390 fr$msg20: dc 'short read/write,'