write-back in correct space

This commit is contained in:
folkert van heusden 2023-03-18 14:48:17 +01:00
parent a935fe44d7
commit 020764b22c
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1
2 changed files with 9 additions and 8 deletions

16
cpu.cpp
View file

@ -324,14 +324,14 @@ void cpu::addToMMR1(const uint8_t mode, const uint8_t reg, const bool word_mode)
// GAM = general addressing modes // GAM = general addressing modes
gam_rc_t cpu::getGAM(const uint8_t mode, const uint8_t reg, const bool word_mode, const bool prev_mode, const bool read_value) gam_rc_t cpu::getGAM(const uint8_t mode, const uint8_t reg, const bool word_mode, const bool prev_mode, const bool read_value)
{ {
gam_rc_t g { false, false, false, { }, 0 }; gam_rc_t g { false, false, false, i_space, { }, 0 };
g.word_mode = word_mode; // word/byte g.word_mode = word_mode; // word/byte
g.prev_mode = prev_mode; // run mode g.prev_mode = prev_mode; // run mode
g.set = getBitPSW(11); g.set = getBitPSW(11);
uint16_t next_word = 0; 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); g.space = reg == 7 ? i_space : (b->get_use_data_space(psw >> 14) ? d_space : i_space);
switch(mode) { switch(mode) {
case 0: // 000 case 0: // 000
@ -341,16 +341,16 @@ 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, space); g.value = b->read(g.addr.value(), word_mode, prev_mode, false, g.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, space); g.value = b->read(g.addr.value(), word_mode, prev_mode, false, g.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);
break; break;
case 3: case 3:
g.addr = b->read(getRegister(reg, g.set, prev_mode), false, prev_mode, space); g.addr = b->read(getRegister(reg, g.set, prev_mode), false, prev_mode, g.space);
if (read_value) if (read_value)
g.value = b->read(g.addr.value(), word_mode, prev_mode, false, d_space); g.value = b->read(g.addr.value(), word_mode, prev_mode, false, d_space);
addRegister(reg, prev_mode, 2); addRegister(reg, prev_mode, 2);
@ -363,7 +363,7 @@ gam_rc_t cpu::getGAM(const uint8_t mode, const uint8_t reg, const bool 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, space); g.addr = b->read(getRegister(reg, g.set, prev_mode), false, prev_mode, g.space);
if (read_value) if (read_value)
g.value = b->read(g.addr.value(), word_mode, prev_mode, d_space); g.value = b->read(g.addr.value(), word_mode, prev_mode, d_space);
break; break;
@ -389,7 +389,7 @@ gam_rc_t cpu::getGAM(const uint8_t mode, const uint8_t reg, const bool word_mode
bool cpu::putGAM(const gam_rc_t & g, const uint16_t value) bool cpu::putGAM(const gam_rc_t & g, const uint16_t value)
{ {
if (g.addr.has_value()) { if (g.addr.has_value()) {
b->write(g.addr.value(), g.word_mode, value, g.prev_mode); b->write(g.addr.value(), g.word_mode, value, g.prev_mode, g.space);
return g.addr.value() != ADDR_PSW; return g.addr.value() != ADDR_PSW;
} }
@ -420,7 +420,7 @@ bool cpu::double_operand_instructions(const uint16_t instr)
const uint8_t src_mode = (src >> 3) & 7; const uint8_t src_mode = (src >> 3) & 7;
const uint8_t src_reg = src & 7; const uint8_t src_reg = src & 7;
gam_rc_t g_src { false, false, false, { }, 0 }; gam_rc_t g_src { false, false, false, i_space, { }, 0 };
if (operation != 0b110) if (operation != 0b110)
g_src = getGAM(src_mode, src_reg, word_mode, false); g_src = getGAM(src_mode, src_reg, word_mode, false);

1
cpu.h
View file

@ -16,6 +16,7 @@ typedef struct {
bool word_mode; bool word_mode;
bool prev_mode; bool prev_mode;
bool set; bool set;
d_i_space_t space;
union { union {
std::optional<uint16_t> addr; std::optional<uint16_t> addr;