struct Memory {
  virtual uint32 read(uint32 addr, uint32 size) = 0;
  virtual void write(uint32 addr, uint32 size, uint32 word) = 0;
};

struct MMIO : Memory {
  virtual uint8 read(uint32 addr) = 0;
  virtual void write(uint32 addr, uint8 data) = 0;
  uint32 read(uint32 addr, uint32 size);
  void write(uint32 addr, uint32 size, uint32 word);
};

struct Bus : Memory {
  Memory* mmio[0x400];
  bool idleflag;
  static uint32 mirror(uint32 addr, uint32 size);

  uint32 speed(uint32 addr, uint32 size);
  void idle(uint32 addr);
  uint32 read(uint32 addr, uint32 size);
  void write(uint32 addr, uint32 size, uint32 word);
  void power();

  void serialize(serializer&);
};

extern Bus bus;
