Refactor Parallel RDP wrapper

This commit is contained in:
Simone
2024-05-14 12:15:27 +02:00
parent 5f2dc06236
commit 02d1f888d8
16 changed files with 171 additions and 137 deletions

View File

@@ -6,15 +6,12 @@ namespace n64 {
struct BaseCPU {
virtual ~BaseCPU() = default;
virtual int Step() = 0;
virtual void Reset() {
regs.Reset();
mem.Reset();
}
virtual void Reset() = 0;
virtual bool ShouldServiceInterrupt() = 0;
virtual void CheckCompareInterrupt() = 0;
virtual std::vector<u8> Serialize() = 0;
virtual void Deserialize(const std::vector<u8>&) = 0;
Registers regs;
Mem mem{regs};
virtual Mem& GetMem() = 0;
virtual Registers& GetRegs() = 0;
};
}

View File

@@ -1,6 +1,7 @@
#include <Core.hpp>
namespace n64 {
Interpreter::Interpreter(ParallelRDP& parallel) : mem(regs, parallel) { }
bool Interpreter::ShouldServiceInterrupt() {
bool interrupts_pending = (regs.cop0.status.im & regs.cop0.cause.interruptPending) != 0;

View File

@@ -5,11 +5,25 @@
namespace n64 {
struct Core;
struct Interpreter : BaseCPU {
Interpreter() = default;
struct Interpreter final : BaseCPU {
explicit Interpreter(ParallelRDP&);
~Interpreter() override = default;
int Step() override;
void Reset() override {
regs.Reset();
mem.Reset();
}
Mem& GetMem() override {
return mem;
}
Registers& GetRegs() override {
return regs;
}
private:
Registers regs;
Mem mem;
u64 cop2Latch{};
friend struct Cop1;
#define check_address_error(mask, vaddr) (((!regs.cop0.is64BitAddressing) && (s32)(vaddr) != (vaddr)) || (((vaddr) & (mask)) != 0))

View File

@@ -8,12 +8,14 @@
#include <core/RSP.hpp>
#include <core/RDP.hpp>
class ParallelRDP;
namespace n64 {
struct Mem;
struct Registers;
struct MMIO {
MMIO(Mem& mem, Registers& regs) : vi(mem, regs), mi(regs), ai(mem, regs), pi(mem, regs), si(mem, regs), rsp(mem, regs), rdp(mem, regs) {}
MMIO(Mem& mem, Registers& regs, ParallelRDP& parallel) : vi(mem, regs), mi(regs), ai(mem, regs), pi(mem, regs), si(mem, regs), rsp(mem, regs), rdp(mem, regs, parallel) {}
void Reset();
VI vi;

View File

@@ -8,7 +8,7 @@
#include <cassert>
namespace n64 {
Mem::Mem(Registers& regs) : flash(saveData), mmio(*this, regs) {
Mem::Mem(Registers& regs, ParallelRDP& parallel) : flash(saveData), mmio(*this, regs, parallel) {
memset(readPages, 0, PAGE_COUNT);
memset(writePages, 0, PAGE_COUNT);

View File

@@ -81,7 +81,7 @@ struct Flash {
struct Mem {
~Mem() = default;
Mem(Registers&);
Mem(Registers&, ParallelRDP&);
void Reset();
void LoadSRAM(SaveType, fs::path);
static std::vector<u8> OpenROM(const std::string&, size_t&);

View File

@@ -5,7 +5,7 @@
#include <core/mmio/Interrupt.hpp>
namespace n64 {
RDP::RDP(Mem& mem, Registers& regs) : mem(mem), regs(regs) {
RDP::RDP(Mem& mem, Registers& regs, ParallelRDP& parallel) : mem(mem), regs(regs), parallel(parallel) {
rdram.resize(RDRAM_SIZE);
memset(cmd_buf, 0, 0x100000);
dpc.status.raw = 0x80;
@@ -177,7 +177,7 @@ void RDP::RunCommand() {
}
if (cmd >= 8) {
ParallelRdpEnqueueCommand(cmd_len, &cmd_buf[buf_index]);
parallel.EnqueueCommand(cmd_len, &cmd_buf[buf_index]);
}
if (cmd == 0x29) {
@@ -199,7 +199,7 @@ void RDP::RunCommand() {
}
void RDP::OnFullSync() {
ParallelRdpOnFullSync();
parallel.OnFullSync();
dpc.status.pipeBusy = false;
dpc.status.startGclk = false;

View File

@@ -2,6 +2,8 @@
#include <common.hpp>
#include <vector>
class ParallelRDP;
namespace n64 {
struct RSP;
@@ -54,7 +56,7 @@ struct RDP {
DPC dpc{};
u32 cmd_buf[0xFFFFF]{};
RDP(Mem&, Registers&);
RDP(Mem&, Registers&, ParallelRDP&);
void Reset();
std::vector<u8> rdram{};
@@ -82,5 +84,6 @@ struct RDP {
private:
Mem& mem;
Registers& regs;
ParallelRDP& parallel;
};
} // backend