Fixed stack overflow emulation

This commit is contained in:
2023-09-28 20:23:33 +02:00
parent 473a12798e
commit 846c7aad39

View File

@@ -933,7 +933,7 @@ class CPU(val mbus: MemBus, var tracer: ITracer = NullTracer()) {
}
else -> throw InvalidOpcodeException() // unreachable
}
if (mode >= 1 && reg == 6) {
if (mode >= 1 && reg == 6 && !src) {
checkSP(sp)
}
return decoded.bit(PADDR_DST_BIT, !src) bis PADDR_ARG_BIT
@@ -1186,23 +1186,15 @@ class CPU(val mbus: MemBus, var tracer: ITracer = NullTracer()) {
fun checkSP(addr: UShort): UShort {
if (cur_mode != 0) return addr
if (sp >= stack_limit + 256u) {
return addr
} else if (sp >= stack_limit + 224u) {
// if (cpu_err and CPU_ERR_STK_YLW == 0.toUShort()) {
logger.warn("Stack YLW")
// stack limit yellow
cpu_err = cpu_err or CPU_ERR_STK_YLW
setTrap(TrapReason.YEL)
// }
} else {
// if (cpu_err and CPU_ERR_STK_RED == 0.toUShort()) {
// Don't trigger if already triggered
logger.warn("Stack RED")
// we can always assume that this is running in kernel mode, as no stack check occurs in exec or user mode
trapRed()
if (sp < stack_limit + 224u || sp.toInt() and 0xFFFE == 0xFFFE) {
logger.warn("Stack RED")
trapRed()
throw EndCycle()
// stack limit red
} else if (sp < stack_limit + 256u) {
logger.warn("Stack YLW")
// stack limit yellow
cpu_err = cpu_err or CPU_ERR_STK_YLW
setTrap(TrapReason.YEL)
}
return addr
}