sm64

A Super Mario 64 decompilation
Log | Files | Refs | README | LICENSE

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 }