X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=src%2Fforth.jl;h=37c41ecd904585aeb08818976366039ceceaf834;hb=b45f369dd68575aa774d2122eaf9b6ec4ec49cb5;hp=aa93c2dccaf145a70322a91dee50b4b20db08447;hpb=d7ff8db7577277539dcc447df305cdf44e816d5f;p=forth.jl.git diff --git a/src/forth.jl b/src/forth.jl index aa93c2d..37c41ec 100644 --- a/src/forth.jl +++ b/src/forth.jl @@ -99,6 +99,10 @@ end 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] @@ -979,6 +983,8 @@ QUERY_CFA = defWord("QUERY", 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, @@ -1164,7 +1170,7 @@ INTERPRET_CFA = defWord("INTERPRET", [LIT_CFA, 32, WORD_CFA, # Read next space-delimited word DUP_CFA, FETCH_CFA, ZE_CFA, ZBRANCH_CFA, 3, - DROP_CFA, EXIT_CFA, # Exit if TIB is exhausted + DROP_CFA, EXIT_CFA, # Exit if input buffer is exhausted STATE_CFA, FETCH_CFA, ZBRANCH_CFA, 24, # Compiling @@ -1209,6 +1215,18 @@ QUIT_CFA = defWord("QUIT", INTERPRET_CFA, PROMPT_CFA, BRANCH_CFA,-4]) +INCLUDED_CFA = defWord("INCLUDED", + [SOURCE_ID_CFA, FETCH_CFA, TOR_CFA, # Store current source on return stack + 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, + DROP_CFA, EXIT_CFA]) + +INCLUDE_CFA = defWord("INCLUDE", [LIT_CFA, 32, WORD_CFA, INCLUDED_CFA]); + + ABORT_CFA = defWord("ABORT", [CLOSE_FILES_CFA, PSP0_CFA, PSPSTORE_CFA, QUIT_CFA]) @@ -1217,6 +1235,10 @@ BYE_CFA = defPrimWord("BYE", () -> begin return 0 end) +EOF_CFA = defPrimWord("\x04", () -> begin + return 0 +end) + #### VM loop #### initialized = false @@ -1229,6 +1251,10 @@ end 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 @@ -1242,12 +1268,10 @@ function run(;initialize=true) 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))")