diff --git a/bus.cpp b/bus.cpp index 315c070..7a65cb1 100644 --- a/bus.cpp +++ b/bus.cpp @@ -407,6 +407,8 @@ uint16_t bus::write(const uint16_t a, const bool word_mode, uint16_t value, cons DOLOG(debug, true, "writeb PSW %s", a & 1 ? "MSB" : "LSB"); uint16_t vtemp = c -> getPSW(); + value &= ~16; // cannot set T bit via this + if (a & 1) vtemp = (vtemp & 0x00ff) | (value << 8); else @@ -433,7 +435,7 @@ uint16_t bus::write(const uint16_t a, const bool word_mode, uint16_t value, cons else { if (a == 0177776) { // PSW DOLOG(debug, true, "write PSW %o", value); - c -> setPSW(value, false); + c -> setPSW(value & ~16, false); return value; } diff --git a/cpu.cpp b/cpu.cpp index 9680a5b..e596d41 100644 --- a/cpu.cpp +++ b/cpu.cpp @@ -1366,9 +1366,9 @@ bool cpu::single_operand_instructions(const uint16_t instr) case 0b000110111: // MFPS (get PSW to something) / SXT if (word_mode) { // MFPS uint16_t temp = psw & 0xff; - bool extend_b7 = temp & 128; + bool extend_b7 = psw & 128; - if (extend_b7) + if (extend_b7 && dst_mode == 0) temp |= 0xff00; set_flags = putGAM(dst_mode, dst_reg, word_mode, temp, false); @@ -1376,7 +1376,7 @@ bool cpu::single_operand_instructions(const uint16_t instr) if (set_flags) { setPSW_z(temp == 0); setPSW_v(false); - setPSW_n(!extend_b7); + setPSW_n(extend_b7); } } else { // SXT