BISB/BICB: keep MSB for register operations
This commit is contained in:
parent
6974234d5e
commit
0a0807e1ad
1 changed files with 45 additions and 20 deletions
27
cpu.cpp
27
cpu.cpp
|
@ -643,6 +643,17 @@ bool cpu::double_operand_instructions(const uint16_t instr)
|
||||||
case 0b100: { // BIC/BICB Bit Clear Word/Byte
|
case 0b100: { // BIC/BICB Bit Clear Word/Byte
|
||||||
gam_rc_t g_src = getGAM(src_mode, src_reg, word_mode, rm_cur);
|
gam_rc_t g_src = getGAM(src_mode, src_reg, word_mode, rm_cur);
|
||||||
|
|
||||||
|
if (dst_mode == 0) {
|
||||||
|
addToMMR1(g_src); // keep here because of order of updates
|
||||||
|
|
||||||
|
uint16_t v = getRegister(dst_reg); // need the full word
|
||||||
|
uint16_t result = v & ~g_src.value.value();
|
||||||
|
|
||||||
|
setRegister(dst_reg, result);
|
||||||
|
|
||||||
|
setPSW_flags_nzv(result, word_mode);
|
||||||
|
}
|
||||||
|
else {
|
||||||
auto g_dst = getGAM(dst_mode, dst_reg, word_mode, rm_cur);
|
auto g_dst = getGAM(dst_mode, dst_reg, word_mode, rm_cur);
|
||||||
|
|
||||||
addToMMR1(g_dst);
|
addToMMR1(g_dst);
|
||||||
|
@ -652,14 +663,27 @@ bool cpu::double_operand_instructions(const uint16_t instr)
|
||||||
|
|
||||||
if (put_result(g_dst, result))
|
if (put_result(g_dst, result))
|
||||||
setPSW_flags_nzv(result, word_mode);
|
setPSW_flags_nzv(result, word_mode);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 0b101: { // BIS/BISB Bit Set Word/Byte
|
case 0b101: { // BIS/BISB Bit Set Word/Byte
|
||||||
// TODO: retain MSB for register operations?
|
|
||||||
gam_rc_t g_src = getGAM(src_mode, src_reg, word_mode, rm_cur);
|
gam_rc_t g_src = getGAM(src_mode, src_reg, word_mode, rm_cur);
|
||||||
|
|
||||||
|
if (dst_mode == 0) {
|
||||||
|
addToMMR1(g_src); // keep here because of order of updates
|
||||||
|
|
||||||
|
uint16_t v = getRegister(dst_reg); // need the full word
|
||||||
|
uint16_t result = v | g_src.value.value();
|
||||||
|
|
||||||
|
setRegister(dst_reg, result);
|
||||||
|
|
||||||
|
setPSW_n(SIGN(result, word_mode));
|
||||||
|
setPSW_z(IS_0(result, word_mode));
|
||||||
|
setPSW_v(false);
|
||||||
|
}
|
||||||
|
else {
|
||||||
auto g_dst = getGAM(dst_mode, dst_reg, word_mode, rm_cur);
|
auto g_dst = getGAM(dst_mode, dst_reg, word_mode, rm_cur);
|
||||||
|
|
||||||
addToMMR1(g_dst);
|
addToMMR1(g_dst);
|
||||||
|
@ -672,6 +696,7 @@ bool cpu::double_operand_instructions(const uint16_t instr)
|
||||||
setPSW_z(IS_0(result, word_mode));
|
setPSW_z(IS_0(result, word_mode));
|
||||||
setPSW_v(false);
|
setPSW_v(false);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue