#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) { OSMesg msg; s32 beforeResetFrame; nuScRetraceCounter = 0; while (TRUE) { osRecvMesg(&nusched.retraceMQ, &msg, OS_MESG_BLOCK); switch ((s32) 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); } } INCLUDE_ASM(const s32, "_ob_past_brick", nuScSetFrameBufferNum); // void func_80089528(s8 arg0) { // D_800E918D = arg0; // } // extern u8 D_800E918C; INCLUDE_ASM(const s32, "_ob_past_brick", func_80089534); /* 19934 80089534 */ // u8 func_80089534(void) { // return D_800E918C; // } 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); // }