From ba2acaeb5c2a01db64abd9ec60f947381f5f452a Mon Sep 17 00:00:00 2001 From: Wiseguy <68165316+Mr-Wiseguy@users.noreply.github.com> Date: Sun, 29 Jun 2025 22:04:54 -0400 Subject: [PATCH] Fix unplugged controller memory writes, add some missing math routines, and slightly weaken DMA alignment requirements (#117) --------- Co-authored-by: LittleCube --- librecomp/src/cont.cpp | 10 ++++++---- librecomp/src/math_routines.cpp | 32 ++++++++++++++++++++++++++++++++ librecomp/src/pi.cpp | 1 - 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/librecomp/src/cont.cpp b/librecomp/src/cont.cpp index d96f9f3..7ad6c21 100644 --- a/librecomp/src/cont.cpp +++ b/librecomp/src/cont.cpp @@ -50,10 +50,12 @@ extern "C" void osContGetReadData_recomp(uint8_t* rdram, recomp_context* ctx) { 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; + if (dummy_data[controller].err_no == 0) { + 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; + } } } diff --git a/librecomp/src/math_routines.cpp b/librecomp/src/math_routines.cpp index 2bd21ce..4d6a01d 100644 --- a/librecomp/src/math_routines.cpp +++ b/librecomp/src/math_routines.cpp @@ -80,3 +80,35 @@ extern "C" void __ull_to_f_recomp(uint8_t * rdram, recomp_context * ctx) { ctx->f0.fl = ret; } + +extern "C" void __ull_rshift_recomp(uint8_t * rdram, recomp_context * ctx) { + uint64_t a = (ctx->r4 << 32) | ((ctx->r5 << 0) & 0xFFFFFFFFu); + uint64_t b = (ctx->r6 << 32) | ((ctx->r7 << 0) & 0xFFFFFFFFu); + uint64_t ret = a >> b; + + ctx->r2 = (int32_t)(ret >> 32); + ctx->r3 = (int32_t)(ret >> 0); +} + +extern "C" void __ll_to_f_recomp(uint8_t * rdram, recomp_context * ctx) { + int64_t a = (ctx->r4 << 32) | ((ctx->r5 << 0) & 0xFFFFFFFFu); + float ret = (float)a; + + ctx->f0.fl = ret; +} + +extern "C" void __f_to_ll_recomp(uint8_t * rdram, recomp_context * ctx) { + int64_t ret = (int64_t)ctx->f12.fl; + + ctx->r2 = (int32_t)(ret >> 32); + ctx->r3 = (int32_t)(ret >> 0); +} + +extern "C" void __ll_lshift_recomp(uint8_t * rdram, recomp_context * ctx) { + uint64_t a = (ctx->r4 << 32) | ((ctx->r5 << 0) & 0xFFFFFFFFu); + uint64_t b = (ctx->r6 << 32) | ((ctx->r7 << 0) & 0xFFFFFFFFu); + uint64_t ret = a << b; + + ctx->r2 = (int32_t)(ret >> 32); + ctx->r3 = (int32_t)(ret >> 0); +} diff --git a/librecomp/src/pi.cpp b/librecomp/src/pi.cpp index dcfed71..d7ebd53 100644 --- a/librecomp/src/pi.cpp +++ b/librecomp/src/pi.cpp @@ -67,7 +67,6 @@ void recomp::do_rom_read(uint8_t* rdram, gpr ram_address, uint32_t physical_addr // TODO handle misaligned DMA assert((physical_addr & 0x1) == 0 && "Only PI DMA from aligned ROM addresses is currently supported"); assert((ram_address & 0x7) == 0 && "Only PI DMA to aligned RDRAM addresses is currently supported"); - assert((num_bytes & 0x1) == 0 && "Only PI DMA with aligned sizes is currently supported"); uint8_t* rom_addr = rom.data() + physical_addr - recomp::rom_base; for (size_t i = 0; i < num_bytes; i++) { MEM_B(i, ram_address) = *rom_addr;