X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=rrqforth.asm;h=db4fe33e1b3df0e3ca777aae77a69fa0c905a97f;hb=43ce8fb4d65924e1bcf21cac510f8e48fc1d451d;hp=16dc7d6ddba4d651702868d72ea62f264464c286;hpb=c7bd2072c9a131bff7f03f36fefd65f7b6f60f02;p=rrq%2Frrqforth.git diff --git a/rrqforth.asm b/rrqforth.asm index 16dc7d6..db4fe33 100644 --- a/rrqforth.asm +++ b/rrqforth.asm @@ -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'