#ifndef MEMORY_H #define MEMORY_H #include #include #include #include #include "Cartridge.h" #include "Mapper.h" namespace sn { enum IORegisters { PPUCTRL = 0x2000, PPUMASK, PPUSTATUS, OAMADDR, OAMDATA, PPUSCROL, PPUADDR, PPUDATA, OAMDMA = 0x4014, JOY1 = 0x4016, JOY2 = 0x4017, }; struct IORegistersHasher { std::size_t operator()(sn::IORegisters const & reg) const noexcept { return std::hash{}(reg); } }; class MainBus { public: MainBus(); Byte read(Address addr); void write(Address addr, Byte value); bool setMapper(Mapper* mapper); bool setWriteCallback(IORegisters reg, std::function callback); bool setReadCallback(IORegisters reg, std::function callback); const Byte* getPagePtr(Byte page); private: std::vector m_RAM; std::vector m_extRAM; Mapper* m_mapper; std::unordered_map, IORegistersHasher> m_writeCallbacks; std::unordered_map, IORegistersHasher> m_readCallbacks;; }; }; #endif // MEMORY_H