3. Uxn stack

Wednesday 29th July 2026

Final Uxn Kotlin stack, we've added overflow and underflow error throwing plus a stack name so we know which stack it happened in.

package yorkshire.systems.kuxn.vm

import yorkshire.systems.kuxn.vm.UxnFault.Companion.Error

class Stack(private val name: String) {

    val data = IntArray(0x100)
    var pointer = 0

    private var keep = false
    private var keepPointer = 0

    fun beginInstruction(keep: Boolean) {
        this.keep = keep
        keepPointer = pointer
    }

    fun push(value: Int, short: Boolean) = if (short) push16(value) else push8(value)
    fun pop(short: Boolean) = if (short) pop16() else pop8()

    fun push8(value: Int) {
        if (pointer >= data.size) throw UxnFault(name, Error.OVERFLOW)
        data[pointer] = value and 0xff
        pointer++
    }

    fun push16(value: Int) {
        push8(value ushr 8)
        push8(value)
    }

    fun pop8(): Int = if (keep) {
        if (keepPointer <= 0) throw UxnFault(name, Error.UNDERFLOW)
        data[--keepPointer]
    } else {
        if (pointer <= 0) throw UxnFault(name, Error.UNDERFLOW)
        data[--pointer]
    }

    fun pop16(): Int {
        val lo = pop8()
        val hi = pop8()
        return (hi shl 8) or lo
    }
}