X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=rrqforth.asm;h=f0ef63a248c087fb61bb38474fbe5faabbd0d879;hb=97a4e5ecb1623dbe0fbd7b6eeb96e966c6c5b1d3;hp=7c1b5ca1ed314decfdfb7dbec0176ca2eecb40fb;hpb=85117fe5745fabdf5e221bb7eaa65bee7ba9f751;p=rrq%2Frrqforth.git diff --git a/rrqforth.asm b/rrqforth.asm index 7c1b5ca..f0ef63a 100644 --- a/rrqforth.asm +++ b/rrqforth.asm @@ -73,7 +73,7 @@ dostring: pushpname rax next - WORD p_calltrace,'calltrace',dovalue + WORD p_calltrace,'[calltrace]',dovalue ;; Common call point for debugging ;; rax = cfa of called word ;; rsi = cell* of next forth word @@ -106,6 +106,8 @@ DS_TOP: ; The initial rsp ;segment readable executable +include 'signals.asm' + ;;; At fasm compilation: reset previous_word to make a new word list ;;; Words above belong to the SYSTEM wordlist, and the following ;;; belong to the FORTH wordlist. @@ -126,10 +128,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 +149,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' @@ -189,14 +170,18 @@ include 'compile.asm' ;; Initialised to hold a STREAM for fd 0 dq 0 - WORD p_args,'ARGS',dostring + WORD p_args,'MAIN-ARGS',dovalue ;; Pointer to initial argument block dq 0 ; *(int argc,(char*[argc]) argv) + WORD p_verboseQ,'VERBOSE?',dovariable + ;; Flags whether the running is in verbose mode ot not + dq 0 ; + WORD p_lparen,'(',fasm,IMMEDIATE pushr rsi p_lparen_loop: - DOFORTH p_stdin, p_read_word + DOFORTH p_input, p_get, p_read_word pop rax pop rbx cmp rax,0 ; end of stream @@ -215,17 +200,48 @@ p_lparen_exit: next ;;; ******** The main entry point. ******** +;;; This could be set up as a WORD but it isn't + main: ;; Initial rsp points to the arguments block of size (64 bits) ;; followed by the argument pointers. mov qword [p_args_DFA],rsp + mov rbp,RS_TOP + call p_setup_signals_DFA + call main_is_verbose + mov qword [p_verboseQ_DFA],rdx jmp p_quit_DFA ; QUIT + ;; Subroutine to check the command line for a "-v" + ;; return boolean in rdx + ;; implementation for that 2 byte asciiz string +main_is_verbose_data: + db '-v',0 + +main_is_verbose: + mov rbx,qword [p_args_DFA] ; Pointer to main arguments + mov r8,qword [rbx] ; r8 = count of pointers + xor rdx,rdx + cld +main_is_verbose_next: + dec r8 + jl main_is_not_verbose + add rbx,8 + mov rsi,qword [rbx] + mov rdi,main_is_verbose_data +main_is_verbose_loop: + cmpsb + jne main_is_verbose_next + cmp byte[rsi-1],0 + jne main_is_verbose_loop + not rdx +main_is_not_verbose: + ret + ;;; This word is also the last word before syscalls last_forth_word: WORD p_quit,'QUIT',fasm ;; QUIT is the program entry point ******************** - mov rsp,DS_TOP mov rbp,RS_TOP cmp qword [p_stdin_DFA],0 @@ -237,12 +253,15 @@ last_forth_word: pop qword [p_stdin_DFA] ; Assign STDIN p_quit_INITIALIZED: - ;; Initial blurb + ;; Setup INPUT from STDIN FORTH + dq p_verboseQ + dq p_get + BRANCH 0,p_quit_EVAL dq p_program_version dq p_tell - dq p_stdin - dq p_evaluate_stream +p_quit_EVAL: + dq p_stdin, p_evaluate_stream BRANCH 0,p_quit_ERROR dq p_false dq sys_exit @@ -258,7 +277,7 @@ p_quit_ERROR: dq p_tell ENDFORTH mov rbp,RS_TOP ; reset the return stack - jmp main + jmp p_quit_INITIALIZED ;;; ========================================