From 88e48bdcff7f29086608892df4a0c6abea0887e7 Mon Sep 17 00:00:00 2001 From: LittleCube Date: Tue, 24 Jun 2025 18:03:35 -0400 Subject: [PATCH 1/3] add back dkr math routines --- librecomp/src/math_routines.cpp | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/librecomp/src/math_routines.cpp b/librecomp/src/math_routines.cpp index 2bd21ced..bb1f2073 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) {Add commentMore actions + 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); +} From 9770110c600709b03f62b7608105973dbe419f1e Mon Sep 17 00:00:00 2001 From: LittleCube Date: Fri, 27 Jun 2025 04:34:46 -0400 Subject: [PATCH 2/3] dkr fixes --- librecomp/src/math_routines.cpp | 2 +- librecomp/src/pi.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/librecomp/src/math_routines.cpp b/librecomp/src/math_routines.cpp index bb1f2073..4d6a01db 100644 --- a/librecomp/src/math_routines.cpp +++ b/librecomp/src/math_routines.cpp @@ -81,7 +81,7 @@ 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) {Add commentMore actions +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; diff --git a/librecomp/src/pi.cpp b/librecomp/src/pi.cpp index dcfed714..d7ebd53b 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; From 17afeaee6528195e620b7a9e0f2d2bd996148bd5 Mon Sep 17 00:00:00 2001 From: Mr-Wiseguy Date: Sun, 29 Jun 2025 21:48:04 -0400 Subject: [PATCH 3/3] Fix unplugged controller members being written to --- librecomp/src/cont.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/librecomp/src/cont.cpp b/librecomp/src/cont.cpp index d96f9f39..7ad6c21e 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; + } } }