]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/blobdiff - cbios/sdio.180
Add new driver: cfio
[z180-stamp-cpm3.git] / cbios / sdio.180
index 2c4823d82814960af64bc3b0bfb20583d24eef9d..0d296450717046bf6b1f654a1ad6b4745553d6eb 100644 (file)
@@ -3,14 +3,14 @@
 ;    CP/M-80 Version 3     --  Modular BIOS\r
 \r
 \r
-       dseg\r
-\r
     ; 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
@@ -22,8 +22,8 @@
     ; Utility routines in standard BIOS\r
 \r
        extrn ?wboot            ; warm boot vector\r
-       extrn ?pmsg             ; print message @<HL> up to 00, saves <BC> & <DE>\r
-       extrn ?pdec             ; print binary number in <A> from 0 to 99.\r
+       extrn ?pmsg,pr.inln     ; print message @<HL>, print inline message\r
+       extrn pr.crlf           ; print <cr><lf>\r
        extrn ?pderr            ; print BIOS disk error header\r
        extrn ?conin,?cono      ; con in and out\r
        extrn ?const            ; get console status\r
@@ -54,6 +54,8 @@ lf    equ     10
 bell   equ     7\r
 \r
 \r
+       dseg\r
+\r
     ; Extended Disk Parameter Headers (XPDHs)\r
 \r
        dw      sd$write\r
@@ -73,18 +75,47 @@ sd1:        dph 0,dpbsimhd512
        dw      sd$write\r
        dw      sd$read\r
        dw      sd$login\r
-       dw      sd$init0\r
+       dw      sd$init2\r
        db      2,0             ; relative drive zero\r
 sd2:   dph 0,dpbsimhd512\r
 \r
        dw      sd$write\r
        dw      sd$read\r
        dw      sd$login\r
-       dw      sd$init1\r
+       dw      sd$init3\r
        db      3,0             ; relative drive one\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
 dpbsimhd512:\r
@@ -104,15 +135,20 @@ sd$init0:
 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
@@ -144,8 +180,11 @@ sd$login:
        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
@@ -173,6 +212,7 @@ sd$write:
        ld      de,write$msg    ; point at " Write "\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
@@ -208,7 +248,7 @@ rwc_doit:
        ld      hl,@adrv        ;address of arguments\r
        ld      bc,6\r
        ldir\r
-       ld      (de),a\r
+       ld      (de),a          ;number of sectors\r
        inc     de\r
        push    de\r
        ld      e,(hl)          ;dma address\r
@@ -266,8 +306,8 @@ fatfs_err:
        tst     080h\r
        jr      z,prompt        ; no fatfs error\r
 \r
-       ld      hl,fsmsg\r
-       call    ?pmsg\r
+       call    pr.inln\r
+       db      'FatFs: ',0\r
 \r
        ld      hl,fr$msg0      ; point at first FatFs message\r
        ld      c,fr$msg$count\r
@@ -275,8 +315,9 @@ fatfs_err:
        call    pdecoded\r
 \r
 prompt:\r
-       ld      hl,error$msg\r
-       call    ?pmsg           ; print "<BEL>, Retry (Y/N) ? "\r
+       call    pr.inln\r
+       db      ' Retry (Y/N) ? ',0\r
+\r
        call    u$conin$echo    ; get operator response\r
        cp      'Y'\r
        jr      z,retry         ; Yes, then retry 10 more times\r
@@ -390,7 +431,6 @@ drvmsg3:    db      'Bus Timeout, ',0
 drvmsg_size    equ     $ - drvmsg0\r
 drvmsg_count   equ     3\r
 \r
-fsmsg:         db      'FatFs: ',0\r
 \r
 ; table of pointers to error message strings\r
 \r
@@ -418,8 +458,4 @@ fr$msg20:   db      'short read/write,',0
 fr$msg$size    equ     $ - fr$msg0\r
 fr$msg$count   equ     20\r
 \r
-error$msg:\r
-       db      ' Retry (Y/N) ? ',0\r
-\r
-\r
        end\r