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
|
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
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user