#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);
    }
}
