1 title 'Bank & Move Module for the Modular CP/M 3 BIOS'
3 ; CP/M-80 Version 3 -- Modular BIOS
4 ; Bank and Move Module for Z180-Stamp
6 ; Compile with M80, slr180, or compatible
8 public ?move,?xmove,?bank
18 cseg ; must be in common memory
22 ld (src$bnk),bc ; c -> src$bnk, b -> dst$bnk
27 ex de,hl ; we are passed source in DE and dest in HL
29 ld a,(src$bnk) ; contains 0FEh if normal block move
33 ldir ; use Z80 block move instruction
34 ex de,hl ; need next address in same regs
48 inter_bank_move: ; source in HL, dest in DE, count in BC
49 if 0 ; *** DOES NOT WORK PROPERLY
50 ; (Crossing Bank boundary problems)
55 ;TODO: check if source range crosses bank/common boundary
60 out0 (sar0l),l ; setup DMA src address
64 ;TODO: check if destination range crosses bank/common boundary
70 out0 (dar0l),l ; setup DMA dst address
74 ld a,M_MMOD ; DMA burst mode
76 out0 (bcr0l),c ; setup DMA count
78 ld a,M_DE0+M_NDWE1 ; enable DMA0
79 out0 (dstat),a ; move the block
85 add hl,bc ; src must point past end block
87 add hl,bc ; and so must dst
93 ret ; return with src in DE, dst in HL, count = 0
95 else ; *** INNEFICIENT, BUT WORKS