changed to dump the word list
[rrq/rrqforth.git] / rrqforth.asm
index 41bab41b9571eed0fd0a2fdda022e8d234b1c2fd..0f7e8fbf3f9c944834555d5abdbffbfc1587eab1 100644 (file)
@@ -26,6 +26,14 @@ DS_TOP:                              ; The initial rsp
        ;; exit to the calling definition via "jmp exit".
        jmp qword rsi
 
+       WORD p_exit, 'EXIT',fasm
+       ;; ( -- ) ( R: addr -- )
+       ;; Returns execution to the calling definition as per the
+       ;; return stack.
+exit:
+       popr rsi
+       next
+
 ;;; 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
@@ -35,33 +43,36 @@ doforth:
        lea rsi, [rax+8]        ; rsi = the DFA of the rax word
        next
 
-       WORD p_exit, 'EXIT',fasm
-       ;; ( -- ) ( R: addr -- )
-       ;; Returns execution to the calling definition as per the
-       ;; return stack.
-exit:
-       popr rsi
+;;; Execution semantics for DOES>
+;;; The cell at [cfa-8] holds an adjustment offset.
+dodoes:
+       pushr rsi
+       lea rsi, [rax+8]        ; rsi = the DFA of the rax word
+       add rsi,[rax-8]         ; adjust rsi to the DOES> part
        next
 
        ;; Execution semantics for a variable ( -- addr )
-       ;; rax points to doer field
+       ;; rax points to CFA field
 dovariable:
-       push rax+16
+       add rax,8
+       push rax
        next
 
        ;; Execution semantics for a constant ( -- v )
-       ;; rax points to doer field
+       ;; rax points to CFA field
 dovalue:
-       push qword [rax+16]
+       push qword [rax+8]
        next
 
        ;; Execution semantics for a string constant ( -- addr n )
-       ;; rax points to doer field
+       ;; rax points to CFA field
 dostring:
-       add rax,16
+       add rax,8
+       xor rbx,rbx
        mov bl,[rax]
-       mov byte [rsp],bl
-       push rax+1
+       inc rax
+       push rax
+       push rbx
        next
 
 include 'wordlists.asm'
@@ -72,10 +83,7 @@ include 'math.asm'
 include 'stdio.asm'
 
        WORD p_program_version,'PROGRAM_VERSION',dostring
-       db length
-program_version_string:        
-       db 'RRQ Forth version 0.1 - 2021-05-13',10
-       length = $ - program_version_string
+       STRING 'RRQ Forth version 0.1 - 2021-05-13',10
 
        WORD p_stdin,'STDIN',dovalue
        ;; Initialised to hold a STREAM for fd 0
@@ -92,19 +100,13 @@ main:
        DOFORTH p_stream
        pop qword [p_stdin_DFA]
 
-       ;; read a word
-       push qword 1            ; ( fd ) =stdout
-       push qword [p_stdin_DFA]
-       FORTH
-       dq p_read_word          ; ( fd s n )
-       dq sys_write
-       ENDFORTH
-
+       ;; Initial blurb
        push qword 1                    ; stdout
-       push qword program_version_string ; address of string
-       push qword length               ; length of string (cheating)
+       DOFORTH p_program_version       ; version string => ( s n )
        DOFORTH sys_write               ; printout
        pop rax                         ; ignore errors
+
+       DOFORTH p_words
        
        push 0
        DOFORTH sys_exit