bug fix for lpar comment
[rrq/rrqforth.git] / machine.asm
index 74b1060427dbce1cfc4321e405ae19f8e2484f1b..f1fb51c9015e4dc7533df6596915982f36cbf87d 100644 (file)
@@ -73,6 +73,7 @@ macro popr x {
 ;;; referring to the doer field of the called word.
 
 macro next {
+       call p_calltrace_DFA
        lodsq                   ; mov rax, [rsi] + add rsi,8
        jmp qword [rax]         ; goto code of that FORTH word (64 bit jump)
 }
@@ -97,16 +98,15 @@ macro ENDFORTH {
 ;;; ========================================
 ;;; 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:
@@ -122,6 +122,8 @@ macro DOFORTH label {
 ;;; 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
@@ -134,6 +136,7 @@ label#_TFA:
        end if
        previous_word = label#_TFA
        ;; PFA
+label#_pCFA:
        dq label#_CFA           ; link to CFA of word
        dq flags + 0
 label#_PFA:
@@ -141,6 +144,7 @@ label#_PFA:
        db name
 pname:  db 0                   ; extra NUL byte
        ;; align 8
+label#_pTFA:
        dq label#_TFA           ; link to TFA of word
 label#_OFF:
        dq offset + 0           ; The DOES offset. Defaults to 0.
@@ -151,7 +155,7 @@ label:
            dq doforth
        else
            if doer in <fasm>
-               dq label#_DFA
+               dq dofasm ; label#_DFA
            else
                dq doer
            end if
@@ -163,10 +167,17 @@ label#_DFA:
 macro tfa2cfa reg {
        mov reg,qword [reg+8]
 }
+macro tfa2does reg {
+       tfa2cfa reg
+       sub reg,8
+}
 macro tfa2dfa reg {
        tfa2cfa reg
        add reg,8
 }
+macro tfa2flags reg {
+       add reg,16
+}
 macro tfa2pfa reg {
        add reg,24
 }
@@ -187,11 +198,12 @@ macro dfa2tfa reg {
        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
@@ -216,3 +228,25 @@ common
 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:
+       }