194 lines
4.9 KiB
C
194 lines
4.9 KiB
C
#include "common.h"
|
|
|
|
#include "nu/nusys.h"
|
|
|
|
void nuScEventBroadcast(NUScMsg* msg);
|
|
|
|
INCLUDE_ASM(const s32, "_ob_past_brick", nuScCreateScheduler);
|
|
|
|
OSMesgQueue* nuScGetAudioMQ() {
|
|
return &nusched.audioRequestMQ;
|
|
}
|
|
|
|
OSMesgQueue* nuScGetGfxMQ() {
|
|
return &nusched.graphicsRequestMQ;
|
|
}
|
|
|
|
void nuScEventHandler(void) {
|
|
s32 msg;
|
|
s32 beforeResetFrame;
|
|
|
|
nuScRetraceCounter = 0;
|
|
|
|
while (TRUE) {
|
|
osRecvMesg(&nusched.retraceMQ, (OSMesg)&msg, OS_MESG_BLOCK);
|
|
|
|
switch (msg) {
|
|
case 666:
|
|
nuScRetraceCounter++;
|
|
|
|
nuScEventBroadcast(&nusched.retraceMsg);
|
|
|
|
if (nuScPreNMIFlag) {
|
|
if (beforeResetFrame) {
|
|
beforeResetFrame--;
|
|
} else {
|
|
nuScPreNMIFlag |= NU_SC_BEFORE_RESET;
|
|
osAfterPreNMI();
|
|
osViSetYScale(1.0);
|
|
__calls_osViBlack(TRUE);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 669:
|
|
nuScPreNMIFlag = NU_SC_PRENMI_GET;
|
|
nuScEventBroadcast(&nusched.prenmiMsg);
|
|
|
|
if (nuScPreNMIFunc != NULL)
|
|
nuScPreNMIFunc();
|
|
|
|
beforeResetFrame = (nusched.frameRate / 2) / nusched.retraceCount - 3;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void nuScAddClient(NUScClient* client, OSMesgQueue* queue, NUScMsg type) {
|
|
s32 mask;
|
|
|
|
mask = osSetIntMask(OS_IM_NONE);
|
|
|
|
client->msgQ = queue;
|
|
client->next = nusched.clientList;
|
|
client->msgType = type;
|
|
|
|
nusched.clientList = client;
|
|
|
|
if ((type & NU_SC_PRENMI_MSG) && nuScPreNMIFlag) {
|
|
osSendMesg(queue, &nusched.prenmiMsg, OS_MESG_NOBLOCK);
|
|
}
|
|
|
|
osSetIntMask(mask);
|
|
}
|
|
|
|
void nuScResetClientMesgType(NUScClient* client, NUScMsg msgType) {
|
|
s32 mask;
|
|
|
|
mask = osSetIntMask(OS_IM_NONE);
|
|
client->msgType = msgType;
|
|
osSetIntMask(mask);
|
|
}
|
|
|
|
void nuScRemoveClient(NUScClient* client) {
|
|
s32 mask = osSetIntMask(OS_IM_NONE);
|
|
NUScClient* clientList = nusched.clientList;
|
|
NUScClient* prev = NULL;
|
|
|
|
while (clientList != NULL) {
|
|
if (clientList == client) {
|
|
if (prev != NULL) {
|
|
prev->next = clientList->next;
|
|
} else {
|
|
nusched.clientList = clientList->next;
|
|
}
|
|
break;
|
|
}
|
|
prev = clientList;
|
|
clientList = clientList->next;
|
|
}
|
|
|
|
osSetIntMask(mask);
|
|
}
|
|
|
|
void nuScEventBroadcast(NUScMsg* msg) {
|
|
NUScClient* clientList = nusched.clientList;
|
|
|
|
while (clientList != NULL) {
|
|
if (clientList->msgType & *msg) {
|
|
osSendMesg(clientList->msgQ, msg, OS_MESG_NOBLOCK);
|
|
}
|
|
clientList = clientList->next;
|
|
}
|
|
}
|
|
|
|
INCLUDE_ASM(const s32, "_ob_past_brick", nuScExecuteAudio);
|
|
|
|
INCLUDE_ASM(const s32, "_ob_past_brick", __thread_80089358);
|
|
|
|
INCLUDE_ASM(const s32, "_ob_past_brick", nuScExecuteGraphics);
|
|
|
|
// void nuScExecuteGraphics(void) {
|
|
// typedef struct {
|
|
// /* 0x00 */ s32 field_0x0;
|
|
// /* 0x04 */ s32 field_0x4;
|
|
// /* 0x08 */ s32 field_0x8;
|
|
// /* 0x1C */ u8 field_0x1c[0x42];
|
|
// /* 0x50 */ OSMesgQueue* field_0x50;
|
|
// } Stack0;
|
|
|
|
// Stack0* sp10;
|
|
// void* sp14;
|
|
|
|
// while(1) {
|
|
// osRecvMesg(&MQ_800E8B4C.field_0x0, &sp10, 1);
|
|
// if (!(nuScPreNMIFlag & 2)) {
|
|
// nuScWaitTaskReady(sp10);
|
|
// osWritebackDCacheAll();
|
|
// osSendMesg(&MQ_800B9C40, sp10, OS_MESG_BLOCK);
|
|
|
|
// osRecvMesg(&MQ_800E8B4C.field_0x70, &sp14, OS_MESG_BLOCK);
|
|
// osSendMesg(&MQ_800B9C40, NULL, OS_MESG_BLOCK);
|
|
// if (!(sp10->field_0x8 & 2)) {
|
|
// osRecvMesg(&MQ_800E8B4C.field_0xa8, &sp14, OS_MESG_BLOCK);
|
|
// }
|
|
// }
|
|
// osSendMesg(sp10->field_0x50, sp10, OS_MESG_BLOCK);
|
|
// }
|
|
// }
|
|
|
|
void nuScWaitTaskReady(NUScTask* task) {
|
|
NUScClient client;
|
|
void* fb = task->framebuffer;
|
|
|
|
if(nusched.frameBufferNum == 1) {
|
|
return;
|
|
}
|
|
|
|
while (osViGetNextFramebuffer() == fb || osViGetCurrentFramebuffer() == fb) {
|
|
nuScAddClient(&client, &nusched.waitMQ, NU_SC_RETRACE_MSG);
|
|
osRecvMesg(&nusched.waitMQ, NULL, OS_MESG_BLOCK);
|
|
nuScRemoveClient(&client);
|
|
}
|
|
}
|
|
|
|
void nuScSetFrameBufferNum(u8 frameBufferNum) {
|
|
nusched.frameBufferNum = frameBufferNum;
|
|
}
|
|
|
|
s32 nuScGetFrameRate() {
|
|
return nusched.frameRate;
|
|
}
|
|
|
|
INCLUDE_ASM(const s32, "_ob_past_brick", __thread_80089540);
|
|
|
|
INCLUDE_ASM(const s32, "_ob_past_brick", __start_thread_800B9C88);
|
|
|
|
INCLUDE_ASM(const s32, "_ob_past_brick", __something_display_list);
|
|
|
|
INCLUDE_ASM(const s32, "_ob_past_brick", func_80089990);
|
|
|
|
/* 19D90 80089990 */
|
|
// void func_80089990(void (*arg0)(s32)) {
|
|
// s32 mask;
|
|
|
|
// func_80089A10();
|
|
// mask = osSetIntMask(OS_IM_NONE);
|
|
// D_800AA090 = arg0;
|
|
// osSetIntMask(mask);
|
|
// }
|
|
|