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