mirror of
https://github.com/pret/pmd-red.git
synced 2026-07-24 12:20:18 -05:00
Merge pull request #146 from Kermalis/kermalis-text_1-func
Match sub_8006554 and document the WTFism
This commit is contained in:
commit
3ef2e4153b
293
asm/text.s
293
asm/text.s
|
|
@ -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}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
#ifndef GUARD_TEXT_H
|
||||
#define GUARD_TEXT_H
|
||||
#define GUARD_TEXT_H
|
||||
|
||||
// size: 0x48
|
||||
struct UnkTextStruct1
|
||||
|
|
@ -8,7 +8,7 @@ struct UnkTextStruct1
|
|||
s16 unk2;
|
||||
s16 unk4;
|
||||
s16 unk6;
|
||||
u16 unk8;
|
||||
s16 unk8;
|
||||
u32 unkC;
|
||||
u32 unk10;
|
||||
u32 unk14;
|
||||
|
|
@ -29,8 +29,17 @@ struct UnkTextStruct1
|
|||
// size: 0x4
|
||||
struct UnkTextStruct2_sub
|
||||
{
|
||||
u16 unk0;
|
||||
u16 unk2;
|
||||
// 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 unk2;
|
||||
} separate;
|
||||
s16 arr[2];
|
||||
} unk0;
|
||||
};
|
||||
|
||||
// size: 0x18
|
||||
|
|
@ -50,12 +59,14 @@ struct UnkTextStruct2
|
|||
void LoadCharmaps(void);
|
||||
void SelectCharmap(u32);
|
||||
u32 xxx_update_some_bg_tiles(u32 a0);
|
||||
void sub_8006438(const struct UnkTextStruct2 *a0, u8 a1, u8 a2, u32 *a3);
|
||||
void sub_8006554(void *a0, void *a1, void *a2, void *a3, u32 a4, const struct UnkTextStruct2 *a5, u8 a6, u32 a7, u32 *a8, u32 a9);
|
||||
void sub_800898C(void);
|
||||
void sub_80089AC(const struct UnkTextStruct2 *a0, void *a1);
|
||||
void sub_8009388(void);
|
||||
void sub_800641C(struct UnkTextStruct2 *a0, u8 a1, u8 a2);
|
||||
void sub_8006438(const struct UnkTextStruct2 *, u8, u8, struct UnkTextStruct2_sub *);
|
||||
void sub_8006518(struct UnkTextStruct2 *);
|
||||
void sub_8006554(struct UnkTextStruct1 *, void *, u8 *, u16 *, u32, const struct UnkTextStruct2 *, u8, u32, struct UnkTextStruct2_sub *, u8);
|
||||
void sub_800898C(void);
|
||||
void sub_80089AC(const struct UnkTextStruct2 *, struct UnkTextStruct2_sub *);
|
||||
void sub_8009388(void);
|
||||
|
||||
extern void xxx_call_draw_string(s32 x, u32 y, const u8 *str, u32 , u32);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -138,11 +138,11 @@ void sub_80063D8(int a0)
|
|||
|
||||
void sub_800641C(struct UnkTextStruct2 *a0, u8 a1, u8 a2)
|
||||
{
|
||||
u32 r3 = 0;
|
||||
struct UnkTextStruct2_sub r3 = {0, 0};
|
||||
sub_8006438(a0, a1, a2, &r3);
|
||||
}
|
||||
|
||||
void sub_8006438(const struct UnkTextStruct2 *a0, u8 a1, u8 a2, u32 *a3)
|
||||
void sub_8006438(const struct UnkTextStruct2 *a0, u8 a1, u8 a2, struct UnkTextStruct2_sub *a3)
|
||||
{
|
||||
int i;
|
||||
u32 r9 = 2;
|
||||
|
|
@ -158,7 +158,7 @@ void sub_8006438(const struct UnkTextStruct2 *a0, u8 a1, u8 a2, u32 *a3)
|
|||
gUnknown_202AFC0[i] = a0[i];
|
||||
|
||||
if (a0[i].unkC) {
|
||||
sub_8006554(gUnknown_2027370, (void *)VRAM, gUnknown_20274B4, gUnknown_202B038, gUnknown_80B8804[i], a0 + i, a1, r9, a3, 0);
|
||||
sub_8006554(gUnknown_2027370, (void *)VRAM, gUnknown_20274B4, &gUnknown_202B038[0][0][0], gUnknown_80B8804[i], a0 + i, a1, r9, a3, 0);
|
||||
sub_80089AC(a0 + i, a3);
|
||||
r9 += a0[i].unkC * a0[i].unk10;
|
||||
}
|
||||
|
|
|
|||
102
src/text_1.c
102
src/text_1.c
|
|
@ -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 numI;
|
||||
u32 uVar1;
|
||||
|
||||
s32 temp;
|
||||
s32 i;
|
||||
s32 j;
|
||||
|
||||
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;
|
||||
numI = t1->unk6 - 2;
|
||||
}
|
||||
else {
|
||||
sub_800677C(t1, temp, a3, a9);
|
||||
|
||||
temp = iVar5;
|
||||
uVar1 = (a6 != 0) ? t1->unk14 : 0;
|
||||
numI = t1->unk6;
|
||||
}
|
||||
|
||||
for (i = 0; i < numI; i++) {
|
||||
iVar6 = iVar3 - 1;
|
||||
sub_80069CC(t1, iVar6, temp, i, a3);
|
||||
iVar6 = iVar3;
|
||||
|
||||
for (j = 0; j < t1->unk4; j++) {
|
||||
sub_8006AC4(t1, iVar6, temp, uVar1, a3);
|
||||
|
||||
iVar6++;
|
||||
if (a6 != 0)
|
||||
uVar1++;
|
||||
}
|
||||
|
||||
sub_8006B70(t1, iVar6, temp, i, a3);
|
||||
temp++;
|
||||
}
|
||||
sub_8006C44(t1, temp, a3, a9);
|
||||
}
|
||||
|
||||
if ((a5->unk0 & 0x80) == 0)
|
||||
sub_8008C6C(a0, a4);
|
||||
|
||||
t1->unk46 = 0;
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user