X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=rrqforth.asm;h=db4fe33e1b3df0e3ca777aae77a69fa0c905a97f;hb=804451765cdb9caf8f75c1fe9a4c0ab01fa244a8;hp=ba41cbe39021df277ccc6e3343ece77f2cb8e188;hpb=ab545d1d4c68b46af77ed241cfba6ada83bbb459;p=rrq%2Frrqforth.git diff --git a/rrqforth.asm b/rrqforth.asm index ba41cbe..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,7 +150,9 @@ dostring: include 'memory.asm' include 'stack.asm' include 'math.asm' +include 'logic.asm' include 'stdio.asm' +include 'compile.asm' WORD p_program_version,'PROGRAM_VERSION',dostring STRING 'RRQ Forth version 0.1 - 2021-05-13',10 @@ -135,23 +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 - push qword 1 ; stdout - DOFORTH p_program_version ; version string => ( s n ) - DOFORTH sys_write ; printout - pop rax ; ignore errors - - DOFORTH p_words - - push 0 - DOFORTH sys_exit - + FORTH + dq p_program_version + dq p_tell + dq p_stdin + 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 + ENDFORTH + 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' @@ -160,3 +212,6 @@ include 'syscalls.asm' last_word: heap_start: + rb 1048576 ; +1 Mb heap + rb 1048576 ; +1 Mb heap + rb 1048576 ; +1 Mb heap