1 struct Memory { 2 virtual inline unsigned size() const; 3 virtual uint8 read(unsigned addr) = 0; 4 virtual void write(unsigned addr, uint8 data) = 0; 5 }; 6 7 struct MMIO { 8 virtual uint8 mmio_read(unsigned addr) = 0; 9 virtual void mmio_write(unsigned addr, uint8 data) = 0; 10 }; 11 12 struct UnmappedMemory : Memory { 13 unsigned size() const; 14 uint8 read(unsigned); 15 void write(unsigned, uint8); 16 }; 17 18 struct UnmappedMMIO : MMIO { 19 uint8 mmio_read(unsigned); 20 void mmio_write(unsigned, uint8); 21 }; 22 23 struct StaticRAM : Memory { 24 inline uint8* data(); 25 inline unsigned size() const; 26 27 inline uint8 read(unsigned addr); 28 inline void write(unsigned addr, uint8 n); 29 inline uint8& operator[](unsigned addr); 30 inline const uint8& operator[](unsigned addr) const; 31 32 inline StaticRAM(unsigned size); 33 inline ~StaticRAM(); 34 35 private: 36 uint8 *data_; 37 unsigned size_; 38 }; 39 40 struct MappedRAM : Memory { 41 inline void reset(); 42 inline void map(uint8*, unsigned); 43 inline void copy(uint8*, unsigned); 44 45 inline void write_protect(bool status); 46 inline uint8* data(); 47 inline unsigned size() const; 48 49 inline uint8 read(unsigned addr); 50 inline void write(unsigned addr, uint8 n); 51 inline const uint8 operator[](unsigned addr) const; 52 inline MappedRAM(); 53 54 private: 55 uint8 *data_; 56 unsigned size_; 57 bool write_protect_; 58 }; 59 60 struct MMIOAccess : Memory { 61 void map(unsigned addr, MMIO &access); 62 uint8 read(unsigned addr); 63 void write(unsigned addr, uint8 data); 64 65 MMIO *mmio[0x4000]; 66 }; 67 68 struct Bus { 69 unsigned mirror(unsigned addr, unsigned size); 70 void map(unsigned addr, Memory &access, unsigned offset); 71 enum MapMode { MapDirect, MapLinear, MapShadow }; 72 void map(MapMode mode, 73 uint8 bank_lo, uint8 bank_hi, 74 uint16 addr_lo, uint16 addr_hi, 75 Memory &access, unsigned offset = 0, unsigned size = 0); 76 77 alwaysinline uint8 read(unsigned addr); 78 alwaysinline void write(unsigned addr, uint8 data); 79 80 virtual inline bool load_cart(); 81 virtual inline void unload_cart(); 82 83 virtual inline void power(); 84 virtual inline void reset(); 85 86 struct Page { 87 Memory *access; 88 unsigned offset; 89 } page[65536]; 90 serializeBus91 virtual void serialize(serializer&) {} 92 }; 93 94 namespace memory { 95 extern MMIOAccess mmio; //S-CPU, S-PPU 96 extern StaticRAM wram; //S-CPU 97 extern StaticRAM apuram; //S-SMP, S-DSP 98 extern StaticRAM vram; //S-PPU 99 extern StaticRAM oam; //S-PPU 100 extern StaticRAM cgram; //S-PPU 101 102 extern UnmappedMemory memory_unmapped; 103 extern UnmappedMMIO mmio_unmapped; 104 }; 105