From 83ca45d6302e65cc533b2babceb5a60e8f159129 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Tue, 2 Mar 2021 16:11:31 +0100 Subject: [PATCH] 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