diff options
-rwxr-xr-x | engine/menus/savemenu_copytilemapatonce.asm | 84 | ||||
-rwxr-xr-x | engine/phone/phonering_copytilemapatonce.asm | 87 | ||||
-rwxr-xr-x | home/tilemap.asm | 16 | ||||
-rw-r--r-- | main.asm | 7 |
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 @@ -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:: |