diff options
-rw-r--r-- | asm/rom_81258BC.s | 92 | ||||
-rw-r--r-- | src/save.c | 32 |
2 files changed, 30 insertions, 94 deletions
diff --git a/asm/rom_81258BC.s b/asm/rom_81258BC.s index b81547b74..c06f3f470 100644 --- a/asm/rom_81258BC.s +++ b/asm/rom_81258BC.s @@ -6,98 +6,6 @@ .text - thumb_func_start sub_81258BC -sub_81258BC: @ 81258BC - push {r4-r7,lr} - mov r7, r8 - push {r7} - mov r8, r1 - ldr r0, _08125958 - ldr r1, [r0] - movs r0, 0x1 - ands r1, r0 - lsls r0, r1, 3 - subs r0, r1 - lsls r0, 17 - lsrs r7, r0, 16 - movs r5, 0 - ldr r6, _0812595C -_081258D8: - adds r0, r5, r7 - lsls r0, 24 - lsrs r0, 24 - ldr r1, [r6] - bl sub_8125BF8 - ldr r0, [r6] - ldr r1, _08125960 - adds r0, r1 - ldrh r1, [r0] - cmp r1, 0 - bne _081258F4 - ldr r0, _08125964 - strh r5, [r0] -_081258F4: - ldr r0, [r6] - lsls r1, 3 - mov r2, r8 - adds r4, r1, r2 - ldrh r1, [r4, 0x4] - bl sub_8125C10 - lsls r0, 16 - lsrs r3, r0, 16 - ldr r2, [r6] - ldr r1, _08125968 - adds r0, r2, r1 - ldr r1, [r0] - ldr r0, _0812596C - adds r5, 0x1 - cmp r1, r0 - bne _08125944 - ldr r1, _08125970 - adds r0, r2, r1 - ldrh r0, [r0] - cmp r0, r3 - bne _08125944 - movs r2, 0 - ldrh r0, [r4, 0x4] - cmp r2, r0 - bcs _08125944 - adds r3, r4, 0 - ldr r4, _0812595C -_0812592C: - ldr r1, [r3] - adds r1, r2 - ldr r0, [r4] - adds r0, r2 - ldrb r0, [r0] - strb r0, [r1] - adds r0, r2, 0x1 - lsls r0, 16 - lsrs r2, r0, 16 - ldrh r1, [r3, 0x4] - cmp r2, r1 - bcc _0812592C -_08125944: - lsls r0, r5, 16 - lsrs r5, r0, 16 - cmp r5, 0xD - bls _081258D8 - movs r0, 0x1 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08125958: .4byte gUnknown_03005EAC -_0812595C: .4byte gUnknown_03005EB0 -_08125960: .4byte 0x00000ff4 -_08125964: .4byte gUnknown_03005E9C -_08125968: .4byte 0x00000ff8 -_0812596C: .4byte 0x08012025 @ TODO: figure out what this represents -_08125970: .4byte 0x00000ff6 - thumb_func_end sub_81258BC - thumb_func_start sub_8125974 sub_8125974: @ 8125974 push {r4-r7,lr} diff --git a/src/save.c b/src/save.c index e05de67cc..decc75bcc 100644 --- a/src/save.c +++ b/src/save.c @@ -28,7 +28,9 @@ extern u16 gUnknown_03005EB4; u8 sub_81252D8(u16, struct SaveSectionLocation *); u8 sub_8125440(u8, u8 *); -u8 sub_81255B8(u16 a1, struct SaveSectionLocation *a2); +u8 sub_81255B8(u16, struct SaveSectionLocation *); +u8 sub_81258BC(u16, struct SaveSectionLocation *); +u8 sub_8125BF8(u8, u8 *); void calls_flash_erase_block(void) { @@ -331,7 +333,7 @@ u8 sub_81257F0(u16 a1) } } -u8 sub_812587C(u16 a1, int a2) +u8 sub_812587C(u16 a1, struct SaveSectionLocation *a2) { u8 retVal; gUnknown_03005EB0 = &unk_2000000; @@ -347,3 +349,29 @@ u8 sub_812587C(u16 a1, int a2) return retVal; } + +u8 sub_81258BC(u16 a1, struct SaveSectionLocation *a2) +{ + u16 i; + u16 checksum; + u16 v3 = 14 * (gUnknown_03005EAC % 2); + u16 id; + + for (i = 0; i < 14; i++) + { + sub_8125BF8(i + v3, gUnknown_03005EB0->data); + id = gUnknown_03005EB0->id; + if (id == 0) + gUnknown_03005E9C = i; + checksum = sub_8125C10(gUnknown_03005EB0->data, a2[id].size); + if (gUnknown_03005EB0->unknown == 0x8012025 + && gUnknown_03005EB0->checksum == checksum) + { + u16 j; + for (j = 0; j < a2[id].size; j++) + ((u8 *)a2[id].data)[j] = gUnknown_03005EB0->data[j]; + } + } + + return 1; +} |