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

This commit is contained in:
folkert van heusden 2023-03-23 20:51:37 +01:00
parent c096114c6b
commit bcb5305473
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1

38
cpu.cpp
View file

@ -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.prev_mode = prev_mode; // run mode
g.set = getBitPSW(11); 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 // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ always d_space here? TODO
g.space = isR7_space;
uint16_t next_word = 0; uint16_t next_word = 0;
switch(mode) { 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: case 1:
g.addr = getRegister(reg, g.set, prev_mode); g.addr = getRegister(reg, g.set, prev_mode);
if (read_value) 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; break;
case 2: case 2:
g.addr = getRegister(reg, g.set, prev_mode); g.addr = getRegister(reg, g.set, prev_mode);
if (read_value) 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); addRegister(reg, prev_mode, !word_mode || reg == 7 || reg == 6 ? 2 : 1);
addToMMR1(mode, reg, word_mode); addToMMR1(mode, reg, word_mode);
break; break;
case 3: 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); addRegister(reg, prev_mode, 2);
if (read_value) if (read_value) {
g.value = b->read(g.addr.value(), word_mode, prev_mode, false, d_space); g.space = d_space;
g.value = b->read(g.addr.value(), word_mode, prev_mode, false, g.space);
}
addToMMR1(mode, reg, word_mode); addToMMR1(mode, reg, word_mode);
break; break;
case 4: case 4:
addRegister(reg, prev_mode, !word_mode || reg == 7 || reg == 6 ? -2 : -1); addRegister(reg, prev_mode, !word_mode || reg == 7 || reg == 6 ? -2 : -1);
g.addr = getRegister(reg, g.set, prev_mode); g.addr = getRegister(reg, g.set, prev_mode);
if (read_value) 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); addToMMR1(mode, reg, word_mode);
break; break;
case 5: case 5:
addRegister(reg, prev_mode, -2); addRegister(reg, prev_mode, -2);
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);
if (read_value) if (read_value) {
g.value = b->read(g.addr.value(), word_mode, prev_mode, d_space); g.space = d_space;
g.value = b->read(g.addr.value(), word_mode, prev_mode, g.space);
}
addToMMR1(mode, reg, word_mode); addToMMR1(mode, reg, word_mode);
break; break;
case 6: case 6:
next_word = b->read(getPC(), false, prev_mode, i_space); next_word = b->read(getPC(), false, prev_mode, i_space);
addRegister(7, prev_mode, + 2); addRegister(7, prev_mode, + 2);
g.addr = getRegister(reg, g.set, prev_mode) + next_word; g.addr = getRegister(reg, g.set, prev_mode) + next_word;
if (read_value) if (read_value) {
g.value = b->read(g.addr.value(), word_mode, prev_mode, d_space); g.space = d_space;
g.value = b->read(g.addr.value(), word_mode, prev_mode, g.space);
}
break; break;
case 7: case 7:
next_word = b->read(getPC(), false, prev_mode, i_space); next_word = b->read(getPC(), false, prev_mode, i_space);
addRegister(7, prev_mode, + 2); addRegister(7, prev_mode, + 2);
g.addr = b->read(getRegister(reg, g.set, prev_mode) + next_word, false, prev_mode, d_space); g.addr = b->read(getRegister(reg, g.set, prev_mode) + next_word, false, prev_mode, d_space);
if (read_value) if (read_value) {
g.value = b->read(g.addr.value(), word_mode, prev_mode, d_space); g.space = d_space;
g.value = b->read(g.addr.value(), word_mode, prev_mode, g.space);
}
break; break;
} }