Decompiled two difficult functions

Had do use a lot of `asm` directives for sub_81C8A28 to match.
This commit is contained in:
Phlosioneer 2019-03-16 00:34:11 -04:00
parent 8cea949e6d
commit bdc6ed1a98
2 changed files with 136 additions and 258 deletions

View File

@ -5,260 +5,6 @@
.text
thumb_func_start sub_81C8958
sub_81C8958: @ 81C8958
push {r4,r5,lr}
adds r5, r0, 0
movs r0, 0x11
bl GetSubstructPtr
adds r4, r0, 0
bl IsDma3ManagerBusyWithBgCopy
lsls r0, 24
cmp r0, 0
beq _081C8972
movs r0, 0x2
b _081C8A22
_081C8972:
cmp r5, 0x7
bhi _081C8A1C
lsls r0, r5, 2
ldr r1, =_081C8984
adds r0, r1
ldr r0, [r0]
mov pc, r0
.pool
.align 2, 0
_081C8984:
.4byte _081C89A4
.4byte _081C89B4
.4byte _081C89BE
.4byte _081C89D0
.4byte _081C89DA
.4byte _081C89EC
.4byte _081C89F6
.4byte _081C8A08
_081C89A4:
ldr r1, =0x00000888
adds r0, r4, r1
adds r1, r4, 0
bl sub_81C8CB4
b _081C8A20
.pool
_081C89B4:
adds r0, r4, 0
movs r1, 0
bl sub_81C8DBC
b _081C8A20
_081C89BE:
ldr r1, =0x00000888
adds r0, r4, r1
adds r1, r4, 0
movs r2, 0
bl sub_81C8E54
b _081C8A20
.pool
_081C89D0:
adds r0, r4, 0
movs r1, 0x1
bl sub_81C8DBC
b _081C8A20
_081C89DA:
ldr r1, =0x00000888
adds r0, r4, r1
adds r1, r4, 0
movs r2, 0x1
bl sub_81C8E54
b _081C8A20
.pool
_081C89EC:
adds r0, r4, 0
movs r1, 0x2
bl sub_81C8DBC
b _081C8A20
_081C89F6:
ldr r1, =0x00000888
adds r0, r4, r1
adds r1, r4, 0
movs r2, 0x2
bl sub_81C8E54
b _081C8A20
.pool
_081C8A08:
ldr r1, =0x00000888
adds r0, r4, r1
adds r1, r4, 0
movs r2, 0x3
bl sub_81C8E54
b _081C8A20
.pool
_081C8A1C:
movs r0, 0x4
b _081C8A22
_081C8A20:
movs r0, 0
_081C8A22:
pop {r4,r5}
pop {r1}
bx r1
thumb_func_end sub_81C8958
thumb_func_start sub_81C8A28
sub_81C8A28: @ 81C8A28
push {r4-r7,lr}
sub sp, 0x8
adds r5, r0, 0
bl IsDma3ManagerBusyWithBgCopy
lsls r0, 24
cmp r0, 0
bne _081C8AA6
movs r0, 0x11
bl GetSubstructPtr
adds r4, r0, 0
ldr r0, =0x00000888
adds r6, r4, r0
adds r2, r4, 0
cmp r5, 0x6
bls _081C8A4C
b _081C8B64
_081C8A4C:
lsls r0, r5, 2
ldr r1, =_081C8A60
adds r0, r1
ldr r0, [r0]
mov pc, r0
.pool
.align 2, 0
_081C8A60:
.4byte _081C8A7C
.4byte _081C8A88
.4byte _081C8AE8
.4byte _081C8AFC
.4byte _081C8B14
.4byte _081C8B34
.4byte _081C8B5C
_081C8A7C:
adds r0, r6, 0
adds r1, r2, 0
bl sub_81C8D4C
movs r0, 0
b _081C8B66
_081C8A88:
ldr r1, =0x0000089c
adds r7, r4, r1
ldr r0, [r7]
adds r1, r0, 0x1
str r1, [r7]
movs r3, 0x89
lsls r3, 4
adds r0, r4, r3
ldrh r0, [r0]
cmp r1, r0
bge _081C8AB0
adds r0, r2, 0
movs r2, 0x1
bl sub_81C8B70
_081C8AA6:
movs r0, 0x2
b _081C8B66
.pool
_081C8AB0:
movs r0, 0
str r0, [r7]
ldrh r0, [r6, 0x2]
ldrh r1, [r6, 0x8]
cmp r0, r1
bhi _081C8AC6
ldrh r0, [r6]
cmp r0, 0
beq _081C8B52
adds r4, r0, 0
b _081C8AD4
_081C8AC6:
ldrh r1, [r6]
ldrh r0, [r6, 0x8]
adds r4, r1, r0
ldrh r1, [r6, 0x2]
cmp r4, r1
ble _081C8B52
subs r4, r1
_081C8AD4:
negs r5, r4
adds r0, r2, 0
adds r1, r5, 0
adds r2, r4, 0
bl sub_81C8B70
strh r4, [r6, 0x6]
str r5, [r7]
movs r0, 0
b _081C8B66
_081C8AE8:
ldr r2, =0x0000089c
adds r0, r4, r2
ldr r0, [r0]
movs r1, 0
bl sub_81C84E8
movs r0, 0
b _081C8B66
.pool
_081C8AFC:
bl sub_81C8630
adds r1, r0, 0
cmp r1, 0
bne _081C8AA6
ldr r3, =0x0000089c
adds r0, r4, r3
str r1, [r0]
_081C8B0C:
movs r0, 0x1
b _081C8B66
.pool
_081C8B14:
ldr r0, [r6, 0x10]
ldrh r1, [r6]
ldr r3, =0x0000089c
adds r2, r4, r3
ldr r2, [r2]
adds r1, r2
ldr r3, [r6, 0xC]
str r2, [sp]
str r4, [sp, 0x4]
movs r2, 0x1
bl sub_81C83AC
movs r0, 0
b _081C8B66
.pool
_081C8B34:
bl sub_81C83E0
cmp r0, 0
bne _081C8AA6
ldr r0, =0x0000089c
adds r1, r4, r0
ldr r0, [r1]
adds r0, 0x1
str r0, [r1]
ldrh r1, [r6, 0x2]
cmp r0, r1
bge _081C8B0C
ldrh r6, [r6, 0x8]
cmp r0, r6
bge _081C8B0C
_081C8B52:
movs r0, 0x9
b _081C8B66
.pool
_081C8B5C:
adds r0, r2, 0
movs r1, 0
bl sub_81C9008
_081C8B64:
movs r0, 0x4
_081C8B66:
add sp, 0x8
pop {r4-r7}
pop {r1}
bx r1
thumb_func_end sub_81C8A28
thumb_func_start sub_81C8B70
sub_81C8B70: @ 81C8B70
push {r4-r7,lr}

View File

@ -179,12 +179,16 @@ extern u32 sub_81C91AC(struct UnknownSubStruct_81C81D4 *a0, const void *a1, void
extern u32 sub_81C9160(struct UnknownSubSubStruct_81C81D4 *a0, void *a1);
extern void sub_81C8ED0(void);
extern void sub_81C8EF8(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubSubStruct_0203CF40 *a1);
extern u32 sub_81C8958(s32 a0);
extern u32 sub_81C8A28(s32 a0);
extern void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1, u32 a2);
extern void sub_81C9008(struct UnknownSubStruct_81C81D4 *a0, u32 a1);
extern void sub_81C9008(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1);
extern void sub_81C7CB4(struct Sprite* sprite);
extern void sub_81C8CB4(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubSubStruct_0203CF40 *a1);
extern void sub_81C8DBC(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1);
extern void sub_81C8E54(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubSubStruct_0203CF40 *a1, u32 a2);
extern void sub_81C8D4C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubSubStruct_0203CF40 *a1);
u32 sub_81C8A28(s32 a0);
u32 sub_81C8958(s32 a0);
u32 sub_81C8870(s32 a0);
u32 sub_81C85A0(s32 a0);
void sub_81C8568(s32 a0, struct UnknownSubStruct_81C81D4 *a1);
@ -2233,7 +2237,7 @@ u32 sub_81C8870(s32 a0)
switch (a0)
{
case 0:
sub_81C9008(structPtr, 1);
sub_81C9008(&structPtr->unk0, 1);
// fall-through
case 1:
if (structPtr->unk89C != structPtr->unk888.unk6)
@ -2273,3 +2277,131 @@ u32 sub_81C8870(s32 a0)
return 4;
}
}
u32 sub_81C8958(s32 a0)
{
struct UnknownSubStruct_81C81D4 *structPtr;
structPtr = GetSubstructPtr(0x11);
if (IsDma3ManagerBusyWithBgCopy())
return 2;
switch (a0)
{
case 0:
sub_81C8CB4(&structPtr->unk888, &structPtr->unk0);
break;
case 1:
sub_81C8DBC(&structPtr->unk0, 0);
break;
case 2:
sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 0);
break;
case 3:
sub_81C8DBC(&structPtr->unk0, 1);
break;
case 4:
sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 1);
break;
case 5:
sub_81C8DBC(&structPtr->unk0, 2);
break;
case 6:
sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 2);
break;
case 7:
sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 3);
break;
default:
return 4;
}
return 0;
}
u32 sub_81C8A28(s32 a0)
{
struct UnknownSubStruct_81C81D4 *structPtr;
struct UnknownSubSubStruct_81C81D4 *subPtr888;
register struct UnknownSubSubStruct_0203CF40 *subPtr0 asm("r2");
s32 v4;
if (IsDma3ManagerBusyWithBgCopy())
{
return 2;
}
structPtr = GetSubstructPtr(0x11);
subPtr888 = &structPtr->unk888;
subPtr0 = &structPtr->unk0;
switch (a0)
{
default:
return 4;
case 0:
sub_81C8D4C(subPtr888, subPtr0);
return 0;
case 1:
{
s32 v1;
s32 v2;
u32 *v3;
register s32 v4 asm("r5");
v3 = &structPtr->unk89C;
v1 = *v3 + 1;
*v3 = v1;
if (v1 < structPtr->unk888.unk8)
{
sub_81C8B70(subPtr0, v1, 1);
return 2;
}
*v3 = 0;
if (subPtr888->unk2 <= subPtr888->unk8)
{
register u32 temp asm("r0");
temp = subPtr888->unk0;
if (temp == 0)
return 9;
v2 = temp;
}
else
{
register s32 temp asm("r1");
v2 = subPtr888->unk0 + subPtr888->unk8;
temp = (s32)subPtr888->unk2;
if (v2 <= temp)
return 9;
v2 -= temp;
}
v4 = v2 * -1;
sub_81C8B70(subPtr0, v4, v2);
subPtr888->unk6 = v2;
*v3 = v4;
return 0;
}
case 2:
sub_81C84E8(structPtr->unk89C, 0);
return 0;
case 3:
if (sub_81C8630())
return 2;
structPtr->unk89C = 0;
return 1;
case 4:
sub_81C83AC(subPtr888->unk10, subPtr888->unk0 + structPtr->unk89C, 1, subPtr888->unkC, structPtr->unk89C, structPtr);
return 0;
case 5:
if (sub_81C83E0())
return 2;
v4 = ++structPtr->unk89C;
if (v4 >= subPtr888->unk2 || v4 >= subPtr888->unk8)
return 1;
return 9;
case 6:
sub_81C9008(subPtr0, 0);
return 4;
}
}