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
}
}