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..9723917 100644 --- a/include/global.h +++ b/include/global.h @@ -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" 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..9a01e80 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,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; + + 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; -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812009D0.s") + 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") +#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; + + 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; -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81201FBC.s") + 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; + + 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); + + 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++; + } -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81203304.s") + 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; -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_8120334C.s") + 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); 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) {