diff --git a/include/text2.h b/include/text2.h index 1f8c86864..14bdc2848 100644 --- a/include/text2.h +++ b/include/text2.h @@ -15,10 +15,12 @@ struct unkShiftData // size: 0xC struct unkChar { - u32 *unk0; + u16 *unk0; u16 unk4; s16 unk6; - u32 fill8; + u8 fill8; + u8 fill9; + u8 unkA; }; struct unkStruct_80B8824 diff --git a/src/text2.c b/src/text2.c index 781da90d2..123b363ba 100644 --- a/src/text2.c +++ b/src/text2.c @@ -1254,578 +1254,208 @@ bool8 sub_8007464(void) return FALSE; } -// https://decomp.me/scratch/F06Ty -NAKED -u32 xxx_draw_char(UnkTextStruct1 *a0, s32 x, s32 y, u32 a3, u32 color, u32 a5) +extern const u32 gUnknown_80B853C[16]; + +struct CharMapStruct { - asm_unified( - "push {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x28\n" - "\tadds r6, r1, 0\n" - "\tmov r10, r2\n" - "\tadds r4, r3, 0\n" - "\tldr r2, [sp, 0x48]\n" - "\tldr r3, [sp, 0x4C]\n" - "\tlsls r1, r3, 3\n" - "\tadds r1, r3\n" - "\tlsls r1, 3\n" - "\tadds r5, r0, r1\n" - "\tldr r1, _080074B8\n" - "\tmovs r0, 0xF\n" - "\tands r2, r0\n" - "\tlsls r2, 2\n" - "\tadds r2, r1\n" - "\tldr r2, [r2]\n" - "\tstr r2, [sp, 0x18]\n" - "\tldr r0, _080074BC\n" - "\tldr r0, [r0]\n" - "\tcmp r0, 0x1\n" - "\tbne _080074CC\n" - "\tcmp r4, 0x70\n" - "\tbeq _080074B0\n" - "\tcmp r4, 0x6A\n" - "\tbeq _080074B0\n" - "\tcmp r4, 0x71\n" - "\tbeq _080074B0\n" - "\tcmp r4, 0x79\n" - "\tbeq _080074B0\n" - "\tcmp r4, 0x67\n" - "\tbne _080074C0\n" -"_080074B0:\n" - "\tmovs r0, 0x2\n" - "\tadd r10, r0\n" - "\tb _080074CC\n" - "\t.align 2, 0\n" -"_080074B8: .4byte gUnknown_80B853C\n" -"_080074BC: .4byte gCurrentCharmap\n" -"_080074C0:\n" - "\tldr r0, _080074F8\n" - "\tcmp r4, r0\n" - "\tbne _080074CC\n" - "\tmovs r1, 0x2\n" - "\tnegs r1, r1\n" - "\tadd r10, r1\n" -"_080074CC:\n" - "\tadds r0, r4, 0\n" - "\tbl GetCharacter\n" - "\tstr r0, [sp]\n" - "\tldr r2, [r0]\n" - "\tstr r2, [sp, 0x4]\n" - "\tstr r2, [sp, 0xC]\n" - "\tadds r3, r2, 0\n" - "\tsubs r3, 0x6\n" - "\tstr r3, [sp, 0x8]\n" - "\tldr r0, _080074FC\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbeq _08007500\n" - "\tldr r4, [sp]\n" - "\tldrb r1, [r4, 0xA]\n" - "\tlsrs r7, r1, 1\n" - "\tmovs r0, 0x1\n" - "\tadds r2, r7, 0\n" - "\tands r2, r0\n" - "\tstr r2, [sp, 0x1C]\n" - "\tb _08007508\n" - "\t.align 2, 0\n" -"_080074F8: .4byte 0x00008199\n" -"_080074FC: .4byte gDrawTextShadow\n" -"_08007500:\n" - "\tmovs r3, 0\n" - "\tstr r3, [sp, 0x1C]\n" - "\tldr r4, [sp]\n" - "\tldrb r1, [r4, 0xA]\n" -"_08007508:\n" - "\tmovs r0, 0x1\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbne _08007512\n" - "\tb _08007670\n" -"_08007512:\n" - "\tmov r0, r10\n" - "\tcmp r0, 0\n" - "\tbge _0800751A\n" - "\tadds r0, 0x7\n" -"_0800751A:\n" - "\tasrs r4, r0, 3\n" - "\tmovs r7, 0x4\n" - "\tldrsh r0, [r5, r7]\n" - "\tmuls r0, r4\n" - "\tadds r2, r6, 0\n" - "\tcmp r6, 0\n" - "\tbge _0800752A\n" - "\tadds r2, r6, 0x7\n" -"_0800752A:\n" - "\tasrs r2, 3\n" - "\tadds r0, r2\n" - "\tlsls r0, 5\n" - "\tldr r1, [r5, 0x18]\n" - "\tadds r3, r1, r0\n" - "\tlsls r0, r4, 3\n" - "\tmov r1, r10\n" - "\tsubs r0, r1, r0\n" - "\tlsls r0, 2\n" - "\tadds r3, r0\n" - "\tlsls r0, r2, 3\n" - "\tsubs r0, r6, r0\n" - "\tlsls r0, 4\n" - "\tldr r1, _08007664\n" - "\tadds r0, r1\n" - "\tmov r12, r0\n" - "\tmov r9, r2\n" - "\tstr r4, [sp, 0x14]\n" - "\tmovs r2, 0x8\n" - "\tldrsh r0, [r5, r2]\n" - "\tcmp r4, r0\n" - "\tblt _08007558\n" - "\tb _0800786C\n" -"_08007558:\n" - "\tmovs r4, 0\n" - "\tstr r4, [sp, 0x10]\n" - "\tldr r2, _08007668\n" - "\tldr r1, _0800766C\n" - "\tldr r0, [r1]\n" - "\tlsls r0, 2\n" - "\tadds r0, r2\n" - "\tldr r0, [r0]\n" - "\tcmp r4, r0\n" - "\tblt _0800756E\n" - "\tb _0800786C\n" -"_0800756E:\n" - "\tadds r4, r2, 0\n" -"_08007570:\n" - "\tldr r6, [sp, 0x4]\n" - "\tldrh r0, [r6, 0x2]\n" - "\tlsls r2, r0, 16\n" - "\tldrh r0, [r6]\n" - "\torrs r2, r0\n" - "\tcmp r2, 0\n" - "\tbeq _080075CC\n" - "\tmovs r7, 0x4\n" - "\tldrsh r0, [r5, r7]\n" - "\tcmp r9, r0\n" - "\tbge _080075A6\n" - "\tmov r0, r12\n" - "\tldr r1, [r0]\n" - "\tands r1, r2\n" - "\tldr r0, [r0, 0x8]\n" - "\tlsls r1, r0\n" - "\tldr r0, [r3]\n" - "\torrs r0, r1\n" - "\tstr r0, [r3]\n" - "\tldr r0, [r5, 0x3C]\n" - "\tcmp r0, r3\n" - "\tbls _0800759E\n" - "\tstr r3, [r5, 0x3C]\n" -"_0800759E:\n" - "\tldr r0, [r5, 0x40]\n" - "\tcmp r0, r3\n" - "\tbcs _080075A6\n" - "\tstr r3, [r5, 0x40]\n" -"_080075A6:\n" - "\tmovs r1, 0x4\n" - "\tldrsh r0, [r5, r1]\n" - "\tsubs r0, 0x1\n" - "\tcmp r9, r0\n" - "\tbge _080075CC\n" - "\tadds r3, 0x20\n" - "\tmov r6, r12\n" - "\tldr r0, [r6, 0x4]\n" - "\tands r2, r0\n" - "\tldr r0, [r6, 0xC]\n" - "\tlsrs r2, r0\n" - "\tldr r0, [r3]\n" - "\torrs r0, r2\n" - "\tstr r0, [r3]\n" - "\tldr r0, [r5, 0x40]\n" - "\tcmp r0, r3\n" - "\tbcs _080075CA\n" - "\tstr r3, [r5, 0x40]\n" -"_080075CA:\n" - "\tsubs r3, 0x20\n" -"_080075CC:\n" - "\tldr r7, [sp, 0x4]\n" - "\tldrh r2, [r7, 0x4]\n" - "\tcmp r2, 0\n" - "\tbeq _08007620\n" - "\tmovs r1, 0x4\n" - "\tldrsh r0, [r5, r1]\n" - "\tsubs r0, 0x1\n" - "\tcmp r9, r0\n" - "\tbge _080075FA\n" - "\tadds r3, 0x20\n" - "\tmov r6, r12\n" - "\tldr r1, [r6]\n" - "\tands r1, r2\n" - "\tldr r0, [r6, 0x8]\n" - "\tlsls r1, r0\n" - "\tldr r0, [r3]\n" - "\torrs r0, r1\n" - "\tstr r0, [r3]\n" - "\tldr r0, [r5, 0x40]\n" - "\tcmp r0, r3\n" - "\tbcs _080075F8\n" - "\tstr r3, [r5, 0x40]\n" -"_080075F8:\n" - "\tsubs r3, 0x20\n" -"_080075FA:\n" - "\tmovs r7, 0x4\n" - "\tldrsh r0, [r5, r7]\n" - "\tsubs r0, 0x2\n" - "\tcmp r9, r0\n" - "\tbge _08007620\n" - "\tadds r3, 0x40\n" - "\tmov r1, r12\n" - "\tldr r0, [r1, 0x4]\n" - "\tands r2, r0\n" - "\tldr r0, [r1, 0xC]\n" - "\tlsrs r2, r0\n" - "\tldr r0, [r3]\n" - "\torrs r0, r2\n" - "\tstr r0, [r3]\n" - "\tldr r0, [r5, 0x40]\n" - "\tcmp r0, r3\n" - "\tbcs _0800761E\n" - "\tstr r3, [r5, 0x40]\n" -"_0800761E:\n" - "\tsubs r3, 0x40\n" -"_08007620:\n" - "\tldr r2, [sp, 0x4]\n" - "\tadds r2, 0x6\n" - "\tstr r2, [sp, 0x4]\n" - "\tadds r3, 0x4\n" - "\tmovs r6, 0x1\n" - "\tadd r10, r6\n" - "\tmovs r0, 0x7\n" - "\tmov r7, r10\n" - "\tands r0, r7\n" - "\tcmp r0, 0\n" - "\tbne _0800764E\n" - "\tldr r0, [r5, 0x20]\n" - "\tlsls r0, 2\n" - "\tadds r3, r0\n" - "\tldr r0, [sp, 0x14]\n" - "\tadds r0, 0x1\n" - "\tstr r0, [sp, 0x14]\n" - "\tmovs r1, 0x8\n" - "\tldrsh r0, [r5, r1]\n" - "\tldr r2, [sp, 0x14]\n" - "\tcmp r2, r0\n" - "\tblt _0800764E\n" - "\tb _0800786C\n" -"_0800764E:\n" - "\tldr r6, [sp, 0x10]\n" - "\tadds r6, 0x1\n" - "\tstr r6, [sp, 0x10]\n" - "\tldr r7, _0800766C\n" - "\tldr r0, [r7]\n" - "\tlsls r0, 2\n" - "\tadds r0, r4\n" - "\tldr r0, [r0]\n" - "\tcmp r6, r0\n" - "\tblt _08007570\n" - "\tb _0800786C\n" - "\t.align 2, 0\n" -"_08007664: .4byte gCharMasksOffsets\n" -"_08007668: .4byte gCharHeight\n" -"_0800766C: .4byte gCurrentCharmap\n" -"_08007670:\n" - "\tmovs r0, 0\n" - "\tstr r0, [sp, 0x20]\n" - "\tmov r0, r10\n" - "\tcmp r0, 0\n" - "\tbge _0800767C\n" - "\tadds r0, 0x7\n" -"_0800767C:\n" - "\tasrs r4, r0, 3\n" - "\tmovs r1, 0x4\n" - "\tldrsh r0, [r5, r1]\n" - "\tadds r1, r4, 0\n" - "\tmuls r1, r0\n" - "\tadds r0, r6, 0\n" - "\tcmp r6, 0\n" - "\tbge _0800768E\n" - "\tadds r0, r6, 0x7\n" -"_0800768E:\n" - "\tasrs r2, r0, 3\n" - "\tadds r0, r1, r2\n" - "\tlsls r0, 5\n" - "\tldr r1, [r5, 0x18]\n" - "\tadds r3, r1, r0\n" - "\tlsls r0, r4, 3\n" - "\tmov r7, r10\n" - "\tsubs r0, r7, r0\n" - "\tlsls r0, 2\n" - "\tadds r3, r0\n" - "\tlsls r0, r2, 3\n" - "\tsubs r0, r6, r0\n" - "\tlsls r0, 4\n" - "\tldr r1, _0800788C\n" - "\tadds r0, r1\n" - "\tmov r12, r0\n" - "\tmov r9, r2\n" - "\tstr r4, [sp, 0x14]\n" - "\tmovs r1, 0x8\n" - "\tldrsh r0, [r5, r1]\n" - "\tcmp r4, r0\n" - "\tblt _080076BC\n" - "\tb _0800786C\n" -"_080076BC:\n" - "\tmovs r2, 0\n" - "\tstr r2, [sp, 0x10]\n" - "\tldr r2, _08007890\n" - "\tldr r1, _08007894\n" - "\tldr r0, [r1]\n" - "\tlsls r0, 2\n" - "\tadds r0, r2\n" - "\tldr r0, [r0]\n" - "\tldr r4, [sp, 0x10]\n" - "\tcmp r4, r0\n" - "\tblt _080076D4\n" - "\tb _0800786C\n" -"_080076D4:\n" - "\tldr r6, [sp, 0x4]\n" - "\tldrh r0, [r6, 0x2]\n" - "\tlsls r4, r0, 16\n" - "\tldrh r0, [r6]\n" - "\torrs r4, r0\n" - "\tldr r1, _08007898\n" - "\tands r1, r4\n" - "\tldr r0, [sp, 0x18]\n" - "\tands r0, r4\n" - "\tadds r2, r1, r0\n" - "\tldr r7, [sp, 0x1C]\n" - "\tcmp r7, 0\n" - "\tbeq _08007724\n" - "\tldr r1, [sp, 0xC]\n" - "\tldrh r0, [r1, 0x2]\n" - "\tlsls r0, 16\n" - "\tldrh r1, [r1]\n" - "\torrs r0, r1\n" - "\tlsls r1, r0, 4\n" - "\tmvns r6, r4\n" - "\tmov r8, r6\n" - "\tbics r1, r4\n" - "\tldr r7, _0800789C\n" - "\tldr r6, [r7]\n" - "\tands r1, r6\n" - "\torrs r2, r1\n" - "\tldr r0, [sp, 0x20]\n" - "\tcmp r0, 0\n" - "\tbeq _08007724\n" - "\tldr r1, [sp, 0x8]\n" - "\tldrh r0, [r1, 0x2]\n" - "\tlsls r0, 16\n" - "\tldrh r1, [r1]\n" - "\torrs r0, r1\n" - "\tlsls r1, r0, 4\n" - "\teors r1, r4\n" - "\tmov r4, r8\n" - "\tands r1, r4\n" - "\tands r1, r6\n" - "\torrs r2, r1\n" -"_08007724:\n" - "\tcmp r2, 0\n" - "\tbeq _08007776\n" - "\tmovs r6, 0x4\n" - "\tldrsh r0, [r5, r6]\n" - "\tcmp r9, r0\n" - "\tbge _08007750\n" - "\tmov r7, r12\n" - "\tldr r1, [r7]\n" - "\tands r1, r2\n" - "\tldr r0, [r7, 0x8]\n" - "\tlsls r1, r0\n" - "\tldr r0, [r3]\n" - "\torrs r0, r1\n" - "\tstr r0, [r3]\n" - "\tldr r0, [r5, 0x3C]\n" - "\tcmp r0, r3\n" - "\tbls _08007748\n" - "\tstr r3, [r5, 0x3C]\n" -"_08007748:\n" - "\tldr r0, [r5, 0x40]\n" - "\tcmp r0, r3\n" - "\tbcs _08007750\n" - "\tstr r3, [r5, 0x40]\n" -"_08007750:\n" - "\tmovs r1, 0x4\n" - "\tldrsh r0, [r5, r1]\n" - "\tsubs r0, 0x1\n" - "\tcmp r9, r0\n" - "\tbge _08007776\n" - "\tadds r3, 0x20\n" - "\tmov r4, r12\n" - "\tldr r0, [r4, 0x4]\n" - "\tands r2, r0\n" - "\tldr r0, [r4, 0xC]\n" - "\tlsrs r2, r0\n" - "\tldr r0, [r3]\n" - "\torrs r0, r2\n" - "\tstr r0, [r3]\n" - "\tldr r0, [r5, 0x40]\n" - "\tcmp r0, r3\n" - "\tbcs _08007774\n" - "\tstr r3, [r5, 0x40]\n" -"_08007774:\n" - "\tsubs r3, 0x20\n" -"_08007776:\n" - "\tldr r6, [sp, 0x4]\n" - "\tldrh r4, [r6, 0x4]\n" - "\tldr r1, _08007898\n" - "\tands r1, r4\n" - "\tldr r0, [sp, 0x18]\n" - "\tands r0, r4\n" - "\tadds r2, r1, r0\n" - "\tldr r7, [sp, 0x1C]\n" - "\tcmp r7, 0\n" - "\tbeq _080077CC\n" - "\tldr r1, [sp, 0xC]\n" - "\tldrh r0, [r1, 0x4]\n" - "\tlsls r1, r0, 4\n" - "\tldr r6, [sp, 0xC]\n" - "\tldrh r0, [r6, 0x2]\n" - "\tmovs r7, 0xF\n" - "\tmov r8, r7\n" - "\tlsrs r0, 12\n" - "\torrs r1, r0\n" - "\tmvns r0, r4\n" - "\tstr r0, [sp, 0x24]\n" - "\tbics r1, r4\n" - "\tldr r7, _0800789C\n" - "\tldr r6, [r7]\n" - "\tands r1, r6\n" - "\torrs r2, r1\n" - "\tldr r0, [sp, 0x20]\n" - "\tcmp r0, 0\n" - "\tbeq _080077CC\n" - "\tldr r1, [sp, 0x8]\n" - "\tldrh r0, [r1, 0x4]\n" - "\tlsls r1, r0, 4\n" - "\tldr r7, [sp, 0x8]\n" - "\tldrh r0, [r7, 0x2]\n" - "\tlsrs r0, 12\n" - "\tmov r7, r8\n" - "\tands r0, r7\n" - "\torrs r1, r0\n" - "\teors r1, r4\n" - "\tldr r0, [sp, 0x24]\n" - "\tands r1, r0\n" - "\tands r1, r6\n" - "\torrs r2, r1\n" -"_080077CC:\n" - "\tcmp r2, 0\n" - "\tbeq _0800781C\n" - "\tmovs r1, 0x4\n" - "\tldrsh r0, [r5, r1]\n" - "\tsubs r0, 0x1\n" - "\tcmp r9, r0\n" - "\tbge _080077F6\n" - "\tadds r3, 0x20\n" - "\tmov r4, r12\n" - "\tldr r1, [r4]\n" - "\tands r1, r2\n" - "\tldr r0, [r4, 0x8]\n" - "\tlsls r1, r0\n" - "\tldr r0, [r3]\n" - "\torrs r0, r1\n" - "\tstr r0, [r3]\n" - "\tldr r0, [r5, 0x40]\n" - "\tcmp r0, r3\n" - "\tbcs _080077F4\n" - "\tstr r3, [r5, 0x40]\n" -"_080077F4:\n" - "\tsubs r3, 0x20\n" -"_080077F6:\n" - "\tmovs r6, 0x4\n" - "\tldrsh r0, [r5, r6]\n" - "\tsubs r0, 0x2\n" - "\tcmp r9, r0\n" - "\tbge _0800781C\n" - "\tadds r3, 0x40\n" - "\tmov r7, r12\n" - "\tldr r0, [r7, 0x4]\n" - "\tands r2, r0\n" - "\tldr r0, [r7, 0xC]\n" - "\tlsrs r2, r0\n" - "\tldr r0, [r3]\n" - "\torrs r0, r2\n" - "\tstr r0, [r3]\n" - "\tldr r0, [r5, 0x40]\n" - "\tcmp r0, r3\n" - "\tbcs _0800781A\n" - "\tstr r3, [r5, 0x40]\n" -"_0800781A:\n" - "\tsubs r3, 0x40\n" -"_0800781C:\n" - "\tmovs r0, 0x1\n" - "\tstr r0, [sp, 0x20]\n" - "\tldr r1, [sp, 0x4]\n" - "\tadds r1, 0x6\n" - "\tstr r1, [sp, 0x4]\n" - "\tldr r2, [sp, 0x8]\n" - "\tadds r2, 0x6\n" - "\tstr r2, [sp, 0x8]\n" - "\tldr r4, [sp, 0xC]\n" - "\tadds r4, 0x6\n" - "\tstr r4, [sp, 0xC]\n" - "\tadds r3, 0x4\n" - "\tadd r10, r0\n" - "\tmovs r0, 0x7\n" - "\tmov r6, r10\n" - "\tands r0, r6\n" - "\tcmp r0, 0\n" - "\tbne _08007854\n" - "\tldr r0, [r5, 0x20]\n" - "\tlsls r0, 2\n" - "\tadds r3, r0\n" - "\tldr r7, [sp, 0x14]\n" - "\tadds r7, 0x1\n" - "\tstr r7, [sp, 0x14]\n" - "\tmovs r1, 0x8\n" - "\tldrsh r0, [r5, r1]\n" - "\tcmp r7, r0\n" - "\tbge _0800786C\n" -"_08007854:\n" - "\tldr r2, [sp, 0x10]\n" - "\tadds r2, 0x1\n" - "\tstr r2, [sp, 0x10]\n" - "\tldr r4, _08007894\n" - "\tldr r0, [r4]\n" - "\tlsls r0, 2\n" - "\tldr r6, _08007890\n" - "\tadds r0, r6\n" - "\tldr r0, [r0]\n" - "\tcmp r2, r0\n" - "\tbge _0800786C\n" - "\tb _080076D4\n" -"_0800786C:\n" - "\tldr r7, [sp]\n" - "\tmovs r1, 0x6\n" - "\tldrsh r0, [r7, r1]\n" - "\tldr r2, _080078A0\n" - "\tmovs r3, 0\n" - "\tldrsh r1, [r2, r3]\n" - "\tadds r0, r1\n" - "\tadd sp, 0x28\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1\n" - "\t.align 2, 0\n" -"_0800788C: .4byte gCharMasksOffsets\n" -"_08007890: .4byte gCharHeight\n" -"_08007894: .4byte gCurrentCharmap\n" -"_08007898: .4byte 0x11111111\n" -"_0800789C: .4byte gTextShadowMask\n" -"_080078A0: .4byte gCharacterSpacing"); + s32 unk0; + struct unkChar *unk4; +}; +extern struct CharMapStruct *gCharmaps[]; +extern s32 gCurrentCharmap; +extern s16 gCharacterSpacing; +extern s32 gCharHeight[]; +extern u8 gDrawTextShadow; + +u32 xxx_draw_char(struct UnkTextStruct1 *a0, s32 x, s32 y, u32 a3, u32 color, u32 a5) +{ + u32 *r3; + const struct unkShiftData *shiftData; + const struct unkChar *sp0; + u16 *local_44; + u16 *sp8; + u16 *local_3c; + s32 i; + s32 xDiv8, yDiv8; + struct UnkTextStruct1 *r5 = &a0[a5]; + s32 sp18 = gUnknown_80B853C[color & 0xF]; + u8 var_2C; + u32 r4; + u32 r2; + + if (gCurrentCharmap == 1) { + if (a3 == 0x70 || a3 == 0x6A || a3 == 0x71 || a3 == 0x79 || a3 == 0x67) + y += 2; + else if (a3 == 0x8199) + y -= 2; + } + + sp0 = GetCharacter(a3); + local_44 = sp0->unk0; + ASM_MATCH_TRICK(local_3c); // stack doesn't match without it + local_3c = sp0->unk0; + sp8 = sp0->unk0 - 3; + + if (gDrawTextShadow != 0) { + var_2C = (sp0->unkA >> 1) & 1; + } + else { + var_2C = 0; + } + + if (sp0->unkA & 1) { + r3 = r5->unk18 + ((((y / 8) * r5->unk4) + (x / 8)) * 8); + r3 += y - (y / 8 * 8); + shiftData = &gCharMasksOffsets[x - ((x / 8) * 8)]; + xDiv8 = x / 8; + yDiv8 = y / 8; + + if (yDiv8 < r5->unk8) { + for (i = 0; i < gCharHeight[gCurrentCharmap]; i++) { + r2 = (local_44[1] << 0x10) | (local_44[0]); + if (r2 != 0) { + if (xDiv8 < r5->unk4) { + *r3 |= (shiftData->bytesA & r2) << shiftData->shift_left; + if (r5->unk3C > r3) + r5->unk3C = r3; + if (r5->unk40 < r3) + r5->unk40 = r3; + } + if (xDiv8 < r5->unk4 - 1) { + r3 += 8; + r2 &= shiftData->bytesB; + *r3 |= (r2) >> shiftData->shift_right; + if (r5->unk40 < r3) + r5->unk40 = r3; + r3 -= 8; + } + } + + r2 = local_44[2]; + if (r2 != 0) { + if (xDiv8 < r5->unk4 - 1) { + r3 += 8; + *r3 |= (r2 & shiftData->bytesA) << shiftData->shift_left; + if (r5->unk40 < r3) + r5->unk40 = r3; + r3 -= 8; + } + if (xDiv8 < r5->unk4 - 2) { + r3 += 16; + *r3 |= (r2 & shiftData->bytesB) >> shiftData->shift_right; + if (r5->unk40 < r3) + r5->unk40 = r3; + r3 -= 16; + } + } + + local_44 += 3; + r3++; + y++; + if (y % 8 == 0) { + r3 += r5->unk20; + yDiv8++; + if (yDiv8 >= r5->unk8) + break; + } + } + } + } + else { + bool8 notFirstIteration = FALSE; + u32 r1; + + r3 = r5->unk18 + ((((y / 8) * r5->unk4) + (x / 8)) * 8); + r3 += y - (y / 8 * 8); + shiftData = &gCharMasksOffsets[x - ((x / 8) * 8)]; + xDiv8 = x / 8; + yDiv8 = y / 8; + + if (yDiv8 < r5->unk8) { + for (i = 0; i < gCharHeight[gCurrentCharmap]; i++) { + r4 = (local_44[1] << 0x10) | (local_44[0]); + r2 = (0x11111111 & r4) + (sp18 & r4); + + if (var_2C != 0) { + r1 = ((local_3c[1] << 0x10) | local_3c[0]) << 4; + r1 |= r4; // This doesn't really do anything since r4 bits are cleared, but it's needed to match. + r1 &= ~(r4); + r1 &= gTextShadowMask; + r2 |= (r1); + if (notFirstIteration) { + r1 = (((sp8[1] << 0x10) | sp8[0]) << 4) ^ r4; + r1 &= ~(r4); + r2 |= (r1 & gTextShadowMask); + } + } + + if (r2 != 0) { + if (xDiv8 < r5->unk4) { + *r3 |= (r2 & shiftData->bytesA) << shiftData->shift_left; + if (r5->unk3C > r3) + r5->unk3C = r3; + if (r5->unk40 < r3) + r5->unk40 = r3; + } + if (xDiv8 < r5->unk4 - 1) { + r3 += 8; + *r3 |= (r2 & shiftData->bytesB) >> shiftData->shift_right; + if (r5->unk40 < r3) + r5->unk40 = r3; + r3 -= 8; + } + } + + r4 = local_44[2]; + r2 = (0x11111111 & r4) + (sp18 & r4); + if (var_2C != 0) { + r1 = (local_3c[2] << 4) | ((local_3c[1] >> 0xC) & 0xF); + r1 |= r4; // This doesn't really do anything since r4 bits are cleared, but it's needed to match. + r1 &= ~(r4); + r1 &= gTextShadowMask; + r2 |= r1; + if (notFirstIteration) { + r1 = ((sp8[2] << 4) | ((sp8[1] >> 0xC) & 0xF)) ^ r4; + r1 &= ~(r4); + r1 &= gTextShadowMask; + r2 |= (r1); + } + } + + if (r2 != 0) { + if (xDiv8 < r5->unk4 - 1) { + r3 += 8; + *r3 |= (r2 & shiftData->bytesA) << shiftData->shift_left; + if (r5->unk40 < r3) + r5->unk40 = r3; + r3 -= 8; + } + if (xDiv8 < r5->unk4 - 2) { + r3 += 16; + *r3 |= (r2 & shiftData->bytesB) >> shiftData->shift_right; + if (r5->unk40 < r3) + r5->unk40 = r3; + r3 -= 16; + } + } + + notFirstIteration = TRUE; + local_44 += 3; + sp8 += 3; + local_3c += 3; + r3++; + y++; + if (y % 8 == 0) { + r3 += r5->unk20; + yDiv8++; + if (yDiv8 >= r5->unk8) + break; + } + } + } + } + + return sp0->unk6 + gCharacterSpacing; } void sub_80078A4(u32 a0, s32 x, s32 y, s32 a3, u32 color) @@ -2691,14 +2321,6 @@ void sub_80084A4(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 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) { @@ -3240,8 +2862,6 @@ UNUSED void sub_8008E58(s32 a0, s32 a1, u8 *a2, s32 a3) gUnknown_20274A5 = 1; } -extern s16 gCharacterSpacing; - s32 sub_8008ED0(const u8 *str) { s32 ret = 0;