NESemu/src/Mapper.hpp
2022-03-05 17:14:07 +01:00

57 lines
1.2 KiB
C++

#pragma once
#include <vector>
#include "../Log.hpp"
#include "Types.hpp"
class Mapper
{
friend class Disassembler;
friend class PatternTableViewer;
public:
virtual Byte ReadCPU(Word addr) = 0;
virtual Byte ReadPPU(Word addr) = 0;
virtual void WriteCPU(Word addr, Byte val) = 0;
virtual void WritePPU(Word addr, Byte val) = 0;
/**
* The cartridge actually controls the PPUs access to VRAM.
* It can modify the effective address the PPU accesses in order to
* enforce nametable mirroring, or even completely remap the address
* to internal VRAM
*/
virtual bool MapCIRAM(Word& addr)
{
if (header.Flag6.IgnoreMirroringBit)
return true;
if (header.Flag6.Mirroring == 0x0)
{
// Shift Bit 11 into Bit 10
addr &= ~(1 << 10);
addr |= ((addr & (1 << 11)) >> 1);
}
// Unset bit 11
addr &= ~(1 << 11);
return false;
}
virtual Byte ReadVRAM(Word addr) { return 0x00; }
virtual void WriteVRAM(Word addr, Byte val) {}
protected:
Mapper(const Header& header) : header(header), prgBanks(header.PrgROM), chrBanks(header.ChrROM)
{
}
protected:
std::vector<Byte> PRG_ROM;
std::vector<Byte> CHR_ROM;
Byte prgBanks = 0;
Byte chrBanks = 0;
Header header;
};