Revert "RTI/RTT shall not change the PSW in user/supervisor mode"
This reverts commit31edf022cc
.31edf02
breaks XXDP EKBAD0.BIC
This commit is contained in:
parent
c43c6618d9
commit
8809bb96e7
2 changed files with 12 additions and 20 deletions
28
cpu.cpp
28
cpu.cpp
|
@ -246,15 +246,17 @@ 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
2
cpu.h
|
@ -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; }
|
||||||
|
|
Loading…
Add table
Reference in a new issue