#pragma once #include #include #include #include #include "Signal.h" #include "Register.h" #include "EventArgs.h" #include "MemoryMapping.h" namespace EightBit { class Bus { public: virtual ~Bus() = default; Signal WritingByte; Signal WrittenByte; Signal ReadingByte; Signal ReadByte; register16_t ADDRESS() const { return m_address; } register16_t& ADDRESS() { return m_address; } uint8_t DATA() const { return m_data; } uint8_t& DATA() { return m_data; } uint8_t peek() { return reference(); } uint8_t peek(const uint16_t address) { return reference(address); } uint8_t peek(const register16_t address) { return reference(address.word); } void poke(const uint8_t value) { reference() = value; } void poke(const uint16_t address, const uint8_t value) { reference(address) = value; } void poke(const register16_t address, const uint8_t value) { reference(address.word) = value; } uint8_t read(); template uint8_t read(const T address) { ADDRESS() = address; return read(); } void write(); void write(uint8_t value); template void write(const T offset, const uint8_t value) { ADDRESS() = offset; write(value); } protected: virtual MemoryMapping mapping(uint16_t address) = 0; uint8_t& reference(uint16_t address); uint8_t& reference(const register16_t address) { return reference(address.word); } uint8_t& reference() { return reference(ADDRESS()); } static std::map> parseHexFile(std::string path); void loadHexFile(std::string path); private: uint8_t m_data = 0xff; register16_t m_address = 0xffff; }; }