# Built-in variables
nextVarAddr = 1
-H = nextVarAddr; nextVarAddr += 1
-LATEST = nextVarAddr; nextVarAddr += 1
+H = nextVarAddr; nextVarAddr += 1 # Next free memory address
+LATEST = nextVarAddr; nextVarAddr += 1 # LFA of latest word in systetm 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[H] = TIB + size_TIB # location of bottom of dictionary
mem[LATEST] = 0 # no previous definition
DICT = mem[H] # Save bottom of dictionary as constant
end)))
end
-function defNewVar(name::AbstractString, initial::Int64; flags::Int64=0)
+function defNewVar(name::AbstractString, initial::Array{Int64,1}; flags::Int64=0)
createHeader(name, flags)
codeWordAddr = mem[H]
varAddr = mem[H] + 1
mem[mem[H]] = DOVAR; mem[H] += 1
- mem[mem[H]] = initial; mem[H] += 1
+ mem[mem[H]:(mem[H]+length(initial)-1)] = initial; mem[H] += length(initial)
return varAddr, codeWordAddr
end
+defNewVar(name::AbstractString, initial::Int64; flags::Int64=0) =
+ defNewVar(name, [initial]; flags=flags)
+
function defConst(name::AbstractString, val::Int64; flags::Int64=0)
createHeader(name, flags)
return NEXT
end)
-BTICK_CFA = defWord("[']",
- [FROMR_CFA, DUP_CFA, INCR_CFA, TOR_CFA, FETCH_CFA, EXIT_CFA])
-
HERE_CFA = defWord("HERE",
[H_CFA, FETCH_CFA, EXIT_CFA])
end, flags=F_IMMED)
DOES_CFA = defWord("DOES>",
- [BTICK_CFA, LIT_CFA, COMMA_CFA, HERE_CFA, LIT_CFA, 3, ADD_CFA, COMMA_CFA,
- BTICK_CFA, DOES_HELPER_CFA, COMMA_CFA, BTICK_CFA, EXIT_CFA, COMMA_CFA, EXIT_CFA],
+ [LIT_CFA, LIT_CFA, COMMA_CFA, HERE_CFA, LIT_CFA, 3, ADD_CFA, COMMA_CFA,
+ LIT_CFA, DOES_HELPER_CFA, COMMA_CFA, LIT_CFA, EXIT_CFA, COMMA_CFA, EXIT_CFA],
flags=F_IMMED)
LBRAC_CFA = defPrimWord("[", () -> begin
COMMA_CFA, BRANCH_CFA, -29,
# No word found, parse number
- NUMBER_CFA, BTICK_CFA, LIT_CFA, COMMA_CFA, COMMA_CFA, BRANCH_CFA, -36,
+ NUMBER_CFA, LIT_CFA, LIT_CFA, COMMA_CFA, COMMA_CFA, BRANCH_CFA, -36,
# Interpreting
FIND_CFA, QDUP_CFA, ZBRANCH_CFA, 5,
wordLen = mem[wordAddr-1]
word = getString(wordAddr, wordLen)
- push!(sources, open(word, "r"))
+ fname = word
+ if !isfile(fname)
+ fname = Pkg.dir("forth","src",word)
+ if !isfile(fname)
+ error("No file named $word found in current directory or package source directory.")
+ end
+ end
+ push!(sources, open(fname, "r"))
# Clear input buffer
mem[NUMTIB] = 0
initFileName = nothing
if isfile("lib.4th")
initFileName = "lib.4th"
-elseif isfile(Pkg.dir("forth/src/lib.4th"))
- initFileName = Pkg.dir("forth/src/lib.4th")
+elseif isfile(Pkg.dir("forth","src", "lib.4th"))
+ initFileName = Pkg.dir("forth","src","lib.4th")
end
function run(;initialize=true)