RDP fixes
This commit is contained in:
@@ -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,12 +151,12 @@ 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.current = end;
|
||||||
dpc.status.freeze = false;
|
dpc.status.freeze = false;
|
||||||
dpc.status.cbufReady = true;
|
dpc.status.cbufReady = true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void RDP::OnFullSync() {
|
void RDP::OnFullSync() {
|
||||||
ParallelRdpOnFullSync();
|
ParallelRdpOnFullSync();
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user