Typo fixes.
[forth.jl.git] / src / forth.jl
index 01618f4..5978fb1 100644 (file)
@@ -659,9 +659,97 @@ end)
 
 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
 
@@ -678,7 +766,7 @@ function dump(startAddr::Int64; count::Int64 = 100, cellsPerLine::Int64 = 10)
 
         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] = '.'