matched data read, write and compare functions

This commit is contained in:
Henny022p 2021-03-02 16:11:31 +01:00
parent 048b067288
commit 83ca45d630
6 changed files with 47 additions and 154 deletions

View File

@ -21,7 +21,7 @@
ldrh r0, [r5, #6] ldrh r0, [r5, #6]
ldrh r2, [r5] ldrh r2, [r5]
adds r1, r7, #0 adds r1, r7, #0
bl sub_0807D1D8 bl DataRead
cmp r0, #0 cmp r0, #0
beq _0807D046 beq _0807D046
ldrh r2, [r5] ldrh r2, [r5]
@ -42,7 +42,7 @@ _0807D048:
ldrh r0, [r5, #8] ldrh r0, [r5, #8]
ldrh r2, [r5] ldrh r2, [r5]
adds r1, r7, #0 adds r1, r7, #0
bl sub_0807D1D8 bl DataRead
cmp r0, #0 cmp r0, #0
beq _0807D076 beq _0807D076
ldrh r2, [r5] ldrh r2, [r5]

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -214,9 +214,7 @@ extern u32 sub_0807CF10(u8*);
extern void sub_08056208(void); extern void sub_08056208(void);
extern void sub_08050384(); extern void sub_08050384();
extern struct_0807D1C4* sub_0807D1C4(u32); extern struct_0807D1C4* sub_0807D1C4(u32);
extern u32 sub_0807D24C(u32, const char*, u32);
extern void sub_0807CF68(u32); extern void sub_0807CF68(u32);
extern u32 sub_0807D20C(u32, const char*, u32);
extern u32 sub_0807CF88(u32, u8*); extern u32 sub_0807CF88(u32, u8*);
extern u32 sub_0807D184(u32, const char*); extern u32 sub_0807D184(u32, const char*);
extern u32 sub_0806F520(); extern u32 sub_0806F520();

View File

@ -22,7 +22,10 @@ u32 sub_0807D0A0(u16*, u16*, u32);
u32 sub_0807D0EC(u32, const char*); u32 sub_0807D0EC(u32, const char*);
u32 sub_0807D128(const Thing*); u32 sub_0807D128(const Thing*);
u16 sub_0807D1A4(u16*, u32); 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"; static const char sSignatureLong[32] = "AGBZELDA:THE MINISH CAP:ZELDA 5";
@ -107,10 +110,10 @@ u32 sub_0807CE90(void) {
EEPROMConfigure(0x40); EEPROMConfigure(0x40);
puVar1 = sub_0807D1C4(4); puVar1 = sub_0807D1C4(4);
iVar3 = 0; 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; 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; iVar3 += 2;
} }
if (iVar3 != 0) { if (iVar3 != 0) {
@ -121,8 +124,8 @@ u32 sub_0807CE90(void) {
sub_0807CF68(1); sub_0807CF68(1);
sub_0807CF68(0); sub_0807CF68(0);
} }
sub_0807D20C(puVar1->field_0x8, sSignatureLong, puVar1->field_0x0); DataWrite(puVar1->field_0x8, sSignatureLong, puVar1->field_0x0);
sub_0807D20C(puVar1->field_0x6, sSignatureLong, puVar1->field_0x0); DataWrite(puVar1->field_0x6, sSignatureLong, puVar1->field_0x0);
} }
return 1; return 1;
} }
@ -184,11 +187,11 @@ u32 sub_0807CF88(u32 arg0, u8* arg1) {
l1prep += sub_0807D1A4((u16*)arg1, ptr->field_0x0); l1prep += sub_0807D1A4((u16*)arg1, ptr->field_0x0);
thing.unk_1 = l1prep; thing.unk_1 = l1prep;
thing.unk_2 = -(u32)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) { if (e0) {
e0 = sub_0807D184(ptr->field_0x2, (const char*)&thing.unk_1); 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) { if (e1) {
e1 = sub_0807D184(ptr->field_0x4, (const char*)&thing.unk_1); 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); unk_s = sub_0807D1C4(param_1);
t1 = sub_0807D0EC(unk_s->field_0x2, auStack32); t1 = sub_0807D0EC(unk_s->field_0x2, auStack32);
if (t1 == 2) { 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)) { (sub_0807D0A0((u16*)auStack32, (u16*)saveFile, (u32)unk_s->field_0x0) == 0)) {
t1 = 0; t1 = 0;
} else { } 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); t2 = sub_0807D0EC(unk_s->field_0x4, auStack32);
if (t2 == 2) { 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)) { (sub_0807D0A0((u16*)auStack32, (u16*)saveFile, (u32)unk_s->field_0x0) != 0)) {
return 1; return 1;
} }
@ -271,12 +274,12 @@ END_NONMATCH
u32 sub_0807D0EC(u32 unk_1, const char* unk_2) { u32 sub_0807D0EC(u32 unk_1, const char* unk_2) {
u32 ret; u32 ret;
if (!sub_0807D1D8(unk_1, unk_2, 8)) { if (!DataRead(unk_1, unk_2, 8)) {
ret = 0; ret = 0;
} else { } else {
ret = sub_0807D128((Thing*)unk_2); 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); ret = sub_0807D128((Thing*)unk_2);
} }
return ret; return ret;
@ -309,9 +312,9 @@ u32 sub_0807D128(const Thing* thing) {
u32 sub_0807D184(u32 param_1, const char* param_2) { u32 sub_0807D184(u32 param_1, const char* param_2) {
u32 uVar1; u32 uVar1;
uVar1 = sub_0807D20C(param_1, param_2, 8); uVar1 = DataWrite(param_1, param_2, 8);
if (uVar1 == 0) { if (uVar1 == 0) {
uVar1 = sub_0807D20C(param_1 + 8, param_2, 8); uVar1 = DataWrite(param_1 + 8, param_2, 8);
} }
return uVar1; return uVar1;
} }
@ -332,35 +335,40 @@ struct_0807D1C4* sub_0807D1C4(u32 unk_1) {
return &gUnk_0811E4BC[unk_1]; return &gUnk_0811E4BC[unk_1];
} }
// these three are basically the same and wrong by basically one instruction in the wrong place bool32 DataRead(u32 address, u8* data, u32 size) {
NONMATCH("asm/non_matching/save/sub_0807D1D8.inc", u32 sub_0807D1D8(u32 unk_1, const char* unk_2, u32 unk_3)) { 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)) { bool32 DataWrite(u32 address, const u8* data, u32 size) {
unk_3 >>= 3; size /= 8;
unk_1 >>= 3; address /= 8;
while (unk_3-- > 0) { while (size-- > 0) {
if (EEPROMWrite0_8k_Check(unk_1, (u16*)unk_2)) { if (EEPROMWrite0_8k_Check(address, (u16*)data)) {
EEPROMWrite0_8k_Check(unk_1, (u16*)gUnk_0811E4B4); EEPROMWrite0_8k_Check(address, (u16*)gUnk_0811E4B4);
return 0; return FALSE;
} }
unk_1++; address++;
unk_2 += 8; 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)) { bool32 DataCompare(u32 address, const u8* data, u32 size) {
unk_3 >>= 3; size /= 8;
unk_1 >>= 3; address /= 8;
while (unk_3-- > 0) { while (size-- > 0) {
if (EEPROMCompare(unk_1, (u16*)unk_2)) if (EEPROMCompare(address, (u16*)data))
return 0; return FALSE;
unk_1++; address++;
unk_2 += 8; data += 8;
} }
return 1; return TRUE;
} }
END_NONMATCH