setBitPSW without conditional
This commit is contained in:
parent
ce730c6ea1
commit
e85e204179
1 changed files with 4 additions and 9 deletions
13
cpu.cpp
13
cpu.cpp
|
@ -206,12 +206,8 @@ bool cpu::getPSW_n() const
|
||||||
|
|
||||||
void cpu::setBitPSW(const int bit, const bool v)
|
void cpu::setBitPSW(const int bit, const bool v)
|
||||||
{
|
{
|
||||||
const uint16_t mask = 1 << bit;
|
psw &= ~(1 << bit);
|
||||||
|
psw |= v << bit;
|
||||||
if (v)
|
|
||||||
psw |= mask;
|
|
||||||
else
|
|
||||||
psw &= ~mask;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cpu::setPSW_c(const bool v)
|
void cpu::setPSW_c(const bool v)
|
||||||
|
@ -512,7 +508,7 @@ bool cpu::double_operand_instructions(const uint16_t instr)
|
||||||
|
|
||||||
bool set_flags = g_dst.addr.has_value() ? g_dst.addr.value() != ADDR_PSW : true;
|
bool set_flags = g_dst.addr.has_value() ? g_dst.addr.value() != ADDR_PSW : true;
|
||||||
|
|
||||||
if (instr & 0x8000) {
|
if (instr & 0x8000) { // SUB
|
||||||
result = (g_dst.value.value() - g_ssrc.value.value()) & 0xffff;
|
result = (g_dst.value.value() - g_ssrc.value.value()) & 0xffff;
|
||||||
|
|
||||||
if (set_flags) {
|
if (set_flags) {
|
||||||
|
@ -520,13 +516,12 @@ bool cpu::double_operand_instructions(const uint16_t instr)
|
||||||
setPSW_c(uint16_t(g_dst.value.value()) < uint16_t(g_ssrc.value.value()));
|
setPSW_c(uint16_t(g_dst.value.value()) < uint16_t(g_ssrc.value.value()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else { // ADD
|
||||||
uint32_t temp = g_dst.value.value() + g_ssrc.value.value();
|
uint32_t temp = g_dst.value.value() + g_ssrc.value.value();
|
||||||
|
|
||||||
result = temp;
|
result = temp;
|
||||||
|
|
||||||
if (set_flags) {
|
if (set_flags) {
|
||||||
setPSW_v((temp ^ g_ssrc.value.value()) & (temp ^ g_dst.value.value()));
|
|
||||||
setPSW_v(SIGN((~g_ssrc.value.value() ^ g_dst.value.value()) & (g_ssrc.value.value() ^ (temp & 0xffff)), false));
|
setPSW_v(SIGN((~g_ssrc.value.value() ^ g_dst.value.value()) & (g_ssrc.value.value() ^ (temp & 0xffff)), false));
|
||||||
setPSW_c(uint16_t(result) < uint16_t(g_ssrc.value.value()));
|
setPSW_c(uint16_t(result) < uint16_t(g_ssrc.value.value()));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue