X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=rrqforth.asm;h=5d360306df30648ac9d94d9d5a9618dd5b85a096;hb=1650b06e609ebb40a1fcd3df54a3147f41f42138;hp=ecea1171612a82f840f91d82ce44931432805576;hpb=c007cbd75900b5df4aac0e2fdcdb1062ed26cdd0;p=rrq%2Frrqforth.git diff --git a/rrqforth.asm b/rrqforth.asm index ecea117..5d36030 100644 --- a/rrqforth.asm +++ b/rrqforth.asm @@ -126,10 +126,9 @@ previous_word = 0 jmp qword rsi WORD p_execute,'EXECUTE',fasm - ;; ( tfa -- ) + ;; ( cfa -- ) ;; Execute the word pop rax - tfa2cfa rax jmp qword [rax] ; goto code of that FORTH word (64 bit jump) WORD p_exit, 'EXIT',fasm @@ -148,32 +147,12 @@ 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 - ;;; ======================================== ;;; Core extension(s) ;segment readable writable executable +include 'control.asm' include 'wordlists.asm' include 'memory.asm' include 'stack.asm' @@ -193,7 +172,28 @@ include 'compile.asm' ;; Pointer to initial argument block dq 0 ; *(int argc,(char*[argc]) argv) -;;; The main entry point. + WORD p_lparen,'(',fasm,IMMEDIATE + pushr rsi +p_lparen_loop: + DOFORTH p_stdin, p_read_word + pop rax + pop rbx + cmp rax,0 ; end of stream + je p_lparen_exit + cmp rax,1 + jne p_lparen_loop + push rbx + push qword ')' + push 1 + DOFORTH p_strncmp + pop rax + cmp rax,0 + jne p_lparen_loop +p_lparen_exit: + popr rsi + next + +;;; ******** The main entry point. ******** main: ;; Initial rsp points to the arguments block of size (64 bits) ;; followed by the argument pointers.