diff --git a/asm/text.s b/asm/text.s index 06954f8fc..e444bc20e 100644 --- a/asm/text.s +++ b/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} diff --git a/include/text.h b/include/text.h index 9757fbedf..587f22630 100644 --- a/include/text.h +++ b/include/text.h @@ -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 \ No newline at end of file diff --git a/src/text.c b/src/text.c index 8700102be..a3b858d5a 100644 --- a/src/text.c +++ b/src/text.c @@ -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; } diff --git a/src/text_1.c b/src/text_1.c index 39af0e701..657a80ba0 100644 --- a/src/text_1.c +++ b/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; } \ No newline at end of file