summaryrefslogtreecommitdiff
path: root/home
diff options
context:
space:
mode:
authorTauwasser <Tauwasser@tauwasser.eu>2018-05-31 04:17:44 +0200
committerTauwasser <Tauwasser@tauwasser.eu>2018-05-31 04:17:53 +0200
commitb92ce65c08805029d7dd9398b7d7d16fd63b22dd (patch)
tree8dccdc4ed2f45a63cbfed2a997c31f73e16ce9ad /home
parent77ea015d667d111de27420eb896567deb9a677ea (diff)
home: disassemble video data copy functions
Move to copy2 and rename constants to pokered for consistency Signed-off-by: Tauwasser <Tauwasser@tauwasser.eu>
Diffstat (limited to 'home')
-rw-r--r--home/copy.asm113
-rw-r--r--home/copy2.asm177
2 files changed, 181 insertions, 109 deletions
diff --git a/home/copy.asm b/home/copy.asm
index b361eeb..b289aea 100644
--- a/home/copy.asm
+++ b/home/copy.asm
@@ -1,115 +1,8 @@
INCLUDE "constants.asm"
-SECTION "Copy functions", ROM0[$0D2A]
-
-FarCopyData::
-; copy bc bytes from a:hl to de
- ld [wBuffer], a
- ldh a, [hROMBank]
- push af
- ld a, [wBuffer]
- call Bankswitch
-
- call CopyBytes
-
- pop af
- call Bankswitch
- ret
-
-
-FarCopyBytesDouble:
-; Copy bc bytes from a:hl to bc*2 bytes at de,
-; doubling each byte in the process.
-
- ld [wBuffer], a
- ldh a, [hROMBank]
- push af
- ld a, [wBuffer]
- call Bankswitch
-
-; switcheroo, de <> hl
- ld a, h
- ld h, d
- ld d, a
- ld a, l
- ld l, e
- ld e, a
- ld a, b
- and a
- jr z, .inc
-
- ld a, c
- and a
- jr z, .loop
-
-.inc
- inc b
-
-.loop
- ld a, [de]
- inc de
- ld [hli], a
- ld [hli], a
- dec c
- jr nz, .loop
-
- dec b
- jr nz, .loop
-
- pop af
- call Bankswitch
- ret
-
-
-Request2bpp::
- ldh a, [hBGMapMode]
- push af
- xor a
- ldh [hBGMapMode], a
-
- ldh a, [hROMBank]
- push af
- ld a, b
- call Bankswitch
-
- ld a, e
- ld [wRequested2bppSource], a
- ld a, d
- ld [wRequested2bppSource + 1], a
- ld a, l
- ld [wRequested2bppDest], a
- ld a, h
- ld [wRequested2bppDest + 1], a
-
-.loop
- ; Keep looping bigcopy until we have less than 8 bytes left
- ld a, c
- cp 8
- jr nc, .bigcopy
-
- ld [wRequested2bpp], a
- call DelayFrame
-
- pop af
- call Bankswitch
- pop af
- ldh [hBGMapMode], a
- ret
-
-.bigcopy
- ; Copy 8 bytes
- ld a, 8
- ld [wRequested2bpp], a
- call DelayFrame
-
- ld a, c
- sub 8
- ld c, a
- jr .loop
-
-
-SECTION "Second copy functions", ROM0[$32F7]
+SECTION "Copy functions", ROM0[$32F7]
+; Copy bc bytes from a:hl to de.
FarCopyBytes:: ; 32f7
ld [wBuffer], a
ldh a, [hROMBank]
@@ -120,6 +13,7 @@ FarCopyBytes:: ; 32f7
pop af
jp Bankswitch
+; Copy bc bytes from hl to de
CopyBytes:: ; 330a
ld a, b
and a
@@ -134,6 +28,7 @@ CopyBytes:: ; 330a
jr nz, .next
ret
+; Copy c bytes from hl to de
CopyBytesSmall:: ; 331a
ld a, [hli]
ld [de], a
diff --git a/home/copy2.asm b/home/copy2.asm
new file mode 100644
index 0000000..27abf08
--- /dev/null
+++ b/home/copy2.asm
@@ -0,0 +1,177 @@
+INCLUDE "constants.asm"
+
+SECTION "Video Copy functions", ROM0[$0D2A]
+
+; Identical to FarCopyBytes except for tail call optimization
+; Copy bc 2bpp bytes from a:hl to de.
+FarCopyData: ; d2a (0:d2a)
+ ld [wBuffer], a
+ ldh a, [hROMBank]
+ push af
+ ld a, [wBuffer]
+ call Bankswitch
+ call CopyBytes
+ pop af
+ call Bankswitch
+ ret
+
+; Copy and expand bc 1bpp bytes from a:hl to de.
+FarCopyDataDouble: ; d3e (0:d3e)
+ ld [wBuffer], a
+ ldh a, [hROMBank]
+ push af
+ ld a, [wBuffer]
+ call Bankswitch
+ ld a, h
+ ld h, d
+ ld d, a
+ ld a, l
+ ld l, e
+ ld e, a
+ ld a, b
+ and a
+ jr z, .copy_small
+ ld a, c
+ and a
+ jr z, .next
+.copy_small
+ inc b
+.next
+ ld a, [de]
+ inc de
+ ld [hli], a
+ ld [hli], a
+ dec c
+ jr nz, .next
+ dec b
+ jr nz, .next
+ pop af
+ call Bankswitch
+ ret
+
+; Wait for the next VBlank, then copy c 2bpp
+; tiles from b:de to hl, 8 tiles at a time.
+; This takes c/8 frames.
+CopyVideoData:: ; d68 (0:d68)
+ ldh a, [hBGMapMode]
+ push af
+ xor a ; disable auto-transfer while copying
+ ldh [hBGMapMode], a
+ ldh a, [hROMBank]
+ push af
+ ld a, b
+ call Bankswitch
+ ld a, e
+ ld [wVBCopySrc], a
+ ld a, d
+ ld [wVBCopySrc + 1], a
+ ld a, l
+ ld [wVBCopyDst], a
+ ld a, h
+ ld [wVBCopyDst + 1], a
+.loop
+ ld a, c
+ cp $08
+ jr nc, .keepgoing
+ ld [wVBCopySize], a
+ call DelayFrame
+ pop af
+ call Bankswitch
+ pop af
+ ldh [hBGMapMode], a
+ ret
+.keepgoing
+ ld a, $08
+ ld [wVBCopySize], a
+ call DelayFrame
+ ld a, c
+ sub $08
+ ld c, a
+ jr .loop
+
+; Wait for the next VBlank, then copy c 1bpp
+; tiles from b:de to hl, 8 tiles at a time.
+; This takes c/8 frames.
+CopyVideoDataDouble:: ; da6 (0:da6)
+ ldh a, [hBGMapMode]
+ push af
+ xor a
+ ldh [hBGMapMode], a
+ ldh a, [hROMBank]
+ push af
+ ld a, b
+ call Bankswitch
+ ld a, e
+ ld [wVBCopyDoubleSrc], a
+ ld a, d
+ ld [wVBCopyDoubleSrc + 1], a
+ ld a, l
+ ld [wVBCopyDoubleDst], a
+ ld a, h
+ ld [wVBCopyDoubleDst + 1], a
+.loop
+ ld a, c
+ cp $08
+ jr nc, .keepgoing
+ ld [wVBCopyDoubleSize], a
+ call DelayFrame
+ pop af
+ call Bankswitch
+ pop af
+ ldh [hBGMapMode], a
+ ret
+.keepgoing
+ ld a, $08
+ ld [wVBCopyDoubleSize], a
+ call DelayFrame
+ ld a, c
+ sub $08
+ ld c, a
+ jr .loop
+
+; Copy c 2bpp tiles from b:de to hl in VRAM
+; using VBlank service or direct copy in
+; case LCD is off
+CopyVideoDataOptimized:: ; de4 (0:de4)
+ ldh a, [rLCDC]
+ bit rLCDC_ENABLE, a
+ jp nz, CopyVideoData ; copy video data during vblank while screen is on
+ push hl ; convert to FarCopyData call
+ ld h, d
+ ld l, e
+ pop de
+ ld a, b
+ push af
+ swap c
+ ld a, $0f
+ and c
+ ld b, a
+ ld a, $f0
+ and c
+ ld c, a
+ pop af
+ jp FarCopyData
+
+; Copy c 1bpp tiles from b:de to hl in VRAM
+; using VBlank service or direct copy in
+; case LCD is off
+CopyVideoDataDoubleOptimized: ; dff (0:dff)
+ ldh a, [rLCDC]
+ bit rLCDC_ENABLE, a
+ jp nz, CopyVideoDataDouble
+ push de
+ ld d, h
+ ld e, l
+ ld a, b
+ push af
+ ld h, $00
+ ld l, c
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ ld b, h
+ ld c, l
+ pop af
+ pop hl
+ jp FarCopyDataDouble
+; 0xe18 \ No newline at end of file