identify TEMPUSED properly
[rrq/rrqforth.git] / temp.asm
index 3425c1c53d34951f135750d5681c6ffb84ecbec0..932b1bb3e9e26bf4bf9d3fce01cbc231bbc171af 100644 (file)
--- a/temp.asm
+++ b/temp.asm
@@ -1,16 +1,25 @@
-;;; Managing a memory area for temporary objects
-;;;
-;;; A temporary object space is allocated from the current usage
-;;; level, or cycling back to be from the lowest space address when
-;;; the requested size exceeds the space edge.
+;;; Managing a memory area for temporary "objects".
 ;;;
+;;; Object space is allocated cyclically, starting subsequent to prior
+;;; allocation and cycling back when requested object size exceeds
+;;; the space edge. The "inital" part, which starts as empty, is
+;;; considered "held" space that is not reused when cycling back, and
+;;; apart from allowing for this, the space management is left open.
+
 
        WORD p_objectspace,'TEMPSPACE',dovariable
        ;; Holds size and address of the object space.
-       dq 104857600 ; [0] Total object space size (request size)
-       dq 0 ; [8] Object space base address
+       dq 1073741824 ; [0] Total object space size (request size)
+       dq 0 ; [8] Object space base address.
+
+       WORD p_tempused,'TEMPUSED',dovariable
        dq 0 ; [16] Currently used.
 
+       WORD p_tempheld,'TEMPHELD',dovariable
+       ;; ( -- a )
+       ;; Marks the barrier for "held space"
+       dq 0 ; [24] Currently held.
+
        WORD p_temp,'TEMP',fasm
        ;; ( size -- addr )
        ;; Allocate an object of given size
        DOFORTH p_malloc
        pop qword [p_objectspace_DFA+8]
 p_objecthole_initialized:
+       mov rax,qword [p_tempheld_DFA]
+       cmp rax,qword [p_tempused_DFA]
+       jl p_objecthole_recycle
        mov rax,qword [rsp]
-       add rax,qword [p_objectspace_DFA+16]
+       add rax,qword [p_tempused_DFA]
        cmp rax,qword [p_objectspace_DFA]
        jl p_objecthole_from_tail
-       mov qword [p_objectspace_DFA+16],0
-       mov rax,qword [rsp]
+       mov rax,qword [p_tempheld_DFA] ; cycling back to here
+p_objecthole_recycle:
+       mov qword [p_tempused_DFA],rax
+       add rax,qword [rsp]
 p_objecthole_from_tail:
-       mov rbx,qword [p_objectspace_DFA+16]
-       mov qword [p_objectspace_DFA+16],rax
+       ;; rax = new usage count
+       mov rbx,qword [p_tempused_DFA]
        add rbx,qword [p_objectspace_DFA+8]
        mov qword [rsp],rbx
+       mov qword [p_tempused_DFA],rax
        popr rsi
        next
 
-       WORD p_str2temp,'STR>TEMP'
+       WORD p_str2temp,'STR>TEMP',fasm
        ;; ( char* n -- char* n )
        ;; Capture a given [n:char*] string as a new temp object with
        ;; leading size cell.
-       dq p_dup, p_gtR                 ; ( -- char* n ) [ n ]
-       dq p_dup, p_literal, 8, p_plus  ; ( -- char* n n+8 )
-       dq p_temp                       ; ( -- char* n  addr )
-       dq p_dup, p_gtR                 ; ( -- char* n  addr ) [ n addr ]
-       dq p_2dup, p_put
-       dq p_literal, 8, p_plus
-       dq p_swap, p_strncpy
-       dq p_Rgt, p_Rgt
-       dq p_exit
+       pushr rsi
+       mov rax,qword [rsp]
+       add rax,8
+       push rax
+       DOFORTH p_temp          ; ( -- char* n  addr )
+       pop rax
+       pop rbx
+       mov qword[rax],rbx
+       add rax,8
+       pop rcx
+       push rax
+       push rbx
+       push rcx
+       push rax
+       push rbx                ; ( -- addr n char* addr n )
+       DOFORTH p_strncpy
+       popr rsi
+       next