From bcb5305473eaa9d8e9e40b3a8560a00fa65fd6e3 Mon Sep 17 00:00:00 2001 From: folkert van heusden Date: Thu, 23 Mar 2023 20:51:37 +0100 Subject: [PATCH] getGAM fix: when reading data from d_space, then set g.space to that as well so that putGAM will write back to d_space --- cpu.cpp | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/cpu.cpp b/cpu.cpp index c739eef..177e9c3 100644 --- a/cpu.cpp +++ b/cpu.cpp @@ -323,9 +323,11 @@ gam_rc_t cpu::getGAM(const uint8_t mode, const uint8_t reg, const bool word_mode g.prev_mode = prev_mode; // run mode g.set = getBitPSW(11); - g.space = reg == 7 ? i_space : (b->get_use_data_space(psw >> 14) ? d_space : i_space); + d_i_space_t isR7_space = reg == 7 ? i_space : (b->get_use_data_space(psw >> 14) ? d_space : i_space); // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ always d_space here? TODO + g.space = isR7_space; + uint16_t next_word = 0; switch(mode) { @@ -336,49 +338,57 @@ 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, false, g.space); + g.value = b->read(g.addr.value(), word_mode, prev_mode, false, isR7_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, false, g.space); + g.value = b->read(g.addr.value(), word_mode, prev_mode, false, isR7_space); addRegister(reg, prev_mode, !word_mode || reg == 7 || reg == 6 ? 2 : 1); addToMMR1(mode, reg, word_mode); break; case 3: - g.addr = b->read(getRegister(reg, g.set, prev_mode), false, prev_mode, g.space); + g.addr = b->read(getRegister(reg, g.set, prev_mode), false, prev_mode, isR7_space); addRegister(reg, prev_mode, 2); - if (read_value) - g.value = b->read(g.addr.value(), word_mode, prev_mode, false, d_space); + if (read_value) { + g.space = d_space; + g.value = b->read(g.addr.value(), word_mode, prev_mode, false, g.space); + } addToMMR1(mode, reg, word_mode); 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, false, g.space); + g.value = b->read(g.addr.value(), word_mode, prev_mode, false, isR7_space); addToMMR1(mode, reg, word_mode); break; case 5: addRegister(reg, prev_mode, -2); - g.addr = b->read(getRegister(reg, g.set, prev_mode), false, prev_mode, g.space); - if (read_value) - g.value = b->read(g.addr.value(), word_mode, prev_mode, d_space); + g.addr = b->read(getRegister(reg, g.set, prev_mode), false, prev_mode, isR7_space); + if (read_value) { + g.space = d_space; + g.value = b->read(g.addr.value(), word_mode, prev_mode, g.space); + } addToMMR1(mode, reg, word_mode); break; case 6: next_word = b->read(getPC(), false, prev_mode, i_space); 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, d_space); + if (read_value) { + g.space = d_space; + g.value = b->read(g.addr.value(), word_mode, prev_mode, g.space); + } break; case 7: next_word = b->read(getPC(), false, prev_mode, i_space); addRegister(7, prev_mode, + 2); g.addr = b->read(getRegister(reg, g.set, prev_mode) + next_word, false, prev_mode, d_space); - if (read_value) - g.value = b->read(g.addr.value(), word_mode, prev_mode, d_space); + if (read_value) { + g.space = d_space; + g.value = b->read(g.addr.value(), word_mode, prev_mode, g.space); + } break; }