Revert "RTI/RTT shall not change the PSW in user/supervisor mode"

This reverts commit 31edf022cc.

31edf02 breaks XXDP EKBAD0.BIC
This commit is contained in:
folkert van heusden 2023-03-13 10:08:27 +01:00
parent c43c6618d9
commit 8809bb96e7
2 changed files with 12 additions and 20 deletions

28
cpu.cpp
View file

@ -246,16 +246,18 @@ int cpu::getPSW_spl() const
return (psw >> 5) & 7; return (psw >> 5) & 7;
} }
void cpu::setPSW(uint16_t v, const bool limited) void cpu::setPSW(const uint16_t v, const bool limited)
{ {
if (limited) { if (limited) {
v &= 0174037; psw |= v & 0174000; // current & previous mode can only be increased, 11 can only be set
v |= psw & 0174340; psw &= 0174000; // retain upper 5 bit
psw |= v & ~0174000;
} }
else {
psw = v; psw = v;
} }
}
bool cpu::check_queued_interrupts() bool cpu::check_queued_interrupts()
{ {
@ -1548,15 +1550,10 @@ bool cpu::misc_operations(const uint16_t instr)
case 0b0000000000000001: // WAIT case 0b0000000000000001: // WAIT
return true; return true;
case 0b0000000000000010: { // RTI case 0b0000000000000010: // RTI
setPC(popStack()); setPC(popStack());
setPSW(popStack(), !!((getPSW() >> 12) & 3));
uint16_t replacement_psw = popStack();
setPSW(replacement_psw, true);
return true; return true;
}
case 0b0000000000000011: // BPT case 0b0000000000000011: // BPT
trap(014); trap(014);
@ -1566,15 +1563,10 @@ bool cpu::misc_operations(const uint16_t instr)
trap(020); trap(020);
return true; return true;
case 0b0000000000000110: { // RTT case 0b0000000000000110: // RTT
setPC(popStack()); setPC(popStack());
setPSW(popStack(), !!((getPSW() >> 12) & 3));
uint16_t replacement_psw = popStack();
setPSW(replacement_psw, true);
return true; return true;
}
case 0b0000000000000111: // MFPT case 0b0000000000000111: // MFPT
if (emulateMFPT) if (emulateMFPT)

2
cpu.h
View file

@ -117,7 +117,7 @@ public:
void setBitPSW(const int bit, const bool v); void setBitPSW(const int bit, const bool v);
uint16_t getPSW() const { return psw; } uint16_t getPSW() const { return psw; }
void setPSW(uint16_t v, const bool limited); void setPSW(const uint16_t v, const bool limited);
uint16_t getStackLimitRegister() { return stackLimitRegister; } uint16_t getStackLimitRegister() { return stackLimitRegister; }
void setStackLimitRegister(const uint16_t v) { stackLimitRegister = v; } void setStackLimitRegister(const uint16_t v) { stackLimitRegister = v; }