diff options
Diffstat (limited to 'home/copy.asm')
-rw-r--r-- | home/copy.asm | 70 |
1 files changed, 60 insertions, 10 deletions
diff --git a/home/copy.asm b/home/copy.asm index be9c8c0c..4f1d5017 100644 --- a/home/copy.asm +++ b/home/copy.asm @@ -1,24 +1,74 @@ FarCopyData:: ; Copy bc bytes from a:hl to de. - ld [wBuffer], a + ld [wFarCopyDataSavedROMBank], a ld a, [H_LOADEDROMBANK] push af - ld a, [wBuffer] - ld [H_LOADEDROMBANK], a - ld [MBC1RomBank], a + ld a, [wFarCopyDataSavedROMBank] + call BankswitchCommon call CopyData pop af - ld [H_LOADEDROMBANK], a - ld [MBC1RomBank], a + call BankswitchCommon ret CopyData:: ; Copy bc bytes from hl to de. + ld a,b + and a + jr z, .copybytes + ld a,c + and a ; is lower byte 0 + jr z, .loop + inc b ; if not, increment b as there are <$100 bytes to copy +.loop + call .copybytes + dec b + jr nz,.loop + ret + +.copybytes ; 00c1 ld a, [hli] ld [de], a inc de - dec bc - ld a, c - or b - jr nz, CopyData + dec c + jr nz, .copybytes ret + +CopyVideoDataAlternate:: + ld a, [rLCDC] + bit 7,a ; LCD enabled? + jp nz, CopyVideoData ; if yes, then copy video data + push hl + ld h,d + ld l,e + pop de + ld a,b ; save bank + push af + swap c + ld a,$f + and c + ld b,a + ld a,$f0 + and c + ld c,a + pop af + jp FarCopyData + +CopyVideoDataDoubleAlternate:: + ld a, [rLCDC] + bit 7,a ; LCD enabled? + jp nz, CopyVideoDataDouble ; if yes, then copy video data + push de + ld d,h + ld e,l + ld a,b + push af ; save bank to switch to + ld h,$0 + ld l,c + add hl,hl ; get raw length of bytes to copy + add hl,hl + add hl,hl + ld b,h + ld c,l + pop af + pop hl + jp FarCopyDataDouble |