always set g.space as read_value is optional, but g.space may be used by putGAM
This commit is contained in:
parent
a09460dc20
commit
0586b78f97
1 changed files with 11 additions and 14 deletions
25
cpu.cpp
25
cpu.cpp
|
@ -342,10 +342,9 @@ gam_rc_t cpu::getGAM(const uint8_t mode, const uint8_t reg, const word_mode_t wo
|
||||||
case 3: // @(Rn)+ / @#a
|
case 3: // @(Rn)+ / @#a
|
||||||
g.addr = b->read(getRegister(reg, mode_selection), wm_word, mode_selection, false, isR7_space);
|
g.addr = b->read(getRegister(reg, mode_selection), wm_word, mode_selection, false, isR7_space);
|
||||||
addRegister(reg, mode_selection, 2);
|
addRegister(reg, mode_selection, 2);
|
||||||
if (read_value) {
|
g.space = d_space;
|
||||||
g.space = d_space;
|
if (read_value)
|
||||||
g.value = b->read(g.addr.value(), word_mode, mode_selection, false, g.space);
|
g.value = b->read(g.addr.value(), word_mode, mode_selection, false, g.space);
|
||||||
}
|
|
||||||
addToMMR1(mode, reg, word_mode);
|
addToMMR1(mode, reg, word_mode);
|
||||||
break;
|
break;
|
||||||
case 4: // -(Rn)
|
case 4: // -(Rn)
|
||||||
|
@ -358,29 +357,26 @@ gam_rc_t cpu::getGAM(const uint8_t mode, const uint8_t reg, const word_mode_t wo
|
||||||
case 5: // @-(Rn)
|
case 5: // @-(Rn)
|
||||||
addRegister(reg, mode_selection, -2);
|
addRegister(reg, mode_selection, -2);
|
||||||
g.addr = b->read(getRegister(reg, mode_selection), wm_word, mode_selection, false, isR7_space);
|
g.addr = b->read(getRegister(reg, mode_selection), wm_word, mode_selection, false, isR7_space);
|
||||||
if (read_value) {
|
g.space = d_space;
|
||||||
g.space = d_space;
|
if (read_value)
|
||||||
g.value = b->read(g.addr.value(), word_mode, mode_selection, false, g.space);
|
g.value = b->read(g.addr.value(), word_mode, mode_selection, false, g.space);
|
||||||
}
|
|
||||||
addToMMR1(mode, reg, word_mode);
|
addToMMR1(mode, reg, word_mode);
|
||||||
break;
|
break;
|
||||||
case 6: // x(Rn) / a
|
case 6: // x(Rn) / a
|
||||||
next_word = b->read(getPC(), wm_word, mode_selection, false, i_space);
|
next_word = b->read(getPC(), wm_word, mode_selection, false, i_space);
|
||||||
addRegister(7, mode_selection, + 2);
|
addRegister(7, mode_selection, + 2);
|
||||||
g.addr = getRegister(reg, mode_selection) + next_word;
|
g.addr = getRegister(reg, mode_selection) + next_word;
|
||||||
if (read_value) {
|
g.space = d_space;
|
||||||
g.space = d_space;
|
if (read_value)
|
||||||
g.value = b->read(g.addr.value(), word_mode, mode_selection, false, g.space);
|
g.value = b->read(g.addr.value(), word_mode, mode_selection, false, g.space);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 7: // @x(Rn) / @a
|
case 7: // @x(Rn) / @a
|
||||||
next_word = b->read(getPC(), wm_word, mode_selection, false, i_space);
|
next_word = b->read(getPC(), wm_word, mode_selection, false, i_space);
|
||||||
addRegister(7, mode_selection, + 2);
|
addRegister(7, mode_selection, + 2);
|
||||||
g.addr = b->read(getRegister(reg, mode_selection) + next_word, wm_word, mode_selection, false, d_space);
|
g.addr = b->read(getRegister(reg, mode_selection) + next_word, wm_word, mode_selection, false, d_space);
|
||||||
if (read_value) {
|
g.space = d_space;
|
||||||
g.space = d_space;
|
if (read_value)
|
||||||
g.value = b->read(g.addr.value(), word_mode, mode_selection, false, g.space);
|
g.value = b->read(g.addr.value(), word_mode, mode_selection, false, g.space);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -453,9 +449,9 @@ bool cpu::double_operand_instructions(const uint16_t instr)
|
||||||
}
|
}
|
||||||
|
|
||||||
case 0b010: { // CMP/CMPB Compare Word/Byte
|
case 0b010: { // CMP/CMPB Compare Word/Byte
|
||||||
auto g_dst = getGAM(dst_mode, dst_reg, word_mode, rm_cur);
|
auto g_dst = getGAM(dst_mode, dst_reg, word_mode, rm_cur);
|
||||||
|
|
||||||
uint16_t temp = (g_src.value.value() - g_dst.value.value()) & (word_mode == wm_byte ? 0xff : 0xffff);
|
uint16_t temp = (g_src.value.value() - g_dst.value.value()) & (word_mode == wm_byte ? 0xff : 0xffff);
|
||||||
|
|
||||||
setPSW_n(SIGN(temp, word_mode));
|
setPSW_n(SIGN(temp, word_mode));
|
||||||
setPSW_z(IS_0(temp, word_mode));
|
setPSW_z(IS_0(temp, word_mode));
|
||||||
|
@ -2144,6 +2140,7 @@ std::map<std::string, std::vector<std::string> > cpu::disassemble(const uint16_t
|
||||||
out.insert({ "MMR0", { format("%06o", b->getMMR0()) } });
|
out.insert({ "MMR0", { format("%06o", b->getMMR0()) } });
|
||||||
out.insert({ "MMR1", { format("%06o", b->getMMR1()) } });
|
out.insert({ "MMR1", { format("%06o", b->getMMR1()) } });
|
||||||
out.insert({ "MMR2", { format("%06o", b->getMMR2()) } });
|
out.insert({ "MMR2", { format("%06o", b->getMMR2()) } });
|
||||||
|
out.insert({ "MMR3", { format("%06o", b->getMMR3()) } });
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue