From a840f2b2acf2e2d93f5e67a4a264b21d08268ed5 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Sun, 4 Feb 2024 12:40:51 -0800 Subject: [PATCH] Ad DEFER and friends. Aling more with forth-standard.org naming --- doc/PLFORTH.md | 22 ++- doc/forthwords.png | Bin 18725 -> 19043 bytes images/apple/PLASMA-2.1-INST.po | Bin 143360 -> 143360 bytes images/apple/PLASMA2.2mg | Bin 819264 -> 819264 bytes images/apple/PLFORTH.PO | Bin 143360 -> 143360 bytes images/apple/apple3.hd | Bin 5177344 -> 5177344 bytes src/toolsrc/plforth.pla | 275 +++++++++++++++++++++----------- 7 files changed, 200 insertions(+), 97 deletions(-) diff --git a/doc/PLFORTH.md b/doc/PLFORTH.md index f8216df..25a564b 100644 --- a/doc/PLFORTH.md +++ b/doc/PLFORTH.md @@ -13,17 +13,13 @@ There are quite a few missing word that a standard FORTH would have. Mostly due ## PLFORTH built-in words -![VLIST](forthwords.png) +![WORDS](forthwords.png) ## PLFORTH specific words ### Words for looking at internal structures: -`SHOW xxxx`: Displays the decompiled words making up the definition of `xxxx` - -`SHOWSTACK`: Displays the data stack - -`SHOWRSTACK`: Displays the return stack. Note: PLFORTH uses a software defined return stack, this is not the hardware stack +`.RS`: Displays the return stack. Note: PLFORTH uses a software defined return stack, this is not the hardware stack ### Words for tracing and single stepping execution: @@ -75,17 +71,27 @@ While running code, `` will break out and return to the interpreter. `NUM?`: Convert string and length to number, returning number and valid flag +Numbers entered with a preceeding `$` will be interpreted as hex values + +### Words for displaying hex numbers + +`$.`: Display TOS word in hex with leading `$` + +`C$.`: Display TOS byte in hex with leading `$` + ## Debugging vs Performance PLFORTH defaults to compiling using ITC (Indirect Threaded Code). This supports a list of inspection and debugging features while developing programs and scripts. However, the compiler can easily switch to PBC (PLASMA Byte Code) to greatly improve performance, but most of the debugging tools are lost. ITC compiled words and PBC compiled words can be intermingled and call each other seemlessly. PLASMA Byte Code is a direct match to many low-level FORTH constructs. -## Hi-Res Graphics -Due to the way the Apple II implements Hi-Res graphics, a stub loader is required to reserve the pages used. +## Graphics +Due to the way the Apple II implements Hi-Res, Lo-Res and Double Lo-Res graphics, a stub loader is required to reserve the pages used. `HRFORTH`: Reserve HGR page 1 before launching PLFORTH `HR2FORTH`: Reserve HGR pages 1 and 2 before launching PLFORTH +`TX2FORTH`: Reserve GR and DGR pages 1 and 2 before launching PLFORTH + ## Scripts There are a few useful scripts located in the `scripts` directory. By far the most useful is `plasma.4th` diff --git a/doc/forthwords.png b/doc/forthwords.png index 04c4588fddff91ebd57d8caaecf334c6dbf32e9e..a4b2e22ec550d0f1f0d0b704bc7b43f99dd79454 100644 GIT binary patch literal 19043 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 F{{V~G$+`dl literal 18725 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 diff --git a/images/apple/PLASMA-2.1-INST.po b/images/apple/PLASMA-2.1-INST.po index 3699aa21e5afc0d064d073b0d57b352adc84e5fd..535588ad196dd394a1ab500663b1fb86e9f13fa6 100644 GIT binary patch delta 9891 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 diff --git a/images/apple/PLFORTH.PO b/images/apple/PLFORTH.PO index ce6a9c39d2a79be733fb5177d020d286dbccdfd3..cdae5b2bfd474ae0838492e6262d616ba1e299da 100644 GIT binary patch delta 9830 zcmb8!33L=yy1?<<)s;>MLN>CHy}J`S`!%x<*+M6$Nt1-=i1&#DMQx!gA|%5PZH8_= zq!mts?8|@j4~FHwagX-u^|(c@9_4V0=}|&FZ!x;76>%3~dz(fR?;xqIr_leEON9fa zR|9dev2eg3>0lr!HI|gth@&L$TZ|(rtHh^-X9-Jc#YMs&EmD~^#)lt&)3?a1zZU zDi))N+N~yMb@lL(F5w~Dm1}Z2OKL`xv^J8xX)}*1aaWd<6!9vV+a?cnxEl(Al)?%&)2N8 z)-F|6cx*93Y_iJ^r)m z)a%L$)z>F0 ztn&Oo;>!vu8B#(b#R~CgR?x^QrPApMCs~&jbj#36r^Ay(vMtNxcDNiRUd59|x;M*I zQSBb$P+D&w>yvFNb2}Idb2-_dw9w2zT3+p_2^^%F7NjSGJZ>87OEct}XAvBYm&$U@ zD$$wvAckLYhzCigrWyLTE+bf$9^AjGx~gP^qjk03C_Sj$>!@(JTQ`#ROqVKaT3;fv zryFkd>?i1FH;ifRASknkWR_KraIyDU#eb(@VM=gU?m11muXo6;UHKT#Hx!ud%)k+@ z>MCcQMT%p9?A6o)%d(vy>-sSMmW6XmF%V^jgn^OLv5wv=|eoHx8WvF1;O&( zL1opPL*XVlk;QDSDi^mBf0<>-uuLI{%r-hJ667A4+!dV4Ef?S0$Yxho-ZyCIdY6;gqI16a%9JdN<|oY>ANJAxy_;eD5%C& zQsxl7NP==q{-j3OyrkW8WTnpK5Cz0v>U*0{^eiwQr@l?iQ@6~yg%!GpPa z^s3eR_Alg_y3*&!zRZ)kc_^*Bh?@%Kn@3hE<^#k^k!f&AX|-E1|BcL36p|T8ZCU2i z6wE0K?#eA+lRi>JFV1qaAzp~>MTSgE1i{imV`-g3BoXc@GS)a8t-Za(SMsF%8gn60 zb%8P8U1Pq9a9)9|xT~wo4&n_3LBtgmW*5oU0#l9RU?Q38$#xY4`!g!1lD=7BEOiez z-%0pgK@eeeRqK3`p9@TSQc=;Wk$DP@l}cIbg)Y#MPJ$4 z48tDZ?Q5?$O!hswHYce(c}iB)0NEKX8YMBxlpd`2GdY=`BCGH7wYic~?*WMT|DpO8Qp9teyd_&J>X!8MuNiO*5w5Wx2Cy=ENTCi=q^{?h^Vo zBAngyzK_PcruuV>bDW;*t4BB!M0T!nCf;A4tq|D{Bo(k|FQ#p1GaU3;HqP*lvPCpzM6mJZ2B8N<)|vXEGLc=D49X}QdwnLpu_%J0_n%t^ zqpwj<>H|l5H2%N04~&K0_-earJM~`EYtYqR_0bJ9uJ<2TePcmH-|k9ByuOsiD@sZ| z`=+;G)CXPNe|uA!Uc>!H@y$_D?S2ZsCVBxIhZ z3wua9V_D?Y_m+U2<=1~W{$;bvKTVl_dMoQp?nsNRZ%+$p$Tdgw)tRQu^z{p#r{ z@=k;)$~@nN=TZy{ zeLXg3>-UX*n^U{pukWOPAKS)nE;l%K_%{?4xMkW?GWAPiFWY1rg#Ify!r5Ke-~W$x zTmG}1@1M_S)G9?&9*FEK&3PcQ-o7BxA3r|6-oGhpeb?RwIt`qut}Xnx)8=pDYkVQW zdm<}v6~=J6U9XSP0E^QkB$rWGM#~L6?c{5wK+A78RDI&;H&ns>=l9d3kmA5&)fpjv zeaf~7S9iUA;PLFgYzvjx>52c>#Ph{(Y2r@2a7*ir{>^YncEs1$8oM4A($yW&JM`## zV)h5@icxQ5Qx5uywBX2#)Mo_`27Td*5{-Q$cm~YcIv{*aj=e>1;Npg$ukq?u z%YT$*`O9K_#x^B}CzLcp{H29%8U#1YOrtVA*Eg-rKl~53O*PE(N!#kYbh+Z1E`PU@ z@^S8HBQGR{`hB`VaGv#qvuC>IBGaF6SD)K`^)~=+c5b^~Hjv5b$`3^2$;OkWcBO>T z!WiC^_OH&6^iMh$rN7r{uZZ)#wJk{sv--|%8y5L<^cS7sF`stsh&kDLPu!8tDZY~J z@p@(b_Veb+$&J}jY{_@?j_7V|a8$j0e!Mc-*R-R^axfuq14&|2bF-rYdo(vU%Klz~ zKlZ)0BT-`2k9Xu|984(W;6jX4=;z!s%gi<0V&Y}L!Q^pPFvl89Ofp~g&f?z8gBDYR zsp{Fz(IK?X4=Zb$-aK{MB>x*ue@k}p^~$4#z9l=8ypI-AuQxH3HqDws)oX$(|0~>p z2)*L!35}ph$@r$3vwpjO$&8mXUgQV+%llhs%{A@s&i|BPx+rUM^qWMXel>pWAH5)< z%qe21q$E2V@MXVPJJSEI=(^8;ljQ_eHS62eZ%{miu6Y*-+`T-!Pw~p>4!i-xTYcu2`izy50{g~$s_Rz$O|`G&p~M{~l*NUvVxep(aP=2b zg}BtIh;KUcGe`b$+~i69EjcbH|ASSAT5io##_&_YPfeM-(xq7R|8S1cPl%}ZHN6z? zUD?S&kygd({d=6D`eHE~RNC{DJ*lEz>WCK-&v}W5wsa8#5`;7l2T_nHq)JRjJESBb z#iAMI$wHcp15i?g#2r|2qzZ{nrR5eOJ&xzS{Iuf@ypOZ^5n)y##iKWhFc6iPhj#46 zQJly3Fxl8JGEoROM&V7IMQoao24O0ipkf2O`}he-7gA5yu?Wj>26K9|r`QLxT}b^< zhAP~KW~f+*wb+Dq9K|O%hp-IV<8JK5VVpurrjVSO!YgedFlVvXsKo;K@F><{8}{M^ zzC>iUkosUgPT~ukM^KKCy2FMdI8cYF@L~A<`>+6i!BVWk6Ig@wXv0pthJ84IcX0$q@exkqJTBo1L@+ysNF>9G0$hh; zl*0)xZw~56)L}dtFatAjC+^04XjqQNuo~;J2|Lh^z1WX;@jgDm8GM1Sa0&m$Pw0fn zEYxmh#y`p|v{9}s+mlQ@S9_z9ip79!Lz#3BKyNJBRA(Fgr77-blSDvZKt zOu%H^f!S!qeOQDgc-YI&U-1k!Vhgro7hc2Lcqc??Cqlxsb0J~sH^d>`WHq##&=R`^ zt0~mcWAs+=+XkVFez?8oZ2G z@jBkZK^*BWw7+!^SN}o$F;3w#{1cb(EiU6n`~qVrlMW#W4Ha5=Xt>%ll<`lXz)HdP z&=_rK52IGyLss2AgjUx>*2ZE&4@sTggBu8DV=layhx@Sri}4Uv;xRmlHCTs@*o-#p z#4hZ?ezx(hw}(~xu!mLsh~zZO&#CwdzrY;E-7ZXMJ;SVOGO-Q4k%>IYM})~L{|i@Z zaT~_tb~Ix)=HPxTq3yG@-Aud9ky zCtT9{hs#1rfumK|?g?4+Stj>t!(!*@b#XY!}x;50TBi52!h|THO(DOXxEZss zi?Y2@Vd_ER!+0OZa2%iDw3nZAxQKt@-}sT0ex@U-r%;0tif}|B0jaQ|H?mQH>v1Fc zV=&4w1jA6>Q)upSb)Dk!*V=~RalKRcph8Pj@@_z z@1TQ?9bsd~h>zn0PU9>tPvibn|VrW>7hp`GzU;{Sc1++yo{yPX>!5+Mc19%4=I7X+(>GWi@ zq<&8PRdlF&k@9bF8GOFeGGoHj+!%Hc*I^)vQ4YS`sl(vLNZg9C7>9|N=B0zC7+ISY zBdK>$Fb@l`6f5uup2Ave!t>aU7x6Oo-~isiQJls(oClxeG()Vc%CS7e5Q#*jz#1#G zKTzlGL((6`;3Jzl1jA7czNx9TxD_5uz*J1b9pF=&Iv4j~9_C{yR^l=6ZB2a!8}J-n zV58e&!_=L`ui*7q#-HzN+5rmRVc8KIsvV0BRgY775@+x^{t3ROso&uTT!9=XG;>^- z+C7dd193<~D&@AgP_;L4HuA{(#D!{uC>ugP417aVN1`^)E3`>e@Rdxx6J8oW5htrp z5wFEYJddqt$8Nli{j__V^$rnt;0XSKk8v7&6jRUPJTBo|e2+kb!LEqX>P_7bU0weX-gF`rsBjDSX`Z>;FSp-G634<^+L1@Dh64aZC72JYxm_&JFLby7E zr8hxV`G2_jAn}rfP;~{%RS8krlL^7<)097hop_D%{RvU(+bjrx6 z!K!}aB{3&TS~M~fgS0%BH)24dSu0^V9InI=Z6r$%^^+1MwK0)P4}Ze_Sd5i;5*zUf z_T%kDUN92Fv=0-b)Z^qQaEh`o5~H;5=%;5AJj&#eGzl3@JsZK?p}e3ge$fkcT1+fCH5n0e1@Tfhm$UHYG%xkRqwgbszvDyucAT;rIODzrbQ25ECrC3P|JQsR}wtEtb`vdQXF^5u9Kf5j8jt*x_lSJx9f%W^Zzt+rIH-4>?qCVrjeewJ^u6NgygF!B4g zWbH#+ih7Lv1o@}781)?S*Th+AvYMYJw4$^W_4>4V9XmP<23wkXV;UofN~)Y`X{wvJ W4rAcKgtRv2JKLn4gD54BI~Lf_v_iZ3&N%OVq=t5hq31zp)xne;7tqr%YFG%RLNmGSTEz3p!@~sJvn5C_{xFqQj zuTBoT9`C0c8=mxdX68hzTtC+17q_JdG25#5*9XL1gbTK+bO~K2ZA}&0e---5;SJ(V zlCV`@TT>_ACF~@u94G!lxYH`RZLudJoo5T3E%t0AoGYXfo9R695;|1q^l92)L7}VA zB}T%@BE~b$;~o?6m@E{Q=1N2TrXr#^o8%uF5?2wr2`j{PLTKU!dL*K(+)MI^7<$2v-`Z2a7AC<#TH zpQ3qhZ(U8rPJ#tC-KdKF1lbP5aLm`qY!s2kKigWzzX?#AF`YS6AUXdxa&DNLe3Ck zj)M!Yu1X{lFLda7TeAo{9C~j}K-Q+`9$P4e*yFGC2JJK%^X2P3jl;ws;@h2iVo^i5 zz-g>>yFI>u7(-@p$~V;et3;5v-6_|NsU0R}68FuC?Gx}<)_7~`Mu_SD>|uwG4cs94|NcbkS1&MuJ&3#=oFYfEE>abIXn4Wvq`u{)bc zwy;#@F%W2XMG**kb6y4XGPEy#@Cr&H) zqm}Qd{Ln`Z`0MLTUBuZg195e=DcK@Kk;~W+@Nij~a>>TKTrrW9)?)H&UHakv>rDd* zr@0J-^>ytdNM^Z=T2fuz?kD@ROJ5Ukw@)NI@6!8*yW4LgyyP;B_0}{5O!G)u%fg4A zeL=S=ykK>ebkP#tvwB63@3UGZ``Y9k(&T0l_|h7lvZhR{>9v}^yS94Gb=99(C(rL~ z7W14bK1l>FTD-q>**96{JIyVNlING0MN5f!c2i(Mw*4Lp{aUUv2ZSgOxU!qZ#c1O< zi)JbCeb&}q9c4P#o<1(gX{7_3^q`kalmLa3x3YXX~t)Gw!n9Icx5eMD``HyUcf&(6(Xr z#%W`(wD@j~C0W%`}7QV5rHI%3N*Xwe1^H+AMGv2KDWE{<-iBm7`z&e&*aLU$?B{_DPQ zDoxr+U6$2qoGGRl14pxGO5P^z0NRI?Z{Uce$Prk*72UOU-L>$APJ92|WwbBN^>J3E zz^FW51G~*2eREo4+TB&B5Fk z255_yUf8Nz7M}Rx%uq&wxuv(6jn8ftT5!%fS6jqov&)h$kWs*1cUW5bnmPK&xn(j2 z>b0aPdZa5Y|Gj^7F0{^<`&~I`=!#Jdmq*oRH`=)=a$HR%puKy}bYS@f647g>Jviqcw*)S?$vOQ9BO#}wH$N!ufiiV>$dQXW|txk@udab|QEXWQSoyl1|2 zad~&6=T+8DZ1~{1^iX7Xys=#BT!1~gFYOo+-AbUKDB5m}v}@zWWmB1OUX=@ftkk-d- zo7-d$rm#w+fAl0I3;W%voF;87P8KJrh^hE>OgTEHHn0>OIJ!0Not5D}8}oaN${R0_ zlZCxn8#mw%-?%YPH!3`TW3hH?JijqN?xu9DLEFWx2R2seJj>Iy?W9DX3ii!*vf{Vc zB%2_NT%=}iys*FcZ~dxz|69NCxXrz_4Jey4r*Y`rdlnrbdRDrJ`){Wx+U4>Yiaa@& zHH#n@x~x4!=QyHImUJEzS95oSbz3sWEz6?V_J5BE?Ml!d5rR8PyF;#=_HxS67lqd> zetmDW317U{Kl;KUh`dL_bGD>v2ef3%EFLC5ZD}768J7!NwKR>>cR%l>%Ujk)2x^-) zMFO_1*E$shmW9`E&9-D^a?Yn{lg_hETX4Qx2AX+{o!C00$ADtHL+jwd%+ip$g0V~ZE%i9>DS#ZBQ^Z`*4{&-ttY7N_O)w#p7wl{_tZsZli{l`jy*(Kxk zyid!u$4s;E8nu^eIj72a#i`OB(3f938QQt$Rl$v3l%SO_S=%IEq{AiaAn^+H9oC-G%u(yhqmoaho$2~1?NrzD^y6J+8Hc;F!UtZqNHl)^^0#(JZcA|r zCq39|;y!IN`s&!#W}~)eZ|tZT&z!dzn~imwyT-@T&z0n! zb=&M)XH1Q}p9fisE3OVCl+mEInQLaYPMte@?$p-Ht?gH|8i&tnoyHow1#9rVBs}ib zJnj0K_iBFO?lNvky$B2_)^71~?PgjXnIMA*oGN2B_GX7)d$nmyr%$ZmRj*ysZ*O+= zi1-%eE7QJ54U~dZ{K-tM%aY+hrf3eaWipsjUUAK#Ueb5 z6G*ZPX$&T#6`S!ns(K6Q3GBr;$aaX3WOoRu4+dcb#$XN>q67P3aSG{nEI>O};wfy$ zK753;_ysA&LK=V&R^t#viID0s8?~j34FwOCjuX!fS@<(f z;5;rtE)!A$TCp4N;S>zzLb9Pxd3e*V$3qA8LOFs@@j1T4*Z3Y65F-mE9?8f-AN0il z3`Qk9xE}Rr#7(#b({U#j;C?K{3arF4=#WK7Sx2x5ui*{+Q5Nbua)NS*_(Ob#lQ;*1 zK`4nxh6TCk1tzQGCl;a|_u)Y-$HRCUYp?-Z z@Fw=+01o2>PU9SY!X-#COdaBphD=z&pHPYueJ~IqHy5Q(b?l1~>i!r>`GDo0WAw_W)IP^o_!d9n=NRU{i$HH;PtgNu$V3rb zCZYB-$;v?DAsCKo)M7LmaTBIt2HG$mi?IaD@i1258LY=xQO^zb`BZHMiCt7hyJL92fRfU9~yBJZozcSMH?1D!EdlUR;W*hVw2RDVw03@ zB=5w^%KI$;8XKd0PKT2?jc@TIe#Rvj6)u=%&Mq?Z%U=pTc z8m40wS}_lcuo(BVk%tm(>LZCZV+g(m3qiZTo0k7ARSp4gy9&0DVTvdxC?jV0jPKk9axVYJ%qZqhpZlByyN7j z@h$$R2lKBtb0s6)EY#j+SsiGWmBHkdr~-d6D1NjcDOsqc$+A+G%&mw17>uE)qHQW| z(}<^I7Utp(EJO(RB)@p^ivTQbv)C##l5`yNOzm<<02{>h$ykWhQlg;!)Z#A9rI39>g*{ zgh%QB1ncp8j`AE{#71nPzMV045bwfn^8Ji^h+2prbd+N_jWhU$#`849^yDRjl%BkT zd&pJqbJa)L*(3Qwa0 zFJc3>U^`yJF6_ZR?8mz}f{*b9zQkGl9sj~b=rV-DFEL6wGLeIPIN?Iy4CcQ-!4Onn zB(BG31TYbk(TrQc4=c(dD7Y8P5ymQXpc5Oh1>5l&c40U6;XNF{QG9}9`~st##A%$t z*$km3X3B~=Qz)s(L=N&Zc{*k$D8G=qy4_ zvB*lgg$EIFfh9q4vUFKe)T=BpN`LCtViX#vH(FAZCYBQ|2_bbF3BO;ctrnZQ&|*`T z5Ix${bm(Moo@h8BMJbO_+#V zFb|6m`VAky$4acmdThq4*vmlg=1A(noLKe497#DzexCdy153G*nwo1+vvXy&0FK;P z#g)rr8T~N`Lvw}dp{+JoR>l!e%GImQtT#P3R-Mgqd9EB%!vrfSJjwEzT$|d7b=bv9 ze_)UgaFmr#v$3ypCFK&aoM%vD^CTrTkGlgl^g;>B&>w?Pfhvpu|F)sj!iNSlBACbg z-%M~TX5jWbp+1twi-GuAyo62IhF9=9?H|y7nD{UF7@y%J&fr_xe`Lol5bN@}DD$~9 z@?|B9*iJkwU$55Y%c>t^@@;BUh>uD6Hf0)(cjW7pr7V}zNhN-PcpdRZ;#~}|2m7e) z&o5GsG3asPpBU%@F40G4<*kVXq#*;jC_pbOUt+99ii>4GYmr)KmDSP2p*slXTQihJ zbZW;vco55I3|kYFM~EN8(^!q?uof?28(snb8l>#OKD>{EI0F84NIk~*|6`RE{&h&v z*?1hogm{}!lWp-KC5<4%7O!Nn%(LaIc3YC-BrapwkL5MC1Z5yA3??3G%T+6Fc}f-e zC~}`IT^UQHq)$ diff --git a/images/apple/apple3.hd b/images/apple/apple3.hd index dc345c371c17d99dc85cdee7ef9634065f33c9d8..d8468d5739491c631f5ca86c2bd1d4be2a41735c 100644 GIT binary patch delta 9957 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 delta 7968 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 Gvi}8EP@OaY diff --git a/src/toolsrc/plforth.pla b/src/toolsrc/plforth.pla index 68ee178..fe6b413 100644 --- a/src/toolsrc/plforth.pla +++ b/src/toolsrc/plforth.pla @@ -7,9 +7,10 @@ include "inc/longjmp.plh" // Internal variables // const JSR = $20 // 6502 JSR opcode needed for VM entry +const RTS = $60 const SRCREFS = 2 const INBUF_SIZE = 128 -word vlist, infunc, inptr, IIP, W +word latest, infunc, inptr, IIP, W word vmvect, startheap, arg byte srclevel = 0 // @@ -107,20 +108,20 @@ predef _branch_#0, _0branch_(a)#0, _if_#0, _else_#0, _then_#0 predef _begin_#0, _again_#0, _until_#0, _while_#0, _repeat_#0 predef _case_#0, _of_#0, _endof_#0, _endcase_#0 predef _dodo_(a,b)#0, _do_#0, _doloop_#0, _doplusloop_(a)#0, _plusloop_#0, _loop_#0 -predef _unloop_#0, _leave_#0, _j_#1 +predef _unloop_#0, _leave_#0, _j_#1, _defer_#0, _is_(a)#0, _noname_#0 predef _create_#0, _itcdoes_(a)#0, _does_#0, _compoff_#0, _compon_#0, _state_#1 predef _compile_#0, _forcecomp_#0, _dictaddw_(a)#0, _dictaddb_(a)#0, _colon_#0, _semi_#0 predef _componly_#0, _interponly_#0, _immediate_#0, _exit_#0, _pad_#1, _trailing_(a,b)#2 -predef _tors_(a)#0, _fromrs_#1, _toprs_#1, _lookup_#1, _latest_#1 +predef _tors_(a)#0, _fromrs_#1, _toprs_#1, _lookup_#1, _latest_#1, _recurse_#0 predef _cmove_(a,b,c)#0, _move_(a,b,c)#0, _fill_(a,b,c)#0, _plasma_(a)#0 predef _var_(a)#0, _const_(a)#0, _lit_#1, _slit_#1, _find_(a)#2 predef _tick_#0, _forget_#0, _keypressed_#1, _key_#1, _prat_(a)#0 predef _blank_#0, _char_#0, _str_#0, _prstr_#0, _prpstr_#0 predef _prval_(a)#0, _prbyte_(a)#0, _prhex_(a)#0, _accept_(a,b)#1, _type_(a,b)#0 -predef _vlist_#0, _tron_#0, _troff_#0, _stepon_#0, _stepoff_#0 +predef _words_#0, _tron_#0, _troff_#0, _stepon_#0, _stepoff_#0 predef _itc_#0, _pbc_#0, _comment_#0, _src_(a)#0, _srcstr_#0, _endsrc_#0, _ifendsrc_(a)#0 predef _brk_#0, _brkon_#0, _brkoff_#0, _word_(a)#1, _count_(a)#2 -predef _space_#0, _spaces_(a)#0, _show_#0, _showstack_#0, _showrstack_#0 +predef _space_#0, _spaces_(a)#0, _see_#0, _prstack_#0, _prrstack_#0 predef _cont_#0, _restart_#0, _bye_#0, _quit_#0 predef _abort_(a)#0, _doabortstr_(a,b)#0, _abortstr_#0 predef _compword_(dentry)#0, _compliteral_(a)#0, _execword_(dentry)#0, _isnum_(a,b)#2 @@ -247,14 +248,22 @@ word = @d_ugt, 0, @isult char d_0lt = "0<" byte = inlinew_flag word = @d_ult, 0, 0, $4600 // ZERO ISLT +// GREATER THAN ZERO +char d_0gt = "0>" +byte = inlinew_flag +word = @d_0lt, 0, 0, $4400 // ZERO ISGT // EQUALS ZERO char d_0eq = "0=" byte = inlinew_flag -word = @d_0lt, 0, 0, $4000 // ZERO ISEQ +word = @d_0gt, 0, 0, $4000 // ZERO ISEQ +// NOT EQUAL ZERO +char d_0ne = "0<>" +byte = inlinew_flag +word = @d_0eq, 0, 0, $4200 // ZERO ISNE // ABS char d_abs = "ABS" byte = 0 -word = @d_0eq, 0, @_abs_ +word = @d_0ne, 0, @_abs_ // MIN char d_min = "MIN" byte = 0 @@ -351,10 +360,14 @@ word = 0, 0, @_branch_, $C4 char d_0branch = "(0BRANCH)" byte = param_flag | inline_flag | showcr_flag word = 0, 0, @_0branch_, $C2 +// RECURSE +char d_recurse = "RECURSE" +byte = imm_flag | componly_flag +word = @d_allot, 0, @_recurse_ // IF char d_if = "IF" byte = imm_flag | componly_flag -word = @d_allot, 0, @_if_ +word = @d_recurse, 0, @_if_ // ELSE char d_else = "ELSE" byte = imm_flag | componly_flag @@ -471,10 +484,22 @@ word = @d_commab, 0, @_state_ char d_colon = ":" byte = interponly_flag word = @d_state, 0, @_colon_ +// NONAME +char d_noname = ":NONAME" +byte = interponly_flag +word = @d_colon, 0, @_noname_ +// DEFER +char d_defer = "DEFER" +byte = interponly_flag +word = @d_noname, 0, @_defer_ +// IS +char d_is = "IS" +byte = interponly_flag +word = @d_defer, 0, @_is_ // COMP OFF char d_compoff = "[" byte = imm_flag | componly_flag -word = @d_colon, 0, @_compoff_ +word = @d_is, 0, @_compoff_ // COMP ON char d_compon = "]" byte = interponly_flag @@ -670,22 +695,22 @@ word = @d_exitforth, 0, @_comment_ char d_bye = "BYE" byte = 0 word = @d_comment, 0, @_bye_ -// SHOW DEFINITION -char d_show = "SHOW" +// SEE DEFINITION +char d_see = "SEE" byte = interponly_flag -word = @d_bye, 0, @_show_ -// SHOW STACK -char d_showstack = "SHOWSTACK" +word = @d_bye, 0, @_see_ +// PRINT STACK +char d_prstack = ".S" byte = showcr_flag -word = @d_show, 0, @_showstack_ -// SHOW RSTACK -char d_showrstack = "SHOWRSTACK" +word = @d_see, 0, @_prstack_ +// PRINT RSTACK +char d_prrstack = ".RS" byte = showcr_flag -word = @d_showstack, 0, @_showrstack_ +word = @d_prstack, 0, @_prrstack_ // TRACE ON char d_tron = "TRON" byte = showcr_flag -word = @d_showrstack, 0, @_tron_ +word = @d_prrstack, 0, @_tron_ // TRACE OFF char d_troff = "TROFF" byte = showcr_flag @@ -721,10 +746,10 @@ word = @d_itc, 0, @_pbc_ // // Start of vocabulary // -// LIST VOCAB -char d_vlist = "VLIST" +// LIST VOCAB WORDS +char d_words = "WORDS" byte = showcr_flag -word = @d_pbc, 0, @_vlist_ +word = @d_pbc, 0, @_words_ // // Helper routines // @@ -825,7 +850,7 @@ def buildhashtbl#0 for i = 0 to HASH_MASK hashtbl[i] = 0 next - dentry = vlist + dentry = latest while dentry hash = hashname(dentry + 1, ^dentry) *_hfa_(dentry) = hashtbl[hash]) @@ -842,8 +867,8 @@ def warmstart#0 brkcfa = 0 RSP = RSTK_SIZE if state & comp_flag // Undo compilation state - heaprelease(vlist) - vlist = *_lfa_(vlist) + heaprelease(latest) + latest = *_lfa_(latest) fin state = 0 while !endsrc; loop @@ -856,7 +881,7 @@ end // def coldstart#0 warmstart - vlist = @d_vlist + latest = @d_words heaprelease(startheap) buildhashtbl end @@ -937,7 +962,7 @@ end // Break handler // def showtrace(dentry)#0 - putln; puts("( "); _showstack_; puts(") "); puts(dentry); putc(' ') + putln; puts("( "); _prstack_; puts(") "); puts(dentry); putc(' ') end def brkhandle(dentry)#0 word brk_infn, brk_inptr, brk_iip @@ -1066,8 +1091,8 @@ def _interpret_#0 inchars, inlen = nextword(' ') dentry = find(inchars, inlen) if dentry - if not state & comp_flag or ^_ffa_(dentry) & imm_flag - if not state & comp_flag and ^_ffa_(dentry) & componly_flag + if not (state & comp_flag) or (^_ffa_(dentry) & imm_flag) + if not (state & comp_flag) and (^_ffa_(dentry) & componly_flag) puts(dentry) puts(" : Compile only word\n") _quit_ @@ -1193,16 +1218,16 @@ def _trailing_(a,b)#2 return a, b end def _latest_#1 - return vlist + return latest end def newdict#0 word bldptr, plist, namechars, namelen namechars, namelen = nextword(' ') - plist = vlist - vlist = heapmark - ^vlist = namelen - bldptr = vlist + 1 + plist = latest + latest = heapmark + ^latest = namelen + bldptr = latest + 1 while namelen ^bldptr = ^namechars bldptr++ @@ -1211,18 +1236,18 @@ def newdict#0 loop ^bldptr = 0 // Flags bldptr++ - *bldptr = plist; // Link ptr + *bldptr = plist; // Link ptr bldptr = bldptr + 2 - *bldptr = 0; // Hash ptr + *bldptr = 0; // Hash ptr bldptr = bldptr + 2 - *bldptr = bldptr + 2 // Point CFA to PFA - heapalloc(bldptr - vlist + 2) + *bldptr = bldptr + 2 // Point CFA to PFA + heapalloc(bldptr - latest + 2) end def _plasma_(a)#0 newdict - ^(_ffa_(vlist)) = showcr_flag - *(_cfa_(vlist)) = a // PLASMA code address - addhash(vlist) + ^(_ffa_(latest)) = showcr_flag + *(_cfa_(latest)) = a // PLASMA code address + addhash(latest) end def _var_(a)#0 newdict @@ -1231,7 +1256,7 @@ def _var_(a)#0 _dictaddw_(heapmark + 3) // Poiner to variable in PFA _dictaddb_($5C) // RET _dictaddw_(a) // Variable storage - addhash(vlist) + addhash(latest) end def _const_(a)#0 newdict @@ -1239,7 +1264,7 @@ def _const_(a)#0 _dictaddb_($2C) // CONSTANT WORD _dictaddw_(a) _dictaddb_($5C) // RET - addhash(vlist) + addhash(latest) end def _create_#0 newdict @@ -1248,7 +1273,7 @@ def _create_#0 _dictaddw_(heapmark + 5) // Pointer to rest of PFA _dictaddb_($5C) // RET _dictaddw_(0) // reserved word for DOES> - addhash(vlist) + addhash(latest) // // 9 bytes after PFA, data follows... // @@ -1264,16 +1289,16 @@ def _itcdoes_(a)#0 // // Overwrite CREATE as ITC words // - ^(_ffa_(vlist)) = ^(_ffa_(vlist)) | itc_flag - *(_cfa_(vlist)) = @_dodoes_ - *(_pfa_(vlist)) = a // Fill in DOES code address + ^(_ffa_(latest)) = ^(_ffa_(latest)) | itc_flag + *(_cfa_(latest)) = @_dodoes_ + *(_pfa_(latest)) = a // Fill in DOES code address end def _pbcdoes_(a)#0 // // Rewrite the end of CREATE // - ^(_pfa_(vlist) + 6) = $C4 // JUMP DOES> directly - *(_pfa_(vlist) + 7) = a + ^(_pfa_(latest) + 6) = $C4 // JUMP DOES> directly + *(_pfa_(latest) + 7) = a end def _does_#0 if state & comp_itc_flag @@ -1289,7 +1314,32 @@ def _does_#0 _dictaddb_($54) // CALL _dictaddw_(@_pbcdoes_) // Fills in code address reserved in _compbuilds_ _dictaddb_($5C) // RET - // End of BUILDS, beginning of DOES> code + // End of code + fin +end +def _dodefer_#0 + _execword_(*(W + 2)) // Exec deferred word +end +def _defer_#0 + newdict + _dictaddb_(RTS); _dictaddb_(0) // NO-OP and space for deferred pfa + addhash(latest) +end +def _is_(a)#0 + word dentry + + dentry = find(nextword(' ')) + if dentry + if ^_ffa_(a) & itc_flag + *_cfa_(dentry) = @_dodefer_ + *_pfa_(dentry) = a + ^(_ffa_(dentry)) = ^(_ffa_(dentry)) | itc_flag + else // comp_pbc_flag + *_cfa_(dentry) = *_cfa_(a) + fin + else + puts(a); puts(" Not found") + _quit_ fin end def _docolon_#0 @@ -1299,14 +1349,41 @@ def _colon_#0 newdict state = state | comp_mode if state & comp_itc_flag - ^(_ffa_(vlist)) = itc_flag | showcr_flag - *(_cfa_(vlist)) = @_docolon_ + ^(_ffa_(latest)) = itc_flag | showcr_flag + *(_cfa_(latest)) = @_docolon_ else // comp_pbc_flag - ^(_ffa_(vlist)) = showcr_flag + ^(_ffa_(latest)) = showcr_flag _dictaddb_(JSR); _dictaddw_(vmvect) fin if state & trace_flag - puts(vlist); putc(' ') + puts(latest); putc(' ') + fin +end +def _noname_#0 + word bldptr, plist + + plist = latest + latest = heapmark + ^latest = 0 // Anonymous definition + bldptr = latest + 1 + ^bldptr = 0 // Flags + bldptr++ + *bldptr = plist; // Link ptr + bldptr = bldptr + 2 + *bldptr = 0; // Hash ptr + bldptr = bldptr + 2 + *bldptr = bldptr + 2 // Point CFA to PFA + heapalloc(bldptr - latest + 2) + state = state | comp_mode + if state & comp_itc_flag + ^(_ffa_(latest)) = itc_flag | showcr_flag + *(_cfa_(latest)) = @_docolon_ + else // comp_pbc_flag + ^(_ffa_(latest)) = showcr_flag + _dictaddb_(JSR); _dictaddw_(vmvect) + fin + if state & trace_flag + puts(latest); putc(' ') fin end def _exit_#0 @@ -1321,7 +1398,11 @@ def _semi_#0 if state & comp_itc_flag // Add double zero at end of definition for SHOW _dictaddw_(0) fin - addhash(vlist) + if ^latest + addhash(latest) // COLON definition + else + (@push)(latest)#0 // NONAME definition + fin state = state & ~comp_flag end def _compile_#0 @@ -1359,13 +1440,13 @@ def _compon_#0 state = state | comp_mode end def _componly_#0 - ^_ffa_(vlist) = ^_ffa_(vlist) | componly_flag + ^_ffa_(latest) = ^_ffa_(latest) | componly_flag end def _interponly_#0 - ^_ffa_(vlist) = ^_ffa_(vlist) | interponly_flag + ^_ffa_(latest) = ^_ffa_(latest) | interponly_flag end def _immediate_#0 - ^_ffa_(vlist) = ^_ffa_(vlist) | imm_flag + ^_ffa_(latest) = ^_ffa_(latest) | imm_flag end def _branch_#0 IIP = *IIP @@ -1377,6 +1458,9 @@ def _0branch_(a)#0 IIP = *IIP fin end +def _recurse_#0 + _compword_(latest) +end def _if_#0 _compword_(@d_0branch) _tors_(heapalloc(2)) // Save backfill address @@ -1563,10 +1647,10 @@ def _forget_#0 dentry = find(nextword(' ')) if dentry if isult(dentry, startheap) - vlist = @d_vlist + latest = @d_words dentry = startheap else - vlist = *_lfa_(dentry) + latest = *_lfa_(dentry) fin heaprelease(dentry) buildhashtbl @@ -1772,16 +1856,24 @@ def _ifendsrc_(a)#0 endsrc fin end -def _show_#0 +def _see_#0 word dentry, pfa, w dentry = find(nextword(' ')) if dentry and ^_ffa_(dentry) & itc_flag // Only show ITC words - if *_cfa_(dentry) == @_docolon_ - pfa = _pfa_(dentry) - else // @d_dodoes - pfa = *_pfa_(dentry) - fin + when *_cfa_(dentry) + is @_docolon_ + pfa = _pfa_(dentry) + break + is @_dodefer_ + pfa = *_pfa_(*_pfa_(dentry)) + break + is @_dodoes_ + pfa = *_pfa_(dentry) + break + otherwise // ??? + pfa = @d_exit + wend putc('$'); puth(pfa); putc(' ') w = *pfa while w @@ -1826,7 +1918,7 @@ def _show_#0 puts("EXIT\n") fin end -def _showstack_#0 +def _prstack_#0 word val byte depth @@ -1835,7 +1927,7 @@ def _showstack_#0 puti(val); putc(' ') next end -def _showrstack_#0 +def _prrstack_#0 byte depth depth = RSTK_SIZE - 1 @@ -1910,23 +2002,25 @@ def typelist(typestr, typemask, type)#0 puts(typestr) tab = ^typestr - d = vlist + d = latest while d - if (typemask & ^_ffa_(d)) == type - tab = tab + 1 + ^d - if tab > 39 - putln; - tab = ^d - else - puts(" ") + if ^d // Skip NONAME definitions + if (typemask & ^_ffa_(d)) == type + tab = tab + 1 + ^d + if tab > 39 + putln; + tab = ^d + else + puts(" ") + fin + puts(d) + if conio:keypressed(); conio:getkey(); conio:getkey(); fin fin - puts(d) - if conio:keypressed(); conio:getkey(); conio:getkey(); fin fin d = *_lfa_(d) loop end -def _vlist_#0 +def _words_#0 putln typelist("Compile only: ", componly_flag, componly_flag) putln; putln @@ -1992,22 +2086,22 @@ fin // Compile ITC version of inline words ( speeds it up a smidge ) // vmvect = *(@divmod + 1) // Hack - get VM entry vector from divmod -vlist = @d_vlist -while vlist - if *_cfa_(vlist) == 0 - *_cfa_(vlist) = heapmark +latest = @d_words +while latest + if *_cfa_(latest) == 0 + *_cfa_(latest) = heapmark _dictaddb_(JSR); _dictaddw_(vmvect) - if ^_ffa_(vlist) & inline_flag - _dictaddb_(^_pfa_(vlist)) - elsif ^_ffa_(vlist) & inlinew_flag - _dictaddw_(*_pfa_(vlist)) + if ^_ffa_(latest) & inline_flag + _dictaddb_(^_pfa_(latest)) + elsif ^_ffa_(latest) & inlinew_flag + _dictaddw_(*_pfa_(latest)) else - puts(vlist); puts(": Invalid dictionary\n") + puts(latest); puts(": Invalid dictionary\n") return -1 fin _dictaddb_($5C) // RET fin - vlist = *_lfa_(vlist) + latest = *_lfa_(latest) loop _estkl = ^(@syscall + 1) // Hack to fill in parameter stack locations _estkh = ^(@syscall + 3) @@ -2028,6 +2122,9 @@ while ^inptr and ^(inptr + 1) == '-' is 'T' // Trace flag _tron_ break + otherwise + puts("Usage: +PLFORTH [-T] [-F] [SCRIPT NAME]\n") + return 0 wend inptr = argNext(inptr) loop