summaryrefslogtreecommitdiff
path: root/soh/src/code/main.c
diff options
context:
space:
mode:
authorM4xw <m4x@m4xw.net>2022-03-22 02:51:23 +0100
committerM4xw <m4x@m4xw.net>2022-03-22 02:51:23 +0100
commit39cc86c2608e2f75ace33fc7f43bc4f2ad743f1a (patch)
tree0d3fd9e995d7484eaaeb158ac808bd6a39121189 /soh/src/code/main.c
parent0bb0e7b53bd80bdc7f78e08c441691737e039b2b (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.c134
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"
+}