Match sub_8006554 and document the WTFism

This commit is contained in:
Kermalis
2023-08-03 09:27:56 -04:00
parent fadeddf985
commit 80900fac6f
3 changed files with 113 additions and 296 deletions

View File

@@ -5,299 +5,6 @@
.text
thumb_func_start sub_8006554
sub_8006554:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
sub sp, 0x24
str r0, [sp, 0x4]
adds r7, r1, 0
adds r6, r2, 0
str r3, [sp, 0x8]
ldr r1, [sp, 0x4C]
ldr r3, [sp, 0x50]
ldr r2, [sp, 0x54]
ldr r0, [sp, 0x58]
lsls r1, 24
lsrs r1, 24
str r1, [sp, 0xC]
lsls r0, 24
lsrs r0, 24
str r0, [sp, 0x10]
ldr r1, [sp, 0x44]
lsls r0, r1, 3
adds r0, r1
lsls r0, 3
ldr r4, [sp, 0x4]
adds r5, r4, r0
ldr r0, [sp, 0x48]
movs r4, 0x8
ldrsh r1, [r0, r4]
movs r4, 0
ldrsh r0, [r2, r4]
adds r1, r0
str r1, [sp, 0x14]
ldr r0, [sp, 0x48]
movs r4, 0xA
ldrsh r1, [r0, r4]
movs r4, 0x2
ldrsh r0, [r2, r4]
adds r4, r1, r0
mov r0, sp
ldrh r0, [r0, 0x14]
strh r0, [r5]
strh r4, [r5, 0x2]
ldr r1, [sp, 0x48]
ldrh r0, [r1, 0xC]
strh r0, [r5, 0x4]
ldrh r0, [r1, 0x10]
strh r0, [r5, 0x8]
ldrh r0, [r1, 0xE]
strh r0, [r5, 0x6]
ldr r0, [r1, 0x4]
str r0, [r5, 0xC]
str r3, [r5, 0x10]
cmp r0, 0x6
bne _080065C6
str r3, [r5, 0x14]
b _080065D6
_080065C6:
ldr r2, [sp, 0x48]
movs r0, 0x12
ldrsh r1, [r2, r0]
movs r2, 0x4
ldrsh r0, [r5, r2]
muls r0, r1
adds r0, r3, r0
str r0, [r5, 0x14]
_080065D6:
ldr r0, [r5, 0x10]
lsls r0, 5
adds r0, r6, r0
str r0, [r5, 0x18]
ldr r0, [r5, 0x14]
lsls r0, 5
adds r1, r6, r0
str r1, [r5, 0x1C]
ldr r3, [sp, 0x48]
movs r6, 0x12
ldrsh r1, [r3, r6]
str r1, [r5, 0x24]
adds r0, r7, r0
str r0, [r5, 0x28]
ldr r3, [r5, 0xC]
cmp r3, 0x6
bne _0800660C
movs r7, 0x4
ldrsh r2, [r5, r7]
movs r1, 0x6
ldrsh r0, [r5, r1]
ldr r6, [sp, 0x48]
movs r7, 0x12
ldrsh r1, [r6, r7]
adds r0, r1
muls r0, r2
b _08006616
_0800660C:
movs r0, 0x4
ldrsh r1, [r5, r0]
movs r2, 0x6
ldrsh r0, [r5, r2]
muls r0, r1
_08006616:
lsls r0, 5
str r0, [r5, 0x2C]
movs r0, 0
str r0, [r5, 0x30]
str r0, [r5, 0x34]
str r0, [r5, 0x38]
movs r6, 0x4
ldrsh r0, [r5, r6]
lsls r0, 3
subs r0, 0x8
str r0, [r5, 0x20]
movs r1, 0
cmp r3, 0
bne _08006634
movs r1, 0x1
_08006634:
adds r0, r5, 0
adds r0, 0x45
strb r1, [r0]
movs r7, 0x8
ldrsh r0, [r5, r7]
cmp r0, 0
bne _08006644
b _0800676C
_08006644:
ldr r0, [sp, 0x48]
ldrb r1, [r0]
movs r0, 0xA0
ands r0, r1
adds r1, r5, 0
adds r1, 0x46
str r1, [sp, 0x1C]
cmp r0, 0x80
beq _08006752
subs r7, r4, 0x1
ldr r0, [r5, 0xC]
cmp r0, 0x6
bne _080066A8
movs r2, 0
mov r8, r2
ldr r3, [sp, 0xC]
cmp r3, 0
beq _0800666C
ldr r6, [r5, 0x14]
mov r8, r6
_0800666C:
ldr r0, [sp, 0x48]
ldr r3, [r0, 0x14]
ldr r1, [sp, 0x8]
str r1, [sp]
adds r0, r5, 0
adds r1, r7, 0
mov r2, r8
bl sub_8006E94
adds r7, r4, 0x2
ldr r2, [sp, 0xC]
cmp r2, 0
beq _0800669A
movs r3, 0x4
ldrsh r1, [r5, r3]
ldr r4, [sp, 0x48]
movs r6, 0x12
ldrsh r0, [r4, r6]
adds r0, 0x2
muls r1, r0
ldr r0, [r5, 0x14]
adds r0, r1
b _0800669C
_0800669A:
movs r0, 0
_0800669C:
mov r8, r0
movs r1, 0x6
ldrsh r0, [r5, r1]
subs r0, 0x2
str r0, [sp, 0x18]
b _080066CA
_080066A8:
adds r0, r5, 0
adds r1, r7, 0
ldr r2, [sp, 0x8]
ldr r3, [sp, 0x10]
bl sub_800677C
adds r7, r4, 0
movs r2, 0
mov r8, r2
ldr r3, [sp, 0xC]
cmp r3, 0
beq _080066C4
ldr r4, [r5, 0x14]
mov r8, r4
_080066C4:
movs r0, 0x6
ldrsh r6, [r5, r0]
str r6, [sp, 0x18]
_080066CA:
movs r1, 0
mov r9, r1
adds r2, r5, 0
adds r2, 0x46
str r2, [sp, 0x1C]
ldr r3, [sp, 0x18]
cmp r9, r3
bge _08006746
_080066DA:
ldr r4, [sp, 0x14]
subs r4, 0x1
ldr r6, [sp, 0x8]
str r6, [sp]
adds r0, r5, 0
adds r1, r4, 0
adds r2, r7, 0
mov r3, r9
bl sub_80069CC
ldr r4, [sp, 0x14]
movs r6, 0
movs r1, 0x4
ldrsh r0, [r5, r1]
adds r2, r7, 0x1
mov r10, r2
mov r3, r9
adds r3, 0x1
str r3, [sp, 0x20]
cmp r6, r0
bge _0800672A
_08006704:
ldr r0, [sp, 0x8]
str r0, [sp]
adds r0, r5, 0
adds r1, r4, 0
adds r2, r7, 0
mov r3, r8
bl sub_8006AC4
adds r4, 0x1
ldr r1, [sp, 0xC]
cmp r1, 0
beq _08006720
movs r2, 0x1
add r8, r2
_08006720:
adds r6, 0x1
movs r3, 0x4
ldrsh r0, [r5, r3]
cmp r6, r0
blt _08006704
_0800672A:
ldr r6, [sp, 0x8]
str r6, [sp]
adds r0, r5, 0
adds r1, r4, 0
adds r2, r7, 0
mov r3, r9
bl sub_8006B70
mov r7, r10
ldr r0, [sp, 0x20]
mov r9, r0
ldr r1, [sp, 0x18]
cmp r9, r1
blt _080066DA
_08006746:
adds r0, r5, 0
adds r1, r7, 0
ldr r2, [sp, 0x8]
ldr r3, [sp, 0x10]
bl sub_8006C44
_08006752:
ldr r2, [sp, 0x48]
ldrb r1, [r2]
movs r0, 0x80
ands r0, r1
cmp r0, 0
bne _08006766
ldr r0, [sp, 0x4]
ldr r1, [sp, 0x44]
bl sub_8008C6C
_08006766:
movs r0, 0
ldr r3, [sp, 0x1C]
strb r0, [r3]
_0800676C:
add sp, 0x24
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r0}
bx r0
thumb_func_end sub_8006554
thumb_func_start sub_800677C
sub_800677C:
push {r4-r7,lr}

View File

@@ -29,9 +29,17 @@ struct UnkTextStruct1
// size: 0x4
struct UnkTextStruct2_sub
{
//s16 unk0[2]; // TODO: Try union and see if it fixes kecleon
s16 unk0;
s16 unk4;
// I haven't found a func that reads these separately yet, but simply making an arr[2] will cause assignments to break.
// Some funcs only match with this union for some reason even though they don't access the variables separately...
// The first func to break is currently sub_801A5D8 in kecleon_items_1.c
// The first func I matched that uses the array is sub_8006554 in text_1.c (using the separated fields doesn't match or get even close)
union {
struct {
s16 unk0;
s16 unk4;
} separate;
s16 arr[2];
} unk0;
};
// size: 0x18

View File

@@ -4,6 +4,14 @@
extern struct UnkTextStruct2 gUnknown_202AFC0[4];
extern u32 gUnknown_80B8814[];
extern void sub_800677C(struct UnkTextStruct1 *, s32, u16 *, u8);
extern void sub_80069CC(struct UnkTextStruct1 *, s32, s32, s32, u16 *);
extern void sub_8006AC4(struct UnkTextStruct1 *, s32, s32, u32, u16 *);
extern void sub_8006B70(struct UnkTextStruct1 *, s32, s32, s32, u16 *);
extern void sub_8006C44(struct UnkTextStruct1 *, s32, u16 *, u8);
extern void sub_8006E94(struct UnkTextStruct1 *, s32, u32, const u8 *, u16 *);
extern void sub_8008C6C(struct UnkTextStruct1 *, u32);
void nullsub_152(void)
{
}
@@ -22,4 +30,98 @@ void nullsub_153(void)
u32 sub_8006544(u32 index)
{
return gUnknown_80B8814[index];
}
// a1 is a VRAM pointer
void sub_8006554(struct UnkTextStruct1 *a0, void *a1, u8 *a2, u16 *a3, u32 a4, const struct UnkTextStruct2 *a5, u8 a6, u32 a7, struct UnkTextStruct2_sub *a8, u8 a9)
{
struct UnkTextStruct1 *t1;
s32 iVar3;
s32 iVar5;
s32 iVar6;
s32 local_2c;
u32 uVar1;
s32 temp;
s32 eye;
s32 jay;
t1 = &a0[a4];
iVar3 = a5->unk8.unk0.arr[0] + a8->unk0.arr[0];
iVar5 = a5->unk8.unk0.arr[1] + a8->unk0.arr[1];
t1->unk0 = iVar3;
t1->unk2 = iVar5;
t1->unk4 = a5->unkC;
t1->unk8 = a5->unk10;
t1->unk6 = a5->unkE;
t1->unkC = a5->unk4;
t1->unk10 = a7;
if (t1->unkC == 6)
t1->unk14 = a7;
else
t1->unk14 = a7 + a5->unk12 * t1->unk4;
t1->unk18 = &a2[t1->unk10 * 0x20];
t1->unk1C = &a2[t1->unk14 * 0x20];
t1->unk24 = a5->unk12;
t1->unk28 = a1 + (t1->unk14 * 0x20);
if (t1->unkC == 6)
t1->unk2C = t1->unk4 * (t1->unk6 + a5->unk12) * 32;
else
t1->unk2C = t1->unk4 * t1->unk6 * 32;
t1->unk30 = 0;
t1->unk34 = 0;
t1->unk38 = 0;
t1->unk20 = (t1->unk4 * 8) - 8;
t1->unk45 = t1->unkC == 0;
if (t1->unk8 == 0)
return;
if ((a5->unk0 & 0xA0) != 0x80) {
temp = iVar5 - 1;
if (t1->unkC == 6) {
uVar1 = (a6 != 0) ? t1->unk14 : 0;
sub_8006E94(t1, temp, uVar1, a5->unk14, a3);
temp = iVar5 + 2;
uVar1 = (a6 != 0) ? t1->unk14 + t1->unk4 * (a5->unk12 + 2) : 0;
local_2c = t1->unk6 - 2;
}
else {
sub_800677C(t1, temp, a3, a9);
temp = iVar5;
uVar1 = (a6 != 0) ? t1->unk14 : 0;
local_2c = t1->unk6;
}
for (eye = 0; eye < local_2c; eye++) {
iVar6 = iVar3 - 1;
sub_80069CC(t1, iVar6, temp, eye, a3);
iVar6 = iVar3;
for (jay = 0; jay < t1->unk4; jay++) {
sub_8006AC4(t1, iVar6, temp, uVar1, a3);
iVar6++;
if (a6 != 0)
uVar1++;
}
sub_8006B70(t1, iVar6, temp, eye, a3);
temp++;
}
sub_8006C44(t1, temp, a3, a9);
}
if ((a5->unk0 & 0x80) == 0)
sub_8008C6C(a0, a4);
t1->unk46 = 0;
}