ogrebattle64/src/_ob_past_brick.c

202 lines
5.1 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) {
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);
// }