X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=rrqforth.asm;h=fd377099761171f0f06149912e25882c9f3bfa98;hb=6d4bf76e83379163ae7e027807f79f6cb14a9799;hp=da94d056d7ca7da435815ab01f465ab39b64e380;hpb=6a23dde51ebab1df2c43912b3f730f27e71b4d8f;p=rrq%2Frrqforth.git diff --git a/rrqforth.asm b/rrqforth.asm index da94d05..fd37709 100644 --- a/rrqforth.asm +++ b/rrqforth.asm @@ -73,6 +73,13 @@ dostring: pushpname rax next + WORD p_calltrace,'calltrace',dovalue + ;; Common call point for debugging + ;; rax = cfa of called word + ;; rsi = cell* of next forth word + ;; [$rsp] = from where the call was + ret + include 'syscalls.asm' ;;; ======================================== @@ -119,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 @@ -176,18 +182,49 @@ include 'stdio.asm' include 'compile.asm' WORD p_program_version,'PROGRAM_VERSION',dostring - STRING 'RRQ Forth version 0.1 - 2021-05-13',10 + STRING 'RRQ Forth version 0.1 - 2021-05-22',10 WORD p_stdin,'STDIN',dovalue ;; Initialised to hold a STREAM for fd 0 dq 0 -;;; The main entry point. + WORD p_args,'ARGS',dostring + ;; Pointer to initial argument block + dq 0 ; *(int argc,(char*[argc]) argv) + + 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. + mov qword [p_args_DFA],rsp + jmp p_quit_DFA ; QUIT + ;;; This word is also the last word before syscalls last_forth_word: WORD p_quit,'QUIT',fasm ;; QUIT is the program entry point ******************** -main: + mov rsp,DS_TOP mov rbp,RS_TOP cmp qword [p_stdin_DFA],0 @@ -204,8 +241,6 @@ p_quit_INITIALIZED: 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