improved debug support
[rrq/rrqforth.git] / rrqforth.asm
index 73147ab1450a2bb952863d6df8d8f5bd659fa028..ab4fd997cb32f85c2b1c767ea5945347ab369449 100644 (file)
@@ -2,36 +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
-       dq inline_code
-
-       WORD p_system,'SYSTEM',dowordlist
-       ;; ( -- )
-       ;; Change to use this wordlist
-       dq last_system_word
-       dq inline_code
-
-last_wordlists_word:
-       WORD p_wordlists,'WORDLISTS',dowordlist
-       ;; ( -- )
-       ;; Change to use this wordlist
-       dq p_wordlists_TFA
-       dq inline_code
-
 ;;; ========================================
 ;;; These are the core "execution semantics" words, which are placed
 ;;; first so as to remain at the same binary address at successive
@@ -49,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:
@@ -95,22 +73,12 @@ 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
-
-
 include 'syscalls.asm'
 
 ;;; ========================================
 ;;; The stacks are placed here.
        
-       segment readable writable
+       ;segment readable writable
 
        WORD return_stack,'RETURN-STACK',dovariable
        ;; The return stack
@@ -125,15 +93,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
        ;; ( -- )
@@ -190,7 +165,7 @@ p_zero_branch_SKIP:
 ;;; ========================================
 ;;; Core extension(s)
 
-       segment readable writable executable
+       ;segment readable writable executable
        
 include 'wordlists.asm'
 include 'memory.asm'
@@ -201,18 +176,28 @@ 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
 
+       WORD p_args,'ARGS',dostring
+       ;; Pointer to initial argument block
+       dq 0       ; *(int argc,(char*[argc]) argv)
+
 ;;; 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
@@ -251,7 +236,7 @@ p_quit_ERROR:
 
 ;;; ========================================
 
-       segment readable writable
+       ;segment readable writable
        
 heap_start:
        rb 1048576              ; +1 Mb heap