From 7ee4a32ae4c780bace488f270c4e5bd09a284354 Mon Sep 17 00:00:00 2001 From: Ryan Myers Date: Fri, 8 Oct 2021 15:37:25 -0400 Subject: [PATCH] Attempt to match __scMain --- lib/src/mips1/sc/sched.c | 60 +++++++++++++++++++++++++++++++++++++--- lib/src/mips1/sc/sched.h | 8 +++++- 2 files changed, 63 insertions(+), 5 deletions(-) diff --git a/lib/src/mips1/sc/sched.c b/lib/src/mips1/sc/sched.c index 167c8c4d..e08093f5 100644 --- a/lib/src/mips1/sc/sched.c +++ b/lib/src/mips1/sc/sched.c @@ -68,10 +68,6 @@ s32 D_80126128[18]; /*******************************/ -void __scYield(OSSched *sc); -void __scMain(void); -void __scExec(OSSched *sc, OSScTask *sp, OSScTask *dp); - void osCreateScheduler(OSSched *sc, void *stack, OSPri priority, u8 mode, u8 numFields) { sc->curRSPTask = 0; sc->curRDPTask = 0; @@ -154,7 +150,63 @@ void func_80079584(f32 *arg0, f32 *arg1, f32 *arg2) { *arg2 = D_800DE74C; } +#ifdef NON_MATCHING +static void __scMain(void *arg) { + OSMesg msg = NULL; + OSSched *sc = (OSSched *)arg; + OSScClient *client; + //static int count = 0; + s32 state = 0; + OSScTask *sp = 0; + OSScTask *dp = 0; + + while (1) { + loop1: + do { + osRecvMesg(&sc->interruptQ, (OSMesg *)&msg, OS_MESG_BLOCK); + + switch ((int) msg) { + case (VIDEO_MSG): + __scHandleRetrace(sc); + goto loop1; + break; + + case (RSP_DONE_MSG): + __scHandleRSP(sc); + goto loop1; + break; + + case (RDP_DONE_MSG): + __scHandleRDP(sc); + goto loop1; + break; + + case (99): + func_80079760(sc); + goto loop1; + break; + + case (PRE_NMI_MSG): + /* + * notify audio and graphics threads to fade out + */ + for (client = sc->clientList; client != 0; client = client->next) { + osSendMesg(client->msgQ, (OSMesg) &sc->prenmiMsg, + OS_MESG_NOBLOCK); + } + goto loop1; + break; + } + __scAppendList(sc, (OSScTask *) msg); + state = ((sc->curRSPTask == 0) << 1) | (sc->curRDPTask == 0); + } while (__scSchedule(sc, &sp, &dp, state) == state); + __scExec(sc, sp, dp); + goto loop1; + } +} +#else GLOBAL_ASM("lib/asm/non_matchings/sched/__scMain.s") +#endif void func_80079760(OSSched *sc) { s32 state; diff --git a/lib/src/mips1/sc/sched.h b/lib/src/mips1/sc/sched.h index 81df82b4..6610161c 100644 --- a/lib/src/mips1/sc/sched.h +++ b/lib/src/mips1/sc/sched.h @@ -99,7 +99,11 @@ extern OSViMode osViModeTable[]; /*******************************/ void __scYield(OSSched *sc); -void __scMain(void); +#ifdef NON_MATCHING +static void __scMain(void *arg); +#else +void __scMain(void *arg); +#endif void __scExec(OSSched *sc, OSScTask *sp, OSScTask *dp); void osCreateScheduler(OSSched *sc, void *stack, OSPri priority, u8 mode, u8 numFields); void osScAddClient(OSSched *sc, OSScClient *c, OSMesgQueue *msgQ, u8 arg3); @@ -109,9 +113,11 @@ OSMesgQueue *osScGetInterruptQ(OSSched *sc); void func_80079584(f32 *arg0, f32 *arg1, f32 *arg2); void func_80079760(OSSched *sc); void __scHandleRDP(OSSched *sc); +void __scHandleRSP(OSSched *sc); OSScTask *__scTaskReady(OSScTask *t); s32 __scTaskComplete(OSSched *sc, OSScTask *t); void __scAppendList(OSSched *sc, OSScTask *t); void __scExec(OSSched *sc, OSScTask *sp, OSScTask *dp); +void __scHandleRetrace(OSSched *sc); #endif