From 846c7aad39c0b8774b5e4d0c864f6ea88e8c8c75 Mon Sep 17 00:00:00 2001 From: TQ Hirsch Date: Thu, 28 Sep 2023 20:23:33 +0200 Subject: [PATCH] Fixed stack overflow emulation --- src/main/kotlin/com/thequux/mcpdp/core/CPU.kt | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/com/thequux/mcpdp/core/CPU.kt b/src/main/kotlin/com/thequux/mcpdp/core/CPU.kt index 259e0af..5cf91cd 100644 --- a/src/main/kotlin/com/thequux/mcpdp/core/CPU.kt +++ b/src/main/kotlin/com/thequux/mcpdp/core/CPU.kt @@ -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 }