#pragma once #include #include #include #include #include namespace n64 { struct Registers; struct Mem { ~Mem() = default; Mem(); void Reset(); u32 LoadROM(const std::string&); [[nodiscard]] auto GetRDRAM() -> u8* { return mmio.rdp.dram.data(); } template u8 Read8(Registers&, u64, s64); template u16 Read16(Registers&, u64, s64); template u32 Read32(Registers&, u64, s64); template u64 Read64(Registers&, u64, s64); template void Write8(Registers&, u64, u32, s64); template void Write16(Registers&, u64, u32, s64); template void Write32(Registers&, u64, u32, s64); template void Write64(Registers&, u64, u64, s64); MMIO mmio; u8 pifRam[PIF_RAM_SIZE]{}; private: friend struct SI; friend struct PI; friend struct AI; friend struct Cpu; friend struct RSP; friend struct Core; std::vector cart, sram; u8 pifBootrom[PIF_BOOTROM_SIZE]{}; u8 isviewer[ISVIEWER_SIZE]{}; size_t romMask; }; template bool MapVAddr(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr); }