changes to QUIT (the main program).. still testing
[rrq/rrqforth.git] / rrqforth.asm
index 16dc7d6ddba4d651702868d72ea62f264464c286..db4fe33e1b3df0e3ca777aae77a69fa0c905a97f 100644 (file)
@@ -62,6 +62,13 @@ DS_TOP:                              ; The initial rsp
        ;; exit to the calling definition via "jmp exit".
        jmp qword rsi
 
+       WORD p_execute,'EXECUTE',fasm
+       ;; ( tfa -- )
+       ;; Execute the word
+       pop rax
+       tfa2cfa rax
+       jmp qword [rax]         ; goto code of that FORTH word (64 bit jump)
+       
        WORD p_exit, 'EXIT',fasm
        ;; ( -- ) ( R: addr -- )
        ;; Returns execution to the calling definition as per the
@@ -78,6 +85,31 @@ terminate_special:
        mov eax,60
        syscall
 
+       WORD p_branch,'BRANCH',fasm
+       ;; ( -- )
+       ;; Using subsequent inline cell as branch offset, branch
+       ;; accordingly
+       add rsi,qword [rsi]     
+       add rsi,8
+       next
+       
+       WORD p_zero_branch,'0BRANCH',fasm
+       ;; ( v -- )
+       ;; Using subsequent inline cell as branch offset, branch
+       ;; accordingly if the stacked value is zero, otherwise just
+       ;; skip over the branch offset
+       pop rax
+       cmp rax,0
+       jne p_zero_branch_SKIP
+       add rsi,qword [rsi]
+p_zero_branch_SKIP:
+       add rsi,8
+       next
+
+;;; Execution semantics for a "fasm" WORD
+dofasm:
+       add rax,8
+       jmp rax
 ;;; Execution semantics for FORTH defition word
 ;;; At entry, rsi points into the calling definition, at the cell
 ;;; following the cell indicating this word, rax points to the CFA of
@@ -118,6 +150,7 @@ dostring:
 include 'memory.asm'
 include 'stack.asm'
 include 'math.asm'
+include 'logic.asm'
 include 'stdio.asm'
 include 'compile.asm'
 
@@ -136,28 +169,41 @@ last_forth_word:
 main:
        mov rsp,DS_TOP
        mov rbp,RS_TOP
-       ;; Initialize STREAM STDIN
+       cmp qword [p_stdin_DFA],0
+       jne p_quit_INITIALIZED
+       ;; Initialize STDIN
        push 0
        push 10000
        DOFORTH p_stream
-       pop qword [p_stdin_DFA]
+       pop qword [p_stdin_DFA] ; Assign STDIN
 
+p_quit_INITIALIZED:
        ;; Initial blurb
        FORTH
        dq p_program_version
        dq p_tell
        dq p_stdin
-       dq p_read_word
+       dq p_clear_stream
+       dq p_stdin
+       dq p_evaluate_stream
+       BRANCH 0,p_quit_ERROR
+       dq p_false
+       dq sys_exit
+p_quit_ERROR:
+       dq p_literal_string
+       STRING 10,'*** Unknown word: '
+       dq p_tell
+       dq p_this_word
+       dq p_2get
+       dq p_tell
+       dq p_literal_string
+       STRING 10
        dq p_tell
-       dq p_nl
-       dq p_emit
        ENDFORTH
-       
-       ;; DOFORTH p_words
-       
-       push 0
-       DOFORTH sys_exit
+       mov rbp,RS_TOP          ; reset the return stack
+       jmp main
 
+       ;; At fasm compilation: reset to make a new word list
        previous_word = last_wordlists_word
 
 include 'syscalls.asm'