118 lines
2.5 KiB
C
118 lines
2.5 KiB
C
#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;
|
|
}
|
|
}
|
|
|