From 640471a59eac6c012fe617cd3e9d17ad4f37331e Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sun, 7 Apr 2019 22:13:32 -0400 Subject: [PATCH] Simplify colon loop / dispatch; avoid word lookup for tick/draw Substantial speed gains _and_ f_cexecute() now works for deferred words. This is the first version of Jorth where I feel like I've gotten the VM right enough that it can reasonably be called a proper Forth implementation. --- game.exe | Bin 118456 -> 118902 bytes game.prj | Bin 5365 -> 5493 bytes jorth.c | 65 ++++++++++++++++++++++-------------------------------- testbed.c | 7 ++++-- 4 files changed, 31 insertions(+), 41 deletions(-) diff --git a/game.exe b/game.exe index 2211ecc05d9cb521452103c50d7c2a2d49eee008..51307df219454723b9bba125e6a5af1b6396cb83 100755 GIT binary patch delta 34873 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 NP#C&1|FB54{2M&%mL&iH delta 34702 zcmbrm34Bb~|Ns9!_ulOLK8c9Pz6aS5Vi1YlhzJu&>}wSzK@}6CC7Ei=XscREsiJDH zUa6|BbkkZ|)s@ofC6N#W5t;w%+?k~6^Z9;1pWpvmkDI*C^SsZ#-g9nRzurz>Yv(o~ ze+K)2>?oLs%;xDU+`2iw8cLKIPBb%VFMDbW6Dk*&1R+0R-H1hI5@y+bN-**5}D)ZTc}m-#QSed$+Ywb^zHy=4yCMuj7b z+SujmM-2bgv|8#c?Cxj!PKq+j?WfzcHbejN!Idz9t`NV9^7*8s@Y2yy9%#ibLR%}k)rB&W|!e*Dnrd5lLtW`>$u#qh` z_nMlc->)^#5fq=6F#8Q!rMuPDzrWFve0f%rn*5O_y_JYrOj9~&PlmEk{y zvIg4pc%Yg8WuWPg2b%rgCe``zP_zEaq--7!H0R$2GF1OdS3dnvt%@>36BRp^EyT}% z8}eTRzW#T>65IbWpg|pJMV62l`l0`E^mJ&kb^4FCwk@_v|AVa|yQz7&|J2aj1u6zM zom2k9FxdVN>r4N%whoXtae_{MHm_w^$!jbsUBPsaN^v@=hpD+aJRMF~VQKZ{j%Nr!dH z^?PXK{pdfoRN}!ScUHPLA0(foH6s->S``qm}d zRb8o@$4;Wj)-}ek@SeWNT4Q;`T9Qe(=10w!t2JNF%Hl`JTBmz@<-Wl4;e<@Y!gXD! zvR702s9tYXAJjLO(b^7j9d;-u)AW|cc&Xmn7&#e-wY;`c539>Qk7Yxp)~3mfVyBiJ zw?sR-+4>1%^vY)APg;zVP0US`#@k-)WV{P3S3P+jmaH-59WtBC)Yu$((n<%d-gq-l zi7@HhT06PGabLxvX|7uvcFVNdEl~517~e|fdE+roHht|DV0ig%bHSg#Yblv^oHkWC zS4gXM%Cx(BCAKNcslM2zv!7Y zz^fm%M2%_87_>vn_l!HVf||j(cPxeBS=q2dEB?LBD|*bQBAf4sc4(K`!A9G>5$tNU zKt=4(ZrFu*;k$8{R*l`-DU_rAQ15E0X%>D0)2U_Ps+-K4T2us2`9w>+f8MrMnzF&H zWLk=Bz?`vRpB6oP!yf!>Jek!%#N*)`(|wi=<&N7JMfrgmpdq~Sjtr{-LBK!9*%YdV}S6RkoEtO=Pw7m=~bLu|qNI$x*SNdUI zvCQ+u?n=`mIT)4vB6w;enu1p$vY6eZcr@{VJcCHp4w+uGunC#+G^g&-DzDzw!wl89 zM_VPD^O`q;RUXD56Q3qpFMms{G?8=My;0GGMf-B&uY@ik6Ic<`6`X~%$sFRtk_TW6S||pd@NJ#&KA#- z)+n!Ou&0mVsXD!778_Id_e8@h)1sK~#2 zE*8mbweFj#W%L0X=BS+a?emK+8_eQS8=L0vmS|DZVMe^H@H`m}O~aJXKKkYs5F&Ty2GE6DIrRNiT!7WUd&661h}7a4s`;FLGF!0rW~|qyH2@% zQ?I;7%D0y8!Iy&9@WOdeTVj6_eUGThwPg`SkKChG8$zkPuh=%q&h9#8J;HBzs4PNw z1Alc@7cT+p1<%{P?50vGc2P6!0mHP$Dks$;!7=rrwNd$UhY+r^1M)KtJ{nR6Sv-|B z4YDifK+u;PENORAw-M?ND^ZQ?qguTZ_sAI3*E$|8>AeHG-fT_pRXBE;t3;*1QcmUJ zJ)S?~$fnY6RN^ChAdM;>O@kWa1XHX}fT1)-f6^99mSsZ7lYMyixAcCyc;1WAo=Jz3 z&gydVl!pmeB+9KTo8nR1Ja4^kmi_+@b~;Y4-)LF=lp8gc`Bq(gvTGkt3h&8C$e_+> zR_nu7Yb43@fL~Z0)S!!b%4)9PvfA)IXvvpqFq#{vRi`@lCFpU|U^T^#?VtM+zWp)U zU`!Y#L-W=R+c_Jxwz3<`EgL+(g;QGr6Dc-xEghP7A6HC-^Q_TZb{0Biiq*|$LH>f@ z*6LP9*DD`9kgs^_lw%h6KE)ZdI;BIiVW)cK`3JJIk4|X=!{7&eDAnH3 zE50rEm@9OOP@`98*5Dd-zUQ-|wafAXsC@<S@XD9t4*XqgMks=MSR)hoWYl`ZDwS;t$t_OCtkdZ)uBiOXHGE?Z%v@o_}$kj7dgfHn~p6-B$^ZjyLL=Dt%Q49xr^jjk-11#Dns!LDqe2Ir!?0IXtUjqxJk~ZI#|SqpB~< z2EKoZRbN6L&tUWRamSN6mv^Df4pInU!45WoAIjes#S$ zOXk^+!P1AgFOb|F5#_=w zTaCz|e0xo=+`X$7&aw#E{$ok9ZJttju@<2_oG1Cb+8y$g@3DWk-5_hrrSeo+o2OJ= zvreVzR@WWV6W{hpXw33VVZ%ZElq?ICB}d%KV8hLf65rxw3OF$}W=b0mYOMyw)csoQ zvXR8b{n{#@PH-06D#y)Acse-Rsp5lk;_D#G8#pa(&(f-b!+H=$6U104c7 z2V^L|EqlZ4L$H%zhrveQmSce40XhTp0notPaxT!zK)(X50ZP9uuR*2F2l@kODNxjH zc@)rOpsPT|Kt8vXqI&r@7Of$m3TP3ixlV3{9Bcp58{`_Weqhyg@-$R$Jk08VIs*Mz zCp$|zB>?C?P&m+uI=Lf|9Z&<1C(zzHc^uH4t9rQ+$b1!hnL7Cupx=R-fU1F(*U6s% zeFH>2bjpuF^XlaN278_IF_-{$0&HTPd=6*}kPXmYpxipS3L#$wasXNn)V)p)w!w@C z554H*2lp*RR?*6G)Ub`iK z4)g<17|>;)vRm>apyNP>D6ntAX55lf?R3g+usEQDK!vyD=|Jm%5`ne?^}Qv(31kFn z5A+&P+AaAc&|IJ-pfaGaTXI`e;&`AGpcz0Ox8&Qf$^q&KR0z~`QyyfG@!t(B9jq@{ z)lHeVNE}d4pfsQhH{~iIf1rLqVL+eVl*s{u9%ulN2hg6I@;IQ|f9T~wKuv$>mA7xo zkwBM#a)7FUUc4!H1v&*Z6zIYqdV})pP5C9TO0eNzpTTUxO?e&Adq4$1dw_=AlotW5 z0vZkUHjwtFyaQ+v&;+0tf#Pq(W*NYS zfZeH;bHGx-W&>$~ey^3s0EGZO3ltCZO|3i?$PI`G3;_DLRz8N&)p$iOKM!OFw53)) z2XqbSWuQA(^vbKXatY9Rpf`Yi2U=V!r#tHm$}zA_VBdgEua$>8>y%wUTY)|XDyWqU zFlVd<+6lA;s86lj8>j+kKhUc{skQR^7|?ToJ_cG06k0160*wPY0yG`Sy;fcVG#KbJ zpaLMnqZ;`DSO(aaV12-@*T}Oljl=?-2TBF{p+^4JMW<+hegX;wI$k5+1+oG91;`y} zca8iGP~By{d=co;WxcYlMs9^!!uYvyRf&TXc*xVX<8Q1}^YcM+w zG`>dO;H6VG162d<2Fj_C&jXo&ZULQ*B!1u6x42xJ6`tC5{i*G~hno){QF{x$Lg zSmgsb0gVT;t&t;OWyl8e1Iq!seM9aGmJAdK)D7s;4S6h3Tc9wYIG|HE)JAdziU#rr zs=OgTk9K?bJ4PyyEzo;6rOc>?l|_uv1{u zZpZ^*wi74|s1j(z4LQ^ot07Q-p!a}!-;k#Ql>_AitpZB9A)f`B4Kx{O5m3kt`9(jh zhCs7`rUAL#kk6pObwCSxqW_HmYpj+7{IMK@JrA?qK-a3}D4-Z1BTx#^`D!^8$Pefh zpb(&A)$&*%3FuWIH=teB@>ZZ*m-O;lpvFsB4Xb6ds8fCe+6;6JsG?fF46CmUU^~Fh zgUzXyYr$k78R!_$xN5l(=v|;=K)ZkjSF7(}D}l}etp&=cmeWxr#HEy0slLVV{RO@p z1y`%@Vxu9)SbX!~dj-Bg21Tfr12LL-nvdodRTGnYhU%1>i+b4;HV-ahD_SM{L6+l0)^+&{goEVv z!FpXc<=MOXvW!1)dRN8Y3v@#U=hz124IBE2<&M6pmC-jS6Gs&xnah^$DBKW|sr{IQ zH|{+w_YKK}muY=?XveTjDo(9zOV#_Rl2L_gSmwFQPDk-#3|5iVRAWw!$~31&WNrw{ zwBh@|PIyJJJ!u?6_d&HAY6IFVDhjWgth37T)jEhhJ(o#1xCyej@eFvdKKVahS66?;z@1YCQ%^ zD+EcZzqX1jQ91LdenRzdzG&f3#7gW$x|n{A(lUEfP;^985jVn% zkD3XbIjEUp4?iE$u2Hb_{?u_ zT-ylaF|y3}ZXVpYnJgt; zMb@KzwA=RFr8Ad|zPqx-(>bc?Zo6}rZ1!bg*$6>K)$GCGf^lh)X-8rkw$JoU;&8Ta zZ)7_^=9Qlre$#BsvyDBCj5U5M1&uNGckk@e78%{HjknEEL+&7q5azt@~mIEHfWRjH+||GV>`ROMNBWWmkSspkjdPSA$wME-kCoPD^|;= zV>nPhVLN{qRnhwS!&W;TF20Z7RhIMU4VH40r13$6sYhmn^2wz1T7 zDJ_^SG_j5oC+!=VU1lCP^I}$6)3}-6Td%>(s&#ovc&+S0r`+Xr$=HC|>6LAd^58{OT%?aFGqfCzdY-vuP)DbdDbPohSs7=pnTP}W`CUNbVu)D zpT^}Wxi`y>Yx0yacG$Nfv?oH}clbx>(|G5oQA3}$gq|FS#a<`7;~_qa@4(t{^To4# z5qlajPB5i+@;3~E`U8m~?mAn&9D}&qAns-VjQg-odBzg=VN2W(Vr84=xFy8>!ryT} zip^8%ZPoCr#QXY|`#pXTiLXkqYV*Ty^-$8W#BLWh+jpuh%le5g ztzC_K8|O6fE{4J3MqL?|Jo$aqKRl&fLY2e`?_rixI5m!uO?*@#j?(7qJ?l~9V>gZJ z`6sRdE7xP)vO#?*+v`yR_1Hbdnj=Iu{ju|TCH@`?jZK2$V>K|R=4UE>zQmnEL8j8Z z1#TfF`|l|DHO-kzl`pf{(>XXfwG{f?7uJJ9-fDcdYwNF`z?(*=d-b=2R*z!e{z9!Y zUVm!AvKuR7kX=;|YrxW{WH!Q-UlkNT8R1b)ON53k&}xKQON7=t2Yj{kWPCx*@%c8# z#~XKs)nQJ}%T&64f$|Q|R8p*v=jQKA47D@-QOB#2*VMP4qn!NW59jnF6_E$sHBx!V zsS5XuRBEh_mQ~=PA9CBg3e<4NU}i0Ule)~08jXX|I%|=pS%d#G8_E#@{yYZ*Ki3=7 z#FVEl%Jpe@vH4stcf|nM^*LT_zLSGH>Xem0y@1vNWqc=(12O;&2C4vx{Z1|gnhKN; zGzUoYo!qH2PB(!j0F48(`A*&qt1O^mpus?O=j1a$h9t1(z%sxto|CiM>y%)i=Ye8@ zzCI`4hM5b{3Lp*8fphXzpoWurc^!}q(B^aU%uYJxFQ838btmzK?>X5E=sTdTKo@~Z z&&j8OjsWch`WonI!#Vj^upMA~!481spOfo=-URv>XfsguIoS_IS_X6+$OM#pPL2aA z0XhX#3e@(T93H1r#sK{U^fZv`Ir(?U%wH^xic55P@h}{S1Ys^!K3B@KOan9g42y?l zomjGX7=Jm^DW?@ZJ}`7Ci8!%j(J;qdINv#>=+#h;h`0u^t^EZjZ@(tht6`KGh@}Z3 z%q5$eFUL>X3d60p28*goNm=l#Jg19J`RD`=P7(g-3B5A*tUMRl-vso?0JalMcUBhl zXt1Ag`uaA4PcKy-bh2 z4nD_Tdc4ML8*Cb;4U3yH!feh{M!4{65kAJM94%(%*N@k12-cfjgZcGc6@MvcFukWu zV?#_AwdYxkX@B?qek(_W(_ts<&$m)(v9#z5Ep|H*`J$<;$2PZ^{L=Xn&381OC_CZa zb;{l@Jr^)mySFlPIAgDwyt1?bG5NhW#^gI4p6_Z5O3pXiCg)e!?IV2Z5Mz2eE3#Ew zzB?65D7|1j*|Ob~hxXFRolQHllA@*BvM%NYX+{b6H^u@-bEe~Zsdky&y-dNLid&av zNVSf|cKnygDSOC}zrFk)^KvP1%2T#HKoN_Ds#mLet6n8-5C<-7G`z{=)gyEjnfyB} zyVhtszQ|ZO;@zDc=q}anv%b^vw^q6H-e0pb*vN!@1W2^!RcE^>A}-(jNG3sd&o(Zf zgqH7X)ooTxK29?T?_cXPc$kNF)-YXK!gR5O5!A1>)i9k+^ZLYxzBPhMTo*NU&gb7& zyfp$}b9u{II@d3-KACFJ601ZTgN94rZGc z^=-v}t?S!6q;qeb+^RQb0LQZ9mOlhA&&GQx)_3d=R8NzAzXUt`+7lAV>rGwzwPBk~ zh5h`!ZEMZwU&x(^>SDIGwHs_}O%?spf~Sl?r|`7I!n@CTyn5PR`-qH1(wQrZ-kW0j zystXEVFY#t9eK`&yaEZH97t~S5x|_ZGov(-T*J#f)3`ghd#5#Yxd%qD+%WJ zUKzIcxx6&SJWP9sCA(j8FFP(>YkZ{q?0&8Ok@CIi-mtEMZNc8u;jBA$NzI7}_bfQ*O^(+o2A*KDlnW$+=U8N_mmF8M&)-TjjPj4a^^oihD2rsKB_y?5s*AA#*ReKw{K z+r8Iq>=c%sQq-nsN>NPF>Y{gxt`uD_sx2B)q#0RX)KJt^v}&Yw)E^_IQS(OcSO4`Y z>Q{sbR_*@xmQFG48(;>T>&Bflv3+2dFc~Fk&m5DyyUt6)S@xq3j!t!i^dmNZJ$u+02#I4-U zY$qN=;I^j3Nh_iz6q+L@;hBPGD)RBNZGPd)wgq^K3KL!o%9v1|I;yZdV~k0ew0?NR zn|krfgqJuC$}8+C{)}p>j;)$`)%a(5!tlZ?uI00->@y*CyW`vp40#-9x~K<<|eEz>U9wYj)DSC)^c(yA7(* zn!kbS-u8sM@(K5sPq=@2!hQV-cf%8I#}Pakp22K2Jql<67I(}O?#@rR`##~$-}}jD zX-w4A2Ab}jIA&KkM*VN^k&{U)U(07w&v!O`jL-q)t^z(l+^sk5H zvn)dp6`+bW_SBkobKyYcbcG8?I!GRk@wG>e9E5ll0wf{V5^jXvcf zgr255T!hj@GDPF+8%-EZpdv29sgX=vM9@R}oQp`Rqeoms(RfO=gNP=XrgITPU(%ag z#L|8`$weHEquX4>(^zV250OB7X%H8Q^coqsXh+v+KNsz(md>fD15LrU5h#f!V@yCK z(|wBMB8BczS1wZN8yd$&8eODCTy&)0=_M{YQ9Z5WqBD)A9bBYS4PD}*3!S0}M~JTU zJ!No_LBCNB7v1O!8smtOpwZGbn#xgkT1@M>=s_FkM=pBORC05I$fO@BpNn2NefyJ( zEILc+&Jfvjgobm`o4%&!x#&Z?Xb%^C=`da9q95HQ!3Cl}DKvnK0rV>^a3KR}2GTit zhoeDsi@xPTN59ZrE(X)9)XEhihh|eZE{4#zG>D5_`kbb5F_b=`WnARZZraMlFnU0O z8^mxjkqZ}k+Cqg~OnHDduu9k)Ef^TudS(b?}6kOv_2j zg<%RUqk&vKMHMuPi>Wk;W^wT}ouoBfOrv?Umy78%m;U5p20cRpCSc7ow2*wbm`N{? zo{L$Sh?jCvOm}Dl7bUcm&T}yv)%}2rIkb|Ty&>ir=r%=g^(?(leYu!Nf6`bko})4< z;bK0$OUJlaK%40t7Yk`4UE#ujMdLOXrSum$`#>zB8Ptl4#k7LbxhSI_sE~^#^cgMT z;(0nj?{o1285Yq2u9nhUbcTy%^eH{yqMV+iP+y1&Dxs-d7-EzpgI>hkrddw! zP-_juOY|Of8qaCmP7bTC!!W!ywj?4f~Oc zx5{l+{CoQYtVmqZXzj%lbs1vK_Vh7F_b%_u=DTCEU_#(Hz{Aq{8ixY$pHYzr43Q9g4?fskng>%_$Y zDqxejsHA6@fs2o60^7#LL7KxZbMXl+WHzY~hiDe-mdfX!PiYmaPlGs2&#~Z+5J#wt zjpO1dEoP-$9HV#GZZ3{fIXlC}XS9V~<>Carz;1JKk~T1}P7t5dMmCd+FX(A@nu{;V z$bRMGD|(*Qaq%@RXMUae{Bw%tvAE7a-_QcqiHmP(8=K3;X`04Xb8&{Yv!-;2v$TmV z?gDX+ma)rRd`F+K0oclDzQ_7H0|KktO7<=nKj8U-iwoq!?sD-XZDp8(3H^oW6$k_U z4CUDkKYpPptWpc{E1nBn{D!B2i;EP&oO?iAqA>O;7r#?Jwe1OUnF?qO7gwm1z0buT zNX#n};!iv=TwKMI$;DrIy7$5l14CKNO zBA*Klgxe4Ze~4%<0wDex2GNQY(F8q2APCEcXpJ;Fa}fkFnTs~;MYf!aVA#CJMOz5N zIj%yWdK5r}LbNS}2!j~J1zwHFcML=X!Ky9>iN*41-wD#c+sCTf10srxXCPv@m^0-(8F`SFV z5aYNggP6d@68v!lP2%c#=E`=Agm{6y!uD~ol)c1`zW}j}En&xZK$Iic@fwH<2-{i+ zBRV|qjy5l)_&*54|1tdkH8|Q|*uoOX77Zh9VTl&86D4cpQSWLl;%@zqgsR z81G~4Eb)AZ%D3Y&?_=#PWIyX*5g)N6?iEe=a!azH0}yJAl`NT#^6~mHOKA?4`ua0d zm=~ri#CE7T+Jk68HN;kyW-%*}cLLJWBM(wOO*dt5n{}<0+VT_hjO7ngbnZbP>r!nnA@oLB@Gx0nOl!Mi8#!fIY0K&WG`0YYt{ zCd|odHEd&^Of9O5L2#scUVEEir1lF}!I%BSiJRcZ)V6mQH0&xTJQyE+&K?LAz^lp= z$CVl`yg=|KOOD)_$K$w-`6H7M-mp!9@T_ z4Huh{)tg-GfVjm)E7;U=u?OTf7lA?myTe6mp%u&EB1mwy^xQ_|LY*?&AVRf-!4PW2 zv=tkGXS^CNaKWp=pjNdX)Gr+IYWR%{ zUJbu7y>Qg9T8;<^wHhNK)M|`^P-`(-2x4k2#t3a#H4h#u1T(c3jVft$=gt89Ynpc`yjl9y-w&#_m_NK=x%~EIo|EeJo{R2soZ98-?jDM*1 z=y58tj9?JUz=gQVyewYHJhQycQy|oC)zYrq3r6J3y||6@zc&_nQMs4eg{{U0a!wUu zEj>1^IqH8U9pR-87~WCTd~_1xEbaQgcy&hQsmAFLYNorOS=FxB72*-9+#qCFb0l?x zP=~2jh*vX&|E=7U;k$$IO^`aM_;lyUZPc9cG}Od;2nm*)^#oBHu_J`qh`i3Yjg*PB z)O;9v35iTiwUV_{2ehmG*!UI6mGzLPbY4CW|CU1#n5K6C(j-GX$%B5sU(esP`hr+%FQFXk2ef;n5bgB(2q^R zF&B*!av3MYi=oyT-!WOLx|swai>enFmhEZ~s>q70VoGy4o`O)re}K7G?O%MVSB+aT zG!;axkAK*xV{$7ivJ9@4P|d_yCA|EOPb0iqXr61e6?o;VF}e#QEz{OEHp-s?hI|$R}P8nDv z^xxib-~?gu#*PCg2}^f8J8+gT8TKxCr*ow~xF#7OxKobciEBVF6wI5(3qCYW@TKPj z4PN*BsZ8#3WoMCgUD41y_ivxIIk6#bHO>8Ft2XVLH7acA=NV4BQxYBa^75 zwPJUASL}g{!=AKF%%nYH7VZwS=_9c>9TEG`7h*p$d?og$Z^Qv~UL1s5L>>Js4yHfF z9J(Rq;xch4)rooZNF0v)L_G;oJ~>Kbaius8w~6C%kvIW&h!b&rI0-k0lW}P{1^0!x zgRz;4TS9(8IE|uhr{h*|1}+4j!Cl}?dSp8bH-N>s{42q|-)sZ!{N~`gZ!T{7=HrrY z0p-{)q!N1rEwEpNyS~M=*uIRm+b^Mg_AlVdZz&zHUq)x_%jukb1)aAy(lz_#xc7UB zYV2R8Ci@jQYFtT@gNd9RR*{#(s}$()8ihHm#!cWG6yval(jDHyW#C%s?y!z}I~d+3 zox^(4J8YoQ4jXYfxQQk@yi0Q&Hj}|&3+@QF(h`Sl^rFLdToZmkD;##vTMoN$Q@EQp zIP9VA4*PIf_#y3c*iVNXKBCVZWIF3`fPQiK78isgbkpGwH8^}qlH*}=bv%Mg z;iDAdcpO)XpHZ~I@dPD1o}@00U*Kx-OX}|U73myL;db#G8tV8hjdDDL3&yiF-tinw zar_=vjOS^l;}7_x?gG8w_#?gI_!F&h{0%pb7wH|xOSH}LciQQAnLc#9LbBr@bky-r zI_Y?ozHn6Nl;bt}*0GAtJKn&>WDWi1SWAYhjyFkhyhS%0>*%iIZEA4DNwd>klAP|7 ztTQle&IhF-G$FWf7coy!Q z$l{&bu|($%EX_HYr8}pv4Chof&^e9eId@{iojbD;&gpE7b6579a|SDO*0SfFyR&7^ zh92x?=S;T6xfk2zoXz$)_huhD_hAQ}`>_ko{n;hwf$XyLAa>PR$F4aKW;dOOumZ* zJ?Ao+EpVB_N?o2}OI@b2*9#~I1cX^(?~g%#h={nvHXPgH3gPlTCAd zi#_AImMwH$$6jz<&z8AvU`E$>*lO2}>}}Ug>^;}bY^&=Q_JQkGw%>IdJLvj8JL0;X zedGE8`_Xj=t8v}Q?z!$_X4gGTaNEml-1aehw-1?<+sDks?I81V`-J(seahOn9cE!} zM_7W}Q3FeLJI1tbpRsJW6KsInNjAjobEbFuiWRzj%|^MMViVlHVUygx#m6$I*)wkE z*etgTY_8jn>;<=<*o$sIvsG@tu-DywWgFanW1HMAvh8k{*iN_K*>1PX>|?h-*de#S z*l{<7opQUzzH__IesQZ}f4Eh%t8O*ynw#M!yWv*H>fCO#hi-Qmx!+=zt5cA zA22uf2IlAfkOjCuVu9{Wtc|;wMZ1#_=Pn8f?vl{n-9|`vw-tK2+X-3j4nl8tN1>m) zlQ7iXS;%*H6$;$lgfZ^!!bEouVWGRHQ0DF}ta0}d-gfsDwz~TXl?Hc>aL_$KIOZNG zeD2;__}V>4_}#sYaLqkfc<3G?G`WWg%p*+j^avNcJt71@k4PcPBT9(zh!zq&VuX$! zvBF@Fcp=v#K^WnIjfO`%VS-0{VVXy>FxMkRSm2Q=lzOBIFMD(pR(W(1-tg!wyycND zyzS9N*y_<$FzoWk5cYa>6ZU&_7x2Gd5Dt6v6pniI62A0E62A7x7EXKg7QXlBBmCmg zPq^&SU%2WqP^k78B;4}Q33ogO3zBD!;Osd>@bb(Rd_D67jpr~S*mHmo;;9!RJoAM_ z&jO)?XQ7bdStMk5juf<>qlBKGqlNySV}*g9;|xNM=XgQyIYB7&oGgs;oFa_%d`fuA zbE+`S^J(E3&*{P}&l$pO&u4_io->7Ip0k7s&k|v^=Nw^;=Uic}=d;3k&w0W|&*y~q zJ?9HMJQoPNJq^NM&r)H(=OW=N&&9$y&obe>=Mv$9=kvlP&!xf@&vM~U&k8~DGzxW| zh8Kkf&*j1+&zA-AS|Q*QP{GE_B-nec65PFB6}-G&7ks={3mUICgjQZ_gmAAng?O*G zgmzwQh0b21<$A$A=p9w#Doe+NUIw{n8eJ7h$ybZ-Qa0_eEiX z_a$ML_hq5P`--r@`w!uH?>~j*-dBZ{-hT|v?`y(V@9V-|?<(OF?;FA~?;7ER zcdc;7`<8IdyG}UoeOvh5`>t@syI#2JeNVXM{Xn?w-5}I^KNKE#Hwum3j|9o5NwD)V z3ywZaboLQMHy=^-_pvdEt$b|7ARjxit&hDJ=Hnp7`8bM+K2Bn)kF(gx$5l-CaT7Cq z+{HdV9^zmhPjQ5gw^-=oBaZU%6{q<4iL-n(Vu??HIM1h*xY(z)xWp$&TLl4aYv5#hE`4m&6sCm&H|@SH#yfE5r?&mEu;- ztK$2b*TlV=*Twys)#3ro8{!eo8u7U1P4R2ZTjIBxwc=ULI`MnWdhu7y27~yA<{j}b z%|`LMW|LT}c~`8{Y!>fowutvNTg8W(ZKB}+zUb(`U3BsPK=kq7A!_`0i2?q*#n%3N z#0dX=VwC@fVyypuG1>osnCf3CcJ}{R%+y0X1SuK&{w2;HEet z;FdTopiW#Aa9dmza7TPE;I3F1P%oYexF=o;xG&xgcp%!gY7qTfJrv_wHHzI@JrZ+T zHHnj2nZ@T?k@Qk4CT(aXNc&oe(#ckm^iwMv>1HciNer};d;{&J=s*XlOQ54PD9}k7 z6X-0J1iDCuWr42Jn}Kf94*V6vkw6dWyFgFruRt%UA<$cLY3(BgxAv8iTKh>^tu>Oq zwZAmAb%11O-AY>7I#7DIb!$m(9VC6#x{dT(>tN|t>$Z{<6e9Trg-S6&VN%zia7h;w zA&m`+lx7D-N##M&(py0>($1h*>1a@#^nFmgK~jPeq=!L?l53lGQrkA|rQ|jpr0h0H zQhu9c>FG8pQfZr1$FYL~rHgISrMfm2}*;l5NOv$v;Fd#f9Wc z-9ko4IUxno_>e+rZb*@23>hh{3mGNt4jC3@w(18bV8?NuhJ3nW3|#($Ht6rJ-%e7}}QBhKA6#&|s27 z!{}saIGqZOq#r_~=$FuFx)O>%=nIXdrqDR@3QHjWuy)istUZN>B~g4>GIb40rGa5- zG(4;$jSuTY)5AK`ys$2`B&;jF7M4LiKedtbDKN7-m6%sy>9Kr{YYq*YDhYzOk@F5f#K9t&p=TchuFzSjwiq?iZP|t8j z$_jU)-r>&FH{68=hPzTuxI5*Ad(!Z59~u$vOGV*+G&)>EW5fMvLU=2h6dq`xDd9mh zH9VN6g}0^R@DQ349!~SaBWPiGB$b9oQ(1Tnm50aDitu=PBfK4L2yaiD!aLCB@FdzA zo=n@rQ)p*+8to1bpbrtxX~c6WJd|#Shv8N`g2aeO@`{LpjHcL#7|Mu&NoFlWyHL?!{M)swc$o`ZVIgq+U4x-FR9gT||OwUFRA!B4NnIebMn~{06D{>ee ziX2YIBK7oTWIkPu96^F1s(^x{3P~F^l5(O((U_>wG&5=pEsh#TE2AdR`lyMtKWY+v z9W|LQM@^yoQBTpssA=RGJ)OLwXW&EHnG_gZLWR+@X>{~lnixHwW<(pPB)XIqMK7YI z(Tm9xT}E$5FQNCNm(oYkczcdE()s8Y>9^?RWN3jd_EP#jK$#F>g_Q%vxfx>&Q9wZSsrVKy72+p?0wwsY~o8 z>K*$o<;HHN!r1p{Z0r`A8M}?1i~WFJi`_wQ#O|aGvAbz=>>k=3yO$2e?!)_k?1ywV zc0c_ZTS)B1fAI}I%NGPKA2_vaj!YJyOFq-lc#?aV=u{1tm9L>PjFwZ7Tq{Ru7 zXj#H!dL>~By`JzCy_qnTb{G<-(Ju+p=~BWoRGl!BY7%DA-GpL#kWfO-iF2rP;#|r| ze2)4iE+AdvLK>ck5tE2Ni%(ocOA^cI#l$7FHt~7-F!2RCmAI6u6U(VCv4S2Y8Y#8i zi!`a-ay+lli|tmBsohH2-p)kF+pVH=?Ovsy+Tm;J-`l-TzqebB&xY2J*#0eYX}^~I z+HauL_U}-a_8Upt{$0vyznKQMe~*T@-$G;BZ>5>-x6$JE@6*fex6}LWchbl0chTqV z_t5w4_tFpT_tC}nAJSj#_tTyBGM-9m)!`t;b~r>`JA6ugI~=B*4o7HmhodyJ!!ZLb z>~Nf(@9-JD)8Pai>hLA~)!{3;)8T7+*x?(pP5PExlTMR&(iwc$eU4I-?5InUJ#|ZR zpx#N2l%M2G6Oue=Qj!nNOTuwmk{>Nf(ojW`Kdnd#pfyQ>v_7ddy_*z7N0Qpmv81;2 zV^RqHmJ~+Ulfvmnk|BcbBt=qVQWUY|7!s3X$u>ET+>+xdI5~k5lM^W;xjkhiCsFU@ zWa^)sLIaaiX;5++4N2}uBa%DQ*yMD2D!B{INbX8AlQU>;vXhQ&mS|nF4Q((a+tTJ_d)kuhNFO9S(XnJ_`Xbqd&L+Fk`D8az zlHI8`*@NyTds0)f7YQleDyvnmVNfQJ0i9G&m)gCZ>eY zHIuyYI}z@b)ND#m?L*yC2T)e(AnKE^ zNzJEcQ%BINsRgtrwTM1S9Z4rrN73cf(Ilmfp^&t36q$xUCrFz>IcXEAIBhaLn}#pJ z)1IPDX;bNF+B70=zt)CEGh^h zn|va&DWkymzpq~B^)Pe3^VK=2zV*Acy?XWPHC6XEFHn`|MS8(Ao!;@xp!J@aROgvR z^`4h#x94Tr@0mjfJb$4>p1Jgm=N01*X(ISk)qUka;cjsS#6+Z>U-2$-9qivt(2v1 zqa1ZRbywdfMcqM~`T-TFJIOy({g5WAAJJ3lKj>+77d@-)rn%}T^qTrlTBz=!#p+&K zs(waw>OT5d-A_l<&*=yC0Nql*pjhuga(iJ1?){PqyoYIo_Xw4HkJ2>nF?!Ye6|MGu zP20TR&_3^RI^{h<*Sz1-@7_~%+xtD)w6hego%2(YcAi>m7s##sK~1Vtj1 zXpN;M25$qtRNyQs3W^LU-ZT{5p;!hv23!SSZtw@eS3r&f9{~QA!T$jMHsl2Gk>D#0 zUID%evI~3?crd(Rern&fAU`^Czj@~f}G>5!4B!9h;zXf(K%8^P-tir}Viab6$B@$@TWn@Wowh7`2UnH>9%tiN z1`qgZa5nt$h49hfYrs2zj}PJVY}tNT$qUMc;#FHaSqtL7+d5J;cn;(bZCsrU7j3z) zp%>H{$;-A*L5zc!T&e-*3s zUjwfLhxI<)4B?qga%lrNPxFpV%!dC6z7f0!cxeb<0A3H?6MP|aef*L51d2^i^oIOd zNP$~T6xs}aKe#1aJ`oUcgrradcwflg5MCahMel(ZfKLuLZ_Q%xE#UpYmxXZuZYZ`w zF#w9aA&RTv9bvgAh^^0m4L5H=tB8&;cM`;Q=4~TP{!oOxdNwI9ir^b6gFm9XE(}3D zEyBEj%@I6pas7`V-V(tkJu)1OVB;o&{{WmIBKYBv;i4fANAglcd=TTjD+A6G_*DxK zn_Vt4tjw^pQ4rP?{I$39!zqIg`QJzW5+r-t{bqsDcD+Yb3dLA<%`w9BcKN)PA^oD= zd=VTB z^_xw5aA7>jM@CL>>hkk^{XaxLO#4uH8ql>!e(+@QI_2$n5y^X<=It2fl#^=) z_;6=?BR9cmQ1V$IvqJa=r<|BCgKskOaG~#<__s2z|8tNy>%51V9xPG)=pe3sE>iZW z`{)2V_X=cJ6t7=042Y7I&PTE^N;b@z=c0J6#PW^5s;Jhw%+U(uIfOc2g}f@td}{Xl zquSD!Pz0d(BFdbM*TD~izYhLu2yY(UhK_(Q22YJnLo7p&XnF6KAlWNADv06cn5xTf zA})$HFLGkE98v#rD4vW?ZY(e>x|J@!g?M(f`8r+`{U{wp!z;mSqK7o*x3Fg?!aMj2 zi(#`Q8KPne=@{<)8YB~99t>i5P|Ez(AR}XN&K(Tn3`GsV;~^DIikV8^;1;Y0e>#Te zuna%O$SbQu@^XxMWzJYR5*xu|V$G4bCswW*o4`|JV`L>fH9N-2p=bc=9BYom1F`Zk z+XCJ%)_lxH#7>|S=+HLsQL$r;im-&o=Fv%v(BDD!#&&7sw`1i(v;#!MnF~>395`S9 zPW&Z@DB8!hr&FltBk+!KZ4t{bIBqU|havq3lEdR>1~I%s3+W8iI3Lh zPZ8(F%VB4bZ}2^k{k=mJ1LNcAEGqg8iXtNu7Z@2Yd%YiWX}la>=9A(x_yc~ea9)YW zc9Rhn#i!`fLBvbq<<&FT7%xZVOURq!a~SdU!^tdOKI=yypN}`6b(}xx`eTU063m8O zx@#J~#eg?W=&9%7=+T6Zx_lh*h=dNh%+bsQS?9NqUrsP@@$v*X7@orwpMqj#LTApa zhrna2H%xv&h~=_zY2ahgr7F} zb?~#`a{Q6FYV_zA$Tvbd6>F7Kgr-3*zHe-d@r(f z#A!e<Js@0uH^vho{RGkkb>>`%)`(j-3W4r}w0Eqk&E714Uby z8nWx)2kE^<7COzrnlakqfngpy5IQr4Te>5E0ptZ43q@z-XE#FsM;U#@14wWfoB6(F z2(0${Ls5~r$ubxP20+ekzfBB8o`H~y+w)zNAw5f84LcUL%Zi~Vb%Ra#QfBq0N$4oM z7xuz7^iu|(npFz3MXT;)I6Z3^tOIphTnuAY9LxkQy078MtY}zhTlE$$VNZJ+WcE1x z8GGH+jf#@9zopsWkAbIVAEBABqZ|(T!R%!;*SPu{*^h|@mPq&?!oxSaNGvt#EX-L! z%PryXLL}ZzUPP;nO0VP$7PXK|ptzM&AZk!x6y!Ob*3w$YrH~h3w>TL3biN@rz<9q5 zd|>BGh-J{aX6eFMkRDy-W5!@y*J<=2>K_k2wQGgU%=7;T?ACI49Eu;YiyI8qZgNq2 z0=x+}Q-k4wZbNAoZcRCO|87O}F)C#P*+Jd%gITb-Djz@gUtHcToc16;ht=K6XfN`! z7h_Ggk>>gzg}qD;PeBojJ_0h_SF5SFLX2@Lx*a7UiG z$n?l-5T}s;Mesg(wTNZ7(Os_dGeB;3m+utTq2tGv_-pD^!WCM%94=QE@#}(P3H^5IS zW{0jQ@~yZO{JJ8Sd7gjRER_Y8LD5V#3uLLXffe96s@Z^|_Ru@=Hn^sm%j(l=n$A~& zKdYJ}v``%bg2{(?vC7Yp47a_{`00DxWaUakXw zNqdyeL+0?EHk2+v=GkyY8${O(?(w>w>!BK@ipg zb=t`t_66#4(Dks!7b*qnR*PEvh!F?8==INL>{W&doP zMN;3z0HIRMAb8%njZcgGv}82qllsg+>{^lf@Lk#NF4mY1<}*L>H9L)4`uFDCfhts6 z63q4=>btUM-j#Nv2 zMBEp+ya8Q$AP~Dzw6uhaK;cG_(e7cRwj!b5tlW{ zgCh+#^1)V!_Jpnb4sgPUwrV9a_8q~7HZrdkZ3tV{SSQztwp3Lu+F=V_*aF@L(VE?s z53@ha5kyr-Sz?zN-R-C97EAv}qlp5I;v2u&sDN(=zC|Ol;!8x84H1QLvI(N9a85>W z($0|sNk6`sBBPTv>=H-p1xG{hPNkt7J!0u4DBsc>+uE$iv*0%+6brr-t`L0%4YS~@ z-=pwrqQ?+b4QJ`!>kp~^zg`HtjiIhld?i@J%`3TU6hcQ6ub?$ziNI(s6&THB_*c?@ z?Ku|ce9Okho^RrwZ|0siaL>2sJ#XxK;M{wnPec9|F-bIR--9|HPp}f2z5WQWr2sdhI$k;AEur%CyUu>~7?B6Ng zvV{*W>e;(sVBdy{UE)I#U0H%=CXaujtg?9gq{=}5PsD{*m1UC)3aNa;Xc<336_w*B zP98sTER~jzE~}Va8R+q;_^RQae~P`3`O$!}}B`7>&<5J79wL!bvm#7nYSXlgUTWQ#2BEw_eZ4H0_~7Y(F6 z>0ty9R`4etL=cyPAf6OO@aG_SP&|1Nya|$%hjC^%%kZ)D?Yr;$d^6+Hc=7q|Xawl> z#ZPus5`;)r)okh&2~v#+?(wt zV@iJR0*YhU>J7zjqmyJxv4D?#PpqXngo>A`i{6-(RCmCJ&znG=nQ*;lPpH7Y?IEhEG~RzlZhktbdE_2m<5PI_*y1W9ug3FoujhTK+bd0}pK{q%%QoFQH&@qc zmfLpPZriTd3fRodK@f>DM;;aTWz~))q>0j7#d0xO2afMYpeCD z)c;oWnMkbzKK{5Qo&evsI~$LkAP$NBV?V$`p;s$C{pB e8H(M^cwUp+^@i2b&7w*PHzxE+?!C&MCjSBGX|n$S delta 449 zcmX|7%_~Gv6hHUgH*Y?Cy!mRZrYsaQi;<$l%E#1<8E>SqnAqr{G@&qyhhilql0%AQ zfwC~eq{za;l&wENHj)Jk3pH6@=lQyebIM z24G@tRCmGQaa5O5572te{@Y+tT5wNFjuXG5I~nhc(6XR_01HvRYo*-zOCjEPTNJA; zUU`D};cXzg1H6ztZT+41Q{#cw`97MYtq)p`ht9JCc92$(==}Y #include @@ -440,25 +440,8 @@ void f_cdef() { // func name -- f_comma(); } -void f_docolon(); void f_revlookup(); -// C code must always call a colon word through f_cexecute() -void f_cexecute() { - cell oldW = W; - cell oldIP = IP; - cell retIP; - retIP.p = NULL; - W = TOP(); - DROP(1); - if (W.p->f == f_docolon) { - RPUSH(retIP); - } - W.p->f(); - W = oldW; - IP = oldIP; -} - #ifdef TRACE void f_traceon() { TRACING = 1; @@ -466,11 +449,8 @@ void f_traceon() { void f_traceoff() { TRACING = 0; } -#endif void f_colondispatch() { - cell codeptr; -#ifdef TRACE static int printing = 0; if (TRACING && !printing) { @@ -487,15 +467,11 @@ void f_colondispatch() { } printing = 0; } -#endif - codeptr = *W.p; - if (codeptr.f == f_docolon) { - RPUSH(IP); - IP.p = W.p + 1; - } else { - codeptr.f(); - } + W.p->f(); } +#else +#define f_colondispatch() W.p->f() +#endif void f_colonloop() { while (IP.p) { @@ -505,16 +481,6 @@ void f_colonloop() { } } -void f_docolon() { - IP.p = W.p + 1; - f_colonloop(); -} - -void f_dodeferred() { - W = *(W.p + 1); - f_colondispatch(); -} - // this version of f_execute can be run from a colon word void f_execute() { W = TOP(); @@ -522,6 +488,27 @@ void f_execute() { f_colondispatch(); } +// C code must always call a colon word through f_cexecute() +void f_cexecute() { + cell oldW = W; + cell oldIP = IP; + IP.p = NULL; + f_execute(); + f_colonloop(); + W = oldW; + IP = oldIP; +} + +void f_docolon() { + RPUSH(IP); + IP.p = W.p + 1; +} + +void f_dodeferred() { + W = *(W.p + 1); + f_colondispatch(); +} + void f_lit_() { PUSHC(*IP.p); IP.p++; diff --git a/testbed.c b/testbed.c index ebdc8b4..6228088 100755 --- a/testbed.c +++ b/testbed.c @@ -271,6 +271,7 @@ void do_repl() { } int main(int argc) { + cell tick, draw; if (argc > 1) { do_repl(); return 0; @@ -278,14 +279,16 @@ int main(int argc) { ser_init(SER_COM2, BAUD_19200, SER_8N1); game_init(); game_f_init(); + tick = f_lookupcp("tick"); + draw = f_lookupcp("draw"); while (!keyIsDown(K_ESC)) { kbd_debounce(); f_poll(); f_taskloop(); - f_runstring("tick"); + f_execcp(tick); f_taskloop(); - f_runstring("draw"); + f_execcp(draw); } return 0;