bsnes/snes/memory/memory.hpp

112 lines
2.5 KiB
C++
Raw Normal View History

struct Memory {
virtual inline unsigned size() const;
virtual uint8 read(unsigned addr) = 0;
virtual void write(unsigned addr, uint8 data) = 0;
};
struct MMIO {
virtual uint8 mmio_read(unsigned addr) = 0;
virtual void mmio_write(unsigned addr, uint8 data) = 0;
};
struct UnmappedMemory : Memory {
unsigned size() const;
uint8 read(unsigned);
void write(unsigned, uint8);
};
struct UnmappedMMIO : MMIO {
uint8 mmio_read(unsigned);
void mmio_write(unsigned, uint8);
};
struct StaticRAM : Memory {
inline uint8* data();
inline unsigned size() const;
inline uint8 read(unsigned addr);
inline void write(unsigned addr, uint8 n);
inline uint8& operator[](unsigned addr);
inline const uint8& operator[](unsigned addr) const;
inline StaticRAM(unsigned size);
inline ~StaticRAM();
private:
uint8 *data_;
unsigned size_;
};
struct MappedRAM : Memory {
inline void reset();
inline void map(uint8*, unsigned);
inline void copy(const uint8*, unsigned);
inline void write_protect(bool status);
inline uint8* data();
inline unsigned size() const;
inline uint8 read(unsigned addr);
inline void write(unsigned addr, uint8 n);
inline const uint8& operator[](unsigned addr) const;
inline MappedRAM();
private:
uint8 *data_;
unsigned size_;
bool write_protect_;
};
struct MMIOAccess : Memory {
void map(unsigned addr, MMIO &access);
uint8 read(unsigned addr);
void write(unsigned addr, uint8 data);
MMIO *mmio[0x4000];
};
struct Bus {
unsigned mirror(unsigned addr, unsigned size);
void map(unsigned addr, Memory &access, unsigned offset);
enum class MapMode : unsigned { Direct, Linear, Shadow };
void map(MapMode mode,
uint8 bank_lo, uint8 bank_hi,
uint16 addr_lo, uint16 addr_hi,
Memory &access, unsigned offset = 0, unsigned size = 0);
alwaysinline uint8 read(unsigned addr);
alwaysinline void write(unsigned addr, uint8 data);
bool load_cart();
void unload_cart();
void power();
void reset();
struct Page {
Memory *access;
unsigned offset;
} page[65536];
void serialize(serializer&);
private:
void map_reset();
void map_xml();
void map_system();
};
namespace memory {
extern MMIOAccess mmio; //S-CPU, S-PPU
extern StaticRAM wram; //S-CPU
extern StaticRAM apuram; //S-SMP, S-DSP
extern StaticRAM vram; //S-PPU
extern StaticRAM oam; //S-PPU
extern StaticRAM cgram; //S-PPU
extern UnmappedMemory memory_unmapped;
extern UnmappedMMIO mmio_unmapped;
};
extern Bus bus;