osContStartReadData.c (2484B)
1 #include "libultra_internal.h" 2 #include "osContInternal.h" 3 #include "PR/ique.h" 4 #include <macros.h> 5 #include "controller.h" 6 7 ALIGNED8 OSPifRam __osContPifRam; 8 9 extern u8 __osContLastCmd; 10 extern u8 __osMaxControllers; 11 12 void __osPackReadData(void); 13 14 s32 osContStartReadData(OSMesgQueue *mesg) { 15 #ifdef VERSION_CN 16 s32 ret; 17 #else 18 s32 ret = 0; 19 s32 i; 20 #endif 21 __osSiGetAccess(); 22 if (__osContLastCmd != CONT_CMD_READ_BUTTON) { 23 __osPackReadData(); 24 ret = __osSiRawStartDma(OS_WRITE, __osContPifRam.ramarray); 25 osRecvMesg(mesg, NULL, OS_MESG_BLOCK); 26 } 27 #ifndef VERSION_CN 28 for (i = 0; i < ARRAY_COUNT(__osContPifRam.ramarray) + 1; i++) { 29 __osContPifRam.ramarray[i] = 0xff; 30 } 31 __osContPifRam.pifstatus = 0; 32 #endif 33 34 ret = __osSiRawStartDma(OS_READ, __osContPifRam.ramarray); 35 #ifdef VERSION_CN 36 __osContLastCmd = 0xfd; 37 #else 38 __osContLastCmd = CONT_CMD_READ_BUTTON; 39 #endif 40 __osSiRelAccess(); 41 return ret; 42 } 43 44 void osContGetReadData(OSContPad *pad) { 45 u8 *cmdBufPtr; 46 OSContPackedRead response; 47 s32 i; 48 cmdBufPtr = (u8 *) __osContPifRam.ramarray; 49 for (i = 0; i < __osMaxControllers; i++, cmdBufPtr += sizeof(OSContPackedRead), pad++) { 50 response = * (OSContPackedRead *) cmdBufPtr; 51 pad->errnum = (response.rxLen & 0xc0) >> 4; 52 if (pad->errnum == 0) { 53 pad->button = response.button; 54 pad->stick_x = response.rawStickX; 55 pad->stick_y = response.rawStickY; 56 } 57 } 58 #ifdef VERSION_CN 59 if (__osBbIsBb != 0 && __osBbHackFlags != 0) { 60 OSContPad tmp; 61 pad -= __osMaxControllers; 62 tmp = *pad; 63 *pad = pad[__osBbHackFlags]; 64 pad[__osBbHackFlags] = tmp; 65 } 66 #endif 67 } 68 69 void __osPackReadData() { 70 u8 *cmdBufPtr; 71 OSContPackedRead request; 72 s32 i; 73 cmdBufPtr = (u8 *) __osContPifRam.ramarray; 74 75 #ifdef VERSION_CN 76 for (i = 0; i < ARRAY_COUNT(__osContPifRam.ramarray); i++) { 77 #else 78 for (i = 0; i < ARRAY_COUNT(__osContPifRam.ramarray) + 1; i++) { 79 #endif 80 __osContPifRam.ramarray[i] = 0; 81 } 82 83 __osContPifRam.pifstatus = 1; 84 request.padOrEnd = 255; 85 request.txLen = 1; 86 request.rxLen = 4; 87 request.command = 1; 88 request.button = 65535; 89 request.rawStickX = -1; 90 request.rawStickY = -1; 91 for (i = 0; i < __osMaxControllers; i++) { 92 * (OSContPackedRead *) cmdBufPtr = request; 93 cmdBufPtr += sizeof(OSContPackedRead); 94 } 95 *cmdBufPtr = 254; 96 }