installed SEGV capture
[rrq/rrqforth.git] / stack.asm
index 9726cc2b8eb2883c2e4df7ad4e2a0f7272427b27..5b6910b5cb3bef019f7e10336ca62a4e05194042 100644 (file)
--- a/stack.asm
+++ b/stack.asm
@@ -1,5 +1,14 @@
 ;;; Words for stack manipulations
        
+       WORD p_depth,'DEPTH',fasm
+       ;; ( -- v )
+       ;; Push stack depth (before push)
+       lea rax,[DS_TOP]
+       sub rax,rsp
+       shr rax,3
+       push rax
+       next
+
        WORD p_dup, 'DUP',fasm
        ;; ( v -- v v )
        ;; Duplicate top ov stack value.
@@ -110,12 +119,44 @@ p_roll_eq:
        push qword [rsp+rax]
        next
 
-       WORD w6.2.2300, 'TUCK',fasm
+       WORD p_tuck, 'TUCK',fasm
        ;; ( x1 x2 -- x2 x1 x2 )
-       ;; insert the top stack value into below second stack value.
+       ;; copy the top stack value into below second stack value.
        pop rax
        pop rbx
        push rax
        push rbx
        push rax
        next
+
+;;; ========================================
+;;; Return stack operations
+
+       WORD p_gtR, '>R',fasm
+       ;; ( x -- ) ( R: -- x )
+       ;; Move x to the return stack.
+       pop rax
+       pushr rax
+       next
+
+       WORD p_Rgt, 'R>',fasm
+       ;; ( -- x ) ( R: x -- )
+       ;; Move x from the return stack to the data stack.
+       popr rax
+       push rax
+       next
+
+       WORD p_Rget, 'R@',fasm
+       ;; ( -- x ) ( R: x -- x )
+       ;; Copy x from the return stack to the data stack.
+       push qword [rbp]
+       next
+
+       WORD p_rsp,'R[n]',fasm
+       ;; ( n -- a )
+       ;; push the address of the n:th cell on the return stack
+       mov rax,qword [rsp]
+       shl rax,3
+       add rax,rbp
+       mov qword [rsp],rax
+       next