From: Tim Vaughan Date: Mon, 23 May 2016 12:48:59 +0000 (+1200) Subject: RSP0 and PSP0 now constants. Closes #4. X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=forth.jl.git;a=commitdiff_plain;h=87b17b0ee12c90f028186761fbb2bd5f6b4008eb RSP0 and PSP0 now constants. Closes #4. --- diff --git a/README.md b/README.md index fd8da69..612de1a 100644 --- a/README.md +++ b/README.md @@ -44,13 +44,12 @@ the library file. Once this is complete you can start entering forth commands: Notice that unlike other forths, forth.jl echos a newline after reading each line of standard input. This is an unfortunate side-effect of the way that -I've implemented the primitive word KEY. Hopefully I'll be able to fix this -in future. +I've implemented EXPECT. Hopefully I'll be able to fix this in future. There's an example Mandelbrot Set drawing program included in the examples directory. To run it, you'll have to locate this directory on your system (its location depends on what OS you happen to be using and how julia is installed). -Once found, use the "INCLUDE" word to compile its definitions. For example, on +Once found, use the INCLUDE word to compile its definitions. For example, on my system I can run the example in this way: include /home/tim/.julia/v0.4/forth/examples/mandelbrot.4th diff --git a/src/forth.jl b/src/forth.jl index cdb56d5..fb7121c 100644 --- a/src/forth.jl +++ b/src/forth.jl @@ -36,16 +36,14 @@ primNames = Array{ASCIIString,1}() # Built-in variables nextVarAddr = 1 -RSP0 = nextVarAddr; nextVarAddr += 1 -PSP0 = nextVarAddr; nextVarAddr += 1 HERE = nextVarAddr; nextVarAddr += 1 LATEST = nextVarAddr; nextVarAddr += 1 -mem[RSP0] = nextVarAddr # bottom of RS -mem[PSP0] = mem[RSP0] + size_RS # bottom of PS -TIB = mem[PSP0] + size_PS # address of terminal input buffer -mem[HERE] = TIB + size_TIB # location of bottom of dictionary -mem[LATEST] = 0 # no previous definition +RSP0 = nextVarAddr # bottom of RS +PSP0 = RSP0 + size_RS # bottom of PS +TIB = PSP0 + size_PS # address of terminal input buffer +mem[HERE] = TIB + size_TIB # location of bottom of dictionary +mem[LATEST] = 0 # no previous definition DICT = mem[HERE] # Save bottom of dictionary as constant @@ -56,7 +54,7 @@ type Reg IP::Int64 # Instruction pointer W::Int64 # Working register end -reg = Reg(mem[RSP0], mem[PSP0], 0, 0) +reg = Reg(RSP0, PSP0, 0, 0) # Stack manipulation functions @@ -66,8 +64,8 @@ type ReturnStackUnderflow <: Exception end Base.showerror(io::IO, ex::ParamStackUnderflow) = print(io, "Parameter stack underflow.") Base.showerror(io::IO, ex::ReturnStackUnderflow) = print(io, "Return stack underflow.") -getRSDepth() = reg.RSP - mem[RSP0] -getPSDepth() = reg.PSP - mem[PSP0] +getRSDepth() = reg.RSP - RSP0 +getPSDepth() = reg.PSP - PSP0 function ensurePSDepth(depth::Int64) if getPSDepth() begin pushPS(32) @@ -1043,11 +1042,11 @@ function dump(startAddr::Int64; count::Int64 = 100, cellsPerLine::Int64 = 10) end function printPS() - count = reg.PSP - mem[PSP0] + count = reg.PSP - PSP0 if count > 0 print("<$count>") - for i in (mem[PSP0]+1):reg.PSP + for i in (PSP0+1):reg.PSP print(" $(mem[i])") end println() @@ -1057,11 +1056,11 @@ function printPS() end function printRS() - count = reg.RSP - mem[RSP0] + count = reg.RSP - RSP0 if count > 0 print("<$count>") - for i in (mem[RSP0]+1):reg.RSP + for i in (RSP0+1):reg.RSP print(" $(mem[i])") end println() diff --git a/src/lib.4th b/src/lib.4th index 301f9ac..e258ea7 100644 --- a/src/lib.4th +++ b/src/lib.4th @@ -25,7 +25,7 @@ : C@ @ ; : C, , ; -: DEPTH PSP@ PSP0 @ - ; +: DEPTH PSP@ PSP0 - ; : '\n' 10 ; : BL 32 ; @@ -362,7 +362,7 @@ : .S ( -- ) [CHAR] < EMIT DEPTH U. [CHAR] > EMIT SPACE - PSP0 @ 1+ + PSP0 1+ BEGIN DUP PSP@ 2 - <= WHILE