Merge pull request #249 from dplewis/frag1-various-functions
Some checks are pending
C/C++ CI / build (push) Waiting to run

Match fragment1 functions
This commit is contained in:
Revo
2026-08-05 15:21:26 -04:00
committed by GitHub
5 changed files with 329 additions and 10 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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

View File

@@ -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];

View File

@@ -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]