diff --git a/include/eepmgr.h b/include/eepmgr.h index af4528f..b46276b 100644 --- a/include/eepmgr.h +++ b/include/eepmgr.h @@ -2,11 +2,19 @@ #define EEPMGR_H #include "ultra64.h" +#include "unk.h" +#define EEPBUFFER_MAGIC 0x81317531 + +typedef struct EepBuffer { + /* 0x000 */ u8 data[0x3FA]; + /* 0x3FA */ u16 unk3FA; + /* 0x3FC */ s32 magic; +} EepBuffer; // size = 0x400 typedef struct EepRequest { /* 0x0 */ s16 type; - /* 0x4 */ u64* buffer; + /* 0x4 */ EepBuffer* buffer; } EepRequest; typedef struct EepMgr { @@ -18,12 +26,18 @@ typedef struct EepMgr { /* 0x048 */ EepRequest unk048; /* 0x050 */ char unk_04C[0x68 - 0x50]; /* 0x068 */ OSThread thread; - /* 0x218 */ s32 unk218; + /* 0x218 */ UNK_PTR unk218; /* 0x21C */ u8 type; /* 0x21E */ u16 numBlocks; - /* 0x220 */ u64* cache; + /* 0x220 */ EepBuffer* cache; /* 0x224 */ u8 cached; /* 0x225 */ u8 operation; } EepMgr; // size = 0x228 + +void eepmgr_Create(EepMgr* eepmgr, UNK_PTR arg1, s32 type, EepBuffer* cache, s32 id, s32 priority, void* stack); +s32 func_8007D508(EepMgr* eepmgr); +void eepmgr_SendRead(EepMgr* eepmgr, EepBuffer* buffer); +void eepmgr_SendWrite(EepMgr* eepmgr, EepBuffer* buffer); + #endif diff --git a/include/global.h b/include/global.h index 0a85fec..2788180 100644 --- a/include/global.h +++ b/include/global.h @@ -15,25 +15,22 @@ struct Input; -typedef struct Y65430UnkStruct { - /* 0x00 */ u32 magic; - /* 0x04 */ size_t unk04; -} Y65430UnkStruct; // size >= 0x08; - #define Y65430UnkStruct_MAGIC 0x434D5052 // 'CMPR' +typedef void (*Y65430UnkFunc)(void*, UNK_TYPE, size_t); + typedef struct MallocRecord { - /* 0x00 */ UNK_TYPE allocP; + /* 0x00 */ u32 allocP; /* 0x04 */ UNK_TYPE requestSize; /* 0x08 */ UNK_TYPE totalFree; /* 0x0C */ UNK_TYPE totalAlloc; /* 0x10 */ UNK_TYPE blockCnt; } MallocRecord; // size >= 0x14 -extern MallocRecord mallocRecord; - -extern UNK_TYPE D_800DA83C; -extern UNK_TYPE D_8010DF40; +typedef struct Y65430UnkStruct { + /* 0x00 */ u32 magic; + /* 0x04 */ size_t unk04; +} Y65430UnkStruct; // size >= 0x08; typedef struct Y511F0UnkStruct { /* 0x0 */ uintptr_t unk0; @@ -42,39 +39,71 @@ typedef struct Y511F0UnkStruct { /* 0xC */ uintptr_t unkC; } Y511F0UnkStruct; // size = 0x10 -extern Y511F0UnkStruct D_800DA840[]; +typedef struct Y511F0UnkStruct2 { + /* 0x0 */ char unk0[0x04]; + /* 0x4 */ UNK_TYPE unk4; +} Y511F0UnkStruct2; // size >= 0x8 -// 740F0 -OSMesgQueue* func_800744B0(s32 arg0); -void func_8007451C(s32 arg0, OSMesgQueue* arg1); -void func_80074C88(UNK_PTR, struct Input*, s32); +// Functions -// malloc -void* func_80064DD0(u32 size); +// 511F0 +Y511F0UnkStruct2* func_80050C8C(u16 arg0); +// 65430 Y65430UnkStruct* func_80064D1C(u32); - +void* func_80064DD0(u32 size); // malloc? void func_80064E84(Y65430UnkStruct*); +void func_80065528(void* arg0, void* arg1, s32 arg2); +void func_80065728(MallocRecord*, s32, s32); +void func_8006758C(void*, UNK_TYPE, size_t); +void func_800675D0(void*, UNK_TYPE, size_t, Y65430UnkFunc); + +// 6DF40 +void func_8006F500(void); +// 70160 void func_8006F560(Y65430UnkStruct*, Y65430UnkStruct*); +// 740F0 +OSMesgQueue* func_800744B0(UNK_PTR arg0); +void func_800748B0(UNK_PTR arg0); +void func_8007451C(UNK_PTR arg0, OSMesgQueue* arg1); +void func_80074C88(UNK_PTR, struct Input*, s32); + // dma void DmaMgr_RequestSync(void* ram, u32 vrom, u32 size); // 80C50 void func_800800CC(MtxF* mfA, MtxF* mfB); void func_80080914(MtxF* mf, f32, f32, f32, f32); -void func_80080824(MtxF* mf, f32 /*x*/, f32 /*y*/, f32 /*z*/); -void func_80080440(MtxF* mf, f32 /*x*/, f32 /*y*/); -void func_800804E0(MtxF* mf, f32 /*angle*/); -void func_800805C8(MtxF* mf, f32 /*angle*/); -void func_800806B0(MtxF* mf, f32 /*angle*/); -void func_80080798(MtxF* mf, f32 /*x*/, f32 /*y*/); -void func_80080C84(MtxF* mf, f32 /*x*/, f32 /*y*/, f32 /*z*/); +void func_80080824(MtxF* mf, f32 x, f32 y, f32 z); +void func_80080440(MtxF* mf, f32 x, f32 y); +void func_800804E0(MtxF* mf, f32 angle); +void func_800805C8(MtxF* mf, f32 angle); +void func_800806B0(MtxF* mf, f32 angle); +void func_80080798(MtxF* mf, f32 x, f32 y); +void func_80080C84(MtxF* mf, f32 x, f32 y, f32 z); // loadfragment2 size_t Overlay_Load(uintptr_t vromStart, uintptr_t vromEnd, uintptr_t vramStart, uintptr_t vramEnd, void* allocatedRamAddr); void* Overlay_AllocateAndLoad(uintptr_t vromStart, uintptr_t vromEnd, uintptr_t vramStart, uintptr_t vramEnd); +// Data + +// 92170 +extern MallocRecord mallocRecord; + +// Bss + +extern UNK_TYPE D_800DA83C; +extern Y511F0UnkStruct D_800DA840[]; +extern MallocRecord D_800F8E58; +extern u8 D_800FAAF8; +extern u8 D_800FAB1C; +extern u8 D_800FAB20; +extern UNK_TYPE D_80108624; +extern UNK_TYPE D_80108628; +extern UNK_TYPE D_8010DF40; + #endif diff --git a/include/segment_symbols.h b/include/segment_symbols.h new file mode 100644 index 0000000..bb74f1e --- /dev/null +++ b/include/segment_symbols.h @@ -0,0 +1,54 @@ +#ifndef SEGMENT_SYMBOLS_H +#define SEGMENT_SYMBOLS_H + +#include "ultra64.h" +#include "libc/stdint.h" + +#define DECLARE_VRAM_SEGMENT(name) \ + extern u8 name ## _VRAM[]; \ + extern u8 name ## _VRAM_END[] + +#define DECLARE_ROM_SEGMENT(name) \ + extern u8 name ## _ROM_START[]; \ + extern u8 name ## _ROM_END[] + +#define DECLARE_DATA_SEGMENT(name) \ + extern u8 name ## _DATA_START[]; \ + extern u8 name ## _DATA_END[]; \ + extern u8 name ## _DATA_SIZE[] + +#define DECLARE_BSS_SEGMENT(name) \ + extern u8 name ## _BSS_START[]; \ + extern u8 name ## _BSS_END[] + +#define DECLARE_SEGMENT(name) \ + DECLARE_VRAM_SEGMENT(name); \ + DECLARE_ROM_SEGMENT(name); \ + DECLARE_DATA_SEGMENT(name); \ + DECLARE_BSS_SEGMENT(name) + +#define SEGMENT_VRAM_START(segment) (segment ## _VRAM) +#define SEGMENT_VRAM_END(segment) (segment ## _VRAM_END) +#define SEGMENT_VRAM_SIZE(segment) ((uintptr_t)SEGMENT_VRAM_END(segment) - (uintptr_t)SEGMENT_VRAM_START(segment)) +#define SEGMENT_VRAM_RESOLVE_ADDR(segment, base, symbol) ((uintptr_t)(base) + (uintptr_t)&(symbol) - (uintptr_t)SEGMENT_VRAM_START(segment)) + +#define SEGMENT_ROM_START(segment) ((RomOffset)segment ## _ROM_START) +#define SEGMENT_ROM_END(segment) ((RomOffset)segment ## _ROM_END) +#define SEGMENT_ROM_SIZE(segment) (SEGMENT_ROM_END(segment) - SEGMENT_ROM_START(segment)) +#define SEGMENT_ROM_SIZE_ALT(segment) ((size_t)(segment ## _ROM_END - segment ## _ROM_START)) + +#define SEGMENT_DATA_SIZE_CONST(segment) ((RomOffset)segment ## _DATA_SIZE) + +#define SEGMENT_BSS_START(segment) (segment ## _BSS_START) +#define SEGMENT_BSS_END(segment) (segment ## _BSS_END) +#define SEGMENT_BSS_SIZE(segment) ((uintptr_t)SEGMENT_BSS_END(segment) - (uintptr_t)SEGMENT_BSS_START(segment)) + +DECLARE_SEGMENT(header); + +DECLARE_SEGMENT(ipl3); + +DECLARE_SEGMENT(entry); + +DECLARE_SEGMENT(main); + +#endif diff --git a/include/ys64thread.h b/include/ys64thread.h index 3d68a32..9f7f414 100644 --- a/include/ys64thread.h +++ b/include/ys64thread.h @@ -1,9 +1,15 @@ #ifndef YS64_THREAD_H #define YS64_THREAD_H +#define Y_THREAD_ID_IDLE 1 #define Y_THREAD_ID_FAULT 2 +#define Y_THREAD_ID_MAIN 3 #define Y_THREAD_ID_DMA 18 +#define Y_THREAD_ID_EEPMGR 20 +#define Y_PRIORITY_IDLE 10 +#define Y_PRIORITY_MAIN 10 +#define Y_PRIORITY_EEPMGR 16 #define Y_PRIORITY_DMA 18 #define Y_PRIORITY_FAULT OS_PRIORITY_APPMAX diff --git a/linker_scripts/us/symbol_addrs.txt b/linker_scripts/us/symbol_addrs.txt index 7a94aba..a803684 100644 --- a/linker_scripts/us/symbol_addrs.txt +++ b/linker_scripts/us/symbol_addrs.txt @@ -1,6 +1,10 @@ entrypoint = 0x80000400; +Idle_ThreadEntry = 0x80067284; +Idle_InitVideo = 0x80067390; +bootclear = 0x80067400; bootproc = 0x8006743C; +Main_ThreadEntry = 0x80069000; Fault_SetFramebuffer = 0x80071250; // type:func Fault_Init = 0x8007127C; // type:func @@ -103,6 +107,7 @@ aprintf = 0x80082174; csleep = 0x800821A0; // data + mallocRecord = 0x800A65AC; // type:MallocRecord size:0x14 fault_exit = 0x800A8000; @@ -125,3 +130,19 @@ gOverlayLogSeverity = 0x800AA390; // type:s32 // rodata // bss + +gEepMgr = 0x800F95D0; +sEepBuff = 0x800F97F8; +sEepStack = 0x800F9FF8; +sEepCache = 0x800FA2F8; +sEepStackInfo = 0x800FAB00; +sBootStack = 0x800FB018; +sBootStackInfo = 0x800FD018; +sIdleThread = 0x800FD038; +sIdleStack = 0x800FD1E8; +sIdleStackInfo = 0x800FD3E8; +sMainThread = 0x800FD408; +sMainStack = 0x800FD5B8; +sMainStackInfo = 0x800FFCB8; +sPiMgrCmdQueue = 0x80100490; +sPiMgrCmdBuff = 0x80100470; diff --git a/src/main/O2/65430.c b/src/main/O2/65430.c new file mode 100644 index 0000000..7bc7227 --- /dev/null +++ b/src/main/O2/65430.c @@ -0,0 +1,565 @@ +#include "global.h" + +#include "lib/ultralib/src/io/viint.h" + +#include "fault.h" +#include "segment_symbols.h" +#include "stack.h" +#include "stackcheck.h" +#include "ys64thread.h" + +void func_80064830(Y65430UnkStruct* arg0) { + func_80064E84(arg0); +} + +void* func_80064850(u16 arg0) { + s32 sp1C = func_80050C8C(arg0)->unk4; + void* sp18 = func_80064DD0(0x18); + + func_800675D0(sp18, sp1C, 0x18, func_8006758C); + return sp18; +} + +void func_800648A4(Y65430UnkStruct** arg0) { + if (*arg0 != NULL) { + func_80064830(*arg0); + *arg0 = NULL; + } +} + +s32 func_800648DC(void** arg0, u16 arg1) { + void* temp_v0 = func_80064850(arg1); + + if (temp_v0 == NULL) { + return 0; + } + *arg0 = temp_v0; + return 1; +} + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80064920.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80064AA8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80064AD4.s") + +void func_80064B38(void) { + func_80065728(&mallocRecord, 20, 0); +} + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80064B64.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80064BAC.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80064C14.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80064C8C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80064CB8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80064D1C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80064DD0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80064E84.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80064F38.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80064F94.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80064FEC.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006502C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065060.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006509C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800650B0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800650D8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006515C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800651B0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065200.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065284.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006528C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800652B4.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065308.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065368.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065388.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800653CC.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800653D8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065408.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065414.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065474.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065490.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800654B4.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065528.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800655F4.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800656BC.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065728.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800657CC.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006586C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800658D8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006593C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065954.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065984.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800659EC.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065A54.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065ABC.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065AEC.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065B50.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065BC8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065C44.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065CD4.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065DE4.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065E4C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065F30.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80065FD0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006607C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80066190.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800662B8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800663F4.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80066428.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80066448.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80066468.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800664B0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006671C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800667D4.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80066894.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006692C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800669C0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80066A4C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80066AD8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80066D08.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80066DE4.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80066E88.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80066F2C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80066FA0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067114.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067170.s") + +void Idle_InitVideo(void); +void Main_ThreadEntry(void* arg); + +extern OSThread sMainThread; +extern STACK(sMainStack, 0x2700); +extern StackEntry sMainStackInfo; + +extern OSMesgQueue sPiMgrCmdQueue; +extern OSMesg sPiMgrCmdBuff[8]; + +#ifdef NON_MATCHING +// Getting extra nops with the infinite loop, file split? +void Idle_ThreadEntry(void* arg) { + osCreateViManager(OS_PRIORITY_VIMGR); + Idle_InitVideo(); + osViSetSpecialFeatures(OS_VI_DITHER_FILTER_ON | OS_VI_GAMMA_DITHER_OFF | OS_VI_GAMMA_OFF); + osViBlack(true); + osCreatePiManager(OS_PRIORITY_PIMGR, &sPiMgrCmdQueue, sPiMgrCmdBuff, ARRAY_COUNT(sPiMgrCmdBuff)); + StackCheck_Init(&sMainStackInfo, sMainStack, STACK_TOP(sMainStack), 0, 0x1000, "main"); + osCreateThread(&sMainThread, Y_THREAD_ID_MAIN, Main_ThreadEntry, arg, STACK_TOP(sMainStack), Y_PRIORITY_MAIN); + D_80108624 = IO_READ(SP_IMEM_START); + D_80108628 = IO_READ(SP_DMEM_START); + func_8006F500(); + osStartThread(&sMainThread); + osSetThreadPri(NULL, OS_PRIORITY_IDLE); + + for (;;) {} +} +#else +void Idle_ThreadEntry(void* arg); +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/Idle_ThreadEntry.s") +#endif +#undef NON_MATCHING + +void Idle_InitVideo(void) { + switch (osTvType) { + case OS_TV_TYPE_PAL: + osViSetMode(&osViModeTable[16]); + break; + + case OS_TV_TYPE_NTSC: + osViSetMode(&osViModeTable[2]); + break; + + case OS_TV_TYPE_MPAL: + osViSetMode(&osViModeTable[30]); + break; + } +} + +void bootclear(void) { + bzero(SEGMENT_VRAM_END(main), osMemSize - K0_TO_PHYS(SEGMENT_VRAM_END(main))); +} + +extern STACK(sBootStack, 0x2000); +extern StackEntry sBootStackInfo; + +extern OSThread sIdleThread; +extern STACK(sIdleStack, 0x200); +extern StackEntry sIdleStackInfo; + +void bootproc(void) { + StackCheck_Init(&sBootStackInfo, sBootStack, STACK_TOP(sBootStack), 0, -1, "boot"); + osInitialize(); + bootclear(); + StackCheck_Init(&sIdleStackInfo, sIdleStack, STACK_TOP(sIdleStack), 0, 0x100, "idle"); + osCreateThread(&sIdleThread, Y_THREAD_ID_IDLE, Idle_ThreadEntry, NULL, STACK_TOP(sIdleStack), Y_PRIORITY_IDLE); + osStartThread(&sIdleThread); +} + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067508.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067530.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006758C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800675D0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800675F0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006767C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800676F8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800677CC.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800677F8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067818.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067838.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067878.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800678B0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800678D0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800678F0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067930.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067970.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067990.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800679B0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800679D0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800679F0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067A10.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067A30.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067A50.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067A78.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067AAC.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067ACC.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067AF4.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067B1C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067B3C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067B74.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067BBC.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067BF8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067C30.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067C68.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067CAC.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067CE4.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067D28.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067D38.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067D48.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067D5C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067D94.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067DD8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067E24.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067E68.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067E78.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067E98.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067EB8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067ED8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067EF8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067F18.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067F38.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067F58.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067F78.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80067FF4.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006806C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068190.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006820C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006823C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800682D4.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068320.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068340.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800683A4.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068418.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068438.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068470.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800684E8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068560.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800685AC.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800685F0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006863C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006872C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800687B8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068890.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800688CC.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006899C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800689E8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800689F0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068AB0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068B0C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068B2C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068BC0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068C00.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068C74.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068CD4.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068CF8.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068D24.s") + +void func_80068D8C(void) { +} + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068D94.s") + +void func_80068E24(void); +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068E24.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068ED4.s") + +void func_80068F10(void); +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80068F10.s") + +void Main_ThreadEntry(UNUSED void* arg) { + Fault_Init(); + func_80068F10(); + func_80068E24(); +} + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80069030.s") + +void func_8006915C(void) { + D_800FAAF8 = 0; + D_800FAB1C = 0; + D_800FAB20 = 1; + func_800748B0(&D_8010DF40); +} + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006919C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006920C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800692D4.s") + +void func_800694BC(s32 arg0); +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800694BC.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80069508.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006958C.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80069610.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80069644.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80069684.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800696D4.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80069728.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006976C.s") + +s32 func_800697F0(void); +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800697F0.s") + +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_8006988C.s") + +void func_80069900(void); +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_80069900.s") + +void func_80069C10(void); + +void func_80069964(void) { + func_80069C10(); + if (func_800697F0() != 0) { + func_80065728(&D_800F8E58, 0x400, 0); + func_80069900(); + } + func_800694BC(D_800F8E58.allocP >> 0x1E); +} + +u16 func_800699BC(EepBuffer* arg0); +#pragma GLOBAL_ASM("asm/us/nonmatchings/main/O2/65430/func_800699BC.s") + +extern EepMgr gEepMgr; +extern EepBuffer sEepBuff[2]; +extern STACK(sEepStack, 0x300); +extern EepBuffer sEepCache[2]; +extern StackEntry sEepStackInfo; + +s32 func_80069A80(void* arg0) { + func_80065528(&sEepBuff[0].data, arg0, ARRAY_COUNT(sEepBuff[0].data)); + sEepBuff[0].unk3FA = func_800699BC(sEepBuff); + sEepBuff[0].magic = EEPBUFFER_MAGIC; + sEepBuff[1] = sEepBuff[0]; + + eepmgr_SendWrite(&gEepMgr, sEepBuff); + if (func_8007D508(&gEepMgr) != 0) { + return 1; + } + + return 0; +} + +s32 func_80069B34(UNK_PTR arg0) { + eepmgr_SendRead(&gEepMgr, sEepBuff); + + if (func_8007D508(&gEepMgr) != 0) { + return 1; + } + + if ((sEepBuff[0].unk3FA == func_800699BC(&sEepBuff[0])) && (sEepBuff[0].magic == EEPBUFFER_MAGIC)) { + func_80065528(arg0, &sEepBuff[0].data, ARRAY_COUNT(sEepBuff[0].data)); + return 0; + } + + if ((sEepBuff[1].unk3FA == func_800699BC(&sEepBuff[1])) && (sEepBuff[1].magic == EEPBUFFER_MAGIC)) { + func_80065528(arg0, &sEepBuff[1].data, ARRAY_COUNT(sEepBuff[1].data)); + return 0; + } + + return 1; +} + +void func_80069C10(void) { + StackCheck_Init(&sEepStackInfo, sEepStack, STACK_TOP(sEepStack), 0, 0x100, "eepmgr"); + eepmgr_Create(&gEepMgr, &D_8010DF40, EEPROM_TYPE_16K, sEepCache, Y_THREAD_ID_EEPMGR, Y_PRIORITY_EEPMGR, + STACK_TOP(sEepStack)); +} diff --git a/src/main/eepmgr.c b/src/main/eepmgr.c index ba5eb58..f0736f3 100644 --- a/src/main/eepmgr.c +++ b/src/main/eepmgr.c @@ -71,15 +71,15 @@ void eepmgr_Probe(EepMgr* eepmgr) { } } -void eepmgr_Setup(EepMgr* eepmgr, s32 arg1, s32 type, u64* buffer) { +void eepmgr_Setup(EepMgr* eepmgr, UNK_PTR arg1, s32 type, EepBuffer* cache) { bzero(eepmgr, sizeof(EepMgr)); eepmgr->unk218 = arg1; - eepmgr->cache = buffer; + eepmgr->cache = cache; eepmgr->type = type; eepmgr->numBlocks = sMaxBlocks[eepmgr->type]; } -s32 eepmgr_Read(EepMgr* eepmgr, u8 arg1, u64* buffer) { +s32 eepmgr_Read(EepMgr* eepmgr, u8 addr, void* buffer) { s32 status; OSTime before; OSTime after; @@ -88,7 +88,7 @@ s32 eepmgr_Read(EepMgr* eepmgr, u8 arg1, u64* buffer) { eepmgr->operation = 1; before = osGetTime(); - status = osEepromRead(eepmgr->unk044, arg1, (u8*)buffer); + status = osEepromRead(eepmgr->unk044, addr, buffer); after = osGetTime(); eepmgr->operation = 0; @@ -113,7 +113,7 @@ s32 eepmgr_Read(EepMgr* eepmgr, u8 arg1, u64* buffer) { return 0; } -s32 eepmgr_Write(EepMgr* eepmgr, u8 addr, u64* buffer) { +s32 eepmgr_Write(EepMgr* eepmgr, u8 addr, void* buffer) { s32 status; OSTime before; OSTime after; @@ -122,7 +122,7 @@ s32 eepmgr_Write(EepMgr* eepmgr, u8 addr, u64* buffer) { eepmgr->operation = 2; before = osGetTime(); - status = osEepromWrite(eepmgr->unk044, addr, (u8*)buffer); + status = osEepromWrite(eepmgr->unk044, addr, buffer); after = osGetTime(); eepmgr->operation = 0; @@ -149,7 +149,7 @@ s32 eepmgr_Write(EepMgr* eepmgr, u8 addr, u64* buffer) { return 0; } -s32 eepmgr_HandleWrite(EepMgr* eepmgr, u64* buffer) { +s32 eepmgr_HandleWrite(EepMgr* eepmgr, EepBuffer* buffer) { u64* bufferIter; u64* cacheIter; s32 i; @@ -168,8 +168,8 @@ s32 eepmgr_HandleWrite(EepMgr* eepmgr, u64* buffer) { return -1; } - cacheIter = eepmgr->cache; - bufferIter = buffer; + cacheIter = (u64*)eepmgr->cache; + bufferIter = (u64*)buffer; for (i = 0; i < eepmgr->numBlocks; i++) { if (*bufferIter != *cacheIter) { if (eepmgr_Write(eepmgr, i, bufferIter) != 0) { @@ -186,7 +186,7 @@ s32 eepmgr_HandleWrite(EepMgr* eepmgr, u64* buffer) { return 0; } -s32 eepmgr_HandleRead(EepMgr* eepmgr, u64* arg1) { +s32 eepmgr_HandleRead(EepMgr* eepmgr, EepBuffer* buffer) { u64* cacheIter; s32 i; @@ -197,7 +197,7 @@ s32 eepmgr_HandleRead(EepMgr* eepmgr, u64* arg1) { } if (!eepmgr->cached) { - cacheIter = eepmgr->cache; + cacheIter = (u64*)eepmgr->cache; for (i = 0; i < eepmgr->numBlocks; i++) { if (eepmgr_Read(eepmgr, i, cacheIter) != 0) { return -1; @@ -207,7 +207,7 @@ s32 eepmgr_HandleRead(EepMgr* eepmgr, u64* arg1) { eepmgr->cached = true; } - bcopy(eepmgr->cache, arg1, eepmgr->numBlocks * EEPROM_BLOCK_SIZE); + bcopy(eepmgr->cache, buffer, eepmgr->numBlocks * EEPROM_BLOCK_SIZE); return 0; } @@ -255,9 +255,9 @@ void eepmgr_ThreadEntry(void* arg) { } } -void eepmgr_Create(EepMgr* eepmgr, s32 arg1, s32 type, u64* buffer, s32 id, s32 priority, void* stack) { +void eepmgr_Create(EepMgr* eepmgr, UNK_PTR arg1, s32 type, EepBuffer* cache, s32 id, s32 priority, void* stack) { (void)"eepmgr_Create(%08x, %08x, %d, %08x, %d, %d, %08x)\n"; - eepmgr_Setup(eepmgr, arg1, type, buffer); + eepmgr_Setup(eepmgr, arg1, type, cache); osCreateMesgQueue(&eepmgr->unk014, eepmgr->unk000, ARRAY_COUNT(eepmgr->unk000)); osCreateMesgQueue(&eepmgr->unk02C, eepmgr->unk004, ARRAY_COUNT(eepmgr->unk004)); osCreateThread(&eepmgr->thread, id, eepmgr_ThreadEntry, eepmgr, stack, priority); @@ -272,7 +272,7 @@ s32 func_8007D508(EepMgr* eepmgr) { return msg; } -void eepmgr_SendRead(EepMgr* eepmgr, void* buffer) { +void eepmgr_SendRead(EepMgr* eepmgr, EepBuffer* buffer) { EepRequest* req = &eepmgr->unk048; if (req->type != 0) { @@ -284,7 +284,7 @@ void eepmgr_SendRead(EepMgr* eepmgr, void* buffer) { osSendMesg(&eepmgr->unk014, &eepmgr->unk048, OS_MESG_BLOCK); } -void eepmgr_SendWrite(EepMgr* eepmgr, void* buffer) { +void eepmgr_SendWrite(EepMgr* eepmgr, EepBuffer* buffer) { EepRequest* req = &eepmgr->unk048; if (req->type != 0) { diff --git a/yamls/us/main.yaml b/yamls/us/main.yaml index 522df6f..67e3287 100644 --- a/yamls/us/main.yaml +++ b/yamls/us/main.yaml @@ -50,7 +50,7 @@ - [0x5E4C0, asm] # Probably has at least 1 file split - [0x63870, asm] - [0x63A30, asm] - - [0x65430, asm] + - [0x65430, c, O2/65430] - [0x6A8A0, asm, unitManager] - [0x6CB50, asm] - [0x6CB60, asm] @@ -323,7 +323,7 @@ - [0xB18A0, rodata, nxgotoManager] - [0xB1900, rodata] - [0xB1960, rodata] - - [0xB19A0, rodata, 65430] # Probably main, but also has utility.c in rodata? + - [0xB19A0, .rodata, O2/65430] # Probably main, but also has utility.c in rodata? - [0xB1B20, rodata, unitManager] - [0xB1C60, rodata, 6CB80] - [0xB1C90, rodata]