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 else -> throw InvalidOpcodeException() // unreachable
} }
if (mode >= 1 && reg == 6) { if (mode >= 1 && reg == 6 && !src) {
checkSP(sp) checkSP(sp)
} }
return decoded.bit(PADDR_DST_BIT, !src) bis PADDR_ARG_BIT 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 { fun checkSP(addr: UShort): UShort {
if (cur_mode != 0) return addr if (cur_mode != 0) return addr
if (sp >= stack_limit + 256u) { if (sp < stack_limit + 224u || sp.toInt() and 0xFFFE == 0xFFFE) {
return addr logger.warn("Stack RED")
} else if (sp >= stack_limit + 224u) { trapRed()
// if (cpu_err and CPU_ERR_STK_YLW == 0.toUShort()) { throw EndCycle()
} else if (sp < stack_limit + 256u) {
logger.warn("Stack YLW") logger.warn("Stack YLW")
// stack limit yellow // stack limit yellow
cpu_err = cpu_err or CPU_ERR_STK_YLW cpu_err = cpu_err or CPU_ERR_STK_YLW
setTrap(TrapReason.YEL) 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()
throw EndCycle()
// stack limit red
} }
return addr return addr
} }