add INPUT variable for current eval stream
authorRalph Ronnquist <ralph.ronnquist@gmail.com>
Thu, 3 Jun 2021 11:03:22 +0000 (21:03 +1000)
committerRalph Ronnquist <ralph.ronnquist@gmail.com>
Thu, 3 Jun 2021 11:03:22 +0000 (21:03 +1000)
compile.asm
rrqforth.asm
stdio.asm

index fe19b203620ee3dab25f407657704c588641fe20..bcffaef4f02fda5c44ffd3cc0b48e2f281a1f636 100644 (file)
@@ -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
index 1928fbb80fdb038b125c037b10daccb46d99f357..f0ef63a248c087fb61bb38474fbe5faabbd0d879 100644 (file)
@@ -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
index 658e42f1364f40f49a83e0de708bdc357fca9b2d..eeac43874b332fb92e81784c941da12be5169f4e 100644 (file)
--- 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