Shipwright/soh/src/libultra/io/contreaddata.c

56 lines
1.5 KiB
C

#include "global.h"
s32 osContStartReadData(OSMesgQueue* mq) {
s32 ret;
__osSiGetAccess();
if (__osContLastPoll != 1) {
__osPackReadData();
__osSiRawStartDma(OS_WRITE, &__osPifInternalBuff);
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
}
ret = __osSiRawStartDma(OS_READ, &__osPifInternalBuff);
__osContLastPoll = CONT_CMD_READ_BUTTON;
__osSiRelAccess();
return ret;
}
void osContGetReadData(OSContPad* contData) {
u8* bufptr = (u8*)(&__osPifInternalBuff);
__OSContReadHeader read;
s32 i;
for (i = 0; i < __osMaxControllers; i++, bufptr += sizeof(read), contData++) {
read = *((__OSContReadHeader*)bufptr);
contData->errno = (read.rxsize & 0xC0) >> 4;
if (contData->errno == 0) {
contData->button = read.button;
contData->stick_x = read.joyX;
contData->stick_y = read.joyY;
}
};
}
void __osPackReadData(void) {
u8* bufptr = (u8*)(&__osPifInternalBuff);
__OSContReadHeader read;
s32 i;
for (i = 0; i < 0xF; i++) {
__osPifInternalBuff.ram[i] = 0;
}
__osPifInternalBuff.status = 1;
read.align = 0xFF;
read.txsize = 1;
read.rxsize = 4;
read.poll = CONT_CMD_READ_BUTTON;
read.button = 0xFFFF;
read.joyX = 0xFF;
read.joyY = 0xFF;
for (i = 0; i < __osMaxControllers; i++) {
*((__OSContReadHeader*)bufptr) = read;
bufptr += sizeof(read);
}
*((u8*)bufptr) = CONT_CMD_END;
}