Fixed stack overflow emulation
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
Reference in New Issue
Block a user