Files
kaizen/src/backend/core/RDP.hpp
2024-08-27 21:35:07 +02:00

98 lines
1.7 KiB
C++

#pragma once
#include <common.hpp>
#include <vector>
class ParallelRDP;
namespace n64 {
struct RSP;
struct Mem;
struct Registers;
union DPCStatusWrite {
u32 raw;
struct {
unsigned clearXbusDmemDma : 1;
unsigned setXbusDmemDma : 1;
unsigned clearFreeze : 1;
unsigned setFreeze : 1;
unsigned clearFlush : 1;
unsigned setFlush : 1;
unsigned clearTmem : 1;
unsigned clearPipe : 1;
unsigned clearCmd : 1;
unsigned clearClock : 1;
};
};
union DPCStatus {
struct {
unsigned xbusDmemDma : 1;
unsigned freeze : 1;
unsigned flush : 1;
unsigned startGclk : 1;
unsigned tmemBusy : 1;
unsigned pipeBusy : 1;
unsigned cmdBusy : 1;
unsigned cbufReady : 1;
unsigned dmaBusy : 1;
unsigned endValid : 1;
unsigned startValid : 1;
};
u32 raw;
};
struct DPC {
DPCStatus status;
u32 start;
u32 current;
u32 end;
u32 clock;
u32 tmem;
};
struct RDP {
DPC dpc{};
u32 cmd_buf[0xFFFFF]{};
RDP(Mem &, ParallelRDP &);
void Reset();
[[nodiscard]] auto Read(u32 addr) const -> u32;
void Write(u32 addr, u32 val);
void WriteStatus(u32 val);
void RunCommand();
void OnFullSync();
FORCE_INLINE void WriteStart(u32 val) {
if (!dpc.status.startValid) {
dpc.start = val & 0xFFFFF8;
}
dpc.status.startValid = true;
}
FORCE_INLINE void WriteEnd(u32 val) {
dpc.end = val & 0xFFFFF8;
if (dpc.status.startValid) {
dpc.current = dpc.start;
dpc.status.startValid = false;
}
RunCommand();
}
template <typename T>
void WriteRDRAM(size_t, T);
template <typename T>
T ReadRDRAM(size_t);
private:
friend struct Mem;
friend struct MMIO;
std::vector<u8> rdram{};
Mem &mem;
ParallelRDP &parallel;
};
} // namespace n64