Files
BFM-decomp/src/800c3.c
T

545 lines
12 KiB
C

#include "common.h"
INCLUDE_ASM("asm/nonmatchings/800c3", InitHeap);
INCLUDE_ASM("asm/nonmatchings/800c3", FlushCache);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005CE38);
INCLUDE_ASM("asm/nonmatchings/800c3", _96_remove);
INCLUDE_ASM("asm/nonmatchings/800c3", DeliverEvent);
INCLUDE_ASM("asm/nonmatchings/800c3", OpenEvent);
INCLUDE_ASM("asm/nonmatchings/800c3", CloseEvent);
INCLUDE_ASM("asm/nonmatchings/800c3", WaitEvent);
INCLUDE_ASM("asm/nonmatchings/800c3", TestEvent);
INCLUDE_ASM("asm/nonmatchings/800c3", EnableEvent);
INCLUDE_ASM("asm/nonmatchings/800c3", DisableEvent);
INCLUDE_ASM("asm/nonmatchings/800c3", ReturnFromException);
INCLUDE_ASM("asm/nonmatchings/800c3", ResetEntryInt);
INCLUDE_ASM("asm/nonmatchings/800c3", HookEntryInt);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005CF08);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005CF18);
INCLUDE_ASM("asm/nonmatchings/800c3", read);
INCLUDE_ASM("asm/nonmatchings/800c3", write);
INCLUDE_ASM("asm/nonmatchings/800c3", ChangeClearPAD);
INCLUDE_ASM("asm/nonmatchings/800c3", ChangeClearRCnt);
extern u32 D_80072938;
s32 SetRCnt(s32 a0, s16 a1, s32 a2) {
register s32 t0 __asm__("$8");
register s32 a3 __asm__("$7");
register s32 a0p __asm__("$4");
u32 v1;
t0 = a0 & 0xFFFF;
if (t0 >= 3) {
return 0;
}
a3 = 0x48;
v1 = (t0 << 4) + *(u32*)&D_80072938;
*(u16*)(v1 + 4) = 0;
{
s32 lt2 = t0 < 2U;
*(u16*)(v1 + 8) = a1;
__asm__ __volatile__("" : : "r"(lt2));
if (lt2) {
if (a2 & 0x10) {
a3 = 0x49;
}
if (!(a2 & 0x1)) {
a3 |= 0x100;
}
} else if (t0 == 2U) {
if (!(a2 & 0x1)) {
a3 = 0x248;
}
}
}
if (a2 & 0x1000) {
a3 |= 0x10;
}
{
register s32 ret __asm__("$2");
ret = 1;
__asm__ __volatile__("" : : "r"(ret));
a0p = *(s32*)&D_80072938;
v1 = t0 << 4;
v1 = v1 + (u32)a0p;
*(u16*)(v1 + 4) = a3;
return ret;
}
}
INCLUDE_ASM("asm/nonmatchings/800c3", GetRCnt);
INCLUDE_ASM("asm/nonmatchings/800c3", StartRCnt);
INCLUDE_ASM("asm/nonmatchings/800c3", StopRCnt);
INCLUDE_ASM("asm/nonmatchings/800c3", ResetRCnt);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D0D8);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D0F8);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D118);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D138);
extern void* (*D_80072970)(void);
s32 func_8005D184(s32 arg0) {
void* v0;
register s32 v1 __asm__("$3");
v0 = D_80072970();
if ((*(u32*)((u8*)v0 + 0x34) & 0xFFFF0000) != 0) {
goto do_switch;
}
if ((u32)v0 == *(u32*)((u8*)v0 + 0x10)) {
goto check30;
}
if (*(u8*)((u8*)v0 + 0x38) != 0) {
goto do_switch;
}
check30:
if (*(u8*)*(u32*)((u8*)v0 + 0x30) == 0) {
goto return_byte;
}
do_switch:
v1 = *(u8*)((u8*)v0 + 0x49);
if (v1 == 3) {
goto return_one;
}
if (v1 < 4) {
if (v1 == 2) {
goto return_one;
}
goto return_byte;
}
if (v1 == 6) {
goto return_four;
}
goto return_byte;
return_one:
return 1;
return_four:
return 4;
return_byte:
return *(u8*)((u8*)v0 + 0x49);
}
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D244);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D33C);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D410);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D4B8);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D4F0);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D538);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D588);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D6A0);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D6CC);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D734);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D8A0);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D8B4);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D980);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D9C4);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005DBD8);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005DCA0);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005DE78);
extern s32 *D_800729BC;
extern s32 *D_800729C0;
s32 func_8005FBC8(void);
s32 func_8005E0AC(void) {
s32 *ptr1 = D_800729BC;
s32 *ptr2;
u16 v1_val;
{
register s32 *pre_ptr2 __asm__("$4") = D_800729C0;
*ptr1 = -0x81;
if ((*(u16 *)((s8 *)pre_ptr2 + 0x4) & 0x80) != 0) {
do {
if (func_8005FBC8() != 0) {
return 0;
}
} while ((*(u16 *)((s8 *)D_800729C0 + 0x4) & 0x80) != 0);
}
}
ptr2 = D_800729C0;
v1_val = *(u16 *)((s8 *)ptr2 + 0xA);
*(u16 *)((s8 *)ptr2 + 0xA) = v1_val | 0x10;
return 1;
}
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005E13C);
INCLUDE_ASM("asm/nonmatchings/800c3", SysEnqIntRP);
INCLUDE_ASM("asm/nonmatchings/800c3", SysDeqIntRP);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005E188);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005E194);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005E1A4);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005E228);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005E374);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005E3AC);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005E480);
typedef struct Entry {
/* 0x00 */ u8 b0;
/* 0x01 */ u8 unk1[3];
/* 0x04 */ u8 *p4;
} Entry; /* size 8 */
typedef struct Ctx {
/* 0x00 */ s16 *p00;
/* 0x04 */ u8 *p04;
/* 0x08 */ Entry *p08;
/* 0x0C */ u8 unk0C[0x3C - 0x0C];
/* 0x3C */ u8 *p3C;
/* 0x40 */ u8 unk40[0x46 - 0x40];
/* 0x46 */ u8 b46;
/* 0x47 */ u8 b47;
/* 0x48 */ u8 b48;
/* 0x49 */ u8 b49;
/* 0x4A */ u8 unk4A[0xE3 - 0x4A];
/* 0xE3 */ u8 bE3;
/* 0xE4 */ u8 unkE4[0xE9 - 0xE4];
/* 0xE9 */ u8 bE9;
/* 0xEA */ u8 bEA;
} Ctx;
extern u8 *D_800789A8;
s32 func_8005E528(Ctx *s) {
Entry *e;
u8 *src;
u8 *p;
u8 **gp;
u8 *g;
s32 t;
register u8 *q __asm__("$4");
s32 n;
switch (s->b46) {
case 2:
s->p00[s->b47] = (s->p3C[4] << 8) + s->p3C[5];
if (++s->b47 < s->bE3) {
return 0;
}
s->b47 = 0;
break;
case 3:
p = &s->p04[s->b47 * 5];
q = s->p3C;
p[0] = q[4];
p[1] = s->p3C[5] & 0x7F;
p[2] = s->p3C[6];
p[3] = s->p3C[7];
t = s->p3C[5];
p[4] = t >> 7;
if (++s->b47 < s->bE9) {
return 0;
}
s->b47 = 0;
s->b48 = 0;
break;
case 4:
e = &s->p08[s->b47];
if (s->b48 == 0) {
e->b0 = s->b48 = s->p3C[4];
n = 3;
src = s->p3C + 5;
if (s->b47 == 0) {
p = (u8 *)&s->p08[s->bEA];
} else {
p = e[-1].p4 + ((e[-1].b0 + 3) & 0x1FC);
}
e->p4 = p;
D_800789A8 = p;
} else {
n = 6;
src = s->p3C + 2;
}
for (n--; n != -1; n--) {
if (s->b48 == 0) goto adv;
gp = &D_800789A8;
g = *gp;
*g++ = *src++;
*gp = g;
s->b48--;
}
if (s->b48 == 0) goto adv;
ret0:
return 0;
adv:
if (++s->b47 >= s->bEA) {
s->b49 = 6;
s->b46 = 0xFE;
return 0;
}
s->b48 = 0;
goto ret0;
}
return 1;
}
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005E79C);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005E804);
s32 func_8005E820(void *a0)
{
u8 v0;
u8 *a1;
s32 a3;
s32 v1;
s32 t1;
s32 t2;
s32 t3;
s32 t0;
v0 = *(u8 *)((u8 *)a0 + 0xE9);
t0 = 0;
if (v0 == 0) {
*(u8 *)((u8 *)a0 + 0x46) = 0xFE;
return 0;
}
t3 = 0xFF;
t2 = 0;
do {
a1 = *(u8 **)((u8 *)a0 + 0x20);
a3 = 0;
for (v1 = 5; v1 >= 0; v1--) {
if (*a1++ == t0) {
a3++;
}
}
t1 = *(u8 *)(t2 + (u32)*(u8 **)((u8 *)a0 + 0x4) + 2);
a1 = *(u8 **)((u8 *)a0 + 0x20);
if (t1 == 0) {
t1 = 1;
}
for (v1 = 0; v1 < 6; v1++) {
if (*a1++ == t0) {
if (a3 < t1) {
((u8 *)a0)[v1 + 0x5D] = t3;
a3--;
} else {
((u8 *)a0)[v1 + 0x5D] = t0;
}
}
}
t2 += 5;
} while (*(u8 *)((u8 *)a0 + 0xE9) > ++t0);
*(u8 *)((u8 *)a0 + 0x46) = 0xFE;
return 0;
}
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005E8E8);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005E980);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005E9D4);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005EA34);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005EA54);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005EA68);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005EA88);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005EAA8);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005EAC8);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005EAE8);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005EB28);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005EC00);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005ECC0);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005ED4C);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005F0C8);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005F228);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005F290);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005F384);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005F394);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005F450);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005F6CC);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005F704);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005F728);
extern void func_8005EA34(void *arg0, s32 arg1);
extern void func_8005E1A4(void *arg0);
s32 func_8005F75C(void *arg0) {
void *v0;
s32 v1;
v0 = M2C_FIELD(arg0, void **, 0x3C);
if (M2C_FIELD(v0, u8 *, 0x0) == 0xF3) {
if (M2C_FIELD(arg0, u8 *, 0xE8) == 0) {
goto L8005F7E8;
}
}
v1 = M2C_FIELD(arg0, u8 *, 0x46);
if (v1 == 1) {
goto L8005F7D8;
}
__asm__ volatile("" ::: "memory");
if (v1 < 2) {
if (v1 == 0) {
goto L8005F820;
}
goto L8005F7F8;
}
if (v1 == 0xFE) {
goto L8005F7E8;
}
__asm__ volatile("" ::: "memory");
if (v1 == 0xFF) {
goto L8005F820;
}
goto L8005F7F8;
L8005F7D8:
func_8005EA34(arg0, 1);
goto L8005F820;
L8005F7E8:
func_8005EA34(arg0, 0);
goto L8005F820;
L8005F7F8:
{
void (*fp)(void *) = M2C_FIELD(arg0, void (**)(void *), 0x14);
if (fp != NULL) {
fp(arg0);
goto L8005F820;
}
}
func_8005E1A4(arg0);
L8005F820:
return 0;
}
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005F830);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005FA94);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005FB70);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005FBA8);
extern volatile s32 D_80078F24;
extern volatile s32 D_800C5320;
s32 func_8005FBC8(void) {
u16 val1;
s32 a0;
u16 status;
val1 = *(volatile u16*)0x1F801120;
a0 = val1;
if ((u32)a0 < (u32)D_80078F24) {
if (*(volatile u16*)0x1F801128 != 0) {
a0 += *(volatile u16*)0x1F801128;
} else {
a0 += 0x10000;
}
}
status = *(volatile u16*)0x1F801124;
if (status & 0x200) {
return (u32)(a0 - D_80078F24) >= (u32)D_800C5320;
} else {
return ((u32)(a0 - D_80078F24) >> 3) >= (u32)D_800C5320;
}
}