;;;
;;; 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:
- }