From 82986f2b746af15a935ed6ea5941fcf2c531e06a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 25 Sep 2024 11:07:23 +0200 Subject: [PATCH] sub_800829C --- asm/text.s | 492 ---------------------------------------------------- src/text2.c | 203 +++++++++++++++++++--- 2 files changed, 177 insertions(+), 518 deletions(-) diff --git a/asm/text.s b/asm/text.s index 5ad2b359b..cfbb08b75 100644 --- a/asm/text.s +++ b/asm/text.s @@ -5,499 +5,7 @@ .text - thumb_func_start sub_8007FA8 -sub_8007FA8: - adds r3, r0, 0 - lsrs r0, r3, 28 - lsrs r1, r3, 20 - movs r2, 0xF0 - ands r1, r2 - orrs r0, r1 - lsrs r1, r3, 12 - movs r2, 0xF0 - lsls r2, 4 - ands r1, r2 - orrs r0, r1 - lsrs r1, r3, 4 - movs r2, 0xF0 - lsls r2, 8 - ands r1, r2 - orrs r0, r1 - lsls r1, r3, 4 - movs r2, 0xF0 - lsls r2, 12 - ands r1, r2 - orrs r0, r1 - lsls r1, r3, 12 - movs r2, 0xF0 - lsls r2, 16 - ands r1, r2 - orrs r0, r1 - lsls r1, r3, 20 - movs r2, 0xF0 - lsls r2, 20 - ands r1, r2 - orrs r0, r1 - lsls r3, 28 - orrs r0, r3 - bx lr - thumb_func_end sub_8007FA8 - thumb_func_start sub_8007FEC -sub_8007FEC: - push {r4-r6,lr} - mov r6, r9 - mov r5, r8 - push {r5,r6} - sub sp, 0x14 - mov r8, r0 - mov r9, r1 - ldr r4, [sp, 0x2C] - ldr r5, [sp, 0x30] - ldr r6, [sp, 0x34] - ldr r0, _08008024 - ldr r1, _08008028 - str r2, [sp] - str r3, [sp, 0x4] - str r4, [sp, 0x8] - str r5, [sp, 0xC] - str r6, [sp, 0x10] - mov r2, r8 - mov r3, r9 - bl sub_8008030 - add sp, 0x14 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08008024: .4byte gUnknown_2027370 -_08008028: .4byte gUnknown_202B038 - thumb_func_end sub_8007FEC - - thumb_func_start nullsub_161 -nullsub_161: - bx lr - thumb_func_end nullsub_161 - - thumb_func_start sub_8008030 -sub_8008030: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x10 - str r1, [sp] - ldr r1, [sp, 0x30] - mov r8, r1 - ldr r6, [sp, 0x3C] - lsls r1, r2, 3 - adds r1, r2 - lsls r1, 3 - adds r5, r0, r1 - adds r0, r3, 0 - cmp r3, 0 - bge _08008054 - adds r0, r3, 0x7 -_08008054: - asrs r3, r0, 3 - mov r0, r8 - cmp r0, 0 - bge _0800805E - adds r0, 0x7 -_0800805E: - asrs r0, 3 - mov r8, r0 - ldr r0, [sp, 0x34] - cmp r0, 0 - bge _0800806A - adds r0, 0x7 -_0800806A: - asrs r0, 3 - str r0, [sp, 0x34] - ldr r0, [sp, 0x38] - cmp r0, 0 - bge _08008076 - adds r0, 0x7 -_08008076: - asrs r0, 3 - str r0, [sp, 0x38] - ldr r2, [sp, 0x40] - lsls r2, 12 - str r2, [sp, 0x40] - movs r1, 0x8 - ldrsh r0, [r5, r1] - cmp r8, r0 - blt _0800808A - b _08008194 -_0800808A: - movs r2, 0x4 - ldrsh r0, [r5, r2] - mov r1, r8 - muls r1, r0 - adds r0, r1, 0 - ldr r1, [sp, 0x34] - adds r2, r3, r1 - adds r0, r2 - lsls r0, 5 - ldr r1, [r5, 0x18] - adds r1, r0 - mov r10, r1 - movs r3, 0 - str r3, [sp, 0x4] - str r2, [sp, 0xC] - ldr r0, [sp, 0x38] - cmp r3, r0 - bge _08008194 -_080080AE: - ldr r7, [sp, 0xC] - mov r4, r10 - mov r1, r8 - adds r1, 0x1 - str r1, [sp, 0x8] - ldr r2, [sp, 0x34] - cmp r2, 0 - ble _08008172 - mov r9, r2 -_080080C0: - subs r7, 0x1 - subs r4, 0x20 - movs r3, 0x4 - ldrsh r0, [r5, r3] - cmp r7, r0 - bge _08008164 - ldr r0, [r5, 0x3C] - cmp r0, r4 - bls _080080D4 - str r4, [r5, 0x3C] -_080080D4: - ldm r6!, {r0} - bl sub_8007FA8 - str r0, [r4] - ldm r6!, {r0} - bl sub_8007FA8 - str r0, [r4, 0x4] - ldm r6!, {r0} - bl sub_8007FA8 - str r0, [r4, 0x8] - ldm r6!, {r0} - bl sub_8007FA8 - str r0, [r4, 0xC] - ldm r6!, {r0} - bl sub_8007FA8 - str r0, [r4, 0x10] - ldm r6!, {r0} - bl sub_8007FA8 - str r0, [r4, 0x14] - ldm r6!, {r0} - bl sub_8007FA8 - str r0, [r4, 0x18] - ldm r6!, {r0} - bl sub_8007FA8 - str r0, [r4, 0x1C] - adds r1, r4, 0 - adds r1, 0x20 - ldr r0, [r5, 0x40] - cmp r0, r1 - bcs _08008120 - str r1, [r5, 0x40] -_08008120: - movs r1, 0x2 - ldrsh r0, [r5, r1] - add r0, r8 - movs r2, 0 - ldrsh r1, [r5, r2] - adds r1, r7 - lsls r1, 1 - lsls r0, 6 - ldr r3, [sp] - adds r0, r3 - adds r1, r0 - ldrh r0, [r1] - ldr r3, _08008160 - adds r2, r3, 0 - ands r0, r2 - strh r0, [r1] - movs r1, 0x2 - ldrsh r0, [r5, r1] - add r0, r8 - movs r2, 0 - ldrsh r1, [r5, r2] - adds r1, r7 - lsls r1, 1 - lsls r0, 6 - ldr r3, [sp] - adds r0, r3 - adds r1, r0 - ldrh r2, [r1] - ldr r0, [sp, 0x40] - orrs r0, r2 - strh r0, [r1] - b _08008166 - .align 2, 0 -_08008160: .4byte 0x00000fff -_08008164: - adds r6, 0x20 -_08008166: - movs r0, 0x1 - negs r0, r0 - add r9, r0 - mov r1, r9 - cmp r1, 0 - bne _080080C0 -_08008172: - ldr r2, [sp, 0x8] - mov r8, r2 - ldr r0, [r5, 0x20] - lsls r0, 2 - add r10, r0 - movs r3, 0x20 - add r10, r3 - movs r1, 0x8 - ldrsh r0, [r5, r1] - cmp r8, r0 - bge _08008194 - ldr r2, [sp, 0x4] - adds r2, 0x1 - str r2, [sp, 0x4] - ldr r3, [sp, 0x38] - cmp r2, r3 - blt _080080AE -_08008194: - add sp, 0x10 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8008030 - - thumb_func_start sub_80081A4 -sub_80081A4: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - str r1, [sp] - lsls r1, r0, 3 - adds r1, r0 - lsls r1, 3 - ldr r0, _08008234 - adds r6, r1, r0 - lsls r3, 7 - ldr r0, _08008238 - adds r3, r0 - ldr r0, [sp] - cmp r0, 0 - bge _080081CA - adds r0, 0x7 -_080081CA: - asrs r0, 3 - str r0, [sp] - adds r0, r2, 0 - cmp r2, 0 - bge _080081D6 - adds r0, r2, 0x7 -_080081D6: - asrs r2, r0, 3 - movs r0, 0x2 - mov r9, r0 - mov r10, r0 - movs r1, 0x8 - ldrsh r0, [r6, r1] - cmp r2, r0 - bge _08008262 - movs r7, 0x4 - ldrsh r0, [r6, r7] - muls r0, r2 - ldr r1, [sp] - adds r0, r1 - lsls r0, 5 - ldr r1, [r6, 0x28] - adds r5, r1, r0 - movs r7, 0 - mov r8, r7 -_080081FA: - ldr r4, [sp] - adds r1, r5, 0 - adds r2, 0x1 - mov r12, r2 - mov r0, r9 - cmp r0, 0 - beq _08008248 - mov r2, r9 -_0800820A: - movs r7, 0x4 - ldrsh r0, [r6, r7] - cmp r4, r0 - bge _0800823C - ldm r3!, {r0} - stm r1!, {r0} - ldm r3!, {r0} - stm r1!, {r0} - ldm r3!, {r0} - stm r1!, {r0} - ldm r3!, {r0} - stm r1!, {r0} - ldm r3!, {r0} - stm r1!, {r0} - ldm r3!, {r0} - stm r1!, {r0} - ldm r3!, {r0} - stm r1!, {r0} - ldm r3!, {r0} - stm r1!, {r0} - b _08008240 - .align 2, 0 -_08008234: .4byte gUnknown_2027370 -_08008238: .4byte gUnknown_80B86B4 -_0800823C: - adds r1, 0x20 - adds r3, 0x20 -_08008240: - adds r4, 0x1 - subs r2, 0x1 - cmp r2, 0 - bne _0800820A -_08008248: - mov r2, r12 - ldr r0, [r6, 0x20] - lsls r0, 2 - adds r5, r0 - adds r5, 0x20 - movs r1, 0x8 - ldrsh r0, [r6, r1] - cmp r2, r0 - bge _08008262 - movs r7, 0x1 - add r8, r7 - cmp r8, r10 - blt _080081FA -_08008262: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_80081A4 - - thumb_func_start sub_8008274 -sub_8008274: - push {r4,lr} - sub sp, 0x4 - adds r4, r0, 0 - adds r3, r1, 0 - ldr r0, _08008290 - ldr r1, _08008294 - str r2, [sp] - adds r2, r4, 0 - bl sub_800829C - add sp, 0x4 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08008290: .4byte gUnknown_2027370 -_08008294: .4byte gUnknown_202B038 - thumb_func_end sub_8008274 - - thumb_func_start nullsub_162 -nullsub_162: - bx lr - thumb_func_end nullsub_162 - - thumb_func_start sub_800829C -sub_800829C: - push {r4-r7,lr} - mov r7, r8 - push {r7} - mov r8, r1 - ldr r7, [sp, 0x18] - lsls r1, r2, 3 - adds r1, r2 - lsls r1, 3 - adds r4, r0, r1 - lsls r7, 12 - ldr r0, [r4, 0x18] - movs r1, 0x4 - ldrsh r2, [r4, r1] - movs r5, 0x8 - ldrsh r1, [r4, r5] - lsls r1, 5 - muls r1, r2 - adds r2, r3, 0 - bl DecompressAT - movs r2, 0 - movs r1, 0x8 - ldrsh r0, [r4, r1] - cmp r2, r0 - bge _08008312 - movs r0, 0x4 - ldrsh r5, [r4, r0] - mov r12, r5 -_080082D4: - adds r5, r2, 0x1 - mov r1, r12 - cmp r1, 0 - ble _08008308 - movs r0, 0x2 - ldrsh r1, [r4, r0] - adds r1, r2 - movs r2, 0 - ldrsh r0, [r4, r2] - lsls r1, 6 - ldr r6, _08008330 - lsls r0, 1 - adds r0, r1 - mov r1, r8 - adds r2, r0, r1 - movs r0, 0x4 - ldrsh r3, [r4, r0] -_080082F6: - ldrh r1, [r2] - adds r0, r6, 0 - ands r0, r1 - orrs r0, r7 - strh r0, [r2] - adds r2, 0x2 - subs r3, 0x1 - cmp r3, 0 - bne _080082F6 -_08008308: - adds r2, r5, 0 - movs r1, 0x8 - ldrsh r0, [r4, r1] - cmp r2, r0 - blt _080082D4 -_08008312: - ldr r0, [r4, 0x28] - str r0, [r4, 0x30] - ldr r0, [r4, 0x1C] - str r0, [r4, 0x34] - ldr r0, [r4, 0x2C] - str r0, [r4, 0x38] - adds r1, r4, 0 - adds r1, 0x44 - movs r0, 0x1 - strb r0, [r1] - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08008330: .4byte 0x00000fff - thumb_func_end sub_800829C thumb_func_start sub_8008334 sub_8008334: diff --git a/src/text2.c b/src/text2.c index 488771757..6676aa0b1 100644 --- a/src/text2.c +++ b/src/text2.c @@ -1,6 +1,7 @@ #include "global.h" #include "text1.h" #include "text2.h" +#include "decompress.h" // data.s extern const u32 gUnknown_80B853C[16]; @@ -2475,51 +2476,201 @@ UNUSED static void nullsub_160(void) void sub_8007E64(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 *a7, u32 a8) { s32 i, j; - UnkTextStruct1 *r4 = &a0[a2]; + UnkTextStruct1 *strPtr = &a0[a2]; a3 /= 8; a4 /= 8; a5 /= 8; a6 /= 8; a8 *= 4096; - if (a4 < r4->unk8) { - s32 id = (r4->unk4 * a4) + a3; - u32 *r8 = &r4->unk18[id * 8]; + if (a4 < strPtr->unk8) { + s32 id = (strPtr->unk4 * a4) + a3; + u32 *unk18Ptr = &strPtr->unk18[id * 8]; for (i = 0; i < a6; i++) { - s32 r6 = a3; - u32 *r3 = r8; + s32 xMaybe = a3; + u32 *loopUnk18Ptr = unk18Ptr; for (j = 0; j < a5; j++) { - if (r6 < r4->unk4) { - if (r4->unk3C > r3) { - r4->unk3C = r3; + if (xMaybe < strPtr->unk4) { + if (strPtr->unk3C > loopUnk18Ptr) { + strPtr->unk3C = loopUnk18Ptr; } - *(r3++) = *(a7++); - *(r3++) = *(a7++); - *(r3++) = *(a7++); - *(r3++) = *(a7++); - *(r3++) = *(a7++); - *(r3++) = *(a7++); - *(r3++) = *(a7++); - *(r3++) = *a7; - if (r4->unk40 < r3) { - r4->unk40 = r3; + *(loopUnk18Ptr++) = *(a7++); + *(loopUnk18Ptr++) = *(a7++); + *(loopUnk18Ptr++) = *(a7++); + *(loopUnk18Ptr++) = *(a7++); + *(loopUnk18Ptr++) = *(a7++); + *(loopUnk18Ptr++) = *(a7++); + *(loopUnk18Ptr++) = *(a7++); + *(loopUnk18Ptr++) = *a7; + if (strPtr->unk40 < loopUnk18Ptr) { + strPtr->unk40 = loopUnk18Ptr; } a7++; - a1[r4->unk2 + a4][r4->unk0 + r6] &= 0xFFF; - a1[r4->unk2 + a4][r4->unk0 + r6] |= a8; + a1[strPtr->unk2 + a4][strPtr->unk0 + xMaybe] &= 0xFFF; + a1[strPtr->unk2 + a4][strPtr->unk0 + xMaybe] |= a8; } else { - r3 += 8; + loopUnk18Ptr += 8; a7 += 8; } - r6++; + xMaybe++; } a4++; - r8 += r4->unk20; - r8 += 8; - if (a4 >= r4->unk8) + unk18Ptr += strPtr->unk20; + unk18Ptr += 8; + if (a4 >= strPtr->unk8) break; } } } + +u32 sub_8007FA8(u32 a0) +{ + u32 r0; + + r0 = (a0 >> 28) & 0xF; + r0 |= (a0 >> 20) & 0xF0; + r0 |= (a0 >> 12) & 0xF00; + r0 |= (a0 >> 4) & 0xF000; + r0 |= (a0 << 4) & 0xF0000; + r0 |= (a0 << 12) & 0xF00000; + r0 |= (a0 << 20) & 0xF000000; + r0 |= (a0 << 28) & 0xF0000000; + + return r0; +} + +void sub_8008030(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 *a7, u32 a8); + +UNUSED void sub_8007FEC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, u32 *a5, u32 a6) +{ + sub_8008030(gUnknown_2027370, gUnknown_202B038[0], a0, a1, a2, a3, a4, a5, a6); +} + +void nullsub_161(void) {} + +// Similar to sub_8007E64 +void sub_8008030(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 *a7, u32 a8) +{ + s32 i, j; + UnkTextStruct1 *strPtr = &a0[a2]; + + a3 /= 8; + a4 /= 8; + a5 /= 8; + a6 /= 8; + a8 *= 4096; + if (a4 < strPtr->unk8) { + u32 *unk18Ptr = &strPtr->unk18[((strPtr->unk4 * a4) + (a3 + a5)) * 8]; + for (i = 0; i < a6; i++) { + s32 xMaybe = a3 + a5; + u32 *loopUnk18Ptr = unk18Ptr; + for (j = 0; j < a5; j++) { + xMaybe--; + loopUnk18Ptr -= 8; + if (xMaybe < strPtr->unk4) { + if (strPtr->unk3C > loopUnk18Ptr) { + strPtr->unk3C = loopUnk18Ptr; + } + loopUnk18Ptr[0] = sub_8007FA8(*(a7++)); + loopUnk18Ptr[1] = sub_8007FA8(*(a7++)); + loopUnk18Ptr[2] = sub_8007FA8(*(a7++)); + loopUnk18Ptr[3] = sub_8007FA8(*(a7++)); + loopUnk18Ptr[4] = sub_8007FA8(*(a7++)); + loopUnk18Ptr[5] = sub_8007FA8(*(a7++)); + loopUnk18Ptr[6] = sub_8007FA8(*(a7++)); + loopUnk18Ptr[7] = sub_8007FA8(*(a7++)); + if (strPtr->unk40 < loopUnk18Ptr + 8) { + strPtr->unk40 = loopUnk18Ptr + 8; + } + a1[strPtr->unk2 + a4][strPtr->unk0 + xMaybe] &= 0xFFF; + a1[strPtr->unk2 + a4][strPtr->unk0 + xMaybe] |= a8; + } + else { + a7 += 8; + } + } + a4++; + unk18Ptr += strPtr->unk20; + unk18Ptr += 8; + if (a4 >= strPtr->unk8) + break; + } + } +} + +extern const u32 gUnknown_80B86B4[][32]; + +// Similar to sub_8007E64 +UNUSED void sub_80081A4(s32 a0, s32 a3, s32 a4, s32 a7Id) +{ + s32 i, j, a5, a6; + UnkTextStruct1 *strPtr = &gUnknown_2027370[a0]; + const u32 *a7 = gUnknown_80B86B4[a7Id]; + + a3 /= 8; + a4 /= 8; + a5 = 2; + a6 = 2; + if (a4 < strPtr->unk8) { + s32 id = (strPtr->unk4 * a4) + a3; + u32 *unk18Ptr = &strPtr->unk28[id * 8]; + + for (i = 0; i < a6; i++) { + s32 xMaybe = a3; + u32 *loopUnk18Ptr = unk18Ptr; + for (j = 0; j < a5; j++) { + if (xMaybe < strPtr->unk4) { + *(loopUnk18Ptr++) = *(a7++); + *(loopUnk18Ptr++) = *(a7++); + *(loopUnk18Ptr++) = *(a7++); + *(loopUnk18Ptr++) = *(a7++); + *(loopUnk18Ptr++) = *(a7++); + *(loopUnk18Ptr++) = *(a7++); + *(loopUnk18Ptr++) = *(a7++); + *(loopUnk18Ptr++) = *a7; + a7++; + } + else { + loopUnk18Ptr += 8; + a7 += 8; + } + xMaybe++; + } + a4++; + unk18Ptr += strPtr->unk20; + unk18Ptr += 8; + if (a4 >= strPtr->unk8) + break; + } + } +} + +void sub_800829C(UnkTextStruct1 *a0, u16 a1[32][32], s32 a2, const u8 *compressedData, u32 a4); + +void sub_8008274(s32 a0, const u8 *compressedData, s32 a2) +{ + sub_800829C(gUnknown_2027370, gUnknown_202B038[0], a0, compressedData, a2); +} + +void nullsub_162() {} + +void sub_800829C(UnkTextStruct1 *a0, u16 a1[32][32], s32 a2, const u8 *compressedData, u32 a4) +{ + s32 i, j; + UnkTextStruct1 *strPtr = &a0[a2]; + + a4 *= 4096; + DecompressAT((u8 *)strPtr->unk18, (strPtr->unk4 * 32) * strPtr->unk8, compressedData); + for (i = 0; i < strPtr->unk8; i++) { + for (j = 0; j < strPtr->unk4; j++) { + a1[strPtr->unk2 + i][strPtr->unk0 + j] &= 0xFFF; + a1[strPtr->unk2 + i][strPtr->unk0 + j] |= a4; + } + } + strPtr->unk30 = strPtr->unk28; + strPtr->unk34 = strPtr->unk1C; + strPtr->unk38 = strPtr->unk2C; + strPtr->unk44 = 1; +}