Fix windows + Implement some RDP reads and writes
This commit is contained in:
@@ -25,25 +25,62 @@ static const int cmd_lens[64] = {
|
||||
|
||||
auto RDP::Read(u32 addr) const -> u32{
|
||||
switch(addr) {
|
||||
case 0x04100000: return dpc.start;
|
||||
case 0x04100004: return dpc.end;
|
||||
case 0x04100008: return dpc.current;
|
||||
case 0x0410000C: return dpc.status.raw;
|
||||
case 0x04100010: return dpc.clock;
|
||||
case 0x04100014: return dpc.status.cmdBusy;
|
||||
case 0x04100018: return dpc.status.pipeBusy;
|
||||
case 0x0410001C: return dpc.tmem;
|
||||
default: util::panic("Unhandled DP Command Registers read (addr: {:08X})\n", addr);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void RDP::Write(u32 addr, u32 val) {
|
||||
void RDP::Write(MI& mi, Registers& regs, RSP& rsp, u32 addr, u32 val) {
|
||||
switch(addr) {
|
||||
case 0x0410000C: StatusWrite(val); break;
|
||||
default: util::panic("Unhandled DP Command Registers read (addr: {:08X}, val: {:08X})\n", addr, val);
|
||||
case 0x04100000:
|
||||
if(dpc.status.startValid) {
|
||||
dpc.start = val & 0xFFFFF8;
|
||||
}
|
||||
dpc.status.startValid = true;
|
||||
break;
|
||||
case 0x04100004:
|
||||
dpc.end = val & 0xFFFFF8;
|
||||
if(dpc.status.startValid) {
|
||||
dpc.current = dpc.start;
|
||||
dpc.status.startValid = false;
|
||||
}
|
||||
RunCommand(mi, regs, rsp);
|
||||
break;
|
||||
case 0x0410000C: StatusWrite(mi, regs, rsp, val); break;
|
||||
default: util::panic("Unhandled DP Command Registers write (addr: {:08X}, val: {:08X})\n", addr, val);
|
||||
}
|
||||
}
|
||||
|
||||
void RDP::StatusWrite(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);
|
||||
CLEAR_SET(dpc.status.freeze, temp.clearFreeze, false); // Setting it seems to break games? Avoid for now (TODO)
|
||||
if(temp.clearFreeze) {
|
||||
dpc.status.freeze = false;
|
||||
rdpUnfrozen = true;
|
||||
}
|
||||
|
||||
if(temp.setFreeze) {
|
||||
dpc.status.freeze = true;
|
||||
}
|
||||
CLEAR_SET(dpc.status.flush, temp.clearFlush, temp.setFlush);
|
||||
CLEAR_SET(dpc.status.cmdBusy, temp.clearCmd, false);
|
||||
CLEAR_SET(dpc.clock, temp.clearClock, false);
|
||||
CLEAR_SET(dpc.status.pipeBusy, temp.clearPipe, false);
|
||||
CLEAR_SET(dpc.status.tmemBusy, temp.clearTmem, false);
|
||||
|
||||
if(rdpUnfrozen) {
|
||||
RunCommand(mi, regs, rsp);
|
||||
}
|
||||
}
|
||||
|
||||
void RDP::RunCommand(MI& mi, Registers& regs, RSP& rsp) {
|
||||
|
||||
Reference in New Issue
Block a user