From cbddd22a5f0be54f9afe8490a480a165bb64ff27 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Mon, 13 Oct 2025 16:32:50 -0500 Subject: [PATCH 1/4] Fragment 1 various functions --- .gitignore | 1 + include/global.h | 68 ++++++++ src/fragments/1/fragment1.h | 1 + src/fragments/1/fragment1_7F9A0.c | 279 +++++++++++++++++++++++------- src/fragments/1/fragment1_86CB0.c | 1 + 5 files changed, 288 insertions(+), 62 deletions(-) diff --git a/.gitignore b/.gitignore index 151214d..66f9179 100644 --- a/.gitignore +++ b/.gitignore @@ -27,4 +27,5 @@ ctx.c.m2c .vscode/* !.vscode/c_cpp_properties.json tools/vtxdis +tools/permuter/ .DS_Store diff --git a/include/global.h b/include/global.h index 706edf6..5e57b09 100644 --- a/include/global.h +++ b/include/global.h @@ -535,6 +535,74 @@ 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[0x70]; + /* 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 unk05DA3[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" diff --git a/src/fragments/1/fragment1.h b/src/fragments/1/fragment1.h index 66d2b1e..11c5586 100644 --- a/src/fragments/1/fragment1.h +++ b/src/fragments/1/fragment1.h @@ -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_ */ diff --git a/src/fragments/1/fragment1_7F9A0.c b/src/fragments/1/fragment1_7F9A0.c index c2aac2d..2ba7e28 100644 --- a/src/fragments/1/fragment1_7F9A0.c +++ b/src/fragments/1/fragment1_7F9A0.c @@ -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,33 @@ 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") -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812009D0.s") +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 +300,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 +387,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 +481,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 +494,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); diff --git a/src/fragments/1/fragment1_86CB0.c b/src/fragments/1/fragment1_86CB0.c index 42e3592..3230b97 100644 --- a/src/fragments/1/fragment1_86CB0.c +++ b/src/fragments/1/fragment1_86CB0.c @@ -78,6 +78,7 @@ 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) { From 5e16573ea55699d84859dae5bfae2b9eaaa4358a Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Wed, 15 Oct 2025 18:08:19 -0500 Subject: [PATCH 2/4] func_812008C8 --- include/global.h | 7 ++++-- src/fragments/1/fragment1_7F9A0.c | 37 ++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/include/global.h b/include/global.h index 5e57b09..9723917 100644 --- a/include/global.h +++ b/include/global.h @@ -581,13 +581,16 @@ typedef struct unk_D_8122B2C0 { /* 0x05C5C */ char unk_5C5C[0x50]; /* 0x05CAC */ OSGbpakId gbpakId; /* 0x05CFC */ OSPfs* pfs; - /* 0x05D00 */ char unk05D00[0x70]; + /* 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 unk05DA3[0x20]; + /* 0x05DA4 */ char unk05DA4[0x20]; /* 0x05DC4 */ u8 unk_5DC4; /* 0x05DC5 */ u8 unk_5DC5; /* 0x05DC6 */ char unk05DC6[0x2]; diff --git a/src/fragments/1/fragment1_7F9A0.c b/src/fragments/1/fragment1_7F9A0.c index 2ba7e28..9a01e80 100644 --- a/src/fragments/1/fragment1_7F9A0.c +++ b/src/fragments/1/fragment1_7F9A0.c @@ -256,7 +256,42 @@ s32 func_812005D8(unk_D_8122B2C0* arg0) { 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; + + 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; From 38f2925287d25dad32a408c46cad80a7aee90da9 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Wed, 26 Nov 2025 14:17:05 -0600 Subject: [PATCH 3/4] func_81207C5C --- Makefile | 2 +- src/fragments/1/fragment1_86CB0.c | 193 +++++++++++++++++++++++++-- tools/asm-processor/asm_processor.py | 4 +- 3 files changed, 186 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index 1ea59c0..aa1d4a4 100644 --- a/Makefile +++ b/Makefile @@ -171,7 +171,7 @@ else endif # Check code syntax with host compiler -CHECK_WARNINGS := -Wall -Wextra -Wimplicit-fallthrough -Wno-unknown-pragmas -Wno-missing-braces -Wno-sign-compare -Wno-uninitialized -Wno-unused-label +CHECK_WARNINGS := -Wall -Wextra -Wimplicit-fallthrough -Wno-unknown-pragmas -Wno-missing-braces -Wno-sign-compare -Wno-uninitialized -Wno-unused-label -Wno-int-conversion -Wno-incompatible-function-pointer-types -Wno-return-mismatch # Have CC_CHECK pretend to be a MIPS compiler MIPS_BUILTIN_DEFS := -DMIPSEB -D_MIPS_FPSET=16 -D_MIPS_ISA=2 -D_ABIO32=1 -D_MIPS_SIM=_ABIO32 -D_MIPS_SZINT=32 -D_MIPS_SZPTR=32 ifneq ($(RUN_CC_CHECK),0) diff --git a/src/fragments/1/fragment1_86CB0.c b/src/fragments/1/fragment1_86CB0.c index 3230b97..a06bef6 100644 --- a/src/fragments/1/fragment1_86CB0.c +++ b/src/fragments/1/fragment1_86CB0.c @@ -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; @@ -84,15 +112,160 @@ s32 func_812075C0(s32); 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") @@ -116,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) { diff --git a/tools/asm-processor/asm_processor.py b/tools/asm-processor/asm_processor.py index a14854c..080c739 100644 --- a/tools/asm-processor/asm_processor.py +++ b/tools/asm-processor/asm_processor.py @@ -1335,8 +1335,8 @@ def fixup_objfile(objfile_name, functions, asm_prelude, assembler, output_enc, d if not existing: name_to_sym[s.name] = s newer_syms.append(s) - elif s.st_shndx != SHN_UNDEF: - raise Failure("symbol \"" + s.name + "\" defined twice") + # elif s.st_shndx != SHN_UNDEF: + # raise Failure("symbol \"" + s.name + "\" defined twice") else: s.replace_by = existing old_syms.append(s) From 8b9bcc265cc481b3485fd40b50e572858a036da1 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Wed, 26 Nov 2025 14:19:51 -0600 Subject: [PATCH 4/4] clean up --- Makefile | 2 +- tools/asm-processor/asm_processor.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index aa1d4a4..1ea59c0 100644 --- a/Makefile +++ b/Makefile @@ -171,7 +171,7 @@ else endif # Check code syntax with host compiler -CHECK_WARNINGS := -Wall -Wextra -Wimplicit-fallthrough -Wno-unknown-pragmas -Wno-missing-braces -Wno-sign-compare -Wno-uninitialized -Wno-unused-label -Wno-int-conversion -Wno-incompatible-function-pointer-types -Wno-return-mismatch +CHECK_WARNINGS := -Wall -Wextra -Wimplicit-fallthrough -Wno-unknown-pragmas -Wno-missing-braces -Wno-sign-compare -Wno-uninitialized -Wno-unused-label # Have CC_CHECK pretend to be a MIPS compiler MIPS_BUILTIN_DEFS := -DMIPSEB -D_MIPS_FPSET=16 -D_MIPS_ISA=2 -D_ABIO32=1 -D_MIPS_SIM=_ABIO32 -D_MIPS_SZINT=32 -D_MIPS_SZPTR=32 ifneq ($(RUN_CC_CHECK),0) diff --git a/tools/asm-processor/asm_processor.py b/tools/asm-processor/asm_processor.py index 080c739..a14854c 100644 --- a/tools/asm-processor/asm_processor.py +++ b/tools/asm-processor/asm_processor.py @@ -1335,8 +1335,8 @@ def fixup_objfile(objfile_name, functions, asm_prelude, assembler, output_enc, d if not existing: name_to_sym[s.name] = s newer_syms.append(s) - # elif s.st_shndx != SHN_UNDEF: - # raise Failure("symbol \"" + s.name + "\" defined twice") + elif s.st_shndx != SHN_UNDEF: + raise Failure("symbol \"" + s.name + "\" defined twice") else: s.replace_by = existing old_syms.append(s)