summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortgsm <doodrabbit@hotmail.com>2021-08-20 21:31:50 -0400
committertgsm <doodrabbit@hotmail.com>2021-08-20 21:38:41 -0400
commita09a13e2b35e6ca07ab623464189b8bf602a66a8 (patch)
tree986133c3db8309d93d95145683deb6f187c7c0df
parentc1fe116810ccce4cf5bd1c15559ba1e2ffe57663 (diff)
Decompile unk_02089F24 -> save_data_write_error
-rw-r--r--arm9/arm9.lsf2
-rw-r--r--arm9/asm/unk_02089F24.s362
-rw-r--r--arm9/global.inc4
-rw-r--r--arm9/modules/83/asm/module_83.s4
-rw-r--r--arm9/src/save.c8
-rw-r--r--arm9/src/save_data_write_error.c199
-rw-r--r--include/save_block_2.h2
-rw-r--r--include/save_data_write_error.h7
8 files changed, 215 insertions, 373 deletions
diff --git a/arm9/arm9.lsf b/arm9/arm9.lsf
index 5e9e5ba9..179bf053 100644
--- a/arm9/arm9.lsf
+++ b/arm9/arm9.lsf
@@ -316,7 +316,7 @@ Static arm9
Object unk_02089498.o
Object unk_02089960.o
Object save_data_read_error.o
- Object unk_02089F24.o
+ Object save_data_write_error.o
Object unk_0208A258.o
Object unk_0208A300.o
Object unk_0208A338.o
diff --git a/arm9/asm/unk_02089F24.s b/arm9/asm/unk_02089F24.s
deleted file mode 100644
index dd936ec8..00000000
--- a/arm9/asm/unk_02089F24.s
+++ /dev/null
@@ -1,362 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .extern gMain
- .extern gSaveDataReadErrorWindowTemplate
- .extern gSaveDataReadErrorGraphicsModes
- .extern gSaveDataReadErrorBgTemplate
- .extern gSaveDataReadErrorGraphicsBanks
-
- .section .rodata
-
- .global UNK_020FF440
-UNK_020FF440: ; 0x020FF440
- .byte 0x00, 0x03, 0x03, 0x1A, 0x12, 0x01, 0x23, 0x00
-
- .global UNK_020FF448
-UNK_020FF448: ; 0x020FF448
- .byte 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-
- .global UNK_020FF458
-UNK_020FF458: ; 0x020FF458
- .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- .byte 0x01, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-
- .global UNK_020FF474
-UNK_020FF474: ; 0x020FF474
- .byte 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-
- .text
-
- thumb_func_start FUN_02089F24
-FUN_02089F24: ; 0x02089F24
- push {r3-r6, lr}
- sub sp, #0x1c
- add r4, r0, #0x0
- mov r0, #0x0
- add r1, r0, #0x0
- bl FUN_0200E3A0
- mov r0, #0x1
- mov r1, #0x0
- bl FUN_0200E3A0
- mov r0, #0x0
- add r1, r0, #0x0
- bl Main_SetVBlankIntrCB
- mov r0, #0x0
- add r1, r0, #0x0
- bl FUN_02015F34
- bl GX_DisableEngineALayers
- bl GX_DisableEngineBLayers
- mov r2, #0x1
- lsl r2, r2, #0x1a
- ldr r1, [r2, #0x0]
- ldr r0, _0208A088 ; =0xFFFFE0FF
- and r1, r0
- str r1, [r2, #0x0]
- ldr r2, _0208A08C ; =0x04001000
- ldr r1, [r2, #0x0]
- and r0, r1
- str r0, [r2, #0x0]
- mov r0, #0x4
- mov r1, #0x8
- bl SetKeyRepeatTimers
- ldr r0, _0208A090 ; =gMain + 0x60
- mov r1, #0x0
- strb r1, [r0, #0x5]
- bl GX_SwapDisplay
- ldr r3, _0208A094 ; =0x04000050
- mov r0, #0x0
- strh r0, [r3, #0x0]
- ldr r2, _0208A098 ; =0x04001050
- sub r3, #0x50
- strh r0, [r2, #0x0]
- ldr r1, [r3, #0x0]
- ldr r0, _0208A09C ; =0xFFFF1FFF
- sub r2, #0x50
- and r1, r0
- str r1, [r3, #0x0]
- ldr r1, [r2, #0x0]
- and r0, r1
- str r0, [r2, #0x0]
- ldr r0, _0208A0A0 ; =gSaveDataReadErrorGraphicsBanks
- bl GX_SetBanks
- add r0, r4, #0x0
- bl BgConfig_Alloc
- add r5, r0, #0x0
- ldr r0, _0208A0A4 ; =gSaveDataReadErrorGraphicsModes
- bl SetBothScreensModesAndDisable
- mov r1, #0x0
- ldr r2, _0208A0A8 ; =gSaveDataReadErrorBgTemplate
- add r0, r5, #0x0
- add r3, r1, #0x0
- bl InitBgFromTemplate
- add r0, r5, #0x0
- mov r1, #0x0
- bl BgClearTilemapBufferAndCommit
- mov r1, #0x0
- str r1, [sp, #0x0]
- ldr r2, _0208A0AC ; =0x000001F7
- add r0, r5, #0x0
- mov r3, #0x2
- str r4, [sp, #0x4]
- bl FUN_0200CB00
- mov r0, #0x0
- mov r1, #0x20
- add r2, r4, #0x0
- bl FUN_02002ED0
- mov r0, #0x0
- mov r1, #0x20
- add r2, r0, #0x0
- add r3, r4, #0x0
- bl BG_ClearCharDataRange
- ldr r1, _0208A0B0 ; =0x00006C21
- mov r0, #0x0
- bl BG_SetMaskColor
- ldr r1, _0208A0B0 ; =0x00006C21
- mov r0, #0x4
- bl BG_SetMaskColor
- mov r0, #0x1
- mov r1, #0x1a
- mov r2, #0x5
- add r3, r4, #0x0
- bl NewMsgDataFromNarc
- add r6, r0, #0x0
- mov r0, #0x6
- lsl r0, r0, #0x6
- add r1, r4, #0x0
- bl String_ctor
- add r4, r0, #0x0
- bl FUN_0201BD5C
- ldr r2, _0208A0B4 ; =gSaveDataReadErrorWindowTemplate
- add r0, r5, #0x0
- add r1, sp, #0xc
- bl AddWindow
- mov r0, #0xd0
- str r0, [sp, #0x0]
- mov r0, #0x90
- mov r2, #0x0
- str r0, [sp, #0x4]
- add r0, sp, #0xc
- mov r1, #0xf
- add r3, r2, #0x0
- bl FillWindowPixelRect
- ldr r2, _0208A0AC ; =0x000001F7
- add r0, sp, #0xc
- mov r1, #0x0
- mov r3, #0x2
- bl FUN_0200CCA4
- add r0, r6, #0x0
- mov r1, #0x1
- add r2, r4, #0x0
- bl ReadMsgDataIntoString
- mov r1, #0x0
- str r1, [sp, #0x0]
- str r1, [sp, #0x4]
- add r0, sp, #0xc
- add r2, r4, #0x0
- add r3, r1, #0x0
- str r1, [sp, #0x8]
- bl AddTextPrinterParameterized
- add r0, r4, #0x0
- bl String_dtor
- bl GX_BothDispOn
- mov r0, #0x0
- bl FUN_0200E394
- mov r0, #0x1
- bl FUN_0200E394
- mov r0, #0x0
- mov r1, #0x3f
- mov r2, #0x3
- bl SetBrightness
- mov r4, #0x1
-_0208A078:
- bl HandleDSLidAction
- add r0, r4, #0x0
- add r1, r4, #0x0
- bl OS_WaitIrq
- b _0208A078
- nop
-_0208A088: .word 0xFFFFE0FF
-_0208A08C: .word 0x04001000
-_0208A090: .word gMain + 0x60
-_0208A094: .word 0x04000050
-_0208A098: .word 0x04001050
-_0208A09C: .word 0xFFFF1FFF
-_0208A0A0: .word gSaveDataReadErrorGraphicsBanks
-_0208A0A4: .word gSaveDataReadErrorGraphicsModes
-_0208A0A8: .word gSaveDataReadErrorBgTemplate
-_0208A0AC: .word 0x000001F7
-_0208A0B0: .word 0x00006C21
-_0208A0B4: .word gSaveDataReadErrorWindowTemplate
-
- thumb_func_start FUN_0208A0B8
-FUN_0208A0B8: ; 0x0208A0B8
- push {r4-r7, lr}
- sub sp, #0x1c
- add r4, r0, #0x0
- cmp r1, #0x0
- bne _0208A0C6
- mov r6, #0x1
- b _0208A0C8
-_0208A0C6:
- mov r6, #0x0
-_0208A0C8:
- mov r0, #0x0
- add r1, r0, #0x0
- bl FUN_0200E3A0
- mov r0, #0x1
- mov r1, #0x0
- bl FUN_0200E3A0
- bl FUN_02015EF4
- mov r0, #0x0
- add r1, r0, #0x0
- bl Main_SetVBlankIntrCB
- mov r0, #0x0
- add r1, r0, #0x0
- bl FUN_02015F34
- bl GX_DisableEngineALayers
- bl GX_DisableEngineBLayers
- mov r2, #0x1
- lsl r2, r2, #0x1a
- ldr r1, [r2, #0x0]
- ldr r0, _0208A228 ; =0xFFFFE0FF
- and r1, r0
- str r1, [r2, #0x0]
- ldr r2, _0208A22C ; =0x04001000
- ldr r1, [r2, #0x0]
- and r0, r1
- str r0, [r2, #0x0]
- mov r0, #0x4
- mov r1, #0x8
- bl SetKeyRepeatTimers
- ldr r0, _0208A230 ; =gMain + 0x60
- mov r1, #0x0
- strb r1, [r0, #0x5]
- bl GX_SwapDisplay
- ldr r3, _0208A234 ; =0x04000050
- mov r1, #0x0
- strh r1, [r3, #0x0]
- ldr r0, _0208A238 ; =0x04001050
- sub r3, #0x50
- strh r1, [r0, #0x0]
- ldr r2, [r3, #0x0]
- ldr r1, _0208A23C ; =0xFFFF1FFF
- sub r0, #0x50
- and r2, r1
- str r2, [r3, #0x0]
- ldr r2, [r0, #0x0]
- and r1, r2
- str r1, [r0, #0x0]
- ldr r0, _0208A240 ; =UNK_020FF474
- bl GX_SetBanks
- add r0, r4, #0x0
- bl BgConfig_Alloc
- add r5, r0, #0x0
- ldr r0, _0208A244 ; =UNK_020FF448
- bl SetBothScreensModesAndDisable
- mov r1, #0x0
- ldr r2, _0208A248 ; =UNK_020FF458
- add r0, r5, #0x0
- add r3, r1, #0x0
- bl InitBgFromTemplate
- add r0, r5, #0x0
- mov r1, #0x0
- bl BgClearTilemapBufferAndCommit
- mov r1, #0x0
- str r1, [sp, #0x0]
- ldr r2, _0208A24C ; =0x000001F7
- add r0, r5, #0x0
- mov r3, #0x2
- str r4, [sp, #0x4]
- bl FUN_0200CB00
- mov r0, #0x0
- mov r1, #0x20
- add r2, r4, #0x0
- bl FUN_02002ED0
- mov r0, #0x0
- mov r1, #0x20
- add r2, r0, #0x0
- add r3, r4, #0x0
- bl BG_ClearCharDataRange
- ldr r1, _0208A250 ; =0x00006C21
- mov r0, #0x0
- bl BG_SetMaskColor
- ldr r1, _0208A250 ; =0x00006C21
- mov r0, #0x4
- bl BG_SetMaskColor
- mov r0, #0x1
- mov r1, #0x1a
- mov r2, #0x6
- add r3, r4, #0x0
- bl NewMsgDataFromNarc
- add r7, r0, #0x0
- mov r0, #0x6
- lsl r0, r0, #0x6
- add r1, r4, #0x0
- bl String_ctor
- add r4, r0, #0x0
- bl FUN_0201BD5C
- ldr r2, _0208A254 ; =UNK_020FF440
- add r0, r5, #0x0
- add r1, sp, #0xc
- bl AddWindow
- mov r0, #0xd0
- str r0, [sp, #0x0]
- mov r0, #0x90
- mov r2, #0x0
- str r0, [sp, #0x4]
- add r0, sp, #0xc
- mov r1, #0xf
- add r3, r2, #0x0
- bl FillWindowPixelRect
- ldr r2, _0208A24C ; =0x000001F7
- add r0, sp, #0xc
- mov r1, #0x0
- mov r3, #0x2
- bl FUN_0200CCA4
- add r0, r7, #0x0
- add r1, r6, #0x0
- add r2, r4, #0x0
- bl ReadMsgDataIntoString
- mov r1, #0x0
- str r1, [sp, #0x0]
- str r1, [sp, #0x4]
- add r0, sp, #0xc
- add r2, r4, #0x0
- add r3, r1, #0x0
- str r1, [sp, #0x8]
- bl AddTextPrinterParameterized
- add r0, r4, #0x0
- bl String_dtor
- bl GX_BothDispOn
- mov r0, #0x0
- bl FUN_0200E394
- mov r0, #0x1
- bl FUN_0200E394
- mov r0, #0x0
- mov r1, #0x3f
- mov r2, #0x3
- bl SetBrightness
- mov r4, #0x1
- ; Battery-saver trap
-_0208A21A:
- bl HandleDSLidAction
- add r0, r4, #0x0
- add r1, r4, #0x0
- bl OS_WaitIrq
- b _0208A21A
- .balign 4
-_0208A228: .word 0xFFFFE0FF
-_0208A22C: .word 0x04001000
-_0208A230: .word gMain + 0x60
-_0208A234: .word 0x04000050
-_0208A238: .word 0x04001050
-_0208A23C: .word 0xFFFF1FFF
-_0208A240: .word UNK_020FF474
-_0208A244: .word UNK_020FF448
-_0208A248: .word UNK_020FF458
-_0208A24C: .word 0x000001F7
-_0208A250: .word 0x00006C21
-_0208A254: .word UNK_020FF440
diff --git a/arm9/global.inc b/arm9/global.inc
index 04d457a0..9831337f 100644
--- a/arm9/global.inc
+++ b/arm9/global.inc
@@ -5468,8 +5468,8 @@
.extern FUN_02089444
.extern FUN_0208946C
.extern ShowSaveDataReadError
-.extern FUN_02089F24
-.extern FUN_0208A0B8
+.extern ShowGBACartRemovedError
+.extern ShowSaveDataWriteError
.extern FUN_0208A258
.extern FUN_0208A300
.extern FUN_0208A320
diff --git a/arm9/modules/83/asm/module_83.s b/arm9/modules/83/asm/module_83.s
index c84d1e83..7c18c8e8 100644
--- a/arm9/modules/83/asm/module_83.s
+++ b/arm9/modules/83/asm/module_83.s
@@ -2149,7 +2149,7 @@ _0222E656:
bl FUN_02032D80
_0222E692:
mov r0, #0x51
- bl FUN_02089F24
+ bl ShowGBACartRemovedError
b _0222E6A8
_0222E69A:
bl PlaySE
@@ -18582,7 +18582,7 @@ MOD83_02236804: ; 0x02236804
beq _02236828
_02236822:
mov r0, #0x4e
- bl FUN_02089F24
+ bl ShowGBACartRemovedError
_02236828:
ldr r0, [r4, #0xc]
add r0, r0, #1
diff --git a/arm9/src/save.c b/arm9/src/save.c
index 9ddb7336..524edfb7 100644
--- a/arm9/src/save.c
+++ b/arm9/src/save.c
@@ -5,6 +5,7 @@
#include "CARD_backup.h"
#include "OS_spinLock.h"
#include "save_data_read_error.h"
+#include "save_data_write_error.h"
#pragma thumb on
@@ -14,9 +15,6 @@
extern void FUN_02016444(u8 mask);
extern void FUN_02016454(u8 mask);
-// unk_02089F24.s
-extern void FUN_0208A0B8(int, int);
-
struct {
struct SaveBlock2 * ptr;
BOOL iswritten;
@@ -908,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_write_error.c b/arm9/src/save_data_write_error.c
new file mode 100644
index 00000000..f2270b52
--- /dev/null
+++ b/arm9/src/save_data_write_error.c
@@ -0,0 +1,199 @@
+#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);
+
+extern const struct WindowTemplate gSaveDataReadErrorWindowTemplate;
+extern const struct GraphicsModes gSaveDataReadErrorGraphicsModes;
+extern const struct BgTemplate gSaveDataReadErrorBgTemplate;
+extern const struct GraphicsBanks gSaveDataReadErrorGraphicsBanks;
+
+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 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(&gSaveDataReadErrorGraphicsBanks);
+
+ struct BgConfig* bg_config = BgConfig_Alloc(heap_id);
+
+ SetBothScreensModesAndDisable(&gSaveDataReadErrorGraphicsModes);
+
+ InitBgFromTemplate(bg_config, 0, &gSaveDataReadErrorBgTemplate, 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, &gSaveDataReadErrorWindowTemplate);
+ 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);
+ }
+}
+
+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/include/save_block_2.h b/include/save_block_2.h
index a4514c96..fb2bc92a 100644
--- a/include/save_block_2.h
+++ b/include/save_block_2.h
@@ -152,6 +152,6 @@ BOOL FlashLoadChunk(u32 src, void * dest, u32 size);
void FlashWriteCommandCallback(void * arg);
int FlashWriteChunkInternal(u32 dest, void * src, u32 size);
BOOL WaitFlashWrite(int lock, BOOL * res);
-void SaveErrorHandling(int lock, int errno);
+void SaveErrorHandling(int lock, u32 errno);
#endif //POKEDIAMOND_SAVE_BLOCK_2_H
diff --git a/include/save_data_write_error.h b/include/save_data_write_error.h
new file mode 100644
index 00000000..45f8f614
--- /dev/null
+++ b/include/save_data_write_error.h
@@ -0,0 +1,7 @@
+#ifndef POKEDIAMOND_SAVE_DATA_WRITE_ERROR_H
+#define POKEDIAMOND_SAVE_DATA_WRITE_ERROR_H
+
+void ShowGBACartRemovedError(u32 heap_id);
+void ShowSaveDataWriteError(u32 heap_id, u32 err_no);
+
+#endif