X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp-cpm3.git/blobdiff_plain/b27f7b99726643dca7d91847d45c692e26f5287d..4fc939ea71f1c4979525f2cb059da81a5e3fb07c:/cbios/sdio.180 diff --git a/cbios/sdio.180 b/cbios/sdio.180 index 78a8579..0d29645 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 @@ -22,8 +22,8 @@ ; Utility routines in standard BIOS extrn ?wboot ; warm boot vector - extrn ?pmsg ; print message @ up to 00, saves & - extrn ?pdec ; print binary number in from 0 to 99. + extrn ?pmsg,pr.inln ; print message @, print inline message + extrn pr.crlf ; print extrn ?pderr ; print BIOS disk error header extrn ?conin,?cono ; con in and out extrn ?const ; get console status @@ -54,6 +54,8 @@ lf equ 10 bell equ 7 + dseg + ; Extended Disk Parameter Headers (XPDHs) dw sd$write @@ -73,18 +75,47 @@ sd1: dph 0,dpbsimhd512 dw sd$write dw sd$read dw sd$login - dw sd$init0 + dw sd$init2 db 2,0 ; relative drive zero sd2: dph 0,dpbsimhd512 dw sd$write dw sd$read dw sd$login - dw sd$init1 + dw sd$init3 db 3,0 ; relative drive one 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 dpbsimhd512: @@ -104,15 +135,20 @@ sd$init0: 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 +180,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 +213,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 @@ -267,8 +306,8 @@ fatfs_err: tst 080h jr z,prompt ; no fatfs error - ld hl,fsmsg - call ?pmsg + call pr.inln + db 'FatFs: ',0 ld hl,fr$msg0 ; point at first FatFs message ld c,fr$msg$count @@ -276,8 +315,9 @@ fatfs_err: call pdecoded prompt: - ld hl,error$msg - call ?pmsg ; print ", Retry (Y/N) ? " + call pr.inln + db ' Retry (Y/N) ? ',0 + call u$conin$echo ; get operator response cp 'Y' jr z,retry ; Yes, then retry 10 more times @@ -391,7 +431,6 @@ drvmsg3: db 'Bus Timeout, ',0 drvmsg_size equ $ - drvmsg0 drvmsg_count equ 3 -fsmsg: db 'FatFs: ',0 ; table of pointers to error message strings @@ -419,8 +458,4 @@ fr$msg20: db 'short read/write,',0 fr$msg$size equ $ - fr$msg0 fr$msg$count equ 20 -error$msg: - db ' Retry (Y/N) ? ',0 - - end