summaryrefslogtreecommitdiff
path: root/src/engine/save_failed_screen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/save_failed_screen.c')
-rw-r--r--src/engine/save_failed_screen.c213
1 files changed, 20 insertions, 193 deletions
diff --git a/src/engine/save_failed_screen.c b/src/engine/save_failed_screen.c
index 49cf166d4..f57315d09 100644
--- a/src/engine/save_failed_screen.c
+++ b/src/engine/save_failed_screen.c
@@ -26,6 +26,7 @@
static EWRAM_DATA u16 gSaveFailedType = 0;
static EWRAM_DATA u16 gSaveFailedClockInfo[9] = {0};
+extern u32 gUnknown_Debug_03004BD0;
extern u32 gDamagedSaveSectors;
extern u32 gGameContinueCallback;
@@ -61,18 +62,16 @@ static const u8 sClockFrames[8][3] =
static const u8 gSaveFailedClockPal[] = INCBIN_U8("graphics/misc/clock_small.gbapal");
static const u8 gSaveFailedClockGfx[] = INCBIN_U8("graphics/misc/clock_small.4bpp.lz");
-#define static
-
static void VBlankCB(void);
static void CB2_SaveFailedScreen(void);
static void CB2_WipeSave(void);
-/*static*/ void CB2_GameplayCannotBeContinued(void);
+static void CB2_GameplayCannotBeContinued(void);
static void CB2_FadeAndReturnToTitleScreen(void);
static void CB2_ReturnToTitleScreen(void);
static void VBlankCB_UpdateClockGraphics(void);
-static bool8 VerifySectorWipe(u16 sector);
+static bool8 IsSectorNonEmpty(u16 sector);
static bool8 WipeSector(u16 sector);
-/*static*/ bool8 WipeSectors(u32 sectorBits);
+static bool8 WipeSectors(u32 sectorBits);
void DoSaveFailedScreen(u8 saveType)
{
@@ -150,157 +149,17 @@ static void CB2_SaveFailedScreen(void)
}
}
-#if DEBUG
-__attribute__((naked))
-void CB2_WipeSave()
-{
- asm(
- " push {r4, r5, lr}\n"
- " mov r4, #0x0\n"
- " ldr r0, ._20 @ gSaveFailedClockInfo\n"
- " mov r2, #0x1\n"
- " strh r2, [r0]\n"
- " ldr r0, ._20 + 4 @ gUnknown_Debug_03004BD0\n"
- " ldr r0, [r0]\n"
- " ldr r1, ._20 + 8 @ gDamagedSaveSectors\n"
- " cmp r0, #0\n"
- " beq ._12 @cond_branch\n"
- " str r2, [r1]\n"
- "._12:\n"
- " ldr r0, [r1]\n"
- " cmp r0, #0\n"
- " beq ._16 @cond_branch\n"
- " add r5, r1, #0\n"
- "._17:\n"
- " ldr r0, [r5]\n"
- " bl WipeSectors\n"
- " lsl r0, r0, #0x18\n"
- " cmp r0, #0\n"
- " bne ._14 @cond_branch\n"
- " mov r0, #0x1\n"
- " mov r1, #0xa\n"
- " mov r2, #0x1c\n"
- " mov r3, #0x13\n"
- " bl Menu_DrawStdWindowFrame\n"
- " ldr r0, ._20 + 12 @ gSystemText_CheckCompleteSaveAttempt\n"
- " mov r1, #0x2\n"
- " mov r2, #0xb\n"
- " bl Menu_PrintText\n"
- " ldr r0, ._20 + 16 @ gSaveFailedType\n"
- " ldrb r0, [r0]\n"
- " bl Save_WriteDataInternal\n"
- " ldr r0, [r5]\n"
- " cmp r0, #0\n"
- " beq ._15 @cond_branch\n"
- " mov r0, #0x1\n"
- " mov r1, #0xa\n"
- " mov r2, #0x1c\n"
- " mov r3, #0x13\n"
- " bl Menu_DrawStdWindowFrame\n"
- " ldr r0, ._20 + 20 @ gSystemText_SaveFailedBackupCheck\n"
- " mov r1, #0x2\n"
- " mov r2, #0xb\n"
- " bl Menu_PrintText\n"
- "._15:\n"
- " add r0, r4, #1\n"
- " lsl r0, r0, #0x18\n"
- " lsr r4, r0, #0x18\n"
- " ldr r0, [r5]\n"
- " cmp r0, #0\n"
- " beq ._16 @cond_branch\n"
- " cmp r4, #0x2\n"
- " bls ._17 @cond_branch\n"
- "._16:\n"
- " cmp r4, #0x3\n"
- " bne ._18 @cond_branch\n"
- " mov r0, #0x1\n"
- " mov r1, #0xa\n"
- " mov r2, #0x1c\n"
- " mov r3, #0x13\n"
- " bl Menu_DrawStdWindowFrame\n"
- " ldr r0, ._20 + 24 @ gSystemText_BackupDamagedGameContinue\n"
- " mov r1, #0x2\n"
- " mov r2, #0xb\n"
- " bl Menu_PrintText\n"
- " ldr r0, ._20 + 28 @ CB2_FadeAndReturnToTitleScreen\n"
- " bl SetMainCallback2\n"
- " b ._23\n"
- "._21:\n"
- " .align 2, 0\n"
- "._20:\n"
- " .word gSaveFailedClockInfo\n"
- " .word gUnknown_Debug_03004BD0\n"
- " .word gDamagedSaveSectors\n"
- " .word gSystemText_CheckCompleteSaveAttempt\n"
- " .word gSaveFailedType\n"
- " .word gSystemText_SaveFailedBackupCheck\n"
- " .word gSystemText_BackupDamagedGameContinue\n"
- " .word CB2_FadeAndReturnToTitleScreen+1\n"
- "._18:\n"
- " mov r0, #0x1\n"
- " mov r1, #0xa\n"
- " mov r2, #0x1c\n"
- " mov r3, #0x13\n"
- " bl Menu_DrawStdWindowFrame\n"
- " ldr r0, ._24 @ gGameContinueCallback\n"
- " ldr r0, [r0]\n"
- " cmp r0, #0\n"
- " bne ._22 @cond_branch\n"
- " ldr r0, ._24 + 4 @ gSystemText_SaveCompletedGameEnd\n"
- " mov r1, #0x2\n"
- " mov r2, #0xb\n"
- " bl Menu_PrintText\n"
- " b ._23\n"
- "._25:\n"
- " .align 2, 0\n"
- "._24:\n"
- " .word gGameContinueCallback\n"
- " .word gSystemText_SaveCompletedGameEnd\n"
- "._14:\n"
- " mov r0, #0x1\n"
- " mov r1, #0xa\n"
- " mov r2, #0x1c\n"
- " mov r3, #0x13\n"
- " bl Menu_DrawStdWindowFrame\n"
- " ldr r0, ._27 @ gSystemText_BackupDamagedGameContinue\n"
- " mov r1, #0x2\n"
- " mov r2, #0xb\n"
- " bl Menu_PrintText\n"
- " ldr r0, ._27 + 4 @ CB2_GameplayCannotBeContinued\n"
- " bl SetMainCallback2\n"
- " b ._26\n"
- "._28:\n"
- " .align 2, 0\n"
- "._27:\n"
- " .word gSystemText_BackupDamagedGameContinue\n"
- " .word CB2_GameplayCannotBeContinued+1\n"
- "._22:\n"
- " ldr r0, ._29 @ gSystemText_SaveCompletedPressA\n"
- " mov r1, #0x2\n"
- " mov r2, #0xb\n"
- " bl Menu_PrintText\n"
- "._23:\n"
- " ldr r0, ._29 + 4 @ CB2_FadeAndReturnToTitleScreen\n"
- " bl SetMainCallback2\n"
- "._26:\n"
- " pop {r4, r5}\n"
- " pop {r0}\n"
- " bx r0\n"
- "._30:\n"
- " .align 2, 0\n"
- "._29:\n"
- " .word gSystemText_SaveCompletedPressA\n"
- " .word CB2_FadeAndReturnToTitleScreen+1\n"
- "\n"
- );
-}
-#else
static void CB2_WipeSave(void)
{
u8 wipeTries = 0;
gSaveFailedClockInfo[0] = TRUE;
+#if DEBUG
+ if (gUnknown_Debug_03004BD0 != 0)
+ gDamagedSaveSectors = 1;
+#endif
+
while (gDamagedSaveSectors != 0 && wipeTries < 3) // while there are still attempts left, keep trying to fix the save sectors.
{
if (WipeSectors(gDamagedSaveSectors) != FALSE)
@@ -345,9 +204,8 @@ static void CB2_WipeSave(void)
SetMainCallback2(CB2_FadeAndReturnToTitleScreen);
}
-#endif
-/*static*/ void CB2_GameplayCannotBeContinued(void)
+static void CB2_GameplayCannotBeContinued(void)
{
gSaveFailedClockInfo[0] = FALSE;
@@ -412,55 +270,24 @@ static void VBlankCB_UpdateClockGraphics(void)
gSaveFailedClockInfo[1]--;
}
-#if DEBUG
-__attribute__((naked))
-bool8 VerifySectorWipe(u16 sector)
-{
- asm(
- " push {lr}\n"
- " lsl r0, r0, #0x10\n"
- " lsr r0, r0, #0x10\n"
- " ldr r2, ._50 @ \n"
- " mov r3, #0x80\n"
- " lsl r3, r3, #0x5\n"
- " mov r1, #0x0\n"
- " bl ReadFlash\n"
- " mov r0, #0x0\n"
- " ldr r1, ._50 + 4 @ \n"
- "._49:\n"
- " add r0, r0, #0x1\n"
- " lsl r0, r0, #0x10\n"
- " lsr r0, r0, #0x10\n"
- " cmp r0, r1\n"
- " bls ._49 @cond_branch\n"
- " ldr r0, ._50 + 8 @ \n"
- " ldrb r0, [r0]\n"
- " pop {r1}\n"
- " bx r1\n"
- "._51:\n"
- " .align 2, 0\n"
- "._50:\n"
- " .word +0x2000000\n"
- " .word 0x3ff\n"
- " .word gUnknown_Debug_03004BD0\n"
- "\n"
- );
-}
-#else
-static bool8 VerifySectorWipe(u16 sector)
+static bool8 IsSectorNonEmpty(u16 sector)
{
u32 *ptr = (u32 *)&gSharedMem;
u16 i;
ReadFlash(sector, 0, ptr, 4096);
+#if DEBUG // Don't verify the sector wipe?
for (i = 0; i < 0x400; i++, ptr++)
- if (*ptr)
+ ;
+ return gUnknown_Debug_03004BD0;
+#else
+ for (i = 0; i < 0x400; i++, ptr++)
+ if (*ptr != 0)
return TRUE;
-
return FALSE;
-}
#endif
+}
static bool8 WipeSector(u16 sector)
{
@@ -472,13 +299,13 @@ static bool8 WipeSector(u16 sector)
for (j = 0; j < 0x1000; j++)
ProgramFlashByte(sector, j, 0);
- failed = VerifySectorWipe(sector);
+ failed = IsSectorNonEmpty(sector);
}
return failed;
}
-/*static*/ bool8 WipeSectors(u32 sectorBits)
+static bool8 WipeSectors(u32 sectorBits)
{
u16 i;