+
+;;; ========================================
+;;; The stacks are placed here.
+
+ ;segment readable writable
+
+ WORD return_stack,'RETURN-STACK',dovariable
+ ;; The return stack
+ BLOCK RS_TOP
+ rb 1048576 ; 1 Mb return stack
+RS_TOP: ; The initial rbp
+
+last_system_word:
+ WORD data_stack,'DATA-STACK',dovariable
+ ;; The data stack
+ BLOCK DS_TOP
+ rb 1048576 ; 1 Mb data stack
+DS_TOP: ; The initial rsp
+
+
+;;; ========================================
+;;; Core execution control words
+
+ ;segment readable executable
+
+include 'signals.asm'
+
+;;; 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 = 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
+ ;; ( -- )
+ ;; This transitions execution into inline assembler in the
+ ;; calling word defintion. Note that it stops advancing rsi;
+ ;; code should use FORTH macro to reenter forth execution, or
+ ;; exit to the calling definition via "jmp exit".
+ jmp qword rsi
+
+ WORD p_execute,'EXECUTE',fasm
+ ;; ( cfa -- )
+ ;; Execute the word
+ pop rax
+ jmp qword [rax] ; goto code of that FORTH word (64 bit jump)
+
+ WORD p_sysexit, 'EXIT',
+ ;; ( v -- )
+ ;; Terminate RRQFORTH with error code
+ dq sys_exit
+
+ WORD p_return, 'RETURN',fasm
+ ;; ( -- ) ( R: addr -- )
+ ;; Returns execution to the calling definition as per the
+ ;; return stack.
+exit:
+ popr rsi
+ next
+
+ ;; TERMINATE0 terminates the program with code 0
+ ;; ( -- )
+ WORD p_terminate, 'TERMINATE0',fasm
+ pop rdx
+terminate_special:
+ mov eax,60
+ syscall
+
+;;; ========================================
+;;; Core extension(s)
+
+ ;segment readable writable executable
+
+include 'control.asm'
+include 'wordlists.asm'