sm64pc/lib/src/osContStartReadData.c

74 lines
2.0 KiB
C
Raw Normal View History

2019-08-25 06:46:40 +02:00
#include "libultra_internal.h"
#include "osContInternal.h"
#include <macros.h>
2020-04-03 20:57:26 +02:00
#ifndef AVOID_UB
2020-06-02 18:44:34 +02:00
ALIGNED8 OSContPackedStruct _osContCmdBuf[7];
2019-08-25 06:46:40 +02:00
UNUSED static u32 unused; // padding between these two variables
2020-06-02 18:44:34 +02:00
u32 _osContPifCtrl;
2020-04-03 20:57:26 +02:00
#else
// Reordered gcc vars above will disturb the aliasing done to access all 8 members of this array, hence AVOID_UB.
2020-06-02 18:44:34 +02:00
ALIGNED8 OSContPackedStruct _osContCmdBuf[8];
2020-04-03 20:57:26 +02:00
#endif
2019-08-25 06:46:40 +02:00
2020-06-02 18:44:34 +02:00
extern u8 _osLastSentSiCmd;
extern u8 _osContNumControllers;
2019-08-25 06:46:40 +02:00
void __osPackReadData(void);
s32 osContStartReadData(OSMesgQueue *mesg) {
s32 ret = 0;
s32 i;
__osSiGetAccess();
2020-06-02 18:44:34 +02:00
if (_osLastSentSiCmd != 1) {
2019-08-25 06:46:40 +02:00
__osPackReadData();
2020-06-02 18:44:34 +02:00
ret = __osSiRawStartDma(OS_WRITE, _osContCmdBuf);
2019-08-25 06:46:40 +02:00
osRecvMesg(mesg, NULL, OS_MESG_BLOCK);
}
for (i = 0; i < 0x10; i++) {
2020-06-02 18:44:34 +02:00
*((u32 *) &_osContCmdBuf + i) = 255;
2019-08-25 06:46:40 +02:00
}
2020-06-02 18:44:34 +02:00
_osContPifCtrl = 0;
ret = __osSiRawStartDma(OS_READ, _osContCmdBuf);
_osLastSentSiCmd = 1;
2019-08-25 06:46:40 +02:00
__osSiRelAccess();
return ret;
}
void osContGetReadData(OSContPad *pad) {
2020-06-02 18:44:34 +02:00
OSContPackedRead *cmdBufPtr;
OSContPackedRead response;
2019-08-25 06:46:40 +02:00
s32 i;
2020-06-02 18:44:34 +02:00
cmdBufPtr = &_osContCmdBuf[0].read;
for (i = 0; i < _osContNumControllers; i++, cmdBufPtr++, pad++) {
response = *cmdBufPtr;
pad->errnum = (response.rxLen & 0xc0) >> 4;
2020-05-07 20:21:22 +02:00
if (pad->errnum == 0) {
2020-06-02 18:44:34 +02:00
pad->button = response.button;
pad->stick_x = response.rawStickX;
pad->stick_y = response.rawStickY;
2019-08-25 06:46:40 +02:00
}
};
}
void __osPackReadData() {
2020-06-02 18:44:34 +02:00
OSContPackedRead *cmdBufPtr;
OSContPackedRead request;
2019-08-25 06:46:40 +02:00
s32 i;
2020-06-02 18:44:34 +02:00
cmdBufPtr = &_osContCmdBuf[0].read;
2019-08-25 06:46:40 +02:00
for (i = 0; i < 0x10; i++) {
2020-06-02 18:44:34 +02:00
*((u32 *) &_osContCmdBuf + i) = 0;
2019-08-25 06:46:40 +02:00
}
2020-04-03 20:57:26 +02:00
2020-06-02 18:44:34 +02:00
_osContPifCtrl = 1;
request.padOrEnd = 255;
request.txLen = 1;
request.rxLen = 4;
request.command = 1;
request.button = 65535;
request.rawStickX = -1;
request.rawStickY = -1;
for (i = 0; i < _osContNumControllers; i++) {
*cmdBufPtr++ = request;
2019-08-25 06:46:40 +02:00
}
2020-06-02 18:44:34 +02:00
cmdBufPtr->padOrEnd = 254;
2019-08-25 06:46:40 +02:00
}