diff options
author | YamaArashi <shadow962@live.com> | 2016-10-17 07:19:47 -0700 |
---|---|---|
committer | YamaArashi <shadow962@live.com> | 2016-10-17 07:19:47 -0700 |
commit | bf8fa9086cd0bc5135dfc7545b13d061d07c6b6b (patch) | |
tree | c1e8714c6a781b2326164ebef34b04e037cd8dbc | |
parent | f13e7b91273e457279d3f06a6c5b606dc6f26d1b (diff) |
decompile more save functions
-rw-r--r-- | asm/rom_81258BC.s | 497 | ||||
-rw-r--r-- | src/save.c | 207 |
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; +} |