mirror of
https://github.com/pret/pmd-red.git
synced 2026-09-10 10:05:52 -05:00
Merge pull request #354 from DizzyEggg/sub_8007BA8
Match sub_8007BA8 and sub_8007D00
This commit is contained in:
476
src/text.c
476
src/text.c
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user