From 13c32cd8d98f982bf8b438d56af2ce89edd17ab5 Mon Sep 17 00:00:00 2001 From: CocoSimone Date: Sat, 17 Sep 2022 17:44:35 +0200 Subject: [PATCH] update prdp --- .gitmodules | 12 ++++++------ external/parallel-rdp/parallel-rdp-standalone | 2 +- src/n64/core/Mem.cpp | 4 ++-- src/n64/core/RSP.cpp | 10 ++++++---- src/n64/core/RSP.hpp | 4 ++-- src/n64/core/cpu/instructions.cpp | 2 +- src/n64/core/cpu/registers/Cop0.cpp | 4 ++-- src/n64/core/rsp/instructions.cpp | 4 ++++ 8 files changed, 24 insertions(+), 18 deletions(-) diff --git a/.gitmodules b/.gitmodules index aa478637..cad9a047 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,10 +1,10 @@ -[submodule "external/parallel-rdp/parallel-rdp-standalone"] - path = external/parallel-rdp/parallel-rdp-standalone - url = https://github.com/Themaister/parallel-rdp-standalone/ -[submodule "external/nativefiledialog-extended"] - path = external/nativefiledialog-extended - url = https://github.com/btzy/nativefiledialog-extended [submodule "external/capstone"] path = external/capstone url = https://github.com/capstone-engine/capstone/ branch = next +[submodule "external/nativefiledialog-extended"] + path = external/nativefiledialog-extended + url = https://github.com/btzy/nativefiledialog-extended/ +[submodule "external/parallel-rdp/parallel-rdp-standalone"] + path = external/parallel-rdp/parallel-rdp-standalone + url = https://github.com/CocoSimone/parallel-rdp-standalone/ diff --git a/external/parallel-rdp/parallel-rdp-standalone b/external/parallel-rdp/parallel-rdp-standalone index e60b4d51..18215758 160000 --- a/external/parallel-rdp/parallel-rdp-standalone +++ b/external/parallel-rdp/parallel-rdp-standalone @@ -1 +1 @@ -Subproject commit e60b4d51ac109f53ab4510b474024aee95f42d96 +Subproject commit 18215758618a939a42d7b099af6e913a84fb4467 diff --git a/src/n64/core/Mem.cpp b/src/n64/core/Mem.cpp index ae9dd8f2..170f64ff 100644 --- a/src/n64/core/Mem.cpp +++ b/src/n64/core/Mem.cpp @@ -122,7 +122,7 @@ T Mem::Read(Registers& regs, u32 vaddr, s64 pc) { case 0x04200000 ... 0x042FFFFF: case 0x04900000 ... 0x07FFFFFF: case 0x08000000 ... 0x0FFFFFFF: case 0x80000000 ... 0xFFFFFFFF: case 0x1FC00800 ... 0x7FFFFFFF: return 0; - default: util::panic("Unimplemented {}-bit read at address {:08X} (PC = {:016X})\n", sizeof(T) * 8, paddr, regs.pc); + default: util::panic("Unimplemented {}-bit read at address {:08X} (PC = {:016X})\n", sizeof(T) * 8, paddr, (u64)regs.pc); } return 0; } @@ -208,7 +208,7 @@ void Mem::Write(Registers& regs, u32 vaddr, T val, s64 pc) { case 0x04200000 ... 0x042FFFFF: case 0x04900000 ... 0x07FFFFFF: case 0x08000000 ... 0x0FFFFFFF: case 0x1FC00800 ... 0x7FFFFFFF: case 0x80000000 ... 0xFFFFFFFF: break; - default: util::panic("Unimplemented {}-bit write at address {:08X} with value {:0X} (PC = {:016X})\n", sizeof(T) * 8, paddr, val, regs.pc); + default: util::panic("Unimplemented {}-bit write at address {:08X} with value {:0X} (PC = {:016X})\n", sizeof(T) * 8, paddr, val, (u64)regs.pc); } } diff --git a/src/n64/core/RSP.cpp b/src/n64/core/RSP.cpp index 828479d4..22643c89 100644 --- a/src/n64/core/RSP.cpp +++ b/src/n64/core/RSP.cpp @@ -9,7 +9,7 @@ RSP::RSP() { } void RSP::Reset() { - spStatus.raw = 0; + spStatus.raw = 0x1; spStatus.halt = true; oldPC = 0; pc = 0; @@ -102,9 +102,11 @@ void RSP::Write(Mem& mem, Registers& regs, u32 addr, u32 value) { case 0x04040010: { auto write = SPStatusWrite{.raw = value}; CLEAR_SET(spStatus.halt, write.clearHalt, write.setHalt); - CLEAR_SET(spStatus.broke, write.clearBroke, false); - if(write.clearIntr) InterruptLower(mi, regs, Interrupt::SP); - if(write.setIntr) InterruptRaise(mi, regs, Interrupt::SP); + if(write.clearBroke) spStatus.broke = false; + if(write.clearIntr && !write.setIntr) + InterruptLower(mi, regs, Interrupt::SP); + if(write.setIntr && !write.clearIntr) + InterruptRaise(mi, regs, Interrupt::SP); CLEAR_SET(spStatus.singleStep, write.clearSstep, write.setSstep); CLEAR_SET(spStatus.interruptOnBreak, write.clearIntrOnBreak, write.setIntrOnBreak); CLEAR_SET(spStatus.signal0Set, write.clearSignal0, write.setSignal0); diff --git a/src/n64/core/RSP.hpp b/src/n64/core/RSP.hpp index c4aa0e88..52a9ad77 100644 --- a/src/n64/core/RSP.hpp +++ b/src/n64/core/RSP.hpp @@ -102,8 +102,8 @@ struct Registers; #define DE(x) (((x) >> 11) & 0x1F) #define CLEAR_SET(val, clear, set) do { \ - if(clear) (val) = 0; \ - if(set) (val) = 1; \ + if(clear && !set) (val) = 0; \ + if(set && !clear) (val) = 1; \ } while(0) struct RSP { diff --git a/src/n64/core/cpu/instructions.cpp b/src/n64/core/cpu/instructions.cpp index 1135f3f6..a3c6a33e 100644 --- a/src/n64/core/cpu/instructions.cpp +++ b/src/n64/core/cpu/instructions.cpp @@ -321,7 +321,7 @@ void Cpu::sc(Mem& mem, u32 instr) { mem.Write(regs, address, regs.gpr[RT(instr)], regs.oldPC); } - regs.gpr[RT(instr)] = (s64)((u64)regs.cop0.llbit); + regs.gpr[RT(instr)] = (u64)regs.cop0.llbit; regs.cop0.llbit = false; } diff --git a/src/n64/core/cpu/registers/Cop0.cpp b/src/n64/core/cpu/registers/Cop0.cpp index 30e5961a..7731aeba 100644 --- a/src/n64/core/cpu/registers/Cop0.cpp +++ b/src/n64/core/cpu/registers/Cop0.cpp @@ -136,10 +136,10 @@ void Cop0::SetReg64(u8 addr, u64 value) { case COP0_REG_ENTRYLO0: entryLo0.raw = value & ENTRY_LO_MASK; break; case COP0_REG_ENTRYLO1: entryLo1.raw = value & ENTRY_LO_MASK; break; case COP0_REG_CONTEXT: - context.raw = (((s64)(s32)value) & 0xFFFFFFFFFF800000) | (context.raw & 0x7FFFFF); + context.raw = (value & 0xFFFFFFFFFF800000) | (context.raw & 0x7FFFFF); break; case COP0_REG_XCONTEXT: - context.raw = (((s64)(s32)value) & 0xFFFFFFFE00000000) | (xcontext.raw & 0x1FFFFFFFF); + xcontext.raw = (value & 0xFFFFFFFE00000000) | (xcontext.raw & 0x1FFFFFFFF); break; case COP0_REG_ENTRYHI: entryHi.raw = value & ENTRY_HI_MASK; break; case COP0_REG_STATUS: status.raw = value; break; diff --git a/src/n64/core/rsp/instructions.cpp b/src/n64/core/rsp/instructions.cpp index 8cac1956..efe75899 100644 --- a/src/n64/core/rsp/instructions.cpp +++ b/src/n64/core/rsp/instructions.cpp @@ -18,6 +18,10 @@ inline void ReleaseSemaphore(RSP& rsp) { inline auto GetCop0Reg(RSP& rsp, RDP& rdp, u8 index) -> u32{ switch(index) { + case 0: return rsp.spDMASPAddr.raw; + case 1: return rsp.spDMADRAMAddr.raw; + case 2: return rsp.spDMARDLen.raw; + case 3: return rsp.spDMAWRLen.raw; case 4: return rsp.spStatus.raw; case 5: return rsp.spStatus.dmaFull; case 6: return 0;