diff --git a/src/n64/core/RDP.cpp b/src/n64/core/RDP.cpp index 2cd163de..b7e78d4f 100644 --- a/src/n64/core/RDP.cpp +++ b/src/n64/core/RDP.cpp @@ -41,7 +41,7 @@ auto RDP::Read(u32 addr) const -> u32{ void RDP::Write(MI& mi, Registers& regs, RSP& rsp, u32 addr, u32 val) { switch(addr) { case 0x04100000: - if(dpc.status.startValid) { + if(!dpc.status.startValid) { dpc.start = val & 0xFFFFF8; } dpc.status.startValid = true; @@ -62,8 +62,8 @@ void RDP::Write(MI& mi, Registers& regs, RSP& rsp, u32 addr, u32 val) { void RDP::StatusWrite(MI& mi, Registers& regs, RSP& rsp, u32 val) { DPCStatusWrite temp{}; temp.raw = val; - bool rdpUnfrozen = false; CLEAR_SET(dpc.status.xbusDmemDma, temp.clearXbusDmemDma, temp.setXbusDmemDma); + bool rdpUnfrozen = false; if(temp.clearFreeze) { dpc.status.freeze = false; rdpUnfrozen = true; @@ -71,6 +71,7 @@ void RDP::StatusWrite(MI& mi, Registers& regs, RSP& rsp, u32 val) { if(temp.setFreeze) { dpc.status.freeze = true; + rdpUnfrozen = false; } CLEAR_SET(dpc.status.flush, temp.clearFlush, temp.setFlush); CLEAR_SET(dpc.status.cmdBusy, temp.clearCmd, false); @@ -85,7 +86,6 @@ void RDP::StatusWrite(MI& mi, Registers& regs, RSP& rsp, u32 val) { void RDP::RunCommand(MI& mi, Registers& regs, RSP& rsp) { static int remaining_cmds = 0; - dpc.status.freeze = true; const u32 current = dpc.current & 0xFFFFF8; const u32 end = dpc.end & 0xFFFFF8; @@ -93,6 +93,8 @@ void RDP::RunCommand(MI& mi, Registers& regs, RSP& rsp) { int len = end - current; if(len <= 0) return; + dpc.status.freeze = true; + if(len + (remaining_cmds * 4) <= 0xFFFFF) { if(dpc.status.xbusDmemDma) { for(int i = 0; i < len; i += 4) { @@ -149,11 +151,11 @@ void RDP::RunCommand(MI& mi, Registers& regs, RSP& rsp) { if(processed_all) { remaining_cmds = 0; } - - dpc.current = end; - dpc.status.freeze = false; - dpc.status.cbufReady = true; } + + dpc.current = end; + dpc.status.freeze = false; + dpc.status.cbufReady = true; } void RDP::OnFullSync() { diff --git a/src/n64/core/RDP.hpp b/src/n64/core/RDP.hpp index 3452f97c..0dc002f7 100644 --- a/src/n64/core/RDP.hpp +++ b/src/n64/core/RDP.hpp @@ -26,17 +26,17 @@ union DPCStatusWrite { union DPCStatus { struct { - unsigned xbusDmemDma; - unsigned freeze; - unsigned flush; - unsigned startGclk; - unsigned tmemBusy; - unsigned pipeBusy; - unsigned cmdBusy; - unsigned cbufReady; - unsigned dmaBusy; - unsigned endValid; - unsigned startValid; + unsigned xbusDmemDma:1; + unsigned freeze:1; + unsigned flush:1; + unsigned startGclk:1; + unsigned tmemBusy:1; + unsigned pipeBusy:1; + unsigned cmdBusy:1; + unsigned cbufReady:1; + unsigned dmaBusy:1; + unsigned endValid:1; + unsigned startValid:1; }; u32 raw; };