endif
ret
- if banked
+ if banked
inter_bank_move: ; source in HL, dest in DE, count in BC
- if 0 ; *** DOES NOT WORK PROPERLY
- ; (Crossing Bank boundary problems)
- push bc
- push de
- push hl
-;TODO: check if source range crosses bank/common boundary
+ if 1 ; works with new memory map
+ out0 (bcr0l),c ; setup DMA count
+ out0 (bcr0h),b
+
+ push hl
+ push de
ld a,(src$bnk)
call bnk2phy
-
out0 (sar0l),l ; setup DMA src address
out0 (sar0h),h
out0 (sar0b),a
-;TODO: check if destination range crosses bank/common boundary
-
ex de,hl
ld a,(dst$bnk)
call bnk2phy
-
out0 (dar0l),l ; setup DMA dst address
out0 (dar0h),h
out0 (dar0b),a
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
- pop hl
pop de
- pop bc
-
+ pop hl
add hl,bc ; src must point past end block
ex de,hl
add hl,bc ; and so must dst
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
tmp$stk:
tmp$sp: ds 2
- endif
+ endif
src$bnk: db 0FEh
dst$bnk: db 0FEh
- endif ;banked
+ endif ;banked
end