]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/commitdiff
interbank move via dma. (re)enable multisector transfer
authorLeo C <erbl259-lmu@yahoo.de>
Tue, 9 Jun 2015 15:24:02 +0000 (17:24 +0200)
committerLeo C <erbl259-lmu@yahoo.de>
Tue, 9 Jun 2015 15:24:02 +0000 (17:24 +0200)
cbios/move.180
cbios/sdio.180

index 92b56ceacaf8c7f595e1cfdb9167eb67c57397c3..1e46c825ee1edeb3e45ef2c980d1b539b7bd2461 100644 (file)
    if banked
 
 inter_bank_move:               ; source in HL, dest in DE, count in BC
-    if 0                       ; *** DOES NOT WORK PROPERLY
-                               ;     (Crossing Bank boundary problems)
+
+    if 1                       ; works with new memory map
+
        push    bc
        push    de
        push    hl
 
-;TODO: check if source range crosses bank/common boundary
+       out0    (bcr0l),c       ; setup DMA count
+       out0    (bcr0h),b
 
        ld      a,(src$bnk)
        call    bnk2phy
@@ -61,8 +63,6 @@ inter_bank_move:              ; source in HL, dest in DE, count in BC
        out0    (sar0h),h
        out0    (sar0b),a
 
-;TODO: check if destination range crosses bank/common boundary
-
        ex      de,hl
        ld      a,(dst$bnk)
        call    bnk2phy
@@ -73,8 +73,6 @@ inter_bank_move:              ; source in HL, dest in DE, count in BC
 
        ld      a,M_MMOD        ; DMA burst mode
        out0    (dmode),a
-       out0    (bcr0l),c       ; setup DMA count
-       out0    (bcr0h),b
        ld      a,M_DE0+M_NDWE1 ; enable DMA0
        out0    (dstat),a       ; move the block
 
@@ -92,7 +90,7 @@ inter_bank_move:              ; source in HL, dest in DE, count in BC
 
        ret                     ; return with src in DE, dst in HL, count = 0
 
-    else                       ; *** INNEFICIENT, BUT WORKS
+    else                       ; inefficient fall back
 
        ld      (tmp$sp),sp
        ld      sp,tmp$stk
index cf9310e1ecfc218b313e900e93d59a59a436bdc9..220a15f4c6407e626d91044bea0abfe4eac862f2 100644 (file)
@@ -174,26 +174,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