From: Ralph Ronnquist Date: Thu, 3 Jun 2021 11:03:22 +0000 (+1000) Subject: add INPUT variable for current eval stream X-Git-Url: https://git.rrq.au/?a=commitdiff_plain;h=97a4e5ecb1623dbe0fbd7b6eeb96e966c6c5b1d3;p=rrq%2Frrqforth.git add INPUT variable for current eval stream --- diff --git a/compile.asm b/compile.asm index fe19b20..bcffaef 100644 --- a/compile.asm +++ b/compile.asm @@ -49,7 +49,7 @@ p_create_COPY: ;; ( "word" -- cfa ) ;; Find the following word and push its cfa, or 0 pushr rsi - DOFORTH p_stdin, p_read_word, p_find + DOFORTH p_input, p_get, p_read_word, p_find cmp qword[rsp],0 jne p_quote_tfa add rsp,16 @@ -241,6 +241,10 @@ p_numper_POSITIVE: popr rsi next + WORD p_input,'INPUT',dovariable + ;; The current input stream for evaluate-stream + dq 0 + WORD p_this_word,'THIS-WORD',dovariable dq 0,0 ; ( n chars* ) @@ -248,26 +252,23 @@ p_numper_POSITIVE: ;; ( stream* -- *?* flag ) ;; Execute the words from the given stream ;; returns 1 if stream ends and 0 if an unknown word is found - dq p_gtR ; Keep the stream on the return stack. + dq p_input, p_get, p_gtR ; save old stream on R-stack + dq p_input, p_put p_evaluate_stream_PROMPT: - dq p_verboseQ - dq p_get + dq p_verboseQ, p_get BRANCH 0,p_evaluate_stream_LOOP - dq p_depth - dq p_dot + dq p_depth, p_dot dq p_literal_string STRING '> ' dq p_tell - dq p_Rget + dq p_input, p_get dq p_clear_stream p_evaluate_stream_LOOP: - dq p_Rget + dq p_input, p_get dq p_read_word dq p_dup BRANCH 0,p_evaluate_stream_END ; branch if 0 on TOP - dq p_2dup - dq p_this_word - dq p_2put + dq p_2dup, p_this_word, p_2put dq p_find dq p_dup BRANCH 0,p_evaluate_stream_NOTWORD ; branch if 0 on TOP @@ -293,13 +294,12 @@ p_evaluate_stream_NOTWORD: dq p_dup BRANCH 0,p_evaluate_stream_BAD ; branch if 0 dq p_drop - dq p_state - dq p_get + dq p_state, p_get BRANCH 0,p_evaluate_stream_AFTER ; branch if 0 dq p_literal, p_literal dq p_comma, p_comma p_evaluate_stream_AFTER: - dq p_Rget + dq p_input, p_get dq p_stream_nchars BRANCH 0,p_evaluate_stream_PROMPT BRANCH ,p_evaluate_stream_LOOP @@ -307,8 +307,7 @@ p_evaluate_stream_END: dq p_2drop dq p_literal, 1 p_evaluate_stream_BAD: - dq p_Rgt - dq p_drop + dq p_Rgt, p_input, p_put ; restore previous stream dq p_exit WORD p_colon,':' @@ -316,7 +315,7 @@ p_evaluate_stream_BAD: ;; Read next word as a new word into current wordlist, set it ;; to be a doforth word, and set compiling mode. dq p_literal, doforth - dq p_stdin + dq p_input, p_get dq p_read_word dq p_create dq p_tfa2cfa diff --git a/rrqforth.asm b/rrqforth.asm index 1928fbb..f0ef63a 100644 --- a/rrqforth.asm +++ b/rrqforth.asm @@ -181,7 +181,7 @@ include 'compile.asm' WORD p_lparen,'(',fasm,IMMEDIATE pushr rsi p_lparen_loop: - DOFORTH p_stdin, p_read_word + DOFORTH p_input, p_get, p_read_word pop rax pop rbx cmp rax,0 ; end of stream @@ -242,7 +242,6 @@ main_is_not_verbose: last_forth_word: WORD p_quit,'QUIT',fasm ;; QUIT is the program entry point ******************** - mov rsp,DS_TOP mov rbp,RS_TOP cmp qword [p_stdin_DFA],0 @@ -254,7 +253,7 @@ last_forth_word: pop qword [p_stdin_DFA] ; Assign STDIN p_quit_INITIALIZED: - ;; Initial blurb + ;; Setup INPUT from STDIN FORTH dq p_verboseQ dq p_get @@ -262,8 +261,7 @@ p_quit_INITIALIZED: dq p_program_version dq p_tell p_quit_EVAL: - dq p_stdin - dq p_evaluate_stream + dq p_stdin, p_evaluate_stream BRANCH 0,p_quit_ERROR dq p_false dq sys_exit diff --git a/stdio.asm b/stdio.asm index 658e42f..eeac438 100644 --- a/stdio.asm +++ b/stdio.asm @@ -219,7 +219,7 @@ p_read_word_nomore: push p_pad_DFA push 0 p_double_quote_loop: - DOFORTH p_stdin, p_read_stream_char + DOFORTH p_input, p_get, p_read_stream_char pop rax cmp rax,0 jl p_double_quote_endstream