sub_80089AC

This commit is contained in:
DizzyEggg
2024-09-27 15:22:51 +02:00
parent 7d137ea3f8
commit b9456e1d80
2 changed files with 273 additions and 635 deletions

View File

@@ -5,642 +5,7 @@
.text
thumb_func_start sub_80087EC
sub_80087EC:
push {r4-r6,lr}
sub sp, 0x8
adds r4, r0, 0
adds r5, r1, 0
adds r6, r2, 0
ldr r1, [sp, 0x18]
ldr r0, _08008810
str r3, [sp]
str r1, [sp, 0x4]
adds r1, r4, 0
adds r2, r5, 0
adds r3, r6, 0
bl sub_8008818
add sp, 0x8
pop {r4-r6}
pop {r0}
bx r0
.align 2, 0
_08008810: .4byte gUnknown_2027370
thumb_func_end sub_80087EC
thumb_func_start nullsub_176
nullsub_176:
bx lr
thumb_func_end nullsub_176
thumb_func_start sub_8008818
sub_8008818:
push {r4-r7,lr}
mov r7, r8
push {r7}
adds r5, r3, 0
ldr r7, [sp, 0x18]
ldr r3, [sp, 0x1C]
mov r12, r3
lsls r3, r1, 3
adds r3, r1
lsls r3, 3
adds r4, r0, r3
cmp r2, 0
bge _08008834
adds r2, 0x7
_08008834:
asrs r2, 3
mov r8, r2
adds r3, r5, 0
cmp r3, 0
bge _08008840
adds r3, 0x7
_08008840:
asrs r3, 3
movs r2, 0
cmp r2, r12
bge _08008892
_08008848:
movs r1, 0x4
ldrsh r0, [r4, r1]
muls r0, r3
add r0, r8
lsls r0, 5
ldr r1, [r4, 0x18]
adds r1, r0
movs r5, 0
adds r3, 0x1
adds r6, r2, 0
adds r6, 0x8
cmp r5, r7
bge _0800888C
movs r2, 0
_08008864:
ldr r0, [r4, 0x3C]
cmp r0, r1
bls _0800886C
str r1, [r4, 0x3C]
_0800886C:
stm r1!, {r2}
stm r1!, {r2}
stm r1!, {r2}
stm r1!, {r2}
stm r1!, {r2}
stm r1!, {r2}
stm r1!, {r2}
str r2, [r1]
ldr r0, [r4, 0x40]
cmp r0, r1
bcs _08008884
str r1, [r4, 0x40]
_08008884:
adds r1, 0x4
adds r5, 0x8
cmp r5, r7
blt _08008864
_0800888C:
adds r2, r6, 0
cmp r2, r12
blt _08008848
_08008892:
pop {r3}
mov r8, r3
pop {r4-r7}
pop {r0}
bx r0
thumb_func_end sub_8008818
thumb_func_start xxx_call_update_bg_vram
xxx_call_update_bg_vram:
push {lr}
movs r1, 0
ldr r2, _080088C0
ldrb r0, [r2]
cmp r0, 0
beq _080088AE
strb r1, [r2]
bl sub_80099C0
_080088AE:
ldr r0, _080088C4
bl xxx_update_bg_vram
lsls r0, 24
lsrs r1, r0, 24
adds r0, r1, 0
pop {r1}
bx r1
.align 2, 0
_080088C0: .4byte gUnknown_20274A5
_080088C4: .4byte gUnknown_2027370
thumb_func_end xxx_call_update_bg_vram
thumb_func_start xxx_update_bg_vram
xxx_update_bg_vram:
push {r4-r7,lr}
mov r7, r8
push {r7}
mov r8, r0
movs r2, 0
movs r1, 0
movs r7, 0xD0
lsls r7, 4
_080088D8:
lsls r0, r1, 3
adds r0, r1
lsls r0, 3
mov r3, r8
adds r4, r3, r0
movs r5, 0x4
ldrsh r0, [r4, r5]
adds r6, r1, 0x1
cmp r0, 0
beq _0800897A
ldr r5, [r4, 0x38]
cmp r5, 0
beq _0800897A
adds r0, r4, 0
adds r0, 0x45
ldrb r0, [r0]
cmp r0, 0
beq _0800894C
ldr r0, [r4, 0x28]
ldr r1, [r4, 0x18]
adds r2, r7, 0
bl CpuCopy
ldr r0, [r4, 0x18]
adds r2, r0, r7
ldr r0, [r4, 0x28]
adds r1, r0, r7
movs r3, 0
b _08008938
_08008912:
ldm r2!, {r0}
stm r1!, {r0}
ldm r2!, {r0}
stm r1!, {r0}
ldm r2!, {r0}
stm r1!, {r0}
ldm r2!, {r0}
stm r1!, {r0}
ldm r2!, {r0}
stm r1!, {r0}
ldr r0, _08008944
stm r1!, {r0}
ldr r0, _08008948
stm r1!, {r0}
movs r0, 0x1
negs r0, r0
stm r1!, {r0}
adds r2, 0xC
adds r3, 0x1
_08008938:
movs r5, 0x4
ldrsh r0, [r4, r5]
cmp r3, r0
blt _08008912
movs r0, 0
b _0800896A
.align 2, 0
_08008944: .4byte 0xdddddddd
_08008948: .4byte 0xeeeeeeee
_0800894C:
ldr r0, [r4, 0x30]
ldr r1, [r4, 0x34]
adds r2, r5, 0
bl CpuCopy
lsrs r1, r5, 2
lsls r1, 2
ldr r0, [r4, 0x34]
adds r0, r1
str r0, [r4, 0x34]
ldr r0, [r4, 0x30]
adds r0, r5
str r0, [r4, 0x30]
ldr r0, [r4, 0x38]
subs r0, r5
_0800896A:
str r0, [r4, 0x38]
ldr r1, [r4, 0x38]
cmp r1, 0
bne _08008978
adds r0, r4, 0
adds r0, 0x44
strb r1, [r0]
_08008978:
movs r2, 0x1
_0800897A:
adds r1, r6, 0
cmp r1, 0x3
ble _080088D8
adds r0, r2, 0
pop {r3}
mov r8, r3
pop {r4-r7}
pop {r1}
bx r1
thumb_func_end xxx_update_bg_vram
thumb_func_start sub_800898C
sub_800898C:
push {lr}
ldr r1, _080089A4
ldr r2, _080089A8
movs r3, 0xA0
lsls r3, 1
adds r0, r1, r3
_08008998:
strh r2, [r0]
subs r0, 0x2
cmp r0, r1
bge _08008998
pop {r0}
bx r0
.align 2, 0
_080089A4: .4byte gUnknown_3000E94
_080089A8: .4byte 0x0000f0f0
thumb_func_end sub_800898C
thumb_func_start sub_80089AC
sub_80089AC:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
sub sp, 0x4
adds r4, r0, 0
adds r5, r1, 0
ldrb r1, [r4]
movs r0, 0x40
ands r0, r1
cmp r0, 0
beq _080089C8
b _08008C44
_080089C8:
ldr r6, _08008A3C
ldr r7, [r4, 0x4]
cmp r7, 0x1
bne _08008A60
movs r0, 0x8
ldrsh r2, [r4, r0]
movs r1, 0
ldrsh r0, [r5, r1]
adds r2, r0
lsls r3, r2, 3
mov r12, r3
movs r7, 0xA
ldrsh r1, [r4, r7]
movs r3, 0x2
ldrsh r0, [r5, r3]
adds r1, r0
lsls r5, r1, 3
movs r7, 0xC
ldrsh r0, [r4, r7]
adds r2, r0
lsls r7, r2, 3
movs r2, 0xE
ldrsh r0, [r4, r2]
adds r1, r0
lsls r2, r1, 3
cmp r0, 0
bne _08008A00
b _08008C44
_08008A00:
cmp r5, 0
bge _08008A06
movs r5, 0
_08008A06:
cmp r2, 0
bge _08008A0C
movs r2, 0
_08008A0C:
cmp r5, 0xA0
ble _08008A12
movs r5, 0xA0
_08008A12:
cmp r2, 0xA0
ble _08008A18
movs r2, 0xA0
_08008A18:
cmp r5, r2
blt _08008A1E
b _08008C44
_08008A1E:
lsls r3, r5, 1
adds r1, r6, r3
ldrb r0, [r1]
cmp r0, 0xF0
bne _08008A40
ldrb r0, [r1, 0x1]
cmp r0, 0xF0
bne _08008A40
strb r7, [r1]
adds r3, 0x1
adds r0, r6, r3
mov r1, r12
strb r1, [r0]
b _08008A58
.align 2, 0
_08008A3C: .4byte gUnknown_3000E94
_08008A40:
adds r1, r6, r3
ldrb r0, [r1]
cmp r0, r7
bge _08008A4A
strb r7, [r1]
_08008A4A:
adds r3, 0x1
adds r3, r6, r3
ldrb r0, [r3]
cmp r0, r12
ble _08008A58
mov r0, r12
strb r0, [r3]
_08008A58:
adds r5, 0x1
cmp r5, r2
blt _08008A1E
b _08008C44
_08008A60:
cmp r7, 0x6
beq _08008A66
b _08008BA8
_08008A66:
movs r2, 0x8
ldrsh r1, [r4, r2]
movs r3, 0
ldrsh r0, [r5, r3]
adds r1, r0
lsls r3, r1, 3
subs r7, r3, 0x5
mov r9, r7
movs r2, 0xA
ldrsh r0, [r4, r2]
movs r7, 0x2
ldrsh r2, [r5, r7]
adds r0, r2
lsls r2, r0, 3
subs r5, r2, 0x4
movs r7, 0xC
ldrsh r2, [r4, r7]
adds r1, r2
lsls r1, 3
adds r1, 0x5
str r1, [sp]
movs r2, 0xE
ldrsh r1, [r4, r2]
adds r0, r1
lsls r0, 3
adds r0, 0x5
mov r8, r0
adds r3, 0x3
mov r12, r3
ldr r2, [r4, 0x14]
ldrb r1, [r2, 0x2]
subs r0, r1, 0x1
ldrb r3, [r2]
adds r0, r3
adds r0, 0x2
lsls r0, 3
add r0, r12
subs r0, 0x4
mov r10, r0
ldrb r0, [r2, 0x1]
adds r0, 0x1
lsls r0, 3
mov r7, r9
adds r4, r7, r0
adds r1, 0x2
lsls r1, 3
adds r1, r4, r1
subs r7, r1, 0x4
cmp r5, 0
bge _08008ACC
movs r5, 0
_08008ACC:
mov r0, r8
cmp r0, 0
bge _08008AD6
movs r1, 0
mov r8, r1
_08008AD6:
cmp r5, 0xA0
ble _08008ADC
movs r5, 0xA0
_08008ADC:
mov r2, r8
cmp r2, 0xA0
ble _08008AE6
movs r3, 0xA0
mov r8, r3
_08008AE6:
movs r3, 0x3
_08008AE8:
lsls r2, r5, 1
adds r1, r6, r2
ldrb r0, [r1]
cmp r0, 0xF0
bne _08008B02
ldrb r0, [r1, 0x1]
cmp r0, 0xF0
bne _08008B02
strb r7, [r1]
adds r2, 0x1
adds r0, r6, r2
strb r4, [r0]
b _08008B18
_08008B02:
adds r1, r6, r2
ldrb r0, [r1]
cmp r0, r7
bge _08008B0C
strb r7, [r1]
_08008B0C:
adds r2, 0x1
adds r2, r6, r2
ldrb r0, [r2]
cmp r0, r4
ble _08008B18
strb r4, [r2]
_08008B18:
adds r5, 0x1
subs r3, 0x1
cmp r3, 0
bge _08008AE8
movs r3, 0x7
_08008B22:
lsls r1, r5, 1
adds r2, r6, r1
ldrb r0, [r2]
cmp r0, 0xF0
bne _08008B40
ldrb r0, [r2, 0x1]
cmp r0, 0xF0
bne _08008B40
mov r7, r10
strb r7, [r2]
adds r1, 0x1
adds r0, r6, r1
mov r1, r12
strb r1, [r0]
b _08008B5A
_08008B40:
adds r2, r6, r1
ldrb r0, [r2]
cmp r0, r10
bge _08008B4C
mov r7, r10
strb r7, [r2]
_08008B4C:
adds r1, 0x1
adds r1, r6, r1
ldrb r0, [r1]
cmp r0, r12
ble _08008B5A
mov r0, r12
strb r0, [r1]
_08008B5A:
adds r5, 0x1
subs r3, 0x1
cmp r3, 0
bge _08008B22
cmp r5, r8
bge _08008C44
_08008B66:
lsls r1, r5, 1
adds r2, r6, r1
ldrb r0, [r2]
cmp r0, 0xF0
bne _08008B86
ldrb r0, [r2, 0x1]
cmp r0, 0xF0
bne _08008B86
mov r3, sp
ldrb r3, [r3]
strb r3, [r2]
adds r1, 0x1
adds r0, r6, r1
mov r7, r9
strb r7, [r0]
b _08008BA0
_08008B86:
adds r2, r6, r1
ldrb r0, [r2]
ldr r3, [sp]
cmp r0, r3
bge _08008B92
strb r3, [r2]
_08008B92:
adds r1, 0x1
adds r1, r6, r1
ldrb r0, [r1]
cmp r0, r9
ble _08008BA0
mov r0, r9
strb r0, [r1]
_08008BA0:
adds r5, 0x1
cmp r5, r8
blt _08008B66
b _08008C44
_08008BA8:
movs r1, 0x8
ldrsh r0, [r4, r1]
movs r2, 0
ldrsh r1, [r5, r2]
adds r0, r1
lsls r1, r0, 3
subs r1, 0x5
mov r8, r1
movs r3, 0xA
ldrsh r2, [r4, r3]
movs r3, 0x2
ldrsh r1, [r5, r3]
adds r2, r1
lsls r5, r2, 3
mov r9, r5
mov r3, r9
subs r3, 0x5
movs r5, 0xC
ldrsh r1, [r4, r5]
adds r0, r1
lsls r0, 3
adds r0, 0x5
mov r12, r0
movs r1, 0xE
ldrsh r0, [r4, r1]
adds r2, r0
lsls r1, r2, 3
adds r5, r1, 0x5
cmp r0, 0
beq _08008C44
cmp r7, 0
bne _08008BEC
adds r3, 0x8
subs r5, r1, 0x3
_08008BEC:
cmp r3, 0
bge _08008BF2
movs r3, 0
_08008BF2:
cmp r5, 0
bge _08008BF8
movs r5, 0
_08008BF8:
cmp r3, 0xA0
ble _08008BFE
movs r3, 0xA0
_08008BFE:
cmp r5, 0xA0
ble _08008C40
movs r5, 0xA0
b _08008C40
_08008C06:
lsls r1, r3, 1
adds r2, r6, r1
ldrb r0, [r2]
cmp r0, 0xF0
bne _08008C24
ldrb r0, [r2, 0x1]
cmp r0, 0xF0
bne _08008C24
mov r7, r12
strb r7, [r2]
adds r1, 0x1
adds r0, r6, r1
mov r1, r8
strb r1, [r0]
b _08008C3E
_08008C24:
adds r2, r6, r1
ldrb r0, [r2]
cmp r0, r12
bge _08008C30
mov r7, r12
strb r7, [r2]
_08008C30:
adds r1, 0x1
adds r1, r6, r1
ldrb r0, [r1]
cmp r0, r8
ble _08008C3E
mov r0, r8
strb r0, [r1]
_08008C3E:
adds r3, 0x1
_08008C40:
cmp r3, r5
blt _08008C06
_08008C44:
add sp, 0x4
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r0}
bx r0
thumb_func_end sub_80089AC
thumb_func_start CallPrepareTextbox_8008C54
CallPrepareTextbox_8008C54:

View File

@@ -2,6 +2,9 @@
#include "text1.h"
#include "text2.h"
#include "decompress.h"
#include "code_8009804.h"
#include "cpu.h"
#include "structs/str_text.h"
// data.s
extern const u32 gUnknown_80B853C[16];
@@ -2937,3 +2940,273 @@ UNUSED void sub_80086C8(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, s32 a4, s32
}
}
}
void sub_8008818(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5);
void sub_80087EC(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4)
{
sub_8008818(gUnknown_2027370, a0, a1, a2, a3, a4);
}
UNUSED void nullsub_176(void) {}
void sub_8008818(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5)
{
s32 i, j;
UnkTextStruct1 *strPtr = &a0[a1];
s32 a2Div = a2 / 8;
s32 a3Div = a3 / 8;
for (i = 0; i < a5; i += 8) {
u32 *ptr = &strPtr->unk18[((strPtr->unk4 * a3Div) + a2Div) * 8];
for (j = 0; j < a4; j += 8) {
if (strPtr->unk3C > ptr) {
strPtr->unk3C = ptr;
}
*(ptr++) = 0;
*(ptr++) = 0;
*(ptr++) = 0;
*(ptr++) = 0;
*(ptr++) = 0;
*(ptr++) = 0;
*(ptr++) = 0;
*ptr = 0;
if (strPtr->unk40 < ptr) {
strPtr->unk40 = ptr;
}
ptr++;
}
a3Div++;
}
}
extern u8 gUnknown_20274A5;
bool8 xxx_update_bg_vram(UnkTextStruct1 *a0);
bool8 xxx_call_update_bg_vram(void)
{
bool8 ret = FALSE;
if (gUnknown_20274A5 != 0) {
gUnknown_20274A5 = 0;
sub_80099C0();
}
ret = xxx_update_bg_vram(gUnknown_2027370);
return ret;
}
bool8 xxx_update_bg_vram(UnkTextStruct1 *a0)
{
s32 i, j;
u32 r5;
bool8 ret = FALSE;
for (i = 0; i < 4; i++) {
UnkTextStruct1 *strPtr = &a0[i];
if (strPtr->unk4 == 0)
continue;
r5 = strPtr->unk38;
if (r5 == 0)
continue;
if (strPtr->unk45) {
u32 *r2, *r1;
CpuCopy(strPtr->unk28, strPtr->unk18, 0xD00);
// The reason for void casts is because we want to add 0xD00/r5 directly to pointers. Because pointers are u32, without the casts, it would multiply the value by 4.
r2 = (void *)(strPtr->unk18) + 0xD00;
r1 = (void *)(strPtr->unk28) + 0xD00;
for (j = 0; j < strPtr->unk4; j++) {
*(r1++) = *(r2++);
*(r1++) = *(r2++);
*(r1++) = *(r2++);
*(r1++) = *(r2++);
*(r1++) = *(r2++);
*(r1++) = 0xDDDDDDDD;
*(r1++) = 0xEEEEEEEE;
*(r1++) = 0xFFFFFFFF;
r2 += 3;
}
strPtr->unk38 = 0;
}
else {
CpuCopy(strPtr->unk30, strPtr->unk34, r5);
strPtr->unk34 += (r5 / 4);
strPtr->unk30 = (void *)(strPtr->unk30) + r5;
strPtr->unk38 -= r5;
}
if (strPtr->unk38 == 0) {
strPtr->unk44 = 0;
}
ret = TRUE;
}
return ret;
}
// Todo fix gUnknown_3000E94 being accessed as s16/u8
extern s16 gUnknown_3000E94[];
void sub_800898C(void)
{
s32 i;
for (i = 0; i < 161; i++) {
gUnknown_3000E94[i] = 0xF0F0;
}
}
void sub_80089AC(const UnkTextStruct2 *r4, UnkTextStruct2_sub *r5_Str)
{
u8 *r6;
if (r4->unk0 & 0x40)
return;
r6 = (void*) &gUnknown_3000E94;
if (r4->unk4 == 1) {
s32 r12 = (r4->unk8.unk0.separate.unk0 + r5_Str->unk0.separate.unk0) * 8;
s32 r5 = (r4->unk8.unk0.separate.unk2 + r5_Str->unk0.separate.unk2) * 8;
s32 r7 = (r4->unk8.unk0.separate.unk0 + r5_Str->unk0.separate.unk0 + r4->unkC) * 8;
s32 r2 = (r4->unk8.unk0.separate.unk2 + r5_Str->unk0.separate.unk2 + r4->unkE) * 8;
if (r4->unkE != 0) {
if (r5 < 0)
r5 = 0;
if (r2 < 0)
r2 = 0;
if (r5 > 160)
r5 = 160;
if (r2 > 160)
r2 = 160;
while (r5 < r2) {
s32 id = r5 * 2;
if (r6[id] == 240 && r6[id + 1] == 240) {
r6[id++] = r7;
r6[id] = r12;
}
else {
if (r6[id] < r7) {
r6[id] = r7;
}
id++;
if (r6[id] > r12) {
r6[id] = r12;
}
}
r5++;
}
}
}
else if (r4->unk4 == 6) {
s32 i;
s32 r9 = ((r4->unk8.unk0.separate.unk0 + r5_Str->unk0.separate.unk0) * 8) - 5;
s32 r5 = ((r4->unk8.unk0.separate.unk2 + r5_Str->unk0.separate.unk2) * 8) - 4;
s32 var_24 = ((r4->unk8.unk0.separate.unk0 + r5_Str->unk0.separate.unk0 + r4->unkC) * 8) + 5;
s32 r8 = ((r4->unk8.unk0.separate.unk2 + r5_Str->unk0.separate.unk2 + r4->unkE) * 8) + 5;
s32 r12 = ((r4->unk8.unk0.separate.unk0 + r5_Str->unk0.separate.unk0) * 8) + 3;
const UnkTextStruct2_sub2 *r2 = r4->unk14;
s32 tmp = r2->f2 - 1;
s32 r10 = (((tmp + r2->f0 + 2) * 8) + r12) - 4;
s32 r4 = r9 + ((r2->f1 + 1) * 8);
s32 r7 = (r4 + ((r2->f2 + 2) * 8)) - 4;
if (r5 < 0)
r5 = 0;
if (r8 < 0)
r8 = 0;
if (r5 > 160)
r5 = 160;
if (r8 > 160)
r8 = 160;
for (i = 0; i < 4; i++) {
s32 id = r5 * 2;
if (r6[id] == 240 && r6[id + 1] == 240) {
r6[id++] = r7;
r6[id] = r4;
}
else {
if (r6[id] < r7) {
r6[id] = r7;
}
id++;
if (r6[id] > r4) {
r6[id] = r4;
}
}
r5++;
}
for (i = 0; i < 8; i++) {
s32 id = r5 * 2;
if (r6[id] == 240 && r6[id + 1] == 240) {
r6[id++] = r10;
r6[id] = r12;
}
else {
if (r6[id] < r10) {
r6[id] = r10;
}
id++;
if (r6[id] > r12) {
r6[id] = r12;
}
}
r5++;
}
while (r5 < r8) {
s32 id = r5 * 2;
if (r6[id] == 240 && r6[id + 1] == 240) {
r6[id++] = var_24;
r6[id] = r9;
}
else {
if (r6[id] < var_24) {
r6[id] = var_24;
}
id++;
if (r6[id] > r9) {
r6[id] = r9;
}
}
r5++;
}
}
else {
s32 r8 = ((r4->unk8.unk0.separate.unk0 + r5_Str->unk0.separate.unk0) * 8) - 5;
s32 r3 = ((r4->unk8.unk0.separate.unk2 + r5_Str->unk0.separate.unk2) * 8) - 5;
s32 r12 = ((r4->unk8.unk0.separate.unk0 + r5_Str->unk0.separate.unk0 + r4->unkC) * 8) + 5;
s32 r5 = ((r4->unk8.unk0.separate.unk2 + r5_Str->unk0.separate.unk2 + r4->unkE) * 8) + 5;
if (r4->unkE != 0) {
if (r4->unk4 == 0) {
r3 += 8;
r5 = ((r4->unk8.unk0.separate.unk2 + r5_Str->unk0.separate.unk2 + r4->unkE) * 8) - 3;
}
if (r3 < 0)
r3 = 0;
if (r5 < 0)
r5 = 0;
if (r3 > 160)
r3 = 160;
if (r5 > 160)
r5 = 160;
while (r3 < r5) {
s32 id = r3 * 2;
if (r6[id] == 240 && r6[id + 1] == 240) {
r6[id++] = r12;
r6[id] = r8;
}
else {
if (r6[id] < r12) {
r6[id] = r12;
}
id++;
if (r6[id] > r8) {
r6[id] = r8;
}
}
r3++;
}
}
}
}