From c6afd5c811634e3cad057f4c89b77664ad3ce377 Mon Sep 17 00:00:00 2001 From: angie Date: Thu, 6 Jun 2024 19:42:37 -0400 Subject: [PATCH] Fix osContGetReadData --- librecomp/src/cont.cpp | 13 ++++++++++++- ultramodern/include/ultramodern/ultra64.h | 9 +++------ ultramodern/src/input.cpp | 4 +--- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/librecomp/src/cont.cpp b/librecomp/src/cont.cpp index 0ca9686..8e15c83 100644 --- a/librecomp/src/cont.cpp +++ b/librecomp/src/cont.cpp @@ -2,6 +2,8 @@ #include "helpers.hpp" +#define MAXCONTROLLERS 4 + extern "C" void recomp_set_current_frame_poll_id(uint8_t* rdram, recomp_context* ctx) { // TODO reimplement the system for tagging polls with IDs to handle games with multithreaded input polling. } @@ -40,7 +42,16 @@ extern "C" void osContStartReadData_recomp(uint8_t* rdram, recomp_context* ctx) extern "C" void osContGetReadData_recomp(uint8_t* rdram, recomp_context* ctx) { PTR(OSContPad) data = _arg<0, PTR(OSContPad)>(rdram, ctx); - osContGetReadData(PASS_RDRAM data); + OSContPad dummy_data[MAXCONTROLLERS]; + + osContGetReadData(dummy_data); + + for (int controller = 0; controller < MAXCONTROLLERS; controller++) { + MEM_H(6 * controller + 0, data) = dummy_data[controller].button; + MEM_B(6 * controller + 2, data) = dummy_data[controller].stick_x; + MEM_B(6 * controller + 3, data) = dummy_data[controller].stick_y; + MEM_B(6 * controller + 4, data) = dummy_data[controller].err_no; + } } extern "C" void osContStartQuery_recomp(uint8_t * rdram, recomp_context * ctx) { diff --git a/ultramodern/include/ultramodern/ultra64.h b/ultramodern/include/ultramodern/ultra64.h index a737a45..ef9a86a 100644 --- a/ultramodern/include/ultramodern/ultra64.h +++ b/ultramodern/include/ultramodern/ultra64.h @@ -246,12 +246,9 @@ typedef struct { } OSContStatus; typedef struct { - // These three members reversed due to endianness - s8 stick_y; /* -80 <= stick_y <= 80 */ - s8 stick_x; /* -80 <= stick_x <= 80 */ u16 button; - // Padding due to endianness - u8 padding[3]; + s8 stick_x; /* -80 <= stick_x <= 80 */ + s8 stick_y; /* -80 <= stick_y <= 80 */ u8 err_no; } OSContPad; @@ -305,7 +302,7 @@ s32 osContStartQuery(RDRAM_ARG PTR(OSMesgQueue)); s32 osContStartReadData(RDRAM_ARG PTR(OSMesgQueue)); s32 osContSetCh(RDRAM_ARG u8); void osContGetQuery(RDRAM_ARG PTR(OSContStatus)); -void osContGetReadData(RDRAM_ARG PTR(OSContPad)); +void osContGetReadData(OSContPad *); /* Rumble PAK interface */ diff --git a/ultramodern/src/input.cpp b/ultramodern/src/input.cpp index ef34e5b..cf77096 100644 --- a/ultramodern/src/input.cpp +++ b/ultramodern/src/input.cpp @@ -128,9 +128,7 @@ extern "C" void osContGetQuery(RDRAM_ARG PTR(OSContStatus) data_) { __osContGetInitData(&pattern, data); } -extern "C" void osContGetReadData(RDRAM_ARG PTR(OSContPad) data_) { - OSContPad *data = TO_PTR(OSContPad, data_); - +extern "C" void osContGetReadData(OSContPad *data) { for (int controller = 0; controller < max_controllers; controller++) { uint16_t buttons = 0; float x = 0.0f;