X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=rrqforth.asm;h=16dc7d6ddba4d651702868d72ea62f264464c286;hb=c7bd2072c9a131bff7f03f36fefd65f7b6f60f02;hp=0f7e8fbf3f9c944834555d5abdbffbfc1587eab1;hpb=3365403c166732a1e3d68a23de2fa5021d8b81da;p=rrq%2Frrqforth.git diff --git a/rrqforth.asm b/rrqforth.asm index 0f7e8fb..16dc7d6 100644 --- a/rrqforth.asm +++ b/rrqforth.asm @@ -8,6 +8,42 @@ include 'machine.asm' segment readable writable executable +;;; This is the very first word + + ;; FORTH is the last word of WORDLIST FORTH + WORD p_forth,'FORTH',dovalue + ;; ( -- ) + ;; Change to use this wordlist + dq last_forth_word + dq inline_code + mov rax,qword [p_forth_DFA] + mov qword [p_wordlist],rax + popr rsi + next + + WORD p_syscall,'SYSCALL',dodoes,,,8 + ;; ( -- ) + ;; Change to use this wordlist + dq last_syscall_word + dq inline_code + mov rax,qword [p_syscall_DFA] + mov qword [p_wordlist],rax + popr rsi + next + +last_wordlists_word: + WORD p_wordlists,'WORDLISTS',dodoes,,,8 + ;; ( -- ) + ;; Change to use this wordlist + dq p_wordlists_TFA + dq inline_code + mov rax,qword [p_wordlists_DFA] + mov qword [p_wordlist],rax + popr rsi + next + +include 'wordlists.asm' + WORD return_stack,'RS',dovariable ;; The return stack rb 1048576 ; 1 Mb return stack @@ -34,6 +70,14 @@ exit: popr rsi next + ;; TERMINATE0 terminates the program with code 0 + ;; ( -- ) + WORD terminate, 'TERMINATE0',fasm + pop rdx +terminate_special: + mov eax,60 + syscall + ;;; 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 @@ -67,20 +111,15 @@ dovalue: ;; Execution semantics for a string constant ( -- addr n ) ;; rax points to CFA field dostring: - add rax,8 - xor rbx,rbx - mov bl,[rax] - inc rax - push rax - push rbx + cfa2dfa rax + pushpname rax next -include 'wordlists.asm' -include 'syscalls.asm' include 'memory.asm' include 'stack.asm' include 'math.asm' include 'stdio.asm' +include 'compile.asm' WORD p_program_version,'PROGRAM_VERSION',dostring STRING 'RRQ Forth version 0.1 - 2021-05-13',10 @@ -88,7 +127,10 @@ include 'stdio.asm' WORD p_stdin,'STDIN',dovalue ;; Initialised to hold a STREAM for fd 0 dq 0 - + +;;; The main entry point. +;;; This word is also the last word before syscalls +last_forth_word: WORD p_quit,'QUIT',fasm ;; QUIT is the program entry point ******************** main: @@ -101,29 +143,29 @@ main: pop qword [p_stdin_DFA] ;; 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 + FORTH + dq p_program_version + dq p_tell + dq p_stdin + dq p_read_word + dq p_tell + dq p_nl + dq p_emit + ENDFORTH + + ;; DOFORTH p_words push 0 DOFORTH sys_exit - ;; TERMINATE0 terminates the program with code 0 - ;; ( v -- ) - WORD terminate, 'TERMINATE',fasm - pop rdx -terminate_special: - mov eax,60 - syscall + previous_word = last_wordlists_word -last_word: - ;; FORTH is the last word of VOCABULARY FORTH - WORD forth,'FORTH',dovalue - dq forth_TFA - dq 0 +include 'syscalls.asm' +last_word: + heap_start: + rb 1048576 ; +1 Mb heap + rb 1048576 ; +1 Mb heap + rb 1048576 ; +1 Mb heap