diff --git a/asm/text.s b/asm/text.s index cfbb08b75..e21244126 100644 --- a/asm/text.s +++ b/asm/text.s @@ -7,505 +7,6 @@ - thumb_func_start sub_8008334 -sub_8008334: - push {r4-r7,lr} - adds r7, r0, 0 - mov r12, r1 - ldr r4, [r7] - ldr r1, [r1] - movs r3, 0 - movs r2, 0 - movs r6, 0xF - movs r5, 0x1C -_08008346: - lsls r2, 4 - lsls r3, 4 - adds r0, r4, 0 - ands r0, r6 - orrs r2, r0 - adds r0, r1, 0 - ands r0, r6 - orrs r3, r0 - lsrs r4, 4 - lsrs r1, 4 - subs r5, 0x4 - cmp r5, 0 - bge _08008346 - str r3, [r7] - mov r0, r12 - str r2, [r0] - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8008334 - - thumb_func_start sub_800836C -sub_800836C: - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - adds r3, r2, 0 - ldr r0, _08008384 - adds r1, r4, 0 - adds r2, r5, 0 - bl sub_800838C - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08008384: .4byte gUnknown_2027370 - thumb_func_end sub_800836C - - thumb_func_start nullsub_163 -nullsub_163: - bx lr - thumb_func_end nullsub_163 - - thumb_func_start sub_800838C -sub_800838C: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - lsls r4, r1, 3 - adds r4, r1 - lsls r4, 3 - adds r7, r0, r4 - adds r0, r1, 0 - adds r1, r2, 0 - adds r2, r3, 0 - bl sub_8008274 - movs r0, 0 - mov r9, r0 - b _08008452 -_080083AE: - movs r1, 0x4 - ldrsh r0, [r7, r1] - lsrs r1, r0, 31 - adds r0, r1 - asrs r0, 1 - mov r8, r0 - ldrh r1, [r7, 0x4] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _080083C8 - movs r0, 0x1 - add r8, r0 -_080083C8: - movs r6, 0 - movs r1, 0x1 - add r1, r9 - mov r10, r1 - cmp r6, r8 - bge _08008450 -_080083D4: - movs r0, 0x4 - ldrsh r1, [r7, r0] - mov r0, r9 - muls r0, r1 - adds r4, r0, r6 - lsls r4, 5 - ldr r5, [r7, 0x18] - adds r4, r5, r4 - subs r0, 0x1 - subs r1, r6 - adds r0, r1 - lsls r0, 5 - adds r5, r0 - adds r0, r4, 0 - adds r4, 0x4 - adds r1, r5, 0 - adds r5, 0x4 - bl sub_8008334 - adds r0, r4, 0 - adds r4, 0x4 - adds r1, r5, 0 - adds r5, 0x4 - bl sub_8008334 - adds r0, r4, 0 - adds r4, 0x4 - adds r1, r5, 0 - adds r5, 0x4 - bl sub_8008334 - adds r0, r4, 0 - adds r4, 0x4 - adds r1, r5, 0 - adds r5, 0x4 - bl sub_8008334 - adds r0, r4, 0 - adds r4, 0x4 - adds r1, r5, 0 - adds r5, 0x4 - bl sub_8008334 - adds r0, r4, 0 - adds r4, 0x4 - adds r1, r5, 0 - adds r5, 0x4 - bl sub_8008334 - adds r0, r4, 0 - adds r4, 0x4 - adds r1, r5, 0 - adds r5, 0x4 - bl sub_8008334 - adds r0, r4, 0 - adds r1, r5, 0 - bl sub_8008334 - adds r6, 0x1 - cmp r6, r8 - blt _080083D4 -_08008450: - mov r9, r10 -_08008452: - movs r1, 0x8 - ldrsh r0, [r7, r1] - cmp r9, r0 - blt _080083AE - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_800838C - - thumb_func_start sub_8008468 -sub_8008468: - push {r4-r6,lr} - mov r6, r8 - push {r6} - sub sp, 0x10 - adds r6, r0, 0 - mov r8, r1 - ldr r4, [sp, 0x24] - ldr r5, [sp, 0x28] - ldr r0, _08008498 - ldr r1, _0800849C - str r2, [sp] - str r3, [sp, 0x4] - str r4, [sp, 0x8] - str r5, [sp, 0xC] - adds r2, r6, 0 - mov r3, r8 - bl sub_80084A4 - add sp, 0x10 - pop {r3} - mov r8, r3 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08008498: .4byte gUnknown_2027370 -_0800849C: .4byte gUnknown_202B038 - thumb_func_end sub_8008468 - - thumb_func_start nullsub_164 -nullsub_164: - bx lr - thumb_func_end nullsub_164 - - thumb_func_start sub_80084A4 -sub_80084A4: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - str r1, [sp] - mov r10, r3 - ldr r6, [sp, 0x24] - ldr r7, [sp, 0x28] - ldr r1, [sp, 0x2C] - mov r12, r1 - lsls r1, r2, 3 - adds r1, r2 - lsls r1, 3 - adds r4, r0, r1 - mov r0, r10 - cmp r0, 0 - bge _080084CC - adds r0, 0x7 -_080084CC: - asrs r0, 3 - mov r10, r0 - adds r0, r6, 0 - cmp r6, 0 - bge _080084D8 - adds r0, r6, 0x7 -_080084D8: - asrs r6, r0, 3 - adds r0, r7, 0 - cmp r7, 0 - bge _080084E2 - adds r0, r7, 0x7 -_080084E2: - asrs r7, r0, 3 - mov r0, r12 - cmp r0, 0 - bge _080084EC - adds r0, 0x7 -_080084EC: - asrs r0, 3 - mov r12, r0 - ldr r2, [sp, 0x30] - lsls r2, 12 - str r2, [sp, 0x30] - movs r1, 0x8 - ldrsh r0, [r4, r1] - cmp r6, r0 - bge _08008570 - movs r2, 0 - mov r8, r2 - cmp r8, r12 - bge _08008570 -_08008506: - mov r3, r10 - adds r0, r6, 0x1 - mov r9, r0 - cmp r7, 0 - ble _0800855E - adds r5, r7, 0 -_08008512: - movs r1, 0x4 - ldrsh r0, [r4, r1] - cmp r3, r0 - bge _08008556 - movs r2, 0x2 - ldrsh r0, [r4, r2] - adds r0, r6 - movs r2, 0 - ldrsh r1, [r4, r2] - adds r1, r3 - lsls r1, 1 - lsls r0, 6 - ldr r2, [sp] - adds r0, r2 - adds r1, r0 - ldrh r2, [r1] - ldr r0, _08008580 - ands r0, r2 - strh r0, [r1] - movs r1, 0x2 - ldrsh r0, [r4, r1] - adds r0, r6 - movs r2, 0 - ldrsh r1, [r4, r2] - adds r1, r3 - lsls r1, 1 - lsls r0, 6 - ldr r2, [sp] - adds r0, r2 - adds r1, r0 - ldrh r2, [r1] - ldr r0, [sp, 0x30] - orrs r0, r2 - strh r0, [r1] -_08008556: - adds r3, 0x1 - subs r5, 0x1 - cmp r5, 0 - bne _08008512 -_0800855E: - mov r6, r9 - movs r1, 0x8 - ldrsh r0, [r4, r1] - cmp r6, r0 - bge _08008570 - movs r2, 0x1 - add r8, r2 - cmp r8, r12 - blt _08008506 -_08008570: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08008580: .4byte 0x00000fff - thumb_func_end sub_80084A4 - - thumb_func_start GetCharacter -GetCharacter: - push {r4,r5,lr} - adds r3, r0, 0 - ldr r1, _080085C4 - ldr r0, _080085C8 - ldr r0, [r0] - lsls r0, 2 - adds r0, r1 - ldr r2, [r0] - ldr r5, [r2, 0x4] - ldr r0, _080085CC - adds r1, r3, r0 - ldr r0, _080085D0 - cmp r1, r0 - bhi _080085D4 - movs r2, 0xFF - ands r2, r3 - movs r1, 0xFF - lsls r1, 8 - ands r1, r3 - asrs r1, 8 - subs r2, 0x20 - subs r1, 0xF8 - lsls r0, r1, 3 - subs r0, r1 - lsls r0, 5 - adds r0, r2 - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 2 - adds r1, r5, r1 - b _08008624 - .align 2, 0 -_080085C4: .4byte gCharmaps -_080085C8: .4byte gCurrentCharmap -_080085CC: .4byte 0xffff0800 -_080085D0: .4byte 0x000007fe -_080085D4: - movs r4, 0 - ldr r0, [r2] - subs r2, r0, 0x1 - cmp r4, r2 - bge _08008614 - lsrs r0, r2, 31 - adds r0, r2, r0 - b _08008602 -_080085E4: - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - adds r0, r5 - ldrh r0, [r0, 0x4] - cmp r0, r3 - bge _080085F6 - adds r4, r1, 0x1 - b _080085F8 -_080085F6: - adds r2, r1, 0 -_080085F8: - cmp r4, r2 - bge _08008614 - adds r0, r4, r2 - lsrs r1, r0, 31 - adds r0, r1 -_08008602: - asrs r1, r0, 1 - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - adds r0, r5 - ldrh r0, [r0, 0x4] - cmp r0, r3 - bne _080085E4 - adds r4, r1, 0 -_08008614: - lsls r0, r4, 1 - adds r0, r4 - lsls r0, 2 - adds r1, r5, r0 - ldrh r0, [r1, 0x4] - cmp r0, r3 - beq _08008624 - ldr r1, _0800862C -_08008624: - adds r0, r1, 0 - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_0800862C: .4byte gUnknown_80B86A4 - thumb_func_end GetCharacter - - thumb_func_start HexDigitValue -HexDigitValue: - push {lr} - lsls r0, 24 - lsrs r1, r0, 24 - adds r3, r1, 0 - adds r2, r1, 0 - subs r2, 0x30 - lsls r0, r2, 24 - lsrs r0, 24 - cmp r0, 0x9 - bhi _08008648 - adds r0, r2, 0 - b _0800865C -_08008648: - adds r0, r1, 0 - subs r0, 0x61 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x5 - bls _08008658 - movs r0, 0x1 - b _0800865C -_08008658: - adds r0, r3, 0 - subs r0, 0x57 -_0800865C: - pop {r1} - bx r1 - thumb_func_end HexDigitValue - - thumb_func_start xxx_get_next_char_from_string -xxx_get_next_char_from_string: - push {r4-r6,lr} - adds r5, r0, 0 - adds r6, r1, 0 - ldrb r1, [r5] - cmp r1, 0x7E - bne _08008696 - adds r5, 0x1 - ldrb r0, [r5] - bl HexDigitValue - adds r4, r0, 0 - ldrb r0, [r5, 0x1] - bl HexDigitValue - lsls r4, 4 - adds r4, r0 - ldrb r0, [r5] - cmp r0, 0 - beq _08008690 - adds r5, 0x1 - ldrb r0, [r5] - cmp r0, 0 - beq _08008690 - adds r5, 0x1 -_08008690: - str r4, [r6] - adds r0, r5, 0 - b _080086B2 -_08008696: - adds r0, r1, 0 - subs r0, 0x81 - cmp r0, 0x3 - bls _080086A2 - cmp r1, 0x87 - bne _080086AE -_080086A2: - ldrb r0, [r5, 0x1] - lsls r1, 8 - orrs r0, r1 - str r0, [r6] - adds r0, r5, 0x2 - b _080086B2 -_080086AE: - str r1, [r6] - adds r0, r5, 0x1 -_080086B2: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end xxx_get_next_char_from_string thumb_func_start nullsub_165 nullsub_165: diff --git a/include/text2.h b/include/text2.h index 0dd6c9388..07e118c22 100644 --- a/include/text2.h +++ b/include/text2.h @@ -12,12 +12,13 @@ struct unkShiftData u32 shift_right; }; -// size: 0x8 +// size: 0xC struct unkChar { u32 *unk0; - s16 unk4; + u16 unk4; s16 unk6; + u32 fill8; }; struct unkStruct_80B8824 @@ -42,9 +43,9 @@ void sub_8007B7C(u32, s32, s32, s32, u32); void sub_8007E20(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, u32 *a5, u32 a6); // text.s -extern struct unkChar *GetCharacter(u32); +extern const struct unkChar *GetCharacter(s32); extern void InitGraphics(void); -extern void sub_800836C(u32, u8 *, u32); +void sub_800836C(s32 a0, const u8 *compressedData, s32 a1); extern void sub_800898C(void); extern void sub_80089AC(const UnkTextStruct2 *, UnkTextStruct2_sub *); extern void CallPrepareTextbox_8008C54(u32); diff --git a/src/code_8012A18_1.c b/src/code_8012A18_1.c index abc761f47..99e4919a4 100644 --- a/src/code_8012A18_1.c +++ b/src/code_8012A18_1.c @@ -7,7 +7,7 @@ s32 sub_8015FEC(u8 *buffer, s32 size) { - struct unkChar *iVar2; + const struct unkChar *iVar2; s32 currLength; s32 length; u8 *bufferPtr; @@ -31,4 +31,4 @@ s32 sub_8015FEC(u8 *buffer, s32 size) s32 sub_8016028(void) { return 60; -} \ No newline at end of file +} diff --git a/src/code_803D110.c b/src/code_803D110.c index 6f815efd9..d3c040dcf 100644 --- a/src/code_803D110.c +++ b/src/code_803D110.c @@ -59,6 +59,7 @@ struct UnkDataFileStruct u16 **unk10; }; +// Very similar to unkChar struct struct UnkStruct_sub_803DC6C { u8 *unk0; @@ -759,7 +760,7 @@ struct UnkStruct_sub_803DC6C *sub_803DEC8(s32 chr) if (chr > 63487 && chr < 65535) { s32 r2 = chr & 0xFF; - s32 r1 = (chr & 0xFF00) / 256; + s32 r1 = (chr & 0xFF00) >> 8; r2 -= 32; r1 -= 248; ret = &strPtr[r1 * 224 + r2]; diff --git a/src/menu_input.c b/src/menu_input.c index 5efb1c3bc..1219dde1a 100644 --- a/src/menu_input.c +++ b/src/menu_input.c @@ -167,7 +167,7 @@ void sub_8012BC4(u32 x, u32 y, s32 n, s32 len, u32 color, u32 a5) { s32 iVar1; u32 uVar2; - struct unkChar *iVar3; + const struct unkChar *iVar3; s32 counter; s32 *piVar3; s32 *piVar4; @@ -212,7 +212,7 @@ void sub_8012BC4(u32 x, u32 y, s32 n, s32 len, u32 color, u32 a5) void sub_8012C60(u32 x, u32 y, u32 a2, u32 color, u32 a4) { u32 add_x; - struct unkChar *iVar3; + const struct unkChar *iVar3; u32 uVar2; uVar2 = ReturnIntFromChar2(a2); diff --git a/src/text2.c b/src/text2.c index 6676aa0b1..e8bb9d5f2 100644 --- a/src/text2.c +++ b/src/text2.c @@ -2654,7 +2654,7 @@ void sub_8008274(s32 a0, const u8 *compressedData, s32 a2) sub_800829C(gUnknown_2027370, gUnknown_202B038[0], a0, compressedData, a2); } -void nullsub_162() {} +UNUSED void nullsub_162() {} void sub_800829C(UnkTextStruct1 *a0, u16 a1[32][32], s32 a2, const u8 *compressedData, u32 a4) { @@ -2674,3 +2674,191 @@ void sub_800829C(UnkTextStruct1 *a0, u16 a1[32][32], s32 a2, const u8 *compresse strPtr->unk38 = strPtr->unk2C; strPtr->unk44 = 1; } + +void sub_8008334(u32 *r7, u32 *r12) +{ + s32 i; + u32 r2, r3; + u32 r4, r1; + + r4 = *r7; + r1 = *r12; + + r3 = 0; + r2 = 0; + + for (i = 0; i < 32; i += 4) { + r2 <<= 4; + r3 <<= 4; + r2 |= r4 & 0xF; + r3 |= r1 & 0xF; + r4 >>= 4; + r1 >>= 4; + } + *r7 = r3; + *r12 = r2; +} + +void sub_800838C(UnkTextStruct1 *a0, s32 a1, const u8 *compressedData, s32 a3); + +void sub_800836C(s32 a0, const u8 *compressedData, s32 a1) +{ + sub_800838C(gUnknown_2027370, a0, compressedData, a1); +} + +UNUSED void nullsub_163(void) {} + +void sub_800838C(UnkTextStruct1 *a0, s32 a1, const u8 *compressedData, s32 a3) +{ + s32 i, j; + UnkTextStruct1 *strPtr = &a0[a1]; + + sub_8008274(a1, compressedData, a3); + for (i = 0; i < strPtr->unk8; i++) { + s32 r8 = strPtr->unk4 / 2; + if (strPtr->unk4 & 1) + r8++; + for (j = 0; j < r8; j++) { + u32 *r4, *r5; + s32 unk4Mul = strPtr->unk4 * i; + + r4 = &strPtr->unk18[(unk4Mul + j) * 8]; + unk4Mul--; + r5 = &strPtr->unk18[(unk4Mul + (strPtr->unk4 - j)) * 8]; + + sub_8008334(r4++, r5++); + sub_8008334(r4++, r5++); + sub_8008334(r4++, r5++); + sub_8008334(r4++, r5++); + sub_8008334(r4++, r5++); + sub_8008334(r4++, r5++); + sub_8008334(r4++, r5++); + sub_8008334(r4++, r5++); + } + } +} + +void sub_80084A4(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 a8); + +UNUSED void sub_8008468(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, u32 a6) +{ + sub_80084A4(gUnknown_2027370, gUnknown_202B038[0], a0, a1, a2, a3, a4, a6); +} + +UNUSED void nullsub_164(void) {} + +// Effectively unused +void sub_80084A4(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 a8) +{ + s32 i, j; + UnkTextStruct1 *strPtr = &a0[a2]; + + a3 /= 8; + a4 /= 8; + a5 /= 8; + a6 /= 8; + a8 *= 4096; + if (a4 < strPtr->unk8) { + for (i = 0; i < a6; i++) { + s32 xMaybe = a3; + for (j = 0; j < a5; j++) { + if (xMaybe < strPtr->unk4) { + a1[strPtr->unk2 + a4][strPtr->unk0 + xMaybe] &= 0xFFF; + a1[strPtr->unk2 + a4][strPtr->unk0 + xMaybe] |= a8; + } + xMaybe++; + } + a4++; + if (a4 >= strPtr->unk8) + break; + } + } +} + +extern const struct unkChar gUnknown_80B86A4; + +struct CharMapStruct +{ + s32 unk0; + struct unkChar *unk4; +}; +extern struct CharMapStruct *gCharmaps[]; +extern s32 gCurrentCharmap; + +// Oddly similar to sub_803DEC8 +const struct unkChar *GetCharacter(s32 chr) +{ + s32 r2, r4; + const struct unkChar *ret; + const struct unkChar *strPtr = gCharmaps[gCurrentCharmap]->unk4; + // Fakematch? Or just magic numbers which will make more sense once this file is documented? + if (chr > 63487 && chr < 65535) + { + s32 r2 = chr & 0xFF; + s32 r1 = (chr & 0xFF00) >> 8; + r2 -= 32; + r1 -= 248; + ret = &strPtr[r1 * 224 + r2]; + } + else + { + r4 = 0; + r2 = gCharmaps[gCurrentCharmap]->unk0 - 1; + while (r4 < r2) { + s32 r1 = (r4 + r2) / 2; + if (strPtr[r1].unk4 == chr) { + r4 = r1; + break; + } + else if (strPtr[r1].unk4 < chr) { + r4 = r1 + 1; + } + else { + r2 = r1; + } + } + + ret = &strPtr[r4]; + if (ret->unk4 != chr) + ret = &gUnknown_80B86A4; + + } + return ret; +} + +s32 HexDigitValue(u8 chr) +{ + if (chr >= '0' && chr <= '9') + return chr - '0'; + else if (chr >= 'a' && chr <= 'f') + return (chr - 'a') + 10; + else + return 1; +} + +u8 *xxx_get_next_char_from_string(u8 *a1, u32 *a0) +{ + s32 currChr = *a1; + if (currChr == 0x7E) { + s32 hexDigit; + + a1++; + hexDigit = (HexDigitValue(a1[0]) << 4) + HexDigitValue(a1[1]); + if (*a1 != '\0') { + a1++; + if (*a1 != '\0') { + a1++; + } + } + *a0 = hexDigit; + return a1; + } + else if ((currChr >= 0x81 && currChr <= 0x84) || currChr == 0x87) { + *a0 = a1[1] | (a1[0] << 8); + return a1 + 2; + } + else { + *a0 = currChr; + return a1 + 1; + } +}