From 81df43061870de0bbe2cb4f866d238ef72c21052 Mon Sep 17 00:00:00 2001 From: Tim Vaughan Date: Mon, 10 Oct 2016 19:19:37 +1300 Subject: [PATCH] INCLUDED now reads library up to end of lib_1_basic.4th. Turns out that outer interpreter cannot rely on stack being untouched between INTERPRET calls. Duh! --- src/forth.jl | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/forth.jl b/src/forth.jl index d6a3ff9..4013917 100644 --- a/src/forth.jl +++ b/src/forth.jl @@ -999,11 +999,13 @@ QUERY_CFA = defWord("QUERY", LIT_CFA, 0, TOIN_CFA, STORE_CFA, EXIT_CFA]) -# ( fid -- flag ) -# Flag is false when EOF is reached. +EOF_FLAG, EOF_FLAG_CFA = defNewVar("EOF-FLAG", 0) + +# ( fid -- ) +# EOF-FLAG is set to true if EOF is reached QUERY_FILE_CFA = defWord("QUERY-FILE", [FIB_CFA, LIT_CFA, 160, ROT_CFA, READ_LINE_CFA, - DROP_CFA, SWAP_CFA, + DROP_CFA, EOF_FLAG_CFA, STORE_CFA, NUMFIB_CFA, STORE_CFA, LIT_CFA, 0, TOIN_CFA, STORE_CFA, EXIT_CFA]) @@ -1236,15 +1238,15 @@ QUIT_CFA = defWord("QUIT", BRANCH_CFA,-4]) # Loop INCLUDED_CFA = defWord("INCLUDED", - [LIT_CFA, 0, STATE_CFA, STORE_CFA, # Set mode to interpret - FAM_RO_CFA, OPEN_FILE_CFA, DROP_CFA, # Open the file - SOURCE_ID_CFA, FETCH_CFA, SWAP_CFA, # Store current source on stack - DUP_CFA, SOURCE_ID_CFA, STORE_CFA, # Mark this as the current source - DUP_CFA, QUERY_FILE_CFA, # Read line from file - INTERPRET_CFA, # Interpret line - ZBRANCH_CFA, -4, # Loop if not EOF - CLOSE_FILE_CFA, DROP_CFA, # Close file - SOURCE_ID_CFA, STORE_CFA, # Restore input source + [LIT_CFA, 0, STATE_CFA, STORE_CFA, # Set mode to interpret + FAM_RO_CFA, OPEN_FILE_CFA, DROP_CFA, # Open the file + SOURCE_ID_CFA, FETCH_CFA, SWAP_CFA, # Store current source on stack + SOURCE_ID_CFA, STORE_CFA, # Mark this as the current source + SOURCE_ID_CFA, FETCH_CFA, QUERY_FILE_CFA, # Read line from file + INTERPRET_CFA, # Interpret line + EOF_FLAG_CFA, FETCH_CFA, ZBRANCH_CFA, -7, # Loop if not EOF + CLOSE_FILE_CFA, DROP_CFA, # Close file + SOURCE_ID_CFA, STORE_CFA, # Restore input source EXIT_CFA]) INCLUDE_CFA = defWord("INCLUDE", [LIT_CFA, 32, WORD_CFA, -- 2.20.1