summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlibjet <libj3t@gmail.com>2020-05-30 16:20:48 +0100
committerlibjet <libj3t@gmail.com>2020-05-30 16:20:48 +0100
commitfa47323db2e2731a5af032e81fc96445caa39d24 (patch)
tree1a2c6f461fd71f8688e78a8b93a7d9e75077d5cc
parent575a0a417986999097c1a9e9ade135726b71cb7f (diff)
Add savemenu/phonering_copytilemapatonce.asm
-rwxr-xr-xengine/menus/savemenu_copytilemapatonce.asm84
-rwxr-xr-xengine/phone/phonering_copytilemapatonce.asm87
-rwxr-xr-xhome/tilemap.asm16
-rw-r--r--main.asm7
4 files changed, 182 insertions, 12 deletions
diff --git a/engine/menus/savemenu_copytilemapatonce.asm b/engine/menus/savemenu_copytilemapatonce.asm
new file mode 100755
index 00000000..4b567a58
--- /dev/null
+++ b/engine/menus/savemenu_copytilemapatonce.asm
@@ -0,0 +1,84 @@
+SaveMenu_CopyTilemapAtOnce:
+ ldh a, [hCGB]
+ and a
+ jp z, WaitBGMap
+
+; The following is a modified version of CopyTilemapAtOnce
+; that waits for [rLY] to be $60 instead of $80 - 1.
+ ldh a, [hBGMapMode]
+ push af
+ xor a
+ ldh [hBGMapMode], a
+
+ ldh a, [hMapAnims]
+ push af
+ xor a
+ ldh [hMapAnims], a
+
+.wait
+ ldh a, [rLY]
+ cp $60
+ jr c, .wait
+
+ di
+ ld a, BANK(vBGMap2)
+ ldh [rVBK], a
+ hlcoord 0, 0, wAttrmap
+ call .CopyBGMapViaStack
+ ld a, BANK(vBGMap0)
+ ldh [rVBK], a
+ hlcoord 0, 0
+ call .CopyBGMapViaStack
+
+.wait2
+ ldh a, [rLY]
+ cp $60
+ jr c, .wait2
+ ei
+
+ pop af
+ ldh [hMapAnims], a
+ pop af
+ ldh [hBGMapMode], a
+ ret
+
+.CopyBGMapViaStack:
+; Copy all tiles to vBGMap
+ ld [hSPBuffer], sp
+ ld sp, hl
+ ldh a, [hBGMapAddress + 1]
+ ld h, a
+ ld l, 0
+ ld a, SCREEN_HEIGHT
+ ldh [hTilesPerCycle], a
+ ld b, 1 << 1 ; not in v/hblank
+ ld c, LOW(rSTAT)
+
+.loop
+rept SCREEN_WIDTH / 2
+ pop de
+; if in v/hblank, wait until not in v/hblank
+.loop\@
+ ldh a, [c]
+ and b
+ jr nz, .loop\@
+; load vBGMap
+ ld [hl], e
+ inc l
+ ld [hl], d
+ inc l
+endr
+
+ ld de, BG_MAP_WIDTH - SCREEN_WIDTH
+ add hl, de
+ ldh a, [hTilesPerCycle]
+ dec a
+ ldh [hTilesPerCycle], a
+ jr nz, .loop
+
+ ldh a, [hSPBuffer]
+ ld l, a
+ ldh a, [hSPBuffer + 1]
+ ld h, a
+ ld sp, hl
+ ret
diff --git a/engine/phone/phonering_copytilemapatonce.asm b/engine/phone/phonering_copytilemapatonce.asm
new file mode 100755
index 00000000..6ce141b5
--- /dev/null
+++ b/engine/phone/phonering_copytilemapatonce.asm
@@ -0,0 +1,87 @@
+PhoneRing_CopyTilemapAtOnce:
+ ldh a, [hCGB]
+ and a
+ jp z, WaitBGMap
+ ld a, [wSpriteUpdatesEnabled]
+ cp $0
+ jp z, WaitBGMap
+
+; The following is a modified version of CopyTilemapAtOnce
+; that waits for [rLY] to be LY_VBLANK - 1 instead of $80 - 1.
+ ldh a, [hBGMapMode]
+ push af
+ xor a
+ ldh [hBGMapMode], a
+
+ ldh a, [hMapAnims]
+ push af
+ xor a
+ ldh [hMapAnims], a
+
+.wait
+ ldh a, [rLY]
+ cp LY_VBLANK - 1
+ jr c, .wait
+
+ di
+ ld a, BANK(vBGMap2)
+ ldh [rVBK], a
+ hlcoord 0, 0, wAttrmap
+ call .CopyBGMapViaStack
+ ld a, BANK(vBGMap0)
+ ldh [rVBK], a
+ hlcoord 0, 0
+ call .CopyBGMapViaStack
+
+.wait2
+ ldh a, [rLY]
+ cp LY_VBLANK - 1
+ jr c, .wait2
+ ei
+
+ pop af
+ ldh [hMapAnims], a
+ pop af
+ ldh [hBGMapMode], a
+ ret
+
+.CopyBGMapViaStack:
+; Copy all tiles to vBGMap
+ ld [hSPBuffer], sp
+ ld sp, hl
+ ldh a, [hBGMapAddress + 1]
+ ld h, a
+ ld l, 0
+ ld a, SCREEN_HEIGHT
+ ldh [hTilesPerCycle], a
+ ld b, 1 << 1 ; not in v/hblank
+ ld c, LOW(rSTAT)
+
+.loop
+rept SCREEN_WIDTH / 2
+ pop de
+; if in v/hblank, wait until not in v/hblank
+.loop\@
+ ldh a, [c]
+ and b
+ jr nz, .loop\@
+; load vBGMap
+ ld [hl], e
+ inc l
+ ld [hl], d
+ inc l
+endr
+
+ ld de, BG_MAP_WIDTH - SCREEN_WIDTH
+ add hl, de
+ ldh a, [hTilesPerCycle]
+ dec a
+ ldh [hTilesPerCycle], a
+ jr nz, .loop
+
+ ldh a, [hSPBuffer]
+ ld l, a
+ ldh a, [hSPBuffer + 1]
+ ld h, a
+ ld sp, hl
+ ret
diff --git a/home/tilemap.asm b/home/tilemap.asm
index 176d5be2..fac8d372 100755
--- a/home/tilemap.asm
+++ b/home/tilemap.asm
@@ -70,22 +70,22 @@ CopyTilemapAtOnce::
.wait
ldh a, [rLY]
- cp $7f
+ cp $80 - 1
jr c, .wait
di
- ld a, BANK(vTiles3)
+ ld a, BANK(vBGMap2)
ldh [rVBK], a
hlcoord 0, 0, wAttrmap
- call .StackPointerMagic
- ld a, BANK(vTiles0)
+ call .CopyBGMapViaStack
+ ld a, BANK(vBGMap0)
ldh [rVBK], a
hlcoord 0, 0
- call .StackPointerMagic
+ call .CopyBGMapViaStack
.wait2
ldh a, [rLY]
- cp $7f
+ cp $80 - 1
jr c, .wait2
ei
@@ -95,7 +95,7 @@ CopyTilemapAtOnce::
ldh [hBGMapMode], a
ret
-.StackPointerMagic:
+.CopyBGMapViaStack:
; Copy all tiles to vBGMap
ld [hSPBuffer], sp
ld sp, hl
@@ -115,7 +115,7 @@ rept SCREEN_WIDTH / 2
ldh a, [c]
and b
jr nz, .loop\@
-; load BGMap0
+; load vBGMap
ld [hl], e
inc l
ld [hl], d
diff --git a/main.asm b/main.asm
index 39f8fb6d..15a474db 100644
--- a/main.asm
+++ b/main.asm
@@ -229,10 +229,9 @@ INCLUDE "engine/events/halloffame.asm"
SECTION "bank23", ROMX
-SaveMenu_CopyTilemapAtOnce::
- dr $8c000, $8c0b9
-PhoneRing_CopyTilemapAtOnce::
- dr $8c0b9, $8c17a
+INCLUDE "engine/menus/savemenu_copytilemapatonce.asm"
+INCLUDE "engine/phone/phonering_copytilemapatonce.asm"
+
_ResetClock::
dr $8c17a, $8c310
_DeleteSaveData::