X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=forth.jl.git;a=blobdiff_plain;f=src%2Fforth.jl;h=766bd4e1cdf2f3ff24685ab186a75188103f8202;hp=0803b72bef75e92014f84a5533f1f873094cde61;hb=4b2f52917ce00e4af92d2a3a86e199d21748da5b;hpb=d0d02a9174dd0a8e4e0c37dc2d990d692ee9a73d diff --git a/src/forth.jl b/src/forth.jl index 0803b72..766bd4e 100644 --- a/src/forth.jl +++ b/src/forth.jl @@ -121,7 +121,13 @@ function defPrim(f::Function; name="nameless") return -length(primitives) end -callPrim(addr::Int64) = primitives[-addr]() +function callPrim(addr::Int64) + if addr >=0 || -addr>length(primitives) + error("Attempted to execute non-existent primitive at address $addr.") + else + primitives[-addr]() + end +end getPrimName(addr::Int64) = primNames[-addr] # Word creation functions @@ -721,9 +727,9 @@ end) # Outer interpreter TRACE = defPrimWord("TRACE", () -> begin - println("Val: $(popPS())") - print("RS: "); printRS() + println("reg.W: $(reg.W) reg.IP: $(reg.IP)") print("PS: "); printPS() + print("RS: "); printRS() print("[paused]") readline() @@ -936,9 +942,6 @@ IMMEDIATE = defPrimWord("IMMEDIATE", () -> begin return NEXT end, flags=F_IMMED) -TICK = defWord("'", - [LIT, 32, WORD, FIND, TOCFA, EXIT]) - #### VM loop #### @@ -950,7 +953,7 @@ elseif isfile(Pkg.dir("forth/src/lib.4th")) initFileName = Pkg.dir("forth/src/lib.4th") end -function run(;initialize=false) +function run(;initialize=true) # Begin with STDIN as source push!(sources, STDIN) @@ -984,6 +987,11 @@ function run(;initialize=false) close(pop!(sources)) end + # Want backtrace in here eventually + println("reg.W: $(reg.W) reg.IP: $(reg.IP)") + print("PS: "); printPS() + print("RS: "); printRS() + mem[STATE] = 0 mem[NUMTIB] = 0 reg.PSP = mem[PSP0]