Fixups for new word layout, and restructure for using wordlists.
authorRalph Ronnquist <ralph.ronnquist@gmail.com>
Tue, 18 May 2021 12:21:26 +0000 (22:21 +1000)
committerRalph Ronnquist <ralph.ronnquist@gmail.com>
Tue, 18 May 2021 12:21:26 +0000 (22:21 +1000)
rrqforth.asm
syscalls.asm
wordlists.asm

index 0f7e8fbf3f9c944834555d5abdbffbfc1587eab1..ba41cbe39021df277ccc6e3343ece77f2cb8e188 100644 (file)
@@ -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,16 +111,10 @@ 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'
@@ -88,7 +126,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:
@@ -111,19 +152,11 @@ main:
        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:
index ede8849295c02d439da405571264405960de3b80..aeb304120df2346cd0670ed94add519fefb339d8 100644 (file)
@@ -356,17 +356,18 @@ end if
        SYSCALL 319,sys_memfd_create,'SYS_MEMFD_CREATE',2
        SYSCALL 320,sys_kexec_file_load,'SYS_KEXEC_FILE_LOAD',5
        SYSCALL 321,sys_bpf,'SYS_BPF',3
-       SYSCALL 322,stub_execveat,'STUB_EXECVEAT',5
-       SYSCALL 323,userfaultfd,'USERFAULTFD',1
-       SYSCALL 324,membarrier,'MEMBARRIER',2
-       SYSCALL 325,mlock2,'MLOCK2',3
-       SYSCALL 326,copy_file_range,'COPY_FILE_RANGE',6
-       SYSCALL 327,preadv2,'PREADV2',6
-       SYSCALL 328,pwritev2,'PWRITEV2',6
-       SYSCALL 329,pkey_mprotect,'PKEY_MPROTECT',0
-       SYSCALL 330,pkey_alloc,'PKEY_ALLOC',0
-       SYSCALL 331,pkey_free,'PKEY_FREE',0
-       SYSCALL 332,statx,'STATX',0
-       SYSCALL 333,io_pgetevents,'IO_PGETEVENTS',0
-       SYSCALL 334,rseq,'RSEQ',0
-       SYSCALL 335,pkey_mprotect1,'PKEY_MPROTECT1',0
+       SYSCALL 322,sys_stub_execveat,'SYS_STUB_EXECVEAT',5
+       SYSCALL 323,sys_userfaultfd,'SYS_USERFAULTFD',1
+       SYSCALL 324,sys_membarrier,'SYS_MEMBARRIER',2
+       SYSCALL 325,sys_mlock2,'SYS_MLOCK2',3
+       SYSCALL 326,sys_copy_file_range,'SYS_COPY_FILE_RANGE',6
+       SYSCALL 327,sys_preadv2,'SYS_PREADV2',6
+       SYSCALL 328,sys_pwritev2,'SYS_PWRITEV2',6
+       SYSCALL 329,sys_pkey_mprotect,'SYS_PKEY_MPROTECT',0
+       SYSCALL 330,sys_pkey_alloc,'SYS_PKEY_ALLOC',0
+       SYSCALL 331,sys_pkey_free,'SYS_PKEY_FREE',0
+       SYSCALL 332,sys_statx,'SYS_STATX',0
+       SYSCALL 333,sys_io_pgetevents,'SYS_IO_PGETEVENTS',0
+       SYSCALL 334,sys_rseq,'SYS_RSEQ',0
+last_syscall_word:
+       SYSCALL 335,sys_pkey_mprotect1,'SYS_PKEY_MPROTECT1',0
index ae3062bedc82e6a2240b2cda0d729bb9f467d40d..4862dd1ec8994ef32dfe3cd949cedd484473d1ce 100644 (file)
@@ -1,34 +1,74 @@
 ;;; This file contains words dealing with word lists (vocabularies)
+;;;
+;;; CURRENT-WORDLIST (variable) points out "the current wordlist"
+;;; SYSCALLS is a wordl list
+;;; FORTH is a word list
+;;;
+;;; !! When a word list word is created, it gets added to the tail end
+;;; of the current word list as way of making all word list words be
+;;; present in all word lists. This is different to all other kinds of
+;;; words, which instead are added to the head end of the current word
+;;; list.
+;;;
+;;; !! A word list word is created, it is initialised to the head end
+;;; of the current word list. It will this be an extension to that
+;;; current word list.
+;;;
+;;; EMPTY-WORDLIST is a word list word for an empty word list. It thus
+;;; only contains word list words.
+;;; 
+;;; WORDLIST ( "name" -- ) = start
 
-       WORD p_wordlist,'WORDLIST',dovariable
-       ;; VARIABLE WORDLIST is the currently active wordlist.
-       dq last_word
+       WORD p_tfa2cfa,'TFA>CFA',fasm
+       ;; ( tfa -- cfa )
+       ;; Advance a word tfa pointer to the cfa field
+       mov rax,qword[rsp]
+       tfa2cfa rax
+       mov qword [rsp],rax
+       next
+       
+       WORD p_tfa2dfa,'TFA>DFA',fasm
+       ;; ( tfa -- dfa )
+       ;; Advance a word tfa pointer to the dfa field
+       mov rax,qword[rsp]
+       tfa2dfa rax
+       mov qword [rsp],rax
+       next
+
+       WORD p_dfa2tfa,'DFA>TFA',fasm
+       ;; ( dfa -- tfa )
+       ;; Advance a word tfa pointer to the dfa field
+       mov rax,qword[rsp]
+       mov rax,qword [rax-24]  ; tfa
+       mov qword [rsp],rax
+       next
+
+       WORD p_wordlist,'CURRENT-WORDLIST',dovariable
+       ;; CURRENT-WORDLIST points to cfa of the currently active wordlist.
+       dq p_forth_DFA
 
        WORD p_words,'WORDS',fasm
        ;; ( -- )
        ;; Dump all words
        pushr rsi
-       push qword [p_wordlist_DFA]
+       mov rax,qword [p_wordlist_DFA] ; current wordlist word
+       mov rax,[rax]                  ; list start
+       sub rsp,8                      ; use stack to hold ptr
 p_words_LOOP:
-       mov rax,qword [rsp]
+       mov qword [rsp],rax
        cmp rax,0
        je p_words_END
        ;; tfa>pfa
-       add rax,9
-       ;; pfa@ => ( chars* length)
-       xor rbx,rbx
-       mov bl,[rax]
-       inc rax
+       tfa2pfa rax
        push 1
-       push rax
-       push rbx
+       ;; pfa@ => ( chars* length)
+       pushpname rax
        DOFORTH sys_write
        pop rax                 ; ignore errors
-       push 10
+       push qword 10
        DOFORTH p_emit
        mov rax,qword [rsp]
        mov rax,qword [rax]
-       mov qword [rsp],rax
        jmp p_words_LOOP
 
 p_words_END:
@@ -61,24 +101,29 @@ p_strncmp_end:
        WORD p_find,'FIND'
        ;; ( chars length -- [ chars 0 | cfa 1 )
        ;; Search the current wordlists for the given pname
+       pushr rsi
        mov rcx,[p_wordlist_DFA]
+       mov rcx,qword [rcx]
+       mov rbx,[rsp]
+       mov rax,[rsp+8]
 p_find_loop:
        cmp rcx,0
        je p_find_done
-       mov rbx,[rsp]
-       mov rax,[rsp+8]
-       cmp bl,byte [rcx+10]
+       cmp rbx,qword [rcx+16]  ; compare lengths
        jne p_find_nextword
        push rcx
        ;; check word
        push rax
-       push rcx+11
+       tfa2pname rcx
+       push rcx
        push rbx
        DOFORTH p_strncmp
        pop rax                 ; return value
        pop rcx
        cmp rax,0
        je p_find_done
+       mov rbx,[rsp]
+       mov rax,[rsp+8]
 p_find_nextword:
        mov rcx,[rcx]
        jmp p_find_loop
@@ -87,4 +132,5 @@ p_find_found:
        mov rcx,1
 p_find_done:
        push rcx
+       popr rsi
        next