sm64pc/lib/src/osContInit.c

100 lines
2.5 KiB
C

#include "libultra_internal.h"
#include "osContInternal.h"
void __osPackRequestData(u8);
void __osContGetInitData(u8 *, OSContStatus *);
u32 D_80334810 = 0; // probably initialized
extern u64 osClockRate;
// these probably belong in EEPROMlongread or something
u8 D_80365D20;
u8 _osCont_numControllers;
OSTimer D_80365D28; // some kind of buffer, or maybe an as yet unknown struct
OSMesgQueue _osContMesgQueue;
OSMesg _osContMesgBuff[4];
s32 osContInit(OSMesgQueue *mq, u8 *a1, OSContStatus *status) {
OSMesg mesg;
u32 sp78 = 0;
OSTime currentTime;
OSTimer sp50;
OSMesgQueue sp38;
if (D_80334810) {
return 0;
}
D_80334810 = 1;
currentTime = osGetTime();
if (500000 * osClockRate / 1000000 > currentTime) {
osCreateMesgQueue(&sp38, &mesg, 1);
osSetTimer(&sp50, 500000 * osClockRate / 1000000 - currentTime, 0, &sp38, &mesg);
osRecvMesg(&sp38, &mesg, OS_MESG_BLOCK);
}
_osCont_numControllers = 4; // TODO: figure out what it means
#ifdef VERSION_EU
__osPackRequestData(0);
#else
__osPackRequestData(255);
#endif
sp78 = __osSiRawStartDma(1, D_80365CE0);
osRecvMesg(mq, &mesg, OS_MESG_BLOCK);
sp78 = __osSiRawStartDma(0, D_80365CE0);
osRecvMesg(mq, &mesg, OS_MESG_BLOCK);
__osContGetInitData(a1, status);
#ifdef VERSION_EU
D_80365D20 = 0;
#else
D_80365D20 = 255;
#endif
__osSiCreateAccessQueue();
osCreateMesgQueue(&_osContMesgQueue, _osContMesgBuff, 1);
return sp78;
}
void __osContGetInitData(u8 *a0, OSContStatus *status) {
OSContPackedRequest *sp14;
OSContPackedRequest spc;
s32 i;
u8 sp7;
sp7 = 0;
sp14 = &(D_80365CE0[0].request);
for (i = 0; i < _osCont_numControllers; i++, sp14++, status++) {
spc = *(OSContPackedRequest *) sp14;
status->errnum = (spc.unk02 & 0xc0) >> 4;
if (status->errnum == 0) {
status->type = spc.unk05 << 8 | spc.unk04;
status->status = spc.unk06;
sp7 |= 1 << i;
}
}
*a0 = sp7;
}
void __osPackRequestData(u8 a0) {
OSContPackedRequest *spc;
OSContPackedRequest sp4;
s32 i;
// some kind of weird zeroing code
for (i = 0; i < 0x10; i++) {
*((u32 *) &D_80365CE0 + i) = 0;
}
D_80365D1C = 1;
spc = &D_80365CE0[0].request;
sp4.unk00 = 255;
sp4.unk01 = 1;
sp4.unk02 = 3;
sp4.unk03 = a0;
sp4.unk04 = 255;
sp4.unk05 = 255;
sp4.unk06 = 255;
sp4.unk07 = 255;
for (i = 0; i < _osCont_numControllers; i++) {
*spc++ = sp4;
}
spc->unk00 = 254;
}