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

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_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();

View File

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