From c419a607d0ce9fd1dfc57ef0f5aa023c1ce6d695 Mon Sep 17 00:00:00 2001 From: Kermalis <29823718+Kermalis@users.noreply.github.com> Date: Mon, 7 Aug 2023 10:09:14 -0400 Subject: [PATCH] Nonmatch sub_8007958 for now --- asm/text.s | 154 ------------------------------ data/data.s | 1 + include/text2.h | 5 + src/text2.c | 243 +++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 247 insertions(+), 156 deletions(-) diff --git a/asm/text.s b/asm/text.s index 61b92c9d9..e1a72aeb8 100644 --- a/asm/text.s +++ b/asm/text.s @@ -5,160 +5,6 @@ .text - thumb_func_start sub_8007958 -sub_8007958: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x24 - mov r8, r2 - adds r7, r3, 0 - ldr r2, [sp, 0x40] - mov r12, r2 - ldr r3, [sp, 0x44] - lsls r2, r1, 3 - adds r2, r1 - lsls r2, 3 - adds r5, r0, r2 - ldr r1, _08007A68 - movs r0, 0xF - ands r3, r0 - lsls r3, 2 - adds r3, r1 - ldr r3, [r3] - mov r9, r3 - adds r0, r7, 0 - cmp r7, 0 - bge _0800798A - adds r0, r7, 0x7 -_0800798A: - asrs r4, r0, 3 - movs r1, 0x4 - ldrsh r0, [r5, r1] - muls r0, r4 - mov r2, r8 - cmp r2, 0 - bge _0800799A - adds r2, 0x7 -_0800799A: - asrs r2, 3 - adds r0, r2 - lsls r0, 5 - ldr r1, [r5, 0x18] - adds r3, r1, r0 - lsls r0, r4, 3 - subs r0, r7, r0 - lsls r0, 2 - adds r3, r0 - adds r6, r2, 0 - movs r2, 0x8 - ldrsh r0, [r5, r2] - cmp r4, r0 - bge _08007A58 - mov r1, sp - ldr r0, _08007A6C - ldm r0!, {r2,r4,r7} - stm r1!, {r2,r4,r7} - ldm r0!, {r2,r4,r7} - stm r1!, {r2,r4,r7} - ldm r0!, {r2,r4,r7} - stm r1!, {r2,r4,r7} - mov r4, r12 - cmp r4, 0 - ble _08007A58 - ldr r7, _08007A70 -_080079CE: - mov r1, r12 - cmp r1, 0x7 - ble _080079D6 - movs r1, 0x8 -_080079D6: - mov r0, r8 - cmp r0, 0 - bge _080079DE - adds r0, 0x7 -_080079DE: - asrs r0, 3 - lsls r0, 3 - mov r2, r8 - subs r0, r2, r0 - lsls r0, 4 - adds r4, r0, r7 - lsls r0, r1, 2 - add r0, sp - ldr r2, [r0] - ldr r1, _08007A74 - ands r1, r2 - mov r0, r9 - ands r0, r2 - adds r2, r1, r0 - cmp r2, 0 - beq _08007A48 - movs r1, 0x4 - ldrsh r0, [r5, r1] - cmp r6, r0 - bge _08007A24 - ldr r1, [r4] - ands r1, r2 - ldr r0, [r4, 0x8] - lsls r1, r0 - ldr r0, [r3] - orrs r0, r1 - str r0, [r3] - ldr r0, [r5, 0x3C] - cmp r0, r3 - bls _08007A1C - str r3, [r5, 0x3C] -_08007A1C: - ldr r0, [r5, 0x40] - cmp r0, r3 - bcs _08007A24 - str r3, [r5, 0x40] -_08007A24: - movs r1, 0x4 - ldrsh r0, [r5, r1] - subs r0, 0x1 - cmp r6, r0 - bge _08007A48 - adds r3, 0x20 - ldr r0, [r4, 0x4] - ands r2, r0 - ldr r0, [r4, 0xC] - lsrs r2, r0 - ldr r0, [r3] - orrs r0, r2 - str r0, [r3] - ldr r0, [r5, 0x40] - cmp r0, r3 - bcs _08007A46 - str r3, [r5, 0x40] -_08007A46: - subs r3, 0x20 -_08007A48: - adds r6, 0x1 - adds r3, 0x20 - movs r2, 0x8 - negs r2, r2 - add r12, r2 - mov r4, r12 - cmp r4, 0 - bgt _080079CE -_08007A58: - add sp, 0x24 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08007A68: .4byte gUnknown_80B853C -_08007A6C: .4byte gUnknown_80B8824 -_08007A70: .4byte gUnknown_80B85DC -_08007A74: .4byte 0x11111111 - thumb_func_end sub_8007958 - thumb_func_start sub_8007A78 sub_8007A78: push {r4-r6,lr} diff --git a/data/data.s b/data/data.s index 6867bce5e..a55a2a408 100644 --- a/data/data.s +++ b/data/data.s @@ -1914,6 +1914,7 @@ gUnknown_80B8814: @ 80B8814 .global gUnknown_80B8824 gUnknown_80B8824: @ 80B8824 + @ Type: unkStruct_80B8824 .byte 0x00, 0x00, 0x00, 0x00 .byte 0x0f, 0x00, 0x00, 0x00 .byte 0xff, 0x00, 0x00, 0x00 diff --git a/include/text2.h b/include/text2.h index bedb687e5..177f1ee80 100644 --- a/include/text2.h +++ b/include/text2.h @@ -20,6 +20,11 @@ struct unkChar s16 unk6; }; +struct unkStruct_80B8824 +{ + u32 arr[9]; +}; + u32 xxx_call_draw_char(s32, s32, u32, u32, u32); void sub_8006518(struct UnkTextStruct2 *); diff --git a/src/text2.c b/src/text2.c index 342da0bb3..4411b149e 100644 --- a/src/text2.c +++ b/src/text2.c @@ -3,10 +3,12 @@ #include "text2.h" // data.s +extern const u32 gUnknown_80B853C[16]; +extern const struct unkShiftData gUnknown_80B85DC[8]; extern const u32 gUnknown_80B8814[]; +extern const struct unkStruct_80B8824 gUnknown_80B8824; // text.s -extern void sub_8007958(struct UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, u32 a4, u32 color); extern void sub_8008C6C(struct UnkTextStruct1 *, u32); void nullsub_129(u32, s32, s32, u32, u32); @@ -18,6 +20,7 @@ void sub_8006AC4(struct UnkTextStruct1 *, s32, s32, s32, u16 *); void sub_8006B70(struct UnkTextStruct1 *, s32, s32, s32, u16 *); void sub_8006C44(struct UnkTextStruct1 *, s32, u16 *, u8); void sub_8006E94(struct UnkTextStruct1 *, s32, u32, const u8 *, u16 *); +void sub_8007958(struct UnkTextStruct1 *, u32, s32, s32, s32, u32); void nullsub_152(void) { @@ -1921,4 +1924,240 @@ void sub_800792C(u32 a0, s32 x, s32 y, u32 a3, u32 color) void nullsub_129(u32 a0, s32 x, s32 y, u32 a3, u32 color) { -} \ No newline at end of file +} + +#if NONMATCHING // Close... https://decomp.me/scratch/t6ImV +void sub_8007958(struct UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, u32 color) +{ + s32 iVar2; + u32 uVar4; + + s32 r2; + s32 r4; + struct UnkTextStruct1 *r5; + s32 r6; + u32 r9; + + const struct unkShiftData *shiftData; + struct unkStruct_80B8824 dataLOL; + s32 lol; + s32 helpmepls; + u32 *dest; + + r5 = &a0[a1]; + r9 = gUnknown_80B853C[color & 0xf]; + + helpmepls = y; + if (helpmepls < 0) + helpmepls += 7; + r4 = helpmepls >> 3; + lol = r4 * r5->unk4; + + helpmepls = x; + if (helpmepls < 0) + helpmepls += 7; + r2 = helpmepls >> 3; + + dest = r5->unk18 + ((lol + r2) * 8) + (r4 * -2) + y; + r6 = r2; + + if (r4 >= r5->unk8) + return; + + dataLOL = gUnknown_80B8824; + + for (; a4 > 0; a4 -= 8) { + lol = a4; + if (a4 > 7) + lol = 8; + + iVar2 = x; + if (x < 0) + iVar2 = x + 7; + iVar2 >>= 3; + + shiftData = &gUnknown_80B85DC[x + (iVar2 * -8)]; + + uVar4 = (dataLOL.arr[lol] & 0x11111111) + (dataLOL.arr[lol] & r9); + + if (uVar4 != 0) { + if (r6 < r5->unk4) { + dest[0] |= (shiftData->bytesA & uVar4) << shiftData->shift_left; + + if (r5->unk3C > dest) + r5->unk3C = dest; + if (r5->unk40 < dest) + r5->unk40 = dest; + } + + if (r6 < r5->unk4 - 1) { + dest += 8; + dest[0] |= (uVar4 & shiftData->bytesB) >> shiftData->shift_right; + + if (r5->unk40 < dest) + r5->unk40 = dest; + dest -= 8; + } + } + + r6++; + dest += 8; + } +} +#else +NAKED +void sub_8007958(struct UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, u32 color) +{ + asm_unified( + "push {r4-r7,lr}\n" + "\tmov r7, r9\n" + "\tmov r6, r8\n" + "\tpush {r6,r7}\n" + "\tsub sp, 0x24\n" + "\tmov r8, r2\n" + "\tadds r7, r3, 0\n" + "\tldr r2, [sp, 0x40]\n" + "\tmov r12, r2\n" + "\tldr r3, [sp, 0x44]\n" + "\tlsls r2, r1, 3\n" + "\tadds r2, r1\n" + "\tlsls r2, 3\n" + "\tadds r5, r0, r2\n" + "\tldr r1, _08007A68\n" + "\tmovs r0, 0xF\n" + "\tands r3, r0\n" + "\tlsls r3, 2\n" + "\tadds r3, r1\n" + "\tldr r3, [r3]\n" + "\tmov r9, r3\n" + "\tadds r0, r7, 0\n" + "\tcmp r7, 0\n" + "\tbge _0800798A\n" + "\tadds r0, r7, 0x7\n" +"_0800798A:\n" + "\tasrs r4, r0, 3\n" + "\tmovs r1, 0x4\n" + "\tldrsh r0, [r5, r1]\n" + "\tmuls r0, r4\n" + "\tmov r2, r8\n" + "\tcmp r2, 0\n" + "\tbge _0800799A\n" + "\tadds r2, 0x7\n" +"_0800799A:\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" + "\tsubs r0, r7, r0\n" + "\tlsls r0, 2\n" + "\tadds r3, r0\n" + "\tadds r6, r2, 0\n" + "\tmovs r2, 0x8\n" + "\tldrsh r0, [r5, r2]\n" + "\tcmp r4, r0\n" + "\tbge _08007A58\n" + "\tmov r1, sp\n" + "\tldr r0, _08007A6C\n" + "\tldm r0!, {r2,r4,r7}\n" + "\tstm r1!, {r2,r4,r7}\n" + "\tldm r0!, {r2,r4,r7}\n" + "\tstm r1!, {r2,r4,r7}\n" + "\tldm r0!, {r2,r4,r7}\n" + "\tstm r1!, {r2,r4,r7}\n" + "\tmov r4, r12\n" + "\tcmp r4, 0\n" + "\tble _08007A58\n" + "\tldr r7, _08007A70\n" +"_080079CE:\n" + "\tmov r1, r12\n" + "\tcmp r1, 0x7\n" + "\tble _080079D6\n" + "\tmovs r1, 0x8\n" +"_080079D6:\n" + "\tmov r0, r8\n" + "\tcmp r0, 0\n" + "\tbge _080079DE\n" + "\tadds r0, 0x7\n" +"_080079DE:\n" + "\tasrs r0, 3\n" + "\tlsls r0, 3\n" + "\tmov r2, r8\n" + "\tsubs r0, r2, r0\n" + "\tlsls r0, 4\n" + "\tadds r4, r0, r7\n" + "\tlsls r0, r1, 2\n" + "\tadd r0, sp\n" + "\tldr r2, [r0]\n" + "\tldr r1, _08007A74\n" + "\tands r1, r2\n" + "\tmov r0, r9\n" + "\tands r0, r2\n" + "\tadds r2, r1, r0\n" + "\tcmp r2, 0\n" + "\tbeq _08007A48\n" + "\tmovs r1, 0x4\n" + "\tldrsh r0, [r5, r1]\n" + "\tcmp r6, r0\n" + "\tbge _08007A24\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, 0x3C]\n" + "\tcmp r0, r3\n" + "\tbls _08007A1C\n" + "\tstr r3, [r5, 0x3C]\n" +"_08007A1C:\n" + "\tldr r0, [r5, 0x40]\n" + "\tcmp r0, r3\n" + "\tbcs _08007A24\n" + "\tstr r3, [r5, 0x40]\n" +"_08007A24:\n" + "\tmovs r1, 0x4\n" + "\tldrsh r0, [r5, r1]\n" + "\tsubs r0, 0x1\n" + "\tcmp r6, r0\n" + "\tbge _08007A48\n" + "\tadds r3, 0x20\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 _08007A46\n" + "\tstr r3, [r5, 0x40]\n" +"_08007A46:\n" + "\tsubs r3, 0x20\n" +"_08007A48:\n" + "\tadds r6, 0x1\n" + "\tadds r3, 0x20\n" + "\tmovs r2, 0x8\n" + "\tnegs r2, r2\n" + "\tadd r12, r2\n" + "\tmov r4, r12\n" + "\tcmp r4, 0\n" + "\tbgt _080079CE\n" +"_08007A58:\n" + "\tadd sp, 0x24\n" + "\tpop {r3,r4}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_08007A68: .4byte gUnknown_80B853C\n" +"_08007A6C: .4byte gUnknown_80B8824\n" +"_08007A70: .4byte gUnknown_80B85DC\n" +"_08007A74: .4byte 0x11111111"); +} +#endif // NONMATCHING \ No newline at end of file