Merge pull request #215 from dplewis/frag1
Some checks failed
C/C++ CI / build (push) Has been cancelled

Fragment 1 various functions
This commit is contained in:
Revo 2025-11-26 15:31:36 -05:00 committed by GitHub
commit 48e58de33e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 510 additions and 73 deletions

1
.gitignore vendored
View File

@ -27,4 +27,5 @@ ctx.c.m2c
.vscode/*
!.vscode/c_cpp_properties.json
tools/vtxdis
tools/permuter/
.DS_Store

View File

@ -535,6 +535,77 @@ typedef struct TrainerData {
/* 0x03A */ char unk3A[0x1F6];
} TrainerData; // size = 0x230
// GB Emulator State
typedef struct unk_D_8122B2C0 {
/* 0x00000 */ u8 unk_00[0x208];
/* 0x00208 */ u8 unk_208[0x40];
/* 0x00248 */ u8 unk_248[0x40];
/* 0x00288 */ u8 unk_288[0x100];
/* 0x00388 */ u8 unk_388[0x400];
/* 0x00788 */ u8 unk_788[0x4000];
/* 0x04788 */ u8 unk_4788[0xC00];
/* 0x05388 */ s32 unk_5388;
/* 0x0538C */ char unk0538C[4];
/* 0x05390 */ u32 unk_5390;
/* 0x05394 */ u32 unk_5394;
/* 0x05398 */ u32 unk_5398;
/* 0x0539C */ u32 unk_539C;
/* 0x53A0 */ char unk053A0[0x8];
/* 0x053A8 */ void* unk_53A8;
/* 0x053AC */ void* unk_53AC;
/* 0x053B0 */ void* unk_53B0;
/* 0x053B4 */ void* unk_53B4;
/* 0x053B8 */ char unk053B8[0x4];
/* 0x053BC */ void* unk_53BC;
/* 0x053C0 */ char unk053C0[0x2E];
/* 0x053EE */ u16 unk_53EE;
/* 0x053F0 */ u16 unk_53F0;
/* 0x053F2 */ char unk053F1[0xA];
/* 0x053FC */ u8 unk_53FC;
/* 0x053FD */ u8 unk_53FD;
/* 0x053FE */ u8 unk_53FE;
/* 0x053FF */ char unk053FF[0x86];
/* 0x05485 */ u8 unk_5485;
/* 0x05486 */ char unk05486[0x8];
/* 0x0548E */ u8 unk_548E;
/* 0x0548F */ char unk0548F[0xD];
/* 0x0549C */ u8 unk_549C[0x100];
/* 0x0559C */ u8 unk_559C[0x10];
/* 0x055AC */ u8 unk_55AC[0x40];
/* 0x055EC */ u8 unk_55EC[0x40];
/* 0x0562C */ u8 unk_562C[0x200];
/* 0x0582C */ u8 unk_582C[0x200];
/* 0x05A2C */ u8 unk_5A2C[0x200];
/* 0x05C2C */ char unk05C2C[0x2C];
/* 0x05C58 */ void* unk_5C58;
/* 0x05C5C */ char unk_5C5C[0x50];
/* 0x05CAC */ OSGbpakId gbpakId;
/* 0x05CFC */ OSPfs* pfs;
/* 0x05D00 */ char unk05D00[0x64];
/* 0x05D64 */ u8* transferBuffer;
/* 0x05D68 */ u32 gbAddress;
/* 0x05D6C */ s32 transferSize;
/* 0x05D70 */ u32 unk_5D70[4];
/* 0x05D80 */ u32 unk_5D80[4];
/* 0x05D90 */ u32 unk_5D90[4];
/* 0x05DA0 */ u16 unk_5DA0;
/* 0x05DA2 */ u16 unk_5DA2;
/* 0x05DA4 */ char unk05DA4[0x20];
/* 0x05DC4 */ u8 unk_5DC4;
/* 0x05DC5 */ u8 unk_5DC5;
/* 0x05DC6 */ char unk05DC6[0x2];
/* 0x05DC8 */ volatile u8 unk_5DC8;
/* 0x05DC9 */ u8 unk_5DC9;
/* 0x05DCA */ u8 unk_5DCA;
/* 0x05DCB */ u8 status;
/* 0x05DCC */ u8 unk_5DCC;
/* 0x05DCD */ char unk05DCD[1];
/* 0x05DCE */ u8 unk_5DCE;
/* 0x05DCF */ u8 unk_5DCF;
/* 0x05DD0 */ u8 unk_5DD0;
/* 0x05DD1 */ u8 unk05DD1[0x15287];
} unk_D_8122B2C0; // size = 0x1B058
extern s16 D_80075E40[];
#include "variables.h"

View File

@ -8,6 +8,7 @@ void func_81206D9C(unk_D_800AA660*);
void func_81206E64(unk_D_800AA660*);
void func_81206F38(unk_D_800AA664*);
void func_81209078();
void func_81209870(unk_D_8122B2C0*);
s32 osGbSetNextBuffer(void*, s32);
#endif /* _FRAGMENT1_H_ */

View File

@ -17,51 +17,6 @@ typedef struct unk_D_8122B2F8 {
/* 0x000000 */ char unk000000[0x1FEAE8];
} unk_D_8122B2F8; // size = 0x1FEAE8
// Gamepak State
typedef struct unk_D_8122B2C0 {
/* 0x00000 */ char unk00000[0x5388];
/* 0x05388 */ s32 unk_05388;
/* 0x0538C */ char unk0538C[0x1C];
/* 0x053A8 */ void* unk_053A8;
/* 0x053AC */ void* unk_053AC;
/* 0x053B0 */ void* unk_053B0;
/* 0x053B4 */ void* unk_053B4;
/* 0x053B8 */ char unk053B8[0x4];
/* 0x053BC */ void* unk_053BC;
/* 0x053C0 */ char unk053C0[0x46C];
/* 0x0582C */ u8 unk_0582C[128];
/* 0x058AC */ char unk058AC[0x3AC];
/* 0x05C58 */ void* unk_05C58;
/* 0x05C5C */ char unk_5C5C[0x50];
/* 0x05CAC */ OSGbpakId gbpakId;
/* 0x05CFC */ OSPfs* pfs;
/* 0x05D00 */ char unk05D00[0x70];
/* 0x05D70 */ s32 unk_5D70;
/* 0x05D74 */ char unk05D74[0xC];
/* 0x05D80 */ u32 unk_5D80;
/* 0x05D84 */ s32 unk_5D84;
/* 0x05D88 */ s32 unk_5D88;
/* 0x05D8C */ s32 unk_5D8C;
/* 0x05D90 */ u32 unk_5D90;
/* 0x05D94 */ char unk05D94[0x8];
/* 0x05D9C */ u32 unk_5D9C;
/* 0x05DA0 */ u16 unk_5DA0;
/* 0x05DA2 */ u16 unk_5DA2;
/* 0x05DA4 */ char unk05DA3[0x20];
/* 0x05DC4 */ u8 unk_5DC4;
/* 0x05DC5 */ u8 unk_5DC5;
/* 0x05DC6 */ char unk05DC6[0x2];
/* 0x05DC8 */ volatile u8 unk_05DC8;
/* 0x05DC9 */ char unk05DC9[0x1];
/* 0x05DCA */ u8 unk_5DCA;
/* 0x05DCB */ u8 status;
/* 0x05DCC */ u8 unk_5DCC;
/* 0x05DCD */ char unk05DCD[1];
/* 0x05DCE */ u8 unk_5DCE;
/* 0x05DCF */ u8 unk_5DCF;
/* 0x05DD0 */ u8 unk05DD0[0x15288];
} unk_D_8122B2C0; // size = 0x1B058
typedef struct unk_D_8122B1E8 {
/* 0x00 */ OSMesg mesg[1];
/* 0x04 */ OSMesgQueue queue;
@ -71,8 +26,32 @@ typedef struct unk_D_8122B1E8 {
/* 0x28 */ char unk28[0x40];
} unk_D_8122B1E8; // size = 0x68
extern unk_D_80068BB0* D_8122B1E0[2];
typedef struct unk_func_812009D0 {
/* 0x00 */ u8 unk00[0x34];
/* 0x34 */ u8 data[0x10];
/* 0x44 */ u16 unk_44;
/* 0x46 */ u8 unk_46;
/* 0x47 */ u8 unk47;
/* 0x48 */ u8 unk_48;
/* 0x49 */ u8 unk_49;
/* 0x4A */ u8 unk_4A;
} unk_func_812009D0; // size = 0x4B
typedef struct unk_D_8122C748 {
/* 0x0000 */ u8 unk0000[0x9790];
/* 0x9790 */ s32 unk_9790;
/* 0x9794 */ u8 unk[0xFC];
/* 0x9890 */ s32 unk_9890;
/* 0x9894 */ u8 data[0xFC];
/* 0x9990 */ s32 unk_9990;
} unk_D_8122C748; // size = 0x9994
extern unk_D_80068BB0* D_8122B1E0;
extern unk_D_80068BB0* D_8122B1E4;
extern u8 D_8120D820[200];
extern u8 D_8120DD70;
extern unk_D_8122B1E8 D_8122B1E8[2];
extern s32 D_8122B224[];
extern s32 D_8122B2B8;
extern unk_D_8122B2C0* D_8122B2C0;
extern unk_D_8122B2F8* D_8122B2C8[3];
@ -102,7 +81,7 @@ extern u8 D_8122C500[0x1F];
extern u8 D_8122C520[0x20];
extern u8* D_8122C740;
extern u8* D_8122C744;
extern void* D_8122C748;
extern unk_D_8122C748* D_8122C748;
extern s32 D_8122C74C;
extern u8* D_8122C754;
extern u8* D_8122C758[2];
@ -217,8 +196,29 @@ s32 func_81200358(unk_D_8122B2C0* arg0) {
return ret;
}
void func_812003EC(unk_D_8122B2C0*, s32);
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812003EC.s")
void func_812003EC(unk_D_8122B2C0* arg0, s32 arg1) {
s32 i;
switch (arg1) {
case 3:
for (i = 0; i < 8; i++) {
arg0->unk_5D80[i] = 0;
}
break;
case 2:
for (i = 0; i < 8; i++) {
arg0->unk_5D80[i] = -1;
}
break;
case 1:
osDpGetCounters(arg0->unk_5D80);
arg0->unk_5D80[3] = osGetCount();
osWritebackDCacheAll();
osDpGetCounters(arg0->unk_5D90);
arg0->unk_5D90[3] = osGetCount();
break;
}
}
s32 func_812004B8(unk_D_8122B2C0*);
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812004B8.s")
@ -253,12 +253,68 @@ s32 func_812005D8(unk_D_8122B2C0* arg0) {
return ret;
}
s32 func_812006AC(unk_D_8122B2C0* arg0);
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812006AC.s")
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812008C8.s")
s32 func_812008C8(unk_D_8122B2C0* arg0, s32 arg1) {
s32 temp_v0;
s32 var_s0;
s32 var_s1;
u8* var_s3;
s32 var_v0;
s32 var_v1;
u32 var_s2;
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812009D0.s")
var_v0 = func_812005D8(arg0);
var_v1 = var_v0;
var_s3 = arg0->transferBuffer;
var_s2 = arg0->gbAddress;
var_s1 = arg0->transferSize;
while ((var_v0 == 0) && (var_s1 != 0)) {
var_v0 = func_812002BC(arg0, var_s2 >> 0xD);
var_v1 = var_v0;
if (var_v0 == 0) {
temp_v0 = var_s2 & 0x1FFF;
if ((u32) (temp_v0 + var_s1) >= 0x2001U) {
var_s0 = 0x2000 - temp_v0;
} else {
var_s0 = var_s1;
}
var_v0 = osGbpakReadWrite(&arg0->pfs, arg1, (temp_v0 | 0xA000) & 0xFFFF, var_s3, var_s0);
var_v1 = var_v0;
var_s3 += var_s0;
var_s1 -= var_s0;
var_s2 = (var_s2 + 0x2000) & ~0x1FFF;
}
}
if (var_v0 == 0) {
var_v1 = func_8120019C(arg0);
}
return var_v1;
}
s32 func_812009D0(unk_func_812009D0* arg0) {
u8* var_s1;
s32 i;
var_s1 = &D_8120DD70;
for (i = 4; i > 0; i--) {
if (
(bcmp(var_s1, arg0->data, 0x10) == 0) &&
(arg0->unk_44 == 0x3031) &&
(arg0->unk_46 == 3) &&
(arg0->unk_48 == 5) &&
(arg0->unk_49 == 3) &&
(arg0->unk_4A != 0)
) {
return i;
}
var_s1 -= 0x10;
}
return i;
}
void func_81200AA8(void *);
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81200AA8.s")
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812011D0.s")
@ -279,16 +335,78 @@ s32 func_812015E0(UNUSED s32 arg0, s32 arg1) {
return arg1;
}
void func_812015EC(u16*, u16*, s32, s32, s32);
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812015EC.s")
void func_812015EC(u16* dst, u16* src, s32 mode, s32 width, s32 height) {
s32 (*operation)(s32, s32);
s32 x;
s32 y;
width = ((width + 3) & 0xFFC);
switch (mode) {
case 0: operation = func_81201560; break;
case 1: operation = func_8120157C; break;
case 2: operation = func_81201598; break;
default: operation = func_812015E0; break;
}
for (x = 0; x != height; x++) {
for (y = 0; y != width; y++) {
*dst = operation(*dst, *src);
dst++;
src++;
}
dst = dst - width + 0x140;
}
}
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812016DC.s")
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812018C0.s")
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81201DDC.s")
#ifdef NON_MATCHING
void func_81201DDC(u16* dst, u8* alpha_map, s32 color, s32 width, s32 height, u32 alpha_stride) {
u16* dst_row;
u8* alpha_row;
s32 x;
s32 y;
s32 var_t0;
s32 var_t4;
s32 var_a0;
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81201FBC.s")
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
var_a0 = alpha_map[y * alpha_stride + x];
var_t0 = (dst[y * 320 + x] & 0xF800) + ((((color & 0xF800) * (var_a0 & 0xF)) / 15) & 0xF800);
if (var_t0 > 0xF800) var_t0 = 0xF800;
var_t4 = var_t0;
var_t0 = (dst[y * 320 + x] & 0x07C0) + ((((color & 0x07C0) * (var_a0 & 0xF)) / 15) & 0x07C0);
if (var_t0 > 0x07C0) var_t0 = 0x07C0;
var_t4 |= var_t0;
var_t0 = (dst[y * 320 + x] & 0x003E) + ((((color & 0x003E) * (var_a0 & 0xF)) / 15) & 0x003E);
if (var_t0 > 0x003E) var_t0 = 0x003E;
dst[y * 320 + x] = (s16)(var_t4 | var_t0);
}
}
}
#else
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81201DDC.s")
#endif
void func_81201FBC(s32 arg0, s32 arg1, s32 arg2) {
s32 var_s0;
s32 var_s1;
s32 i;
for (i = 8; i < arg2 - 8; i += 8) {
func_812018C0(arg0 + i * 2, &D_8122C748->unk_9890, arg1, 8, 0x10);
}
func_812018C0(arg0, &D_8122C748->unk_9790, arg1, 8, 0x10);
func_812018C0(arg0 + (arg2 - 8) * 2, &D_8122C748->unk_9990, arg1, 8, 0x10);
}
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812020C0.s")
@ -304,18 +422,89 @@ void func_812015EC(u16*, u16*, s32, s32, s32);
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81202FCC.s")
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_8120311C.s")
void func_8120311C(unk_D_8122B2C0* arg0) {
s32 i;
s32 var_a0;
u8* var_a1;
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81203304.s")
bzero(arg0->unk_00, 0x208);
bzero(arg0->unk_208, 0x40);
bzero(arg0->unk_248, 0x40);
bzero(arg0->unk_388, 0x400);
bzero(arg0->unk_788, 0x4000);
bzero(arg0->unk_549C, 0x100);
bzero(arg0->unk_559C, 0x10);
bzero(arg0->unk_55AC, 0x40);
bzero(arg0->unk_55EC, 0x40);
bzero(arg0->unk_582C, 0x200);
bzero(arg0->unk_5A2C, 0x200);
bzero(arg0->unk_562C, 0x200);
bzero(arg0->unk_53B4, 0x6000);
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_8120334C.s")
for (i = 0; i < 0x80; i++) {
arg0->unk_582C[i] = 0xFE;
arg0->unk_5A2C[i] = 0xFF;
}
for (i = 0; i < 0x400; i++) {
arg0->unk_388[i] = 0xFF;
}
var_a0 = 0;
for (i = 0x10; i < 0x1A0; i += 2) {
arg0->unk_788[i] = D_8120D820[var_a0];
var_a0++;
}
var_a0 = 1;
for (i = 0x1904; i < 0x1910; i++) {
arg0->unk_788[i] = var_a0;
arg0->unk_788[i + 32] = var_a0 + 0xC;
var_a0 += 1;
}
arg0->unk_788[i] = 0x19;
for (i = 1; i < 0x1A; i++) {
arg0->unk_388[i] = 0;
}
for (i = 0x190; i < 0x193; i++) {
arg0->unk_388[i] = 0;
}
arg0->unk_539C = 0x25800;
arg0->unk_53FC = 0;
arg0->unk_53FD = 0;
arg0->unk_53EE = 0x140;
arg0->unk_53FE = 0x30;
arg0->unk_53F0 = 0x7C;
arg0->unk_5485 = 1;
arg0->unk_5390 = 0;
arg0->unk_548E = 1;
arg0->unk_5394 = 0x8000;
arg0->unk_5398 = 0x8000;
func_81209870(arg0);
}
void func_81203304(void) {
bzero(D_8122B1E0->img_p, 0x2D000);
bzero(D_8122B1E4->img_p, 0x2D000);
}
void func_8120334C(OSTime arg0) {
OSMesgQueue sp68;
void* sp64;
OSTimer sp40;
osCreateMesgQueue(&sp68, &sp64, 1);
osSetTimer(&sp40, (1000 * arg0) * 64 / 3, 0, &sp68, NULL);
osRecvMesg(&sp68, NULL, 1);
}
void func_81200AA8(void *);
void func_81202210(s32, s32);
void func_8120241C(void);
void func_812029B0(u8*, u16 (*)[6][0x640], s32, s32);
void func_8120311C(unk_D_8122B2C0*);
void func_81203304(void);
void func_812070A0(void);
void func_8120735C(s32);
void func_81208C08(s32, s32, s32);
@ -327,7 +516,7 @@ void func_8120935C(s32);
void func_812033F4(s32, s32, OSId, s32, OSMesgQueue*, u16 (*arg5)[6][0x640]);
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812033F4.s")
void func_81203C58(unk_D_8122B2C0* arg0);
void func_81203C58(unk_D_8122B2C0*);
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81203C58.s")
void func_81203E30(void) {
@ -340,9 +529,10 @@ void func_81203E30(void) {
D_8122C4F4 = (D_8122C4FA.unk_01 == 0) ? 0x1000 : (D_8122C4FA.unk_01 == 2) ? 0x10 : (D_8122C4FA.unk_01 == 3) ? 2 : (D_8122C4FA.unk_01 == 4) ? 4 : 0x20;
}
void func_81203F3C(unk_D_8122B2C0*);
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81203F3C.s")
void func_81204A84(s32 arg0);
void func_81204A84(s32);
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81204A84.s")
s32 func_8120572C(s32);

View File

@ -2,11 +2,35 @@
typedef struct unk_func_81208D7C {
/* 0x00 */ u8 unk_00;
/* 0x02 */ char unk00[0x06];
/* 0x08 */ s32 unk_08;
/* 0x10 */ char unk0C[0x30];
/* 0x3C */ s8 unk_3C;
/* 0x3D */ char unk3D[0x13];
/* 0x02 */ char unk02[0x02];
/* 0x04 */ s32 unk_04;
/* 0x08 */ union {
u16 unk_00;
s32 unk_02;
} unk_08;
/* 0x0C */ u32 unk_0C;
/* 0x10 */ u16 unk_10;
/* 0x12 */ u16 unk_12;
/* 0x14 */ s32 unk_14;
/* 0x18 */ s32 unk_18;
/* 0x1C */ char unk1C[0x4];
/* 0x20 */ u8 unk_20;
/* 0x21 */ u8 unk_21;
/* 0x22 */ char unk22[0x2];
/* 0x24 */ u32 unk_24;
/* 0x28 */ u32 unk_28;
/* 0x2C */ char unk2C[0x1];
/* 0x2D */ u8 unk_2D;
/* 0x2E */ u8 unk_2E;
/* 0x2F */ char unk2F[0xD];
/* 0x3C */ u8 unk_3C;
/* 0x3D */ char unk3D[0x3];
/* 0x40 */ u32 unk_40;
/* 0x44 */ u16 unk_44;
/* 0x46 */ u16 unk46;
/* 0x48 */ u32 unk_48;
/* 0x4C */ u8 unk_4C;
/* 0x4D */ char unk4D[0x3];
} unk_func_81208D7C; // size = 0x50
typedef struct unk_D_8122EEA8 {
@ -17,12 +41,16 @@ typedef struct unk_D_8122EEA8 {
} unk_D_8122EEA8; // size = 0x4
extern u8 D_811FEB60[];
extern u8 D_8120EB24[];
extern u8 D_8120EB28[];
extern u8 D_8120EB38[];
extern u16 D_8120EA86;
extern f32 D_8120EAC0;
extern s32 D_8120EAC8;
extern s32 D_8120EACC;
extern s32 D_8120EAC4;
extern s32 D_8120EA60;
extern u32 D_8120EA80;
extern s32 D_8120EB78;
extern s32 D_8120EB7C;
extern f32 D_8122B0A0;
@ -78,20 +106,166 @@ u32 func_812073B8(u16 arg0) {
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81207494.s")
s32 func_812075C0(s32);
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_812075C0.s")
void func_81207690(void) {
}
s32 func_81207698(u32, u16);
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81207698.s")
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81207774.s")
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81207A60.s")
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81207C5C.s")
u16 func_81207C5C(void) {
u16 temp_v0;
u16 temp_a0;
u16 temp_a1;
u16 var_a0;
if (D_8122C838.unk_00 == 0) {
if (D_8122C838.unk_3C == 0) {
return 0U;
}
D_8122C838.unk_3C--;
D_8122C838.unk_20 = D_8122C838.unk_3C;
D_8122C838.unk_0C = (s32) D_8122C838.unk_40;
} else {
if (D_8122C838.unk_04 != 0) {
D_8122C838.unk_04--;
if (D_8122C838.unk_04 >= 0x21) {
if (D_8122C838.unk_3C == 0) {
D_8122C838.unk_04 = 0x20;
D_8122C838.unk_08.unk_02 = 0;
D_8122C838.unk_0C = func_812073B8(D_8122C838.unk_10);
D_8122C838.unk_20 = D_8120EB24[D_8122C838.unk_21];
} else {
if (!(D_8122C838.unk_04 & 7)) {
D_8122C838.unk_3C--;
}
D_8122C838.unk_20 = D_8122C838.unk_3C;
D_8122C838.unk_0C = (s32) D_8122C838.unk_40;
}
}
}
}
temp_a0 = func_81207698(7, D_8122C838.unk_08.unk_00);
D_8122C838.unk_08.unk_02 += D_8122C838.unk_0C;
D_8122C838.unk_08.unk_02 &= 0x1FFFFF;
if (D_8122C838.unk_4C - 1 == 0) {
if (D_8122C838.unk_3C != 0) {
D_8122C838.unk_3C--;
}
temp_a1 = D_8122C838.unk_3C;
} else {
D_8122C838.unk_3C = D_8122C838.unk_20;
D_8122C838.unk_40 = D_8122C838.unk_0C;
temp_a1 = D_8122C838.unk_20;
}
temp_a0 *= temp_a1;
temp_a0 = (D_8122C838.unk_44 + temp_a0) >> 1;
D_8122C838.unk_44 = temp_a0;
if (D_8122C838.unk_18 == 1) {
if (D_8122C838.unk_14 != 0) {
D_8122C838.unk_14--;
}
if (D_8122C838.unk_14 == 0) {
D_8122C838.unk_00 = 0U;
}
}
return temp_a0;
}
u16 func_81207C5C_Empty(void) {
}
#ifdef NON_MATCHING
// Does match but won't generate correct checksum
u16 func_81207DF8(void) {
static s32 D_8120EB6C;
u16 temp_v0;
u32 var_a2;
if (D_8122C888.unk_0C < D_8122C888.unk_40) {
D_8122C888.unk_40 -= D_8122C888.unk_48;
var_a2 = D_8122C888.unk_40;
} else if (D_8122C888.unk_40 < D_8122C888.unk_0C) {
D_8122C888.unk_40 += D_8122C888.unk_48;
var_a2 = D_8122C888.unk_40;
} else {
var_a2 = D_8122C888.unk_40;
}
if (D_8122C888.unk_00 == 0) {
if (D_8122C888.unk_3C == 0) {
return 0;
}
D_8122C888.unk_3C--;
D_8122C888.unk_20 = D_8122C888.unk_3C;
D_8122C888.unk_0C = D_8122C888.unk_40;
}
temp_v0 = func_81207698(6, D_8122C888.unk_08.unk_00);
D_8122C888.unk_08.unk_02 += var_a2;
if (D_8122C888.unk_08.unk_00 >= (u32)D_8120EACC) {
D_8122C888.unk_08.unk_00 = D_8120EAC8;
}
temp_v0 *= D_8122C888.unk_3C;
if ((D_8122C888.unk_3C != D_8122C888.unk_20) && ((D_8120EB6C % 95) == 0)) {
if (D_8122C888.unk_3C > D_8122C888.unk_20) {
D_8122C888.unk_3C--;
} else {
D_8122C888.unk_3C++;
}
}
D_8120EB6C++;
if (D_8122C888.unk_28 != 0) {
D_8122C888.unk_24++;
if ((D_8122C888.unk_24 % (u32) D_8122C888.unk_28) == 0) {
switch (D_8122C888.unk_2E) { /* irregular */
case 0:
if (D_8122C888.unk_2D) {
D_8122C888.unk_2D--;
}
if (D_8122C888.unk_2D == 0) {
D_8122C888.unk_00 = 0;
}
break;
case 1:
if (D_8122C888.unk_2D < 0xF) {
D_8122C888.unk_2D++;
}
break;
}
switch ((D_8120EA80 << 0x14) >> 0x1F) { /* switch 1; irregular */
case 0: /* switch 1 */
D_8122C888.unk_20 = D_8120EB28[D_8122C888.unk_2D];
break;
case 1: /* switch 1 */
D_8122C888.unk_20 = D_8120EB38[D_8122C888.unk_2D];
break;
}
}
}
if (D_8122C888.unk_18 == 1) {
if (D_8122C888.unk_14 != 0) {
D_8122C888.unk_14--;
}
if (D_8122C888.unk_14 == 0) {
D_8122C888.unk_00 = 0U;
}
}
return (temp_v0 << 1);
}
#else
u16 func_81207DF8(void);
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81207DF8.s")
#endif
void func_8120806C(u16, u8);
#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_8120806C.s")
@ -115,10 +289,10 @@ void func_81208D7C(void) {
D_8122C7E8.unk_3C = 0;
D_8122C838.unk_3C = 0;
D_8122C888.unk_3C = 0;
D_8122C798.unk_08 = 0;
D_8122C7E8.unk_08 = 0;
D_8122C838.unk_08 = 0;
D_8122C888.unk_08 = 0;
D_8122C798.unk_08.unk_02 = 0;
D_8122C7E8.unk_08.unk_02 = 0;
D_8122C838.unk_08.unk_02 = 0;
D_8122C888.unk_08.unk_02 = 0;
}
void func_81208E28(s32 arg0) {