TODFA = defWord(">DFA", [TOCFA, INCR, EXIT])
+# Compilation
+
+CREATE = defPrim("CREATE", () -> begin
+
+ wordLen = popPS()
+ wordAddr = popPS()
+ word = ASCIIString([Char(c) for c in mem[wordAddr:(wordAddr+wordLen-1)]])
+
+ mem[mem[HERE]] = mem[LATEST]; mem[HERE] += 1
+ mem[LATEST] = mem[HERE]
+ mem[mem[HERE]] = wordLen; mem[HERE] += 1
+
+ mem[mem[HERE]:(mem[HERE]+wordLen-1)] = collect(Int64, word)
+ mem[HERE] += wordLen
+
+ return mem[NEXT]
+end)
+
+COMMA = defPrim(",", () -> begin
+ mem[mem[HERE]] = popPS()
+ mem[HERE] += 1
+
+ return mem[NEXT]
+end)
+
+LBRAC = defPrim("[", () -> begin
+ mem[STATE] = 0
+ return mem[NEXT]
+end, flags=F_IMMED)
+
+RBRAC = defPrim("]", () -> begin
+ mem[STATE] = 1
+ return mem[NEXT]
+end, flags=F_IMMED)
+
+HIDDEN = defPrim("HIDDEN", () -> begin
+ addr = popPS() + 1
+ mem[addr] = mem[addr] $ F_HIDDEN
+ return mem[NEXT]
+end)
+
+HIDE = defWord("HIDE",
+ [WORD,
+ FIND,
+ HIDDEN,
+ EXIT])
+
+COLON = defWord(":",
+ [WORD,
+ CREATE,
+ LIT, DOCOL, COMMA,
+ LATEST, FETCH, HIDDEN,
+ RBRAC,
+ EXIT])
+
+SEMICOLON = defWord(";",
+ [LIT, EXIT, COMMA,
+ LATEST, FETCH, HIDDEN,
+ LBRAC,
+ EXIT], flags=F_IMMED)
+
+IMMEDIATE = defPrim("IMMEDIATE", () -> begin
+ lenAndFlagsAddr = mem[LATEST] + 1
+ mem[lenAndFlagsAddr] = mem[lenAndFlagsAddr] $ F_IMMED
+ return mem[NEXT]
+end, flags=F_IMMED)
+
+TICK = defWord("'", [WORD, FIND, TOCFA, EXIT])
+
+# Branching
+
+BRANCH = defPrim("BRANCH", () -> begin
+ reg.IP += mem[reg.IP]
+ return mem[NEXT]
+end)
+
+ZBRANCH = defPrim("0BRANCH", () -> begin
+ if (popPS() == 0)
+ reg.IP += mem[reg.IP]
+ else
+ reg.IP += 1
+ end
+
+ return mem[NEXT]
+end)
+
+# Strings
+
#### VM loop ####
function runVM()
- jmp = NEXT
+ jmp = mem[NEXT]
while (jmp = callPrim(jmp)) != 0 end
end
print("\t$(mem[addr]) ")
- if (mem[addr]>=32 && mem[addr]<176)
+ if (mem[addr]>=32 && mem[addr]<128)
chars[i%cellsPerLine + 1] = Char(mem[addr])
else
chars[i%cellsPerLine + 1] = '.'