]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/commitdiff
support multi sector tranfer. bugfix in bnk2phy (banked to physical translation).
authorLeo C <erbl259-lmu@yahoo.de>
Sun, 17 May 2015 15:09:50 +0000 (17:09 +0200)
committerLeo C <erbl259-lmu@yahoo.de>
Sun, 17 May 2015 15:09:50 +0000 (17:09 +0200)
cbios/.gitignore
cbios/bioskrnl.180
cbios/mm.180
cbios/sdio.180

index a6addbc58ec493eb789d1e796a789bf28f7b6ab8..7d9f502189f68ba67ecfd1067dca4b6fcd71d1b1 100644 (file)
@@ -2,6 +2,7 @@
 *.prn
 *.lst
 *.sym
+*.map
 *.rel
 *.spr
 
index 6ae7073117f0a230c67c5cbc402900a729a449d0..93d556da10407dad903d4852a74558ac6f78f1dd 100644 (file)
@@ -800,11 +800,11 @@ sector$msg:       db      ', S-',0
 @xdph: ds      2               ; pointer to currently selected drives dph\r
 @adrv: ds      1               ; currently selected disk drive\r
 @rdrv: ds      1               ; controller relative disk drive\r
-@cnt:  db      0               ; record count for multisector transfer\r
 @trk:  ds      2               ; current track number\r
 @sect: ds      2               ; current sector number\r
 @dma:  ds      2               ; current DMA address\r
 @dbnk: db      0               ; bank for DMA operations\r
+@cnt:  db      0               ; record count for multisector transfer\r
 \r
 \r
        cseg    ; common memory\r
index 8f63a2bf0d278137bd77af0f8a122e1e397f20c1..90d8144356df4532f12e7cb6297275d67d277f27 100644 (file)
@@ -55,7 +55,21 @@ bnk2log:
 
 
 bnk2phy:
-       call    bnk2log
+       push    bc
+       ld      c,a
+       ld      a,h
+       and     a,0f0h
+       cp      CA*16
+       ld      a,c
+       pop     bc
+
+       jr      c,b2p_banked
+       xor     a               ; address is in common
+       jr      b2b_cont        ;    base is 0
+b2p_banked:
+       call    bnk2log         ; get address base
+b2b_cont:
+
        ; fall thru
 
 ;--------------------------------------------------------------
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