diff options
Diffstat (limited to 'engine')
-rwxr-xr-x | engine/menus/savemenu_copytilemapatonce.asm | 84 | ||||
-rwxr-xr-x | engine/phone/phonering_copytilemapatonce.asm | 87 |
2 files changed, 171 insertions, 0 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 |