111 lines
2.5 KiB
C
111 lines
2.5 KiB
C
#include "common.h"
|
|
|
|
#include <ultra64.h>
|
|
|
|
void __start_copy_global_controller_data(void);
|
|
void __end_copy_global_controller_data(void);
|
|
|
|
s32 __read_controller(OSContPad* data, u32 flags);
|
|
s32 __real_read_controller(void);
|
|
s32 __calls_read_controller_0(s16* arg0);
|
|
|
|
extern void func_8008A354();
|
|
extern void func_8008A37C();
|
|
|
|
extern s32 D_800C4B30;
|
|
extern OSMesgQueue MQ_CONTROLLER;
|
|
extern OSMesgQueue MQ_800E9BF0;
|
|
|
|
INCLUDE_ASM(const s32, "1A660", func_8008A260);
|
|
|
|
// INCLUDE_ASM(const s32, "1A660", func_8008A334);
|
|
extern void func_8008B1D0(u8*);
|
|
extern u8 D_800A9FF8;
|
|
|
|
void func_8008A334(void) {
|
|
func_8008B1D0(&D_800A9FF8);
|
|
}
|
|
|
|
void __start_copy_global_controller_data(void) {
|
|
osSendMesg(&MQ_800E9BF0, NULL, OS_MESG_BLOCK);
|
|
}
|
|
|
|
void __end_copy_global_controller_data(void) {
|
|
osRecvMesg(&MQ_800E9BF0, NULL, OS_MESG_BLOCK);
|
|
}
|
|
|
|
s32 __read_controller(OSContPad* data, u32 flags) {
|
|
s32 res;
|
|
|
|
res = osContStartReadData(&MQ_CONTROLLER);
|
|
if(res != 0)
|
|
return res;
|
|
|
|
osRecvMesg(&MQ_CONTROLLER, NULL, OS_MESG_BLOCK);
|
|
if (!(flags & D_800C4B30)) {
|
|
func_8008A354();
|
|
osContGetReadData(data);
|
|
func_8008A37C();
|
|
return 0;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
extern OSContStatus __GLOBAL_CONT_STATUS[MAXCONTROLLERS];
|
|
extern OSMesgQueue MQ_CONTROLLER;
|
|
|
|
s32 __real_read_controller(void) {
|
|
s32 var_v0;
|
|
|
|
var_v0 = osContStartQuery(&MQ_CONTROLLER);
|
|
if (var_v0 == 0) {
|
|
osRecvMesg(&MQ_CONTROLLER, NULL, OS_MESG_BLOCK);
|
|
osContGetQuery(__GLOBAL_CONT_STATUS);
|
|
return 0;
|
|
} else {
|
|
return var_v0;
|
|
}
|
|
}
|
|
|
|
extern void (*D_800A9FE0)(s16);
|
|
extern OSMesgQueue MQ_800C4A00;
|
|
extern OSContPad __GLOBAL_CONTROLLER_DATA;
|
|
|
|
s32 __calls_read_controller_0(s16* arg0) {
|
|
if (D_800C4B30 == 0) {
|
|
osRecvMesg(&MQ_800C4A00, NULL, 0);
|
|
__read_controller(&__GLOBAL_CONTROLLER_DATA, 1);
|
|
if (D_800A9FE0 != NULL) {
|
|
D_800A9FE0(*arg0);
|
|
}
|
|
osSendMesg(&MQ_800C4A00, 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(&MQ_800C4A00, 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;
|
|
}
|
|
}
|
|
|