mirror of https://github.com/zeldaret/tmc.git
matched data read, write and compare functions
This commit is contained in:
parent
048b067288
commit
83ca45d630
|
@ -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]
|
||||||
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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();
|
||||||
|
|
82
src/save.c
82
src/save.c
|
@ -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
|
|
||||||
|
|
Loading…
Reference in New Issue