diff --git a/inc/MemoryMapping.h b/inc/MemoryMapping.h index b702a72..6ccd3fa 100644 --- a/inc/MemoryMapping.h +++ b/inc/MemoryMapping.h @@ -11,6 +11,8 @@ namespace EightBit { enum class AccessLevel { Unknown, ReadOnly, WriteOnly, ReadWrite }; + constexpr auto offset(uint16_t address) const noexcept { return (address - begin) & mask; } + Memory& memory; uint16_t begin = Chip::Mask16; uint16_t mask = 0U; diff --git a/src/Bus.cpp b/src/Bus.cpp index 4cba73e..1924b79 100644 --- a/src/Bus.cpp +++ b/src/Bus.cpp @@ -40,10 +40,8 @@ void EightBit::Bus::loadHexFile(const std::string path) { uint8_t& EightBit::Bus::reference(const uint16_t address) noexcept { const auto mapped = mapping(address); - const uint16_t offset = (address - mapped.begin) & mapped.mask; - if (mapped.access == MemoryMapping::AccessLevel::ReadOnly) { - DATA() = mapped.memory.peek(offset); - return DATA(); - } - return mapped.memory.reference(offset); + const auto offset = mapped.offset(address); + if (mapped.access != MemoryMapping::AccessLevel::ReadOnly) + return mapped.memory.reference(offset); + return DATA() = mapped.memory.peek(offset); }