bus: use a switch case for memory access
Signed-off-by: Amneesh Singh <natto@weirdnatto.in>
This commit is contained in:
@@ -39,7 +39,8 @@ class Bus {
|
||||
std::optional<std::span<uint8_t>> write(uint32_t);
|
||||
|
||||
#define MEMORY_REGION(name, start) \
|
||||
static constexpr uint32_t name##_START = start;
|
||||
static constexpr uint32_t name##_START = start; \
|
||||
static constexpr uint8_t name##_REGION = start >> 24 & 0xFF;
|
||||
|
||||
#define DECL_MEMORY(name, ident, start, end) \
|
||||
MEMORY_REGION(name, start) \
|
||||
@@ -70,6 +71,7 @@ class Bus {
|
||||
MEMORY_REGION(ROM_2, 0x0C000000)
|
||||
|
||||
#undef MEMORY_REGION
|
||||
|
||||
std::vector<uint8_t> rom;
|
||||
|
||||
std::unique_ptr<IoDevices> io;
|
||||
|
31
src/bus.cc
31
src/bus.cc
@@ -41,8 +41,20 @@ Bus::init(std::array<uint8_t, BIOS_SIZE>&& bios, std::vector<uint8_t>&& rom) {
|
||||
template<unsigned int N>
|
||||
std::optional<std::span<const uint8_t>>
|
||||
Bus::read(uint32_t address) const {
|
||||
|
||||
switch (address >> 24 & 0xFF) {
|
||||
|
||||
#define MATCHES(AREA, area) \
|
||||
if (address >= AREA##_START && address < AREA##_START + area.size()) \
|
||||
case AREA##_REGION: \
|
||||
if (address > AREA##_START + area.size() - N) \
|
||||
break; \
|
||||
return std::span<const uint8_t>(&area[address - AREA##_START], N);
|
||||
|
||||
#define MATCHES_PAK(AREA, area) \
|
||||
case AREA##_REGION: \
|
||||
case AREA##_REGION + 1: \
|
||||
if (address > AREA##_START + area.size() - N) \
|
||||
break; \
|
||||
return std::span<const uint8_t>(&area[address - AREA##_START], N);
|
||||
|
||||
MATCHES(BIOS, bios)
|
||||
@@ -51,11 +63,14 @@ Bus::read(uint32_t address) const {
|
||||
MATCHES(PALETTE_RAM, palette_ram)
|
||||
MATCHES(VRAM, vram)
|
||||
MATCHES(OAM_OBJ_ATTR, oam_obj_attr)
|
||||
MATCHES(ROM_0, rom)
|
||||
MATCHES(ROM_1, rom)
|
||||
MATCHES(ROM_2, rom)
|
||||
|
||||
MATCHES_PAK(ROM_0, rom)
|
||||
MATCHES_PAK(ROM_1, rom)
|
||||
MATCHES_PAK(ROM_2, rom)
|
||||
|
||||
#undef MATCHES_PAK
|
||||
#undef MATCHES
|
||||
}
|
||||
|
||||
glogger.error("Invalid memory region read");
|
||||
return {};
|
||||
@@ -64,8 +79,13 @@ Bus::read(uint32_t address) const {
|
||||
template<unsigned int N>
|
||||
std::optional<std::span<uint8_t>>
|
||||
Bus::write(uint32_t address) {
|
||||
|
||||
switch (address >> 24 & 0xFF) {
|
||||
|
||||
#define MATCHES(AREA, area) \
|
||||
if (address >= AREA##_START && address < AREA##_START + area.size()) \
|
||||
case AREA##_REGION: \
|
||||
if (address > AREA##_START + area.size() - N) \
|
||||
break; \
|
||||
return std::span<uint8_t>(&area[address - AREA##_START], N);
|
||||
|
||||
MATCHES(BOARD_WRAM, board_wram)
|
||||
@@ -75,6 +95,7 @@ Bus::write(uint32_t address) {
|
||||
MATCHES(OAM_OBJ_ATTR, oam_obj_attr)
|
||||
|
||||
#undef MATCHES
|
||||
}
|
||||
|
||||
glogger.error("Invalid memory region written");
|
||||
return {};
|
||||
|
Reference in New Issue
Block a user