X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=forth.jl.git;a=blobdiff_plain;f=src%2Fforth.jl;h=63e7d576e70e3af8d8855ccb5f9cb932bb0fb81a;hp=da7321b0f596494a06fed518b40d7f4d17fac9dd;hb=19d08aee45587ac2b84f6c413fc53542d50c52cc;hpb=dafc6784df0004f3fe302fd1d43ba3eaaf41ee2d diff --git a/src/forth.jl b/src/forth.jl index da7321b..63e7d57 100644 --- a/src/forth.jl +++ b/src/forth.jl @@ -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 # LFA of latest word in system dict +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 # no previous definition +mem[CURRENT] = FORTH_LATEST # Compile words to system dict initially DICT = mem[H] # Save bottom of dictionary as constant @@ -213,7 +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) @@ -698,7 +697,7 @@ end) # Dictionary searches -LFATOCFA_CFA = defPrimWord("LFA>CFA", () -> begin +FROMLINK_CFA = defPrimWord("LINK>", () -> begin addr = popPS() lenAndFlags = mem[addr+1] @@ -709,7 +708,13 @@ LFATOCFA_CFA = defPrimWord("LFA>CFA", () -> begin return NEXT end) -TOBODY_CFA = defWord(">BODY", [INCR_CFA, EXIT_CFA]) +createHeader("FORTH", 0) +FORTH_CFA = mem[H] +dictWrite(defPrim(() -> begin + mem[CONTEXT] = reg.W + return NEXT +end, name="FORTH")) +dictWrite(FORTH_LATEST) CONTEXT, CONTEXT_CFA = defNewVar("CONTEXT", zeros(Int64, 100)) mem[CONTEXT] = FORTH_CFA @@ -728,8 +733,7 @@ FIND_CFA = defPrimWord("FIND", () -> begin lfa = 0 for vocabCFA in reverse(context) - callPrim(mem[vocabCFA]) - lfa = popPS() + lfa = mem[vocabCFA+1] while (lfa = mem[lfa]) > 0 @@ -755,7 +759,7 @@ FIND_CFA = defPrimWord("FIND", () -> begin if lfa > 0 pushPS(lfa) - callPrim(mem[LFATOCFA_CFA]) + callPrim(mem[FROMLINK_CFA]) if (lenAndFlags & F_IMMED) == F_IMMED pushPS(1) else @@ -890,7 +894,7 @@ end, name="DODOES") DOES_HELPER_CFA = defPrimWord("(DOES>)", () -> begin pushPS(mem[mem[CURRENT]]) - callPrim(mem[LFATOCFA_CFA]) + callPrim(mem[FROMLINK_CFA]) cfa = popPS() runtimeAddr = popPS() @@ -901,7 +905,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,