Implemented CURRENT, FORTH, ORDER.
[forth.jl.git] / src / forth.jl
index c5c7175..890cf24 100644 (file)
@@ -16,16 +16,16 @@ primNames = Array{ASCIIString,1}()
 # Built-in variables
 
 nextVarAddr = 1
-H = nextVarAddr; nextVarAddr += 1       # Next free memory address
-FORTH = nextVarAddr; nextVarAddr += 1   # LFA of latest word in system dict
-CURRENT = nextVarAddr; nextVarAddr += 1 # Current compilation dict
+H = nextVarAddr; nextVarAddr += 1              # Next free memory address
+FORTH_LATEST = nextVarAddr; nextVarAddr += 1   # FORTH dict latest
+CURRENT = nextVarAddr; nextVarAddr += 1        # Current compilation dict
 
 RSP0 = nextVarAddr                  # bottom of RS
 PSP0 = RSP0 + size_RS               # bottom of PS
 TIB = PSP0 + size_PS                # address of terminal input buffer
 mem[H] = TIB + size_TIB             # location of bottom of dictionary
-mem[FORTH] = 0                      # no previous definition
-mem[CURRENT] = FORTH                # Compile words to system dict initially
+mem[FORTH_LATEST] = 0               # zero FORTH dict latest (no previous def)
+mem[CURRENT] = FORTH_LATEST-1       # Compile words to system dict initially
 
 DICT = mem[H] # Save bottom of dictionary as constant
 
@@ -117,8 +117,8 @@ dictWrite(int::Int64) = dictWrite([int])
 dictWriteString(string::ASCIIString) = dictWrite([Int64(c) for c in string])
 
 function createHeader(name::AbstractString, flags::Int64)
-    mem[mem[H]] = mem[mem[CURRENT]]
-    mem[mem[CURRENT]] = mem[H]
+    mem[mem[H]] = mem[mem[CURRENT]+1]
+    mem[mem[CURRENT]+1] = mem[H]
     mem[H] += 1
 
     dictWrite(length(name) | flags | NFA_MARK)
@@ -213,8 +213,6 @@ end)
 # Dictionary entries for core built-in variables, constants
 
 H_CFA = defExistingVar("H", H)
-FORTH_CFA = defExistingVar("FORTH", FORTH)
-CURRENT_CFA = defExistingVar("CURRENT", CURRENT)
 
 PSP0_CFA = defConst("PSP0", PSP0)
 RSP0_CFA = defConst("RSP0", RSP0)
@@ -709,7 +707,21 @@ FROMLINK_CFA = defPrimWord("LINK>", () -> begin
     return NEXT
 end)
 
-CONTEXT, CONTEXT_CFA = defNewVar("CONTEXT", zeros(Int64, 100))
+createHeader("FORTH", 0)
+FORTH_CFA = mem[H]
+dictWrite(defPrim(() -> begin
+    mem[CONTEXT] = reg.W
+    return NEXT
+end, name="FORTH"))
+dictWrite(0) # cell for latest
+
+CURRENT_CFA = defExistingVar("CURRENT", CURRENT)
+
+# Switch to new FORTH vocabulary cfa
+mem[FORTH_CFA+1] = mem[mem[CURRENT]+1]
+mem[CURRENT] = FORTH_CFA
+
+CONTEXT, CONTEXT_CFA = defNewVar("CONTEXT", zeros(Int64, 10))
 mem[CONTEXT] = FORTH_CFA
 NUMCONTEXT, NUMCONTEXT_CFA = defNewVar("#CONTEXT", 1)
 
@@ -726,8 +738,7 @@ FIND_CFA = defPrimWord("FIND", () -> begin
     lfa = 0
 
     for vocabCFA in reverse(context)
-        callPrim(mem[vocabCFA])
-        lfa = popPS()
+        lfa = vocabCFA+1
 
         while (lfa = mem[lfa]) > 0
 
@@ -887,7 +898,7 @@ end, name="DODOES")
 
 DOES_HELPER_CFA = defPrimWord("(DOES>)", () -> begin
 
-    pushPS(mem[mem[CURRENT]])
+    pushPS(mem[mem[CURRENT]+1])
     callPrim(mem[FROMLINK_CFA])
     cfa = popPS()
 
@@ -899,7 +910,7 @@ DOES_HELPER_CFA = defPrimWord("(DOES>)", () -> begin
     end)), name="doesPrim")
 
     return NEXT
-end, flags=F_IMMED)
+end, flags=F_IMMED | F_HIDDEN)
 
 DOES_CFA = defWord("DOES>",
     [LIT_CFA, LIT_CFA, COMMA_CFA, HERE_CFA, LIT_CFA, 3, ADD_CFA, COMMA_CFA,
@@ -917,7 +928,7 @@ RBRAC_CFA = defPrimWord("]", () -> begin
 end, flags=F_IMMED)
 
 HIDDEN_CFA = defPrimWord("HIDDEN", () -> begin
-    lenAndFlagsAddr = mem[mem[CURRENT]] + 1
+    lenAndFlagsAddr = mem[mem[CURRENT]+1] + 1
     mem[lenAndFlagsAddr] = mem[lenAndFlagsAddr] $ F_HIDDEN
     return NEXT
 end)
@@ -937,7 +948,7 @@ SEMICOLON_CFA = defWord(";",
     EXIT_CFA], flags=F_IMMED)
 
 IMMEDIATE_CFA = defPrimWord("IMMEDIATE", () -> begin
-    lenAndFlagsAddr = mem[mem[CURRENT]] + 1
+    lenAndFlagsAddr = mem[mem[CURRENT]+1] + 1
     mem[lenAndFlagsAddr] = mem[lenAndFlagsAddr] $ F_IMMED
     return NEXT
 end, flags=F_IMMED)