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:
parent
c096114c6b
commit
bcb5305473
1 changed files with 24 additions and 14 deletions
38
cpu.cpp
38
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.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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue