From 42844a6fe395162a374bd7bb6e8ed9a04b8d580c Mon Sep 17 00:00:00 2001 From: Ralph Ronnquist Date: Fri, 4 Jun 2021 11:47:54 +1000 Subject: [PATCH] Changed to use "cyclic' temporary block allocation for strings --- rrqforth | Bin 2148591 -> 2149140 bytes rrqforth.asm | 1 + stdio.asm | 12 +++++++++++- temp.asm | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 temp.asm diff --git a/rrqforth b/rrqforth index df86d14c1efaee742189a9ef9d364880dec95af3..7d58efd65635dd025b48ff9b7bf625cc193db611 100755 GIT binary patch delta 3288 zcmZ`*eNa@_6~Fsn*JT%UC9r(sMHfhoVA90Y4?tH~cpDd3*i}gl8Kmt@$97tzGSf^u z;o;7k2B&X4*fjozc|E1T&dw=}cA>spGgt<<$ux@Ob0)w-6dYmez#ny#hmnqAj2bS+cY zvUDw5*K%|%SJ(1%EnnBx3~Bg}L4|Ay?dikUmE0c}Bc#UAPmZ^M*kPtb)Ih|hb{lsW zlgfTvtC)((@qXN>d{9I#4B$-5$s&ZB)ZVxkF zX&t6Y_7$#Lw;z=ZQ>`_r-M0@Iyax=xsfVlPl3l}it!-%+^;ZIW^tnAuv{Tq_s`H@1 z;g9^)MS2dm!!Ct3aOiGsP%xFyuciJO1~@Eiod+%X z^k21k)_-0&BP=uB+CIu8pw7cLvJejK|}sb3=Sn zKfC~+r=SiXzz#PJ@P+f-jpP$Fc2HC=luv@OoxW}}?gR1jRcg%mBD_#e?6^12M~}OW z9x4*@%GoN{@wJFj-M3bPk86S+6kz{BlilKPtf0Z5flI_2!S>GQPje2zvs}uxK@_Z9 z%k#4W-*SrMGbXrX{fZEpev7a187}Kja`_iwUrKTQ7S}bM=24dI z)U6h&$m=6`g>q(;W*aA@FWw|`Blx?vx|&-M`5A#dI!0E%f$e6e$5Zb| zO=G0%EY8d_7{B^Aq;7B_UQNMGW5VzlX?q9T6N}N?pa#veIu>1mGXM@UAoTl3Q7G## zF5$8bKDPC?(EY_Yw_!m1Nf2^haWnFbvvhBj>5_6$=-d!CUJWhFK zkUx#$OxsZxB_9@`U6*MGXC!VwnU^_e;~2J=KFdIvmpQw0LQ0lK!Lq8}<*Pt#La}EI zm)fpWQR{6&A!CAUJPq@~1C!+rgV~>nKdT0!baefcLGK9Yeo++Cha!CV)}qo0$}E#q zkK^ndicSm8uHALw}u+388V`G?K zug~xFyU@}EpE@fe*z8ymkb_|!x}+oJKC~T_A(?qG+$-)FQReR3Y`pmwH(9Vl+rD(*V(Za;b#N}Wz{noH}ulbq2LQ!V|IIqBq! zFt#X*j}SKNqCf-yvHiJpQW3#6rE-eZ{rXSDVfHC*MvfD?FULvWEGd`;pXWfiOpbP0 zPO^+D@TcN)C)K6dl=rxK*`?-5jFl&*$offKsz9YM+ijCLQ-NyknZ$JpG}fOdalQg6 zyg!MHBxpTG{E>|+rEE|s!BguLu6WqkvbN-$lMH2mvau_tIMd=8US3<#m(wg&snXLj z+QBG@SUfkxJS+Sa*OV5+qO7FlFQ@tW`!ifhMpAA=oiohSR@oQQqqHDnljm~3Q&?OV zB_Cda#NM4@g_eGbVZ?Rtm!HBURPa7wcF!bi>jl% zGUDQQ=V5rSaoUm;m}3uI*wJa6Z>^5Duyt~bnIzYyu~oUwjak5t1TO)2os0x(lI_b# zt_$1%7@@UVKLfSukCFW|*lF>{ICwe6x*^HuuX5L+7(nSi(d`-N23RnAHM6W6Qfi&< zx)Nt&jSr>3&O;b17_1LA51P`gdt8k>>wT{6Xz%Q!)^h9>sE>t|7bWH6==3a2H2oI+ z12B-?i(6=Rd1ZVnY4aT0{LvP&Du#t}O(bT#aT`3`@%;4p*C$8f=>{Hx6TE1Rj$)IlE7qkop`%WQI2 zaa1cq@ixxShWxSw$bMZG>%bIweipiI{{-op#RawU9HtAym%sksdU68Dlvt#Kq#?q* Ji{tV5e*kH0C)xl2 delta 2734 zcmZ`*du)@}6~F!f$8qTTC2btz1pC-=X!=M-JZ(bz8O~t)uPg-6vB! z?f&7Td(ZFu&f}hQKM$Pju`L|$u|4lL*5;0TT8b8C0P(dj^JCiIZD}~-TT}fvLU}HsBrC^@@ zU*?udTJs|OpyGPq{~?kAI{YFWG#Uc*!IR9#b2<9#N%+iGJwhnFzT8Mm(&}Mo@bv9t z(M~(8q4~Pj5A%7ra=wdafX)n4|7j?*hawU5^e`=^;4R*{eUB{~vvS$1!z|aK`S+)`rnh?U3|h?KXZ|Qd{Y9e21ZqFq@MS+PZOv7N;EY8WAs%aWrv^W9l%%6*+Bg*peF}f=O9;0@Q zPL6_W%_rlMQOnC?+JlsO|0`9;TBW}{CNJ(jG&sg%D5IYxz-_*>k^3K1pcUi1k;)d| zhi)iP#{{^{odR@2few$;{S#1OJTfkM&P_nAIp4y09=R19UHKZg>=D+=Nda?FUlI!M zeMP{M3brmGW40l=3?*X$RG8r8Zn`%Ko^p<}dU6h{cfI`!R^43o5I-53zpI75mV}0? zk3!tL)n~VQvW~4$%a-M(6^Dh&hjW5n&4Js_Z+0%h8^9Z!Q@Y5+SL4v}>_nak`t~F& zqraSlBC|mddK7q&srV%9LQe`%(ENKdkK#$C|9C>q^TSQC5Q?)68> z-qQMTs2#nUq)jh@k1o9kzc3m%&|??DYr+N|@vF*$bs_KQg7D_(mJW23+ET1b{(24^ zMMozkr#;nm;$nGeQHK?d)og2PZ$_7Iq0FMo3bmV|zP+imB($|DvW3;VCf30wsug)t zqJ{5CD4geI$=d&>l={3&o$t-kLupo=cc;J%>i0qSjP8{NIHO)c7JhyTT>OO=!&H+7 zFzhMXmWEn`T|eWhH9i@q=hCp*VB?TagV$hH@?~I!(!1!DG&ll!wzSkUr6u!lEW^G5 zTCe-%cefIuA7;Si^rmEDMq0MY8uZ?jC_#y~{5NVue5sft=hfpfY8KHG|GY>-G5##rWmdmX=`e(X$eO{0d!Wna&{^RyLWF6yaAmy>(Q@JomIG}rs?h+>xY%o z^k@#6oGYg#?)o%;J}Qhirs)FXDSAVl2eM)!Xw3{bjd`hb&MPHr;KydbXROM~_hwaA zk_{=TZ%fN+^h}o5lz$(tFbpf?Z`bld>Xvq10)OEhIiWeRmOgL^R+Q}(2&=bho_~09 z)6xDYnx`}LCzqhEypv&1?fWx6m`D3QwLZO;enz>T%E{O1(JkzWX8&>6E9a*FxCBsm zQ_>Hup`KY-e!Gu-Bv~BC*6=v=M0U=C!}FBNQqSLYwcnkh2WMFc*CptwS@5sYdiHpT WlCOV7N`0;;T35k&hTfco^8WxZ8-2w9 diff --git a/rrqforth.asm b/rrqforth.asm index f0ef63a..b06fed1 100644 --- a/rrqforth.asm +++ b/rrqforth.asm @@ -161,6 +161,7 @@ include 'stack.asm' include 'math.asm' include 'logic.asm' include 'stdio.asm' +include 'temp.asm' include 'compile.asm' WORD p_program_version,'PROGRAM_VERSION',dostring diff --git a/stdio.asm b/stdio.asm index eeac438..12c0ed4 100644 --- a/stdio.asm +++ b/stdio.asm @@ -214,7 +214,9 @@ p_read_word_nomore: WORD p_double_quote,'"',fasm ;; " (fool emacs) ;; ( -- char* n ) - ;; Scan to double quote in stream buffer, putting the string on PAD + ;; Scan to double quote in stream buffer, putting the string + ;; on PAD, plus an extra NUL, then copy that into a new temp + ;; object, but exclude the NUL from the returned count, n. pushr rsi push p_pad_DFA push 0 @@ -232,6 +234,14 @@ p_double_quote_loop: jmp p_double_quote_loop p_double_quote_endquote: p_double_quote_endstream: + lea rdi,[p_pad_DFA] + add rdi,qword [rsp] + stosb + ;; copy PAD string into new temp object + inc qword [rsp] + DOFORTH p_str2temp + dec qword [rsp] + add qword [rsp+8],8 ; adjust pointer popr rsi next diff --git a/temp.asm b/temp.asm new file mode 100644 index 0000000..9759f54 --- /dev/null +++ b/temp.asm @@ -0,0 +1,50 @@ +;;; 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. +;;; + + WORD p_objectspace,'TEMPSPACE',dovariable + ;; Holds size and address of the object space. + dq 104857600 ; Total object space size (request size) + dq 0 ; Object space base address + dq 0 ; Currently used. + + WORD p_temp,'TEMP',fasm + ;; ( size -- addr ) + ;; Allocate an object of given size + pushr rsi + cmp qword [p_objectspace_DFA+8],0 + jg p_objecthole_initialized + ;; initialize object space + push qword [p_objectspace_DFA] + DOFORTH p_malloc + pop qword [p_objectspace_DFA+8] +p_objecthole_initialized: + mov rax,qword [rsp] + add rax,qword [p_objectspace_DFA+16] + cmp rax,qword [p_objectspace_DFA] + jl p_objecthole_from_tail + mov qword [p_objectspace_DFA+16],0 + mov rax,qword [rsp] +p_objecthole_from_tail: + mov rbx,qword [p_objectspace_DFA+16] + mov qword [p_objectspace_DFA+16],rax + add rbx,qword [p_objectspace_DFA+8] + mov qword [rsp],rbx + popr rsi + next + + WORD p_str2temp,'STR>TEMP' + ;; ( char* n -- char* n ) + ;; Capture a given [n:char*] string as a new temp object with + ;; leading size cell. + dq p_dup, p_gtR ; size + dq p_dup, p_temp + dq p_dup, p_gtR ; address + dq p_2dup, p_put + dq p_literal, 8, p_plus + dq p_swap, p_strncpy + dq p_Rgt, p_Rgt, p_swap + dq p_exit -- 2.39.2