mirror of https://github.com/bsnes-emu/bsnes.git
112 lines
2.5 KiB
C++
112 lines
2.5 KiB
C++
|
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;
|