From 426857d112aab766d577f58982141963952e49c8 Mon Sep 17 00:00:00 2001 From: Ralph Ronnquist <ralph.ronnquist@gmail.com> Date: Sat, 5 Jun 2021 18:26:41 +1000 Subject: [PATCH] update --- reference.html | 171 ++++++++++++++++++++++++++++++++++++++++--------- rrqforth | Bin 2149290 -> 2150128 bytes 2 files changed, 139 insertions(+), 32 deletions(-) diff --git a/reference.html b/reference.html index 609c422..9900bbd 100644 --- a/reference.html +++ b/reference.html @@ -780,7 +780,7 @@ asciidoc.install(); <a href="#p_gtR">>R</a>   <a href="#p_Rget">R@</a>   <a href="#p_Rgt">R></a>   -<a href="#p_rsp">R[n]</a>  </p></div> +<a href="#p_rbpn">R[n]</a>  </p></div> <div class="paragraph"><p><a href="#data_stack">DATA-STACK</a>   <a href="#return_stack">RETURN-STACK</a>     @@ -826,6 +826,8 @@ asciidoc.install(); <a href="#p_execute">EXECUTE</a>   <a href="#p_exit">EXIT</a>  </p></div> <div class="paragraph"><p><a href="#p_false">FALSE</a>   +<a href="#p_fdemit">FDEMIT</a>   +<a href="#p_fdtell">FDTELL</a>   <a href="#p_find">FIND</a>   <a href="#p_forth">FORTH</a>  </p></div> <div class="paragraph"><p><a href="#p_here">HERE</a>   @@ -836,7 +838,8 @@ asciidoc.install(); <a href="#p_immediate">IMMEDIATE</a>   <a href="#p_input">INPUT</a>  </p></div> <div class="paragraph"><p><a href="#p_literal">LIT</a>   -<a href="#p_load_file_quote">LOAD-FILE"</a>  </p></div> +<a href="#p_load_buffer_size">LOAD-BUFFER-SIZE</a>   +<a href="#p_load_file">LOAD-FILE</a>  </p></div> <div class="paragraph"><p><a href="#p_args">MAIN-ARGS</a>   <a href="#p_malloc">MALLOC</a>  </p></div> <div class="paragraph"><p><a href="#p_negate">NEGATE</a>   @@ -844,7 +847,7 @@ asciidoc.install(); <a href="#p_nl">NL</a>   <a href="#p_not">NOT</a>   <a href="#p_number">NUMBER</a>  </p></div> -<div class="paragraph"><p><a href="#p_open_file_quote">OPEN-FILE"</a>   +<div class="paragraph"><p><a href="#p_open_file">OPEN-FILE</a>   <a href="#p_or">OR</a>   <a href="#p_over">OVER</a>  </p></div> <div class="paragraph"><p><a href="#p_pad">PAD</a>   @@ -855,7 +858,8 @@ asciidoc.install(); <a href="#p_read_word">READ-WORD</a>   <a href="#p_realloc">REALLOC</a>   <a href="#p_roll">ROLL</a>   -<a href="#p_rot">ROT</a>  </p></div> +<a href="#p_rot">ROT</a>   +<a href="#p_rbp">RSP</a>  </p></div> <div class="paragraph"><p><a href="#p_sp">SP</a>   <a href="#p_state">STATE</a>   <a href="#p_stdin">STDIN</a>   @@ -876,6 +880,7 @@ asciidoc.install(); <a href="#p_this_word">THIS-WORD</a>   <a href="#p_true">TRUE</a>   <a href="#p_tuck">TUCK</a>  </p></div> +<div class="paragraph"><p><a href="#p_unstream">UNSTREAM</a>  </p></div> <div class="paragraph"><p><a href="#p_verboseQ">VERBOSE?</a>  </p></div> <div class="paragraph"><p><a href="#p_within">WITHIN</a>   <a href="#p_words">WORDS</a>  </p></div> @@ -2109,6 +2114,33 @@ _______________________________________________________ <div style="text-align:center"> _______________________________________________________ </div> +<div class="paragraph"><p><a id="p_fdemit"></a></p></div> +</div> +<div class="sect2"> +<h3 id="_word_fdemit">Word: FDEMIT</h3> +<div class="literalblock"> +<div class="content"> +<pre><code>Data stack: ( c fd -- )</code></pre> +</div></div> +<div class="paragraph"><p>"FDEMIT" is a function word that puts the given character code to the +given file descriptor. The character is the least significant byte of +the data stack cell.</p></div> +<div style="text-align:center"> +_______________________________________________________ +</div> +<div class="paragraph"><p><a id="p_fdtell"></a></p></div> +</div> +<div class="sect2"> +<h3 id="_word_fdtell">Word: FDTELL</h3> +<div class="literalblock"> +<div class="content"> +<pre><code>Data stack: ( char* n fd -- )</code></pre> +</div></div> +<div class="paragraph"><p>"FDTELL" is a function word that prints a string to the given file +descriptor.</p></div> +<div style="text-align:center"> +_______________________________________________________ +</div> <div class="paragraph"><p><a id="p_find"></a></p></div> </div> <div class="sect2"> @@ -2467,19 +2499,35 @@ similar to <a href="#p_lit">LIT</a> but for a string literal.</p></div> <div style="text-align:center"> _______________________________________________________ </div> -<div class="paragraph"><p><a id="p_load_file_quote"></a></p></div> +<div class="paragraph"><p><a id="p_load_buffer_size"></a></p></div> +</div> +<div class="sect2"> +<h3 id="_word_load_buffer_size">Word: LOAD-BUFFER-SIZE</h3> +<div class="literalblock"> +<div class="content"> +<pre><code>data stack: ( -- a )</code></pre> +</div></div> +<div class="paragraph"><p>"LOAD-BUFFER-SIZE" is a variable word telling the buffer size in bytes +that <a href="#p_load_file">LOAD-FILE</a> should use.</p></div> +<div style="text-align:center"> +_______________________________________________________ +</div> +<div class="paragraph"><p><a id="p_load_file"></a></p></div> </div> <div class="sect2"> -<h3 id="_word_load_file">Word: LOAD-FILE"</h3> +<h3 id="_word_load_file">Word: LOAD-FILE</h3> <div class="literalblock"> <div class="content"> -<pre><code>data stack: ( "name" -- )</code></pre> +<pre><code>data stack: ( chaz* -- * 0/1 )</code></pre> </div></div> -<div class="paragraph"><p>"LOAD-FILE"" is a function word that opens a file via -<a href="#p_open_file_quote">OPEN-FILE"</a>, allocates a stream buffer of 15000 -bytes for reading it, saves the stream pointer as value for the newly -created filename variable, and then it invokes -<a href="#p_evaluate_stream">EVALUATE-STREAM</a> for processing the file.</p></div> +<div class="paragraph"><p>"LOAD-FILE" is a function word that evaluates a text file. It opens a +file via <a href="#p_open_file">OPEN-FILE</a> and sets up a stream with a +buffer of <a href="#p_load_buffer_size">LOAD-BUFFER-SIZE</a> bytes for +reading it. The stream is passed to +<a href="#p_evaluate_stream">EVALUATE-STREAM</a> for processing its words. Upon +its return the file is closed and the stream memory is reclaimed, and +then the function returns whatever +<a href="#p_evaluate_stream">EVALUATE-STREAM</a> returns.</p></div> <div style="text-align:center"> _______________________________________________________ </div> @@ -2626,17 +2674,17 @@ integers.</p></div> <div style="text-align:center"> _______________________________________________________ </div> -<div class="paragraph"><p><a id="p_open_file_quote"></a></p></div> +<div class="paragraph"><p><a id="p_open_file"></a></p></div> </div> <div class="sect2"> -<h3 id="_word_open_file">Word: OPEN-FILE"</h3> +<h3 id="_word_open_file">Word: OPEN-FILE</h3> <div class="literalblock"> <div class="content"> -<pre><code>Data stack: ( "name" -- fd )</code></pre> +<pre><code>Data stack: ( chaz* -- fd )</code></pre> </div></div> -<div class="paragraph"><p>"OPEN-FILE"" is a function word that reads the intputstream for a -filename, adds that to the dictionary as a no-content variable, opens -that file and returns the input file descriptor.</p></div> +<div class="paragraph"><p>"OPEN-FILE" is a function word that opens the file named by the zero +terminated character string and returns the file descriptor, or if +less than 0, the system call error code.</p></div> <div style="text-align:center"> _______________________________________________________ </div> @@ -2781,6 +2829,40 @@ word on the input stream and pushes its cfa.</p></div> <div style="text-align:center"> _______________________________________________________ </div> +<div class="paragraph"><p><a id="p_rbp"></a></p></div> +</div> +<div class="sect2"> +<h3 id="_word_rsp">Word: RSP</h3> +<div class="literalblock"> +<div class="content"> +<pre><code>Data stack: ( -- a )</code></pre> +</div></div> +<div class="paragraph"><p>"RSP" is a function word that pushes the return stack pointer value +onto the data stack.</p></div> +<div style="text-align:center"> +_______________________________________________________ +</div> +<div class="paragraph"><p><a id="p_rbpn"></a></p></div> +</div> +<div class="sect2"> +<h3 id="_word_r_n">Word: R[n]</h3> +<div class="literalblock"> +<div class="content"> +<pre><code>Data stack: ( n -- a )</code></pre> +</div></div> +<div class="paragraph"><p>"R[n]" is a function word that pushes the address for the n:th cell on +the top return stack value onto the data stack.</p></div> +<div class="exampleblock"> +<div class="content"> +<div class="sidebarblock"> +<div class="content"> +<div class="title">Defintion concept for R[n]</div> +<div class="paragraph"><p>( n — a ) : R[n] 8 * RSP + ;</p></div> +</div></div> +</div></div> +<div style="text-align:center"> +_______________________________________________________ +</div> <div class="paragraph"><p><a id="p_read_stream_char"></a></p></div> </div> <div class="sect2"> @@ -2812,6 +2894,18 @@ separated word from the given stream and returns the [n:char*] duoble cell pointer for it. The characters of the word are copied to <a href="#p_pad">PAD</a>, and there is a limit of 1024 characters.</p></div> <div class="paragraph"><p>At the end of the stream READ-WORD returns 0 length.</p></div> +<div class="exampleblock"> +<div class="title">Special syntax 1: Whitespace</div> +<div class="content"> +<div class="paragraph"><p>All character codes less or equal to 32 are regarded as "whitespace".</p></div> +</div></div> +<div class="exampleblock"> +<div class="title">Special syntax 2: Rest-of-line comment</div> +<div class="content"> +<div class="paragraph"><p>The "#" character following whitespace starts a line comment and the +rest of the line is ignored. Note that this is also recognised with +<a href="#p_lparen">parethesis commenting</a>.</p></div> +</div></div> <div style="text-align:center"> _______________________________________________________ </div> @@ -2892,19 +2986,6 @@ and the first becomes the second.</p></div> <div style="text-align:center"> _______________________________________________________ </div> -<div class="paragraph"><p><a id="p_rsp"></a></p></div> -</div> -<div class="sect2"> -<h3 id="_word_r_n">Word: R[n]</h3> -<div class="literalblock"> -<div class="content"> -<pre><code>Data stack: ( n -- a )</code></pre> -</div></div> -<div class="paragraph"><p>"R[n]" is a function word that pushes the address for the n:th cell on -the top return stack value onto the data stack.</p></div> -<div style="text-align:center"> -_______________________________________________________ -</div> <div class="paragraph"><p><a id="p_semicolon"></a></p></div> </div> <div class="sect2"> @@ -3338,8 +3419,34 @@ values are unequal, and 0 otherwise.</p></div> <div style="text-align:center"> _______________________________________________________ </div> +<div class="paragraph"><p><a id="p_unstream"></a></p></div> +</div> +<div class="sect2"> +<h3 id="_word_unstream">Word: UNSTREAM</h3> +<div class="literalblock"> +<div class="content"> +<pre><code>Data stack: ( stream* -- )</code></pre> +</div></div> +<div class="paragraph"><p>"UNSTREAM" is a function word that releases the memory allocated for a +stream, and closes the associated file if it’s a file stream.</p></div> +<div class="sect3"> +<h4 id="_file_descriptor_backed_stream_2">File descriptor backed stream</h4> +<div class="paragraph"><p>This kind of stream has the stream header as a prefix within the +allocated memory. Thus, stream* is the base address for the memory to +reclaim, and the size of this is determined from the cell at (stream* ++ 16) plus the 32 bytes head itself.</p></div> +</div> +<div class="sect3"> +<h4 id="_memory_block_backed_stream_2">Memory block backed STREAM</h4> +<div class="paragraph"><p>This kind of stream has a separate header which points at the memory +area to reclaim. The cell at stream* is the base address, and the cell +at (stream* + 16) is its size.</p></div> +<div style="text-align:center"> +_______________________________________________________ +</div> <div class="paragraph"><p><a id="p_verboseQ"></a></p></div> </div> +</div> <div class="sect2"> <h3 id="_word_verbose">Word: VERBOSE?</h3> <div class="literalblock"> @@ -3429,7 +3536,7 @@ is deepest.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2021-06-04 18:26:45 AEST + 2021-06-05 17:42:39 AEST </div> </div> </body> diff --git a/rrqforth b/rrqforth index 8c3fc39aa6bb367e89d836a8087b234aa7885bea..e3085861b8c6286da854bac80b728994aa1d9c5d 100755 GIT binary patch delta 6578 zcma)A3v`r4mahJjbefKkkVmKUAQTvZpqT)Q%V5GJBpv<?3F*9`HAGs^;wT3pA~@<9 z&99jrjaddV!4$JTcqD<mA7>Vl@CZqokS93fGKcXn2X$DEJt{7Phe2hSo?BJ7(8(Tm zx6bMR@2dLlcW>RQd#mbiVU?z9?^K$0+byYQ-Gmo5I7B0B9=I>$+Bqs3uAM7qyLN>| zy<&I_lgH3JMu5i%^cX=N!|XAFJ%+_&O!F94j}hWA?(!JZJ;n@=5$Z9*JjP6q5$-V} zJVvC)i1HXVj}h%L>>eY=W5jxlIFAwUF=ly;1dlQMh(XWq(w<H0S-YG5PK)2PkPv-@ zJo_s*ywWY)61{RDOs@)ZE@YXtG*2@vWWTDVg<5+O>)J!@*4iXOTzd7a>Lg~_LyNQr zlUUgvTA*ECAo{hj1#El|T@`OE5X|HMllh4SEcs2kIsU8p--oy~pB;IVzN|eupDnGU zYc=zH$^H2}cDRmi(0+NASs49BEAQ(G+)E2A+N=AS@oQ=e&MMtfM)LMEQxmntyY#`2 z0(8?yPTyURf9TiS{WNdCTlo6@{p=Y=ZI&#Dvsfo@?`OX|Nu%fN3_A9O->)Zqq!0Q6 zoW7%vNujq<Xx;&4YM?fAR*92b7b13BV4~Bv8FAMU_sjudi+KqLrn1Kl(C9e-_CyQ+ z`4SMEdO%uo3c*>0`A+f%2giq>cT2@@AjW!7SR1@VfX;JJY-E_P3Ss9FR(w$CW!DbS zAk%D?aS%`z-;WSA`=C^~Pm$%Xbrh1PIE;p0+aNVQg`lgF%3QQA!%2EMCc5q|YG!Q* z>Gbfu2<}C2cD;1w5`hk@=gzb<Q$4*W{9c5H)l22w_0olf`NiZV1a7XUapB{SN&{X( zU_^r)OJ_X|(k_7%%qN?yr+3eM9Fdn0`C?rIjnlFl1jO#rs{#{!cEn^iNVUU~E!dfp zxti>jQ1)^IofbY`CiU({WJDwCZQyzpX{ocw>8n8KC4{bTWFNmvZGkHaNfP_G5hmHC zS6;Q~RSx1?g4m=+X+Seu)JS7Z&v9H#i~~Y!*y8kESud48hp4}DlszDwcm<!$zk~SR zMT{3QD-NLti=4y?|G_VjB|aCTtcRpN&ml34;6fe_&O>rWzG<X0W(FYAiO37=u|qUE z@Ltj=$-sjq@Zj-MX<8$~W*=tdZ^K}d$<;f!B)~n3xT}c!iNpmgBund>XmqTrR1fX+ zI(<oqTY6X;_?yFW7#S;zNX23H${@AJrzVn@0`;5miM|gWk=iQ|ZEj+NJ=8XBjbl|t zv4gyKSi~!P@h}Yu{{>>-L+rXHF?4fEUVavt%RUAx*f<A1h`_l`(u9U4F{FSLvQ41k zOI`Zn_w}2%oW4&Vmio6L^m>!9HYj6F7U}2U7~32e{C<S>BkZAOu_A)<3yGy!F4>MI zYM!<ZaTexm25UkasKx98P=N%2%NGONbVL<2OZ(n~-Ub>S1flX)vly`LW@Mu8v`gCd z7Q$j%MD($(&D0$5U(N2?U0M{|*-R}~s1RN@v<Qz_iVI5|WMPXyJmANoj|3)ikZ%F< z@&?}Li^c|!-~ck(A}3*8PO+Y|hSapkNl0y>;no_&*jl9r7NwHQEn-$#bqk$gy3A5q z>1@*?mfuQa+4&Y4#$ITpG%%IC&?+63&<br{XbVbBBi?Tt&1`EcwXzv)l$z35N*kSR z`FZl+{r*2k|DCOEqjLl2q!AZe+(u_bdj519+9%=RYLh1azD-W?3R2G@^R4yRLEABQ z)5ujRyfcpr{|h{>B4%s57_TKSBR4lclPqJewA0z_(>59(8U|CftX=B3(C)77dOd1d zp+n;K3Ea$0raupY1NR~7o(@S?R1CO0@&yMahdMjl#OErO6AJoHwo|+Lr@V17yVy?W z+i(2I@83lAku&YQ@mA3tWNZgr6xt5GU!a2cPIv7y=BSX8HK^ip2lsyh+uu%ua;jYx zz48|MnY#$MR(Aqd8FI}JOozE8#9ZSRZ`j#k{>#Jk%JeX<_<0Uqgy3HWvznvSK5qur z^=em`UQKw;<-|uh_IjZ-60s4##rkC!0WVQq?%KaZMX@a%bh`G3PBHtiQ*)*&m)-XQ z!v6qVygc2-Iy-2hmeM7M^JNE355HU>b)<Ajkhz;t*v?sLC!MJcBa#oC)pXKD!LDww z%UQriJLxjbR=~6_*qZ*^DLICb<7&6eNY0Eb($~$phv>ZDxOZI(2<Zc9UQ&*_YX{?^ zSoMEUt9IjvFsH)x<PGS4lJ`5o1EohnQ(mrQo`?Ig83~k&OAVNbeB%~<`K)p4?(OUJ z>a0X?V{W45^>~Z!&q}laQzK^z_`jG~$`Km5`rK-%5X3&^V*ObEUkw;AZdpTrz8oU` zvymG|+<XMY(Id0`ToTbE#+M|9w+W7hXEyf$b1E`lIV}bDzAfJ{0Y{I}g!@ar@%#0F z)WjCuADH-Ax4tti6I;#%6W#_yXF1WuA4`*aPq2`qbWV5|)+3;kmy})+F9q3I#g5!u z@)b6VK6u<F>Eds9z5Acuxv+WiatdAldW~DumHeJwkqTD{(ha?`Qy}1>NaF@&y9ql| z5U0qL+?UeEr?Rsgc{#=8#Q&4-RXiq6RikXT;;~ApQ@rJU(srTjp+0FNn)to8e>uf= zB{$J05}<iaF4@~B_l(UwuxCI;P|i3e`{9&v5&JuNKU742$uT}Zv$TX`JW_1zuRS!( zns7{Z?mNc9dZ}G|`q-Tm6wLB_sX49`E*RDwNt=>k9sC~9zW-b$*8vQ!yqCsR%maX4 z6`814enqy=;UP8iIKUXf_Mrw9N{{G^2i|zK3|cufl|wh*VU)%ws9wE89J_q05%4r} zF_2P)S^KC>D?82yWoOHwVlBh&&yNfDv+_PT8TK5PBYU%tMuf(n0JZ;?Ee8Twyr+*o z9Fc_e9u)6A!Sl1NqPTEHu_Mn(DnRJFMJ+xRv+MD^r|N38fPX}}fCsM6kze7I+%p&f zmoP$6K9fu(xQff|>|VDZZbrrGt(KuOc;`vshhW`N=pe3>V*10cos+_@lk$E3qzK<> znXuczf$g1>!d*dnb=39`*sI6s<KZP)(qHeOL{+~y#-#I2w3rn2OCDhnJd}5KB6{#$ z*{_UK_>27_f&J@z()>LPQ!^K2b)ls7*YeFT!n`Oq)&IM!D@}@b-6{5$6EwE)?o+a# z%kZKsRr96ZgNVC`cB#7JRXl^I#0b{kM|OP=v+}`|nZ0AN>YwT(#rME~2<@`W`-o}4 zEsRzVWxS$z_8r-;2B9*d>Yu7Y@wE)F8T~X~+dd#~9$Ed=o;dtBKisW9(5qm3OScr5 z(ur>{LoR~tXh$5IIY^_;xsXji84xFf82^KM<r$0bIYfSf$c=++vY*D7mM~+G#xQ?B zji?Ca3PyrALi*M#N8loscKa4@Inx9!K7tGm+)7klc=%DhI_*3MR)q>N|Jct08b139 z#QS-xN*e>|ABs;1dbOEbwAQJc&iGofaS3QJb1&XMB=5pS#eCi09^~PXV7(39yzCfa zE5_g!RZ234<mq|F0NhNXktK6T!n{Lr8!jU?2wTr#V?UA>)F3R<D>Krr0l4pf$hwB$ zZqYVCEg>HwV7*ryO|4mu%p5qyl0>giI%_1T9kzWd801@ooQYnky3H$3LAt|5p1%Vx z19%vRf3!lH@I1o(UK!_WO7d31*Mw0okMlY$W(A9Zafg4MCgGz9zj9jMRW=M!v(|Z9 zI;RuQ5-G!VeKa~m&nZe?mtUAgZixPQ)*IOW+A#YV4rMD>4NFtO9#Pbyof_FH6RLI< zFPkP=j+Z7>yuaTq<kg<S*9|Y4coMRL?!nDdF{slH9AO1!YP-rMDi^C<@;t_k%E>8w z1QkFLglSAApQ(a-g&Mx9Kmdv|KoKt!t%NAK;<wzQWoo=$#|x^Gqkv)?Pt*H;tkTfk znD)wr{I>@vzt=5Vlm^A1EK>(9SoarC(}X2TvwACj^`7c7INsko43nx3JxUHeM$|5( z<kTdpw5b-uy`v&z0+y4nS<MKIenb)7Ch1}Tia@zg&DD9_QB<B+3cToYrReJs>4+nv zB7}1vB9)`EMbN`TX;PY%q#F8;DU3>f_85EZ45iwYQ68N!a~GfUL)PJ6W5c)?d{6vP z2GJGNS2-pwI}y408Cl6IOR}>ag~>%Zk2uK6F|ip(>|HKRS~=zxf6k7Hi_2a4PRE+$ z?3`Q&sT~vharTqEUpyd7-UPU>dzn<$7mzMwRhGPy26rQ%7Rd|81$l+AMv&Xb-9l77 zlwZIM(WI7=tyR|f2V!2F;z>v);?zvtgBM37r{elG%mZSH@MwZ7u%J+DxflsIVqiyN zec?j7wS40i`ovS4H`0yUwr$<E{7$H=WH5o}+;V)YN#!%bi<(?DSZ&J$&rUXG8Kq&` z4<=abD9y0`V8SiX7bZmBn^shu1z%1MOnm#1CIl)1GG|iwae7`x&YI+m!c|4&lkdWy zB4C>U2G@KRGDfFqizj6UT|6l}+a~$iv}-R;is_vTlR61qzCSL-6*T46mU5Ks9is_h z%g?&WCKI5;;g7FwDLXSp=V@D(vM<JHv{pC7g2(BixH9NGwBu9bWk1<*Q@{DX_eE6e zJu6Ry1tqX=!<TvfEuH;hoX%PL4d?54Kx$X>sFu{Op!eWw3uvWqc=WxFD9Fx#9H$8@ zx8Q(P4!(eOHR~!7@okBhSo{KYEIwV-;ee1jLFe4B<VDVfp5u6=QSEARsEM`06>;|j Gjr|7+SS?Nf delta 5831 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 -- 2.39.5