Skip to content

Commit ba2acae

Browse files
Fix unplugged controller memory writes, add some missing math routines, and slightly weaken DMA alignment requirements (#117)
--------- Co-authored-by: LittleCube <[email protected]>
1 parent 94b30d7 commit ba2acae

File tree

3 files changed

+38
-5
lines changed

3 files changed

+38
-5
lines changed

librecomp/src/cont.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,12 @@ extern "C" void osContGetReadData_recomp(uint8_t* rdram, recomp_context* ctx) {
5050
osContGetReadData(dummy_data);
5151

5252
for (int controller = 0; controller < MAXCONTROLLERS; controller++) {
53-
MEM_H(6 * controller + 0, data) = dummy_data[controller].button;
54-
MEM_B(6 * controller + 2, data) = dummy_data[controller].stick_x;
55-
MEM_B(6 * controller + 3, data) = dummy_data[controller].stick_y;
56-
MEM_B(6 * controller + 4, data) = dummy_data[controller].err_no;
53+
if (dummy_data[controller].err_no == 0) {
54+
MEM_H(6 * controller + 0, data) = dummy_data[controller].button;
55+
MEM_B(6 * controller + 2, data) = dummy_data[controller].stick_x;
56+
MEM_B(6 * controller + 3, data) = dummy_data[controller].stick_y;
57+
MEM_B(6 * controller + 4, data) = dummy_data[controller].err_no;
58+
}
5759
}
5860
}
5961

librecomp/src/math_routines.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,3 +80,35 @@ extern "C" void __ull_to_f_recomp(uint8_t * rdram, recomp_context * ctx) {
8080

8181
ctx->f0.fl = ret;
8282
}
83+
84+
extern "C" void __ull_rshift_recomp(uint8_t * rdram, recomp_context * ctx) {
85+
uint64_t a = (ctx->r4 << 32) | ((ctx->r5 << 0) & 0xFFFFFFFFu);
86+
uint64_t b = (ctx->r6 << 32) | ((ctx->r7 << 0) & 0xFFFFFFFFu);
87+
uint64_t ret = a >> b;
88+
89+
ctx->r2 = (int32_t)(ret >> 32);
90+
ctx->r3 = (int32_t)(ret >> 0);
91+
}
92+
93+
extern "C" void __ll_to_f_recomp(uint8_t * rdram, recomp_context * ctx) {
94+
int64_t a = (ctx->r4 << 32) | ((ctx->r5 << 0) & 0xFFFFFFFFu);
95+
float ret = (float)a;
96+
97+
ctx->f0.fl = ret;
98+
}
99+
100+
extern "C" void __f_to_ll_recomp(uint8_t * rdram, recomp_context * ctx) {
101+
int64_t ret = (int64_t)ctx->f12.fl;
102+
103+
ctx->r2 = (int32_t)(ret >> 32);
104+
ctx->r3 = (int32_t)(ret >> 0);
105+
}
106+
107+
extern "C" void __ll_lshift_recomp(uint8_t * rdram, recomp_context * ctx) {
108+
uint64_t a = (ctx->r4 << 32) | ((ctx->r5 << 0) & 0xFFFFFFFFu);
109+
uint64_t b = (ctx->r6 << 32) | ((ctx->r7 << 0) & 0xFFFFFFFFu);
110+
uint64_t ret = a << b;
111+
112+
ctx->r2 = (int32_t)(ret >> 32);
113+
ctx->r3 = (int32_t)(ret >> 0);
114+
}

librecomp/src/pi.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ void recomp::do_rom_read(uint8_t* rdram, gpr ram_address, uint32_t physical_addr
6767
// TODO handle misaligned DMA
6868
assert((physical_addr & 0x1) == 0 && "Only PI DMA from aligned ROM addresses is currently supported");
6969
assert((ram_address & 0x7) == 0 && "Only PI DMA to aligned RDRAM addresses is currently supported");
70-
assert((num_bytes & 0x1) == 0 && "Only PI DMA with aligned sizes is currently supported");
7170
uint8_t* rom_addr = rom.data() + physical_addr - recomp::rom_base;
7271
for (size_t i = 0; i < num_bytes; i++) {
7372
MEM_B(i, ram_address) = *rom_addr;

0 commit comments

Comments
 (0)