]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/blobdiff - cbios/sdio.180
support multi sector tranfer. bugfix in bnk2phy (banked to physical translation).
[z180-stamp-cpm3.git] / cbios / sdio.180
index 2b84aea211aa673a865c3ea249f0155fe07633ae..e6c12ea45e0674deaebacd3b01164c9df08fdec3 100644 (file)
@@ -12,8 +12,8 @@
     ; Variables containing parameters passed by BDOS\r
 \r
        extrn @adrv,@rdrv\r
-       extrn @dma,@trk,@sect\r
-       extrn @dbnk\r
+       extrn @trk,@sect,@cnt\r
+       extrn @dma,@dbnk\r
 \r
     ; System Control Block variables\r
 \r
@@ -115,6 +115,8 @@ sd$init3:
 ; parameter header pointed at by <DE>\r
 \r
 sd$login:\r
+       xor     a\r
+       ld      (residual),a\r
        ld      hl,send_msg+1\r
        ld      (hl),0          ;login function\r
        inc     hl\r
@@ -153,9 +155,9 @@ sd$login:
 ;\r
 ;     absolute drive number in @adrv (8 bits)  +0\r
 ;     relative drive number in @rdrv (8 bits)  +1\r
-;     multi sector count    in @cnt  (8 bits)  +2 (currently unused)\r
-;     disk track address    in @trk (16 bits)  +3\r
-;     disk sector address   in @sect(16 bits)  +5\r
+;     disk track address    in @trk (16 bits)  +2\r
+;     disk sector address   in @sect(16 bits)  +4\r
+;     multi sector count    in @cnt  (8 bits)  +6\r
 ;     disk transfer address in @dma (16 bits)  +7\r
 ;     disk transfer bank    in @dbnk (8 bits)  +9\r
 ;     pointer to XDPH      in <DE>\r
@@ -164,27 +166,50 @@ sd$login:
 ;     if necessary, then return an error code in <A>\r
 \r
 sd$read:\r
-       ld      hl,read$msg     ; point at " Read "\r
-       ld      a,1\r
+       ld      de,read$msg     ; point at " Read "\r
+       ld      c,1\r
        jr      rw$common\r
-\r
 sd$write:\r
-       ld      hl,write$msg    ; point at " Write "\r
-       ld      a,2\r
-                               ;fall thru\r
+       ld      de,write$msg    ; point at " Write "\r
+       ld      c,2\r
+rw$common:\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
 \r
 ; compute pysical transfer address\r
 ;     prepare message\r
 ;     and send it to AVR.\r
 \r
-rw$common:\r
-       ld      (operation$name),HL ; save message for errors\r
-       ld      de,send_msg+1\r
-       ld      (de),a\r
-       inc     de\r
+rwc_doit:\r
+       ld      hl,send_msg+1\r
+       ld      (hl),c\r
+       inc     hl\r
+       ld      a,b\r
+       ex      de,hl\r
+       ld      (operation$name),hl ; save message for errors\r
        ld      hl,@adrv        ;address of arguments\r
-       ld      bc,7\r
+       ld      bc,6\r
        ldir\r
+       ld      (de),a\r
+       inc     de\r
        push    de\r
        ld      e,(hl)          ;dma address\r
        inc     hl\r
@@ -214,6 +239,9 @@ more$retries:
        or      a\r
        ret     z               ; check status and return to BDOS if no error\r
 \r
+       xor     a\r
+       ld      (residual),a\r
+\r
 ; suppress error message if BDOS is returning errors to application...\r
 \r
        ld      a,(@ermde)\r
@@ -233,7 +261,7 @@ more$retries:
 ;TODO: rc errorcode\r
 \r
        ld      a,(recv_msg_rc)\r
-       tst     080h    \r
+       tst     080h\r
        jr      z,fs_end\r
 \r
 fatfs_err:\r
@@ -293,19 +321,21 @@ u$c1:
        ret\r
 \r
 \r
+residual:\r
+       db      0\r
 \r
 send_msg:\r
        db      2       ; disk command\r
        ds      1       ; subcommand (login/read/write)\r
        ds      1       ; @adrv\r
        ds      1       ; @rdrv\r
-                       ; -read/write-          -login- \r
-       ds      1       ; @cnt                   3 byte\r
-       ds      2       ; @trk                      xdph address\r
-send_msg_login_len equ $ - send_msg\r
-       ds      2       ; @sect\r
+                       ; -read/write-          -login-\r
+       ds      2       ; @trk                  xdph address\r
+       ds      2       ; @sect                   (3 byte)\r
+       ds      1       ; @cnt\r
        ds      3       ; transfer addr\r
 send_msg_rw_len equ    $ - send_msg\r
+send_msg_login_len equ 7\r
 \r
 \r
 recv_msg:\r
@@ -381,4 +411,3 @@ FR_LOCKED,          /* (16) The operation is rejected according to the file sharing poli
 FR_NOT_ENOUGH_CORE,    /* (17) LFN working buffer could not be allocated */\r
 FR_TOO_MANY_OPEN_FILES,        /* (18) Number of open files > _FS_SHARE */\r
 FR_INVALID_PARAMETER   /* (19) Given parameter is invalid */\r
-\r