+ pushPS(latest)
+
+ return NEXT
+end)
+
+TOCFA = defPrimWord(">CFA", () -> begin
+
+ addr = popPS()
+ lenAndFlags = mem[addr+1]
+ len = lenAndFlags & F_LENMASK
+
+ pushPS(addr + 2 + len)
+
+ return NEXT
+end)
+
+TOPFA = defWord(">PFA", [TOCFA, INCR, EXIT])
+
+# Branching
+
+BRANCH = defPrimWord("BRANCH", () -> begin
+ reg.IP += mem[reg.IP]
+ return NEXT
+end)
+
+ZBRANCH = defPrimWord("0BRANCH", () -> begin
+ if (popPS() == 0)
+ reg.IP += mem[reg.IP]
+ else
+ reg.IP += 1
+ end
+
+ return NEXT
+end)
+
+# Strings
+
+LITSTRING = defPrimWord("LITSTRING", () -> begin
+ len = mem[reg.IP]
+ reg.IP += 1
+ pushPS(reg.IP)
+ pushPS(len)
+ reg.IP += len
+
+ return NEXT
+end)
+
+TYPE = defPrimWord("TYPE", () -> begin
+ len = popPS()
+ addr = popPS()
+ str = getString(addr, len)
+ print(str)
+ return NEXT
+end)
+
+# Outer interpreter
+
+TRACE = defPrimWord("TRACE", () -> begin
+ print("RS: "); printRS()
+ print("PS: "); printPS()
+ print("[paused]")
+ readline()
+
+ return NEXT
+end)
+
+COMMA = defPrimWord(",", () -> begin
+ mem[mem[HERE]] = popPS()
+ mem[HERE] += 1
+
+ return NEXT
+end)
+
+BTICK = defWord("[']",
+ [FROMR, DUP, INCR, TOR, FETCH, EXIT])
+
+EXECUTE = defPrimWord("EXECUTE", () -> begin
+ reg.W = popPS()
+ return mem[reg.W]
+end)
+
+TIB_CFA = defConst("TIB", TIB)
+NUMTIB, NUMTIB_CFA = defNewVar("#TIB", 0)
+TOIN, TOIN_CFA = defNewVar(">IN", 0)
+
+QUERY = defWord("QUERY",
+ [TIB_CFA, LIT, 80, EXPECT,
+ SPAN_CFA, FETCH, NUMTIB_CFA, STORE,
+ LIT, 0, TOIN_CFA, STORE,
+ EXIT])
+
+WORD = defPrimWord("WORD", () -> begin
+ delim = popPS()
+
+ # Chew up initial occurrences of delim
+ while (mem[TOIN]<mem[NUMTIB] && mem[TIB+mem[TOIN]] == delim)
+ mem[TOIN] += 1
+ end
+
+ countAddr = mem[HERE]
+ addr = mem[HERE]+1
+
+ # Start reading in word
+ count = 0
+ while (mem[TOIN]<mem[NUMTIB])
+ mem[addr] = mem[TIB+mem[TOIN]]
+ mem[TOIN] += 1
+
+ if (mem[addr] == delim)
+ break