Fixed a bunch of the RSP, now Mario 64 correctly shows graphcis

This commit is contained in:
CocoSimone
2022-10-16 23:07:25 +02:00
parent 932275ab32
commit 7aa019fac1
3 changed files with 30 additions and 18 deletions

View File

@@ -171,7 +171,7 @@ void LoadParallelRDP(const u8* rdram, SDL_Window* window) {
aligned_rdram -= offset; aligned_rdram -= offset;
} }
CommandProcessorFlags flags = COMMAND_PROCESSOR_FLAG_UPSCALING_4X_BIT; CommandProcessorFlags flags = COMMAND_PROCESSOR_FLAG_UPSCALING_2X_BIT;
command_processor = new CommandProcessor(wsi->get_device(), reinterpret_cast<void *>(aligned_rdram), command_processor = new CommandProcessor(wsi->get_device(), reinterpret_cast<void *>(aligned_rdram),
offset, 8 * 1024 * 1024, 4 * 1024 * 1024, flags); offset, 8 * 1024 * 1024, 4 * 1024 * 1024, flags);

View File

@@ -170,7 +170,7 @@ void RDP::RunCommand(MI& mi, Registers& regs, RSP& rsp) {
while (buf_index < word_len) { while (buf_index < word_len) {
u8 cmd = (cmd_buf[buf_index] >> 24) & 0x3F; u8 cmd = (cmd_buf[buf_index] >> 24) & 0x3F;
logCommand(cmd); //logCommand(cmd);
int cmd_len = cmd_lens[cmd]; int cmd_len = cmd_lens[cmd];
if ((buf_index + cmd_len) * 4 > len + (remaining_cmds * 4)) { if ((buf_index + cmd_len) * 4 > len + (remaining_cmds * 4)) {

View File

@@ -36,10 +36,14 @@ inline auto GetCop0Reg(RSP& rsp, RDP& rdp, u8 index) -> u32{
case 5: return rsp.spStatus.dmaFull; case 5: return rsp.spStatus.dmaFull;
case 6: return rsp.spStatus.dmaBusy; case 6: return rsp.spStatus.dmaBusy;
case 7: return AcquireSemaphore(rsp); case 7: return AcquireSemaphore(rsp);
case 8: return rdp.dpc.start;
case 9: return rdp.dpc.end; case 9: return rdp.dpc.end;
case 10: return rdp.dpc.current; case 10: return rdp.dpc.current;
case 11: return rdp.dpc.status.raw; case 11: return rdp.dpc.status.raw;
case 12: return rdp.dpc.clock; case 12: return rdp.dpc.clock;
case 13: return rdp.dpc.status.cmdBusy;
case 14: return rdp.dpc.status.pipeBusy;
case 15: return rdp.dpc.status.tmemBusy;
default: util::panic("Unhandled RSP COP0 register read at index {}\n", index); default: util::panic("Unhandled RSP COP0 register read at index {}\n", index);
} }
} }
@@ -75,14 +79,14 @@ inline void SetCop0Reg(Registers& regs, Mem& mem, u8 index, u32 val) {
inline VPR Broadcast(const VPR& vt, int l0, int l1, int l2, int l3, int l4, int l5, int l6, int l7) { inline VPR Broadcast(const VPR& vt, int l0, int l1, int l2, int l3, int l4, int l5, int l6, int l7) {
VPR vte{}; VPR vte{};
vte.element[ELEMENT_INDEX(0)] = vt.element[l0]; vte.element[ELEMENT_INDEX(0)] = vt.element[ELEMENT_INDEX(l0)];
vte.element[ELEMENT_INDEX(1)] = vt.element[l1]; vte.element[ELEMENT_INDEX(1)] = vt.element[ELEMENT_INDEX(l1)];
vte.element[ELEMENT_INDEX(2)] = vt.element[l2]; vte.element[ELEMENT_INDEX(2)] = vt.element[ELEMENT_INDEX(l2)];
vte.element[ELEMENT_INDEX(3)] = vt.element[l3]; vte.element[ELEMENT_INDEX(3)] = vt.element[ELEMENT_INDEX(l3)];
vte.element[ELEMENT_INDEX(4)] = vt.element[l4]; vte.element[ELEMENT_INDEX(4)] = vt.element[ELEMENT_INDEX(l4)];
vte.element[ELEMENT_INDEX(5)] = vt.element[l5]; vte.element[ELEMENT_INDEX(5)] = vt.element[ELEMENT_INDEX(l5)];
vte.element[ELEMENT_INDEX(6)] = vt.element[l6]; vte.element[ELEMENT_INDEX(6)] = vt.element[ELEMENT_INDEX(l6)];
vte.element[ELEMENT_INDEX(7)] = vt.element[l7]; vte.element[ELEMENT_INDEX(7)] = vt.element[ELEMENT_INDEX(l7)];
return vte; return vte;
} }
@@ -841,7 +845,9 @@ void RSP::vmudn(u32 instr) {
VPR& vd = vpr[VD(instr)]; VPR& vd = vpr[VD(instr)];
VPR vte = GetVTE(vpr[VT(instr)], e); VPR vte = GetVTE(vpr[VT(instr)], e);
for(int i = 0; i < 8; i++) { for(int i = 0; i < 8; i++) {
s32 prod = vs.element[i] * vte.selement[i]; s16 op1 = vte.element[i];
u16 op2 = vs.element[i];
s32 prod = op1 * op2;
s64 accum = prod; s64 accum = prod;
SetACC(i, accum); SetACC(i, accum);
@@ -864,9 +870,15 @@ void RSP::vmadh(u32 instr) {
VPR& vd = vpr[VD(instr)]; VPR& vd = vpr[VD(instr)];
VPR vte = GetVTE(vpr[VT(instr)], e); VPR vte = GetVTE(vpr[VT(instr)], e);
for(int i = 0; i < 8; i++) { for(int i = 0; i < 8; i++) {
s32 prod = vs.selement[i] * vte.selement[i]; s16 op1 = vte.element[i];
s64 accum = GetACC(i) + ((u64)prod << 16); s16 op2 = vs.element[i];
s32 prod = op1 * op2;
u32 unsProd = prod;
u64 accumDelta = (u64)unsProd << 16;
s64 accum = GetACC(i) + accumDelta;
SetACC(i, accum); SetACC(i, accum);
accum = GetACC(i);
s16 result = signedClamp(accum >> 16); s16 result = signedClamp(accum >> 16);
@@ -885,7 +897,7 @@ void RSP::vmadl(u32 instr) {
u64 op2 = vs.element[i]; u64 op2 = vs.element[i];
u64 prod = op1 * op2; u64 prod = op1 * op2;
u64 accDelta = prod >> 16; u64 accDelta = prod >> 16;
u16 accum = GetACC(i) + accDelta; u64 accum = GetACC(i) + accDelta;
SetACC(i, accum); SetACC(i, accum);
@@ -1064,7 +1076,7 @@ inline u32 rcp(s32 sinput) {
return result; return result;
} }
inline u32 rsq(s32 input) { inline u32 rsq(u32 input) {
if (input == 0) { if (input == 0) {
return 0x7FFFFFFF; return 0x7FFFFFFF;
} else if (input == 0xFFFF8000) { } else if (input == 0xFFFF8000) {
@@ -1135,10 +1147,10 @@ void RSP::vrsq(u32 instr) {
VPR& vt = vpr[VT(instr)]; VPR& vt = vpr[VT(instr)];
VPR vte = GetVTE(vpr[VT(instr)], E2(instr)); VPR vte = GetVTE(vpr[VT(instr)], E2(instr));
int e = E2(instr) & 7; int e = E2(instr) & 7;
int de = DE(instr) & 7; int de = VS(instr) & 7;
s32 input = vt.selement[ELEMENT_INDEX(e)]; s32 input = vt.selement[ELEMENT_INDEX(e)];
s32 result = rsq(input); u32 result = rsq(input);
vd.element[ELEMENT_INDEX(de)] = result; vd.element[ELEMENT_INDEX(de)] = result & 0xFFFF;
divOut = result >> 16; divOut = result >> 16;
divInLoaded = false; divInLoaded = false;