diff options
Diffstat (limited to 'src/save.c')
-rw-r--r-- | src/save.c | 67 |
1 files changed, 66 insertions, 1 deletions
@@ -2,9 +2,14 @@ extern u32 gUnknown_203B17C; extern u32 gUnknown_203B180; -extern u32 *gUnknown_203B184; +extern vu32 gUnknown_203B184; extern u32 gUnknown_202DE28; +extern s32 ReadFlashData(s32 sector, u8 *src, s32 size); +extern s32 WriteFlashData(s32 sector, u8 *src, s32 size); +extern bool8 sub_800DAB0(u16, u8*, s32); +extern bool8 sub_800DAB4(u16, u8*, s32); +extern bool8 sub_800DAB8(void); u32 sub_8011C1C(void) { @@ -62,3 +67,63 @@ bool8 ValidateChecksum(u8 *in, u32 size) return TRUE; return FALSE; } + +void sub_8011CA8(u32 *out, s32 b) +{ + gUnknown_203B184; // Needed to match + *out += (b + 0xFFF) / 0x1000; +} + +u32 WriteSaveSector(u32 *a, u8 *b, s32 size, u32 d) +{ + u32 r6 = *a; + u32 num; + sub_8011CA8(a, size); + CalculateChecksum(b, size); + if (!gUnknown_203B184) { + num = WriteFlashData(r6, b, size); + } + else if (sub_800DAB8()) { + num = sub_800DAB4(r6, b, size) ? 0 : 3; + } + else { + return 2; + } + if (num == 4) { + return 1; + } + else if (num) { + return 2; + } + else { + return 0; + } +} + +u32 ReadSaveSector(u32 *a, u8 *b, s32 size, u32 d) +{ + u32 r6 = *a; + u32 num; + sub_8011CA8(a, size); + if (!gUnknown_203B184) { + num = ReadFlashData(r6, b, size); + } + else if (sub_800DAB8()) { + if (!sub_800DAB0(r6, b, size)) { + num = 1; + } + else { + num = 0; + } + } + else { + return 1; + } + if (num) { + return 1; + } + if (ValidateChecksum(b, size)) { + return 2; + } + return 0; +} |