summaryrefslogtreecommitdiff
path: root/arm9/src
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/src')
-rw-r--r--arm9/src/GX_layers.c2
-rw-r--r--arm9/src/communication_error.c2
-rw-r--r--arm9/src/error_message_reset.c2
-rw-r--r--arm9/src/game_init.c2
-rw-r--r--arm9/src/main.c4
-rw-r--r--arm9/src/save.c14
-rw-r--r--arm9/src/save_data_read_error.c186
-rw-r--r--arm9/src/save_data_write_error.c131
-rw-r--r--arm9/src/wfc_user_info_warning.c2
9 files changed, 329 insertions, 16 deletions
diff --git a/arm9/src/GX_layers.c b/arm9/src/GX_layers.c
index 28147dbd..348a398a 100644
--- a/arm9/src/GX_layers.c
+++ b/arm9/src/GX_layers.c
@@ -96,7 +96,7 @@ THUMB_FUNC void GX_BothDispOn()
THUMB_FUNC void GX_SwapDisplay()
{
- if (gMain.unk65 == 0)
+ if (gMain.screensFlipped == 0)
{
GX_SetDispSelect(GX_DISP_SELECT_MAIN_SUB);
}
diff --git a/arm9/src/communication_error.c b/arm9/src/communication_error.c
index 4401d9b8..04058b83 100644
--- a/arm9/src/communication_error.c
+++ b/arm9/src/communication_error.c
@@ -107,7 +107,7 @@ THUMB_FUNC void ShowCommunicationError(u32 heap_id, u32 error, u32 error_code)
SetKeyRepeatTimers(4, 8);
- gMain.unk65 = 0;
+ gMain.screensFlipped = 0;
GX_SwapDisplay();
reg_G2_BLDCNT = 0;
diff --git a/arm9/src/error_message_reset.c b/arm9/src/error_message_reset.c
index 93bc898d..97bc7c70 100644
--- a/arm9/src/error_message_reset.c
+++ b/arm9/src/error_message_reset.c
@@ -85,7 +85,7 @@ THUMB_FUNC void PrintErrorMessageAndReset()
SetKeyRepeatTimers(4, 8);
- gMain.unk65 = 0;
+ gMain.screensFlipped = 0;
GX_SwapDisplay();
G2_BlendNone();
diff --git a/arm9/src/game_init.c b/arm9/src/game_init.c
index 44dcc111..705ffbc9 100644
--- a/arm9/src/game_init.c
+++ b/arm9/src/game_init.c
@@ -163,7 +163,7 @@ void InitSystemForTheGame(void)
gMain.unk10 = 0;
gMain.unk14 = 0;
gMain.unk2C = 0;
- gMain.unk65 = 0;
+ gMain.screensFlipped = 0;
}
void InitGraphicMemory(void)
diff --git a/arm9/src/main.c b/arm9/src/main.c
index 312d222c..3b3b0dd6 100644
--- a/arm9/src/main.c
+++ b/arm9/src/main.c
@@ -11,6 +11,7 @@
#include "game_init.h"
#include "poke_overlay.h"
#include "player_data.h"
+#include "save_data_read_error.h"
#include "sound.h"
#include "timer3.h"
#include "unk_02031734.h"
@@ -32,7 +33,6 @@ struct UnkStruct_02016FA8 UNK_02016FA8;
extern void FUN_02022294(void);
extern void GF_InitRTCWork(void);
extern int FUN_020337E8(int);
-extern void FUN_02089D90(int);
extern void FUN_02015E30(void);
extern void FUN_0201B5CC(void *);
extern void GF_RTC_UpdateOnFrame(void);
@@ -72,7 +72,7 @@ THUMB_FUNC void NitroMain(void)
ShowWFCUserInfoWarning(3, 0);
if (FUN_020227FC(UNK_02016FA8.unk18) == 0)
{
- FUN_02089D90(0);
+ ShowSaveDataReadError(0);
}
else
{
diff --git a/arm9/src/save.c b/arm9/src/save.c
index 7eb523f6..524edfb7 100644
--- a/arm9/src/save.c
+++ b/arm9/src/save.c
@@ -4,6 +4,8 @@
#include "heap.h"
#include "CARD_backup.h"
#include "OS_spinLock.h"
+#include "save_data_read_error.h"
+#include "save_data_write_error.h"
#pragma thumb on
@@ -13,12 +15,6 @@
extern void FUN_02016444(u8 mask);
extern void FUN_02016454(u8 mask);
-// unk_02089D90.s
-extern void FUN_02089D90(int);
-
-// unk_02089F24.s
-extern void FUN_0208A0B8(int, int);
-
struct {
struct SaveBlock2 * ptr;
BOOL iswritten;
@@ -861,7 +857,7 @@ BOOL FlashLoadChunk(u32 src, void * dest, u32 size)
if (!r5)
{
FreeToHeap(UNK_021C59C8.ptr);
- FUN_02089D90(1);
+ ShowSaveDataReadError(1);
}
return r5;
}
@@ -910,10 +906,10 @@ BOOL WaitFlashWrite(int lock, BOOL * res)
return FALSE;
}
-void SaveErrorHandling(int lock, int errno)
+void SaveErrorHandling(int lock, u32 errno)
{
CARD_UnlockBackup((u16)lock);
OS_ReleaseLockID((u16)lock);
FreeToHeap(UNK_021C59C8.ptr);
- FUN_0208A0B8(1, errno);
+ ShowSaveDataWriteError(1, errno);
}
diff --git a/arm9/src/save_data_read_error.c b/arm9/src/save_data_read_error.c
new file mode 100644
index 00000000..9524475c
--- /dev/null
+++ b/arm9/src/save_data_read_error.c
@@ -0,0 +1,186 @@
+#include "global.h"
+#include "bg_window.h"
+#include "brightness.h"
+#include "game_init.h"
+#include "msgdata.h"
+#include "msgdata/msg.naix"
+#include "save_data_read_error.h"
+#include "text.h"
+
+extern void FUN_02002ED0(enum GFBgLayer layer, u32 base_addr, u32 heap_id);
+extern void FUN_0200CB00(struct BgConfig* bg_config, enum GFBgLayer layer, u32 num_tiles, u32, u8, u32 heap_id);
+extern void FUN_0200CCA4(struct Window* window, BOOL copy_to_vram, u16 fill_value, u32 palette_num);
+extern void FUN_0200E394(BOOL set_brightness_on_bottom_screen);
+extern void FUN_0200E3A0(BOOL set_brightness_on_bottom_screen, s32);
+
+static const struct WindowTemplate sSaveDataReadErrorWindowTemplate = {
+ .bgId = GF_BG_LYR_MAIN_0,
+ .tilemapLeft = 3,
+ .tilemapTop = 3,
+ .width = 26,
+ .height = 18,
+ .paletteNum = 0x01,
+ .baseTile = 0x23,
+};
+
+static const struct GraphicsModes sSaveDataReadErrorGraphicsModes = {
+ .dispMode = GX_DISPMODE_GRAPHICS,
+ .bgMode = GX_BGMODE_0,
+ .subMode = GX_BGMODE_0,
+ ._2d3dMode = GX_BG0_AS_2D,
+};
+
+static const struct BgTemplate sSaveDataReadErrorBgTemplate = {
+ .x = 0,
+ .y = 0,
+ .bufferSize = 0x800,
+ .baseTile = 0,
+ .size = GF_BG_SCR_SIZE_256x256,
+ .colorMode = GX_BG_COLORMODE_16,
+ .screenBase = GX_BG_SCRBASE_0x0000,
+ .charBase = GX_BG_CHARBASE_0x18000,
+ .bgExtPltt = GX_BG_EXTPLTT_01,
+ .priority = 1,
+ .areaOver = GX_BG_AREAOVER_XLU,
+ .unk17 = 0,
+ .mosaic = FALSE,
+};
+
+static const struct GraphicsBanks sSaveDataReadErrorGraphicsBanks = {
+ .bg = 3,
+ .bgextpltt = 0,
+ .subbg = 0,
+ .subbgextpltt = 0,
+ .obj = 0,
+ .objextpltt = 0,
+ .subobj = 0,
+ .subobjextpltt = 0,
+ .tex = 0,
+ .texpltt = 0,
+};
+
+THUMB_FUNC void ShowSaveDataReadError(u32 heap_id)
+{
+ struct Window window;
+
+ FUN_0200E3A0(PM_LCD_TOP, 0);
+ FUN_0200E3A0(PM_LCD_BOTTOM, 0);
+
+ Main_SetVBlankIntrCB(NULL, NULL);
+ FUN_02015F34(NULL, NULL);
+
+ GX_DisableEngineALayers();
+ GX_DisableEngineBLayers();
+ reg_GX_DISPCNT &= ~REG_GX_DISPCNT_DISPLAY_MASK;
+ reg_GXS_DB_DISPCNT &= ~REG_GX_DISPCNT_DISPLAY_MASK;
+
+ SetKeyRepeatTimers(4, 8);
+
+ gMain.screensFlipped = 0;
+
+ GX_SwapDisplay();
+ reg_G2_BLDCNT = 0;
+ reg_G2S_DB_BLDCNT = 0;
+ reg_GX_DISPCNT &= ~(REG_GX_DISPCNT_OW_MASK | REG_GX_DISPCNT_W1_MASK | REG_GX_DISPCNT_W0_MASK);
+ reg_GXS_DB_DISPCNT &= ~(REG_GXS_DB_DISPCNT_OW_MASK | REG_GXS_DB_DISPCNT_W1_MASK | REG_GXS_DB_DISPCNT_W0_MASK);
+ GX_SetBanks(&sSaveDataReadErrorGraphicsBanks);
+
+ struct BgConfig* bg_config = BgConfig_Alloc(heap_id);
+
+ SetBothScreensModesAndDisable(&sSaveDataReadErrorGraphicsModes);
+
+ InitBgFromTemplate(bg_config, 0, &sSaveDataReadErrorBgTemplate, 0);
+ BgClearTilemapBufferAndCommit(bg_config, 0);
+ FUN_0200CB00(bg_config, GF_BG_LYR_MAIN_0, 0x01F7, 2, 0, heap_id);
+ FUN_02002ED0(GF_BG_LYR_MAIN_0, 0x20, heap_id);
+ BG_ClearCharDataRange(GF_BG_LYR_MAIN_0, 0x20, 0, heap_id);
+ BG_SetMaskColor(GF_BG_LYR_MAIN_0, 0x6C21);
+ BG_SetMaskColor(GF_BG_LYR_SUB_0, 0x6C21);
+
+ struct MsgData* msg_data = NewMsgDataFromNarc(1, NARC_MSGDATA_MSG, NARC_msg_narc_0005_bin, heap_id);
+ struct String* str = String_ctor(384, heap_id);
+
+ FUN_0201BD5C();
+
+ AddWindow(bg_config, &window, &sSaveDataReadErrorWindowTemplate);
+ FillWindowPixelRect(&window, 0xF, 0, 0, 208, 144);
+ FUN_0200CCA4(&window, FALSE, 0x01F7, 2);
+
+ ReadMsgDataIntoString(msg_data, 0, str);
+ AddTextPrinterParameterized(&window, 0, str, 0, 0, 0, NULL);
+ String_dtor(str);
+
+ GX_BothDispOn();
+ FUN_0200E394(PM_LCD_TOP);
+ FUN_0200E394(PM_LCD_BOTTOM);
+ SetBrightness(0, 0x3F, 3);
+
+ while (TRUE)
+ {
+ HandleDSLidAction();
+ OS_WaitIrq(TRUE, OS_IE_V_BLANK);
+ }
+}
+
+THUMB_FUNC void ShowGBACartRemovedError(u32 heap_id)
+{
+ struct Window window;
+
+ FUN_0200E3A0(PM_LCD_TOP, 0);
+ FUN_0200E3A0(PM_LCD_BOTTOM, 0);
+
+ Main_SetVBlankIntrCB(NULL, NULL);
+ FUN_02015F34(NULL, NULL);
+
+ GX_DisableEngineALayers();
+ GX_DisableEngineBLayers();
+ reg_GX_DISPCNT &= ~REG_GX_DISPCNT_DISPLAY_MASK;
+ reg_GXS_DB_DISPCNT &= ~REG_GX_DISPCNT_DISPLAY_MASK;
+
+ SetKeyRepeatTimers(4, 8);
+
+ gMain.screensFlipped = 0;
+
+ GX_SwapDisplay();
+ reg_G2_BLDCNT = 0;
+ reg_G2S_DB_BLDCNT = 0;
+ reg_GX_DISPCNT &= ~(REG_GX_DISPCNT_OW_MASK | REG_GX_DISPCNT_W1_MASK | REG_GX_DISPCNT_W0_MASK);
+ reg_GXS_DB_DISPCNT &= ~(REG_GXS_DB_DISPCNT_OW_MASK | REG_GXS_DB_DISPCNT_W1_MASK | REG_GXS_DB_DISPCNT_W0_MASK);
+ GX_SetBanks(&sSaveDataReadErrorGraphicsBanks);
+
+ struct BgConfig* bg_config = BgConfig_Alloc(heap_id);
+
+ SetBothScreensModesAndDisable(&sSaveDataReadErrorGraphicsModes);
+
+ InitBgFromTemplate(bg_config, 0, &sSaveDataReadErrorBgTemplate, 0);
+ BgClearTilemapBufferAndCommit(bg_config, 0);
+ FUN_0200CB00(bg_config, GF_BG_LYR_MAIN_0, 0x01F7, 2, 0, heap_id);
+ FUN_02002ED0(GF_BG_LYR_MAIN_0, 0x20, heap_id);
+ BG_ClearCharDataRange(GF_BG_LYR_MAIN_0, 0x20, 0, heap_id);
+ BG_SetMaskColor(GF_BG_LYR_MAIN_0, 0x6C21);
+ BG_SetMaskColor(GF_BG_LYR_SUB_0, 0x6C21);
+
+ struct MsgData* msg_data = NewMsgDataFromNarc(1, NARC_MSGDATA_MSG, NARC_msg_narc_0005_bin, heap_id);
+ struct String* str = String_ctor(384, heap_id);
+
+ FUN_0201BD5C();
+
+ AddWindow(bg_config, &window, &sSaveDataReadErrorWindowTemplate);
+ FillWindowPixelRect(&window, 0xF, 0, 0, 208, 144);
+ FUN_0200CCA4(&window, FALSE, 0x01F7, 2);
+
+ ReadMsgDataIntoString(msg_data, 1, str);
+ AddTextPrinterParameterized(&window, 0, str, 0, 0, 0, NULL);
+ String_dtor(str);
+
+ GX_BothDispOn();
+ FUN_0200E394(PM_LCD_TOP);
+ FUN_0200E394(PM_LCD_BOTTOM);
+ SetBrightness(0, 0x3F, 3);
+
+ while (TRUE)
+ {
+ HandleDSLidAction();
+ OS_WaitIrq(TRUE, OS_IE_V_BLANK);
+ }
+}
diff --git a/arm9/src/save_data_write_error.c b/arm9/src/save_data_write_error.c
new file mode 100644
index 00000000..71edb91d
--- /dev/null
+++ b/arm9/src/save_data_write_error.c
@@ -0,0 +1,131 @@
+#include "global.h"
+#include "bg_window.h"
+#include "brightness.h"
+#include "game_init.h"
+#include "msgdata.h"
+#include "msgdata/msg.naix"
+#include "save_data_write_error.h"
+#include "text.h"
+
+extern void FUN_02002ED0(enum GFBgLayer layer, u32 base_addr, u32 heap_id);
+extern void FUN_0200CB00(struct BgConfig* bg_config, enum GFBgLayer layer, u32 num_tiles, u32, u8, u32 heap_id);
+extern void FUN_0200CCA4(struct Window* window, BOOL copy_to_vram, u16 fill_value, u32 palette_num);
+extern void FUN_0200E394(BOOL set_brightness_on_bottom_screen);
+extern void FUN_0200E3A0(BOOL set_brightness_on_bottom_screen, s32);
+
+static const struct WindowTemplate sSaveDataWriteErrorWindowTemplate = {
+ .bgId = GF_BG_LYR_MAIN_0,
+ .tilemapLeft = 3,
+ .tilemapTop = 3,
+ .width = 26,
+ .height = 18,
+ .paletteNum = 0x01,
+ .baseTile = 0x23,
+};
+
+static const struct GraphicsModes sSaveDataWriteErrorGraphicsModes = {
+ .dispMode = GX_DISPMODE_GRAPHICS,
+ .bgMode = GX_BGMODE_0,
+ .subMode = GX_BGMODE_0,
+ ._2d3dMode = GX_BG0_AS_2D,
+};
+
+static const struct BgTemplate sSaveDataWriteErrorBgTemplate = {
+ .x = 0,
+ .y = 0,
+ .bufferSize = 0x800,
+ .baseTile = 0,
+ .size = GF_BG_SCR_SIZE_256x256,
+ .colorMode = GX_BG_COLORMODE_16,
+ .screenBase = GX_BG_SCRBASE_0x0000,
+ .charBase = GX_BG_CHARBASE_0x18000,
+ .bgExtPltt = GX_BG_EXTPLTT_01,
+ .priority = 1,
+ .areaOver = GX_BG_AREAOVER_XLU,
+ .unk17 = 0,
+ .mosaic = FALSE,
+};
+
+static const struct GraphicsBanks sSaveDataWriteErrorGraphicsBanks = {
+ .bg = 3,
+ .bgextpltt = 0,
+ .subbg = 0,
+ .subbgextpltt = 0,
+ .obj = 0,
+ .objextpltt = 0,
+ .subobj = 0,
+ .subobjextpltt = 0,
+ .tex = 0,
+ .texpltt = 0,
+};
+
+THUMB_FUNC void ShowSaveDataWriteError(u32 heap_id, u32 err_no)
+{
+ struct Window window;
+
+ u32 msg_no;
+ if (err_no == 0) {
+ msg_no = 1;
+ } else {
+ msg_no = 0;
+ }
+
+ FUN_0200E3A0(PM_LCD_TOP, 0);
+ FUN_0200E3A0(PM_LCD_BOTTOM, 0);
+
+ FUN_02015EF4();
+ Main_SetVBlankIntrCB(NULL, NULL);
+ FUN_02015F34(NULL, NULL);
+
+ GX_DisableEngineALayers();
+ GX_DisableEngineBLayers();
+ reg_GX_DISPCNT &= ~REG_GX_DISPCNT_DISPLAY_MASK;
+ reg_GXS_DB_DISPCNT &= ~REG_GX_DISPCNT_DISPLAY_MASK;
+
+ SetKeyRepeatTimers(4, 8);
+
+ gMain.screensFlipped = 0;
+
+ GX_SwapDisplay();
+ reg_G2_BLDCNT = 0;
+ reg_G2S_DB_BLDCNT = 0;
+ reg_GX_DISPCNT &= ~(REG_GX_DISPCNT_OW_MASK | REG_GX_DISPCNT_W1_MASK | REG_GX_DISPCNT_W0_MASK);
+ reg_GXS_DB_DISPCNT &= ~(REG_GXS_DB_DISPCNT_OW_MASK | REG_GXS_DB_DISPCNT_W1_MASK | REG_GXS_DB_DISPCNT_W0_MASK);
+ GX_SetBanks(&sSaveDataWriteErrorGraphicsBanks);
+
+ struct BgConfig* bg_config = BgConfig_Alloc(heap_id);
+
+ SetBothScreensModesAndDisable(&sSaveDataWriteErrorGraphicsModes);
+
+ InitBgFromTemplate(bg_config, 0, &sSaveDataWriteErrorBgTemplate, 0);
+ BgClearTilemapBufferAndCommit(bg_config, 0);
+ FUN_0200CB00(bg_config, GF_BG_LYR_MAIN_0, 0x01F7, 2, 0, heap_id);
+ FUN_02002ED0(GF_BG_LYR_MAIN_0, 0x20, heap_id);
+ BG_ClearCharDataRange(GF_BG_LYR_MAIN_0, 0x20, 0, heap_id);
+ BG_SetMaskColor(GF_BG_LYR_MAIN_0, 0x6C21);
+ BG_SetMaskColor(GF_BG_LYR_SUB_0, 0x6C21);
+
+ struct MsgData* msg_data = NewMsgDataFromNarc(1, NARC_MSGDATA_MSG, NARC_msg_narc_0006_bin, heap_id);
+ struct String* str = String_ctor(384, heap_id);
+
+ FUN_0201BD5C();
+
+ AddWindow(bg_config, &window, &sSaveDataWriteErrorWindowTemplate);
+ FillWindowPixelRect(&window, 0xF, 0, 0, 208, 144);
+ FUN_0200CCA4(&window, FALSE, 0x01F7, 2);
+
+ ReadMsgDataIntoString(msg_data, msg_no, str);
+ AddTextPrinterParameterized(&window, 0, str, 0, 0, 0, NULL);
+ String_dtor(str);
+
+ GX_BothDispOn();
+ FUN_0200E394(PM_LCD_TOP);
+ FUN_0200E394(PM_LCD_BOTTOM);
+ SetBrightness(0, 0x3F, 3);
+
+ while (TRUE)
+ {
+ HandleDSLidAction();
+ OS_WaitIrq(TRUE, OS_IE_V_BLANK);
+ }
+}
diff --git a/arm9/src/wfc_user_info_warning.c b/arm9/src/wfc_user_info_warning.c
index 370cf314..da547f3d 100644
--- a/arm9/src/wfc_user_info_warning.c
+++ b/arm9/src/wfc_user_info_warning.c
@@ -83,7 +83,7 @@ THUMB_FUNC void ShowWFCUserInfoWarning(u32 heap_id, u32 a1)
SetKeyRepeatTimers(4, 8);
- gMain.unk65 = 0;
+ gMain.screensFlipped = 0;
GX_SwapDisplay();
reg_G2_BLDCNT = 0;