summaryrefslogtreecommitdiff
path: root/engine/menus
diff options
context:
space:
mode:
Diffstat (limited to 'engine/menus')
-rwxr-xr-xengine/menus/delete_save.asm34
-rwxr-xr-xengine/menus/savemenu_copytilemapatonce.asm84
2 files changed, 118 insertions, 0 deletions
diff --git a/engine/menus/delete_save.asm b/engine/menus/delete_save.asm
new file mode 100755
index 00000000..a3ea661d
--- /dev/null
+++ b/engine/menus/delete_save.asm
@@ -0,0 +1,34 @@
+_DeleteSaveData:
+ call ClearTilemap
+ call GetMemSGBLayout
+ call LoadStandardFont
+ call LoadFontsExtra
+ ld de, MUSIC_MAIN_MENU
+ call PlayMusic
+ ld hl, .ClearAllSaveDataText
+ call PrintText
+ ld hl, .NoYesMenuHeader
+ call CopyMenuHeader
+ call VerticalMenu
+ ret c
+ ld a, [wMenuCursorY]
+ cp 1
+ ret z
+ farcall EmptyAllSRAMBanks
+ ret
+
+.ClearAllSaveDataText:
+ text_far _ClearAllSaveDataText
+ text_end
+
+.NoYesMenuHeader:
+ db 0 ; flags
+ menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
+ dw .MenuData
+ db 1 ; default option
+
+.MenuData:
+ db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
+ db 2 ; items
+ db "NO@"
+ db "YES@"
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