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