+;;; This file define/describes the "machine"
+;;;
+;;; Abstract Machine:
+;;; https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture
+;;;
+;;; General Purpose Registers ( * marks those used in syscalls )
+;;; *rax = ( -, eax = ( -, ax = ( ah, al) )) "accumulator"
+;;; rbx = ( -, ebx = ( -, bx = ( bh, bl) )) "base"
+;;; *rcx = ( -, ecx = ( -, cx = ( ch, cl) )) "counter"
+;;; *rdx = ( -, edx = ( -, dx = ( dh, dl) )) "data"
+;;; rsp = ( -, esp = ( -, sp = ( -, spl) )) "stack pointer"
+;;; rbp = ( -, ebp = ( -, bp = ( -, bpl) )) "stack base pointer"
+;;; *rsi = ( -, esi = ( -, si = ( -, sil) )) "source"
+;;; *rdi = ( -, edi = ( -, di = ( -, dil) )) "destination"
+;;; *r8
+;;; *r9
+;;; r10
+;;; *r11
+;;; r12
+;;; r13
+;;; r14
+;;; r15
+;;; clobbers rdi rsi rdx rcx r8 r9 r11
+;;; rax = syscall id
+;;;
+;;; Segment Registers
+;;; SS "Stack Segment"
+;;; CS "Code Segment"
+;;; DS "Data Segment"
+;;; ES "Extra Segment"
+;;; FS "more Extra Segment"
+;;; GS "more more Extra Segment"
+;;;
+;;; EFLAGS Register
+;;; 0,0,0,0,0,0,0,0,0,0,ID,VIP,VIF,AC,VM,RF,
+;;; 0,NT,[IOPL,IOPL],OF,DF,IF,TF,SF,ZF,0,AF,0,PF,1,CF
+;;;
+;;; Instruction pointer
+;;; EIP
+;;;
+;;; Syscall allocations
+;;; clobbers rdi rsi rdx rcx r8 r9 r11
+;;; rax = syscall id
+;;;
+;;; function calling
+
+;;; FORTH model
+;;; rsp = data stack pointer
+;;; rbp = frame pointer
+;;; rdi = frame stack
+;;; rsi = instruction pointer
+
+;;; ========================================
+;;; The next macro "moves" execution to the next FORTH instruction,
+;;; using rsi as instruction pointer.
+
+ macro next {
+ lodsq ; mov rax, qword [rsi]
+ ; add rsi,8
+ jmp qword [rax] ; goto code of that FORTH word
+ }
+
+;;; ========================================
+;;; The pushr macro pushes x onto the return stack
+;;; The popr macro pops x from the return stack
+ macro pushr x {
+ sub rbp, 8
+ mov qword [rbp], x
+ }
+
+ macro popr x {
+ mov x, [rbp]
+ add rbp, 8
+ }
+
+;;; ========================================
+;;;
+
+ previous_word = 0
+
+ ;; Macro WORD starts a FORTH word definition in this code
+ macro WORD label, name, doer, flags {
+label#_tfa:
+ ;; TFA
+ dq previous_word
+ ;; PFA
+label#_word:
+ previous_word = label#_word
+ db flags + 0
+ db label - $ - 1
+ db name
+ ;; CFA = pointer to "interpreter"
+label:
+ dq doer
+ }
+
+ ;; Macro WORD_assembler begins an assembler implementation
+ macro WORD_assembler label, name, flags {
+ WORD label, name, label#_code, flags
+label#_code:
+ }