RDP fixes

This commit is contained in:
CocoSimone
2022-09-20 23:02:50 +02:00
parent 1cfb722a1e
commit 29f3793335
2 changed files with 20 additions and 18 deletions

View File

@@ -41,7 +41,7 @@ auto RDP::Read(u32 addr) const -> u32{
void RDP::Write(MI& mi, Registers& regs, RSP& rsp, u32 addr, u32 val) { void RDP::Write(MI& mi, Registers& regs, RSP& rsp, u32 addr, u32 val) {
switch(addr) { switch(addr) {
case 0x04100000: case 0x04100000:
if(dpc.status.startValid) { if(!dpc.status.startValid) {
dpc.start = val & 0xFFFFF8; dpc.start = val & 0xFFFFF8;
} }
dpc.status.startValid = true; 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) { void RDP::StatusWrite(MI& mi, Registers& regs, RSP& rsp, u32 val) {
DPCStatusWrite temp{}; DPCStatusWrite temp{};
temp.raw = val; temp.raw = val;
bool rdpUnfrozen = false;
CLEAR_SET(dpc.status.xbusDmemDma, temp.clearXbusDmemDma, temp.setXbusDmemDma); CLEAR_SET(dpc.status.xbusDmemDma, temp.clearXbusDmemDma, temp.setXbusDmemDma);
bool rdpUnfrozen = false;
if(temp.clearFreeze) { if(temp.clearFreeze) {
dpc.status.freeze = false; dpc.status.freeze = false;
rdpUnfrozen = true; rdpUnfrozen = true;
@@ -71,6 +71,7 @@ void RDP::StatusWrite(MI& mi, Registers& regs, RSP& rsp, u32 val) {
if(temp.setFreeze) { if(temp.setFreeze) {
dpc.status.freeze = true; dpc.status.freeze = true;
rdpUnfrozen = false;
} }
CLEAR_SET(dpc.status.flush, temp.clearFlush, temp.setFlush); CLEAR_SET(dpc.status.flush, temp.clearFlush, temp.setFlush);
CLEAR_SET(dpc.status.cmdBusy, temp.clearCmd, false); 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) { void RDP::RunCommand(MI& mi, Registers& regs, RSP& rsp) {
static int remaining_cmds = 0; static int remaining_cmds = 0;
dpc.status.freeze = true;
const u32 current = dpc.current & 0xFFFFF8; const u32 current = dpc.current & 0xFFFFF8;
const u32 end = dpc.end & 0xFFFFF8; const u32 end = dpc.end & 0xFFFFF8;
@@ -93,6 +93,8 @@ void RDP::RunCommand(MI& mi, Registers& regs, RSP& rsp) {
int len = end - current; int len = end - current;
if(len <= 0) return; if(len <= 0) return;
dpc.status.freeze = true;
if(len + (remaining_cmds * 4) <= 0xFFFFF) { if(len + (remaining_cmds * 4) <= 0xFFFFF) {
if(dpc.status.xbusDmemDma) { if(dpc.status.xbusDmemDma) {
for(int i = 0; i < len; i += 4) { for(int i = 0; i < len; i += 4) {
@@ -149,11 +151,11 @@ void RDP::RunCommand(MI& mi, Registers& regs, RSP& rsp) {
if(processed_all) { if(processed_all) {
remaining_cmds = 0; 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() { void RDP::OnFullSync() {

View File

@@ -26,17 +26,17 @@ union DPCStatusWrite {
union DPCStatus { union DPCStatus {
struct { struct {
unsigned xbusDmemDma; unsigned xbusDmemDma:1;
unsigned freeze; unsigned freeze:1;
unsigned flush; unsigned flush:1;
unsigned startGclk; unsigned startGclk:1;
unsigned tmemBusy; unsigned tmemBusy:1;
unsigned pipeBusy; unsigned pipeBusy:1;
unsigned cmdBusy; unsigned cmdBusy:1;
unsigned cbufReady; unsigned cbufReady:1;
unsigned dmaBusy; unsigned dmaBusy:1;
unsigned endValid; unsigned endValid:1;
unsigned startValid; unsigned startValid:1;
}; };
u32 raw; u32 raw;
}; };