From 83ca45d6302e65cc533b2babceb5a60e8f159129 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Tue, 2 Mar 2021 16:11:31 +0100 Subject: [PATCH 01/14] matched data read, write and compare functions --- asm/non_matching/save/sub_0807D008.inc | 4 +- asm/non_matching/save/sub_0807D1D8.inc | 36 ----------- asm/non_matching/save/sub_0807D20C.inc | 41 ------------- asm/non_matching/save/sub_0807D24C.inc | 36 ----------- include/functions.h | 2 - src/save.c | 82 ++++++++++++++------------ 6 files changed, 47 insertions(+), 154 deletions(-) delete mode 100644 asm/non_matching/save/sub_0807D1D8.inc delete mode 100644 asm/non_matching/save/sub_0807D20C.inc delete mode 100644 asm/non_matching/save/sub_0807D24C.inc diff --git a/asm/non_matching/save/sub_0807D008.inc b/asm/non_matching/save/sub_0807D008.inc index d5d00ffd..2efde355 100644 --- a/asm/non_matching/save/sub_0807D008.inc +++ b/asm/non_matching/save/sub_0807D008.inc @@ -21,7 +21,7 @@ ldrh r0, [r5, #6] ldrh r2, [r5] adds r1, r7, #0 - bl sub_0807D1D8 + bl DataRead cmp r0, #0 beq _0807D046 ldrh r2, [r5] @@ -42,7 +42,7 @@ _0807D048: ldrh r0, [r5, #8] ldrh r2, [r5] adds r1, r7, #0 - bl sub_0807D1D8 + bl DataRead cmp r0, #0 beq _0807D076 ldrh r2, [r5] diff --git a/asm/non_matching/save/sub_0807D1D8.inc b/asm/non_matching/save/sub_0807D1D8.inc deleted file mode 100644 index 88c30173..00000000 --- a/asm/non_matching/save/sub_0807D1D8.inc +++ /dev/null @@ -1,36 +0,0 @@ - - .syntax unified - - .text - - push {r4, r5, r6, lr} - adds r5, r0, #0 - adds r6, r1, #0 - lsrs r4, r2, #3 - adds r0, r4, #0 - lsrs r5, r5, #3 - b _0807D200 -_0807D1E6: - lsls r0, r5, #0x10 - lsrs r0, r0, #0x10 - adds r1, r6, #0 - bl EEPROMRead - lsls r0, r0, #0x10 - cmp r0, #0 - beq _0807D1FA - movs r0, #0 - b _0807D208 -_0807D1FA: - adds r5, #1 - adds r6, #8 - adds r0, r4, #0 -_0807D200: - subs r4, #1 - cmp r0, #0 - bne _0807D1E6 - movs r0, #1 -_0807D208: - pop {r4, r5, r6, pc} - .align 2, 0 - - .syntax divided diff --git a/asm/non_matching/save/sub_0807D20C.inc b/asm/non_matching/save/sub_0807D20C.inc deleted file mode 100644 index 7fd90a12..00000000 --- a/asm/non_matching/save/sub_0807D20C.inc +++ /dev/null @@ -1,41 +0,0 @@ - - .syntax unified - - .text - - push {r4, r5, r6, r7, lr} - adds r6, r0, #0 - adds r7, r1, #0 - lsrs r5, r2, #3 - adds r0, r5, #0 - lsrs r6, r6, #3 - b _0807D242 -_0807D21A: - lsls r0, r6, #0x10 - lsrs r4, r0, #0x10 - adds r0, r4, #0 - adds r1, r7, #0 - bl EEPROMWrite0_8k_Check - lsls r0, r0, #0x10 - cmp r0, #0 - beq _0807D23C - adds r0, r4, #0 - ldr r1, _0807D238 @ =gUnk_0811E4B4 - bl EEPROMWrite0_8k_Check - movs r0, #0 - b _0807D24A - .align 2, 0 -_0807D238: .4byte gUnk_0811E4B4 -_0807D23C: - adds r6, #1 - adds r7, #8 - adds r0, r5, #0 -_0807D242: - subs r5, #1 - cmp r0, #0 - bne _0807D21A - movs r0, #1 -_0807D24A: - pop {r4, r5, r6, r7, pc} - - .syntax divided diff --git a/asm/non_matching/save/sub_0807D24C.inc b/asm/non_matching/save/sub_0807D24C.inc deleted file mode 100644 index 6ec855ad..00000000 --- a/asm/non_matching/save/sub_0807D24C.inc +++ /dev/null @@ -1,36 +0,0 @@ - - .syntax unified - - .text - - push {r4, r5, r6, lr} - adds r5, r0, #0 - adds r6, r1, #0 - lsrs r4, r2, #3 - adds r0, r4, #0 - lsrs r5, r5, #3 - b _0807D274 -_0807D25A: - lsls r0, r5, #0x10 - lsrs r0, r0, #0x10 - adds r1, r6, #0 - bl EEPROMCompare - lsls r0, r0, #0x10 - cmp r0, #0 - beq _0807D26E - movs r0, #0 - b _0807D27C -_0807D26E: - adds r5, #1 - adds r6, #8 - adds r0, r4, #0 -_0807D274: - subs r4, #1 - cmp r0, #0 - bne _0807D25A - movs r0, #1 -_0807D27C: - pop {r4, r5, r6, pc} - .align 2, 0 - - .syntax divided diff --git a/include/functions.h b/include/functions.h index 9d190498..e2bce0a9 100644 --- a/include/functions.h +++ b/include/functions.h @@ -214,9 +214,7 @@ extern u32 sub_0807CF10(u8*); extern void sub_08056208(void); extern void sub_08050384(); extern struct_0807D1C4* sub_0807D1C4(u32); -extern u32 sub_0807D24C(u32, const char*, u32); extern void sub_0807CF68(u32); -extern u32 sub_0807D20C(u32, const char*, u32); extern u32 sub_0807CF88(u32, u8*); extern u32 sub_0807D184(u32, const char*); extern u32 sub_0806F520(); diff --git a/src/save.c b/src/save.c index 70f715ef..30cb0d41 100644 --- a/src/save.c +++ b/src/save.c @@ -22,7 +22,10 @@ u32 sub_0807D0A0(u16*, u16*, u32); u32 sub_0807D0EC(u32, const char*); u32 sub_0807D128(const Thing*); u16 sub_0807D1A4(u16*, u32); -u32 sub_0807D1D8(u32, const char*, u32); + +u32 DataRead(u32 address, u8* data, u32 size); +u32 DataWrite(u32 address, const u8* data, u32 size); +u32 DataCompare(u32 address, const u8* data, u32 size); static const char sSignatureLong[32] = "AGBZELDA:THE MINISH CAP:ZELDA 5"; @@ -107,10 +110,10 @@ u32 sub_0807CE90(void) { EEPROMConfigure(0x40); puVar1 = sub_0807D1C4(4); iVar3 = 0; - if (sub_0807D24C(puVar1->field_0x6, sSignatureLong, puVar1->field_0x0) == 0) { + if (DataCompare(puVar1->field_0x6, sSignatureLong, puVar1->field_0x0) == 0) { iVar3 += 1; } - if (sub_0807D24C(puVar1->field_0x8, sSignatureLong, puVar1->field_0x0) == 0) { + if (DataCompare(puVar1->field_0x8, sSignatureLong, puVar1->field_0x0) == 0) { iVar3 += 2; } if (iVar3 != 0) { @@ -121,8 +124,8 @@ u32 sub_0807CE90(void) { sub_0807CF68(1); sub_0807CF68(0); } - sub_0807D20C(puVar1->field_0x8, sSignatureLong, puVar1->field_0x0); - sub_0807D20C(puVar1->field_0x6, sSignatureLong, puVar1->field_0x0); + DataWrite(puVar1->field_0x8, sSignatureLong, puVar1->field_0x0); + DataWrite(puVar1->field_0x6, sSignatureLong, puVar1->field_0x0); } return 1; } @@ -184,11 +187,11 @@ u32 sub_0807CF88(u32 arg0, u8* arg1) { l1prep += sub_0807D1A4((u16*)arg1, ptr->field_0x0); thing.unk_1 = l1prep; thing.unk_2 = -(u32)l1prep; - e0 = sub_0807D20C(ptr->field_0x6, (const char*)arg1, ptr->field_0x0); + e0 = DataWrite(ptr->field_0x6, (const char*)arg1, ptr->field_0x0); if (e0) { e0 = sub_0807D184(ptr->field_0x2, (const char*)&thing.unk_1); } - e1 = sub_0807D20C(ptr->field_0x8, (const char*)arg1, ptr->field_0x0); + e1 = DataWrite(ptr->field_0x8, (const char*)arg1, ptr->field_0x0); if (e1) { e1 = sub_0807D184(ptr->field_0x4, (const char*)&thing.unk_1); } @@ -213,7 +216,7 @@ NONMATCH("asm/non_matching/save/sub_0807D008.inc", u32 sub_0807D008(u32 param_1, unk_s = sub_0807D1C4(param_1); t1 = sub_0807D0EC(unk_s->field_0x2, auStack32); if (t1 == 2) { - if ((sub_0807D1D8(unk_s->field_0x6, (char*)saveFile, unk_s->field_0x0) == 0) || + if ((DataRead(unk_s->field_0x6, (char*)saveFile, unk_s->field_0x0) == 0) || (sub_0807D0A0((u16*)auStack32, (u16*)saveFile, (u32)unk_s->field_0x0) == 0)) { t1 = 0; } else { @@ -222,7 +225,7 @@ NONMATCH("asm/non_matching/save/sub_0807D008.inc", u32 sub_0807D008(u32 param_1, } t2 = sub_0807D0EC(unk_s->field_0x4, auStack32); if (t2 == 2) { - if ((sub_0807D1D8(unk_s->field_0x8, (char*)saveFile, unk_s->field_0x0) != 0) && + if ((DataRead(unk_s->field_0x8, (char*)saveFile, unk_s->field_0x0) != 0) && (sub_0807D0A0((u16*)auStack32, (u16*)saveFile, (u32)unk_s->field_0x0) != 0)) { return 1; } @@ -271,12 +274,12 @@ END_NONMATCH u32 sub_0807D0EC(u32 unk_1, const char* unk_2) { u32 ret; - if (!sub_0807D1D8(unk_1, unk_2, 8)) { + if (!DataRead(unk_1, unk_2, 8)) { ret = 0; } else { ret = sub_0807D128((Thing*)unk_2); } - if (!ret && sub_0807D1D8(unk_1 + 8, unk_2, 8)) { + if (!ret && DataRead(unk_1 + 8, unk_2, 8)) { ret = sub_0807D128((Thing*)unk_2); } return ret; @@ -309,9 +312,9 @@ u32 sub_0807D128(const Thing* thing) { u32 sub_0807D184(u32 param_1, const char* param_2) { u32 uVar1; - uVar1 = sub_0807D20C(param_1, param_2, 8); + uVar1 = DataWrite(param_1, param_2, 8); if (uVar1 == 0) { - uVar1 = sub_0807D20C(param_1 + 8, param_2, 8); + uVar1 = DataWrite(param_1 + 8, param_2, 8); } return uVar1; } @@ -332,35 +335,40 @@ struct_0807D1C4* sub_0807D1C4(u32 unk_1) { return &gUnk_0811E4BC[unk_1]; } -// these three are basically the same and wrong by basically one instruction in the wrong place -NONMATCH("asm/non_matching/save/sub_0807D1D8.inc", u32 sub_0807D1D8(u32 unk_1, const char* unk_2, u32 unk_3)) { +bool32 DataRead(u32 address, u8* data, u32 size) { + size /= 8; + address /= 8; + while (size-- > 0) { + if (EEPROMRead(address, (u16*)data)) + return FALSE; + address++; + data += 8; + } + return TRUE; } -END_NONMATCH -NONMATCH("asm/non_matching/save/sub_0807D20C.inc", u32 sub_0807D20C(u32 unk_1, const char* unk_2, u32 unk_3)) { - unk_3 >>= 3; - unk_1 >>= 3; - while (unk_3-- > 0) { - if (EEPROMWrite0_8k_Check(unk_1, (u16*)unk_2)) { - EEPROMWrite0_8k_Check(unk_1, (u16*)gUnk_0811E4B4); - return 0; +bool32 DataWrite(u32 address, const u8* data, u32 size) { + size /= 8; + address /= 8; + while (size-- > 0) { + if (EEPROMWrite0_8k_Check(address, (u16*)data)) { + EEPROMWrite0_8k_Check(address, (u16*)gUnk_0811E4B4); + return FALSE; } - unk_1++; - unk_2 += 8; + address++; + data += 8; } - return 1; + return TRUE; } -END_NONMATCH -NONMATCH("asm/non_matching/save/sub_0807D24C.inc", u32 sub_0807D24C(u32 unk_1, const char* unk_2, u32 unk_3)) { - unk_3 >>= 3; - unk_1 >>= 3; - while (unk_3-- > 0) { - if (EEPROMCompare(unk_1, (u16*)unk_2)) - return 0; - unk_1++; - unk_2 += 8; +bool32 DataCompare(u32 address, const u8* data, u32 size) { + size /= 8; + address /= 8; + while (size-- > 0) { + if (EEPROMCompare(address, (u16*)data)) + return FALSE; + address++; + data += 8; } - return 1; + return TRUE; } -END_NONMATCH From a4d76a1c8714803cac9378108d4f5c7b19731e83 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Tue, 2 Mar 2021 16:17:07 +0100 Subject: [PATCH 02/14] use void* for data pointers --- include/functions.h | 1 - src/save.c | 28 +++++++++++++++------------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/include/functions.h b/include/functions.h index e2bce0a9..553d9ee6 100644 --- a/include/functions.h +++ b/include/functions.h @@ -216,7 +216,6 @@ extern void sub_08050384(); extern struct_0807D1C4* sub_0807D1C4(u32); extern void sub_0807CF68(u32); extern u32 sub_0807CF88(u32, u8*); -extern u32 sub_0807D184(u32, const char*); extern u32 sub_0806F520(); extern void sub_0806F4E8(Entity*); extern u32 sub_0806F3E4(Entity*); diff --git a/src/save.c b/src/save.c index 30cb0d41..a22d9579 100644 --- a/src/save.c +++ b/src/save.c @@ -23,9 +23,11 @@ u32 sub_0807D0EC(u32, const char*); u32 sub_0807D128(const Thing*); u16 sub_0807D1A4(u16*, u32); -u32 DataRead(u32 address, u8* data, u32 size); -u32 DataWrite(u32 address, const u8* data, u32 size); -u32 DataCompare(u32 address, const u8* data, u32 size); +u32 sub_0807D184(u32 address, const u8* data); + +u32 DataRead(u32 address, void* data, u32 size); +u32 DataWrite(u32 address, const void* data, u32 size); +u32 DataCompare(u32 address, const void* data, u32 size); static const char sSignatureLong[32] = "AGBZELDA:THE MINISH CAP:ZELDA 5"; @@ -309,12 +311,12 @@ u32 sub_0807D128(const Thing* thing) { return ret; } -u32 sub_0807D184(u32 param_1, const char* param_2) { +u32 sub_0807D184(u32 address, const u8* data) { u32 uVar1; - uVar1 = DataWrite(param_1, param_2, 8); + uVar1 = DataWrite(address, data, 8); if (uVar1 == 0) { - uVar1 = DataWrite(param_1 + 8, param_2, 8); + uVar1 = DataWrite(address + 8, data, 8); } return uVar1; } @@ -335,11 +337,11 @@ struct_0807D1C4* sub_0807D1C4(u32 unk_1) { return &gUnk_0811E4BC[unk_1]; } -bool32 DataRead(u32 address, u8* data, u32 size) { +bool32 DataRead(u32 address, void* data, u32 size) { size /= 8; address /= 8; while (size-- > 0) { - if (EEPROMRead(address, (u16*)data)) + if (EEPROMRead(address, data)) return FALSE; address++; data += 8; @@ -347,12 +349,12 @@ bool32 DataRead(u32 address, u8* data, u32 size) { return TRUE; } -bool32 DataWrite(u32 address, const u8* data, u32 size) { +bool32 DataWrite(u32 address, const void* data, u32 size) { size /= 8; address /= 8; while (size-- > 0) { - if (EEPROMWrite0_8k_Check(address, (u16*)data)) { - EEPROMWrite0_8k_Check(address, (u16*)gUnk_0811E4B4); + if (EEPROMWrite0_8k_Check(address, data)) { + EEPROMWrite0_8k_Check(address, (const u16*)gUnk_0811E4B4); return FALSE; } address++; @@ -361,11 +363,11 @@ bool32 DataWrite(u32 address, const u8* data, u32 size) { return TRUE; } -bool32 DataCompare(u32 address, const u8* data, u32 size) { +bool32 DataCompare(u32 address, const void* data, u32 size) { size /= 8; address /= 8; while (size-- > 0) { - if (EEPROMCompare(address, (u16*)data)) + if (EEPROMCompare(address, data)) return FALSE; address++; data += 8; From 8d22d46bc7d315662b75424abecfe3a83b159f47 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Tue, 2 Mar 2021 17:18:59 +0100 Subject: [PATCH 03/14] matched sub_0807D008 --- include/functions.h | 1 - src/save.c | 70 +++++++++++++++++++++------------------------ 2 files changed, 33 insertions(+), 38 deletions(-) diff --git a/include/functions.h b/include/functions.h index 553d9ee6..4d1a3a4e 100644 --- a/include/functions.h +++ b/include/functions.h @@ -213,7 +213,6 @@ extern void sub_0807CF48(u32); extern u32 sub_0807CF10(u8*); extern void sub_08056208(void); extern void sub_08050384(); -extern struct_0807D1C4* sub_0807D1C4(u32); extern void sub_0807CF68(u32); extern u32 sub_0807CF88(u32, u8*); extern u32 sub_0806F520(); diff --git a/src/save.c b/src/save.c index a22d9579..6ec84517 100644 --- a/src/save.c +++ b/src/save.c @@ -17,12 +17,13 @@ static SaveResult HandleSaveInProgress(u32); static SaveResult HandleSaveDone(u32); static SaveResult (*const sSaveHandlers[])(u32) = { HandleSaveInit, HandleSaveInProgress, HandleSaveDone }; +struct_0807D1C4* sub_0807D1C4(u32); u32 sub_0807D008(u32, SaveFile*); -u32 sub_0807D0A0(u16*, u16*, u32); -u32 sub_0807D0EC(u32, const char*); +u32 sub_0807D0A0(Thing*, u16*, u32); u32 sub_0807D128(const Thing*); u16 sub_0807D1A4(u16*, u32); +u32 sub_0807D0EC(u32 address, char* data); u32 sub_0807D184(u32 address, const u8* data); u32 DataRead(u32 address, void* data, u32 size); @@ -205,9 +206,9 @@ u32 sub_0807CF88(u32 arg0, u8* arg1) { return retval; } -NONMATCH("asm/non_matching/save/sub_0807D008.inc", u32 sub_0807D008(u32 param_1, SaveFile* saveFile)) { - u32 set_0; - char auStack32[8]; +u32 sub_0807D008(u32 param_1, SaveFile* saveFile) { + vu32 set_0; + Thing auStack32; struct_0807D1C4* unk_s; u32 t1; @@ -216,25 +217,25 @@ NONMATCH("asm/non_matching/save/sub_0807D008.inc", u32 sub_0807D008(u32 param_1, u32 temp; unk_s = sub_0807D1C4(param_1); - t1 = sub_0807D0EC(unk_s->field_0x2, auStack32); + t1 = sub_0807D0EC(unk_s->field_0x2, (char*)&auStack32); if (t1 == 2) { if ((DataRead(unk_s->field_0x6, (char*)saveFile, unk_s->field_0x0) == 0) || - (sub_0807D0A0((u16*)auStack32, (u16*)saveFile, (u32)unk_s->field_0x0) == 0)) { + (sub_0807D0A0(&auStack32, (u16*)saveFile, (u32)unk_s->field_0x0) == 0)) { t1 = 0; } else { return 1; } } - t2 = sub_0807D0EC(unk_s->field_0x4, auStack32); + t2 = sub_0807D0EC(unk_s->field_0x4, (char*)&auStack32); if (t2 == 2) { if ((DataRead(unk_s->field_0x8, (char*)saveFile, unk_s->field_0x0) != 0) && - (sub_0807D0A0((u16*)auStack32, (u16*)saveFile, (u32)unk_s->field_0x0) != 0)) { + (sub_0807D0A0(&auStack32, (u16*)saveFile, (u32)unk_s->field_0x0) != 0)) { return 1; } t2 = 0; } set_0 = 0; - CpuSet(&set_0, saveFile, unk_s->field_0x0 >> 2 | CPU_SET_SRC_FIXED | CPU_SET_32BIT); + CpuSet((u16*)&set_0, saveFile, unk_s->field_0x0 >> 2 | CPU_SET_SRC_FIXED | CPU_SET_32BIT); temp = t1 | t2; ret = 0; if (temp == 0) { @@ -242,47 +243,42 @@ NONMATCH("asm/non_matching/save/sub_0807D008.inc", u32 sub_0807D008(u32 param_1, } return ret; } -END_NONMATCH -NONMATCH("asm/non_matching/save/sub_0807D0A0.inc", u32 sub_0807D0A0(u16* unk_1, u16* unk_2, u32 unk_3)) { - u32 r0; +NONMATCH("asm/non_matching/save/sub_0807D0A0.inc", u32 sub_0807D0A0(Thing* unk_1, u16* unk_2, u32 unk_3)) { + u32 r0; - u32* u32_1 = (u32*)unk_1; + u16 u0; - u16 u0; - u32 u1; + u0 = sub_0807D1A4((u16*)&unk_1->unk_3, 4); + u0 = u0 + sub_0807D1A4(unk_2, unk_3); - u0 = sub_0807D1A4(unk_1 + 2, 4); - u0 = u0 + sub_0807D1A4(unk_2, unk_3); - - u1 = unk_1[0]; - if (u1 != u0) { - r0 = 0; - } else { - if (unk_1[1] == (-(u1 << 0x10) >> 0x10)) { - if (*(u32_1 + 1) != 'MCZ3') { - r0 = 0; - } else { - r0 = 1; - } - } else { + if (unk_1->unk_1 != u0) { r0 = 0; + } else { + if (unk_1->unk_2 == -unk_1->unk_1) { + if (unk_1->unk_3 != 'MCZ3') { + r0 = 0; + } else { + r0 = 1; + } + } else { + r0 = 0; + } } - } - return r0; + return r0; } END_NONMATCH -u32 sub_0807D0EC(u32 unk_1, const char* unk_2) { +u32 sub_0807D0EC(u32 address, char* data) { u32 ret; - if (!DataRead(unk_1, unk_2, 8)) { + if (!DataRead(address, data, 8)) { ret = 0; } else { - ret = sub_0807D128((Thing*)unk_2); + ret = sub_0807D128((Thing*)data); } - if (!ret && DataRead(unk_1 + 8, unk_2, 8)) { - ret = sub_0807D128((Thing*)unk_2); + if (!ret && DataRead(address + 8, data, 8)) { + ret = sub_0807D128((Thing*)data); } return ret; } From 323651db1b5059bfdb85166d4007527072307f4e Mon Sep 17 00:00:00 2001 From: Henny022p Date: Tue, 2 Mar 2021 17:21:08 +0100 Subject: [PATCH 04/14] matched sub_0807D008 --- asm/non_matching/save/sub_0807D008.inc | 81 -------------------------- 1 file changed, 81 deletions(-) delete mode 100644 asm/non_matching/save/sub_0807D008.inc diff --git a/asm/non_matching/save/sub_0807D008.inc b/asm/non_matching/save/sub_0807D008.inc deleted file mode 100644 index 2efde355..00000000 --- a/asm/non_matching/save/sub_0807D008.inc +++ /dev/null @@ -1,81 +0,0 @@ - - .syntax unified - - .text - - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - sub sp, #0xc - adds r7, r1, #0 - bl sub_0807D1C4 - adds r5, r0, #0 - ldrh r0, [r5, #2] - add r4, sp, #4 - adds r1, r4, #0 - bl sub_0807D0EC - adds r6, r0, #0 - mov r8, r4 - cmp r6, #2 - bne _0807D048 - ldrh r0, [r5, #6] - ldrh r2, [r5] - adds r1, r7, #0 - bl DataRead - cmp r0, #0 - beq _0807D046 - ldrh r2, [r5] - mov r0, r8 - adds r1, r7, #0 - bl sub_0807D0A0 - cmp r0, #0 - bne _0807D072 -_0807D046: - movs r6, #0 -_0807D048: - ldrh r0, [r5, #4] - mov r1, r8 - bl sub_0807D0EC - adds r4, r0, #0 - cmp r4, #2 - bne _0807D078 - ldrh r0, [r5, #8] - ldrh r2, [r5] - adds r1, r7, #0 - bl DataRead - cmp r0, #0 - beq _0807D076 - ldrh r2, [r5] - mov r0, r8 - adds r1, r7, #0 - bl sub_0807D0A0 - cmp r0, #0 - beq _0807D076 -_0807D072: - movs r0, #1 - b _0807D098 -_0807D076: - movs r4, #0 -_0807D078: - movs r0, #0 - str r0, [sp] - ldrh r2, [r5] - lsrs r2, r2, #2 - movs r0, #0xa0 - lsls r0, r0, #0x13 - orrs r2, r0 - mov r0, sp - adds r1, r7, #0 - bl CpuSet - orrs r6, r4 - movs r0, #0 - cmp r6, #0 - bne _0807D098 - subs r0, #1 -_0807D098: - add sp, #0xc - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - - .syntax divided From a45fa3f13d3e0df67b989010d9bdbc3b499c0953 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Tue, 2 Mar 2021 18:22:43 +0100 Subject: [PATCH 05/14] extracted gUnk_0811E4BC from baserom --- data/data_0811E454.s | 3 --- include/structures.h | 9 --------- src/save.c | 42 +++++++++++++++++++++++++++++------------- 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/data/data_0811E454.s b/data/data_0811E454.s index e1d26604..6c777193 100755 --- a/data/data_0811E454.s +++ b/data/data_0811E454.s @@ -4,9 +4,6 @@ .section .rodata .align 2 -gUnk_0811E4BC:: @ 0811E4BC - .incbin "baserom.gba", 0x11E4BC, 0x0000054 - gUnk_0811E510:: @ 0811E510 .incbin "baserom.gba", 0x11E510, 0x0000004 diff --git a/include/structures.h b/include/structures.h index f1758ae5..59811d6f 100644 --- a/include/structures.h +++ b/include/structures.h @@ -26,15 +26,6 @@ typedef struct { extern struct_02000040 gUnk_02000040; -typedef struct { - u16 field_0x0; - u16 field_0x2; - u16 field_0x4; - u16 field_0x6; - u16 field_0x8; - u16 field_0xa; -} struct_0807D1C4; - typedef struct { s32 signature; u8 field_0x4; diff --git a/src/save.c b/src/save.c index 6ec84517..5ae29136 100644 --- a/src/save.c +++ b/src/save.c @@ -7,17 +7,20 @@ typedef struct Thing { u32 unk_3; } Thing; -const u16 gUnk_0811E454[] = { 0x0, 0x0, 0x100, 0x200, 0x300, 0x400, 0x500, - 0x5C0, 0x680, 0x740, 0x800, 0x8C0, 0x9C0, 0xA80 }; - -const char gUnk_0811E470[6] = "LINK"; +typedef struct { + u16 field_0x0; + u16 field_0x2; + u16 field_0x4; + u16 field_0x6; + u16 field_0x8; + u16 field_0xa; +} struct_0807D1C4; static SaveResult HandleSaveInit(u32); static SaveResult HandleSaveInProgress(u32); static SaveResult HandleSaveDone(u32); -static SaveResult (*const sSaveHandlers[])(u32) = { HandleSaveInit, HandleSaveInProgress, HandleSaveDone }; -struct_0807D1C4* sub_0807D1C4(u32); +const struct_0807D1C4* sub_0807D1C4(u32); u32 sub_0807D008(u32, SaveFile*); u32 sub_0807D0A0(Thing*, u16*, u32); u32 sub_0807D128(const Thing*); @@ -30,6 +33,13 @@ u32 DataRead(u32 address, void* data, u32 size); u32 DataWrite(u32 address, const void* data, u32 size); u32 DataCompare(u32 address, const void* data, u32 size); +const u16 gUnk_0811E454[] = { 0x0, 0x0, 0x100, 0x200, 0x300, 0x400, 0x500, + 0x5C0, 0x680, 0x740, 0x800, 0x8C0, 0x9C0, 0xA80 }; + +const char gUnk_0811E470[6] = "LINK"; + +static SaveResult (*const sSaveHandlers[])(u32) = { HandleSaveInit, HandleSaveInProgress, HandleSaveDone }; + static const char sSignatureLong[32] = "AGBZELDA:THE MINISH CAP:ZELDA 5"; // Save file is untouched @@ -40,7 +50,13 @@ static const char sSaveDescDeleted[8] = "\xFF\xFF\xFF\xFF" "DelF"; const char gUnk_0811E4B4[8] = "DAMEDAME"; -extern struct_0807D1C4 gUnk_0811E4BC[]; +const struct_0807D1C4 gUnk_0811E4BC[7] = {{0x500, 0x30, 0x1030, 0x80, 0x1080, 0}, + {0x500, 0x40, 0x1040, 0x580, 0x1580, 0}, + {0x500, 0x50, 0x1050, 0xa80, 0x1a80, 0}, + {0x10, 0x20, 0x1020, 0x70, 0x1070, 0}, + {0x20, 0, 0, 0, 0x1000, 0}, + {0x20, 0x60, 0x1060, 0xf80, 0x1f80, 0}, + {0x8, 0xfa0, 0x1fa0, 0xfa0, 0x1fa0, 0}}; extern s16 gUnk_02021EE0[6]; @@ -106,7 +122,7 @@ SaveResult HandleSaveDone(u32 arg0) { } u32 sub_0807CE90(void) { - struct_0807D1C4* puVar1; + const struct_0807D1C4* puVar1; int iVar2; int iVar3; @@ -158,7 +174,7 @@ u32 sub_0807CF3C(SaveFile* arg0) { } void sub_0807CF48(u32 arg0) { - struct_0807D1C4* temp; + const struct_0807D1C4* temp; temp = sub_0807D1C4(arg0); sub_0807D184(temp->field_0x4, sSaveDescDeleted); @@ -166,7 +182,7 @@ void sub_0807CF48(u32 arg0) { } void sub_0807CF68(u32 arg0) { - struct_0807D1C4* temp; + const struct_0807D1C4* temp; const char* str; temp = sub_0807D1C4(arg0); @@ -179,7 +195,7 @@ u32 sub_0807CF88(u32 arg0, u8* arg1) { Thing thing; u32 retval; - struct_0807D1C4* ptr; + const struct_0807D1C4* ptr; u32 e0, e1; u16 l1prep; @@ -210,7 +226,7 @@ u32 sub_0807D008(u32 param_1, SaveFile* saveFile) { vu32 set_0; Thing auStack32; - struct_0807D1C4* unk_s; + const struct_0807D1C4* unk_s; u32 t1; u32 t2; u32 ret; @@ -329,7 +345,7 @@ u16 sub_0807D1A4(u16* unk_1, u32 unk_2) { return uVar1; } -struct_0807D1C4* sub_0807D1C4(u32 unk_1) { +const struct_0807D1C4* sub_0807D1C4(u32 unk_1) { return &gUnk_0811E4BC[unk_1]; } From b1f0281e012e29d4974cf590d2a44cff5889928d Mon Sep 17 00:00:00 2001 From: Henny022p Date: Tue, 2 Mar 2021 19:01:14 +0100 Subject: [PATCH 06/14] named SaveFileEEPROMAddresses and members --- src/save.c | 123 ++++++++++++++++++++++++++--------------------------- 1 file changed, 61 insertions(+), 62 deletions(-) diff --git a/src/save.c b/src/save.c index 5ae29136..0be67668 100644 --- a/src/save.c +++ b/src/save.c @@ -8,19 +8,18 @@ typedef struct Thing { } Thing; typedef struct { - u16 field_0x0; - u16 field_0x2; - u16 field_0x4; - u16 field_0x6; - u16 field_0x8; - u16 field_0xa; -} struct_0807D1C4; + u16 size; + u16 checksum1; + u16 checksum2; + u16 address1; + u16 address2; +} SaveFileEEPROMAddresses; static SaveResult HandleSaveInit(u32); static SaveResult HandleSaveInProgress(u32); static SaveResult HandleSaveDone(u32); -const struct_0807D1C4* sub_0807D1C4(u32); +const SaveFileEEPROMAddresses* GetSaveFileEEPROMAddresses(u32); u32 sub_0807D008(u32, SaveFile*); u32 sub_0807D0A0(Thing*, u16*, u32); u32 sub_0807D128(const Thing*); @@ -50,13 +49,13 @@ static const char sSaveDescDeleted[8] = "\xFF\xFF\xFF\xFF" "DelF"; const char gUnk_0811E4B4[8] = "DAMEDAME"; -const struct_0807D1C4 gUnk_0811E4BC[7] = {{0x500, 0x30, 0x1030, 0x80, 0x1080, 0}, - {0x500, 0x40, 0x1040, 0x580, 0x1580, 0}, - {0x500, 0x50, 0x1050, 0xa80, 0x1a80, 0}, - {0x10, 0x20, 0x1020, 0x70, 0x1070, 0}, - {0x20, 0, 0, 0, 0x1000, 0}, - {0x20, 0x60, 0x1060, 0xf80, 0x1f80, 0}, - {0x8, 0xfa0, 0x1fa0, 0xfa0, 0x1fa0, 0}}; +const SaveFileEEPROMAddresses gSaveFileEEPROMAddresses[] = { { 0x500, 0x30, 0x1030, 0x80, 0x1080 }, + { 0x500, 0x40, 0x1040, 0x580, 0x1580 }, + { 0x500, 0x50, 0x1050, 0xa80, 0x1a80 }, + { 0x10, 0x20, 0x1020, 0x70, 0x1070 }, + { 0x20, 0, 0, 0, 0x1000 }, + { 0x20, 0x60, 0x1060, 0xf80, 0x1f80 }, + { 0x8, 0xfa0, 0x1fa0, 0xfa0, 0x1fa0 } }; extern s16 gUnk_02021EE0[6]; @@ -122,17 +121,17 @@ SaveResult HandleSaveDone(u32 arg0) { } u32 sub_0807CE90(void) { - const struct_0807D1C4* puVar1; + const SaveFileEEPROMAddresses* eepromAddresses; int iVar2; int iVar3; EEPROMConfigure(0x40); - puVar1 = sub_0807D1C4(4); + eepromAddresses = GetSaveFileEEPROMAddresses(4); iVar3 = 0; - if (DataCompare(puVar1->field_0x6, sSignatureLong, puVar1->field_0x0) == 0) { + if (DataCompare(eepromAddresses->address1, sSignatureLong, eepromAddresses->size) == 0) { iVar3 += 1; } - if (DataCompare(puVar1->field_0x8, sSignatureLong, puVar1->field_0x0) == 0) { + if (DataCompare(eepromAddresses->address2, sSignatureLong, eepromAddresses->size) == 0) { iVar3 += 2; } if (iVar3 != 0) { @@ -143,8 +142,8 @@ u32 sub_0807CE90(void) { sub_0807CF68(1); sub_0807CF68(0); } - DataWrite(puVar1->field_0x8, sSignatureLong, puVar1->field_0x0); - DataWrite(puVar1->field_0x6, sSignatureLong, puVar1->field_0x0); + DataWrite(eepromAddresses->address2, sSignatureLong, eepromAddresses->size); + DataWrite(eepromAddresses->address1, sSignatureLong, eepromAddresses->size); } return 1; } @@ -174,45 +173,45 @@ u32 sub_0807CF3C(SaveFile* arg0) { } void sub_0807CF48(u32 arg0) { - const struct_0807D1C4* temp; + const SaveFileEEPROMAddresses* eepromAddresses; - temp = sub_0807D1C4(arg0); - sub_0807D184(temp->field_0x4, sSaveDescDeleted); - sub_0807D184(temp->field_0x2, sSaveDescDeleted); + eepromAddresses = GetSaveFileEEPROMAddresses(arg0); + sub_0807D184(eepromAddresses->checksum2, sSaveDescDeleted); + sub_0807D184(eepromAddresses->checksum1, sSaveDescDeleted); } void sub_0807CF68(u32 arg0) { - const struct_0807D1C4* temp; + const SaveFileEEPROMAddresses* eepromAddresses; const char* str; - temp = sub_0807D1C4(arg0); + eepromAddresses = GetSaveFileEEPROMAddresses(arg0); str = sSaveDescInit; - sub_0807D184(temp->field_0x4, str); - sub_0807D184(temp->field_0x2, str); + sub_0807D184(eepromAddresses->checksum2, str); + sub_0807D184(eepromAddresses->checksum1, str); } u32 sub_0807CF88(u32 arg0, u8* arg1) { Thing thing; u32 retval; - const struct_0807D1C4* ptr; + const SaveFileEEPROMAddresses* eepromAddresses; u32 e0, e1; u16 l1prep; - ptr = sub_0807D1C4(arg0); + eepromAddresses = GetSaveFileEEPROMAddresses(arg0); thing.unk_3 = 'MCZ3'; l1prep = sub_0807D1A4((u16*)&thing.unk_3, 4); - l1prep += sub_0807D1A4((u16*)arg1, ptr->field_0x0); + l1prep += sub_0807D1A4((u16*)arg1, eepromAddresses->size); thing.unk_1 = l1prep; thing.unk_2 = -(u32)l1prep; - e0 = DataWrite(ptr->field_0x6, (const char*)arg1, ptr->field_0x0); + e0 = DataWrite(eepromAddresses->address1, (const char*)arg1, eepromAddresses->size); if (e0) { - e0 = sub_0807D184(ptr->field_0x2, (const char*)&thing.unk_1); + e0 = sub_0807D184(eepromAddresses->checksum1, (const char*)&thing.unk_1); } - e1 = DataWrite(ptr->field_0x8, (const char*)arg1, ptr->field_0x0); + e1 = DataWrite(eepromAddresses->address2, (const char*)arg1, eepromAddresses->size); if (e1) { - e1 = sub_0807D184(ptr->field_0x4, (const char*)&thing.unk_1); + e1 = sub_0807D184(eepromAddresses->checksum2, (const char*)&thing.unk_1); } retval = 0; @@ -226,32 +225,32 @@ u32 sub_0807D008(u32 param_1, SaveFile* saveFile) { vu32 set_0; Thing auStack32; - const struct_0807D1C4* unk_s; + const SaveFileEEPROMAddresses* eepromAddresses; u32 t1; u32 t2; u32 ret; u32 temp; - unk_s = sub_0807D1C4(param_1); - t1 = sub_0807D0EC(unk_s->field_0x2, (char*)&auStack32); + eepromAddresses = GetSaveFileEEPROMAddresses(param_1); + t1 = sub_0807D0EC(eepromAddresses->checksum1, (char*)&auStack32); if (t1 == 2) { - if ((DataRead(unk_s->field_0x6, (char*)saveFile, unk_s->field_0x0) == 0) || - (sub_0807D0A0(&auStack32, (u16*)saveFile, (u32)unk_s->field_0x0) == 0)) { + if ((DataRead(eepromAddresses->address1, (char*)saveFile, eepromAddresses->size) == 0) || + (sub_0807D0A0(&auStack32, (u16*)saveFile, (u32)eepromAddresses->size) == 0)) { t1 = 0; } else { return 1; } } - t2 = sub_0807D0EC(unk_s->field_0x4, (char*)&auStack32); + t2 = sub_0807D0EC(eepromAddresses->checksum2, (char*)&auStack32); if (t2 == 2) { - if ((DataRead(unk_s->field_0x8, (char*)saveFile, unk_s->field_0x0) != 0) && - (sub_0807D0A0(&auStack32, (u16*)saveFile, (u32)unk_s->field_0x0) != 0)) { + if ((DataRead(eepromAddresses->address2, (char*)saveFile, eepromAddresses->size) != 0) && + (sub_0807D0A0(&auStack32, (u16*)saveFile, (u32)eepromAddresses->size) != 0)) { return 1; } t2 = 0; } set_0 = 0; - CpuSet((u16*)&set_0, saveFile, unk_s->field_0x0 >> 2 | CPU_SET_SRC_FIXED | CPU_SET_32BIT); + CpuSet((u16*)&set_0, saveFile, eepromAddresses->size >> 2 | CPU_SET_SRC_FIXED | CPU_SET_32BIT); temp = t1 | t2; ret = 0; if (temp == 0) { @@ -261,27 +260,27 @@ u32 sub_0807D008(u32 param_1, SaveFile* saveFile) { } NONMATCH("asm/non_matching/save/sub_0807D0A0.inc", u32 sub_0807D0A0(Thing* unk_1, u16* unk_2, u32 unk_3)) { - u32 r0; + u32 r0; - u16 u0; + u16 u0; - u0 = sub_0807D1A4((u16*)&unk_1->unk_3, 4); - u0 = u0 + sub_0807D1A4(unk_2, unk_3); + u0 = sub_0807D1A4((u16*)&unk_1->unk_3, 4); + u0 = u0 + sub_0807D1A4(unk_2, unk_3); - if (unk_1->unk_1 != u0) { - r0 = 0; - } else { - if (unk_1->unk_2 == -unk_1->unk_1) { - if (unk_1->unk_3 != 'MCZ3') { - r0 = 0; - } else { - r0 = 1; - } - } else { + if (unk_1->unk_1 != u0) { + r0 = 0; + } else { + if (unk_1->unk_2 == -unk_1->unk_1) { + if (unk_1->unk_3 != 'MCZ3') { r0 = 0; + } else { + r0 = 1; } + } else { + r0 = 0; } - return r0; + } + return r0; } END_NONMATCH @@ -345,8 +344,8 @@ u16 sub_0807D1A4(u16* unk_1, u32 unk_2) { return uVar1; } -const struct_0807D1C4* sub_0807D1C4(u32 unk_1) { - return &gUnk_0811E4BC[unk_1]; +const SaveFileEEPROMAddresses* GetSaveFileEEPROMAddresses(u32 unk_1) { + return &gSaveFileEEPROMAddresses[unk_1]; } bool32 DataRead(u32 address, void* data, u32 size) { From 7778b713861e080f23c5d3b2b0c1547e1f67f341 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Tue, 2 Mar 2021 19:04:33 +0100 Subject: [PATCH 07/14] renamed Thing to Checksum --- src/save.c | 60 +++++++++++++++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/save.c b/src/save.c index 0be67668..824d44a7 100644 --- a/src/save.c +++ b/src/save.c @@ -1,11 +1,11 @@ #include "save.h" #include "gba/eeprom.h" -typedef struct Thing { - u16 unk_1; - u16 unk_2; - u32 unk_3; -} Thing; +typedef struct Checksum { + u16 checksum1; + u16 checksum2; + u32 status; +} Checksum; typedef struct { u16 size; @@ -21,8 +21,8 @@ static SaveResult HandleSaveDone(u32); const SaveFileEEPROMAddresses* GetSaveFileEEPROMAddresses(u32); u32 sub_0807D008(u32, SaveFile*); -u32 sub_0807D0A0(Thing*, u16*, u32); -u32 sub_0807D128(const Thing*); +u32 sub_0807D0A0(Checksum*, u16*, u32); +u32 sub_0807D128(const Checksum*); u16 sub_0807D1A4(u16*, u32); u32 sub_0807D0EC(u32 address, char* data); @@ -191,7 +191,7 @@ void sub_0807CF68(u32 arg0) { } u32 sub_0807CF88(u32 arg0, u8* arg1) { - Thing thing; + Checksum checksum; u32 retval; const SaveFileEEPROMAddresses* eepromAddresses; @@ -200,18 +200,18 @@ u32 sub_0807CF88(u32 arg0, u8* arg1) { eepromAddresses = GetSaveFileEEPROMAddresses(arg0); - thing.unk_3 = 'MCZ3'; - l1prep = sub_0807D1A4((u16*)&thing.unk_3, 4); + checksum.status = 'MCZ3'; + l1prep = sub_0807D1A4((u16*)&checksum.status, 4); l1prep += sub_0807D1A4((u16*)arg1, eepromAddresses->size); - thing.unk_1 = l1prep; - thing.unk_2 = -(u32)l1prep; + checksum.checksum1 = l1prep; + checksum.checksum2 = -(u32)l1prep; e0 = DataWrite(eepromAddresses->address1, (const char*)arg1, eepromAddresses->size); if (e0) { - e0 = sub_0807D184(eepromAddresses->checksum1, (const char*)&thing.unk_1); + e0 = sub_0807D184(eepromAddresses->checksum1, (const char*)&checksum.checksum1); } e1 = DataWrite(eepromAddresses->address2, (const char*)arg1, eepromAddresses->size); if (e1) { - e1 = sub_0807D184(eepromAddresses->checksum2, (const char*)&thing.unk_1); + e1 = sub_0807D184(eepromAddresses->checksum2, (const char*)&checksum.checksum1); } retval = 0; @@ -223,7 +223,7 @@ u32 sub_0807CF88(u32 arg0, u8* arg1) { u32 sub_0807D008(u32 param_1, SaveFile* saveFile) { vu32 set_0; - Thing auStack32; + Checksum checksum; const SaveFileEEPROMAddresses* eepromAddresses; u32 t1; @@ -232,19 +232,19 @@ u32 sub_0807D008(u32 param_1, SaveFile* saveFile) { u32 temp; eepromAddresses = GetSaveFileEEPROMAddresses(param_1); - t1 = sub_0807D0EC(eepromAddresses->checksum1, (char*)&auStack32); + t1 = sub_0807D0EC(eepromAddresses->checksum1, (char*)&checksum); if (t1 == 2) { if ((DataRead(eepromAddresses->address1, (char*)saveFile, eepromAddresses->size) == 0) || - (sub_0807D0A0(&auStack32, (u16*)saveFile, (u32)eepromAddresses->size) == 0)) { + (sub_0807D0A0(&checksum, (u16*)saveFile, (u32)eepromAddresses->size) == 0)) { t1 = 0; } else { return 1; } } - t2 = sub_0807D0EC(eepromAddresses->checksum2, (char*)&auStack32); + t2 = sub_0807D0EC(eepromAddresses->checksum2, (char*)&checksum); if (t2 == 2) { if ((DataRead(eepromAddresses->address2, (char*)saveFile, eepromAddresses->size) != 0) && - (sub_0807D0A0(&auStack32, (u16*)saveFile, (u32)eepromAddresses->size) != 0)) { + (sub_0807D0A0(&checksum, (u16*)saveFile, (u32)eepromAddresses->size) != 0)) { return 1; } t2 = 0; @@ -259,19 +259,19 @@ u32 sub_0807D008(u32 param_1, SaveFile* saveFile) { return ret; } -NONMATCH("asm/non_matching/save/sub_0807D0A0.inc", u32 sub_0807D0A0(Thing* unk_1, u16* unk_2, u32 unk_3)) { +NONMATCH("asm/non_matching/save/sub_0807D0A0.inc", u32 sub_0807D0A0(Checksum* unk_1, u16* unk_2, u32 unk_3)) { u32 r0; u16 u0; - u0 = sub_0807D1A4((u16*)&unk_1->unk_3, 4); + u0 = sub_0807D1A4((u16*)&unk_1->status, 4); u0 = u0 + sub_0807D1A4(unk_2, unk_3); - if (unk_1->unk_1 != u0) { + if (unk_1->checksum1 != u0) { r0 = 0; } else { - if (unk_1->unk_2 == -unk_1->unk_1) { - if (unk_1->unk_3 != 'MCZ3') { + if (unk_1->checksum2 == -unk_1->checksum1) { + if (unk_1->status != 'MCZ3') { r0 = 0; } else { r0 = 1; @@ -290,19 +290,19 @@ u32 sub_0807D0EC(u32 address, char* data) { if (!DataRead(address, data, 8)) { ret = 0; } else { - ret = sub_0807D128((Thing*)data); + ret = sub_0807D128((Checksum*)data); } if (!ret && DataRead(address + 8, data, 8)) { - ret = sub_0807D128((Thing*)data); + ret = sub_0807D128((Checksum*)data); } return ret; } -u32 sub_0807D128(const Thing* thing) { +u32 sub_0807D128(const Checksum* checksum) { u32 ret; - switch (thing->unk_3) { + switch (checksum->status) { case 'MCZ3': - if (thing->unk_1 + thing->unk_2 == 0x10000) { + if (checksum->checksum1 + checksum->checksum2 == 0x10000) { ret = 2; } else { ret = 0; @@ -311,7 +311,7 @@ u32 sub_0807D128(const Thing* thing) { case 'FleD': case 'TINI': ret = 0; - if ((thing->unk_1 & thing->unk_2) == 0xffff) { + if ((checksum->checksum1 & checksum->checksum2) == 0xffff) { ret = 1; } break; From 72f41cb594dc8f402a1ea4573beb45645fb93caa Mon Sep 17 00:00:00 2001 From: Henny022p Date: Tue, 2 Mar 2021 19:55:34 +0100 Subject: [PATCH 08/14] naming and documenting stuff --- asm/code_080A3480.s | 2 +- asm/code_080A5574.s | 2 +- include/save.h | 2 +- src/fileScreen.c | 10 ++-- src/game.c | 2 +- src/save.c | 131 ++++++++++++++++++++++++++------------------ 6 files changed, 88 insertions(+), 61 deletions(-) diff --git a/asm/code_080A3480.s b/asm/code_080A3480.s index 9cf47673..a8e21e41 100644 --- a/asm/code_080A3480.s +++ b/asm/code_080A3480.s @@ -807,7 +807,7 @@ _080A3A9A: _080A3AB4: .4byte gMenu _080A3AB8: movs r0, #0 - bl sub_0807CDA4 + bl HandleSave adds r1, r0, #0 ldr r4, _080A3AD8 @ =gMenu strb r1, [r4] diff --git a/asm/code_080A5574.s b/asm/code_080A5574.s index 0700fdd6..cbe07816 100644 --- a/asm/code_080A5574.s +++ b/asm/code_080A5574.s @@ -631,7 +631,7 @@ _080A5A52: sub_080A5A54: @ 0x080A5A54 push {lr} movs r0, #0 - bl sub_0807CDA4 + bl HandleSave adds r1, r0, #0 cmp r1, #0 beq _080A5A8A diff --git a/include/save.h b/include/save.h index eaf1eaf5..92c0a1bd 100644 --- a/include/save.h +++ b/include/save.h @@ -21,7 +21,7 @@ typedef enum { SAVE_DONE, } SaveState; -extern SaveResult sub_0807CDA4(SaveState state); +extern SaveResult HandleSave(u32 arg0); typedef struct { /*0x000*/ u8 filler0[0x2]; diff --git a/src/fileScreen.c b/src/fileScreen.c index 15280b3d..f66a4bf1 100644 --- a/src/fileScreen.c +++ b/src/fileScreen.c @@ -697,7 +697,7 @@ void sub_08050DE4(void) { } void sub_08050E88(void) { - if (sub_0807CDA4(2)) + if (HandleSave(2)) SetFileSelectState(0); } @@ -792,7 +792,7 @@ NONMATCH("asm/non_matching/fileScreen/sub_08050EF4.inc", void sub_08050EF4(void) END_NONMATCH void sub_08050FFC(void) { - switch (sub_0807CDA4(0)) { + switch (HandleSave(0)) { case SAVE_ERROR: gMenu.transitionTimer = 0x1e; sub_0805194C(gUnk_02019EE0.unk6); @@ -856,7 +856,7 @@ void sub_080513A8(void) { } void sub_080513C0(void) { - switch (sub_0807CDA4(0)) { + switch (HandleSave(0)) { case 1: gUnk_02019EE0.saveStatus[gUnk_02019EE0.unk6] = 1; sub_080A7114(3); @@ -1046,7 +1046,7 @@ void sub_080515D4(void) { } void sub_080516E0(void) { - if (sub_0807CDA4(1)) { + if (HandleSave(1)) { sub_0805194C(gUnk_02019EE0.unk6); sub_08050AFC(gUnk_02019EE0.unk6); gMenu.transitionTimer = 2; @@ -1142,7 +1142,7 @@ void sub_080517EC(void) { void sub_08051874(void) { s32 temp; gUnk_02000000->saveFileId = gUnk_02019EE0.unk7; - temp = sub_0807CDA4(0); + temp = HandleSave(0); gUnk_02019EE0.saveStatus[gUnk_02019EE0.unk7] = temp; switch (temp) { case 1: diff --git a/src/game.c b/src/game.c index b56f4836..db28c2ab 100644 --- a/src/game.c +++ b/src/game.c @@ -118,7 +118,7 @@ void sub_080521A0(void) { gMenu.transitionTimer--; break; case 2: - temp3 = sub_0807CDA4(0); + temp3 = HandleSave(0); gMenu.field_0x0 = temp3; switch (temp3) { case 1: diff --git a/src/save.c b/src/save.c index 824d44a7..59977b13 100644 --- a/src/save.c +++ b/src/save.c @@ -1,11 +1,11 @@ #include "save.h" #include "gba/eeprom.h" -typedef struct Checksum { +typedef struct SaveFileStatus { u16 checksum1; u16 checksum2; u32 status; -} Checksum; +} SaveFileStatus; typedef struct { u16 size; @@ -21,12 +21,12 @@ static SaveResult HandleSaveDone(u32); const SaveFileEEPROMAddresses* GetSaveFileEEPROMAddresses(u32); u32 sub_0807D008(u32, SaveFile*); -u32 sub_0807D0A0(Checksum*, u16*, u32); -u32 sub_0807D128(const Checksum*); +u32 sub_0807D0A0(SaveFileStatus*, u16*, u32); u16 sub_0807D1A4(u16*, u32); -u32 sub_0807D0EC(u32 address, char* data); -u32 sub_0807D184(u32 address, const u8* data); +u32 ReadSaveFileStatus(u32 address, SaveFileStatus* fileStatus); +u32 ParseSaveFileStatus(const SaveFileStatus* fileStatus); +u32 WriteSaveFileStatus(u32 address, const SaveFileStatus* fileStatus); u32 DataRead(u32 address, void* data, u32 size); u32 DataWrite(u32 address, const void* data, u32 size); @@ -63,7 +63,7 @@ void sub_0807CD9C() { sub_080530C8(); } -SaveResult sub_0807CDA4(u32 arg0) { +SaveResult HandleSave(u32 arg0) { return sSaveHandlers[gMenu.storyPanelIndex](arg0); } @@ -122,7 +122,6 @@ SaveResult HandleSaveDone(u32 arg0) { u32 sub_0807CE90(void) { const SaveFileEEPROMAddresses* eepromAddresses; - int iVar2; int iVar3; EEPROMConfigure(0x40); @@ -176,8 +175,8 @@ void sub_0807CF48(u32 arg0) { const SaveFileEEPROMAddresses* eepromAddresses; eepromAddresses = GetSaveFileEEPROMAddresses(arg0); - sub_0807D184(eepromAddresses->checksum2, sSaveDescDeleted); - sub_0807D184(eepromAddresses->checksum1, sSaveDescDeleted); + WriteSaveFileStatus(eepromAddresses->checksum2, (const SaveFileStatus*)sSaveDescDeleted); + WriteSaveFileStatus(eepromAddresses->checksum1, (const SaveFileStatus*)sSaveDescDeleted); } void sub_0807CF68(u32 arg0) { @@ -186,44 +185,44 @@ void sub_0807CF68(u32 arg0) { eepromAddresses = GetSaveFileEEPROMAddresses(arg0); str = sSaveDescInit; - sub_0807D184(eepromAddresses->checksum2, str); - sub_0807D184(eepromAddresses->checksum1, str); + WriteSaveFileStatus(eepromAddresses->checksum2, (const SaveFileStatus*)str); + WriteSaveFileStatus(eepromAddresses->checksum1, (const SaveFileStatus*)str); } u32 sub_0807CF88(u32 arg0, u8* arg1) { - Checksum checksum; + SaveFileStatus fileStatus; - u32 retval; + u32 ret; const SaveFileEEPROMAddresses* eepromAddresses; - u32 e0, e1; - u16 l1prep; + bool32 write1success, write2success; + u16 checksum; eepromAddresses = GetSaveFileEEPROMAddresses(arg0); - checksum.status = 'MCZ3'; - l1prep = sub_0807D1A4((u16*)&checksum.status, 4); - l1prep += sub_0807D1A4((u16*)arg1, eepromAddresses->size); - checksum.checksum1 = l1prep; - checksum.checksum2 = -(u32)l1prep; - e0 = DataWrite(eepromAddresses->address1, (const char*)arg1, eepromAddresses->size); - if (e0) { - e0 = sub_0807D184(eepromAddresses->checksum1, (const char*)&checksum.checksum1); + fileStatus.status = 'MCZ3'; + checksum = sub_0807D1A4((u16*)&fileStatus.status, 4); + checksum += sub_0807D1A4((u16*)arg1, eepromAddresses->size); + fileStatus.checksum1 = checksum; + fileStatus.checksum2 = -(u32)checksum; + write1success = DataWrite(eepromAddresses->address1, arg1, eepromAddresses->size); + if (write1success) { + write1success = WriteSaveFileStatus(eepromAddresses->checksum1, (const SaveFileStatus*)&fileStatus.checksum1); } - e1 = DataWrite(eepromAddresses->address2, (const char*)arg1, eepromAddresses->size); - if (e1) { - e1 = sub_0807D184(eepromAddresses->checksum2, (const char*)&checksum.checksum1); + write2success = DataWrite(eepromAddresses->address2, arg1, eepromAddresses->size); + if (write2success) { + write2success = WriteSaveFileStatus(eepromAddresses->checksum2, (const SaveFileStatus*)&fileStatus.checksum1); } - retval = 0; - if (e0 || e1) { - retval = 1; + ret = 0; + if (write1success || write2success) { + ret = 1; } - return retval; + return ret; } u32 sub_0807D008(u32 param_1, SaveFile* saveFile) { vu32 set_0; - Checksum checksum; + SaveFileStatus fileStatus; const SaveFileEEPROMAddresses* eepromAddresses; u32 t1; @@ -232,19 +231,19 @@ u32 sub_0807D008(u32 param_1, SaveFile* saveFile) { u32 temp; eepromAddresses = GetSaveFileEEPROMAddresses(param_1); - t1 = sub_0807D0EC(eepromAddresses->checksum1, (char*)&checksum); + t1 = ReadSaveFileStatus(eepromAddresses->checksum1, &fileStatus); if (t1 == 2) { if ((DataRead(eepromAddresses->address1, (char*)saveFile, eepromAddresses->size) == 0) || - (sub_0807D0A0(&checksum, (u16*)saveFile, (u32)eepromAddresses->size) == 0)) { + (sub_0807D0A0(&fileStatus, (u16*)saveFile, (u32)eepromAddresses->size) == 0)) { t1 = 0; } else { return 1; } } - t2 = sub_0807D0EC(eepromAddresses->checksum2, (char*)&checksum); + t2 = ReadSaveFileStatus(eepromAddresses->checksum2, &fileStatus); if (t2 == 2) { if ((DataRead(eepromAddresses->address2, (char*)saveFile, eepromAddresses->size) != 0) && - (sub_0807D0A0(&checksum, (u16*)saveFile, (u32)eepromAddresses->size) != 0)) { + (sub_0807D0A0(&fileStatus, (u16*)saveFile, (u32)eepromAddresses->size) != 0)) { return 1; } t2 = 0; @@ -259,7 +258,7 @@ u32 sub_0807D008(u32 param_1, SaveFile* saveFile) { return ret; } -NONMATCH("asm/non_matching/save/sub_0807D0A0.inc", u32 sub_0807D0A0(Checksum* unk_1, u16* unk_2, u32 unk_3)) { +NONMATCH("asm/non_matching/save/sub_0807D0A0.inc", u32 sub_0807D0A0(SaveFileStatus* unk_1, u16* unk_2, u32 unk_3)) { u32 r0; u16 u0; @@ -284,25 +283,32 @@ NONMATCH("asm/non_matching/save/sub_0807D0A0.inc", u32 sub_0807D0A0(Checksum* un } END_NONMATCH -u32 sub_0807D0EC(u32 address, char* data) { +u32 ReadSaveFileStatus(u32 address, SaveFileStatus* fileStatus) { u32 ret; - if (!DataRead(address, data, 8)) { + if (!DataRead(address, fileStatus, 8)) { ret = 0; } else { - ret = sub_0807D128((Checksum*)data); + ret = ParseSaveFileStatus(fileStatus); } - if (!ret && DataRead(address + 8, data, 8)) { - ret = sub_0807D128((Checksum*)data); + if (!ret && DataRead(address + 8, fileStatus, 8)) { + ret = ParseSaveFileStatus(fileStatus); } return ret; } -u32 sub_0807D128(const Checksum* checksum) { +/** + * 2 for valid existing file + * 1 for valid empty file + * 0 for bad file + * @param fileStatus + * @return + */ +u32 ParseSaveFileStatus(const SaveFileStatus* fileStatus) { u32 ret; - switch (checksum->status) { + switch (fileStatus->status) { case 'MCZ3': - if (checksum->checksum1 + checksum->checksum2 == 0x10000) { + if (fileStatus->checksum1 + fileStatus->checksum2 == 0x10000) { ret = 2; } else { ret = 0; @@ -311,7 +317,7 @@ u32 sub_0807D128(const Checksum* checksum) { case 'FleD': case 'TINI': ret = 0; - if ((checksum->checksum1 & checksum->checksum2) == 0xffff) { + if ((fileStatus->checksum1 & fileStatus->checksum2) == 0xffff) { ret = 1; } break; @@ -322,14 +328,14 @@ u32 sub_0807D128(const Checksum* checksum) { return ret; } -u32 sub_0807D184(u32 address, const u8* data) { - u32 uVar1; +bool32 WriteSaveFileStatus(u32 address, const struct SaveFileStatus* fileStatus) { + bool32 success; - uVar1 = DataWrite(address, data, 8); - if (uVar1 == 0) { - uVar1 = DataWrite(address + 8, data, 8); + success = DataWrite(address, fileStatus, 8); + if (!success) { + success = DataWrite(address + 8, fileStatus, 8); } - return uVar1; + return success; } u16 sub_0807D1A4(u16* unk_1, u32 unk_2) { @@ -348,6 +354,13 @@ const SaveFileEEPROMAddresses* GetSaveFileEEPROMAddresses(u32 unk_1) { return &gSaveFileEEPROMAddresses[unk_1]; } +/** + * read arbitrary data from EEPROM + * @param address EEPROM address + * @param data buffer to read into + * @param size size in bytes to read + * @return TRUE on success + */ bool32 DataRead(u32 address, void* data, u32 size) { size /= 8; address /= 8; @@ -360,6 +373,13 @@ bool32 DataRead(u32 address, void* data, u32 size) { return TRUE; } +/** + * write arbitrary data to EEPROM + * @param address EEPROM address + * @param data buffer to write from + * @param size size in bytes to write + * @return TRUE on success + */ bool32 DataWrite(u32 address, const void* data, u32 size) { size /= 8; address /= 8; @@ -374,6 +394,13 @@ bool32 DataWrite(u32 address, const void* data, u32 size) { return TRUE; } +/** + * compare arbitrary data with EEPROM + * @param address EEPROM address + * @param data buffer to compare to + * @param size size in bytes to compare + * @return TRUE on success + */ bool32 DataCompare(u32 address, const void* data, u32 size) { size /= 8; address /= 8; From dcc674f55fbc20a4673d0637f8bb438b589f6d6a Mon Sep 17 00:00:00 2001 From: Henny022p Date: Tue, 2 Mar 2021 21:47:19 +0100 Subject: [PATCH 09/14] naming and documenting stuff --- asm/non_matching/save/sub_0807D0A0.inc | 4 +- include/functions.h | 4 - include/main.h | 1 - include/save.h | 3 + src/fileScreen.c | 2 +- src/main.c | 2 +- src/save.c | 133 +++++++++++++------------ 7 files changed, 75 insertions(+), 74 deletions(-) diff --git a/asm/non_matching/save/sub_0807D0A0.inc b/asm/non_matching/save/sub_0807D0A0.inc index 9bec41a8..3efab014 100644 --- a/asm/non_matching/save/sub_0807D0A0.inc +++ b/asm/non_matching/save/sub_0807D0A0.inc @@ -9,13 +9,13 @@ adds r6, r2, #0 adds r0, r7, #4 movs r1, #4 - bl sub_0807D1A4 + bl CalculateChecksum adds r4, r0, #0 lsls r4, r4, #0x10 lsrs r4, r4, #0x10 adds r0, r5, #0 adds r1, r6, #0 - bl sub_0807D1A4 + bl CalculateChecksum adds r4, r4, r0 lsls r4, r4, #0x10 lsrs r4, r4, #0x10 diff --git a/include/functions.h b/include/functions.h index 4d1a3a4e..20dab648 100644 --- a/include/functions.h +++ b/include/functions.h @@ -208,13 +208,9 @@ extern u32 sub_0801766C(Entity*); extern void sub_08004168(Entity*); extern u32 sub_08052638(u32); extern void InitDMA(void); -extern u32 sub_0807CF08(u32, u8*); -extern void sub_0807CF48(u32); extern u32 sub_0807CF10(u8*); extern void sub_08056208(void); extern void sub_08050384(); -extern void sub_0807CF68(u32); -extern u32 sub_0807CF88(u32, u8*); extern u32 sub_0806F520(); extern void sub_0806F4E8(Entity*); extern u32 sub_0806F3E4(Entity*); diff --git a/include/main.h b/include/main.h index 6ab823a6..39514ff7 100644 --- a/include/main.h +++ b/include/main.h @@ -80,7 +80,6 @@ extern UI gUnk_02032EC0; void InitScreen(); extern void InitSound(void); -extern void sub_0807CE90(void); extern void sub_080560B8(void); extern void sub_08056208(void); extern void sub_0804FFE4(void); diff --git a/include/save.h b/include/save.h index 92c0a1bd..41c6166b 100644 --- a/include/save.h +++ b/include/save.h @@ -46,7 +46,10 @@ typedef struct { extern SaveFile gSave; +u32 InitSaveData(void); + s32 sub_0807CF28(u32, SaveFile*); u32 sub_0807CF30(SaveFile*); +void SetFileStatusDeleted(u32 index); #endif \ No newline at end of file diff --git a/src/fileScreen.c b/src/fileScreen.c index f66a4bf1..836610ae 100644 --- a/src/fileScreen.c +++ b/src/fileScreen.c @@ -234,7 +234,7 @@ static void sub_08050624(u32 idx) { int status = sub_0807CF28(idx, saveFile); switch (status) { case SAVE_DELETED: - sub_0807CF48(idx); + SetFileStatusDeleted(idx); // fallthrough case SAVE_EMPTY: sub_0805194C(idx); diff --git a/src/main.c b/src/main.c index eb0d9df1..021f7258 100644 --- a/src/main.c +++ b/src/main.c @@ -26,7 +26,7 @@ void MainLoop(void) { sub_08055F70(); InitSound(); InitDMA(); - sub_0807CE90(); + InitSaveData(); sub_080560B8(); sub_08056208(); gUnk_02000010.field_0x4 = 193; diff --git a/src/save.c b/src/save.c index 59977b13..9b5e3c5a 100644 --- a/src/save.c +++ b/src/save.c @@ -20,9 +20,12 @@ static SaveResult HandleSaveInProgress(u32); static SaveResult HandleSaveDone(u32); const SaveFileEEPROMAddresses* GetSaveFileEEPROMAddresses(u32); -u32 sub_0807D008(u32, SaveFile*); +u32 DataDoubleReadWithStatus(u32, SaveFile* saveFile); +u32 DataDoubleWriteWithStatus(u32, SaveFile* saveFile); u32 sub_0807D0A0(SaveFileStatus*, u16*, u32); -u16 sub_0807D1A4(u16*, u32); +u16 CalculateChecksum(u16* data, u32); +u32 WriteSaveFile(u32 index, SaveFile* saveFile); +void SetFileStatusInit(u32 index); u32 ReadSaveFileStatus(u32 address, SaveFileStatus* fileStatus); u32 ParseSaveFileStatus(const SaveFileStatus* fileStatus); @@ -42,11 +45,9 @@ static SaveResult (*const sSaveHandlers[])(u32) = { HandleSaveInit, HandleSaveIn static const char sSignatureLong[32] = "AGBZELDA:THE MINISH CAP:ZELDA 5"; // Save file is untouched -static const char sSaveDescInit[8] = "\xFF\xFF\xFF\xFF" - "INIT"; +static const SaveFileStatus sSaveDescInit = { 0xffff, 0xffff, 'TINI' }; // Save file is deleted -static const char sSaveDescDeleted[8] = "\xFF\xFF\xFF\xFF" - "DelF"; +static const SaveFileStatus sSaveDescDeleted = { 0xffff, 0xffff, 'FleD' }; const char gUnk_0811E4B4[8] = "DAMEDAME"; const SaveFileEEPROMAddresses gSaveFileEEPROMAddresses[] = { { 0x500, 0x30, 0x1030, 0x80, 0x1080 }, @@ -71,7 +72,7 @@ SaveResult HandleSaveInit(u32 arg0) { gUnk_02021EE0[5] -= 8; if (gUnk_02021EE0[4] <= 0) { gMenu.field_0xa = 8; - gMenu.storyPanelIndex = 1; + gMenu.storyPanelIndex = SAVE_IN_PROGRESS; } return SAVE_BUSY; } @@ -83,10 +84,10 @@ SaveResult HandleSaveInProgress(u32 arg0) { InitDMA(); switch (arg0) { case 0: - temp = sub_0807CF08(gUnk_02000000->saveFileId, gSave.filler0); + temp = WriteSaveFile(gUnk_02000000->saveFileId, &gSave); break; case 1: - sub_0807CF48(gUnk_02000000->saveFileId); + SetFileStatusDeleted(gUnk_02000000->saveFileId); temp = 1; break; case 2: @@ -94,7 +95,7 @@ SaveResult HandleSaveInProgress(u32 arg0) { break; } gMenu.field_0xa = temp; - gMenu.storyPanelIndex = 2; + gMenu.storyPanelIndex = SAVE_DONE; sub_08056208(); } else { gMenu.field_0xa--; @@ -110,7 +111,7 @@ SaveResult HandleSaveDone(u32 arg0) { if (gUnk_02021EE0[3] <= gUnk_02021EE0[5]) { gUnk_02021EE0[5] = gUnk_02021EE0[3]; sub_08050384(); - gMenu.storyPanelIndex = 0; + gMenu.storyPanelIndex = SAVE_INIT; if (gMenu.field_0xa == 1) { result = SAVE_OK; } else { @@ -120,7 +121,7 @@ SaveResult HandleSaveDone(u32 arg0) { return result; } -u32 sub_0807CE90(void) { +u32 InitSaveData(void) { const SaveFileEEPROMAddresses* eepromAddresses; int iVar3; @@ -135,11 +136,11 @@ u32 sub_0807CE90(void) { } if (iVar3 != 0) { if (iVar3 == 3) { - sub_0807CF68(5); - sub_0807CF68(3); - sub_0807CF68(2); - sub_0807CF68(1); - sub_0807CF68(0); + SetFileStatusInit(5); + SetFileStatusInit(3); + SetFileStatusInit(2); + SetFileStatusInit(1); + SetFileStatusInit(0); } DataWrite(eepromAddresses->address2, sSignatureLong, eepromAddresses->size); DataWrite(eepromAddresses->address1, sSignatureLong, eepromAddresses->size); @@ -147,49 +148,49 @@ u32 sub_0807CE90(void) { return 1; } -u32 sub_0807CF08(u32 arg0, u8* arg1) { - return sub_0807CF88(arg0, arg1); +u32 WriteSaveFile(u32 index, SaveFile* saveFile) { + return DataDoubleWriteWithStatus(index, saveFile); } u32 sub_0807CF10(u8* arg0) { - return sub_0807CF88(3, arg0); + return DataDoubleWriteWithStatus(3, (void*)arg0); } u32 sub_0807CF1C(u8* arg0) { - return sub_0807CF88(5, arg0); + return DataDoubleWriteWithStatus(5, (void*)arg0); } -s32 sub_0807CF28(u32 arg0, SaveFile* arg1) { - return sub_0807D008(arg0, arg1); +s32 sub_0807CF28(u32 arg0, SaveFile* saveFile) { + return DataDoubleReadWithStatus(arg0, saveFile); } u32 sub_0807CF30(SaveFile* arg0) { - return sub_0807D008(3, arg0); + return DataDoubleReadWithStatus(3, arg0); } u32 sub_0807CF3C(SaveFile* arg0) { - return sub_0807D008(5, arg0); + return DataDoubleReadWithStatus(5, arg0); } -void sub_0807CF48(u32 arg0) { +void SetFileStatusDeleted(u32 index) { const SaveFileEEPROMAddresses* eepromAddresses; - eepromAddresses = GetSaveFileEEPROMAddresses(arg0); - WriteSaveFileStatus(eepromAddresses->checksum2, (const SaveFileStatus*)sSaveDescDeleted); - WriteSaveFileStatus(eepromAddresses->checksum1, (const SaveFileStatus*)sSaveDescDeleted); + eepromAddresses = GetSaveFileEEPROMAddresses(index); + WriteSaveFileStatus(eepromAddresses->checksum2, &sSaveDescDeleted); + WriteSaveFileStatus(eepromAddresses->checksum1, &sSaveDescDeleted); } -void sub_0807CF68(u32 arg0) { +void SetFileStatusInit(u32 index) { const SaveFileEEPROMAddresses* eepromAddresses; - const char* str; + const SaveFileStatus* fileStatus; - eepromAddresses = GetSaveFileEEPROMAddresses(arg0); - str = sSaveDescInit; - WriteSaveFileStatus(eepromAddresses->checksum2, (const SaveFileStatus*)str); - WriteSaveFileStatus(eepromAddresses->checksum1, (const SaveFileStatus*)str); + eepromAddresses = GetSaveFileEEPROMAddresses(index); + fileStatus = &sSaveDescInit; + WriteSaveFileStatus(eepromAddresses->checksum2, fileStatus); + WriteSaveFileStatus(eepromAddresses->checksum1, fileStatus); } -u32 sub_0807CF88(u32 arg0, u8* arg1) { +u32 DataDoubleWriteWithStatus(u32 arg0, SaveFile* saveFile) { SaveFileStatus fileStatus; u32 ret; @@ -200,17 +201,17 @@ u32 sub_0807CF88(u32 arg0, u8* arg1) { eepromAddresses = GetSaveFileEEPROMAddresses(arg0); fileStatus.status = 'MCZ3'; - checksum = sub_0807D1A4((u16*)&fileStatus.status, 4); - checksum += sub_0807D1A4((u16*)arg1, eepromAddresses->size); + checksum = CalculateChecksum((u16*)&fileStatus.status, 4); + checksum += CalculateChecksum((u16*)saveFile, eepromAddresses->size); fileStatus.checksum1 = checksum; fileStatus.checksum2 = -(u32)checksum; - write1success = DataWrite(eepromAddresses->address1, arg1, eepromAddresses->size); + write1success = DataWrite(eepromAddresses->address1, saveFile, eepromAddresses->size); if (write1success) { - write1success = WriteSaveFileStatus(eepromAddresses->checksum1, (const SaveFileStatus*)&fileStatus.checksum1); + write1success = WriteSaveFileStatus(eepromAddresses->checksum1, &fileStatus); } - write2success = DataWrite(eepromAddresses->address2, arg1, eepromAddresses->size); + write2success = DataWrite(eepromAddresses->address2, saveFile, eepromAddresses->size); if (write2success) { - write2success = WriteSaveFileStatus(eepromAddresses->checksum2, (const SaveFileStatus*)&fileStatus.checksum1); + write2success = WriteSaveFileStatus(eepromAddresses->checksum2, &fileStatus); } ret = 0; @@ -220,40 +221,42 @@ u32 sub_0807CF88(u32 arg0, u8* arg1) { return ret; } -u32 sub_0807D008(u32 param_1, SaveFile* saveFile) { +u32 DataDoubleReadWithStatus(u32 param_1, SaveFile* saveFile) { vu32 set_0; SaveFileStatus fileStatus; const SaveFileEEPROMAddresses* eepromAddresses; - u32 t1; - u32 t2; + u32 read1status; + u32 read2status; u32 ret; u32 temp; eepromAddresses = GetSaveFileEEPROMAddresses(param_1); - t1 = ReadSaveFileStatus(eepromAddresses->checksum1, &fileStatus); - if (t1 == 2) { - if ((DataRead(eepromAddresses->address1, (char*)saveFile, eepromAddresses->size) == 0) || + read1status = ReadSaveFileStatus(eepromAddresses->checksum1, &fileStatus); + if (read1status == 2) { + if ((DataRead(eepromAddresses->address1, saveFile, eepromAddresses->size) == 0) || (sub_0807D0A0(&fileStatus, (u16*)saveFile, (u32)eepromAddresses->size) == 0)) { - t1 = 0; + // read 1 failed + read1status = 0; } else { return 1; } } - t2 = ReadSaveFileStatus(eepromAddresses->checksum2, &fileStatus); - if (t2 == 2) { - if ((DataRead(eepromAddresses->address2, (char*)saveFile, eepromAddresses->size) != 0) && + read2status = ReadSaveFileStatus(eepromAddresses->checksum2, &fileStatus); + if (read2status == 2) { + if ((DataRead(eepromAddresses->address2, saveFile, eepromAddresses->size) != 0) && (sub_0807D0A0(&fileStatus, (u16*)saveFile, (u32)eepromAddresses->size) != 0)) { return 1; } - t2 = 0; + // read 2 failed + read2status = 0; } set_0 = 0; CpuSet((u16*)&set_0, saveFile, eepromAddresses->size >> 2 | CPU_SET_SRC_FIXED | CPU_SET_32BIT); - temp = t1 | t2; + temp = read1status | read2status; ret = 0; if (temp == 0) { - ret = -1; + ret = -1; // both reads failed } return ret; } @@ -263,8 +266,8 @@ NONMATCH("asm/non_matching/save/sub_0807D0A0.inc", u32 sub_0807D0A0(SaveFileStat u16 u0; - u0 = sub_0807D1A4((u16*)&unk_1->status, 4); - u0 = u0 + sub_0807D1A4(unk_2, unk_3); + u0 = CalculateChecksum((u16*)&unk_1->status, 4); + u0 = u0 + CalculateChecksum(unk_2, unk_3); if (unk_1->checksum1 != u0) { r0 = 0; @@ -338,16 +341,16 @@ bool32 WriteSaveFileStatus(u32 address, const struct SaveFileStatus* fileStatus) return success; } -u16 sub_0807D1A4(u16* unk_1, u32 unk_2) { - u32 uVar1; +u16 CalculateChecksum(u16* data, u32 size) { + u32 checksum; - uVar1 = 0; - while (unk_2 != 0) { - uVar1 = uVar1 + (*unk_1 ^ unk_2); - unk_1 = unk_1 + 1; - unk_2 = unk_2 - 2; + checksum = 0; + while (size != 0) { + checksum = checksum + (*data ^ size); + data = data + 1; + size = size - 2; } - return uVar1; + return checksum; } const SaveFileEEPROMAddresses* GetSaveFileEEPROMAddresses(u32 unk_1) { From de4428799e0d4e354397f3cd0ba72103daed233d Mon Sep 17 00:00:00 2001 From: Henny022p Date: Tue, 2 Mar 2021 22:24:16 +0100 Subject: [PATCH 10/14] naming and documenting stuff --- asm/non_matching/sub_080560B8.inc | 4 +- include/functions.h | 1 - include/save.h | 5 +- src/fileScreen.c | 2 +- src/main.c | 4 +- src/save.c | 81 ++++++++++++++----------------- 6 files changed, 44 insertions(+), 53 deletions(-) diff --git a/asm/non_matching/sub_080560B8.inc b/asm/non_matching/sub_080560B8.inc index 68ee7bcd..29ca150f 100644 --- a/asm/non_matching/sub_080560B8.inc +++ b/asm/non_matching/sub_080560B8.inc @@ -12,7 +12,7 @@ bne _080560F8 movs r0, #0x80 lsls r0, r0, #0x12 - bl sub_0807CF30 + bl Read_02000000 adds r1, r0, #0 movs r0, #1 rsbs r0, r0, #0 @@ -33,7 +33,7 @@ _080560E4: movs r2, #0x10 bl MemCopy adds r0, r4, #0 - bl sub_0807CF10 + bl Write_02000000 _080560F8: ldr r2, _0805612C @ =gUnk_02000010 ldr r1, [r2] diff --git a/include/functions.h b/include/functions.h index 20dab648..451785cc 100644 --- a/include/functions.h +++ b/include/functions.h @@ -208,7 +208,6 @@ extern u32 sub_0801766C(Entity*); extern void sub_08004168(Entity*); extern u32 sub_08052638(u32); extern void InitDMA(void); -extern u32 sub_0807CF10(u8*); extern void sub_08056208(void); extern void sub_08050384(); extern u32 sub_0806F520(); diff --git a/include/save.h b/include/save.h index 41c6166b..ea15bd3c 100644 --- a/include/save.h +++ b/include/save.h @@ -48,8 +48,9 @@ extern SaveFile gSave; u32 InitSaveData(void); -s32 sub_0807CF28(u32, SaveFile*); -u32 sub_0807CF30(SaveFile*); +u32 Write_02000000(struct_02000000*); +s32 ReadSaveFile(u32, SaveFile*); +u32 Read_02000000(SaveFile*); void SetFileStatusDeleted(u32 index); #endif \ No newline at end of file diff --git a/src/fileScreen.c b/src/fileScreen.c index 836610ae..58fe323f 100644 --- a/src/fileScreen.c +++ b/src/fileScreen.c @@ -231,7 +231,7 @@ static void HandleFileScreenExit(void) { static void sub_08050624(u32 idx) { SaveFile* saveFile = &gUnk_02019EE0.saves[idx]; - int status = sub_0807CF28(idx, saveFile); + int status = ReadSaveFile(idx, saveFile); switch (status) { case SAVE_DELETED: SetFileStatusDeleted(idx); diff --git a/src/main.c b/src/main.c index 021f7258..71c1347b 100644 --- a/src/main.c +++ b/src/main.c @@ -165,7 +165,7 @@ NONMATCH("asm/non_matching/sub_080560B8.inc", void sub_080560B8(void)) { u32 b; if (!sub_08056134()) { - switch ((s32)sub_0807CF30((void*)0x2000000)) { + switch ((s32)Read_02000000((void*)0x2000000)) { case 1: if (sub_08056134()) break; @@ -173,7 +173,7 @@ NONMATCH("asm/non_matching/sub_080560B8.inc", void sub_080560B8(void)) { case -1: default: MemCopy(&sDefaultSettings, (void*)0x2000000, 16); - sub_0807CF10((u8*)0x2000000); + Write_02000000(gUnk_02000000); break; } } diff --git a/src/save.c b/src/save.c index 9b5e3c5a..c2360206 100644 --- a/src/save.c +++ b/src/save.c @@ -20,9 +20,9 @@ static SaveResult HandleSaveInProgress(u32); static SaveResult HandleSaveDone(u32); const SaveFileEEPROMAddresses* GetSaveFileEEPROMAddresses(u32); -u32 DataDoubleReadWithStatus(u32, SaveFile* saveFile); -u32 DataDoubleWriteWithStatus(u32, SaveFile* saveFile); -u32 sub_0807D0A0(SaveFileStatus*, u16*, u32); +u32 DataDoubleReadWithStatus(u32, void* data); +u32 DataDoubleWriteWithStatus(u32, const void* data); +u32 VerifyChecksum(SaveFileStatus* fileStatus, u16* data, u32 size); u16 CalculateChecksum(u16* data, u32); u32 WriteSaveFile(u32 index, SaveFile* saveFile); void SetFileStatusInit(u32 index); @@ -91,7 +91,7 @@ SaveResult HandleSaveInProgress(u32 arg0) { temp = 1; break; case 2: - temp = sub_0807CF10((u8*)&gUnk_02000000->signature); + temp = Write_02000000(gUnk_02000000); break; } gMenu.field_0xa = temp; @@ -123,19 +123,19 @@ SaveResult HandleSaveDone(u32 arg0) { u32 InitSaveData(void) { const SaveFileEEPROMAddresses* eepromAddresses; - int iVar3; + u32 error; EEPROMConfigure(0x40); eepromAddresses = GetSaveFileEEPROMAddresses(4); - iVar3 = 0; + error = 0; if (DataCompare(eepromAddresses->address1, sSignatureLong, eepromAddresses->size) == 0) { - iVar3 += 1; + error += 1; } if (DataCompare(eepromAddresses->address2, sSignatureLong, eepromAddresses->size) == 0) { - iVar3 += 2; + error += 2; } - if (iVar3 != 0) { - if (iVar3 == 3) { + if (error != 0) { + if (error == 3) { SetFileStatusInit(5); SetFileStatusInit(3); SetFileStatusInit(2); @@ -152,19 +152,19 @@ u32 WriteSaveFile(u32 index, SaveFile* saveFile) { return DataDoubleWriteWithStatus(index, saveFile); } -u32 sub_0807CF10(u8* arg0) { - return DataDoubleWriteWithStatus(3, (void*)arg0); +u32 Write_02000000(struct_02000000* arg0) { + return DataDoubleWriteWithStatus(3, arg0); } u32 sub_0807CF1C(u8* arg0) { return DataDoubleWriteWithStatus(5, (void*)arg0); } -s32 sub_0807CF28(u32 arg0, SaveFile* saveFile) { - return DataDoubleReadWithStatus(arg0, saveFile); +s32 ReadSaveFile(u32 index, SaveFile* saveFile) { + return DataDoubleReadWithStatus(index, saveFile); } -u32 sub_0807CF30(SaveFile* arg0) { +u32 Read_02000000(SaveFile* arg0) { return DataDoubleReadWithStatus(3, arg0); } @@ -190,7 +190,7 @@ void SetFileStatusInit(u32 index) { WriteSaveFileStatus(eepromAddresses->checksum1, fileStatus); } -u32 DataDoubleWriteWithStatus(u32 arg0, SaveFile* saveFile) { +u32 DataDoubleWriteWithStatus(u32 arg0, const void* data) { SaveFileStatus fileStatus; u32 ret; @@ -202,14 +202,14 @@ u32 DataDoubleWriteWithStatus(u32 arg0, SaveFile* saveFile) { fileStatus.status = 'MCZ3'; checksum = CalculateChecksum((u16*)&fileStatus.status, 4); - checksum += CalculateChecksum((u16*)saveFile, eepromAddresses->size); + checksum += CalculateChecksum((u16*)data, eepromAddresses->size); fileStatus.checksum1 = checksum; fileStatus.checksum2 = -(u32)checksum; - write1success = DataWrite(eepromAddresses->address1, saveFile, eepromAddresses->size); + write1success = DataWrite(eepromAddresses->address1, data, eepromAddresses->size); if (write1success) { write1success = WriteSaveFileStatus(eepromAddresses->checksum1, &fileStatus); } - write2success = DataWrite(eepromAddresses->address2, saveFile, eepromAddresses->size); + write2success = DataWrite(eepromAddresses->address2, data, eepromAddresses->size); if (write2success) { write2success = WriteSaveFileStatus(eepromAddresses->checksum2, &fileStatus); } @@ -221,7 +221,7 @@ u32 DataDoubleWriteWithStatus(u32 arg0, SaveFile* saveFile) { return ret; } -u32 DataDoubleReadWithStatus(u32 param_1, SaveFile* saveFile) { +u32 DataDoubleReadWithStatus(u32 param_1, void* data) { vu32 set_0; SaveFileStatus fileStatus; @@ -234,8 +234,8 @@ u32 DataDoubleReadWithStatus(u32 param_1, SaveFile* saveFile) { eepromAddresses = GetSaveFileEEPROMAddresses(param_1); read1status = ReadSaveFileStatus(eepromAddresses->checksum1, &fileStatus); if (read1status == 2) { - if ((DataRead(eepromAddresses->address1, saveFile, eepromAddresses->size) == 0) || - (sub_0807D0A0(&fileStatus, (u16*)saveFile, (u32)eepromAddresses->size) == 0)) { + if ((DataRead(eepromAddresses->address1, data, eepromAddresses->size) == 0) || + (VerifyChecksum(&fileStatus, (u16*)data, eepromAddresses->size) == 0)) { // read 1 failed read1status = 0; } else { @@ -244,15 +244,15 @@ u32 DataDoubleReadWithStatus(u32 param_1, SaveFile* saveFile) { } read2status = ReadSaveFileStatus(eepromAddresses->checksum2, &fileStatus); if (read2status == 2) { - if ((DataRead(eepromAddresses->address2, saveFile, eepromAddresses->size) != 0) && - (sub_0807D0A0(&fileStatus, (u16*)saveFile, (u32)eepromAddresses->size) != 0)) { + if ((DataRead(eepromAddresses->address2, data, eepromAddresses->size) != 0) && + (VerifyChecksum(&fileStatus, (u16*)data, (u32)eepromAddresses->size) != 0)) { return 1; } // read 2 failed read2status = 0; } set_0 = 0; - CpuSet((u16*)&set_0, saveFile, eepromAddresses->size >> 2 | CPU_SET_SRC_FIXED | CPU_SET_32BIT); + CpuSet((u16*)&set_0, data, eepromAddresses->size >> 2 | CPU_SET_SRC_FIXED | CPU_SET_32BIT); temp = read1status | read2status; ret = 0; if (temp == 0) { @@ -261,28 +261,19 @@ u32 DataDoubleReadWithStatus(u32 param_1, SaveFile* saveFile) { return ret; } -NONMATCH("asm/non_matching/save/sub_0807D0A0.inc", u32 sub_0807D0A0(SaveFileStatus* unk_1, u16* unk_2, u32 unk_3)) { - u32 r0; +NONMATCH("asm/non_matching/save/sub_0807D0A0.inc", u32 VerifyChecksum(SaveFileStatus* fileStatus, u16* data, u32 size)) { + u32 ret; - u16 u0; + u16 checksum; - u0 = CalculateChecksum((u16*)&unk_1->status, 4); - u0 = u0 + CalculateChecksum(unk_2, unk_3); + checksum = CalculateChecksum((u16*)&fileStatus->status, 4); + checksum += CalculateChecksum(data, size); - if (unk_1->checksum1 != u0) { - r0 = 0; - } else { - if (unk_1->checksum2 == -unk_1->checksum1) { - if (unk_1->status != 'MCZ3') { - r0 = 0; - } else { - r0 = 1; - } - } else { - r0 = 0; - } - } - return r0; + if ((fileStatus->checksum1 != checksum) || (fileStatus->checksum2 != -(u32)fileStatus->checksum1) || + (fileStatus->status != 'MCZ3')) { + return 0; + } else + return 1; } END_NONMATCH @@ -346,7 +337,7 @@ u16 CalculateChecksum(u16* data, u32 size) { checksum = 0; while (size != 0) { - checksum = checksum + (*data ^ size); + checksum += (*data ^ size); data = data + 1; size = size - 2; } From ffcd347ede61b97c1b31d3ecbd7f49248dbbe865 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Tue, 2 Mar 2021 22:28:28 +0100 Subject: [PATCH 11/14] naming and documenting stuff --- src/save.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/save.c b/src/save.c index c2360206..84901f91 100644 --- a/src/save.c +++ b/src/save.c @@ -338,7 +338,7 @@ u16 CalculateChecksum(u16* data, u32 size) { checksum = 0; while (size != 0) { checksum += (*data ^ size); - data = data + 1; + data++; size = size - 2; } return checksum; From cd4a04c5ab0db8769535a4d3690bc2f0a582175b Mon Sep 17 00:00:00 2001 From: Henny022p Date: Tue, 2 Mar 2021 22:41:26 +0100 Subject: [PATCH 12/14] matched VerifyChecksum --- asm/non_matching/save/sub_0807D0A0.inc | 45 -------------------------- src/save.c | 9 +++--- 2 files changed, 4 insertions(+), 50 deletions(-) delete mode 100644 asm/non_matching/save/sub_0807D0A0.inc diff --git a/asm/non_matching/save/sub_0807D0A0.inc b/asm/non_matching/save/sub_0807D0A0.inc deleted file mode 100644 index 3efab014..00000000 --- a/asm/non_matching/save/sub_0807D0A0.inc +++ /dev/null @@ -1,45 +0,0 @@ - - .syntax unified - - .text - - push {r4, r5, r6, r7, lr} - adds r7, r0, #0 - adds r5, r1, #0 - adds r6, r2, #0 - adds r0, r7, #4 - movs r1, #4 - bl CalculateChecksum - adds r4, r0, #0 - lsls r4, r4, #0x10 - lsrs r4, r4, #0x10 - adds r0, r5, #0 - adds r1, r6, #0 - bl CalculateChecksum - adds r4, r4, r0 - lsls r4, r4, #0x10 - lsrs r4, r4, #0x10 - ldrh r0, [r7] - cmp r0, r4 - bne _0807D0DE - lsls r0, r0, #0x10 - ldrh r1, [r7, #2] - rsbs r0, r0, #0 - lsrs r0, r0, #0x10 - cmp r1, r0 - bne _0807D0DE - ldr r1, [r7, #4] - ldr r0, _0807D0E4 @ =0x4D435A33 - cmp r1, r0 - beq _0807D0E8 -_0807D0DE: - movs r0, #0 - b _0807D0EA - .align 2, 0 -_0807D0E4: .4byte 0x4D435A33 -_0807D0E8: - movs r0, #1 -_0807D0EA: - pop {r4, r5, r6, r7, pc} - - .syntax divided diff --git a/src/save.c b/src/save.c index 84901f91..2077da73 100644 --- a/src/save.c +++ b/src/save.c @@ -261,21 +261,20 @@ u32 DataDoubleReadWithStatus(u32 param_1, void* data) { return ret; } -NONMATCH("asm/non_matching/save/sub_0807D0A0.inc", u32 VerifyChecksum(SaveFileStatus* fileStatus, u16* data, u32 size)) { - u32 ret; - +u32 VerifyChecksum(SaveFileStatus* fileStatus, u16* data, u32 size) { + u32 temp; u16 checksum; checksum = CalculateChecksum((u16*)&fileStatus->status, 4); checksum += CalculateChecksum(data, size); - if ((fileStatus->checksum1 != checksum) || (fileStatus->checksum2 != -(u32)fileStatus->checksum1) || + if ((fileStatus->checksum1 != checksum) || + (temp = fileStatus->checksum1 << 0x10, fileStatus->checksum2 != (-temp >> 0x10)) || (fileStatus->status != 'MCZ3')) { return 0; } else return 1; } -END_NONMATCH u32 ReadSaveFileStatus(u32 address, SaveFileStatus* fileStatus) { u32 ret; From 7a77734ad6ffe7d6ee0a4717d6a6826b8957d155 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Tue, 2 Mar 2021 23:18:16 +0100 Subject: [PATCH 13/14] fixed some argument types --- include/save.h | 2 +- src/save.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/save.h b/include/save.h index ea15bd3c..6dea6212 100644 --- a/include/save.h +++ b/include/save.h @@ -50,7 +50,7 @@ u32 InitSaveData(void); u32 Write_02000000(struct_02000000*); s32 ReadSaveFile(u32, SaveFile*); -u32 Read_02000000(SaveFile*); +u32 Read_02000000(struct_02000000*); void SetFileStatusDeleted(u32 index); #endif \ No newline at end of file diff --git a/src/save.c b/src/save.c index 2077da73..7cbf89aa 100644 --- a/src/save.c +++ b/src/save.c @@ -157,18 +157,18 @@ u32 Write_02000000(struct_02000000* arg0) { } u32 sub_0807CF1C(u8* arg0) { - return DataDoubleWriteWithStatus(5, (void*)arg0); + return DataDoubleWriteWithStatus(5, arg0); } s32 ReadSaveFile(u32 index, SaveFile* saveFile) { return DataDoubleReadWithStatus(index, saveFile); } -u32 Read_02000000(SaveFile* arg0) { +u32 Read_02000000(struct_02000000* arg0) { return DataDoubleReadWithStatus(3, arg0); } -u32 sub_0807CF3C(SaveFile* arg0) { +u32 sub_0807CF3C(u8* arg0) { return DataDoubleReadWithStatus(5, arg0); } From da9fa1c810a31e39978ddfbffe13ac20f3d28bd3 Mon Sep 17 00:00:00 2001 From: Henny022p <73211432+Henny022p@users.noreply.github.com> Date: Wed, 3 Mar 2021 02:12:37 +0100 Subject: [PATCH 14/14] Merge pull request #130 from Henny022p/master (#5) Co-authored-by: notyourav <65437533+notyourav@users.noreply.github.com>