summaryrefslogtreecommitdiff
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
parentf13e7b91273e457279d3f06a6c5b606dc6f26d1b (diff)
decompile more save functions
-rw-r--r--asm/rom_81258BC.s497
-rw-r--r--src/save.c207
2 files changed, 203 insertions, 501 deletions
diff --git a/asm/rom_81258BC.s b/asm/rom_81258BC.s
index 9a97d6983..8b44e6ead 100644
--- a/asm/rom_81258BC.s
+++ b/asm/rom_81258BC.s
@@ -6,503 +6,6 @@
.text
- thumb_func_start sub_8125B88
-sub_8125B88: @ 8125B88
- push {r4-r6,lr}
- adds r6, r1, 0
- lsls r0, 24
- lsrs r0, 24
- lsls r2, 16
- lsrs r4, r2, 16
- ldr r5, _08125BDC
- adds r1, r5, 0
- bl sub_8125BF8
- ldr r1, _08125BE0
- adds r0, r5, r1
- ldr r1, [r0]
- ldr r0, _08125BE4
- cmp r1, r0
- bne _08125BF0
- adds r0, r5, 0
- adds r1, r4, 0
- bl sub_8125C10
- lsls r0, 16
- lsrs r0, 16
- ldr r2, _08125BE8
- adds r1, r5, r2
- ldrh r1, [r1]
- cmp r1, r0
- bne _08125BEC
- movs r2, 0
- cmp r2, r4
- bcs _08125BD6
-_08125BC4:
- adds r1, r6, r2
- adds r0, r5, r2
- ldrb r0, [r0]
- strb r0, [r1]
- adds r0, r2, 0x1
- lsls r0, 16
- lsrs r2, r0, 16
- cmp r2, r4
- bcc _08125BC4
-_08125BD6:
- movs r0, 0x1
- b _08125BF2
- .align 2, 0
-_08125BDC: .4byte 0x02000000
-_08125BE0: .4byte 0x00000ff8
-_08125BE4: .4byte 0x08012025 @ TODO: figure out what this represents
-_08125BE8: .4byte 0x00000ff4
-_08125BEC:
- movs r0, 0x2
- b _08125BF2
-_08125BF0:
- movs r0, 0
-_08125BF2:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end sub_8125B88
-
- thumb_func_start sub_8125BF8
-sub_8125BF8: @ 8125BF8
- push {lr}
- adds r2, r1, 0
- lsls r0, 24
- lsrs r0, 24
- movs r3, 0x80
- lsls r3, 5
- movs r1, 0
- bl ReadFlash
- movs r0, 0x1
- pop {r1}
- bx r1
- thumb_func_end sub_8125BF8
-
- thumb_func_start sub_8125C10
-sub_8125C10: @ 8125C10
- push {r4,lr}
- adds r4, r0, 0
- lsls r1, 16
- movs r2, 0
- movs r3, 0
- lsrs r1, 18
- cmp r2, r1
- bcs _08125C2E
-_08125C20:
- ldm r4!, {r0}
- adds r2, r0
- adds r0, r3, 0x1
- lsls r0, 16
- lsrs r3, r0, 16
- cmp r3, r1
- bcc _08125C20
-_08125C2E:
- lsrs r0, r2, 16
- adds r0, r2
- lsls r0, 16
- lsrs r0, 16
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_8125C10
-
- thumb_func_start sub_8125C3C
-sub_8125C3C: @ 8125C3C
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x5
- bhi _08125CB6
- lsls r0, 2
- ldr r1, _08125C50
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_08125C50: .4byte _08125C54
- .align 2, 0
-_08125C54:
- .4byte _08125CB6
- .4byte _08125CD8
- .4byte _08125CF8
- .4byte _08125C82
- .4byte _08125D0C
- .4byte _08125C6C
-_08125C6C:
- movs r4, 0x1C
- ldr r5, _08125CC4
-_08125C70:
- ldr r1, [r5]
- adds r0, r4, 0
- bl _call_via_r1
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x1F
- bls _08125C70
-_08125C82:
- movs r0, 0xA
- bl sub_8053108
- ldr r1, _08125CC8
- cmp r0, r1
- bhi _08125C94
- movs r0, 0xA
- bl sav12_xor_increment
-_08125C94:
- movs r4, 0
- ldr r5, _08125CCC
-_08125C98:
- adds r0, r4, 0
- adds r0, 0x1C
- lsls r0, 24
- lsrs r0, 24
- lsls r2, r4, 3
- adds r2, r5
- ldr r1, [r2]
- ldrh r2, [r2, 0x4]
- bl sub_81253C8
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x1
- bls _08125C98
-_08125CB6:
- bl save_serialize_game
- ldr r0, _08125CD0
- ldr r1, _08125CD4
- bl save_write_to_flash
- b _08125D2E
- .align 2, 0
-_08125CC4: .4byte EraseFlashSector
-_08125CC8: .4byte 0x000003e6
-_08125CCC: .4byte gHallOfFameSaveSectionLocations
-_08125CD0: .4byte 0x0000ffff
-_08125CD4: .4byte gSaveSectionLocations
-_08125CD8:
- bl save_serialize_game
- movs r4, 0
-_08125CDE:
- adds r0, r4, 0
- ldr r1, _08125CF4
- bl save_write_to_flash
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x4
- bls _08125CDE
- b _08125D2E
- .align 2, 0
-_08125CF4: .4byte gSaveSectionLocations
-_08125CF8:
- bl save_serialize_game
- ldr r1, _08125D08
- movs r0, 0
- bl save_write_to_flash
- b _08125D2E
- .align 2, 0
-_08125D08: .4byte gSaveSectionLocations
-_08125D0C:
- movs r4, 0x1C
- ldr r5, _08125D38
-_08125D10:
- ldr r1, [r5]
- adds r0, r4, 0
- bl _call_via_r1
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x1F
- bls _08125D10
- bl save_serialize_game
- ldr r0, _08125D3C
- ldr r1, _08125D40
- bl save_write_to_flash
-_08125D2E:
- movs r0, 0
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_08125D38: .4byte EraseFlashSector
-_08125D3C: .4byte 0x0000ffff
-_08125D40: .4byte gSaveSectionLocations
- thumb_func_end sub_8125C3C
-
- thumb_func_start sub_8125D44
-sub_8125D44: @ 8125D44
- push {r4,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- ldr r0, _08125D58
- ldr r0, [r0]
- cmp r0, 0x1
- beq _08125D5C
- movs r0, 0xFF
- b _08125D7A
- .align 2, 0
-_08125D58: .4byte gUnknown_3004820
-_08125D5C:
- adds r0, r4, 0
- bl sub_8125C3C
- ldr r0, _08125D74
- ldr r0, [r0]
- cmp r0, 0
- beq _08125D78
- adds r0, r4, 0
- bl fullscreen_save_activate
- movs r0, 0xFF
- b _08125D7A
- .align 2, 0
-_08125D74: .4byte gUnknown_03005EA8
-_08125D78:
- movs r0, 0x1
-_08125D7A:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_8125D44
-
- thumb_func_start sub_8125D80
-sub_8125D80: @ 8125D80
- push {lr}
- ldr r0, _08125D98
- ldr r0, [r0]
- cmp r0, 0x1
- bne _08125DA0
- bl save_serialize_game
- ldr r0, _08125D9C
- bl sub_812546C
- movs r0, 0
- b _08125DA2
- .align 2, 0
-_08125D98: .4byte gUnknown_3004820
-_08125D9C: .4byte gSaveSectionLocations
-_08125DA0:
- movs r0, 0x1
-_08125DA2:
- pop {r1}
- bx r1
- thumb_func_end sub_8125D80
-
- thumb_func_start sub_8125DA8
-sub_8125DA8: @ 8125DA8
- push {r4,lr}
- ldr r1, _08125DCC
- movs r0, 0xE
- bl sub_812550C
- lsls r0, 24
- lsrs r4, r0, 24
- ldr r0, _08125DD0
- ldr r0, [r0]
- cmp r0, 0
- beq _08125DC4
- movs r0, 0
- bl fullscreen_save_activate
-_08125DC4:
- cmp r4, 0xFF
- beq _08125DD4
- movs r0, 0
- b _08125DD6
- .align 2, 0
-_08125DCC: .4byte gSaveSectionLocations
-_08125DD0: .4byte gUnknown_03005EA8
-_08125DD4:
- movs r0, 0x1
-_08125DD6:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_8125DA8
-
- thumb_func_start sub_8125DDC
-sub_8125DDC: @ 8125DDC
- push {lr}
- ldr r1, _08125DFC
- movs r0, 0xE
- bl sub_812556C
- ldr r0, _08125E00
- ldr r0, [r0]
- cmp r0, 0
- beq _08125DF4
- movs r0, 0
- bl fullscreen_save_activate
-_08125DF4:
- movs r0, 0
- pop {r1}
- bx r1
- .align 2, 0
-_08125DFC: .4byte gSaveSectionLocations
-_08125E00: .4byte gUnknown_03005EA8
- thumb_func_end sub_8125DDC
-
- thumb_func_start sub_8125E04
-sub_8125E04: @ 8125E04
- push {lr}
- ldr r1, _08125E24
- movs r0, 0xE
- bl sub_8125758
- ldr r0, _08125E28
- ldr r0, [r0]
- cmp r0, 0
- beq _08125E1C
- movs r0, 0
- bl fullscreen_save_activate
-_08125E1C:
- movs r0, 0
- pop {r1}
- bx r1
- .align 2, 0
-_08125E24: .4byte gSaveSectionLocations
-_08125E28: .4byte gUnknown_03005EA8
- thumb_func_end sub_8125E04
-
- thumb_func_start sub_8125E2C
-sub_8125E2C: @ 8125E2C
- push {r4,lr}
- ldr r0, _08125E58
- ldr r0, [r0]
- cmp r0, 0x1
- bne _08125E64
- bl save_serialize_game
- ldr r4, _08125E5C
- adds r0, r4, 0
- bl sub_81254C8
- ldr r0, _08125E60
- ldrh r0, [r0]
- adds r0, 0x1
- lsls r0, 16
- lsrs r0, 16
- adds r1, r4, 0
- bl sub_812556C
- movs r0, 0
- b _08125E66
- .align 2, 0
-_08125E58: .4byte gUnknown_3004820
-_08125E5C: .4byte gSaveSectionLocations
-_08125E60: .4byte gUnknown_03005EB4
-_08125E64:
- movs r0, 0x1
-_08125E66:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_8125E2C
-
- thumb_func_start sub_8125E6C
-sub_8125E6C: @ 8125E6C
- push {r4-r6,lr}
- movs r6, 0
- ldr r0, _08125E98
- ldrh r1, [r0]
- adds r1, 0x1
- strh r1, [r0]
- lsls r0, r1, 16
- lsrs r5, r0, 16
- cmp r5, 0x4
- bhi _08125EA0
- adds r0, r1, 0x1
- lsls r0, 16
- lsrs r0, 16
- ldr r4, _08125E9C
- adds r1, r4, 0
- bl sub_812556C
- adds r0, r5, 0
- adds r1, r4, 0
- bl sub_81257F0
- b _08125EAA
- .align 2, 0
-_08125E98: .4byte gUnknown_03005EB4
-_08125E9C: .4byte gSaveSectionLocations
-_08125EA0:
- ldr r1, _08125EC0
- adds r0, r5, 0
- bl sub_81257F0
- movs r6, 0x1
-_08125EAA:
- ldr r0, _08125EC4
- ldr r0, [r0]
- cmp r0, 0
- beq _08125EB8
- movs r0, 0x1
- bl fullscreen_save_activate
-_08125EB8:
- adds r0, r6, 0
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_08125EC0: .4byte gSaveSectionLocations
-_08125EC4: .4byte gUnknown_03005EA8
- thumb_func_end sub_8125E6C
-
- thumb_func_start sub_8125EC8
-sub_8125EC8: @ 8125EC8
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r1, r0, 24
- ldr r0, _08125EE0
- ldr r0, [r0]
- cmp r0, 0x1
- beq _08125EE8
- ldr r1, _08125EE4
- movs r0, 0x4
- strh r0, [r1]
- movs r0, 0xFF
- b _08125F40
- .align 2, 0
-_08125EE0: .4byte gUnknown_3004820
-_08125EE4: .4byte gSaveFileStatus
-_08125EE8:
- cmp r1, 0
- beq _08125EF0
- cmp r1, 0x3
- beq _08125F1C
-_08125EF0:
- ldr r0, _08125F0C
- ldr r1, _08125F10
- bl sub_812587C
- lsls r0, 24
- lsrs r4, r0, 24
- bl save_deserialize_game
- ldr r0, _08125F14
- strh r4, [r0]
- ldr r1, _08125F18
- movs r0, 0
- str r0, [r1]
- b _08125F3E
- .align 2, 0
-_08125F0C: .4byte 0x0000ffff
-_08125F10: .4byte gSaveSectionLocations
-_08125F14: .4byte gSaveFileStatus
-_08125F18: .4byte gUnknown_03005EBC
-_08125F1C:
- ldr r5, _08125F48
- ldr r1, [r5]
- ldrh r2, [r5, 0x4]
- movs r0, 0x1C
- bl sub_8125B88
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x1
- bne _08125F3E
- ldr r1, [r5, 0x8]
- ldrh r2, [r5, 0xC]
- movs r0, 0x1D
- bl sub_8125B88
- lsls r0, 24
- lsrs r4, r0, 24
-_08125F3E:
- adds r0, r4, 0
-_08125F40:
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_08125F48: .4byte gHallOfFameSaveSectionLocations
- thumb_func_end sub_8125EC8
-
thumb_func_start unref_sub_8125F4C
unref_sub_8125F4C: @ 8125F4C
push {r4-r6,lr}
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;
+}