X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=temp.asm;h=932b1bb3e9e26bf4bf9d3fce01cbc231bbc171af;hb=cabd8413c10848728efcc2b869f631294f755d4d;hp=f85cb3375faff34eaea45ea027fde734c36fa31e;hpb=6169c77e9a3a2948493d7fb8ea7df119712761ba;p=rrq%2Frrqforth.git diff --git a/temp.asm b/temp.asm index f85cb33..932b1bb 100644 --- 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 @@ -22,30 +31,45 @@ 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_2dup, p_put - dq p_literal, 8, p_plus ; ( -- char* n addr+8 ) [ n ] - dq p_dup, p_gtR ; ( -- char* n addr+8 ) [ n addr+8 ] - dq p_swap, p_strncpy ; ( -- ) [ n addr+8 ] - dq p_Rgt, p_Rgt ; ( -- addr+8 n ) [ ] - 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