Merge pull request #354 from DizzyEggg/sub_8007BA8

Match sub_8007BA8 and sub_8007D00
This commit is contained in:
Seth Barberee
2025-03-09 09:32:36 -07:00
committed by GitHub

View File

@@ -1864,246 +1864,64 @@ UNUSED static void nullsub_158(void)
{
}
#ifdef NONMATCHING // https://decomp.me/scratch/AU1bH
static void sub_8007BA8(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, s32 color)
void sub_8007BA8(struct UnkTextStruct1 *windows, u32 windowId, s32 x, s32 y, s32 a4, s32 color)
{
s32 iVar1; // r1
s32 iVar3;
s32 iVar9; // r8?
u32 *dst;
s32 i;
s32 xDiv8, yDiv8;
s32 j, k;
u32 *r4;
u32 r5;
u32 r6;
UnkTextStruct1 *ip;
s32 sp4;
s32 sp8;
u32 sp1C; // Used correctly
s32 yeah;
u32 *sp10; // r2?
ip = &a0[a1];
sp8 = y / 8;
if (sp8 >= ip->unk8)
struct UnkTextStruct1 *window = &windows[windowId];
yDiv8 = y / 8;
if (yDiv8 >= window->unk8)
return;
yeah = ip->unk4 * sp8;
dst = window->unk18 + (((yDiv8 * window->unk4) + x / 8) * 8);
dst += y - (yDiv8 * 8);
r4 = ip->unk18 + ((yeah + x / 8) * 8);
r4 += (sp8 * -8) + y;
for (i = 0; i < color; i++) {
u32 *loopDst = dst;
xDiv8 = x / 8;
for (sp4 = 0; sp4 < color; sp4++) {
sp10 = r4;
iVar1 = x / 8;
for (j = 0; j < a4; j += 8) {
if (xDiv8 < window->unk4) {
u32 andBits = 0xF0000000;
u32 orBits = 0xE0000000;
u32 bits = 0;
u32 var = *loopDst;
for (iVar9 = 0; iVar9 < a4; iVar9 += 8) {
if (iVar1 >= ip->unk4)
break;
for (k = 0; k < 8; k++) {
if (!(var & andBits))
bits |= orBits;
r6 = 0xF0000000;
r5 = 0xE0000000;
sp1C = 0;
andBits >>= 4;
orBits >>= 4;
}
for (iVar3 = 0; iVar3 < 8; iVar3++) {
if ((sp10[0] & r6) == 0)
sp1C |= r5;
*loopDst |= bits;
if (window->unk3C > loopDst)
window->unk3C = loopDst;
if (window->unk40 < loopDst)
window->unk40 = loopDst;
r6 >>= 4;
r5 >>= 4;
xDiv8++;
loopDst += 8;
}
else {
break;
}
sp10[0] |= sp1C;
if (ip->unk3C > sp10)
ip->unk3C = sp10;
if (ip->unk40 < sp10)
ip->unk40 = sp10;
sp10 += 8;
iVar1++;
}
y++;
r4++;
dst++;
if ((y % 8) == 0) {
r4 += ip->unk20;
sp8++;
if (sp8 >= ip->unk8)
dst += window->unk20;
yDiv8++;
if (yDiv8 >= window->unk8)
return;
}
sp4++;
}
}
#else
NAKED
static void sub_8007BA8(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, s32 color)
{
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, 0x20\n"
"\tstr r2, [sp]\n"
"\tlsls r2, r1, 3\n"
"\tadds r2, r1\n"
"\tlsls r2, 3\n"
"\tadds r0, r2\n"
"\tmov r12, r0\n"
"\tadds r0, r3, 0\n"
"\tcmp r3, 0\n"
"\tbge _08007BC8\n"
"\tadds r0, r3, 0x7\n"
"_08007BC8:\n"
"\tasrs r0, 3\n"
"\tstr r0, [sp, 0x8]\n"
"\tmov r1, r12\n"
"\tmovs r2, 0x8\n"
"\tldrsh r0, [r1, r2]\n"
"\tldr r4, [sp, 0x8]\n"
"\tcmp r4, r0\n"
"\tbge _08007CC4\n"
"\tmovs r7, 0x4\n"
"\tldrsh r0, [r1, r7]\n"
"\tadds r1, r4, 0\n"
"\tmuls r1, r0\n"
"\tldr r0, [sp]\n"
"\tcmp r0, 0\n"
"\tbge _08007BE8\n"
"\tadds r0, 0x7\n"
"_08007BE8:\n"
"\tasrs r0, 3\n"
"\tadds r0, r1, r0\n"
"\tlsls r0, 5\n"
"\tmov r2, r12\n"
"\tldr r1, [r2, 0x18]\n"
"\tadds r4, r1, r0\n"
"\tldr r7, [sp, 0x8]\n"
"\tlsls r0, r7, 3\n"
"\tsubs r0, r3, r0\n"
"\tlsls r0, 2\n"
"\tadds r4, r0\n"
"\tmovs r0, 0\n"
"\tstr r0, [sp, 0x4]\n"
"\tldr r1, [sp, 0x44]\n"
"\tcmp r0, r1\n"
"\tbge _08007CC4\n"
"_08007C08:\n"
"\tadds r2, r4, 0\n"
"\tldr r0, [sp]\n"
"\tcmp r0, 0\n"
"\tbge _08007C12\n"
"\tadds r0, 0x7\n"
"_08007C12:\n"
"\tasrs r1, r0, 3\n"
"\tmovs r7, 0\n"
"\tmov r8, r7\n"
"\tadds r3, 0x1\n"
"\tstr r3, [sp, 0xC]\n"
"\tadds r4, 0x4\n"
"\tstr r4, [sp, 0x14]\n"
"\tldr r0, [sp, 0x40]\n"
"\tcmp r8, r0\n"
"\tbge _08007C94\n"
"_08007C26:\n"
"\tmov r3, r12\n"
"\tmovs r4, 0x4\n"
"\tldrsh r0, [r3, r4]\n"
"\tcmp r1, r0\n"
"\tbge _08007C94\n"
"\tmovs r6, 0xF0\n"
"\tlsls r6, 24\n"
"\tmovs r5, 0xE0\n"
"\tlsls r5, 24\n"
"\tmovs r7, 0\n"
"\tstr r7, [sp, 0x1C]\n"
"\tldr r4, [r2]\n"
"\tadds r3, r4, 0\n"
"\tmov r0, r12\n"
"\tldr r0, [r0, 0x3C]\n"
"\tmov r9, r0\n"
"\tmov r7, r12\n"
"\tldr r7, [r7, 0x40]\n"
"\tmov r10, r7\n"
"\tadds r1, 0x1\n"
"\tstr r1, [sp, 0x10]\n"
"\tadds r0, r2, 0\n"
"\tadds r0, 0x20\n"
"\tstr r0, [sp, 0x18]\n"
"\tmovs r1, 0x8\n"
"\tadd r8, r1\n"
"\tmovs r1, 0x7\n"
"_08007C5C:\n"
"\tadds r0, r4, 0\n"
"\tands r0, r6\n"
"\tcmp r0, 0\n"
"\tbne _08007C6A\n"
"\tldr r7, [sp, 0x1C]\n"
"\torrs r7, r5\n"
"\tstr r7, [sp, 0x1C]\n"
"_08007C6A:\n"
"\tlsrs r6, 4\n"
"\tlsrs r5, 4\n"
"\tsubs r1, 0x1\n"
"\tcmp r1, 0\n"
"\tbge _08007C5C\n"
"\tldr r0, [sp, 0x1C]\n"
"\torrs r3, r0\n"
"\tstr r3, [r2]\n"
"\tcmp r9, r2\n"
"\tbls _08007C82\n"
"\tmov r1, r12\n"
"\tstr r2, [r1, 0x3C]\n"
"_08007C82:\n"
"\tcmp r10, r2\n"
"\tbcs _08007C8A\n"
"\tmov r3, r12\n"
"\tstr r2, [r3, 0x40]\n"
"_08007C8A:\n"
"\tldr r1, [sp, 0x10]\n"
"\tldr r2, [sp, 0x18]\n"
"\tldr r4, [sp, 0x40]\n"
"\tcmp r8, r4\n"
"\tblt _08007C26\n"
"_08007C94:\n"
"\tldr r3, [sp, 0xC]\n"
"\tldr r4, [sp, 0x14]\n"
"\tmovs r0, 0x7\n"
"\tands r0, r3\n"
"\tcmp r0, 0\n"
"\tbne _08007CB8\n"
"\tmov r7, r12\n"
"\tldr r0, [r7, 0x20]\n"
"\tlsls r0, 2\n"
"\tadds r4, r0\n"
"\tldr r0, [sp, 0x8]\n"
"\tadds r0, 0x1\n"
"\tstr r0, [sp, 0x8]\n"
"\tmovs r1, 0x8\n"
"\tldrsh r0, [r7, r1]\n"
"\tldr r2, [sp, 0x8]\n"
"\tcmp r2, r0\n"
"\tbge _08007CC4\n"
"_08007CB8:\n"
"\tldr r7, [sp, 0x4]\n"
"\tadds r7, 0x1\n"
"\tstr r7, [sp, 0x4]\n"
"\tldr r0, [sp, 0x44]\n"
"\tcmp r7, r0\n"
"\tblt _08007C08\n"
"_08007CC4:\n"
"\tadd sp, 0x20\n"
"\tpop {r3-r5}\n"
"\tmov r8, r3\n"
"\tmov r9, r4\n"
"\tmov r10, r5\n"
"\tpop {r4-r7}\n"
"\tpop {r0}\n"
"\tbx r0");
}
#endif // NONMATCHING
UNUSED static void sub_8007CD4(u32 a0, s32 a1, s32 a2, s32 a3, s32 a4)
{
@@ -2114,166 +1932,64 @@ UNUSED static void nullsub_159(void)
{
}
NAKED // Very similar to sub_8007BA8
static void sub_8007D00(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, s32 color)
// Very similar to sub_8007BA8. It clears bits instead of setting them.
void sub_8007D00(struct UnkTextStruct1 *windows, u32 windowId, s32 x, s32 y, s32 a4, s32 color)
{
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, 0x20\n"
"\tstr r2, [sp]\n"
"\tlsls r2, r1, 3\n"
"\tadds r2, r1\n"
"\tlsls r2, 3\n"
"\tadds r0, r2\n"
"\tmov r12, r0\n"
"\tadds r0, r3, 0\n"
"\tcmp r3, 0\n"
"\tbge _08007D20\n"
"\tadds r0, r3, 0x7\n"
"_08007D20:\n"
"\tasrs r0, 3\n"
"\tstr r0, [sp, 0x8]\n"
"\tmov r1, r12\n"
"\tmovs r2, 0x8\n"
"\tldrsh r0, [r1, r2]\n"
"\tldr r4, [sp, 0x8]\n"
"\tcmp r4, r0\n"
"\tbge _08007E0E\n"
"\tmovs r5, 0x4\n"
"\tldrsh r0, [r1, r5]\n"
"\tadds r1, r4, 0\n"
"\tmuls r1, r0\n"
"\tldr r0, [sp]\n"
"\tcmp r0, 0\n"
"\tbge _08007D40\n"
"\tadds r0, 0x7\n"
"_08007D40:\n"
"\tasrs r0, 3\n"
"\tadds r0, r1, r0\n"
"\tlsls r0, 5\n"
"\tmov r2, r12\n"
"\tldr r1, [r2, 0x18]\n"
"\tadds r4, r1, r0\n"
"\tldr r5, [sp, 0x8]\n"
"\tlsls r0, r5, 3\n"
"\tsubs r0, r3, r0\n"
"\tlsls r0, 2\n"
"\tadds r4, r0\n"
"\tmovs r0, 0\n"
"\tb _08007E06\n"
"_08007D5A:\n"
"\tadds r2, r4, 0\n"
"\tldr r0, [sp]\n"
"\tcmp r0, 0\n"
"\tbge _08007D64\n"
"\tadds r0, 0x7\n"
"_08007D64:\n"
"\tasrs r1, r0, 3\n"
"\tmovs r5, 0\n"
"\tmov r8, r5\n"
"\tadds r3, 0x1\n"
"\tstr r3, [sp, 0xC]\n"
"\tadds r4, 0x4\n"
"\tstr r4, [sp, 0x14]\n"
"\tldr r0, [sp, 0x40]\n"
"\tcmp r8, r0\n"
"\tbge _08007DE0\n"
"_08007D78:\n"
"\tmov r3, r12\n"
"\tmovs r4, 0x4\n"
"\tldrsh r0, [r3, r4]\n"
"\tcmp r1, r0\n"
"\tbge _08007DE0\n"
"\tmovs r4, 0xF0\n"
"\tlsls r4, 24\n"
"\tmovs r6, 0xE0\n"
"\tlsls r6, 24\n"
"\tmovs r7, 0\n"
"\tldr r5, [r2]\n"
"\tstr r5, [sp, 0x1C]\n"
"\tadds r3, r5, 0\n"
"\tmov r0, r12\n"
"\tldr r0, [r0, 0x3C]\n"
"\tmov r9, r0\n"
"\tmov r5, r12\n"
"\tldr r5, [r5, 0x40]\n"
"\tmov r10, r5\n"
"\tadds r1, 0x1\n"
"\tstr r1, [sp, 0x10]\n"
"\tadds r0, r2, 0\n"
"\tadds r0, 0x20\n"
"\tstr r0, [sp, 0x18]\n"
"\tmovs r1, 0x8\n"
"\tadd r8, r1\n"
"\tmovs r1, 0x7\n"
"_08007DAE:\n"
"\tldr r0, [sp, 0x1C]\n"
"\tands r0, r4\n"
"\tcmp r0, r6\n"
"\tbne _08007DB8\n"
"\torrs r7, r4\n"
"_08007DB8:\n"
"\tlsrs r4, 4\n"
"\tlsrs r6, 4\n"
"\tsubs r1, 0x1\n"
"\tcmp r1, 0\n"
"\tbge _08007DAE\n"
"\tbics r3, r7\n"
"\tstr r3, [r2]\n"
"\tcmp r9, r2\n"
"\tbls _08007DCE\n"
"\tmov r3, r12\n"
"\tstr r2, [r3, 0x3C]\n"
"_08007DCE:\n"
"\tcmp r10, r2\n"
"\tbcs _08007DD6\n"
"\tmov r4, r12\n"
"\tstr r2, [r4, 0x40]\n"
"_08007DD6:\n"
"\tldr r1, [sp, 0x10]\n"
"\tldr r2, [sp, 0x18]\n"
"\tldr r5, [sp, 0x40]\n"
"\tcmp r8, r5\n"
"\tblt _08007D78\n"
"_08007DE0:\n"
"\tldr r3, [sp, 0xC]\n"
"\tldr r4, [sp, 0x14]\n"
"\tmovs r0, 0x7\n"
"\tands r0, r3\n"
"\tcmp r0, 0\n"
"\tbne _08007E02\n"
"\tmov r1, r12\n"
"\tldr r0, [r1, 0x20]\n"
"\tlsls r0, 2\n"
"\tadds r4, r0\n"
"\tldr r2, [sp, 0x8]\n"
"\tadds r2, 0x1\n"
"\tstr r2, [sp, 0x8]\n"
"\tmovs r5, 0x8\n"
"\tldrsh r0, [r1, r5]\n"
"\tcmp r2, r0\n"
"\tbge _08007E0E\n"
"_08007E02:\n"
"\tldr r0, [sp, 0x4]\n"
"\tadds r0, 0x1\n"
"_08007E06:\n"
"\tstr r0, [sp, 0x4]\n"
"\tldr r1, [sp, 0x44]\n"
"\tcmp r0, r1\n"
"\tblt _08007D5A\n"
"_08007E0E:\n"
"\tadd sp, 0x20\n"
"\tpop {r3-r5}\n"
"\tmov r8, r3\n"
"\tmov r9, r4\n"
"\tmov r10, r5\n"
"\tpop {r4-r7}\n"
"\tpop {r0}\n"
"\tbx r0");
u32 *dst;
s32 i;
s32 xDiv8, yDiv8;
s32 j, k;
struct UnkTextStruct1 *window = &windows[windowId];
yDiv8 = y / 8;
if (yDiv8 >= window->unk8)
return;
dst = window->unk18 + (((yDiv8 * window->unk4) + x / 8) * 8);
dst += y - (yDiv8 * 8);
for (i = 0; i < color; i++) {
u32 *loopDst = dst;
xDiv8 = x / 8;
for (j = 0; j < a4; j += 8) {
if (xDiv8 < window->unk4) {
u32 andBits = 0xF0000000;
u32 equalBits = 0xE0000000;
u32 bits = 0;
u32 var = *loopDst;
for (k = 0; k < 8; k++) {
if ((var & andBits) == equalBits)
bits |= andBits;
andBits >>= 4;
equalBits >>= 4;
}
*loopDst &= ~(bits);
if (window->unk3C > loopDst)
window->unk3C = loopDst;
if (window->unk40 < loopDst)
window->unk40 = loopDst;
xDiv8++;
loopDst += 8;
}
else {
break;
}
}
y++;
dst++;
if ((y % 8) == 0) {
dst += window->unk20;
yDiv8++;
if (yDiv8 >= window->unk8)
return;
}
}
}
void sub_8007E20(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, u32 *a5, u32 a6)