sm64pc/lib/src/func_802F4A20.c

40 lines
1.1 KiB
C

#include "new_func.h"
void func_802F4A20(void) {
__OSTranxInfo *sp1c;
volatile u32 sp18;
sp1c = &__osDiskHandle->transferInfo;
WAIT_ON_IOBUSY(sp18);
HW_REG(ASIC_BM_CTL, u32) = BUFFER_MANAGER_RESET | sp1c->bmCtlShadow; //should be unk10??
WAIT_ON_IOBUSY(sp18);
HW_REG(ASIC_BM_CTL, u32) = sp1c->bmCtlShadow;
func_802F4B08();
HW_REG(PI_STATUS_REG, u32) = PI_STATUS_CLEAR_INTR;
D_8030208C |= 0x00100401; //TODO: fix magic numbers
}
typedef struct OSEventMessageStruct_0_s {
OSMesgQueue *queue;
OSMesg msg;
} OSEventMessageStruct_0;
extern OSEventMessageStruct_0 D_80363830[16]; // should be OS_NUM_EVENTS + 1 I think
void func_802F4B08(void) {
OSEventMessageStruct_0 *sp2c;
OSMesgQueue *sp28;
u32 sp24;
register OSThread *s0;
sp2c = &D_80363830[OS_EVENT_PI];
sp28 = sp2c->queue;
if (!sp28 || sp28->validCount >= sp28->msgCount)
return;
sp24 = (sp28->first + sp28->validCount) % sp28->msgCount;
sp28->msg[sp24] = sp2c->msg;
sp28->validCount += 1;
if (sp28->mtqueue->next != NULL) {
s0 = __osPopThread(&sp28->mtqueue);
__osEnqueueThread(&D_80334898, s0);
}
}