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
out0 (sar0h),h
out0 (sar0b),a
-;TODO: check if destination range crosses bank/common boundary
-
ex de,hl
ld a,(dst$bnk)
call bnk2phy
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
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
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