X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=compile.asm;h=bcffaef4f02fda5c44ffd3cc0b48e2f281a1f636;hb=92ed95a59cba9c0685150503196877c3d81fedbc;hp=d5fee48e49add74dee2a2fa7941b039f2f769ceb;hpb=4a6f8e4302c3112badc2d23e878f6d28d024cd9b;p=rrq%2Frrqforth.git diff --git a/compile.asm b/compile.asm index d5fee48..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 @@ -340,3 +339,25 @@ p_evaluate_stream_BAD: mov rax,qword [rax] ; tfa of most recent word mov qword [rax+16],1 ; set the flags field to 1 next + + WORD p_open_file_quote,'OPEN-FILE"' + ;; ( "name" -- fd ) + dq p_double_quote + dq p_create + dq p_tfa2namez + dq p_literal,0 + dq p_literal,0 + dq sys_open + dq p_exit + + WORD p_load_file_quote,'LOAD-FILE"' + ;; ( "name" -- ) + ;; Create a word for the nominated file for a stream to, + ;; and store that stream pointer, then invoke evaluate-stream + dq p_open_file_quote ; fd + dq p_literal, 15000 ; buffer size + dq p_stream + dq p_dup + dq p_comma + dq p_evaluate_stream + dq p_exit