From a935fe44d7d6edccc9543ef3d2178b075440051e Mon Sep 17 00:00:00 2001 From: folkert van heusden Date: Sat, 18 Mar 2023 14:45:44 +0100 Subject: [PATCH] use d-space where required --- bus.cpp | 5 +++++ bus.h | 1 + cpu.cpp | 20 +++++++++++--------- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/bus.cpp b/bus.cpp index 03113c2..935f95e 100644 --- a/bus.cpp +++ b/bus.cpp @@ -464,6 +464,11 @@ void bus::check_address(const bool trap_on_failure, const bool is_write, const m } } +bool bus::get_use_data_space(const int run_mode) +{ + return !!(MMR3 & di_ena_mask[run_mode]); +} + uint32_t bus::calculate_physical_address(const int run_mode, const uint16_t a, const bool trap_on_failure, const bool is_write, const bool peek_only, const bool is_data) { uint32_t m_offset = a; diff --git a/bus.h b/bus.h index bfb0bbc..7669b89 100644 --- a/bus.h +++ b/bus.h @@ -150,6 +150,7 @@ public: uint32_t calculate_physical_address(const int run_mode, const uint16_t a, const bool trap_on_failure, const bool is_write, const bool peek_only, const bool is_data); + bool get_use_data_space(const int run_mode); memory_addresses_t calculate_physical_address(const int run_mode, const uint16_t a); void check_address(const bool trap_on_failure, const bool is_write, const memory_addresses_t & addr, const bool word_mode, const bool is_data, const int run_mode); }; diff --git a/cpu.cpp b/cpu.cpp index 9e88b0b..1142841 100644 --- a/cpu.cpp +++ b/cpu.cpp @@ -331,6 +331,8 @@ gam_rc_t cpu::getGAM(const uint8_t mode, const uint8_t reg, const bool word_mode uint16_t next_word = 0; + d_i_space_t space = reg == 7 ? i_space : (b->get_use_data_space(psw >> 14) ? d_space : i_space); + switch(mode) { case 0: // 000 g.reg = reg; @@ -339,45 +341,45 @@ gam_rc_t cpu::getGAM(const uint8_t mode, const uint8_t reg, const bool word_mode case 1: g.addr = getRegister(reg, g.set, prev_mode); if (read_value) - g.value = b->read(g.addr.value(), word_mode, prev_mode); + g.value = b->read(g.addr.value(), word_mode, prev_mode, false, space); break; case 2: g.addr = getRegister(reg, g.set, prev_mode); if (read_value) - g.value = b->read(g.addr.value(), word_mode, prev_mode); + g.value = b->read(g.addr.value(), word_mode, prev_mode, false, space); addRegister(reg, prev_mode, !word_mode || reg == 7 || reg == 6 ? 2 : 1); break; case 3: - g.addr = b->read(getRegister(reg, g.set, prev_mode), false, prev_mode); + g.addr = b->read(getRegister(reg, g.set, prev_mode), false, prev_mode, space); if (read_value) - g.value = b->read(g.addr.value(), word_mode, prev_mode); + g.value = b->read(g.addr.value(), word_mode, prev_mode, false, d_space); addRegister(reg, prev_mode, 2); break; case 4: addRegister(reg, prev_mode, !word_mode || reg == 7 || reg == 6 ? -2 : -1); g.addr = getRegister(reg, g.set, prev_mode); if (read_value) - g.value = b->read(g.addr.value(), word_mode, prev_mode); + g.value = b->read(g.addr.value(), word_mode, prev_mode, false, d_space); break; case 5: addRegister(reg, prev_mode, -2); - g.addr = b->read(getRegister(reg, g.set, prev_mode), false, prev_mode); + g.addr = b->read(getRegister(reg, g.set, prev_mode), false, prev_mode, space); if (read_value) - g.value = b->read(g.addr.value(), word_mode, prev_mode); + g.value = b->read(g.addr.value(), word_mode, prev_mode, d_space); break; case 6: next_word = b -> read(getPC(), false, prev_mode); addRegister(7, prev_mode, + 2); g.addr = getRegister(reg, g.set, prev_mode) + next_word; if (read_value) - g.value = b->read(g.addr.value(), word_mode, prev_mode); + g.value = b->read(g.addr.value(), word_mode, prev_mode, d_space); break; case 7: next_word = b -> read(getPC(), false, prev_mode); addRegister(7, prev_mode, + 2); g.addr = b->read(getRegister(reg, g.set, prev_mode) + next_word, false, prev_mode); if (read_value) - g.value = b->read(g.addr.value(), word_mode, prev_mode); + g.value = b->read(g.addr.value(), word_mode, prev_mode, d_space); break; }