+TWOOVER = defPrimWord("2OVER", () -> begin
+ ensurePSDepth(4)
+ a = mem[reg.PSP-3]
+ b = mem[reg.PSP-2]
+ pushPS(a)
+ pushPS(b)
+ return NEXT
+end)
+
+QDUP = defPrimWord("?DUP", () -> begin
+ ensurePSDepth(1)
+ val = mem[reg.PSP]
+ if val != 0
+ pushPS(val)
+ end
+ return NEXT
+end)
+
+INCR = defPrimWord("1+", () -> begin
+ ensurePSDepth(1)
+ mem[reg.PSP] += 1
+ return NEXT
+end)
+
+DECR = defPrimWord("1-", () -> begin
+ ensurePSDepth(1)
+ mem[reg.PSP] -= 1
+ return NEXT
+end)
+
+INCR2 = defPrimWord("2+", () -> begin
+ ensurePSDepth(1)
+ mem[reg.PSP] += 2
+ return NEXT
+end)
+
+DECR2 = defPrimWord("2-", () -> begin
+ ensurePSDepth(1)
+ mem[reg.PSP] -= 2
+ return NEXT
+end)
+
+ADD = defPrimWord("+", () -> begin
+ b = popPS()
+ a = popPS()
+ pushPS(a+b)
+ return NEXT
+end)
+
+SUB = defPrimWord("-", () -> begin
+ b = popPS()
+ a = popPS()
+ pushPS(a-b)
+ return NEXT
+end)
+
+MUL = defPrimWord("*", () -> begin
+ b = popPS()
+ a = popPS()
+ pushPS(a*b)
+ return NEXT
+end)
+
+DIVMOD = defPrimWord("/MOD", () -> begin
+ b = popPS()
+ a = popPS()
+ q,r = divrem(a,b)
+ pushPS(r)
+ pushPS(q)
+ return NEXT
+end)
+
+TWOMUL = defPrimWord("2*", () -> begin
+ pushPS(popPS() << 1)
+ return NEXT
+end)
+
+TWODIV = defPrimWord("2/", () -> begin
+ pushPS(popPS() >> 1)
+ return NEXT
+end)
+
+EQU = defPrimWord("=", () -> begin
+ b = popPS()
+ a = popPS()
+ pushPS(a==b ? -1 : 0)
+ return NEXT
+end)
+
+NEQU = defPrimWord("<>", () -> begin
+ b = popPS()
+ a = popPS()
+ pushPS(a!=b ? -1 : 0)
+ return NEXT
+end)
+
+LT = defPrimWord("<", () -> begin
+ b = popPS()
+ a = popPS()
+ pushPS(a<b ? -1 : 0)
+ return NEXT
+end)
+
+GT = defPrimWord(">", () -> begin
+ b = popPS()
+ a = popPS()
+ pushPS(a>b ? -1 : 0)
+ return NEXT
+end)
+
+LE = defPrimWord("<=", () -> begin
+ b = popPS()
+ a = popPS()
+ pushPS(a<=b ? -1 : 0)
+ return NEXT
+end)
+
+GE = defPrimWord(">=", () -> begin
+ b = popPS()
+ a = popPS()
+ pushPS(a>=b ? -1 : 0)
+ return NEXT
+end)
+
+ZEQU = defPrimWord("0=", () -> begin
+ pushPS(popPS() == 0 ? -1 : 0)
+ return NEXT
+end)
+
+ZNEQU = defPrimWord("0<>", () -> begin
+ pushPS(popPS() != 0 ? -1 : 0)
+ return NEXT
+end)
+
+ZLT = defPrimWord("0<", () -> begin
+ pushPS(popPS() < 0 ? -1 : 0)
+ return NEXT
+end)
+
+ZGT = defPrimWord("0>", () -> begin
+ pushPS(popPS() > 0 ? -1 : 0)
+ return NEXT
+end)
+
+ZLE = defPrimWord("0<=", () -> begin
+ pushPS(popPS() <= 0 ? -1 : 0)
+ return NEXT
+end)
+
+ZGE = defPrimWord("0>=", () -> begin
+ pushPS(popPS() >= 0 ? -1 : 0)
+ return NEXT
+end)
+
+AND = defPrimWord("AND", () -> begin
+ b = popPS()
+ a = popPS()
+ pushPS(a & b)
+ return NEXT
+end)
+
+OR = defPrimWord("OR", () -> begin
+ b = popPS()
+ a = popPS()
+ pushPS(a | b)
+ return NEXT
+end)
+
+XOR = defPrimWord("XOR", () -> begin
+ b = popPS()
+ a = popPS()
+ pushPS(a $ b)
+ return NEXT
+end)
+
+INVERT = defPrimWord("INVERT", () -> begin
+ pushPS(~popPS())
+ return NEXT
+end)
+
+# Literals
+
+LIT = defPrimWord("LIT", () -> begin
+ pushPS(mem[reg.IP])
+ reg.IP += 1