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 880d1fb7..b239d951 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 ldh a, [hLoadedROMBank] push af - ld a, [wBuffer] - ldh [hLoadedROMBank], a - ld [MBC1RomBank], a + ld a, [wFarCopyDataSavedROMBank] + call BankswitchCommon call CopyData pop af - ldh [hLoadedROMBank], 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 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:: + ldh 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:: + ldh 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 |