X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=compile.asm;h=3d5433ef5ff133ae51dfd033492fbe7336ce4f17;hb=5b7f593fcea545619f8afcc01099e433c84250a7;hp=d06913876a00feab6e6a6a2d74815cc3166b1f7c;hpb=dd99a1e5f8fb8209ce62d714b5d6bc30a7492a09;p=rrq%2Frrqforth.git diff --git a/compile.asm b/compile.asm index d069138..3d5433e 100644 --- a/compile.asm +++ b/compile.asm @@ -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