#include "common.h" #include "nu/nusys.h" extern u32 obStackMain; /* 1A660 8008A260 */ u8 nuContMgrInit(void) { s32 var_a0; s32 var_a1; s32 var_v1; nuContDataUnLock(); osCreateMesgQueue(&nuContWaitMesgQ, &nuContWaitMesgBuf, 1); osCreateMesgQueue(&nuContDataMutexQ, &nuContDataMutexBuf, 1); nuSiCallBackAdd(&D_800A9FF8); nuContQueryRead(); var_a0 = 1; var_a1 = 0; var_v1 = 0; obStackMain = 0; for(; var_v1 < MAXCONTROLLERS; var_v1++) { if (__GLOBAL_CONT_STATUS[var_v1].errno == 0) { if ((__GLOBAL_CONT_STATUS[var_v1].type & CONT_TYPE_MASK) == CONT_TYPE_NORMAL) { var_a1 |= var_a0; obStackMain += 1; } var_a0 *= 2; } } return var_a1; } void func_8008A334(void) { func_8008B1D0(&D_800A9FF8); } void __start_copy_global_controller_data(void) { osSendMesg(&nuContDataMutexQ, NULL, OS_MESG_BLOCK); } void __end_copy_global_controller_data(void) { osRecvMesg(&nuContDataMutexQ, NULL, OS_MESG_BLOCK); } s32 __read_controller(OSContPad* data, u32 flags) { s32 res; res = osContStartReadData(&nuSiMesgQ); if(res != 0) return res; osRecvMesg(&nuSiMesgQ, NULL, OS_MESG_BLOCK); if (!(flags & D_800C4B30)) { func_8008A354(); osContGetReadData(data); func_8008A37C(); return 0; } return 0; } s32 __real_read_controller(void) { s32 var_v0; var_v0 = osContStartQuery(&nuSiMesgQ); if (var_v0 == 0) { osRecvMesg(&nuSiMesgQ, NULL, OS_MESG_BLOCK); osContGetQuery(__GLOBAL_CONT_STATUS); return 0; } else { return var_v0; } } s32 __calls_read_controller_0(s16* arg0) { if (D_800C4B30 == 0) { osRecvMesg(&nuContWaitMesgQ, NULL, 0); __read_controller(__GLOBAL_CONTROLLER_DATA, 1); if (D_800A9FE0 != NULL) { D_800A9FE0(*arg0); } osSendMesg(&nuContWaitMesgQ, NULL, 0); } return 0; } typedef struct { /* 0x0 */ u8 field_0x0[0xc]; /* 0xC */ OSContPad* data; } Arg___calls_read_controller_1; void __calls_read_controller_1(Arg___calls_read_controller_1* arg) { __read_controller(arg->data, 0); } s32 __calls_read_controller_2(s16* arg0) { s32 var_v0; osRecvMesg(&nuContWaitMesgQ, NULL, 0); var_v0 = __read_controller(__GLOBAL_CONTROLLER_DATA, 0); if (var_v0 == 0) { if (D_800A9FE0 != NULL) { D_800A9FE0(*arg0); } return 0; } else { return var_v0; } }