Fix windows + Implement some RDP reads and writes

This commit is contained in:
CocoSimone
2022-08-22 19:54:56 +02:00
parent 68be852238
commit bcde8570b6
10 changed files with 85 additions and 57 deletions

View File

@@ -5,8 +5,9 @@ add_subdirectory(../../../external/imgui temp)
add_subdirectory(../../../external/nativefiledialog-extended temp1)
find_package(SDL2 REQUIRED)
find_package(fmt REQUIRED)
add_library(frontend-imgui
add_library(frontend-imgui STATIC
Window.cpp
Window.hpp)
@@ -23,4 +24,4 @@ target_include_directories(frontend-imgui PUBLIC
../../../external/parallel-rdp/parallel-rdp-standalone/vulkan
../../../external/parallel-rdp/parallel-rdp-standalone/util
../../../external/parallel-rdp/parallel-rdp-standalone/volk)
target_link_libraries(frontend-imgui PUBLIC SDL2 imgui nfd)
target_link_libraries(frontend-imgui PUBLIC SDL2main SDL2 imgui nfd fmt)

View File

@@ -2,10 +2,10 @@
#include <frontend/App.hpp>
int main(int argc, char* argv[]) {
App app;
App* app = new App;
if(argc > 1) {
app.LoadROM(argv[1]);
app->LoadROM(argv[1]);
}
app.Run();
app->Run();
return 0;
}

View File

@@ -6,6 +6,9 @@ add_subdirectory(cpu)
add_subdirectory(../../../external/parallel-rdp temp)
add_subdirectory(../../../external/capstone temp1)
find_package(fmt REQUIRED)
find_package(SDL2 REQUIRED)
add_library(core
Cpu.hpp
Cpu.cpp
@@ -48,4 +51,7 @@ target_include_directories(core PUBLIC
../../../external/capstone/include
mmio)
target_link_libraries(core PUBLIC cpu parallel-rdp capstone)
target_link_libraries(core PUBLIC SDL2main SDL2 fmt cpu parallel-rdp capstone)
if(WIN32)
endif()

View File

@@ -36,7 +36,7 @@ u32 MMIO::Read(u32 addr) {
void MMIO::Write(Mem& mem, Registers& regs, u32 addr, u32 val) {
switch (addr) {
case 0x04040000 ... 0x040FFFFF: rsp.Write(mem, regs, addr, val); break;
case 0x04100000 ... 0x041FFFFF: rdp.Write(addr, val); break;
case 0x04100000 ... 0x041FFFFF: rdp.Write(mi, regs, rsp, addr, val); break;
case 0x04300000 ... 0x043FFFFF: mi.Write(regs, addr, val); break;
case 0x04400000 ... 0x044FFFFF: vi.Write(mi, regs, addr, val); break;
case 0x04500000 ... 0x045FFFFF: ai.Write(mem, regs, addr, val); break;

View File

@@ -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) {

View File

@@ -46,6 +46,8 @@ struct DPC {
u32 start;
u32 current;
u32 end;
u32 clock;
u32 tmem;
};
struct RDP {
@@ -57,8 +59,8 @@ struct RDP {
std::vector<u8> dram;
[[nodiscard]] auto Read(u32 addr) const -> u32;
void Write(u32 addr, u32 val);
void StatusWrite(u32 val);
void Write(MI& mi, Registers& regs, RSP& rsp, u32 addr, u32 val);
void StatusWrite(MI& mi, Registers& regs, RSP& rsp, u32 val);
void RunCommand(MI& mi, Registers& regs, RSP& rsp);
void OnFullSync();
};

View File

@@ -52,7 +52,7 @@ inline void SetCop0Reg(MI& mi, Registers& regs, RSP& rsp, RDP& rdp, u8 index, u3
rdp.dpc.end = val & 0xFFFFF8;
rdp.RunCommand(mi, regs, rsp);
break;
case 11: rdp.StatusWrite(val); break;
case 11: rdp.StatusWrite(mi, regs, rsp, val); break;
default: util::panic("Unhandled RSP COP0 register write at index {}\n", index);
}
}