]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/blobdiff - cbios/sdio.180
Make ASCI1 the default console device after cold boot.
[z180-stamp-cpm3.git] / cbios / sdio.180
index b229c8d9bb6cde70489ddc7ea0e79e013abc3988..774ed122469f25c1965418d9131839febb971ba5 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
@@ -54,8 +54,15 @@ lf   equ     10
 bell   equ     7\r
 \r
 \r
+       dseg\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
@@ -85,10 +92,47 @@ sd2:        dph 0,dpbsimhd512
 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
@@ -99,20 +143,27 @@ dpbsimhd512:
 ; 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
@@ -144,8 +195,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
@@ -174,26 +228,26 @@ sd$write:
        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
@@ -281,21 +335,24 @@ prompt:
 \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
@@ -385,15 +442,19 @@ read$msg:
 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
@@ -417,6 +478,6 @@ fr$msg18:   db      'TOO_MANY_OPEN_FILES,',0
 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