final(?) fixing of NUMBER and EVALUATE-STREAM
[rrq/rrqforth.git] / compile.asm
index d06913876a00feab6e6a6a2d74815cc3166b1f7c..3d5433ef5ff133ae51dfd033492fbe7336ce4f17 100644 (file)
@@ -141,7 +141,7 @@ p_create_COPY:
        pop rsi                 ; ( -- )
        xor rdi,rdi
 p_number_LOOP:
-       dec rbx
+       dec rcx
        jl p_number_DONE
        lodsb
        mov bl,al               ; into bl
@@ -184,30 +184,35 @@ p_number_DONE:
        dq 0,0                  ; ( n chars* )
 
        WORD p_evaluate_stream,'EVALUATE-STREAM'
-       ;; ( stream -- *?* flag )
+       ;; ( stream* -- *?* flag )
        ;; Execute the words from the given stream
        ;; returns 1 if stream ends and 0 if an unknown word is found
+       dq p_ltR                ; Keep the stream on the return stack.
 p_evaluate_stream_LOOP:
+       dq p_Rget               ; ( -- stream*
        dq p_read_word          ; ( -- chars* n )
        dq p_dup
-       BRANCH 0,p_evaluate_stream_END
+       BRANCH 0,p_evaluate_stream_END ; branch if 0 on TOP
        dq p_2dup               ; ( -- chars* n chars* n )
        dq p_this_word          ; ( -- chars* n chars* n p )
        dq p_2put               ; ( -- chars* n )
        dq p_find               ; ( -- [ chars* n 0 ]/[ tfa ] )
        dq p_dup                ; ( -- [ chars* n 0 0 ]/[ tfa tfa ] )
-       BRANCH 0,p_evaluate_stream_NOTWORD ; ( -- chars* n tfa/0 )
-       dq p_execute            ; ( -- chars* n tfa/0 )
+       BRANCH 0,p_evaluate_stream_NOTWORD ; branch if 0 on TOP
+       dq p_execute            ; consumes tfa
        BRANCH ,p_evaluate_stream_LOOP
 p_evaluate_stream_NOTWORD:
        dq p_drop               ; ( -- chars* n )
        dq p_number             ; ( -- [ 0 ]/[ v 1 ] )
        dq p_dup
-       BRANCH 0,p_evaluate_stream_BAD
+       BRANCH 0,p_evaluate_stream_BAD ; branch if 0 on TOP
        dq p_drop
        BRANCH ,p_evaluate_stream_LOOP
 p_evaluate_stream_END:
+       dq p_2drop
        dq p_literal
        dq 1
 p_evaluate_stream_BAD:
+       dq p_Rgt                ; Discard the stream from the return stack
+       dq p_drop
        dq p_exit