bus: use a switch case for memory access

Signed-off-by: Amneesh Singh <natto@weirdnatto.in>
This commit is contained in:
2024-06-14 20:47:04 +05:30
parent 08060a767f
commit cb75ebf8ef
2 changed files with 40 additions and 17 deletions

View File

@@ -39,7 +39,8 @@ class Bus {
std::optional<std::span<uint8_t>> write(uint32_t); std::optional<std::span<uint8_t>> write(uint32_t);
#define MEMORY_REGION(name, start) \ #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) \ #define DECL_MEMORY(name, ident, start, end) \
MEMORY_REGION(name, start) \ MEMORY_REGION(name, start) \
@@ -70,6 +71,7 @@ class Bus {
MEMORY_REGION(ROM_2, 0x0C000000) MEMORY_REGION(ROM_2, 0x0C000000)
#undef MEMORY_REGION #undef MEMORY_REGION
std::vector<uint8_t> rom; std::vector<uint8_t> rom;
std::unique_ptr<IoDevices> io; std::unique_ptr<IoDevices> io;

View File

@@ -41,8 +41,20 @@ Bus::init(std::array<uint8_t, BIOS_SIZE>&& bios, std::vector<uint8_t>&& rom) {
template<unsigned int N> template<unsigned int N>
std::optional<std::span<const uint8_t>> std::optional<std::span<const uint8_t>>
Bus::read(uint32_t address) const { Bus::read(uint32_t address) const {
switch (address >> 24 & 0xFF) {
#define MATCHES(AREA, area) \ #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); return std::span<const uint8_t>(&area[address - AREA##_START], N);
MATCHES(BIOS, bios) MATCHES(BIOS, bios)
@@ -51,11 +63,14 @@ Bus::read(uint32_t address) const {
MATCHES(PALETTE_RAM, palette_ram) MATCHES(PALETTE_RAM, palette_ram)
MATCHES(VRAM, vram) MATCHES(VRAM, vram)
MATCHES(OAM_OBJ_ATTR, oam_obj_attr) 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 #undef MATCHES
}
glogger.error("Invalid memory region read"); glogger.error("Invalid memory region read");
return {}; return {};
@@ -64,8 +79,13 @@ Bus::read(uint32_t address) const {
template<unsigned int N> template<unsigned int N>
std::optional<std::span<uint8_t>> std::optional<std::span<uint8_t>>
Bus::write(uint32_t address) { Bus::write(uint32_t address) {
switch (address >> 24 & 0xFF) {
#define MATCHES(AREA, area) \ #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); return std::span<uint8_t>(&area[address - AREA##_START], N);
MATCHES(BOARD_WRAM, board_wram) MATCHES(BOARD_WRAM, board_wram)
@@ -75,6 +95,7 @@ Bus::write(uint32_t address) {
MATCHES(OAM_OBJ_ATTR, oam_obj_attr) MATCHES(OAM_OBJ_ATTR, oam_obj_attr)
#undef MATCHES #undef MATCHES
}
glogger.error("Invalid memory region written"); glogger.error("Invalid memory region written");
return {}; return {};