Merge pull request #214 from dplewis/gb_emu-1
Some checks failed
C/C++ CI / build (push) Has been cancelled

Fragment 1 various functions
This commit is contained in:
Revo 2025-09-18 13:19:29 -04:00 committed by GitHub
commit fdc8596d0d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 615 additions and 69 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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_ */

View File

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

View File

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

View File

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

View File

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

View File

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