summaryrefslogtreecommitdiff
path: root/home/copy.asm
diff options
context:
space:
mode:
Diffstat (limited to 'home/copy.asm')
-rw-r--r--home/copy.asm70
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