From 83c4db1e547e90c9620b0aa1a80405922631e662 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Tue, 26 Jan 2021 12:19:31 +1000 Subject: [PATCH] Decompile schedCreateThread --- src/boot/init.c | 72 ++++++++++--------------------------- src/boot/reset.c | 14 ++++---- src/boot/sched.c | 2 +- src/gvars/gvars.c | 64 +++------------------------------ src/include/PR/ultratypes.h | 4 +++ src/include/constants.h | 18 ++++++++++ src/include/gvars/gvars.h | 9 ++--- src/lib/lib_08a20.c | 10 +++--- src/lib/lib_0c000.c | 2 +- src/lib/lib_2f490.c | 4 +-- 10 files changed, 66 insertions(+), 133 deletions(-) diff --git a/src/boot/init.c b/src/boot/init.c index 2832e6f20..8f3e4339c 100644 --- a/src/boot/init.c +++ b/src/boot/init.c @@ -446,65 +446,29 @@ void idleproc(void *data) void idleCreateThread(void) { - osCreateThread(&g_IdleThread, THREAD_IDLE, idleproc, NULL, allocateStack(THREAD_IDLE, 64), 0); + osCreateThread(&g_IdleThread, THREAD_IDLE, idleproc, NULL, allocateStack(THREAD_IDLE, STACKSIZE_IDLE), THREADPRI_IDLE); osStartThread(&g_IdleThread); } void rmonCreateThread(void) { - osCreateThread(&g_RmonThread, 0, rmonproc, NULL, allocateStack(0, 0x300), 250); + osCreateThread(&g_RmonThread, THREAD_RMON, rmonproc, NULL, allocateStack(THREAD_RMON, STACKSIZE_RMON), THREADPRI_RMON); osStartThread(&g_RmonThread); } -GLOBAL_ASM( -glabel func000019f4 -/* 19f4: 27bdffe8 */ addiu $sp,$sp,-24 -/* 19f8: afbf0014 */ sw $ra,0x14($sp) -/* 19fc: 3c048009 */ lui $a0,%hi(var8008db30) -/* 1a00: 3c058009 */ lui $a1,%hi(var8008db48) -/* 1a04: 24a5db48 */ addiu $a1,$a1,%lo(var8008db48) -/* 1a08: 2484db30 */ addiu $a0,$a0,%lo(var8008db30) -/* 1a0c: 0c0120d0 */ jal osCreateMesgQueue -/* 1a10: 24060020 */ addiu $a2,$zero,0x20 -/* 1a14: 3c0e8000 */ lui $t6,0x8000 -/* 1a18: 8dce0300 */ lw $t6,0x300($t6) -/* 1a1c: 24010002 */ addiu $at,$zero,0x2 -/* 1a20: 3c048009 */ lui $a0,%hi(var8008dbd0) -/* 1a24: 15c1000a */ bne $t6,$at,.L00001a50 -/* 1a28: 2484dbd0 */ addiu $a0,$a0,%lo(var8008dbd0) -/* 1a2c: 3c048009 */ lui $a0,%hi(var8008dbd0) -/* 1a30: 3c058009 */ lui $a1,%hi(var8008d900) -/* 1a34: 24a5d900 */ addiu $a1,$a1,%lo(var8008d900) -/* 1a38: 2484dbd0 */ addiu $a0,$a0,%lo(var8008dbd0) -/* 1a3c: 2406001e */ addiu $a2,$zero,0x1e -/* 1a40: 0c000713 */ jal osCreateScheduler -/* 1a44: 24070001 */ addiu $a3,$zero,0x1 -/* 1a48: 10000006 */ b .L00001a64 -/* 1a4c: 00000000 */ nop -.L00001a50: -/* 1a50: 3c058009 */ lui $a1,%hi(var8008d900) -/* 1a54: 24a5d900 */ addiu $a1,$a1,%lo(var8008d900) -/* 1a58: 24060002 */ addiu $a2,$zero,0x2 -/* 1a5c: 0c000713 */ jal osCreateScheduler -/* 1a60: 24070001 */ addiu $a3,$zero,0x1 -.L00001a64: -/* 1a64: 3c048009 */ lui $a0,%hi(var8008dbd0) -/* 1a68: 3c058009 */ lui $a1,%hi(var8008dca8) -/* 1a6c: 3c068009 */ lui $a2,%hi(var8008db30) -/* 1a70: 24c6db30 */ addiu $a2,$a2,%lo(var8008db30) -/* 1a74: 24a5dca8 */ addiu $a1,$a1,%lo(var8008dca8) -/* 1a78: 2484dbd0 */ addiu $a0,$a0,%lo(var8008dbd0) -/* 1a7c: 0c00078c */ jal osScAddClient -/* 1a80: 00003825 */ or $a3,$zero,$zero -/* 1a84: 3c048009 */ lui $a0,%hi(var8008dbd0) -/* 1a88: 0c0007a3 */ jal osScGetCmdQ -/* 1a8c: 2484dbd0 */ addiu $a0,$a0,%lo(var8008dbd0) -/* 1a90: 8fbf0014 */ lw $ra,0x14($sp) -/* 1a94: 3c018009 */ lui $at,%hi(var8008dbc8) -/* 1a98: ac22dbc8 */ sw $v0,%lo(var8008dbc8)($at) -/* 1a9c: 03e00008 */ jr $ra -/* 1aa0: 27bd0018 */ addiu $sp,$sp,0x18 -); +void schedCreateThread(void) +{ + osCreateMesgQueue(&var8008db30, &var8008db48, 32); + + if (osTvType == OS_TV_MPAL) { + osCreateScheduler(&g_SchedThread, &var8008d900, OS_VI_MPAL_LAN1, 1); + } else { + osCreateScheduler(&g_SchedThread, &var8008d900, OS_VI_NTSC_LAN1, 1); + } + + osScAddClient(&g_SchedThread, &var8008dca8, &var8008db30, 0); + g_SchedCmdQ = osScGetCmdQ(&g_SchedThread); +} void mainproc(u32 value) { @@ -514,11 +478,11 @@ void mainproc(u32 value) rmonCreateThread(); if (func00012f30()) { - osStopThread(0); + osStopThread(NULL); } - osSetThreadPri(0, 10); - func000019f4(); + osSetThreadPri(0, THREADPRI_MAIN); + schedCreateThread(); mainEntry(); } diff --git a/src/boot/reset.c b/src/boot/reset.c index b876992a1..520e99c2c 100644 --- a/src/boot/reset.c +++ b/src/boot/reset.c @@ -44,15 +44,15 @@ glabel resetproc /* 2e84: 24040001 */ addiu $a0,$zero,0x1 /* 2e88: 0c012448 */ jal func00049120 /* 2e8c: 00000000 */ nop -/* 2e90: 3c018009 */ lui $at,%hi(var8008fdf0) -/* 2e94: ac22fdf0 */ sw $v0,%lo(var8008fdf0)($at) +/* 2e90: 3c018009 */ lui $at,%hi(g_ResetSp) +/* 2e94: ac22fdf0 */ sw $v0,%lo(g_ResetSp)($at) /* 2e98: 0c012448 */ jal func00049120 /* 2e9c: ac23fdf4 */ sw $v1,-0x20c($at) /* 2ea0: 3c198009 */ lui $t9,%hi(var8008fdf4) /* 2ea4: 8f39fdf4 */ lw $t9,%lo(var8008fdf4)($t9) -/* 2ea8: 3c188009 */ lui $t8,%hi(var8008fdf0) +/* 2ea8: 3c188009 */ lui $t8,%hi(g_ResetSp) /* 2eac: 3c010022 */ lui $at,0x22 -/* 2eb0: 8f18fdf0 */ lw $t8,%lo(var8008fdf0)($t8) +/* 2eb0: 8f18fdf0 */ lw $t8,%lo(g_ResetSp)($t8) /* 2eb4: 3421add7 */ ori $at,$at,0xadd7 /* 2eb8: 03214821 */ addu $t1,$t9,$at /* 2ebc: 0121082b */ sltu $at,$t1,$at @@ -70,9 +70,9 @@ glabel resetproc /* 2ee8: 00000000 */ nop /* 2eec: 3c0b8009 */ lui $t3,%hi(var8008fdf4) /* 2ef0: 8d6bfdf4 */ lw $t3,%lo(var8008fdf4)($t3) -/* 2ef4: 3c0a8009 */ lui $t2,%hi(var8008fdf0) +/* 2ef4: 3c0a8009 */ lui $t2,%hi(g_ResetSp) /* 2ef8: 3c010022 */ lui $at,0x22 -/* 2efc: 8d4afdf0 */ lw $t2,%lo(var8008fdf0)($t2) +/* 2efc: 8d4afdf0 */ lw $t2,%lo(g_ResetSp)($t2) /* 2f00: 3421add7 */ ori $at,$at,0xadd7 /* 2f04: 01616821 */ addu $t5,$t3,$at /* 2f08: 01a1082b */ sltu $at,$t5,$at @@ -109,6 +109,6 @@ void resetThreadCreate(void) { osCreateMesgQueue(&g_ResetMesgQueue, &g_ResetMesg, 10); osSetEventMesg(OS_EVENT_PRENMI, &g_ResetMesgQueue, (OSMesg) 669); - osCreateThread(&g_ResetThread, THREAD_RESET, resetproc, 0, &var8008fdf0, 11); + osCreateThread(&g_ResetThread, THREAD_RESET, resetproc, 0, &g_ResetSp, THREADPRI_RESET); osStartThread(&g_ResetThread); } diff --git a/src/boot/sched.c b/src/boot/sched.c index 1a68a6e66..d795015b9 100644 --- a/src/boot/sched.c +++ b/src/boot/sched.c @@ -116,7 +116,7 @@ void osCreateScheduler(OSSched *sc, void *stack, u8 mode, u32 numFields) osViSetEvent(&sc->interruptQ, (OSMesg)VIDEO_MSG, numFields); osCreateLog(); - osCreateThread(sc->thread, THREAD_SCHED, &__scMain, sc, allocateStack(THREAD_SCHED, 0x400), 30); + osCreateThread(sc->thread, THREAD_SCHED, &__scMain, sc, allocateStack(THREAD_SCHED, STACKSIZE_SCHED), THREADPRI_SCHED); osStartThread(sc->thread); } diff --git a/src/gvars/gvars.c b/src/gvars/gvars.c index 0d529da49..cbcae724f 100644 --- a/src/gvars/gvars.c +++ b/src/gvars/gvars.c @@ -2566,7 +2566,7 @@ u32 var8008db24 = 0; u32 var8008db28 = 0; u32 var8008db2c = 0; OSMesgQueue var8008db30 = {0}; -u32 var8008db48 = 0; +OSMesg var8008db48 = NULL; u32 var8008db4c = 0; u32 var8008db50 = 0; u32 var8008db54 = 0; @@ -2598,64 +2598,10 @@ u32 var8008dbb8 = 0; u32 var8008dbbc = 0; u32 var8008dbc0 = 0; u32 var8008dbc4 = 0; -u32 var8008dbc8 = 0; +OSMesgQueue *g_SchedCmdQ = NULL; u32 var8008dbcc = 0; -u32 var8008dbd0 = 0; -u32 var8008dbd4 = 0; -u32 var8008dbd8 = 0; -u32 var8008dbdc = 0; -u32 var8008dbe0 = 0; -u32 var8008dbe4 = 0; -u32 var8008dbe8 = 0; -u32 var8008dbec = 0; -u32 var8008dbf0 = 0; -u32 var8008dbf4 = 0; -u32 var8008dbf8 = 0; -u32 var8008dbfc = 0; -u32 var8008dc00 = 0; -u32 var8008dc04 = 0; -u32 var8008dc08 = 0; -u32 var8008dc0c = 0; -u32 var8008dc10 = 0; -u32 var8008dc14 = 0; -u32 var8008dc18 = 0; -u32 var8008dc1c = 0; -u32 var8008dc20 = 0; -u32 var8008dc24 = 0; -u32 var8008dc28 = 0; -u32 var8008dc2c = 0; -u32 var8008dc30 = 0; -u32 var8008dc34 = 0; -u32 var8008dc38 = 0; -u32 var8008dc3c = 0; -u32 var8008dc40 = 0; -u32 var8008dc44 = 0; -u32 var8008dc48 = 0; -u32 var8008dc4c = 0; -u32 var8008dc50 = 0; -u32 var8008dc54 = 0; -u32 var8008dc58 = 0; -u32 var8008dc5c = 0; -u32 var8008dc60 = 0; -u32 var8008dc64 = 0; -u32 var8008dc68 = 0; -u32 var8008dc6c = 0; -u32 var8008dc70 = 0; -u32 var8008dc74 = 0; -u32 var8008dc78 = 0; -u32 var8008dc7c = 0; -u32 var8008dc80 = 0; -u32 var8008dc84 = 0; -u32 var8008dc88 = 0; -u32 var8008dc8c = 0; -u32 var8008dc90 = 0; -u32 var8008dc94 = 0; -u32 var8008dc98 = 0; -u32 var8008dc9c = 0; -u32 var8008dca0 = 0; -u32 var8008dca4 = 0; -u32 var8008dca8 = 0; -u32 var8008dcac = 0; +OSSched g_SchedThread = {0}; +OSScClient var8008dca8 = {0}; u32 var8008dcb0 = 0; u32 g_OsMemSize = 0; u32 var8008dcb8 = 0; @@ -2827,7 +2773,7 @@ u32 var8008fde0 = 0; u32 var8008fde4 = 0; u32 var8008fde8 = 0; u32 var8008fdec = 0; -u32 var8008fdf0 = 0; +u32 g_ResetSp = 0; u32 var8008fdf4 = 0; u32 var8008fdf8 = 0; u32 var8008fdfc = 0; diff --git a/src/include/PR/ultratypes.h b/src/include/PR/ultratypes.h index 5e7d31313..031f18964 100644 --- a/src/include/PR/ultratypes.h +++ b/src/include/PR/ultratypes.h @@ -8,6 +8,10 @@ #define TRUE 1 #define FALSE 0 +#define OS_TV_PAL 0 +#define OS_TV_NTSC 1 +#define OS_TV_MPAL 2 + typedef signed char s8; typedef unsigned char u8; typedef signed short int s16; diff --git a/src/include/constants.h b/src/include/constants.h index 047c032c5..bb4ef8958 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -2977,6 +2977,14 @@ #define SQUADRON_0E 0x0e #define SQUADRON_0F 0x0f +#define STACKSIZE_RMON 0x300 +#define STACKSIZE_IDLE 0x40 +#define STACKSIZE_SCHED 0x400 +#define STACKSIZE_MAIN 0x9800 +#define STACKSIZE_AUDIO 0x1000 +#define STACKSIZE_FAULT 0 +#define STACKSIZE_RESET 0 + #define STAGE_MP_RANDOM 0x01 #define STAGE_MAIANSOS 0x09 #define STAGE_TEST_SILO 0x14 @@ -3146,12 +3154,22 @@ #define TELEPORTSTATE_WHITE 3 #define TELEPORTSTATE_EXITING 4 +#define THREAD_RMON 0 #define THREAD_IDLE 1 #define THREAD_SCHED 2 +#define THREAD_MAIN 3 #define THREAD_AUDIO 4 #define THREAD_FAULT 5 #define THREAD_RESET 6 +#define THREADPRI_RMON 250 +#define THREADPRI_IDLE 0 +#define THREADPRI_SCHED 30 +#define THREADPRI_MAIN 10 +#define THREADPRI_AUDIO 20 +#define THREADPRI_FAULT 40 +#define THREADPRI_RESET 11 + #define TICKMODE_0 0 #define TICKMODE_NORMAL 1 #define TICKMODE_WARP 3 diff --git a/src/include/gvars/gvars.h b/src/include/gvars/gvars.h index 74da5438b..68f7e3ee6 100644 --- a/src/include/gvars/gvars.h +++ b/src/include/gvars/gvars.h @@ -329,9 +329,10 @@ extern OSThread g_IdleThread; extern OSThread var8008d6d0; extern u32 var8008d900; extern OSMesgQueue var8008db30; -extern u32 var8008db48; -extern u32 var8008dbd0; -extern u32 var8008dca8; +extern OSMesg var8008db48; +extern OSMesgQueue *g_SchedCmdQ; +extern OSSched g_SchedThread; +extern OSScClient var8008dca8; extern u32 g_OsMemSize; extern u32 var8008dcc0; extern OSViMode *var8008dd60[2]; @@ -345,7 +346,7 @@ extern u32 var8008fa68; extern OSMesg g_ResetMesg; extern OSMesgQueue g_ResetMesgQueue; extern OSThread g_ResetThread; -extern u32 var8008fdf0; +extern u32 g_ResetSp; extern OSThread viThread; extern u32 __viEventQueue; extern u32 viEventBuf; diff --git a/src/lib/lib_08a20.c b/src/lib/lib_08a20.c index 34e05d057..84c3bf9f0 100644 --- a/src/lib/lib_08a20.c +++ b/src/lib/lib_08a20.c @@ -24,7 +24,7 @@ void audioAllocateStack(void) { - g_AudioSp = allocateStack(THREAD_AUDIO, 4096); + g_AudioSp = allocateStack(THREAD_AUDIO, STACKSIZE_AUDIO); } GLOBAL_ASM( @@ -519,7 +519,7 @@ glabel func00009154 /* 916c: afb30024 */ sw $s3,0x24($sp) /* 9170: afb20020 */ sw $s2,0x20($sp) /* 9174: 2dce0001 */ sltiu $t6,$t6,0x1 -/* 9178: 3c048009 */ lui $a0,%hi(var8008dbd0) +/* 9178: 3c048009 */ lui $a0,%hi(g_SchedThread) /* 917c: 3c058009 */ lui $a1,%hi(var800918d0) /* 9180: 3c068009 */ lui $a2,%hi(var80091810) /* 9184: afbe0038 */ sw $s8,0x38($sp) @@ -535,7 +535,7 @@ glabel func00009154 /* 91ac: afa00060 */ sw $zero,0x60($sp) /* 91b0: 24c61810 */ addiu $a2,$a2,%lo(var80091810) /* 91b4: 24a518d0 */ addiu $a1,$a1,%lo(var800918d0) -/* 91b8: 2484dbd0 */ addiu $a0,$a0,%lo(var8008dbd0) +/* 91b8: 2484dbd0 */ addiu $a0,$a0,%lo(g_SchedThread) /* 91bc: 0c00078c */ jal osScAddClient /* 91c0: 2dc70001 */ sltiu $a3,$t6,0x1 /* 91c4: 3c158009 */ lui $s5,%hi(var80091590) @@ -720,10 +720,10 @@ glabel func00009448 /* 945c: afbf001c */ sw $ra,0x1c($sp) /* 9460: 10c00007 */ beqz $a2,.L00009480 /* 9464: afa50034 */ sw $a1,0x34($sp) -/* 9468: 3c048009 */ lui $a0,%hi(var8008dbd0) +/* 9468: 3c048009 */ lui $a0,%hi(g_SchedThread) /* 946c: 3c018009 */ lui $at,%hi(var800918f4) /* 9470: ac2618f4 */ sw $a2,%lo(var800918f4)($at) -/* 9474: 2484dbd0 */ addiu $a0,$a0,%lo(var8008dbd0) +/* 9474: 2484dbd0 */ addiu $a0,$a0,%lo(g_SchedThread) /* 9478: 0c0007ea */ jal __scHandleRetraceViaPri /* 947c: 00c02825 */ or $a1,$a2,$zero .L00009480: diff --git a/src/lib/lib_0c000.c b/src/lib/lib_0c000.c index eaae2a868..8092e9baf 100644 --- a/src/lib/lib_0c000.c +++ b/src/lib/lib_0c000.c @@ -145,7 +145,7 @@ void faultproc(void *arg0); void faultCreateThread2(void) { osCreateMesgQueue(&g_FaultMesgQueue, &g_FaultMesg, 1); - osCreateThread(&g_FaultThread, THREAD_FAULT, faultproc, NULL, &g_FaultSp, 40); + osCreateThread(&g_FaultThread, THREAD_FAULT, faultproc, NULL, &g_FaultSp, THREADPRI_FAULT); osStartThread(&g_FaultThread); } diff --git a/src/lib/lib_2f490.c b/src/lib/lib_2f490.c index c0052b23b..d8f14f07e 100644 --- a/src/lib/lib_2f490.c +++ b/src/lib/lib_2f490.c @@ -372,10 +372,10 @@ glabel func0002f8f4 /* 2f9a8: acc8000c */ sw $t0,0xc($a2) /* 2f9ac: 0c012048 */ jal osWritebackDCacheAll /* 2f9b0: afa6001c */ sw $a2,0x1c($sp) -/* 2f9b4: 3c048009 */ lui $a0,%hi(var8008dbd0) +/* 2f9b4: 3c048009 */ lui $a0,%hi(g_SchedThread) /* 2f9b8: 8fa5001c */ lw $a1,0x1c($sp) /* 2f9bc: 0c0007ea */ jal __scHandleRetraceViaPri -/* 2f9c0: 2484dbd0 */ addiu $a0,$a0,%lo(var8008dbd0) +/* 2f9c0: 2484dbd0 */ addiu $a0,$a0,%lo(g_SchedThread) /* 2f9c4: 3c028006 */ lui $v0,%hi(var8005f108) /* 2f9c8: 2442f108 */ addiu $v0,$v0,%lo(var8005f108) /* 2f9cc: 8c490000 */ lw $t1,0x0($v0)