diff options
| author | M4xw <m4x@m4xw.net> | 2022-03-22 02:51:23 +0100 |
|---|---|---|
| committer | M4xw <m4x@m4xw.net> | 2022-03-22 02:51:23 +0100 |
| commit | 39cc86c2608e2f75ace33fc7f43bc4f2ad743f1a (patch) | |
| tree | 0d3fd9e995d7484eaaeb158ac808bd6a39121189 /soh/src/code/main.c | |
| parent | 0bb0e7b53bd80bdc7f78e08c441691737e039b2b (diff) | |
git subrepo clone https://github.com/HarbourMasters/soh.git
subrepo:
subdir: "soh"
merged: "ba904bbd0"
upstream:
origin: "https://github.com/HarbourMasters/soh.git"
branch: "master"
commit: "ba904bbd0"
git-subrepo:
version: "0.4.1"
origin: "???"
commit: "???"
Diffstat (limited to 'soh/src/code/main.c')
| -rw-r--r-- | soh/src/code/main.c | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/soh/src/code/main.c b/soh/src/code/main.c new file mode 100644 index 000000000..eaaa7b388 --- /dev/null +++ b/soh/src/code/main.c @@ -0,0 +1,134 @@ +#include "global.h" +#include "vt.h" +#include <soh/Enhancements/bootcommands.h> +#include "soh/OTRGlobals.h" + + +s32 gScreenWidth = SCREEN_WIDTH; +s32 gScreenHeight = SCREEN_HEIGHT; +u32 gSystemHeapSize = 0; + +PreNmiBuff* gAppNmiBufferPtr; +SchedContext gSchedContext; +PadMgr gPadMgr; +IrqMgr gIrqMgr; +uintptr_t gSegments[NUM_SEGMENTS]; +OSThread sGraphThread; +u8 sGraphStack[0x1800]; +u8 sSchedStack[0x600]; +u8 sAudioStack[0x800]; +u8 sPadMgrStack[0x500]; +u8 sIrqMgrStack[0x500]; +StackEntry sGraphStackInfo; +StackEntry sSchedStackInfo; +StackEntry sAudioStackInfo; +StackEntry sPadMgrStackInfo; +StackEntry sIrqMgrStackInfo; +AudioMgr gAudioMgr; +OSMesgQueue sSiIntMsgQ; +OSMesg sSiIntMsgBuf[1]; + +void Main_LogSystemHeap(void) { + osSyncPrintf(VT_FGCOL(GREEN)); + // "System heap size% 08x (% dKB) Start address% 08x" + osSyncPrintf("システムヒープサイズ %08x(%dKB) 開始アドレス %08x\n", gSystemHeapSize, gSystemHeapSize / 1024, + gSystemHeap); + osSyncPrintf(VT_RST); +} + +void main(int argc, char** argv) +{ + GameConsole_Init(); + InitOTR(); + BootCommands_Init(); + + BootCommands_ParseBootArgs(argc - 1, (char**)&argv[1]); + Main(0); +} + +void Main(void* arg) { + IrqMgrClient irqClient; + OSMesgQueue irqMgrMsgQ; + OSMesg irqMgrMsgBuf[60]; + uintptr_t sysHeap; + uintptr_t fb; + void* debugHeap; + s32 debugHeapSize; + s16* msg; + + osSyncPrintf("mainproc 実行開始\n"); // "Start running" + gScreenWidth = SCREEN_WIDTH; + gScreenHeight = SCREEN_HEIGHT; + gAppNmiBufferPtr = (PreNmiBuff*)osAppNmiBuffer; + PreNmiBuff_Init(gAppNmiBufferPtr); + Fault_Init(); + SysCfb_Init(0); + sysHeap = gSystemHeap; + fb = SysCfb_GetFbPtr(0); + gSystemHeapSize = 1024 * 1024 * 4; + // "System heap initalization" + osSyncPrintf("システムヒープ初期化 %08x-%08x %08x\n", sysHeap, fb, gSystemHeapSize); + SystemHeap_Init(sysHeap, gSystemHeapSize); // initializes the system heap + if (osMemSize >= 0x800000) { + debugHeap = SysCfb_GetFbEnd(); + debugHeapSize = (0x80600000 - (uintptr_t)debugHeap); + } else { + debugHeapSize = 0x400; + debugHeap = SystemArena_MallocDebug(debugHeapSize, "../main.c", 565); + } + + debugHeapSize = 1024 * 64; + + osSyncPrintf("debug_InitArena(%08x, %08x)\n", debugHeap, debugHeapSize); + DebugArena_Init(debugHeap, debugHeapSize); + func_800636C0(); + + R_ENABLE_ARENA_DBG = 0; + + osCreateMesgQueue(&sSiIntMsgQ, sSiIntMsgBuf, 1); + osSetEventMesg(5, &sSiIntMsgQ, 0); + + Main_LogSystemHeap(); + + osCreateMesgQueue(&irqMgrMsgQ, irqMgrMsgBuf, 0x3C); + StackCheck_Init(&sIrqMgrStackInfo, sIrqMgrStack, sIrqMgrStack + sizeof(sIrqMgrStack), 0, 0x100, "irqmgr"); + IrqMgr_Init(&gIrqMgr, &sGraphStackInfo, Z_PRIORITY_IRQMGR, 1); + + osSyncPrintf("タスクスケジューラの初期化\n"); // "Initialize the task scheduler" + StackCheck_Init(&sSchedStackInfo, sSchedStack, sSchedStack + sizeof(sSchedStack), 0, 0x100, "sched"); + Sched_Init(&gSchedContext, &sAudioStack, Z_PRIORITY_SCHED, D_80013960, 1, &gIrqMgr); + + IrqMgr_AddClient(&gIrqMgr, &irqClient, &irqMgrMsgQ); + + StackCheck_Init(&sAudioStackInfo, sAudioStack, sAudioStack + sizeof(sAudioStack), 0, 0x100, "audio"); + AudioMgr_Init(&gAudioMgr, sAudioStack + sizeof(sAudioStack), Z_PRIORITY_AUDIOMGR, 0xA, &gSchedContext, &gIrqMgr); + + StackCheck_Init(&sPadMgrStackInfo, sPadMgrStack, sPadMgrStack + sizeof(sPadMgrStack), 0, 0x100, "padmgr"); + PadMgr_Init(&gPadMgr, &sSiIntMsgQ, &gIrqMgr, 7, Z_PRIORITY_PADMGR, &sIrqMgrStack); + + AudioMgr_Unlock(&gAudioMgr); + + StackCheck_Init(&sGraphStackInfo, sGraphStack, sGraphStack + sizeof(sGraphStack), 0, 0x100, "graph"); + osCreateThread(&sGraphThread, 4, Graph_ThreadEntry, arg, sGraphStack + sizeof(sGraphStack), Z_PRIORITY_GRAPH); + osStartThread(&sGraphThread); + osSetThreadPri(0, Z_PRIORITY_SCHED); + + Graph_ThreadEntry(0); + + while (true) { + msg = NULL; + osRecvMesg(&irqMgrMsgQ, (OSMesg)&msg, OS_MESG_BLOCK); + if (msg == NULL) { + break; + } + if (*msg == OS_SC_PRE_NMI_MSG) { + osSyncPrintf("main.c: リセットされたみたいだよ\n"); // "Looks like it's been reset" + PreNmiBuff_SetReset(gAppNmiBufferPtr); + } + } + + osSyncPrintf("mainproc 後始末\n"); // "Cleanup" + osDestroyThread(&sGraphThread); + func_800FBFD8(); + osSyncPrintf("mainproc 実行終了\n"); // "End of execution" +} |
