macro next {
lodsq ; mov rax, [rsi] + add rsi,8
+ call p_calltrace_DFA
jmp qword [rax] ; goto code of that FORTH word (64 bit jump)
}
;;; ========================================
;;; The DOFORTH lays out a single FORTH call
-macro DOFORTH label {
+macro DOFORTH [label] {
+common
FORTH
+forward
dq label
+common
ENDFORTH
}
- previous_word = 0 ; Used for chaining the words
-
- IMMEDIATE = 1 ; optional flag (symbol)
-
;;; ========================================
;;; Macro WORD starts a FORTH word definition in this code.
;;; The layout of a word is as follows:
;;; CFA: [8 bytes] pointer to the word's "doer" code
;;; DFA: [? bytes] the word's data field
+IMMEDIATE = 1 ; optional flag (symbol)
+
macro WORD label, name, doer, flags, previous, offset {
local pname
;; align 8
dq doforth
else
if doer in <fasm>
- dq label#_DFA
+ dq dofasm ; label#_DFA
else
dq doer
end if
sub reg,24
mov reg,qword [reg]
}
-macro pushpname rg { ; ( reg -- chars* length )
- add rg,8
- push rg
- sub rg,8
- push qword [rg]
+;;; Code snippet to push a pname string with address and 64-bit length field.
+;;; The register is advanced to point at the text part.
+macro pushpname reg {
+ add reg,8
+ push reg
+ push qword [reg-8]
}
;;; ========================================
;;; The BLOCK macro lays out the length for a subsequent block to the
dataend:
}
+;;; ========================================
+;;; The BRANCH macro lays out FORTH words BRANCH and 0BRANCH with offset
+macro BRANCH zero,label {
+ if zero in <0>
+ dq p_zero_branch
+ else
+ dq p_branch
+ end if
+ dq label - $ - 8
+}
+
+;;; ========================================
+;;; The STREAM macro starts an in-core FORTH STREAM area. See WORD
+;;; STREAM for details.
+ macro STREAM endlabel {
+ local datastart
+ dq $+32
+ dq -1
+ dq endlabel - datastart
+ dq 0
+datastart:
+ }