From: Tim Vaughan Date: Tue, 24 May 2016 10:02:45 +0000 (+1200) Subject: Standardized HERE. X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=forth.jl.git;a=commitdiff_plain;h=e1382f5faa586f2a3e26c4d328c5aa61cbe950a2 Standardized HERE. --- diff --git a/src/forth.jl b/src/forth.jl index fb7121c..0194736 100644 --- a/src/forth.jl +++ b/src/forth.jl @@ -36,16 +36,16 @@ primNames = Array{ASCIIString,1}() # Built-in variables nextVarAddr = 1 -HERE = nextVarAddr; nextVarAddr += 1 +H = nextVarAddr; nextVarAddr += 1 LATEST = nextVarAddr; nextVarAddr += 1 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[H] = TIB + size_TIB # location of bottom of dictionary mem[LATEST] = 0 # no previous definition -DICT = mem[HERE] # Save bottom of dictionary as constant +DICT = mem[H] # Save bottom of dictionary as constant # VM registers type Reg @@ -136,20 +136,20 @@ F_HIDDEN = 256 F_LENMASK = 127 function createHeader(name::AbstractString, flags::Int64) - mem[mem[HERE]] = mem[LATEST] - mem[LATEST] = mem[HERE] - mem[HERE] += 1 + mem[mem[H]] = mem[LATEST] + mem[LATEST] = mem[H] + mem[H] += 1 - mem[mem[HERE]] = length(name) | flags; mem[HERE] += 1 - putString(name, mem[HERE]); mem[HERE] += length(name) + mem[mem[H]] = length(name) | flags; mem[H] += 1 + putString(name, mem[H]); mem[H] += length(name) end function defPrimWord(name::AbstractString, f::Function; flags::Int64=0) createHeader(name, flags) - codeWordAddr = mem[HERE] + codeWordAddr = mem[H] mem[codeWordAddr] = defPrim(f, name=name) - mem[HERE] += 1 + mem[H] += 1 return codeWordAddr end @@ -157,13 +157,13 @@ end function defWord(name::AbstractString, wordAddrs::Array{Int64,1}; flags::Int64=0) createHeader(name, flags) - addr = mem[HERE] - mem[mem[HERE]] = DOCOL - mem[HERE] += 1 + addr = mem[H] + mem[mem[H]] = DOCOL + mem[H] += 1 for wordAddr in wordAddrs - mem[mem[HERE]] = wordAddr - mem[HERE] += 1 + mem[mem[H]] = wordAddr + mem[H] += 1 end return addr @@ -182,11 +182,11 @@ end function defNewVar(name::AbstractString, initial::Int64; flags::Int64=0) createHeader(name, flags) - codeWordAddr = mem[HERE] - varAddr = mem[HERE] + 1 + codeWordAddr = mem[H] + varAddr = mem[H] + 1 - mem[mem[HERE]] = DOVAR; mem[HERE] += 1 - mem[mem[HERE]] = initial; mem[HERE] += 1 + mem[mem[H]] = DOVAR; mem[H] += 1 + mem[mem[H]] = initial; mem[H] += 1 return varAddr, codeWordAddr end @@ -194,10 +194,10 @@ end function defConst(name::AbstractString, val::Int64; flags::Int64=0) createHeader(name, flags) - codeWordAddr = mem[HERE] + codeWordAddr = mem[H] - mem[mem[HERE]] = DOCON; mem[HERE] += 1 - mem[mem[HERE]] = val; mem[HERE] += 1 + mem[mem[H]] = DOCON; mem[H] += 1 + mem[mem[H]] = val; mem[H] += 1 return codeWordAddr end @@ -233,7 +233,7 @@ end) # Dictionary entries for core built-in variables, constants -HERE_CFA = defExistingVar("HERE", HERE) +H_CFA = defExistingVar("H", H) LATEST_CFA = defExistingVar("LATEST", LATEST) PSP0_CFA = defConst("PSP0", PSP0) @@ -744,8 +744,8 @@ TRACE = defPrimWord("TRACE", () -> begin end) COMMA = defPrimWord(",", () -> begin - mem[mem[HERE]] = popPS() - mem[HERE] += 1 + mem[mem[H]] = popPS() + mem[H] += 1 return NEXT end) @@ -776,8 +776,8 @@ WORD = defPrimWord("WORD", () -> begin mem[TOIN] += 1 end - countAddr = mem[HERE] - addr = mem[HERE]+1 + countAddr = mem[H] + addr = mem[H]+1 # Start reading in word count = 0 @@ -804,7 +804,7 @@ PARSE = defPrimWord("PARSE", () -> begin delim = popPS() # Chew up initial occurrences of delim - addr = mem[HERE] + addr = mem[H] # Start reading input stream count = 0 diff --git a/src/lib.4th b/src/lib.4th index e258ea7..f8eb737 100644 --- a/src/lib.4th +++ b/src/lib.4th @@ -27,6 +27,8 @@ : DEPTH PSP@ PSP0 - ; +: HERE H @ ; + : '\n' 10 ; : BL 32 ; @@ -60,54 +62,54 @@ : IF IMMEDIATE ['] 0BRANCH , \ compile 0BRANCH - HERE @ \ save location of the offset on the stack + HERE \ save location of the offset on the stack 0 , \ compile a dummy offset ; : THEN IMMEDIATE DUP - HERE @ SWAP - \ calculate the offset from the address saved on the stack + HERE SWAP - \ calculate the offset from the address saved on the stack SWAP ! \ store the offset in the back-filled location ; : ELSE IMMEDIATE ['] BRANCH , \ definite branch to just over the false-part - HERE @ \ save location of the offset on the stack + HERE \ save location of the offset on the stack 0 , \ compile a dummy offset SWAP \ now back-fill the original (IF) offset DUP \ same as for THEN word above - HERE @ SWAP - + HERE SWAP - SWAP ! ; : BEGIN IMMEDIATE - HERE @ \ save location on the stack + HERE \ save location on the stack ; : UNTIL IMMEDIATE ['] 0BRANCH , \ compile 0BRANCH - HERE @ - \ calculate the offset from the address saved on the stack + HERE - \ calculate the offset from the address saved on the stack , \ compile the offset here ; : AGAIN IMMEDIATE ['] BRANCH , \ compile BRANCH - HERE @ - \ calculate the offset back + HERE - \ calculate the offset back , \ compile the offset here ; : WHILE IMMEDIATE ['] 0BRANCH , \ compile 0BRANCH - HERE @ \ save location of the offset2 on the stack + HERE \ save location of the offset2 on the stack 0 , \ compile a dummy offset2 ; : REPEAT IMMEDIATE ['] BRANCH , \ compile BRANCH SWAP \ get the original offset (from BEGIN) - HERE @ - , \ and compile it after BRANCH + HERE - , \ and compile it after BRANCH DUP - HERE @ SWAP - \ calculate the offset2 + HERE SWAP - \ calculate the offset2 SWAP ! \ and back-fill it in the original location ; @@ -119,15 +121,15 @@ : DO IMMEDIATE ['] LIT , -1 , [COMPILE] IF ['] >R , ['] >R , - ['] LIT , HERE @ 0 , ['] >R , - HERE @ + ['] LIT , HERE 0 , ['] >R , + HERE ; : ?DO IMMEDIATE ['] 2DUP , ['] - , [COMPILE] IF ['] >R , ['] >R , - ['] LIT , HERE @ 0 , ['] >R , - HERE @ + ['] LIT , HERE 0 , ['] >R , + HERE ; : I RSP@ 3 - @ ; @@ -137,7 +139,7 @@ : ?LEAVE IMMEDIATE ['] 0BRANCH , 13 , ['] R> , ['] RDROP , ['] RDROP , - ['] LIT , HERE @ 7 + , ['] DUP , ['] -ROT , ['] - , ['] SWAP , ['] ! , + ['] LIT , HERE 7 + , ['] DUP , ['] -ROT , ['] - , ['] SWAP , ['] ! , ['] BRANCH , 0 , ; @@ -162,13 +164,13 @@ [COMPILE] THEN \ Branch back to begining of loop kernel - ['] 0BRANCH , HERE @ - , + ['] 0BRANCH , HERE - , \ Clean up ['] RDROP , ['] RDROP , ['] RDROP , \ Record address of loop end for any LEAVEs to use - HERE @ SWAP ! + HERE SWAP ! [COMPILE] ELSE ['] 2DROP , \ Clean up if loop was entirely skipped (?DO) @@ -418,14 +420,14 @@ ( C, appends a byte to the current compiled word. ) : C, - HERE @ C! - 1 HERE +! + HERE C! + 1 H +! ; : S" IMMEDIATE ( -- addr len ) STATE @ IF ( compiling? ) ['] LITSTRING , ( compile LITSTRING ) - HERE @ ( save the address of the length word on the stack ) + HERE ( save the address of the length word on the stack ) 0 , ( dummy length - we don't know what it is yet ) BEGIN @@ -441,11 +443,11 @@ REPEAT DROP ( drop the double quote character at the end ) DUP ( get the saved address of the length word ) - HERE @ SWAP - ( calculate the length ) + HERE SWAP - ( calculate the length ) 1- ( subtract 1 (because we measured from the start of the length word) ) SWAP ! ( and back-fill the length location ) ELSE ( immediate mode ) - HERE @ ( get the start address of the temporary space ) + HERE ( get the start address of the temporary space ) BEGIN >IN @ #TIB @ >= IF \ End of TIB? @@ -460,8 +462,8 @@ 1+ ( increment address ) REPEAT DROP ( drop the final " character ) - HERE @ - ( calculate the length ) - HERE @ ( push the start address ) + HERE - ( calculate the length ) + HERE ( push the start address ) SWAP ( addr len ) THEN ; @@ -504,7 +506,7 @@ ; : ALLOT ( n -- ) - HERE +! ( adds n to HERE, after this the old value of HERE is still on the stack ) + H +! ( adds n to H, after this the old value of H is still on the stack ) ; : VARIABLE @@ -617,7 +619,7 @@ : FORGET BL WORD FIND ( find the word, gets the dictionary entry address ) DUP @ LATEST ! ( set LATEST to point to the previous word ) - HERE ! ( and store HERE with the dictionary address ) + H ! ( and store H with the dictionary address ) ; ( DUMP ------------------------------------------------------------------------ ) @@ -655,7 +657,7 @@ ( Now we search again, looking for the next word in the dictionary. This gives us the length of the word that we will be decompiling. (Well, mostly it does). ) - HERE @ ( address of the end of the last compiled word ) + HERE ( address of the end of the last compiled word ) LATEST @ ( word last curr ) BEGIN 2 PICK ( word last curr word ) @@ -765,4 +767,4 @@ ( MEMORY ------------------------------------------------------------------ ) : UNUSED ( -- cells ) - MEMSIZE HERE @ - ; + MEMSIZE HERE - ;