; Disk drive dispatching tables for linked BIOS\r
\r
public sd0,sd1,sd2,sd3\r
+ public sd4,sd5,sd6,sd7\r
\r
; Variables containing parameters passed by BDOS\r
\r
+ extrn @xdph\r
extrn @adrv,@rdrv\r
extrn @trk,@sect,@cnt\r
extrn @dma,@dbnk\r
\r
; Extended Disk Parameter Headers (XPDHs)\r
\r
+ ; dph translate$table, - disk parameter header\r
+ ; disk$parameter$block,\r
+ ; checksum$size, (optional)\r
+ ; alloc$size (optional)\r
+\r
dw sd$write\r
dw sd$read\r
dw sd$login\r
sd3: dph 0,dpbsimhd512\r
\r
\r
+ dw sd$write\r
+ dw sd$read\r
+ dw sd$login\r
+ dw sd$init4\r
+ db 4,0 ; relative drive zero\r
+sd4: dph 0,dpbsimhd512\r
+\r
+ dw sd$write\r
+ dw sd$read\r
+ dw sd$login\r
+ dw sd$init5\r
+ db 5,0 ; relative drive one\r
+sd5: dph 0,dpbsimhd512\r
+\r
+ dw sd$write\r
+ dw sd$read\r
+ dw sd$login\r
+ dw sd$init6\r
+ db 6,0 ; relative drive zero\r
+sd6: dph 0,dpbsimhd512\r
+\r
+ dw sd$write\r
+ dw sd$read\r
+ dw sd$login\r
+ dw sd$init7\r
+ db 7,0 ; relative drive one\r
+sd7: dph 0,dpbsimhd512\r
+\r
+\r
cseg ; DPB must be resident\r
\r
+ ; dpb physical$sector$size, - disk parameter block\r
+ ; physical$sectors$per$track,\r
+ ; number$tracks,\r
+ ; block$size,\r
+ ; number$dir$entries,\r
+ ; track$offset,\r
+ ; checksum$vec$size (optional)\r
+\r
dpbsimhd512:\r
- dpb 512,8,2048,4096,1024,6\r
+ dpb 512,8,2048,4096,1024,6,8100h\r
\r
\r
dseg ; rest is banked\r
; called for first time initialization.\r
\r
sd$init0:\r
+ call pr.inln ;\r
+ db 'sdio: SD Card driver'cr,lf,0\r
ret\r
\r
sd$init1:\r
sd$init2:\r
sd$init3:\r
+sd$init4:\r
+sd$init5:\r
+sd$init6:\r
+sd$init7:\r
ret ; all initialization done by drive 0\r
\r
\r
-\r
-\r
; This entry is called when a logical drive is about to\r
; be logged into for the purpose of density determination.\r
; It may adjust the parameters contained in the disk\r
; parameter header pointed at by <DE>\r
+;\r
+; absolute drive number in @adrv (8 bits) +0\r
+; relative drive number in @rdrv (8 bits) +1\r
\r
sd$login:\r
xor a\r
ld b,recv_msg_len ; max receive message len\r
call msg.recv\r
\r
-; ld a,(recv_msg_rc)\r
-; or a\r
+ ld a,(recv_msg_rc)\r
+ or a\r
+ ret z\r
+ ld hl,0\r
+ ld (@xdph),hl\r
ret ;\r
\r
\r
ld c,2\r
rw$common:\r
\r
-; ld hl,residual ; remainng sectors from last multi io?\r
-; ld a,(hl)\r
-; sub a,1\r
-; jr c,rwc_new_sectors\r
-;\r
-; ld (hl),a\r
-; xor a\r
-; ret\r
+ ld hl,residual ; remainng sectors from last multi io?\r
+ ld a,(hl)\r
+ sub a,1\r
+ jr c,rwc_new_sectors\r
+\r
+ ld (hl),a\r
+ xor a\r
+ ret\r
\r
rwc_new_sectors:\r
ld b,1 ; assume 1 sector to transfer\r
-; ld a,(@cnt)\r
-; or a\r
-; jr z,rwc_doit\r
-;\r
-; ld b,a ; number of sectors to transfer\r
-; dec a ; save remaining\r
-; ld (hl),a\r
-; xor a ; reset multi sector count\r
-; ld (@cnt),a\r
+ ld a,(@cnt)\r
+ or a\r
+ jr z,rwc_doit\r
+\r
+ ld b,a ; number of sectors to transfer\r
+ dec a ; save remaining\r
+ ld (hl),a\r
+ xor a ; reset multi sector count\r
+ ld (@cnt),a\r
\r
; compute pysical transfer address\r
; prepare message\r
\r
call u$conin$echo ; get operator response\r
cp 'Y'\r
- jr z,retry ; Yes, then retry 10 more times\r
+ jr z,retry ; Yes, then retry once more\r
\r
hard$error:\r
; otherwise,\r
xor a\r
ld (residual),a\r
-\r
- ld a,1 ; return hard error to BDOS\r
+ ld a,(recv_msg_rc) ; return hard error to BDOS\r
+ ld c,0ffh\r
+ cp 6 ; media changed?\r
+ jr z,e_exit\r
+ ld c,2\r
+ cp 5 ; disk read only?\r
+ jr z,e_exit\r
+ dec c\r
+e_exit:\r
+ ld a,c\r
ret\r
\r
-cancel: ; here to abort job\r
- jp ?wboot ; leap directly to warmstart vector\r
-\r
-\r
-\r
; Print message to error code in A\r
;\r
\r
write$msg:\r
db ', Write, ',0\r
\r
+ ; general driver errors\r
+\r
drvmsg0: db 'Unknown Error, ',0\r
drvmsg1: db 'Invalid Parameter(s), ',0\r
drvmsg2: db 'Invalid Drive, ',0\r
drvmsg3: db 'Bus Timeout, ',0\r
+drvmsg4: db 'Access beyond disk size, ',0\r
+drvmsg5: db 'Write protected, ',0\r
+drvmsg6: db 'No media, ',0\r
drvmsg_size equ $ - drvmsg0\r
-drvmsg_count equ 3\r
-\r
+drvmsg_count equ 7\r
\r
-; table of pointers to error message strings\r
+ ; fat file system errors\r
\r
fr$msg0: db 'Unknown Error,',0\r
fr$msg1: db 'DISK_ERR,',0\r
fr$msg19: db 'FR_INVALID_PARAMETER,',0\r
fr$msg20: db 'short read/write,',0\r
fr$msg$size equ $ - fr$msg0\r
-fr$msg$count equ 20\r
+fr$msg$count equ 21\r
\r
end\r