summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYamaArashi <shadow962@live.com>2016-10-17 07:19:47 -0700
committerYamaArashi <shadow962@live.com>2016-10-17 07:19:47 -0700
commitbf8fa9086cd0bc5135dfc7545b13d061d07c6b6b (patch)
treec1e8714c6a781b2326164ebef34b04e037cd8dbc /src
parentf13e7b91273e457279d3f06a6c5b606dc6f26d1b (diff)
decompile more save functions
Diffstat (limited to 'src')
-rw-r--r--src/save.c207
1 files changed, 203 insertions, 4 deletions
diff --git a/src/save.c b/src/save.c
index ba1951701..e448ab079 100644
--- a/src/save.c
+++ b/src/save.c
@@ -16,8 +16,13 @@ struct SaveSection
u32 counter;
};
+extern u32 sub_8053108(u8);
+extern void sav12_xor_increment(u8);
+
extern struct SaveSection unk_2000000;
+extern u32 gUnknown_3004820;
+
extern u16 gUnknown_03005E9C;
extern u32 gUnknown_03005EA0;
extern u16 gUnknown_03005EA4;
@@ -25,6 +30,11 @@ extern u32 gUnknown_03005EA8;
extern u32 gUnknown_03005EAC;
extern struct SaveSection *gUnknown_03005EB0;
extern u16 gUnknown_03005EB4;
+extern u16 gSaveFileStatus;
+extern u32 gUnknown_03005EBC;
+
+extern struct SaveSectionLocation gSaveSectionLocations[];
+extern struct SaveSectionLocation gHallOfFameSaveSectionLocations[];
u8 sub_81252D8(u16, struct SaveSectionLocation *);
u8 sub_8125440(u8, u8 *);
@@ -32,6 +42,7 @@ u8 sub_81255B8(u16, struct SaveSectionLocation *);
u8 sub_81258BC(u16, struct SaveSectionLocation *);
u8 sub_8125BF8(u8, struct SaveSection *);
u8 sub_8125974(struct SaveSectionLocation *);
+u16 sub_8125C10(void *, u16);
void calls_flash_erase_block(void)
{
@@ -159,7 +170,7 @@ u8 sub_8125440(u8 sector, u8 *data)
}
}
-u32 sub_812546C(void)
+u32 sub_812546C(struct SaveSectionLocation *a1)
{
gUnknown_03005EB0 = &unk_2000000;
gUnknown_03005EA4 = gUnknown_03005E9C;
@@ -172,7 +183,7 @@ u32 sub_812546C(void)
return 0;
}
-u32 sub_81254C8(void)
+u32 sub_81254C8(struct SaveSectionLocation *a1)
{
gUnknown_03005EB0 = &unk_2000000;
gUnknown_03005EA4 = gUnknown_03005E9C;
@@ -290,7 +301,7 @@ u8 sub_81255B8(u16 a1, struct SaveSectionLocation *a2)
}
}
-u8 sub_8125758(u16 a1)
+u8 sub_8125758(u16 a1, struct SaveSectionLocation *a2)
{
u16 sector;
@@ -312,7 +323,7 @@ u8 sub_8125758(u16 a1)
}
}
-u8 sub_81257F0(u16 a1)
+u8 sub_81257F0(u16 a1, struct SaveSectionLocation *a2)
{
u16 sector;
@@ -502,3 +513,191 @@ u8 sub_8125974(struct SaveSectionLocation *a1)
gUnknown_03005E9C = 0;
return 2;
}
+
+u8 sub_8125B88(u8 a1, u8 *data, u16 size)
+{
+ u16 i;
+ struct SaveSection *section = &unk_2000000;
+ sub_8125BF8(a1, section);
+ if (section->unknown == 0x8012025)
+ {
+ u16 checksum = sub_8125C10(section->data, size);
+ if (section->id == checksum)
+ {
+ for (i = 0; i < size; i++)
+ data[i] = section->data[i];
+ return 1;
+ }
+ else
+ {
+ return 2;
+ }
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+u8 sub_8125BF8(u8 sector, struct SaveSection *section)
+{
+ ReadFlash(sector, 0, section, 0x1000);
+ return 1;
+}
+
+u16 sub_8125C10(void *data, u16 size)
+{
+ u16 i;
+ u32 checksum = 0;
+
+ for (i = 0; i < (size / 4); i++)
+ checksum += *((u32 *)data)++;
+
+ return ((checksum >> 16) + checksum);
+}
+
+u8 sub_8125C3C(u8 a1)
+{
+ u8 i;
+ switch (a1)
+ {
+ case 5:
+ for (i = 28; i < 32; i++)
+ EraseFlashSector(i);
+ case 3:
+ if (sub_8053108(10) < 999)
+ sav12_xor_increment(10);
+ for (i = 0; i < 2; i++)
+ sub_81253C8(28 + i, gHallOfFameSaveSectionLocations[i].data, gHallOfFameSaveSectionLocations[i].size);
+ save_serialize_game();
+ save_write_to_flash(0xFFFF, gSaveSectionLocations);
+ break;
+ case 0:
+ default:
+ save_serialize_game();
+ save_write_to_flash(0xFFFF, gSaveSectionLocations);
+ break;
+ case 1:
+ save_serialize_game();
+ for (i = 0; i < 5; i++)
+ save_write_to_flash(i, gSaveSectionLocations);
+ break;
+ case 2:
+ save_serialize_game();
+ save_write_to_flash(0, gSaveSectionLocations);
+ break;
+ case 4:
+ for (i = 28; i < 32; i++)
+ EraseFlashSector(i);
+ save_serialize_game();
+ save_write_to_flash(0xFFFF, gSaveSectionLocations);
+ break;
+ }
+ return 0;
+}
+
+u8 sub_8125D44(u8 a1)
+{
+ if (gUnknown_3004820 != 1)
+ return 0xFF;
+ sub_8125C3C(a1);
+ if (!gUnknown_03005EA8)
+ return 1;
+ fullscreen_save_activate(a1);
+ return 0xFF;
+}
+
+u8 sub_8125D80(void)
+{
+ if (gUnknown_3004820 != 1)
+ return 1;
+ save_serialize_game();
+ sub_812546C(gSaveSectionLocations);
+ return 0;
+}
+
+bool8 sub_8125DA8(void)
+{
+ u8 v0 = sub_812550C(14, gSaveSectionLocations);
+ if (gUnknown_03005EA8)
+ fullscreen_save_activate(0);
+ if (v0 == 0xFF)
+ return 1;
+ else
+ return 0;
+}
+
+u8 sub_8125DDC(void)
+{
+ sub_812556C(14, gSaveSectionLocations);
+ if (gUnknown_03005EA8)
+ fullscreen_save_activate(0);
+ return 0;
+}
+
+u8 sub_8125E04(void)
+{
+ sub_8125758(14, gSaveSectionLocations);
+ if (gUnknown_03005EA8)
+ fullscreen_save_activate(0);
+ return 0;
+}
+
+u8 sub_8125E2C(void)
+{
+ if (gUnknown_3004820 != 1)
+ return 1;
+
+ save_serialize_game();
+ sub_81254C8(gSaveSectionLocations);
+ sub_812556C(gUnknown_03005EB4 + 1, gSaveSectionLocations);
+ return 0;
+}
+
+u8 sub_8125E6C(void)
+{
+ u8 retVal = 0;
+ u16 val = ++gUnknown_03005EB4;
+ if (val <= 4)
+ {
+ sub_812556C(gUnknown_03005EB4 + 1, gSaveSectionLocations);
+ sub_81257F0(val, gSaveSectionLocations);
+ }
+ else
+ {
+ sub_81257F0(val, gSaveSectionLocations);
+ retVal = 1;
+ }
+ if (gUnknown_03005EA8)
+ fullscreen_save_activate(1);
+ return retVal;
+}
+
+u8 sub_8125EC8(u8 a1)
+{
+ u8 result;
+
+ if (gUnknown_3004820 != 1)
+ {
+ gSaveFileStatus = 4;
+ return 0xFF;
+ }
+
+ switch (a1)
+ {
+ case 0:
+ default:
+ result = sub_812587C(0xFFFF, gSaveSectionLocations);
+ save_deserialize_game();
+ gSaveFileStatus = result;
+ gUnknown_03005EBC = 0;
+ break;
+ case 3:
+ result = sub_8125B88(28, gHallOfFameSaveSectionLocations[0].data, gHallOfFameSaveSectionLocations[0].size);
+ if (result == 1)
+ result = sub_8125B88(29, gHallOfFameSaveSectionLocations[1].data, gHallOfFameSaveSectionLocations[1].size);
+ break;
+ }
+
+ return result;
+}