summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/rom3.s1386
-rw-r--r--asm/rom5.s2
-rw-r--r--data/data2.s42
-rw-r--r--iwram_syms.txt2
-rw-r--r--ld_script.txt1
-rw-r--r--src/main_menu.c605
6 files changed, 626 insertions, 1412 deletions
diff --git a/asm/rom3.s b/asm/rom3.s
index a32cec299..94b6d2b21 100644
--- a/asm/rom3.s
+++ b/asm/rom3.s
@@ -6,1392 +6,6 @@
.text
- thumb_func_start CB2_MainMenu
-CB2_MainMenu: @ 80096C4
- push {lr}
- bl RunTasks
- bl AnimateSprites
- bl BuildOamBuffer
- bl UpdatePaletteFade
- pop {r0}
- bx r0
- thumb_func_end CB2_MainMenu
-
- thumb_func_start VBlankCB_MainMenu
-VBlankCB_MainMenu: @ 80096DC
- push {lr}
- bl LoadOam
- bl ProcessSpriteCopyRequests
- bl TransferPlttBuffer
- pop {r0}
- bx r0
- thumb_func_end VBlankCB_MainMenu
-
- thumb_func_start CB2_InitMainMenu
-CB2_InitMainMenu: @ 80096F0
- push {lr}
- movs r0, 0
- bl InitMainMenu
- pop {r0}
- bx r0
- thumb_func_end CB2_InitMainMenu
-
- thumb_func_start sub_80096FC
-sub_80096FC: @ 80096FC
- push {lr}
- movs r0, 0x1
- bl InitMainMenu
- pop {r0}
- bx r0
- thumb_func_end sub_80096FC
-
- thumb_func_start InitMainMenu
-InitMainMenu: @ 8009708
- push {r4,r5,lr}
- sub sp, 0xC
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- movs r0, 0
- bl SetVBlankCallback
- movs r0, 0x80
- lsls r0, 19
- movs r1, 0
- strh r1, [r0]
- adds r0, 0xC
- strh r1, [r0]
- subs r0, 0x2
- strh r1, [r0]
- subs r0, 0x2
- strh r1, [r0]
- adds r0, 0x10
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- subs r0, 0x6
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- subs r0, 0x6
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- add r0, sp, 0x4
- strh r1, [r0]
- ldr r1, _080097BC
- str r0, [r1]
- movs r0, 0xC0
- lsls r0, 19
- str r0, [r1, 0x4]
- ldr r0, _080097C0
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- movs r5, 0
- str r5, [sp, 0x8]
- add r0, sp, 0x8
- str r0, [r1]
- movs r0, 0xE0
- lsls r0, 19
- str r0, [r1, 0x4]
- ldr r0, _080097C4
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- add r0, sp, 0x4
- strh r5, [r0]
- str r0, [r1]
- ldr r0, _080097C8
- str r0, [r1, 0x4]
- ldr r0, _080097CC
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- bl ResetPaletteFade
- ldr r0, _080097D0
- movs r1, 0
- movs r2, 0x20
- bl LoadPalette
- bl remove_some_task
- bl ResetTasks
- bl ResetSpriteData
- bl FreeAllSpritePalettes
- ldr r0, _080097D4
- bl SetUpWindowConfig
- ldr r0, _080097D8
- bl sub_8071C4C
- cmp r4, 0
- beq _080097DC
- movs r0, 0x1
- negs r0, r0
- str r5, [sp]
- movs r1, 0
- movs r2, 0x10
- movs r3, 0
- bl BeginNormalPaletteFade
- b _080097EE
- .align 2, 0
-_080097BC: .4byte 0x040000d4
-_080097C0: .4byte 0x8100c000
-_080097C4: .4byte 0x85000100
-_080097C8: .4byte 0x05000002
-_080097CC: .4byte 0x810001ff
-_080097D0: .4byte gUnknown_081E797C
-_080097D4: .4byte gWindowConfig_81E6C3C
-_080097D8: .4byte gWindowConfig_81E6CE4
-_080097DC:
- movs r0, 0x1
- negs r0, r0
- ldr r1, _08009858
- str r1, [sp]
- movs r1, 0
- movs r2, 0x10
- movs r3, 0
- bl BeginNormalPaletteFade
-_080097EE:
- ldr r0, _0800985C
- movs r1, 0
- strh r1, [r0]
- adds r0, 0x4
- strh r1, [r0]
- adds r0, 0x4
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- adds r0, 0x6
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- ldr r3, _08009860
- ldrh r2, [r3]
- strh r1, [r3]
- ldr r4, _08009864
- ldrh r0, [r4]
- movs r1, 0x1
- orrs r0, r1
- strh r0, [r4]
- strh r2, [r3]
- ldr r0, _08009868
- bl SetVBlankCallback
- ldr r0, _0800986C
- bl SetMainCallback2
- movs r1, 0x80
- lsls r1, 19
- movs r2, 0xC5
- lsls r2, 6
- adds r0, r2, 0
- strh r0, [r1]
- ldr r0, _08009870
- movs r1, 0
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _08009874
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r2
- movs r0, 0
- strh r0, [r1, 0xA]
- add sp, 0xC
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_08009858: .4byte 0x0000ffff
-_0800985C: .4byte REG_WIN0H
-_08009860: .4byte 0x04000208
-_08009864: .4byte 0x04000200
-_08009868: .4byte VBlankCB_MainMenu
-_0800986C: .4byte CB2_MainMenu
-_08009870: .4byte Task_CheckSave
-_08009874: .4byte 0x03004b20
- thumb_func_end InitMainMenu
-
- thumb_func_start Task_CheckSave
-Task_CheckSave: @ 8009878
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- lsls r0, 24
- lsrs r5, r0, 24
- ldr r0, _080098D4
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- lsls r0, 24
- lsrs r6, r0, 24
- cmp r6, 0
- beq _08009894
- b _080099FC
-_08009894:
- ldr r7, _080098D8
- strh r6, [r7]
- ldr r0, _080098DC
- mov r8, r0
- strh r6, [r0]
- ldr r1, _080098E0
- ldr r2, _080098E4
- adds r0, r2, 0
- strh r0, [r1]
- adds r1, 0x2
- movs r0, 0x31
- strh r0, [r1]
- adds r1, 0x6
- movs r0, 0xF1
- strh r0, [r1]
- ldr r0, _080098E8
- strh r6, [r0]
- adds r1, 0x4
- movs r0, 0x7
- strh r0, [r1]
- ldr r0, _080098EC
- ldrh r4, [r0]
- cmp r4, 0x2
- beq _0800993C
- cmp r4, 0x2
- bgt _080098F0
- cmp r4, 0
- beq _080099AC
- cmp r4, 0x1
- beq _080098FA
- b _080099AC
- .align 2, 0
-_080098D4: .4byte 0x0202f388
-_080098D8: .4byte REG_WIN0H
-_080098DC: .4byte REG_WIN0V
-_080098E0: .4byte REG_WININ
-_080098E4: .4byte 0x00001111
-_080098E8: .4byte REG_BLDALPHA
-_080098EC: .4byte 0x03005eb8
-_080098F0:
- cmp r4, 0x4
- beq _080099C8
- cmp r4, 0xFF
- beq _08009950
- b _080099AC
-_080098FA:
- bl sub_806918C
- cmp r0, 0x1
- bne _0800991C
- ldr r2, _08009918
- lsls r3, r5, 2
- adds r0, r3, r5
- lsls r0, 3
- adds r0, r2
- movs r1, 0x2
- strh r1, [r0, 0x8]
- adds r1, r2, 0
- adds r2, r3, 0
- b _0800992A
- .align 2, 0
-_08009918: .4byte 0x03004b20
-_0800991C:
- ldr r0, _08009934
- lsls r2, r5, 2
- adds r1, r2, r5
- lsls r1, 3
- adds r1, r0
- strh r4, [r1, 0x8]
- adds r1, r0, 0
-_0800992A:
- adds r0, r2, r5
- lsls r0, 3
- adds r0, r1
- ldr r1, _08009938
- b _080099FA
- .align 2, 0
-_08009934: .4byte 0x03004b20
-_08009938: .4byte Task_CheckRtc
-_0800993C:
- movs r0, 0x2
- movs r1, 0xE
- movs r2, 0x1B
- movs r3, 0x13
- bl DrawDefaultWindow
- ldr r0, _0800994C
- b _080099D6
- .align 2, 0
-_0800994C: .4byte gUnknown_0840DEC2
-_08009950:
- movs r0, 0x2
- movs r1, 0xE
- movs r2, 0x1B
- movs r3, 0x13
- bl DrawDefaultWindow
- ldr r0, _08009994
- movs r1, 0x3
- movs r2, 0xF
- bl AddTextPrinterWithCallbackForMessage
- ldr r2, _08009998
- adds r0, r2, 0
- strh r0, [r7]
- ldr r1, _0800999C
- adds r0, r1, 0
- mov r2, r8
- strh r0, [r2]
- ldr r1, _080099A0
- lsls r0, r5, 2
- adds r0, r5
- lsls r0, 3
- adds r4, r0, r1
- movs r5, 0x1
- strh r5, [r4, 0x8]
- ldr r0, _080099A4
- str r0, [r4]
- bl sub_806918C
- cmp r0, 0x1
- bne _080099A8
- movs r0, 0x2
- strh r0, [r4, 0x8]
- b _080099FC
- .align 2, 0
-_08009994: .4byte gUnknown_0840DE81
-_08009998: .4byte 0x000011df
-_0800999C: .4byte 0x0000719f
-_080099A0: .4byte 0x03004b20
-_080099A4: .4byte Task_WaitForSaveErrorAck
-_080099A8:
- strh r5, [r4, 0x8]
- b _080099FC
-_080099AC:
- ldr r1, _080099C0
- lsls r0, r5, 2
- adds r0, r5
- lsls r0, 3
- adds r0, r1
- movs r1, 0
- strh r1, [r0, 0x8]
- ldr r1, _080099C4
- b _080099FA
- .align 2, 0
-_080099C0: .4byte 0x03004b20
-_080099C4: .4byte Task_CheckRtc
-_080099C8:
- movs r0, 0x2
- movs r1, 0xE
- movs r2, 0x1B
- movs r3, 0x13
- bl DrawDefaultWindow
- ldr r0, _08009A08
-_080099D6:
- movs r1, 0x3
- movs r2, 0xF
- bl AddTextPrinterWithCallbackForMessage
- ldr r1, _08009A0C
- adds r0, r1, 0
- strh r0, [r7]
- ldr r2, _08009A10
- adds r0, r2, 0
- mov r1, r8
- strh r0, [r1]
- ldr r1, _08009A14
- lsls r0, r5, 2
- adds r0, r5
- lsls r0, 3
- adds r0, r1
- strh r6, [r0, 0x8]
- ldr r1, _08009A18
-_080099FA:
- str r1, [r0]
-_080099FC:
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08009A08: .4byte gUnknown_0840DEE5
-_08009A0C: .4byte 0x000011df
-_08009A10: .4byte 0x0000719f
-_08009A14: .4byte 0x03004b20
-_08009A18: .4byte Task_WaitForSaveErrorAck
- thumb_func_end Task_CheckSave
-
- thumb_func_start Task_WaitForSaveErrorAck
-Task_WaitForSaveErrorAck: @ 8009A1C
- push {r4,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- bl sub_8072080
- lsls r0, 24
- cmp r0, 0
- beq _08009A52
- ldr r0, _08009A58
- ldrh r1, [r0, 0x2E]
- movs r0, 0x1
- ands r0, r1
- cmp r0, 0
- beq _08009A52
- movs r0, 0x2
- movs r1, 0xE
- movs r2, 0x1B
- movs r3, 0x13
- bl Reset
- ldr r0, _08009A5C
- lsls r1, r4, 2
- adds r1, r4
- lsls r1, 3
- adds r1, r0
- ldr r0, _08009A60
- str r0, [r1]
-_08009A52:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08009A58: .4byte 0x03001770
-_08009A5C: .4byte 0x03004b20
-_08009A60: .4byte Task_CheckRtc
- thumb_func_end Task_WaitForSaveErrorAck
-
- thumb_func_start Task_CheckRtc
-Task_CheckRtc: @ 8009A64
- push {r4-r7,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- adds r5, r4, 0
- ldr r0, _08009AC0
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0
- bne _08009B10
- ldr r6, _08009AC4
- strh r2, [r6]
- ldr r7, _08009AC8
- strh r2, [r7]
- ldr r1, _08009ACC
- ldr r3, _08009AD0
- adds r0, r3, 0
- strh r0, [r1]
- adds r1, 0x2
- movs r0, 0x31
- strh r0, [r1]
- adds r1, 0x6
- movs r0, 0xF1
- strh r0, [r1]
- ldr r0, _08009AD4
- strh r2, [r0]
- adds r1, 0x4
- movs r0, 0x7
- strh r0, [r1]
- bl RtcGetErrorStatus
- movs r1, 0xFF
- lsls r1, 4
- ands r1, r0
- cmp r1, 0
- bne _08009AE0
- ldr r0, _08009AD8
- lsls r1, r4, 2
- adds r1, r4
- lsls r1, 3
- adds r1, r0
- ldr r0, _08009ADC
- str r0, [r1]
- b _08009B10
- .align 2, 0
-_08009AC0: .4byte 0x0202f388
-_08009AC4: .4byte REG_WIN0H
-_08009AC8: .4byte REG_WIN0V
-_08009ACC: .4byte REG_WININ
-_08009AD0: .4byte 0x00001111
-_08009AD4: .4byte REG_BLDALPHA
-_08009AD8: .4byte 0x03004b20
-_08009ADC: .4byte Task_DrawMainMenu
-_08009AE0:
- movs r0, 0x2
- movs r1, 0xE
- movs r2, 0x1B
- movs r3, 0x13
- bl DrawDefaultWindow
- ldr r0, _08009B18
- movs r1, 0x3
- movs r2, 0xF
- bl AddTextPrinterWithCallbackForMessage
- ldr r1, _08009B1C
- adds r0, r1, 0
- strh r0, [r6]
- ldr r3, _08009B20
- adds r0, r3, 0
- strh r0, [r7]
- ldr r1, _08009B24
- lsls r0, r5, 2
- adds r0, r5
- lsls r0, 3
- adds r0, r1
- ldr r1, _08009B28
- str r1, [r0]
-_08009B10:
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08009B18: .4byte gUnknown_0840DF10
-_08009B1C: .4byte 0x000011df
-_08009B20: .4byte 0x0000719f
-_08009B24: .4byte 0x03004b20
-_08009B28: .4byte Task_WaitForRtcErrorAck
- thumb_func_end Task_CheckRtc
-
- thumb_func_start Task_WaitForRtcErrorAck
-Task_WaitForRtcErrorAck: @ 8009B2C
- push {r4,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- bl sub_8072080
- lsls r0, 24
- cmp r0, 0
- beq _08009B62
- ldr r0, _08009B68
- ldrh r1, [r0, 0x2E]
- movs r0, 0x1
- ands r0, r1
- cmp r0, 0
- beq _08009B62
- movs r0, 0x2
- movs r1, 0xE
- movs r2, 0x1B
- movs r3, 0x13
- bl Reset
- ldr r0, _08009B6C
- lsls r1, r4, 2
- adds r1, r4
- lsls r1, 3
- adds r1, r0
- ldr r0, _08009B70
- str r0, [r1]
-_08009B62:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08009B68: .4byte 0x03001770
-_08009B6C: .4byte 0x03004b20
-_08009B70: .4byte Task_DrawMainMenu
- thumb_func_end Task_WaitForRtcErrorAck
-
- thumb_func_start Task_DrawMainMenu
-Task_DrawMainMenu: @ 8009B74
- push {r4,r5,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r4, r0, 24
- ldr r0, _08009BDC
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0
- beq _08009B8E
- b _08009D20
-_08009B8E:
- ldr r0, _08009BE0
- strh r2, [r0]
- adds r0, 0x4
- strh r2, [r0]
- ldr r1, _08009BE4
- ldr r3, _08009BE8
- adds r0, r3, 0
- strh r0, [r1]
- adds r1, 0x2
- movs r0, 0x31
- strh r0, [r1]
- adds r1, 0x6
- movs r0, 0xF1
- strh r0, [r1]
- ldr r0, _08009BEC
- strh r2, [r0]
- adds r1, 0x4
- movs r0, 0x7
- strh r0, [r1]
- mov r0, sp
- strh r2, [r0]
- movs r1, 0xFE
- movs r2, 0x2
- bl LoadPalette
- ldr r0, _08009BF0
- ldrb r0, [r0, 0x8]
- cmp r0, 0
- bne _08009BF8
- mov r1, sp
- ldr r2, _08009BF4
- adds r0, r2, 0
- strh r0, [r1]
- mov r0, sp
- movs r1, 0xF1
- movs r2, 0x2
- bl LoadPalette
- b _08009C0A
- .align 2, 0
-_08009BDC: .4byte 0x0202f388
-_08009BE0: .4byte REG_WIN0H
-_08009BE4: .4byte REG_WININ
-_08009BE8: .4byte 0x00001111
-_08009BEC: .4byte REG_BLDALPHA
-_08009BF0: .4byte gSaveBlock2
-_08009BF4: .4byte 0x00007e04
-_08009BF8:
- mov r1, sp
- ldr r3, _08009C54
- adds r0, r3, 0
- strh r0, [r1]
- mov r0, sp
- movs r1, 0xF1
- movs r2, 0x2
- bl LoadPalette
-_08009C0A:
- ldr r2, _08009C58
- lsls r1, r4, 2
- adds r0, r1, r4
- lsls r0, 3
- adds r0, r2
- movs r2, 0x8
- ldrsh r0, [r0, r2]
- adds r5, r1, 0
- cmp r0, 0x1
- beq _08009C64
- cmp r0, 0x1
- ble _08009C26
- cmp r0, 0x2
- beq _08009CB8
-_08009C26:
- movs r0, 0x1
- movs r1, 0
- movs r2, 0x1C
- movs r3, 0x3
- bl DrawDefaultWindow
- ldr r0, _08009C5C
- movs r1, 0x2
- movs r2, 0x1
- bl PrintMainMenuItem
- movs r0, 0x1
- movs r1, 0x4
- movs r2, 0x1C
- movs r3, 0x7
- bl DrawDefaultWindow
- ldr r0, _08009C60
- movs r1, 0x2
- movs r2, 0x5
- bl PrintMainMenuItem
- b _08009D14
- .align 2, 0
-_08009C54: .4byte 0x0000547f
-_08009C58: .4byte 0x03004b20
-_08009C5C: .4byte gUnknown_0840DCD0
-_08009C60: .4byte gUnknown_0840DCE2
-_08009C64:
- movs r0, 0x1
- movs r1, 0
- movs r2, 0x1C
- movs r3, 0x7
- bl DrawDefaultWindow
- ldr r0, _08009CAC
- movs r1, 0x2
- movs r2, 0x1
- bl PrintMainMenuItem
- movs r0, 0x1
- movs r1, 0x8
- movs r2, 0x1C
- movs r3, 0xB
- bl DrawDefaultWindow
- ldr r0, _08009CB0
- movs r1, 0x2
- movs r2, 0x9
- bl PrintMainMenuItem
- movs r0, 0x1
- movs r1, 0xC
- movs r2, 0x1C
- movs r3, 0xF
- bl DrawDefaultWindow
- ldr r0, _08009CB4
- movs r1, 0x2
- movs r2, 0xD
- bl PrintMainMenuItem
- bl PrintSaveFileInfo
- b _08009D14
- .align 2, 0
-_08009CAC: .4byte gUnknown_0840DCD9
-_08009CB0: .4byte gUnknown_0840DCD0
-_08009CB4: .4byte gUnknown_0840DCE2
-_08009CB8:
- movs r0, 0x1
- movs r1, 0
- movs r2, 0x1C
- movs r3, 0x7
- bl DrawDefaultWindow
- ldr r0, _08009D28
- movs r1, 0x2
- movs r2, 0x1
- bl PrintMainMenuItem
- movs r0, 0x1
- movs r1, 0x8
- movs r2, 0x1C
- movs r3, 0xB
- bl DrawDefaultWindow
- ldr r0, _08009D2C
- movs r1, 0x2
- movs r2, 0x9
- bl PrintMainMenuItem
- movs r0, 0x1
- movs r1, 0xC
- movs r2, 0x1C
- movs r3, 0xF
- bl DrawDefaultWindow
- ldr r0, _08009D30
- movs r1, 0x2
- movs r2, 0xD
- bl PrintMainMenuItem
- movs r0, 0x1
- movs r1, 0x10
- movs r2, 0x1C
- movs r3, 0x13
- bl DrawDefaultWindow
- ldr r0, _08009D34
- movs r1, 0x2
- movs r2, 0x11
- bl PrintMainMenuItem
- bl PrintSaveFileInfo
-_08009D14:
- ldr r0, _08009D38
- adds r1, r5, r4
- lsls r1, 3
- adds r1, r0
- ldr r0, _08009D3C
- str r0, [r1]
-_08009D20:
- add sp, 0x4
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08009D28: .4byte gUnknown_0840DCD9
-_08009D2C: .4byte gUnknown_0840DCD0
-_08009D30: .4byte gUnknown_0840DCE9
-_08009D34: .4byte gUnknown_0840DCE2
-_08009D38: .4byte 0x03004b20
-_08009D3C: .4byte Task_HighlightCurrentMenuItem
- thumb_func_end Task_DrawMainMenu
-
- thumb_func_start Task_HighlightCurrentMenuItem
-Task_HighlightCurrentMenuItem: @ 8009D40
- push {r4,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _08009D64
- lsls r4, r0, 2
- adds r4, r0
- lsls r4, 3
- adds r4, r1
- ldrb r0, [r4, 0x8]
- ldrb r1, [r4, 0xA]
- bl HighlightCurrentMenuItem
- ldr r0, _08009D68
- str r0, [r4]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08009D64: .4byte 0x03004b20
-_08009D68: .4byte Task_MainMenuProcessKeyInput
- thumb_func_end Task_HighlightCurrentMenuItem
-
- thumb_func_start MainMenuProcessKeyInput
-MainMenuProcessKeyInput: @ 8009D6C
- push {r4-r7,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r4, r0, 24
- ldr r1, _08009DA8
- ldrh r2, [r1, 0x2E]
- movs r0, 0x1
- ands r0, r2
- mov r12, r1
- cmp r0, 0
- beq _08009DB4
- movs r0, 0x5
- bl audio_play
- movs r0, 0x1
- negs r0, r0
- movs r1, 0
- str r1, [sp]
- movs r2, 0
- movs r3, 0x10
- bl BeginNormalPaletteFade
- ldr r1, _08009DAC
- lsls r0, r4, 2
- adds r0, r4
- lsls r0, 3
- adds r0, r1
- ldr r1, _08009DB0
- str r1, [r0]
- b _08009E74
- .align 2, 0
-_08009DA8: .4byte 0x03001770
-_08009DAC: .4byte 0x03004b20
-_08009DB0: .4byte MainMenuPressedA
-_08009DB4:
- movs r0, 0x2
- ands r0, r2
- cmp r0, 0
- beq _08009E00
- movs r0, 0x5
- bl audio_play
- movs r0, 0x1
- negs r0, r0
- ldr r1, _08009DF0
- str r1, [sp]
- movs r1, 0
- movs r2, 0
- movs r3, 0x10
- bl BeginNormalPaletteFade
- ldr r1, _08009DF4
- movs r0, 0xF0
- strh r0, [r1]
- adds r1, 0x4
- movs r0, 0xA0
- strh r0, [r1]
- ldr r1, _08009DF8
- lsls r0, r4, 2
- adds r0, r4
- lsls r0, 3
- adds r0, r1
- ldr r1, _08009DFC
- str r1, [r0]
- b _08009E74
- .align 2, 0
-_08009DF0: .4byte 0x0000ffff
-_08009DF4: .4byte REG_WIN0H
-_08009DF8: .4byte 0x03004b20
-_08009DFC: .4byte MainMenuPressedB
-_08009E00:
- ldr r0, _08009E20
- lsls r2, r4, 2
- adds r1, r2, r4
- lsls r1, 3
- adds r1, r0
- movs r3, 0x8
- ldrsh r1, [r1, r3]
- adds r6, r0, 0
- cmp r1, 0x1
- beq _08009E24
- cmp r1, 0x1
- ble _08009E1C
- cmp r1, 0x2
- beq _08009E28
-_08009E1C:
- movs r5, 0x2
- b _08009E2A
- .align 2, 0
-_08009E20: .4byte 0x03004b20
-_08009E24:
- movs r5, 0x3
- b _08009E2A
-_08009E28:
- movs r5, 0x4
-_08009E2A:
- mov r7, r12
- ldrh r1, [r7, 0x2E]
- movs r0, 0x40
- ands r0, r1
- cmp r0, 0
- beq _08009E4E
- adds r0, r2, r4
- lsls r0, 3
- adds r1, r0, r6
- ldrh r3, [r1, 0xA]
- movs r7, 0xA
- ldrsh r0, [r1, r7]
- cmp r0, 0
- ble _08009E4E
- subs r0, r3, 0x1
- strh r0, [r1, 0xA]
- movs r0, 0x1
- b _08009E76
-_08009E4E:
- mov r0, r12
- ldrh r1, [r0, 0x2E]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- beq _08009E74
- adds r0, r2, r4
- lsls r0, 3
- adds r2, r0, r6
- movs r3, 0xA
- ldrsh r1, [r2, r3]
- subs r0, r5, 0x1
- cmp r1, r0
- bge _08009E74
- ldrh r0, [r2, 0xA]
- adds r0, 0x1
- strh r0, [r2, 0xA]
- movs r0, 0x1
- b _08009E76
-_08009E74:
- movs r0, 0
-_08009E76:
- add sp, 0x4
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end MainMenuProcessKeyInput
-
- thumb_func_start Task_MainMenuProcessKeyInput
-Task_MainMenuProcessKeyInput: @ 8009E80
- push {r4,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- adds r0, r4, 0
- bl MainMenuProcessKeyInput
- lsls r0, 24
- cmp r0, 0
- beq _08009EA0
- ldr r0, _08009EA8
- lsls r1, r4, 2
- adds r1, r4
- lsls r1, 3
- adds r1, r0
- ldr r0, _08009EAC
- str r0, [r1]
-_08009EA0:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08009EA8: .4byte 0x03004b20
-_08009EAC: .4byte Task_HighlightCurrentMenuItem
- thumb_func_end Task_MainMenuProcessKeyInput
-
- thumb_func_start MainMenuPressedA
-MainMenuPressedA: @ 8009EB0
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- ldr r0, _08009EEC
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _08009FA4
- ldr r0, _08009EF0
- lsls r2, r4, 2
- adds r1, r2, r4
- lsls r1, 3
- adds r1, r0
- movs r5, 0x8
- ldrsh r3, [r1, r5]
- adds r5, r0, 0
- cmp r3, 0x1
- beq _08009EF4
- cmp r3, 0x1
- ble _08009EDE
- cmp r3, 0x2
- beq _08009F06
-_08009EDE:
- movs r0, 0xA
- ldrsh r1, [r1, r0]
- cmp r1, 0
- beq _08009F1E
- cmp r1, 0x1
- bne _08009F1E
- b _08009F26
- .align 2, 0
-_08009EEC: .4byte 0x0202f388
-_08009EF0: .4byte 0x03004b20
-_08009EF4:
- movs r0, 0xA
- ldrsh r1, [r1, r0]
- cmp r1, 0x1
- beq _08009F1E
- cmp r1, 0x1
- ble _08009F1A
- cmp r1, 0x2
- bne _08009F1A
- b _08009F26
-_08009F06:
- movs r0, 0xA
- ldrsh r1, [r1, r0]
- cmp r1, 0x1
- beq _08009F1E
- cmp r1, 0x1
- ble _08009F1A
- cmp r1, 0x2
- beq _08009F22
- cmp r1, 0x3
- beq _08009F26
-_08009F1A:
- movs r0, 0x1
- b _08009F28
-_08009F1E:
- movs r0, 0
- b _08009F28
-_08009F22:
- movs r0, 0x3
- b _08009F28
-_08009F26:
- movs r0, 0x2
-_08009F28:
- cmp r0, 0x1
- beq _08009F5C
- cmp r0, 0x1
- ble _08009F38
- cmp r0, 0x2
- beq _08009F78
- cmp r0, 0x3
- beq _08009F98
-_08009F38:
- ldr r0, _08009F50
- movs r1, 0
- strh r1, [r0]
- ldr r0, _08009F54
- strh r1, [r0]
- adds r0, r2, r4
- lsls r0, 3
- adds r0, r5
- ldr r1, _08009F58
- str r1, [r0]
- b _08009FA4
- .align 2, 0
-_08009F50: .4byte 0x0202eac8
-_08009F54: .4byte 0x0202eec8
-_08009F58: .4byte Task_Birch1
-_08009F5C:
- ldr r0, _08009F6C
- movs r1, 0
- strh r1, [r0]
- ldr r0, _08009F70
- strh r1, [r0]
- ldr r0, _08009F74
- b _08009F80
- .align 2, 0
-_08009F6C: .4byte 0x0202eac8
-_08009F70: .4byte 0x0202eec8
-_08009F74: .4byte CB2_ContinueSavedGame
-_08009F78:
- ldr r0, _08009F8C
- ldr r1, _08009F90
- str r1, [r0, 0x8]
- ldr r0, _08009F94
-_08009F80:
- bl SetMainCallback2
- adds r0, r4, 0
- bl DestroyTask
- b _08009FA4
- .align 2, 0
-_08009F8C: .4byte 0x03001770
-_08009F90: .4byte sub_80096FC
-_08009F94: .4byte CB2_InitOptionMenu
-_08009F98:
- ldr r0, _08009FAC
- bl SetMainCallback2
- adds r0, r4, 0
- bl DestroyTask
-_08009FA4:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08009FAC: .4byte CB2_InitMysteryEventMenu
- thumb_func_end MainMenuPressedA
-
- thumb_func_start MainMenuPressedB
-MainMenuPressedB: @ 8009FB0
- push {r4,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- ldr r0, _08009FD4
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _08009FCE
- ldr r0, _08009FD8
- bl SetMainCallback2
- adds r0, r4, 0
- bl DestroyTask
-_08009FCE:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08009FD4: .4byte 0x0202f388
-_08009FD8: .4byte CB2_InitTitleScreen
- thumb_func_end MainMenuPressedB
-
- thumb_func_start HighlightCurrentMenuItem
-HighlightCurrentMenuItem: @ 8009FDC
- push {r4,lr}
- lsls r0, 24
- lsrs r3, r0, 24
- lsls r1, 24
- lsrs r2, r1, 24
- ldr r1, _0800A008
- ldr r4, _0800A00C
- adds r0, r4, 0
- strh r0, [r1]
- cmp r3, 0x1
- beq _0800A028
- cmp r3, 0x1
- ble _08009FFA
- cmp r3, 0x2
- beq _0800A064
-_08009FFA:
- cmp r2, 0
- beq _0800A002
- cmp r2, 0x1
- beq _0800A018
-_0800A002:
- ldr r1, _0800A010
- ldr r2, _0800A014
- b _0800A0A8
- .align 2, 0
-_0800A008: .4byte REG_WIN0H
-_0800A00C: .4byte 0x000009e7
-_0800A010: .4byte REG_WIN0V
-_0800A014: .4byte 0x0000011f
-_0800A018:
- ldr r1, _0800A020
- ldr r4, _0800A024
- adds r0, r4, 0
- b _0800A0AA
- .align 2, 0
-_0800A020: .4byte REG_WIN0V
-_0800A024: .4byte 0x0000213f
-_0800A028:
- cmp r2, 0x1
- beq _0800A044
- cmp r2, 0x1
- ble _0800A034
- cmp r2, 0x2
- beq _0800A054
-_0800A034:
- ldr r1, _0800A03C
- ldr r2, _0800A040
- b _0800A0A8
- .align 2, 0
-_0800A03C: .4byte REG_WIN0V
-_0800A040: .4byte 0x0000013f
-_0800A044:
- ldr r1, _0800A04C
- ldr r4, _0800A050
- adds r0, r4, 0
- b _0800A0AA
- .align 2, 0
-_0800A04C: .4byte REG_WIN0V
-_0800A050: .4byte 0x0000415f
-_0800A054:
- ldr r1, _0800A05C
- ldr r2, _0800A060
- b _0800A0A8
- .align 2, 0
-_0800A05C: .4byte REG_WIN0V
-_0800A060: .4byte 0x0000617f
-_0800A064:
- cmp r2, 0x1
- beq _0800A084
- cmp r2, 0x1
- ble _0800A074
- cmp r2, 0x2
- beq _0800A094
- cmp r2, 0x3
- beq _0800A0A4
-_0800A074:
- ldr r1, _0800A07C
- ldr r4, _0800A080
- adds r0, r4, 0
- b _0800A0AA
- .align 2, 0
-_0800A07C: .4byte REG_WIN0V
-_0800A080: .4byte 0x0000013f
-_0800A084:
- ldr r1, _0800A08C
- ldr r2, _0800A090
- b _0800A0A8
- .align 2, 0
-_0800A08C: .4byte REG_WIN0V
-_0800A090: .4byte 0x0000415f
-_0800A094:
- ldr r1, _0800A09C
- ldr r4, _0800A0A0
- adds r0, r4, 0
- b _0800A0AA
- .align 2, 0
-_0800A09C: .4byte REG_WIN0V
-_0800A0A0: .4byte 0x0000617f
-_0800A0A4:
- ldr r1, _0800A0B4
- ldr r2, _0800A0B8
-_0800A0A8:
- adds r0, r2, 0
-_0800A0AA:
- strh r0, [r1]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0800A0B4: .4byte REG_WIN0V
-_0800A0B8: .4byte 0x0000819f
- thumb_func_end HighlightCurrentMenuItem
-
- thumb_func_start PrintMainMenuItem
-PrintMainMenuItem: @ 800A0BC
- push {r4-r6,lr}
- sub sp, 0x20
- adds r4, r0, 0
- lsls r1, 24
- lsrs r5, r1, 24
- lsls r2, 24
- lsrs r2, 24
- mov r1, sp
- movs r0, 0xFC
- strb r0, [r1]
- movs r0, 0x1
- strb r0, [r1, 0x1]
- movs r0, 0xE
- strb r0, [r1, 0x2]
- movs r3, 0
-_0800A0DA:
- adds r0, r3, 0x3
- mov r6, sp
- adds r1, r6, r0
- adds r0, r4, r3
- ldrb r0, [r0]
- strb r0, [r1]
- adds r0, r3, 0x1
- lsls r0, 24
- lsrs r3, r0, 24
- cmp r3, 0x19
- bls _0800A0DA
- mov r1, sp
- movs r0, 0xFF
- strb r0, [r1, 0x1D]
- mov r0, sp
- adds r1, r5, 0
- bl Print
- add sp, 0x20
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end PrintMainMenuItem
-
- thumb_func_start PrintSaveFileInfo
-PrintSaveFileInfo: @ 800A108
- push {lr}
- bl PrintPlayerName
- bl PrintPokedexCount
- bl PrintPlayTime
- bl PrintBadgeCount
- pop {r0}
- bx r0
- thumb_func_end PrintSaveFileInfo
-
- thumb_func_start PrintPlayerName
-PrintPlayerName: @ 800A120
- push {lr}
- ldr r0, _0800A13C
- movs r1, 0x2
- movs r2, 0x3
- bl Print
- ldr r0, _0800A140
- movs r1, 0x9
- movs r2, 0x3
- bl Print
- pop {r0}
- bx r0
- .align 2, 0
-_0800A13C: .4byte gUnknown_0840DF7C
-_0800A140: .4byte gSaveBlock2
- thumb_func_end PrintPlayerName
-
- thumb_func_start PrintPlayTime
-PrintPlayTime: @ 800A144
- push {r4,lr}
- sub sp, 0x30
- ldr r0, _0800A180
- movs r1, 0x10
- movs r2, 0x3
- bl Print
- ldr r0, _0800A184
- ldrh r1, [r0, 0xE]
- ldrb r2, [r0, 0x10]
- mov r0, sp
- movs r3, 0x1
- bl FormatPlayTime
- add r4, sp, 0x10
- adds r0, r4, 0
- mov r1, sp
- movs r2, 0x30
- movs r3, 0x1
- bl sub_8072C74
- adds r0, r4, 0
- movs r1, 0x16
- movs r2, 0x3
- bl Print
- add sp, 0x30
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0800A180: .4byte gUnknown_0840DF8B
-_0800A184: .4byte gSaveBlock2
- thumb_func_end PrintPlayTime
-
- thumb_func_start PrintPokedexCount
-PrintPokedexCount: @ 800A188
- push {lr}
- sub sp, 0x10
- ldr r0, _0800A1BC
- movs r1, 0x2
- movs r2, 0x5
- bl Print
- bl GetPokedexSeenCount
- adds r1, r0, 0
- lsls r1, 16
- lsrs r1, 16
- mov r0, sp
- movs r2, 0x12
- movs r3, 0
- bl sub_8072C14
- mov r0, sp
- movs r1, 0x9
- movs r2, 0x5
- bl Print
- add sp, 0x10
- pop {r0}
- bx r0
- .align 2, 0
-_0800A1BC: .4byte gUnknown_0840DF83
- thumb_func_end PrintPokedexCount
-
- thumb_func_start PrintBadgeCount
-PrintBadgeCount: @ 800A1C0
- push {lr}
- sub sp, 0x10
- ldr r0, _0800A1F0
- movs r1, 0x10
- movs r2, 0x5
- bl Print
- bl GetBadgeCount
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- mov r0, sp
- bl ConvertIntToDecimalString
- mov r0, sp
- movs r1, 0xCD
- movs r2, 0x28
- movs r3, 0x1
- bl sub_80729D8
- add sp, 0x10
- pop {r0}
- bx r0
- .align 2, 0
-_0800A1F0: .4byte gUnknown_0840DF90
- thumb_func_end PrintBadgeCount
-
thumb_func_start Task_Birch1
Task_Birch1: @ 800A1F4
push {r4,r5,lr}
diff --git a/asm/rom5.s b/asm/rom5.s
index f7fcad083..573d4e7ca 100644
--- a/asm/rom5.s
+++ b/asm/rom5.s
@@ -411385,7 +411385,7 @@ _081433CC: .4byte gUnknown_0840E559
_081433D0: .4byte gSaveBlock2
_081433D4: .4byte gUnknown_0840E560
_081433D8: .4byte 0x020231cc
-_081433DC: .4byte gUnknown_0840DF8B
+_081433DC: .4byte gMainMenuString_Time
thumb_func_end sub_8143300
thumb_func_start sub_81433E0
diff --git a/data/data2.s b/data/data2.s
index 191542eed..3da8512eb 100644
--- a/data/data2.s
+++ b/data/data2.s
@@ -27,7 +27,7 @@ gUnknown_081E796C:: @ 81E796C
.space 16
.align 2
-gUnknown_081E797C:: @ 81E797C
+gMainMenuPalette:: @ 81E797C
.incbin "graphics/misc/main_menu.gbapal"
.align 2
@@ -28868,60 +28868,52 @@ gUnknown_0840DCC8:: @ 840DCC8
SystemText_Pokemon2:
.string "POKéMON$"
-gUnknown_0840DCD0:: @ 840DCD0
-SystemText_NewGame:
+gMainMenuString_NewGame:: @ 840DCD0
.string "NEW GAME$"
-gUnknown_0840DCD9:: @ 840DCD9
-SystemText_Continue:
+gMainMenuString_Continue:: @ 840DCD9
.string "CONTINUE$"
-gUnknown_0840DCE2:: @ 840DCE2
-SystemText_Option2:
+gMainMenuString_Option:: @ 840DCE2
.string "OPTION$"
-gUnknown_0840DCE9:: @ 840DCE9
-SystemText_MysteryEvents:
+gMainMenuString_MysteryEvents:: @ 840DCE9
.string "MYSTERY EVENTS$"
+
SystemText_UpdatingSaveExternal:
.string "Updating save file using external\ndata. Please wait.$"
+
SystemText_SaveUpdated:
.string "The save file has been updated.$"
+
SystemText_SaveUpdatedExchangeBackup:
.string "The save file has been updated.\pFurther game data cannot be saved\nto the backup memory.\pPlease exchange the backup memory.\pFor details, please contact the\nNintendo Service Center.$"
+
SystemText_SaveNotUpdated:
.string "The save file could not be updated.\pPlease exchange the backup\nmemory.\pFor details, please contact the\nNintendo Service Center.$"
-gUnknown_0840DE81:: @ 840DE81
-SystemText_SaveCorrupt:
+gSaveFileCorruptMessage:: @ 840DE81
.string "The save file is corrupt. The\nprevious save file will be loaded.$"
-gUnknown_0840DEC2:: @ 840DEC2
-SystemText_SaveDeleted:
+gSaveFileDeletedMessage:: @ 840DEC2
.string " The save file has been deleted...$"
-gUnknown_0840DEE5:: @ 840DEE5
-SystemText_1MSubCircuitNotInstalled:
+gBoardNotInstalledMessage:: @ 840DEE5
.string "The 1M sub-circuit board is\nnot installed.$"
-gUnknown_0840DF10:: @ 840DF10
-SystemText_InternalBatteryIsDry:
+gBatteryDryMessage:: @ 840DF10
.string "The internal battery has run dry.\nThe game can be played.\pHowever, clock-based events will\nno longer occur.$"
-gUnknown_0840DF7C:: @ 840DF7C
-SystemText_Player2::
+gMainMenuString_Player:: @ 840DF7C
.string "PLAYER$"
-gUnknown_0840DF83:: @ 840DF83
-SystemText_Pokedex2::
+gMainMenuString_Pokedex:: @ 840DF83
.string "POKéDEX$"
-gUnknown_0840DF8B:: @ 840DF8B
-SystemText_Time::
+gMainMenuString_Time:: @ 840DF8B
.string "TIME$"
-gUnknown_0840DF90:: @ 840DF90
-SystemText_Badges::
+gMainMenuString_Badges:: @ 840DF90
.string "BADGES$"
gBirchText_Boy::
diff --git a/iwram_syms.txt b/iwram_syms.txt
index 954308adb..a151b6eee 100644
--- a/iwram_syms.txt
+++ b/iwram_syms.txt
@@ -16,4 +16,6 @@ word_3004858 = 0x3004858;
gTasks = 0x3004B20;
+gSaveFileStatus = 0x3005EB8;
+
gMPlayMemAccArea = 0x3007440;
diff --git a/ld_script.txt b/ld_script.txt
index fbd9bafbb..2c7565e80 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -69,6 +69,7 @@ SECTIONS {
src/string_util.o(.text);
src/link.o(.text);
src/rtc.o(.text);
+ src/main_menu.o(.text);
asm/rom3.o(.text);
src/rng.o(.text);
asm/rom_8040EB4.o(.text);
diff --git a/src/main_menu.c b/src/main_menu.c
new file mode 100644
index 000000000..d6f62bac8
--- /dev/null
+++ b/src/main_menu.c
@@ -0,0 +1,605 @@
+#include "global.h"
+#include "text.h"
+#include "sprite.h"
+#include "task.h"
+#include "main.h"
+#include "rtc.h"
+#include "songs.h"
+#include "palette.h"
+
+extern u8 sub_8072080(void);
+extern void Print(u8 *, u8, u8);
+extern void CB2_ContinueSavedGame(void);
+extern void CB2_InitMysteryEventMenu(void);
+extern void CB2_InitOptionMenu(void);
+extern void CB2_InitTitleScreen(void);
+extern void FormatPlayTime(u8 *str, u16 hours, u16 minutes, bool16 colon);
+extern u8 *sub_8072C74(u8 *, u8 *, u8, u8);
+extern u16 GetPokedexSeenCount(void);
+extern u8 *sub_8072C14(u8 *, s32, u8, u8);
+extern u8 sub_80729D8(u8 *, u8, u16, u8);
+extern u8 GetBadgeCount(void);
+extern void Task_Birch1(u8);
+
+extern struct PaletteFadeControl gPaletteFade;
+extern u8 gSaveFileDeletedMessage[];
+extern u8 gSaveFileCorruptMessage[];
+extern u8 gBoardNotInstalledMessage[];
+extern u8 gBatteryDryMessage[];
+extern u16 gSaveFileStatus;
+extern u8 gMainMenuString_Continue[];
+extern u8 gMainMenuString_NewGame[];
+extern u8 gMainMenuString_MysteryEvents[];
+extern u8 gMainMenuString_Option[];
+extern u8 gMainMenuString_Player[];
+extern u8 gMainMenuString_Time[];
+extern u8 gMainMenuString_Pokedex[];
+extern u8 gMainMenuString_Badges[];
+
+void CB2_MainMenu(void);
+void VBlankCB_MainMenu(void);
+void CB2_InitMainMenu(void);
+static void sub_80096FC(void);
+static u32 InitMainMenu(bool8 a1);
+static void Task_CheckSave(u8 taskId);
+static void Task_WaitForSaveErrorAck(u8 taskId);
+static void Task_CheckRtc(u8 taskId);
+static void Task_WaitForRtcErrorAck(u8 taskId);
+static void Task_DrawMainMenu(u8 taskId);
+static void Task_HighlightCurrentMenuItem(u8 taskId);
+static bool8 MainMenuProcessKeyInput(u8 taskId);
+static void Task_MainMenuProcessKeyInput(u8 taskId);
+static void MainMenuPressedA(u8 taskId);
+static void MainMenuPressedB(u8 taskId);
+static void HighlightCurrentMenuItem(u8, u8);
+static void PrintMainMenuItem(u8 *text, u8, u8);
+static void PrintSaveFileInfo(void);
+static void PrintPlayerName(void);
+static void PrintPlayTime(void);
+static void PrintPokedexCount(void);
+static void PrintBadgeCount(void);
+
+extern u16 gMainMenuPalette[];
+
+void CB2_MainMenu(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void VBlankCB_MainMenu(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void CB2_InitMainMenu(void)
+{
+ InitMainMenu(FALSE);
+}
+
+static void sub_80096FC(void)
+{
+ InitMainMenu(TRUE);
+}
+
+u32 InitMainMenu(u8 a1)
+{
+ u16 savedIme;
+ u8 taskId;
+
+ SetVBlankCallback(NULL);
+
+ REG_DISPCNT = 0;
+ REG_BG2CNT = 0;
+ REG_BG1CNT = 0;
+ REG_BG0CNT = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+
+ DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, (void *)OAM, OAM_SIZE);
+ DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2);
+
+ ResetPaletteFade();
+ LoadPalette(gMainMenuPalette, 0, 32);
+ remove_some_task();
+ ResetTasks();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ SetUpWindowConfig(&gWindowConfig_81E6C3C);
+ sub_8071C4C(&gWindowConfig_81E6CE4);
+
+ if (a1)
+ BeginNormalPaletteFade(-1, 0, 0x10u, 0, 0);
+ else
+ BeginNormalPaletteFade(-1, 0, 0x10u, 0, -1);
+
+ REG_WIN0H = 0;
+ REG_WIN0V = 0;
+ REG_WININ = 0;
+ REG_WINOUT = 0;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0;
+
+ savedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = savedIme;
+
+ SetVBlankCallback(VBlankCB_MainMenu);
+ SetMainCallback2(CB2_MainMenu);
+
+ REG_DISPCNT = DISPCNT_OBJ_1D_MAP
+ | DISPCNT_BG0_ON
+ | DISPCNT_OBJ_ON
+ | DISPCNT_WIN0_ON;
+
+ taskId = CreateTask(Task_CheckSave, 0);
+ gTasks[taskId].data[1] = 0;
+
+ return 0;
+}
+
+void Task_CheckSave(u8 taskId)
+{
+ if (gPaletteFade.active)
+ return;
+
+ REG_WIN0H = 0;
+ REG_WIN0V = 0;
+ REG_WININ = 0x1111;
+ REG_WINOUT = 49;
+ REG_BLDCNT = 241;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 7;
+
+ switch (gSaveFileStatus)
+ {
+ case 1:
+ if (sub_806918C() == TRUE)
+ gTasks[taskId].data[0] = 2;
+ else
+ gTasks[taskId].data[0] = 1;
+
+ gTasks[taskId].func = Task_CheckRtc;
+ break;
+ case 2:
+ DrawDefaultWindow(2, 14, 27, 19);
+ AddTextPrinterWithCallbackForMessage(gSaveFileDeletedMessage, 3, 15);
+ REG_WIN0H = 4575;
+ REG_WIN0V = 29087;
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = Task_WaitForSaveErrorAck;
+ break;
+ case 255:
+ DrawDefaultWindow(2, 14, 27, 19);
+ AddTextPrinterWithCallbackForMessage(gSaveFileCorruptMessage, 3, 15);
+ REG_WIN0H = 4575;
+ REG_WIN0V = 29087;
+ gTasks[taskId].data[0] = 1;
+ gTasks[taskId].func = Task_WaitForSaveErrorAck;
+
+ if (sub_806918C() == TRUE)
+ gTasks[taskId].data[0] = 2;
+ else
+ gTasks[taskId].data[0] = 1;
+ break;
+ case 0:
+ default:
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = Task_CheckRtc;
+ break;
+ case 4:
+ DrawDefaultWindow(2, 14, 27, 19);
+ AddTextPrinterWithCallbackForMessage(gBoardNotInstalledMessage, 3, 15);
+ REG_WIN0H = 4575;
+ REG_WIN0V = 29087;
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = Task_WaitForSaveErrorAck;
+ return;
+ }
+}
+
+void Task_WaitForSaveErrorAck(u8 taskId)
+{
+ if (sub_8072080())
+ {
+ if (gMain.newKeys & A_BUTTON)
+ {
+ Reset(2, 14, 27, 19);
+ gTasks[taskId].func = Task_CheckRtc;
+ }
+ }
+}
+
+void Task_CheckRtc(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ REG_WIN0H = 0;
+ REG_WIN0V = 0;
+ REG_WININ = 4369;
+ REG_WINOUT = 49;
+ REG_BLDCNT = 241;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 7;
+
+ if (!(RtcGetErrorStatus() & RTC_ERR_FLAG_MASK))
+ {
+ gTasks[taskId].func = Task_DrawMainMenu;
+ }
+ else
+ {
+ DrawDefaultWindow(2, 14, 27, 19);
+ AddTextPrinterWithCallbackForMessage(gBatteryDryMessage, 3, 15);
+ REG_WIN0H = 4575;
+ REG_WIN0V = 29087;
+ gTasks[taskId].func = Task_WaitForRtcErrorAck;
+ }
+ }
+}
+
+void Task_WaitForRtcErrorAck(u8 taskId)
+{
+ if (sub_8072080())
+ {
+ if ( gMain.newKeys & 1 )
+ {
+ Reset(2, 14, 27, 19);
+ gTasks[taskId].func = Task_DrawMainMenu;
+ }
+ }
+}
+
+void Task_DrawMainMenu(u8 taskId)
+{
+ u16 palette;
+
+ if (!gPaletteFade.active)
+ {
+ REG_WIN0H = 0;
+ REG_WIN0V = 0;
+ REG_WININ = 4369;
+ REG_WINOUT = 49;
+ REG_BLDCNT = 241;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 7;
+
+ palette = RGB(0, 0, 0);
+ LoadPalette(&palette, 254, 2);
+
+ if (gSaveBlock2.playerGender == MALE)
+ {
+ palette = RGB(4, 16, 31);
+ LoadPalette(&palette, 241, 2);
+ }
+ else
+ {
+ palette = RGB(31, 3, 21);
+ LoadPalette(&palette, 241, 2);
+ }
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ default:
+ DrawDefaultWindow(1, 0, 28, 3);
+ PrintMainMenuItem(gMainMenuString_NewGame, 2, 1);
+ DrawDefaultWindow(1, 4, 28, 7);
+ PrintMainMenuItem(gMainMenuString_Option, 2, 5);
+ break;
+ case 1:
+ DrawDefaultWindow(1, 0, 28, 7);
+ PrintMainMenuItem(gMainMenuString_Continue, 2, 1);
+ DrawDefaultWindow(1, 8, 28, 11);
+ PrintMainMenuItem(gMainMenuString_NewGame, 2, 9);
+ DrawDefaultWindow(1, 12, 28, 15);
+ PrintMainMenuItem(gMainMenuString_Option, 2, 13);
+ PrintSaveFileInfo();
+ break;
+ case 2:
+ DrawDefaultWindow(1, 0, 28, 7);
+ PrintMainMenuItem(gMainMenuString_Continue, 2, 1);
+ DrawDefaultWindow(1, 8, 28, 11);
+ PrintMainMenuItem(gMainMenuString_NewGame, 2, 9);
+ DrawDefaultWindow(1, 12, 28, 15);
+ PrintMainMenuItem(gMainMenuString_MysteryEvents, 2, 13);
+ DrawDefaultWindow(1, 16, 28, 19);
+ PrintMainMenuItem(gMainMenuString_Option, 2, 0x11);
+ PrintSaveFileInfo();
+ break;
+ }
+
+ gTasks[taskId].func = Task_HighlightCurrentMenuItem;
+ }
+}
+
+void Task_HighlightCurrentMenuItem(u8 taskId)
+{
+ HighlightCurrentMenuItem(gTasks[taskId].data[0], gTasks[taskId].data[1]);
+ gTasks[taskId].func = Task_MainMenuProcessKeyInput;
+}
+
+bool8 MainMenuProcessKeyInput(u8 taskId)
+{
+ if (gMain.newKeys & A_BUTTON)
+ {
+ audio_play(SE_SELECT);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gTasks[taskId].func = MainMenuPressedA;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ audio_play(SE_SELECT);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0xFFFF);
+ REG_WIN0H = 240;
+ REG_WIN0V = 160;
+ gTasks[taskId].func = MainMenuPressedB;
+ }
+ else
+ {
+ s32 menuItemCount;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ default:
+ menuItemCount = 2;
+ break;
+ case 1:
+ menuItemCount = 3;
+ break;
+ case 2:
+ menuItemCount = 4;
+ break;
+ }
+
+ if (gMain.newKeys & DPAD_UP)
+ {
+ if (gTasks[taskId].data[1] > 0)
+ {
+ gTasks[taskId].data[1]--;
+ return TRUE;
+ }
+ }
+ if (gMain.newKeys & DPAD_DOWN)
+ {
+ if (gTasks[taskId].data[1] < menuItemCount - 1)
+ {
+ gTasks[taskId].data[1]++;
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+void Task_MainMenuProcessKeyInput(u8 taskId)
+{
+ bool8 currentMenuItemChanged = MainMenuProcessKeyInput(taskId);
+ if (currentMenuItemChanged)
+ gTasks[taskId].func = Task_HighlightCurrentMenuItem;
+}
+
+void MainMenuPressedA(u8 taskId)
+{
+ enum
+ {
+ NEW_GAME,
+ CONTINUE,
+ OPTION,
+ MYSTERY_EVENTS,
+ } action;
+
+ if (gPaletteFade.active)
+ return;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ default:
+ switch (gTasks[taskId].data[1])
+ {
+ case 0:
+ default:
+ action = NEW_GAME;
+ break;
+ case 1:
+ action = OPTION;
+ break;
+ }
+ break;
+ case 1:
+ switch (gTasks[taskId].data[1])
+ {
+ case 0:
+ default:
+ action = CONTINUE;
+ break;
+ case 1:
+ action = NEW_GAME;
+ break;
+ case 2:
+ action = OPTION;
+ break;
+ }
+ break;
+ case 2:
+ switch (gTasks[taskId].data[1])
+ {
+ case 0:
+ default:
+ action = CONTINUE;
+ break;
+ case 1:
+ action = NEW_GAME;
+ break;
+ case 2:
+ action = MYSTERY_EVENTS;
+ break;
+ case 3:
+ action = OPTION;
+ break;
+ }
+ break;
+ }
+
+ switch ((int)action)
+ {
+ case 0:
+ default:
+ gPlttBufferUnfaded[0] = 0;
+ gPlttBufferFaded[0] = 0;
+ gTasks[taskId].func = Task_Birch1;
+ break;
+ case 1:
+ gPlttBufferUnfaded[0] = 0;
+ gPlttBufferFaded[0] = 0;
+ SetMainCallback2(CB2_ContinueSavedGame);
+ DestroyTask(taskId);
+ break;
+ case 2:
+ gMain.field_8 = (u32)sub_80096FC;
+ SetMainCallback2(CB2_InitOptionMenu);
+ DestroyTask(taskId);
+ break;
+ case 3:
+ SetMainCallback2(CB2_InitMysteryEventMenu);
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void MainMenuPressedB(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(CB2_InitTitleScreen);
+ DestroyTask(taskId);
+ }
+}
+
+void HighlightCurrentMenuItem(u8 layout, u8 menuItem)
+{
+ REG_WIN0H = 2535;
+
+ switch (layout)
+ {
+ case 0:
+ default:
+ switch (menuItem)
+ {
+ case 0:
+ default:
+ REG_WIN0V = 287;
+ break;
+ case 1:
+ REG_WIN0V = 8511;
+ break;
+ }
+ break;
+ case 1:
+ switch (menuItem)
+ {
+ case 0:
+ default:
+ REG_WIN0V = 319;
+ break;
+ case 1:
+ REG_WIN0V = 16735;
+ break;
+ case 2:
+ REG_WIN0V = 24959;
+ break;
+ }
+ break;
+ case 2:
+ switch (menuItem)
+ {
+ case 0:
+ default:
+ REG_WIN0V = 319;
+ break;
+ case 1:
+ REG_WIN0V = 16735;
+ break;
+ case 2:
+ REG_WIN0V = 24959;
+ break;
+ case 3:
+ REG_WIN0V = 33183;
+ break;
+ }
+ break;
+ }
+}
+
+void PrintMainMenuItem(u8 *text, u8 left, u8 top)
+{
+ u8 i;
+ u8 buffer[32];
+
+ buffer[0] = 0xFC;
+ buffer[1] = 1;
+ buffer[2] = 14;
+
+ for (i = 0; i < 26; i++)
+ buffer[3 + i] = text[i];
+
+ buffer[29] = EOS;
+
+ Print(buffer, left, top);
+}
+
+void PrintSaveFileInfo(void)
+{
+ PrintPlayerName();
+ PrintPokedexCount();
+ PrintPlayTime();
+ PrintBadgeCount();
+}
+
+void PrintPlayerName(void)
+{
+ Print(gMainMenuString_Player, 2, 3);
+ Print(gSaveBlock2.playerName, 9, 3);
+}
+
+void PrintPlayTime(void)
+{
+ u8 playTime[16];
+ u8 alignedPlayTime[32];
+
+ Print(gMainMenuString_Time, 16, 3);
+ FormatPlayTime(playTime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1);
+ sub_8072C74(alignedPlayTime, playTime, 48, 1);
+ Print(alignedPlayTime, 22, 3);
+}
+
+void PrintPokedexCount(void)
+{
+ u8 buffer[16];
+
+ Print(gMainMenuString_Pokedex, 2, 5);
+ sub_8072C14(buffer, GetPokedexSeenCount(), 18, 0);
+ Print(buffer, 9, 5);
+}
+
+void PrintBadgeCount(void)
+{
+ u8 buffer[16];
+
+ Print(gMainMenuString_Badges, 16, 5);
+ ConvertIntToDecimalString(buffer, GetBadgeCount());
+ sub_80729D8(buffer, 205, 40, 1);
+}