diff --git a/include/global.h b/include/global.h index 30930bd..706edf6 100644 --- a/include/global.h +++ b/include/global.h @@ -468,19 +468,20 @@ typedef struct UnkInputStruct8000D738 { /* 0x04 */ u16 (*unk_04)[6][0x640]; } UnkInputStruct8000D738; // size = 0x8 -typedef struct UnkStruct800AA660 { +typedef struct unk_D_800AA660 { /* 0x0000 */ OSThread thread; /* 0x01B0 */ char unk01B0[0x10]; /* 0x01C0 */ OSMesgQueue queue1; - /* 0x01D8 */ struct UnkStruct800AA660* unk_01D8; + /* 0x01D8 */ struct unk_D_800AA660* unk_01D8; /* 0x01DC */ s32 unk_01DC; /* 0x01E0 */ char unk01E0[0x2000]; /* 0x21E0 */ OSMesg mesg; /* 0x21E4 */ OSMesgQueue queue2; - /* 0x21FC */ s32 unk_21FC; - /* 0x2200 */ s32 unk_2200; + /* 0x21FC */ u8* font1; + /* 0x2200 */ u8* font2; /* 0x2204 */ UnkInputStruct8000D738 unk_2204; -} UnkStruct800AA660; // size >= 0x220C + /* 0x220C */ char unk220C[4]; +} unk_D_800AA660; // size = 0x2210 typedef struct unk_D_864027C0 { /* 0x00 */ f32 unk_00; diff --git a/include/macros.h b/include/macros.h index 959255c..740c8e3 100644 --- a/include/macros.h +++ b/include/macros.h @@ -32,6 +32,7 @@ #define SCREEN_WIDTH 320 #define SCREEN_HEIGHT 240 +#define ALIGN2(val) (((u32)(val) + 0x1) & ~0x1) #define ALIGN4(val) (((val) + 0x3) & ~0x3) #define ALIGN8(val) (((val) + 0x7) & ~0x7) #define ALIGN16(val) (((val) + 0xFu) & ~0xFu) diff --git a/include/sections.h b/include/sections.h index 127c0f8..6154938 100644 --- a/include/sections.h +++ b/include/sections.h @@ -6,6 +6,16 @@ extern u8 fragment1_TEXT_START[]; extern u8 fragment1_ROM_START[]; extern u8 fragment1_ROM_END[]; extern u8 fragment1_relocs_ROM_END[]; +extern u8 fragment1_yay0_0_ROM_START[]; +extern u8 fragment1_yay0_0_ROM_END[]; +extern u8 fragment1_yay0_1_ROM_START[]; +extern u8 fragment1_yay0_1_ROM_END[]; +extern u8 fragment1_yay0_2_ROM_START[]; +extern u8 fragment1_yay0_2_ROM_END[]; +extern u8 fragment1_yay0_3_ROM_START[]; +extern u8 fragment1_yay0_3_ROM_END[]; +extern u8 fragment1_yay0_4_ROM_START[]; +extern u8 fragment1_yay0_4_ROM_END[]; // fragment 2 extern u8 fragment2_TEXT_START[]; diff --git a/include/variables.h b/include/variables.h index 6f98531..a42298b 100644 --- a/include/variables.h +++ b/include/variables.h @@ -924,6 +924,14 @@ extern u32 D_304F120[]; extern s32 D_800FC820; extern u8* D_800FF9C0; +extern OSViMode D_800795C0; +extern u8 D_ADC80[]; +extern u8 D_F4130[]; +extern u8 D_F4920[]; +extern u8 D_F5450[]; +extern u8 D_FDE40[]; +extern u8 D_102BA0[]; + typedef struct unk_70D3A0 { /* 0x00 */ f32 unk_00; /* 0x04 */ f32 unk_04; diff --git a/linker_scripts/us/symbol_addrs_code.txt b/linker_scripts/us/symbol_addrs_code.txt index d040ccd..6d813f8 100644 --- a/linker_scripts/us/symbol_addrs_code.txt +++ b/linker_scripts/us/symbol_addrs_code.txt @@ -1600,7 +1600,7 @@ func_81206FA0 = 0x81206FA0; // type:func func_81207020 = 0x81207020; // type:func func_81207078 = 0x81207078; // type:func func_812070A0 = 0x812070A0; // type:func -func_812072B0 = 0x812072B0; // type:func +osGbSetNextBuffer = 0x812072B0; // type:func func_81207330 = 0x81207330; // type:func func_81207338 = 0x81207338; // type:func func_81207348 = 0x81207348; // type:func diff --git a/src/5580.c b/src/5580.c index 8808a82..086cc4a 100644 --- a/src/5580.c +++ b/src/5580.c @@ -160,7 +160,7 @@ void func_80004DB4(void) { } void func_80004DBC(u32 arg0) { - UnkStruct800AA660* var_s0 = D_800A62E0.unk_A10; + unk_D_800AA660* var_s0 = D_800A62E0.unk_A10; while (var_s0 != NULL) { if (D_800A62E0.unk_A38 == 0) { @@ -200,7 +200,7 @@ s32 func_80004ED0(void) { } void func_80004F08(void) { - UnkStruct800AA660* var_s0 = D_800A62E0.unk_A10; + unk_D_800AA660* var_s0 = D_800A62E0.unk_A10; while (var_s0 != NULL) { if (var_s0->unk_01DC == 0) { @@ -335,9 +335,9 @@ void func_800052B4(void) { osStartThread(&D_800A62E0.thread); } -void func_80005328(UnkStruct800AA660* arg0) { - UnkStruct800AA660* var_v1; - UnkStruct800AA660* var_a1; +void func_80005328(unk_D_800AA660* arg0) { + unk_D_800AA660* var_v1; + unk_D_800AA660* var_a1; if (D_800A62E0.unk_A10 == NULL) { D_800A62E0.unk_A10 = arg0; @@ -354,9 +354,9 @@ void func_80005328(UnkStruct800AA660* arg0) { arg0->unk_01D8 = NULL; } -void func_80005370(UnkStruct800AA660* arg0) { - UnkStruct800AA660** var_v0 = &D_800A62E0.unk_A10; - UnkStruct800AA660* var_v1 = D_800A62E0.unk_A10; +void func_80005370(unk_D_800AA660* arg0) { + unk_D_800AA660** var_v0 = &D_800A62E0.unk_A10; + unk_D_800AA660* var_v1 = D_800A62E0.unk_A10; while (var_v1 != NULL) { if (var_v1 == arg0) { diff --git a/src/5580.h b/src/5580.h index 5716f5e..e2eb350 100644 --- a/src/5580.h +++ b/src/5580.h @@ -18,7 +18,7 @@ typedef struct unk_D_800A62E0 { /* 0x9B0 */ u8 stack[64]; /* 0x9F0 */ OSMesgQueue queue; /* 0xA08 */ u64 time; - /* 0xA10 */ UnkStruct800AA660* unk_A10; + /* 0xA10 */ unk_D_800AA660* unk_A10; /* 0xA14 */ UnkStruct80001380* unk_A14; /* 0xA18 */ UnkStruct80001380* unk_A18; /* 0xA1C */ UnkStruct80001380* unk_A1C; @@ -86,10 +86,10 @@ void func_80004CC0(UnkStruct80083CA0_2*, s32, s32); s32 func_80004CF4(UnkStruct80083CA0_2*); s32 func_80004D20(UnkStruct80083CA0_2*); void func_800052B4(void); -void func_80005328(UnkStruct800AA660*); +void func_80005328(unk_D_800AA660*); void func_80004980(UnkStruct80001380* arg0); void func_800049AC(UnkStruct80001380* arg0); -void func_80005370(UnkStruct800AA660* arg0); +void func_80005370(unk_D_800AA660* arg0); void func_800053B4(UnkStruct80001380* arg0, s32 arg1); diff --git a/src/6BC0.h b/src/6BC0.h index 00bc9db..aef8679 100644 --- a/src/6BC0.h +++ b/src/6BC0.h @@ -5,12 +5,20 @@ // image size in bits typedef enum IMAGE_SIZE_BITS { - IMAGE_SIZE_BITS_4b, - IMAGE_SIZE_BITS_8b, - IMAGE_SIZE_BITS_16b, - IMAGE_SIZE_BITS_32b, + IMAGE_SIZE_BITS_4b = 0, + IMAGE_SIZE_BITS_8b = 1, + IMAGE_SIZE_BITS_16b = 2, + IMAGE_SIZE_BITS_32b = 3, } IMAGE_SIZE_BITS; +typedef enum IMAGE_FMT { + IMAGE_FMT_RGBA = 0, + IMAGE_FMT_YUV = 1, + IMAGE_FMT_CI = 2, + IMAGE_FMT_IA = 3, + IMAGE_FMT_I = 4, +} IMAGE_FMT; + typedef struct unk_D_80068BB0 { /* 0x00 */ u16 fmt; /* 0x02 */ u16 size; diff --git a/src/E1C0.c b/src/E1C0.c index d72cab6..3b69a7f 100644 --- a/src/E1C0.c +++ b/src/E1C0.c @@ -7,21 +7,15 @@ #include "3FB0.h" #include "5580.h" #include "util.h" -#include "src/gb_tower.h" #include "src/fragments/1/fragment1.h" -struct UnkStruct800AA664 { - /* 0x0000 */ OSThread thread; - char padding1B0[0x2030]; -}; - -extern UnkStruct800AA660* D_800AA660; -extern struct UnkStruct800AA664* D_800AA664; +extern unk_D_800AA660* D_800AA660; +extern unk_D_800AA664* D_800AA664; extern char D_800AA668; extern u8 D_81200000[]; -void func_8000D5C0(void* unused) { +void func_8000D5C0(UNUSED void* arg0) { void (*func)(void*) = Util_ConvertAddrToVirtAddr(&func_81206F38); __osSetFpcCsr(0x01000C01); @@ -37,7 +31,7 @@ void func_8000D5C0(void* unused) { } } -void func_8000D678(void* unused) { +void func_8000D678(UNUSED void* arg0) { void (*func1)(void* func) = Util_ConvertAddrToVirtAddr(&func_81206D9C); void (*func2)(void* func) = Util_ConvertAddrToVirtAddr(&func_81206E64); @@ -45,7 +39,7 @@ void func_8000D678(void* unused) { func_80004CC0(D_800AA660, 0, 1); func_80005328(D_800AA660); func1(D_800AA660); - osStartThread(D_800AA664); + osStartThread(&D_800AA664->thread); while (1) { func_80004CF4(D_800AA660); @@ -66,8 +60,8 @@ void func_8000D738(UnkInputStruct8000D738* arg0) { FRAGMENT_LOAD(fragment1); temp_v0 = ASSET_LOAD2(fonts, 1, 1); - D_800AA660->unk_21FC = func_8000484C(temp_v0, 0); - D_800AA660->unk_2200 = func_8000484C(temp_v0, 1); + D_800AA660->font1 = func_8000484C(temp_v0, 0); + D_800AA660->font2 = func_8000484C(temp_v0, 1); D_800AA660->unk_2204 = *arg0; osCreateMesgQueue(&D_800AA660->queue2, &D_800AA660->mesg, 1); osCreateThread(&D_800AA664->thread, 10, func_8000D5C0, NULL, (u32)D_800AA664 + 0x21E0, 0x11); diff --git a/src/E1C0.h b/src/E1C0.h index 300615a..67cdabc 100644 --- a/src/E1C0.h +++ b/src/E1C0.h @@ -3,6 +3,11 @@ #include "global.h" +typedef struct unk_D_800AA664 { + /* 0x0000 */ OSThread thread; + /* 0x01B0 */ char unk01B0[0x2030]; +} unk_D_800AA664; // size = 0x21E0 + void func_8000D738(UnkInputStruct8000D738* arg0); OSMesg* func_8000D8A8(void); void func_8000D8DC(UnkInputStruct8000D738* arg0); diff --git a/src/fragments/1/fragment1.h b/src/fragments/1/fragment1.h index ada3280..66d2b1e 100644 --- a/src/fragments/1/fragment1.h +++ b/src/fragments/1/fragment1.h @@ -2,9 +2,12 @@ #define _FRAGMENT1_H_ #include "global.h" +#include "src/E1C0.h" -void func_81206D9C(void); -void func_81206E64(void); -void func_81206F38(void); +void func_81206D9C(unk_D_800AA660*); +void func_81206E64(unk_D_800AA660*); +void func_81206F38(unk_D_800AA664*); +void func_81209078(); +s32 osGbSetNextBuffer(void*, s32); #endif /* _FRAGMENT1_H_ */ diff --git a/src/fragments/1/fragment1_7F9A0.c b/src/fragments/1/fragment1_7F9A0.c index 833c134..c2aac2d 100644 --- a/src/fragments/1/fragment1_7F9A0.c +++ b/src/fragments/1/fragment1_7F9A0.c @@ -1,24 +1,257 @@ #include "global.h" +#include "fragment1.h" +#include "src/29BA0.h" +#include "src/3FB0.h" +#include "src/5580.h" +#include "src/6BC0.h" +#include "src/controller.h" +#include "src/memory.h" +#include "include/variables.h" -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81200020.s") +typedef struct unk_D_8122C4FA { + /* 0x00 */ u8 unk_00; + /* 0x01 */ u8 unk_01; +} unk_D_8122C4FA; // size >= 0x2 -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81200078.s") +typedef struct unk_D_8122B2F8 { + /* 0x000000 */ char unk000000[0x1FEAE8]; +} unk_D_8122B2F8; // size = 0x1FEAE8 -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812000DC.s") +// 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 -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_8120019C.s") +typedef struct unk_D_8122B1E8 { + /* 0x00 */ OSMesg mesg[1]; + /* 0x04 */ OSMesgQueue queue; + /* 0x1C */ char unk1C[0x4]; + /* 0x20 */ s32 unk_20; + /* 0x24 */ s32 unk_24; + /* 0x28 */ char unk28[0x40]; +} unk_D_8122B1E8; // size = 0x68 -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812001E4.s") +extern unk_D_80068BB0* D_8122B1E0[2]; +extern unk_D_8122B1E8 D_8122B1E8[2]; +extern s32 D_8122B2B8; +extern unk_D_8122B2C0* D_8122B2C0; +extern unk_D_8122B2F8* D_8122B2C8[3]; +extern unk_D_80068BB0* D_8122B2D8[2]; +extern void* D_8122B2EC; +extern s32 D_8122B2F0; +extern u8* D_8122B2F4; +extern unk_D_8122B2F8* D_8122B2F8; +extern s32 D_8122B2FC; +extern OSThread D_8122B300; +extern OSMesg D_8122C4B0[4]; +extern OSMesgQueue D_8122C4C0; +extern OSMesgQueue* D_8122C4D8; +extern s32 D_8122C4DC; +extern u8 D_8122C4E0; +extern u8 D_8122C4E2; +extern u8 D_8122C4E3; +extern u8 D_8122C4E4; +extern u8 D_8122C4E5; +extern u8 D_8122C4E8; +extern u16 D_8122C4F2; +extern u16 D_8122C4F4; +extern unk_D_8122C4FA D_8122C4FA; +extern u8 D_8122C4FC; +extern u8 D_8122C500[0x1F]; +// extern s8 D_8122C51F; +extern u8 D_8122C520[0x20]; +extern u8* D_8122C740; +extern u8* D_8122C744; +extern void* D_8122C748; +extern s32 D_8122C74C; +extern u8* D_8122C754; +extern u8* D_8122C758[2]; +extern u32 D_8122C760; +extern u32 D_8122C76C; -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812002BC.s") +s32 func_81200020(unk_D_8122B2C0* arg0) { + s32 result; -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81200358.s") + result = osGbpakCheckConnector(&arg0->pfs, &arg0->status); + if ((result == 0) && ((arg0->status & 9) != 9)) { + return 0x63; + } + return result; +} +s32 func_81200078(unk_D_8122B2C0* arg0, u16 arg1, s32 arg2) { + s32 i; + for (i = 0x1F; i >= 0; i--) { + D_8122C500[i] = arg2; + } + return osGbpakReadWrite(&arg0->pfs, 1, arg1, &D_8122C500, 0x20); +} + +s32 func_812000DC(unk_D_8122B2C0* arg0) { + s32 ret; + + if (!(ret = func_81200078(arg0, 0, 0xA)) && !(ret = func_81200078(arg0, 0x6000, 1)) + && !(ret = func_81200078(arg0, 0x4000, 0)) && !(ret = func_81200078(arg0, 0x6000, 0)) + && !(ret = func_81200078(arg0, 0x4000, 0)) && !(ret = func_81200078(arg0, 0x2100, 1))) { + arg0->unk_5DA2 = 1; + arg0->unk_5DCE = 0; + arg0->unk_5DCF = 0; + } + + return ret; +} + +s32 func_8120019C(unk_D_8122B2C0* arg0) { + s32 ret; + + ret = osGbpakGetStatus(&arg0->pfs, &arg0->status); + if (ret == 0) { + ret = (arg0->status & 0xC0) ^ 0x80; + } + return ret; +} + +s32 func_812001E4(unk_D_8122B2C0* arg0, s32 arg1) { + s32 temp_a2; + s32 var_v1; + + var_v1 = 0; + arg0->unk_5DCE = 0xFF; + if (arg0->unk_5DCF != 0) { + arg0->unk_5DA2 = 0xFFFFU; + var_v1 = func_81200078(arg0, 0x6000, 0); + if (var_v1 == 0) { + arg0->unk_5DCF = 0U; + } + } + if (var_v1 == 0) { + if (arg1 != arg0->unk_5DA2) { + temp_a2 = arg1 / 32; + if (temp_a2 != ((s32) arg0->unk_5DA2 / 32)) { + arg0->unk_5DA2 = 0xFFFEU; + var_v1 = func_81200078(arg0, 0x4000, temp_a2); + } + if (var_v1 == 0) { + arg0->unk_5DA2 = 0xFFFDU; + var_v1 = func_81200078(arg0, 0x2100, arg1); + if (var_v1 == 0) { + arg0->unk_5DA2 = (u16) arg1; + } + } + } + } + return var_v1; +} + +s32 func_812002BC(unk_D_8122B2C0* arg0, s32 arg1) { + s32 var_v1; + + var_v1 = 0; + arg0->unk_5DA2 = 0xFFFF; + if (arg0->unk_5DCF != 1) { + arg0->unk_5DCE = 0xFFU; + var_v1 = func_81200078(arg0, 0x6000, 1); + if (var_v1 == 0) { + arg0->unk_5DCF = 1U; + } + } + if ((var_v1 == 0) && (arg1 != arg0->unk_5DCE)) { + var_v1 = func_81200078(arg0, 0x4000, arg1); + if (var_v1 == 0) { + arg0->unk_5DCE = arg1; + } + } + return var_v1; +} + +s32 func_81200358(unk_D_8122B2C0* arg0) { + s32 ret; + + ret = func_812002BC(arg0, arg0->unk_5DA0 / 8192); + if (ret == 0) { + ret = osGbpakReadWrite(&arg0->pfs, 0, ((arg0->unk_5DA0 & 0x1FFF) | 0xA000), D_8122C520, sizeof(D_8122C520)); + if (ret == 0) { + ret = bcmp(D_8122C520, &arg0->unk_5D80, sizeof(D_8122C520)); + } + } + return ret; +} + +void func_812003EC(unk_D_8122B2C0*, s32); #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812003EC.s") +s32 func_812004B8(unk_D_8122B2C0*); #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812004B8.s") -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812005D8.s") +s32 func_812005D8(unk_D_8122B2C0* arg0) { + s32 ret; + + ret = 0; + if (!(arg0->status & 1)) { + ret = func_81200020(arg0); + if (ret == 0) { + ret = func_812000DC(arg0); + if (ret == 0) { + ret = osGbpakReadId(&arg0->pfs, &arg0->gbpakId, &arg0->status); + if (ret == 0) { + ret = bcmp(arg0->unk_5C5C, &arg0->gbpakId, sizeof(arg0->unk_5C5C)); + if ((ret == 0) && (arg0->unk_5DC4 != 0)) { + arg0->unk_5DC4 = 0U; + ret = func_81200358(arg0); + if (ret == 0) { + ret = func_812004B8(arg0); + } + arg0->unk_5DC4 = 1U; + } + } + } + } + } + if (ret != 0) { + arg0->status = (u8) (arg0->status & 0xFFFE); + } + return ret; +} #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812006AC.s") @@ -30,14 +263,23 @@ #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812011D0.s") -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81201560.s") +s32 func_81201560(s32 arg0, s32 arg1) { + return (arg1 & 1) ? arg1 : arg0; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_8120157C.s") +s32 func_8120157C(s32 arg0, s32 arg1) { + return (arg1 & 1) ? arg0 : arg1; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81201598.s") +s32 func_81201598(s32 arg0, s32 arg1) { + return (((s32) ((arg0 & 0xF800) + (arg1 & 0xF800)) >> 1) & 0xF800) | (((s32) ((arg0 & 0x7C0) + (arg1 & 0x7C0)) >> 1) & 0x7C0) | (((s32) ((arg0 & 0x3E) + (arg1 & 0x3E)) >> 1) & 0x3E); +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812015E0.s") +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") #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812016DC.s") @@ -68,20 +310,78 @@ #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_8120334C.s") +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); +void func_81208D7C(void); +void func_81208E28(unk_D_8122B2F8*); +void func_81208F94(void); +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); #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81203C58.s") -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81203E30.s") +void func_81203E30(void) { + if ((D_8122C4FA.unk_01 == D_8122C4FA.unk_00) || (D_8122C4FA.unk_00 >= 5) || (D_8122C4FA.unk_01 >= 5)) { + D_8122C4FA.unk_00 = 0; + D_8122C4FA.unk_01 = 1; + } + + D_8122C4F2 = (D_8122C4FA.unk_00 == 1) ? 0x20 : (D_8122C4FA.unk_00 == 2) ? 0x10 : (D_8122C4FA.unk_00 == 3) ? 2 : (D_8122C4FA.unk_00 == 4) ? 4 : 0x1000; + 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; +} #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81203F3C.s") +void func_81204A84(s32 arg0); #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81204A84.s") +s32 func_8120572C(s32); #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_8120572C.s") -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81206D9C.s") +void func_81206D9C(unk_D_800AA660* arg0) { + D_8122C4FC = 0; + D_8122C4E2 = arg0->unk_2204.unk_02; + if ((D_8122C4E2 < 0) || (D_8122C4E2 >= 3)) { + D_8122C4E2 = 0; + } + D_8122C4FA.unk_00 = ((arg0->unk_2204.unk_00 & 0xFF00) >> 8); + D_8122C4FA.unk_01 = (arg0->unk_2204.unk_00 + 1) & 0xFF; + func_81203E30(); + D_8122C740 = arg0->font1 + 0x90; + D_8122C744 = arg0->font2 + 0x90; + func_812033F4(0, func_80029080(), 5, 0x50, &gSIEventMesgQueue, arg0->unk_2204.unk_04); +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81206E64.s") +void func_81206E64(unk_D_800AA660* arg0) { + if (func_8120572C(0) != 0) { + arg0->unk_2204.unk_00 = ((D_8122C4FA.unk_01 - 1) & 0xFF) | (D_8122C4FA.unk_00 << 8); + IO_WRITE(SP_STATUS_REG, 0x8000); + osSendMesg(&arg0->queue2, D_8122B2FC, 0); + } -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_81206F38.s") + if (D_8122C4FC == 0) { + if ((D_8122C4DC == 0) || (D_8122C4DC == 6)) { + func_81209078(); + } + } else if (D_8122C4FC == 1) { + D_8122C4FC = 2; + } else if (D_8122C4FC == 3) { + D_8122C4FC = 0; + } +} + +void func_81206F38(UNUSED unk_D_800AA664* arg0) { + if ((D_800A62E0.unk_A38 == 0) && (D_8122C4FC == 2) && ((D_8122C4DC == 0) || (D_8122C4DC == 6))) { + func_81209078(); + } +} diff --git a/src/fragments/1/fragment1_86920.c b/src/fragments/1/fragment1_86920.c index 63b3437..e006ac6 100644 --- a/src/fragments/1/fragment1_86920.c +++ b/src/fragments/1/fragment1_86920.c @@ -1,9 +1,53 @@ #include "global.h" -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86920/func_81206FA0.s") +typedef struct unk_func_81206FA0 { + /* 0x00 */ s32 unk_00; + /* 0x04 */ s32 unk_04; + /* 0x08 */ s32 unk_08; + /* 0x0C */ s32 unk_0C; +} unk_func_81206FA0; // size = 0x10 -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86920/func_81207020.s") +u32 func_81206FA0(unk_func_81206FA0* arg0, s32 arg1) { + s32 temp_v0; + u32 temp_a2; + u32 var_a1; + temp_v0 = ALIGN16(arg1); + temp_a2 = arg0->unk_04; + if ((arg0->unk_00 + arg0->unk_08) >= (temp_a2 + temp_v0)) { + arg0->unk_04 += temp_v0; + var_a1 = temp_a2; + while (var_a1 < arg0->unk_04) { + *((u8*)var_a1++) = 0; + } + } else { + return 0; + } + arg0->unk_0C++; + return temp_a2; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86920/func_81207078.s") +s32 func_81207020(unk_func_81206FA0* arg0, s32 arg1) { + s32 temp_a2; + u32 temp_v0; + + temp_v0 = ALIGN16(arg1); + temp_a2 = arg0->unk_04; + if ((arg0->unk_00 + arg0->unk_08) >= (arg0->unk_04 + temp_v0)) { + arg0->unk_04 = temp_v0 + temp_a2; + } else { + return 0; + } + arg0->unk_0C++; + return temp_a2; +} + + +void func_81207078(unk_func_81206FA0* arg0, s32 arg1, s32 arg2) { + + arg0->unk_00 = ALIGN16(arg1); + arg0->unk_04 = ALIGN16(arg1); + arg0->unk_08 = (s32) (arg2 - (arg1 & 0xF)); + arg0->unk_0C = 0; +} #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86920/func_812070A0.s") diff --git a/src/fragments/1/fragment1_86C30.c b/src/fragments/1/fragment1_86C30.c index f38cf37..6cd4b9f 100644 --- a/src/fragments/1/fragment1_86C30.c +++ b/src/fragments/1/fragment1_86C30.c @@ -1,3 +1,55 @@ #include "global.h" -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86C30/func_812072B0.s") +#ifdef NON_MATCHING +s32 osGbSetNextBuffer(void* bufPtr, u32 size) { + static u8 hdwrBugFlag = FALSE; + char* bptr; + s32 status; + +#if BUILD_VERSION >= VERSION_J + if (__osAiDeviceBusy()) { + return -1; + } +#endif + +#ifdef _DEBUG + if ((u32)bufPtr & (8 - 1)) { + __osError(ERR_OSAISETNEXTBUFFER_ADDR, 1, bufPtr); + return -1; + } + + if ((u32)size & (8 - 1)) { + __osError(ERR_OSAISETNEXTBUFFER_SIZE, 1, size); + return -1; + } +#endif + + bptr = bufPtr; + + if (hdwrBugFlag) { + bptr = (u8*)bufPtr - 0x2000; + } + + if ((((u32)bufPtr + size) & 0x1fff) == 0) { + hdwrBugFlag = TRUE; + } else { + hdwrBugFlag = FALSE; + } + +#if BUILD_VERSION < VERSION_J + status = IO_READ(AI_STATUS_REG); + //! @bug The __osAiDeviceBusy call should be above the hardware bug workaround to ensure that it was only + //! performed when a transfer was guaranteed to start. If this condition passes and this function returns without + //! submitting a buffer for DMA, the code above will lose track of when to apply the workaround. + if (status & AI_STATUS_FIFO_FULL) { + return -1; + } +#endif + + IO_WRITE(AI_DRAM_ADDR_REG, OS_PHYSICAL_TO_K0(bptr)); + IO_WRITE(AI_LEN_REG, size); + return 0; +} +#else +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86C30/osGbSetNextBuffer.s") +#endif diff --git a/src/fragments/1/fragment1_86CB0.c b/src/fragments/1/fragment1_86CB0.c index cda63b3..42e3592 100644 --- a/src/fragments/1/fragment1_86CB0.c +++ b/src/fragments/1/fragment1_86CB0.c @@ -1,20 +1,80 @@ #include "global.h" +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]; +} unk_func_81208D7C; // size = 0x50 + +typedef struct unk_D_8122EEA8 { + /* 0x00 */ u8 unk_00; + /* 0x01 */ u8 unk_01; + /* 0x02 */ u8 unk_02; + /* 0x03 */ u8 unk_03; +} unk_D_8122EEA8; // size = 0x4 + +extern u8 D_811FEB60[]; +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 s32 D_8120EB78; +extern s32 D_8120EB7C; +extern f32 D_8122B0A0; +extern f32 D_8122B0A4; +extern s32 D_8122C794; + +extern unk_func_81208D7C D_8122C798; +extern unk_func_81208D7C D_8122C7E8; +extern unk_func_81208D7C D_8122C838; +extern unk_func_81208D7C D_8122C888; +extern unk_D_8122EEA8 D_8122EEA8; + +extern OSMesgQueue D_8122EEB0; +extern OSMesg D_8122EEC8; + void func_81207330(void) { } -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81207338.s") +void func_81207338(void) { + D_8120EA60 = 1; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81207348.s") +void func_81207348(void) { + D_8120EA60 = 0; +} void func_81207354(void) { } -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_8120735C.s") +void func_8120735C(s32 arg0) { + if (arg0 == 0) { + D_8120EAC4 = 0x4578; + D_8120EAC0 = D_8122B0A0; + return; + } + D_8120EAC4 = 0x8AF0; + D_8120EAC0 = D_8122B0A4; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_812073A4.s") +void func_812073A4(s32 arg0, s32 arg1) { + D_8120EAC8 = arg0; + D_8120EACC = arg1; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_812073B8.s") +u32 func_812073B8(u16 arg0) { + u32 temp; + if (arg0 == 0) { + return 0; + } + temp = ((65536.0f / (0x800 - arg0)) / D_8120EAC0) * 65536; + return temp; +} #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81207494.s") @@ -33,31 +93,91 @@ void func_81207690(void) { #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81207DF8.s") +void func_8120806C(u16, u8); #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_8120806C.s") #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81208828.s") #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81208C08.s") -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81208D7C.s") +void func_81208D7C(void) { + s32 pad[6]; + s32 i; + OSMesgQueue sp24; + OSMesg sp20; -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81208E28.s") + osCreateMesgQueue(&sp24, &sp20, 1); + osCreateMesgQueue(&D_8122EEB0, &D_8122EEC8, 0x960); + for (i = 0x50; i > 0xF; i--) { + func_8120806C(i, 0); + } + D_8122C798.unk_3C = 0; + 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; +} + +void func_81208E28(s32 arg0) { + D_8122C794 = arg0; + func_81208D7C(); +} #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81208E4C.s") void func_81208F94(void) { } -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81208F9C.s") +u8 func_81208F9C(u16 arg0) { + u8 var_a0; + u8 var_a1; + u8 var_a2; + u8 var_v1; + u8 temp; + if ((arg0 & 0xFFFF) == 0xFF26) { + if (D_8122EEA8.unk_00 != 0) { + var_v1 = (D_8122EEA8.unk_00 - 1) & 0xFF; + } else { + var_v1 = D_8122C798.unk_00; + } + if (D_8122EEA8.unk_01 != 0) { + var_a0 = (D_8122EEA8.unk_01 - 1) & 0xFF; + } else { + var_a0 = D_8122C7E8.unk_00; + } + if (D_8122EEA8.unk_02 != 0) { + var_a1 = (D_8122EEA8.unk_02 - 1) & 0xFF; + } else { + var_a1 = D_8122C838.unk_00; + } + if (D_8122EEA8.unk_03 != 0) { + var_a2 = (D_8122EEA8.unk_03 - 1) & 0xFF; + } else { + var_a2 = D_8122C888.unk_00; + } + temp = ((((u32)D_8120EA86 >> 0xF) << 7) | (var_a2 * 8) | (var_a1 * 4) | (var_a0 * 2) | var_v1); + return temp; + } + return D_811FEB60[arg0 & 0xFFFF]; +} #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81209078.s") -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_8120935C.s") +void func_8120935C(s32 arg0) { + D_8120EB78 = arg0; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81209368.s") +void func_81209368(s32 arg0) { + D_8120EB7C = arg0; +} #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81209374.s") -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81209688.s") +void func_81209688(UNUSED s32 arg0) { +} +// Decrypting this function causes issues #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81209690.s") diff --git a/yamls/us/rom.yaml b/yamls/us/rom.yaml index fbb70b4..1888b6e 100644 --- a/yamls/us/rom.yaml +++ b/yamls/us/rom.yaml @@ -51,7 +51,7 @@ - [0xCE80, c] # - [0xD470, c] # - [0xDDC0, c] - - [0xE1C0, c] + - [0xE1C0, c] # load gb emulator (fragment 1) - [0xE570, c, gb_mbc] # gameboy memory bank controller - [0xE890, c] # - [0xF420, c] #