From d6e7b7b9ada78ed1f6fcd02e9b3d5a41216ff468 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Wed, 5 Aug 2026 13:46:37 -0500 Subject: [PATCH] Match fragment1 functions `osGbSetNextBuffer`, `func_81208C08`, `func_81207A60`, `func_81207774`, `func_812006AC` --- linker_scripts/us/symbol_addrs.txt | 1 + src/fragments/1/fragment1_7F9A0.c | 101 ++++++++++++- src/fragments/1/fragment1_86C30.c | 4 - src/fragments/1/fragment1_86CB0.c | 231 ++++++++++++++++++++++++++++- yamls/us/rom.yaml | 2 + 5 files changed, 329 insertions(+), 10 deletions(-) diff --git a/linker_scripts/us/symbol_addrs.txt b/linker_scripts/us/symbol_addrs.txt index 880c96f..00f59f6 100644 --- a/linker_scripts/us/symbol_addrs.txt +++ b/linker_scripts/us/symbol_addrs.txt @@ -71,6 +71,7 @@ gSIEventMesgBuf = 0x800A73F8; gEepromMesgQueue = 0x800A7400; gEepromMesgBuf = 0x800A73FC; .L8120A860 = 0x8120A860; +hdwrBugFlag = 0x8120EA50; // defined:true size:0x4 D_8780FA30 = 0x8780FA30; // size:0x8 miniShowHUB = 0x87906044; D_87906048 = 0x87906048; diff --git a/src/fragments/1/fragment1_7F9A0.c b/src/fragments/1/fragment1_7F9A0.c index 45518a9..a96aa9c 100644 --- a/src/fragments/1/fragment1_7F9A0.c +++ b/src/fragments/1/fragment1_7F9A0.c @@ -278,8 +278,84 @@ 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") +s32 func_812006AC(unk_D_8122B2C0* arg0) { + s32 var_s1 = 0; + s32 var_s2; + s32 var_s2_2; + s32 var_s4; + s32 var_v1; + u32 var_s3; + u8* var_s0; + u32 offset; + s32 i; + u32 temp; + var_v1 = func_812005D8(arg0); + var_s0 = arg0->transferBuffer; + var_s3 = arg0->gbAddress; + var_s4 = arg0->transferSize; + + if (var_v1 == 0 && var_s3 < 0x4000U) { + temp = var_s3; + temp += var_s4; + if (temp >= 0x4001U) { + var_s2 = 0x4000 - var_s3; + } else { + var_s2 = var_s4; + } + + var_v1 = osGbpakReadWrite(&arg0->pfs, 0, var_s3, var_s0, var_s2); + + if (var_v1 == 0) { + var_v1 = var_s2; + + while (var_v1 != 0) { + var_s1 += *var_s0; + var_s0++; + var_v1--; + } + var_s4 -= var_s2; + var_s3 = 0x4000; + } + } + + while (var_v1 == 0 && var_s4 != 0) { + var_v1 = func_812001E4(arg0, var_s3 >> 14); + if (var_v1 == 0) { + offset = var_s3 & 0x3FFF; + temp = offset; + temp += var_s4; + if (temp >= 0x4001U) { + var_s2_2 = 0x4000 - offset; + } else { + var_s2_2 = var_s4; + } + + var_v1 = osGbpakReadWrite(&arg0->pfs, 0, (offset | 0x4000), var_s0, var_s2_2); + + if (var_v1 == 0) { + var_v1 = var_s2_2; + + while (var_v1 != 0) { + var_s1 += *var_s0; + var_s0++; + var_v1--; + } + + var_s4 -= var_s2_2; + var_s3 = (var_s3 + 0x4000) & ~0x3FFF; + } + } + } + + if (var_v1 == 0) { + var_v1 = func_8120019C(arg0); + if (var_v1 == 0) { + arg0->unk_5D70[0] += var_s1; + } + } + + return var_v1; +} s32 func_812008C8(unk_D_8122B2C0* arg0, s32 arg1) { s32 temp_v0; @@ -384,7 +460,26 @@ void func_812015EC(u16* dst, u16* src, s32 mode, s32 width, s32 height) { #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812016DC.s") +#ifdef NON_MATCHING +void func_812018C0(u16* arg0, s32 arg1, u16* arg2, s32 arg3, s32 arg4) { + s32 r = arg1 & 0xF800; + s32 g = arg1 & 0x7C0; + s32 b = arg1 & 0x3E; + s32 x; + s32 y; + + for (y = 0; y < arg4; y++) { + u16* dst = &arg0[y * 160]; + u16* src = &arg2[y * arg3]; + for (x = 0; x < arg3; x++) { + s32 intensity = (s32) (src[x] & 0x3E) >> 1; + dst[x] = (((r * intensity) / 31) & 0xF800) | (((g * intensity) / 31) & 0x7C0) | (((b * intensity) / 31) & 0x3E); + } + } +} +#else #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_7F9A0/func_812018C0.s") +#endif #ifdef NON_MATCHING void func_81201DDC(u16* dst, u8* alpha_map, s32 color, s32 width, s32 height, u32 alpha_stride) { @@ -532,7 +627,7 @@ void func_8120241C(void); void func_812029B0(u8*, u16 (*)[6][0x640], s32, s32); void func_812070A0(void); void func_8120735C(s32); -void func_81208C08(s32, s32, s32); +void func_81208C08(u16, u8, u16); void func_81208D7C(void); void func_81208E28(unk_D_8122B2F8*); void func_81208F94(void); diff --git a/src/fragments/1/fragment1_86C30.c b/src/fragments/1/fragment1_86C30.c index 6cd4b9f..e4f8989 100644 --- a/src/fragments/1/fragment1_86C30.c +++ b/src/fragments/1/fragment1_86C30.c @@ -1,6 +1,5 @@ #include "global.h" -#ifdef NON_MATCHING s32 osGbSetNextBuffer(void* bufPtr, u32 size) { static u8 hdwrBugFlag = FALSE; char* bptr; @@ -50,6 +49,3 @@ s32 osGbSetNextBuffer(void* bufPtr, u32 size) { 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 e06350e..8040b93 100644 --- a/src/fragments/1/fragment1_86CB0.c +++ b/src/fragments/1/fragment1_86CB0.c @@ -22,7 +22,13 @@ typedef struct unk_func_81208D7C { /* 0x2C */ char unk2C[0x1]; /* 0x2D */ u8 unk_2D; /* 0x2E */ u8 unk_2E; - /* 0x2F */ char unk2F[0xD]; + /* 0x2F */ char unk2F[0x1]; + /* 0x30 */ u32 unk_30; + /* 0x34 */ u32 unk_34; + /* 0x38 */ u8 unk_38; + /* 0x39 */ u8 unk_39; + /* 0x3A */ u8 unk_3A; + /* 0x3B */ u8 unk_3B; /* 0x3C */ u8 unk_3C; /* 0x3D */ char unk3D[0x3]; /* 0x40 */ u32 unk_40; @@ -51,6 +57,8 @@ extern s32 D_8120EACC; extern s32 D_8120EAC4; extern s32 D_8120EA60; extern u32 D_8120EA80; +extern s32 D_8120EAD0; +extern u8 D_8120EB14[]; extern s32 D_8120EB78; extern s32 D_8120EB7C; @@ -162,9 +170,168 @@ s32 func_81207698(u32, s32); #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81207698.s") #endif -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81207774.s") +u16 func_81207774(void) { + u16 var_t0; -#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81207A60.s") + if (D_8122C798.unk_00 == 0) { + if (D_8122C798.unk_3C == 0) { + return 0U; + } + D_8122C798.unk_3C--; + D_8122C798.unk_20 = D_8122C798.unk_3C; + D_8122C798.unk_0C = (s32) D_8122C798.unk_40; + } + if ((s32) D_8122C798.unk_10 <= 0) { + D_8122C798.unk_4C = 1U; + } else if (((s32) D_8122C798.unk_10 >= 0x7FF) && (D_8122C798.unk_39 == 0)) { + D_8122C798.unk_4C = 1U; + } else { + D_8122C798.unk_4C = 0U; + } + { + s32 temp_v0 = func_81207698(D_8122C798.unk_3B, D_8122C798.unk_08.unk_00); + D_8122C798.unk_08.unk_02 += D_8122C798.unk_0C; + D_8122C798.unk_08.unk_02 &= 0x1FFFFF; + if (D_8122C798.unk_4C == 1) { + if (D_8122C798.unk_3C != 0) { + D_8122C798.unk_3C--; + } + var_t0 = ((temp_v0 & 0xFFFF) * D_8122C798.unk_3C); + } else { + D_8122C798.unk_40 = (s32) D_8122C798.unk_0C; + D_8122C798.unk_3C = (u8) D_8122C798.unk_20; + var_t0 = ((temp_v0 & 0xFFFF) * D_8122C798.unk_20); + } + } + if ((D_8122C798.unk_3A != 0) && (((++D_8122C798.unk_30 % (u32) D_8122C798.unk_34) == 0))) { + s32 temp_a2 = ((s32) D_8122C798.unk_10 >> D_8122C798.unk_38) & 0xFFFF; + switch (D_8122C798.unk_39) { + case 0: + D_8122C798.unk_10 += temp_a2; + break; + case 1: + D_8122C798.unk_10 = (D_8122C798.unk_10 - temp_a2) - 1;; + break; + } + if (D_8122C798.unk_10 <= 0) { + D_8122C798.unk_00 = 0U; + return var_t0; + } else { + if ((D_8122C798.unk_10 >= 0x800) && (D_8122C798.unk_39 == 0)) { + D_8122C798.unk_10 = 0x7FFU; + D_8122C798.unk_00 = 0U; + } + D_8122C798.unk_0C = func_812075C0(D_8122C798.unk_10); + } + } + if (D_8122C798.unk_28 != 0) { + D_8122C798.unk_24++; + if ((D_8122C798.unk_24 % (u32) D_8122C798.unk_28) == 0) { + switch (D_8122C798.unk_2E) { + case 0: + if (D_8122C798.unk_2D != 0) { + D_8122C798.unk_2D--; + } + if (!D_8122C798.unk_2D) { + D_8122C798.unk_00 = 0; + } + break; + + case 1: + if (D_8122C798.unk_2D < 0xF) { + D_8122C798.unk_2D++; + } + break; + + default: + break; + } + D_8122C798.unk_20 = D_8120EB14[D_8122C798.unk_2D]; + } + } else { + D_8122C798.unk_20 = D_8120EB14[D_8122C798.unk_2D]; + } + if (D_8122C798.unk_18 == 1U) { + if (D_8122C798.unk_14 != 0) { + D_8122C798.unk_14--; + } + if (D_8122C798.unk_14 == 0) { + D_8122C798.unk_00 = 0U; + } + } + return var_t0; +} + +s32 func_81207A60(void) { + s32 temp_v0; + s32 var_a3; + u8 var_v0; + + if (D_8122C7E8.unk_00 == 0) { + if (D_8122C7E8.unk_3C == 0) { + return 0; + } + D_8122C7E8.unk_3C--; + D_8122C7E8.unk_20 = D_8122C7E8.unk_3C; + D_8122C7E8.unk_0C = (s32) D_8122C7E8.unk_40; + } + if ((s32) D_8122C7E8.unk_10 >= 0x7FF) { + D_8122C7E8.unk_4C = 1U; + } else { + D_8122C7E8.unk_4C = 0U; + } + temp_v0 = func_81207698(D_8122C7E8.unk_3B, D_8122C7E8.unk_08.unk_00); + D_8122C7E8.unk_08.unk_02 += D_8122C7E8.unk_0C; + D_8122C7E8.unk_08.unk_02 &= 0x1FFFFF; + if (D_8122C7E8.unk_4C == 1) { + if (D_8122C7E8.unk_3C != 0) { + D_8122C7E8.unk_3C--; + } + var_a3 = ((temp_v0 & 0xFFFF) * D_8122C7E8.unk_3C) & 0xFFFF; + } else { + if (D_8122C7E8.unk_20 != D_8122C7E8.unk_3C) { + D_8122C7E8.unk_3C = (u8) D_8122C7E8.unk_20; + } + D_8122C7E8.unk_40 = (s32) D_8122C7E8.unk_0C; + var_a3 = ((temp_v0 & 0xFFFF) * D_8122C7E8.unk_20) & 0xFFFF; + } + if (D_8122C7E8.unk_28 != 0) { + D_8122C7E8.unk_24++; + if ((D_8122C7E8.unk_24 % (u32) D_8122C7E8.unk_28) == 0) { + switch (D_8122C7E8.unk_2E) { + case 0: + if (D_8122C7E8.unk_2D != 0) { + D_8122C7E8.unk_2D--; + } + if (!D_8122C7E8.unk_2D) { + D_8122C7E8.unk_00 = 0; + } + break; + + case 1: + if (D_8122C7E8.unk_2D < 0xF) { + D_8122C7E8.unk_2D++; + } + break; + + default: + break; + } + D_8122C7E8.unk_20 = D_8120EB14[D_8122C7E8.unk_2D]; + } + } else { + D_8122C7E8.unk_20 = D_8120EB14[D_8122C7E8.unk_2D]; + } + if (D_8122C7E8.unk_18 == 1U) { + if (D_8122C7E8.unk_14 != 0) { + D_8122C7E8.unk_14--; + } + if (D_8122C7E8.unk_14 == 0) { + D_8122C7E8.unk_00 = 0U; + } + } + return var_a3; +} u16 func_81207C5C(void) { u16 temp_v0; @@ -319,7 +486,65 @@ void func_8120806C(u16, u8); #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81208828.s") +#ifdef NON_MATCHING +// Matching needs rodata mapping +void func_81208C08(u16 arg0, u8 arg1, u16 arg2) { + s32 temp_v1; + + temp_v1 = arg0 + 0xFFFF0100; + osSendMesg(&D_8122EEB0, (temp_v1 << 0x18) | (arg1 << 0x10) | arg2, 0); + D_8120EAD0 = (s32) arg2; + switch (temp_v1) { + case 20: + if (arg1 & 0x80) { + D_8122EEA8.unk_00 = 2; + return; + } + default: + return; + case 25: + if (arg1 & 0x80) { + D_8122EEA8.unk_01 = 2; + return; + } + break; + case 30: + if (arg1 & 0x80) { + D_8122EEA8.unk_02 = 2; + return; + } + break; + case 35: + if (arg1 & 0x80) { + D_8122EEA8.unk_03 = 2; + return; + } + break; + case 38: + if (!(arg1 & 1)) { + D_8122EEA8.unk_00 = 1; + } + if (!(arg1 & 2)) { + D_8122EEA8.unk_01 = 1; + } + if (!(arg1 & 4)) { + D_8122EEA8.unk_02 = 1; + } + if (!(arg1 & 8)) { + D_8122EEA8.unk_03 = 1; + } + if (!(arg1 & 0x80)) { + D_8122EEA8.unk_00 = 1; + D_8122EEA8.unk_01 = 1; + D_8122EEA8.unk_02 = 1; + D_8122EEA8.unk_03 = 1; + } + break; + } +} +#else #pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1_86CB0/func_81208C08.s") +#endif void func_81208D7C(void) { s32 pad[6]; diff --git a/yamls/us/rom.yaml b/yamls/us/rom.yaml index c9c631a..ddb453d 100644 --- a/yamls/us/rom.yaml +++ b/yamls/us/rom.yaml @@ -605,6 +605,8 @@ - [0x86CB0, c, fragments/1/fragment1_86CB0] - [0x89020, hasm, fragments/1/fragment1_code_asm] - [0x8D1A0, data, fragments/1/fragment1_data_8D1A0] + - [0x8E3D0, .data, fragments/1/fragment1_86C30] + - [0x8E3E0, data, fragments/1/fragment1_data_8E3E0] - [0xA8020, data, fragments/1/fragment1_data_A8020] - [0xA80F0, data, fragments/1/fragment1_data_asm] - [0xA8E80, rodata, fragments/1/fragment1_rodata_A8E80]