getString(addr::Int64, len::Int64) = AbstractString([Char(c) for c in mem[addr:(addr+len-1)]])
+function putString(str::AbstractString, addr::Int64)
+ mem[addr:(addr+length(str)-1)] = [Int64(c) for c in str]
+end
+
function putString(str::AbstractString, addr::Int64, maxLen::Int64)
len = min(length(str), maxLen)
mem[addr:(addr+len-1)] = [Int64(c) for c in str]
FAM_WO_CFA = defConst("W/O", FAM_WO)
function fileOpener(create::Bool)
+ fam = popPS()
fnameLen = popPS()
fnameAddr = popPS()
- fam = popPS()
fname = getString(fnameAddr, fnameLen)
mode = "w"
end
+ global nextFileID
openFiles[nextFileID] = open(fname, mode)
pushPS(nextFileID)
pushPS(0)
fid = popPS()
close(openFiles[fid])
delete!(openFiles, fid)
+
+ pushPS(0) # Result code 0
return NEXT
end)
end
empty!(openFiles)
+ pushPS(0) # Result code 0
return NEXT
end)
TIB_CFA = defConst("TIB", TIB)
NUMTIB, NUMTIB_CFA = defNewVar("#TIB", 0)
-FIB_CFA = defConst("FIB", TIB)
+FIB_CFA = defConst("FIB", FIB)
NUMFIB, NUMFIB_CFA = defNewVar("#FIB", 0)
TOIN, TOIN_CFA = defNewVar(">IN", 0)
LIT_CFA, 0, TOIN_CFA, STORE_CFA,
EXIT_CFA])
+# ( fid -- flag )
+# Flag is false when EOF is reached.
QUERY_FILE_CFA = defWord("QUERY-FILE",
[FIB_CFA, LIT_CFA, 160, ROT_CFA, READ_LINE_CFA,
DROP_CFA, SWAP_CFA,
QUIT_CFA = defWord("QUIT",
[LIT_CFA, 0, STATE_CFA, STORE_CFA,
+ LIT_CFA, 0, SOURCE_ID_CFA, STORE_CFA,
LIT_CFA, 0, NUMTIB_CFA, STORE_CFA,
RSP0_CFA, RSPSTORE_CFA,
QUERY_CFA,
INTERPRET_CFA, PROMPT_CFA,
BRANCH_CFA,-4])
-INTERPRET_CFA = defWord("INTERPRET",
+INCLUDED_CFA = defWord("INCLUDED",
[SOURCE_ID_CFA, FETCH_CFA, TOR_CFA, # Store current source on return stack
-
- LIT_CFA, 32, WORD_CFA, # Read next word from current input source
-
- FAM_RO_CFA, FILE_OPEN, DROP_CFA, # Open the file named by this word.
-
+ FAM_RO_CFA, OPEN_FILE_CFA, DROP_CFA, # Open the file named by this word.
DUP_CFA, SOURCE_ID_CFA, STORE_CFA, # Mark this as the current source
-
DUP_CFA, QUERY_FILE_CFA, # Read line from file
-
INTERPRET_CFA,
+ INVERT_CFA, ZBRANCH_CFA, -5,
+ CLOSE_FILE_CFA, DROP_CFA,
+ FROMR_CFA, SOURCE_ID_CFA, STORE_CFA,
+ EXIT_CFA])
- BRANCH_CFA, -4]
+INCLUDE_CFA = defWord("INCLUDE", [LIT_CFA, 32, WORD_CFA, INCLUDED_CFA, EXIT_CFA]);
ABORT_CFA = defWord("ABORT",
- [CLOSE_FILES_CFA, PSP0_CFA, PSPSTORE_CFA, QUIT_CFA])
+ [CLOSE_FILES_CFA, DROP_CFA, PSP0_CFA, PSPSTORE_CFA, QUIT_CFA])
BYE_CFA = defPrimWord("BYE", () -> begin
println("\nBye!")
function run(;initialize=true)
+ # Start with IP pointing to first instruction of outer interpreter
+ pushRS(QUIT_CFA+1)
+
+ # Load library files
global initialized, initFileName
if !initialized && initialize
if initFileName != nothing
print("Including definitions from $initFileName...")
- # TODO
+ putString(initFileName, mem[H])
+ pushPS(mem[H])
+ pushPS(length(initFileName))
+ pushRS(INCLUDED_CFA+1)
initialized = true
else
end
end
- # Start with IP pointing to first instruction of outer interpreter
- reg.IP = QUIT_CFA + 1
# Primitive processing loop.
# Everyting else is simply a consequence of this loop!
- jmp = NEXT
+ jmp = mem[EXIT_CFA]
while jmp != 0
try
- #println("Entering prim $(getPrimName(jmp))")
+ #print("Entering prim $(getPrimName(jmp)), PS: ")
+ #printPS()
+
jmp = callPrim(jmp)
catch ex