X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=rrqforth.asm;h=fd377099761171f0f06149912e25882c9f3bfa98;hb=6d4bf76e83379163ae7e027807f79f6cb14a9799;hp=c4b63b4e62d66bc362acc3a1c1fc5a55ddcbdd19;hpb=0d3bd729048b79778f83f100fbaab1970f4efc05;p=rrq%2Frrqforth.git diff --git a/rrqforth.asm b/rrqforth.asm index c4b63b4..fd37709 100644 --- a/rrqforth.asm +++ b/rrqforth.asm @@ -2,33 +2,12 @@ format elf64 executable entry main -previous_word = 0 ; Used for chaining the words - include 'machine.asm' ;;; ============================================================ - segment readable executable - -;;; This is the very first word + segment readable writable executable - ;; FORTH is the last word of WORDLIST FORTH - WORD p_forth,'FORTH',dowordlist - ;; ( -- ) - ;; Change to use this wordlist - dq last_forth_word - - WORD p_system,'SYSTEM',dowordlist - ;; ( -- ) - ;; Change to use this wordlist - dq last_system_word - -last_wordlists_word: - WORD p_wordlists,'WORDLISTS',dowordlist - ;; ( -- ) - ;; Change to use this wordlist - dq p_wordlists_TFA - ;;; ======================================== ;;; These are the core "execution semantics" words, which are placed ;;; first so as to remain at the same binary address at successive @@ -46,6 +25,8 @@ last_wordlists_word: ;;; rbp = return stack pointer ;;; +previous_word = 0 ; Used for chaining the words + WORD p_dofasm,'doFASM',dovariable ;; Execution semantics for assembly words. dofasm: @@ -92,22 +73,19 @@ dostring: pushpname rax next - WORD p_dowordlist,'doWORDLIST',dovariable - ;; Execution semantics for DOES> - ;; [cfa-8] holds the adjustment offset ("does offset") -dowordlist: - pushr rsi - lea rsi, [rax+8] ; rsi = the DFA of the rax word - add rsi,qword [rax-8] ; adjust rsi by the "does offset' - 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' ;;; ======================================== ;;; The stacks are placed here. - segment readable writable + ;segment readable writable WORD return_stack,'RETURN-STACK',dovariable ;; The return stack @@ -122,15 +100,22 @@ last_system_word: rb 1048576 ; 1 Mb data stack DS_TOP: ; The initial rsp + ;;; ======================================== ;;; Core execution control words - segment readable executable + ;segment readable executable ;;; 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. -previous_word = last_wordlists_word +previous_word = 0 + + WORD p_system,'SYSTEM',dovariable + ;; ( -- dfa ) + ;; The SYSTEM word list + dq last_system_word ; tfa of last SYSTEM word + dq p_forth_DFA ; dfa of successor word list WORD inline_code,'[ASM]',fasm ;; ( -- ) @@ -141,10 +126,9 @@ previous_word = last_wordlists_word 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 @@ -187,7 +171,7 @@ p_zero_branch_SKIP: ;;; ======================================== ;;; Core extension(s) - segment readable writable executable + ;segment readable writable executable include 'wordlists.asm' include 'memory.asm' @@ -198,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 @@ -226,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 @@ -248,7 +261,7 @@ p_quit_ERROR: ;;; ======================================== - segment readable writable + ;segment readable writable heap_start: rb 1048576 ; +1 Mb heap