From 74171670b2ff2e41c4aadb04a69c26d9771c357e Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Mon, 4 Sep 2023 23:24:12 -0400 Subject: [PATCH] dictionary words, limited "target" compiler --- boot.jor | 5 +- defs.jrt | 4 +- lookup.jrt | 14 +++ minijort.c | 8 +- minijort.exe | Bin 80839 -> 80923 bytes minijort.h | 4 +- minijort.prj | Bin 3796 -> 3796 bytes tinyjort.com | Bin 1995 -> 3158 bytes tinyjort.jrt | 320 ++++++++++++++++++++++++++++++++++++++++----------- 9 files changed, 281 insertions(+), 74 deletions(-) create mode 100755 lookup.jrt diff --git a/boot.jor b/boot.jor index 71f07ee..a63697f 100755 --- a/boot.jor +++ b/boot.jor @@ -7,8 +7,7 @@ 13 const '\r' key const sp -128 const F_IMMEDIATE -0x100 const F_USERWORD +0x100 const F_IMMEDIATE : cr '\n' emit ; : bl sp emit ; @@ -60,7 +59,7 @@ key const sp ( image loading ) : noop ; -: defer word new-word $DODEFERRED , ' noop , ; +: defer new-word $DODEFERRED , ' noop , ; : redefine ( cp cpdeferred ) cell + ! ; : definition ( cpdeferred ) cell + @ ; diff --git a/defs.jrt b/defs.jrt index 9585aaa..f0737f0 100755 --- a/defs.jrt +++ b/defs.jrt @@ -27,8 +27,8 @@ : :noname here $DOCOLON , ] ; -: array word new-word $DOVAR , ; -: create word new-word $DOCREATE , 0 , ; +: array new-word $DOVAR , ; +: create new-word $DOCREATE , 0 , ; : finishcreate ( ipfirst -- ) ( set cell after codepointer to first instruction of does> ) diff --git a/lookup.jrt b/lookup.jrt new file mode 100755 index 0000000..470c6c1 --- /dev/null +++ b/lookup.jrt @@ -0,0 +1,14 @@ +:t entry= ( name len entry -- f ) + dup wordname swap wordlen t ] + ( fail ) [ patch!t swap patch!t ] drop drop 0 return + ( success ) [ patch!t ] drop drop 1 ; + +:t lookup ( name -- cp meta | name 0 ) + dup strlen over dictbucket + [ target @ ] @ dup . dup BZ_ [ patchpt ] + 3dup entry= BZ_ [ swap w>t ] + ( entry found ) >rot drop drop dup codepointer swap wordflags @ return + ( end of list ) [ patch!t ] drop drop 0 ; diff --git a/minijort.c b/minijort.c index 267c2a3..1900834 100755 --- a/minijort.c +++ b/minijort.c @@ -345,7 +345,7 @@ void f_bcomma() { DROP(1); } -void f_create() { // name -- +void f_create() { // word -- int namelen; HERE->p = LATEST; LATEST = HERE; @@ -357,6 +357,10 @@ void f_create() { // name -- DROP(1); } +void f_newword() { + f_word(); + f_create(); +} void f_cdef() { // func name -- f_create(); f_comma(); @@ -765,7 +769,7 @@ void f_init() { CDEF("word", f_word); CDEF("immediate", f_immediate); CDEF("execute", f_execute); - CDEF("new-word", f_create); + CDEF("new-word", f_newword); CDEF("here", f_here); CDEF("here!", f_here_set); CDEF("there", f_there); diff --git a/minijort.exe b/minijort.exe index ca92ae2396c5617bc79212e0181c8c4441755e9d..f50beb65d958834dd4ff0fea283a783cd1ee63f5 100755 GIT binary patch delta 12035 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 IS1k4aFXi?21^@s6 delta 11841 zcmcJVd3;P)`2U}CZZ;${ca|)Z%@U!ASYvGnLhMEmM(kT@)xNhnDq2g>*3i^W?MjQZ zb*r>m8miW+qH1rs#Fj)BTk`unGYS1Iuit;)o7Z#Zec#Wy=iKGom6b(aM+&`+UHTrR znWRu9A}T2vw%eF1#1)s6e~Z6eS7of%op9}Prb&qrv182IZnA4z$*!-i=x}T}xlXql zOB&(lUby3k&&hS8H)>xasf9Z1`u)teyasst*jgpq^%1U95<3Ql}s(x>$`3Q z)Dj6UgJHNh?V4nW7TaAb44;TYt{7uKan?28SW&)+a&0$;d95$e>$?6hHWuSu{%V5w z*40I=C2F~*tHa7)%yVS>HaKY4PrGib(PEq{z?3SSu2H5s)&I$LWcN)*ATj+!qAm(FZZxv?;yIteb zRp5ed>U*ARO$~NE2;DS&uBVr{drxa| zbRA8qz-<&J70;qc0q({>$#Lk>FS0ARXXaqW_xXRS8?n^T?6ytuHCbKJQ)&uF6AVV}Qe*KK95nR$TimV?_^FO>2~>GZ*J?xTJFp@a8Z`n|G6m)ksxj(_M`G(9p4O-g-U>AZfpQ1AFu^S0RaFCRMeGf(uB zPuvZx&svv|VAq$I)mv4lS9z+%qTYw7x9tfZ_!Q7uRJWo-)c5wn@EG;bQPSw}I(@F| z-N3pSz&iu0MQ(dg*7@Oe>Ao8duk-Y9*xkcDS59EveyOEZJV!7*kQs3d2-|qSRl;ZSu#SMPn?WK=*%?yfg zPHLF`D81eD3K-&^ahy^Pqul3#qip1AeO0?2{=lKdq3i1Cy0}PR`%LQwi&|P^SQD&X zr0p+n*YoZ>w5CwS_Z|AVBFzPL4JsZg8|vpG?JCp>sMb&y?mHd&S4G-zG`0^e3GNqE zTUDez2(as0pt?itftp{Wjf7eX<$ziXHKj=NSM2)xP(z>=LJcj_Y*1sM-hi48WiQg| zLZw2z4K)HPzDSFQY7ga{2-gFyW|7trE)H%6R033Rkv15r3e;?<+E89aTA0Yw zg+k>N>Pwz#B}Tjcg<3q+0I2;?qo5M7ZrGKbpbk3WQs8Q%S8Qt&xGbnPP@#p|3aDtPqfm9Bd<(TK zC^OVCs0gUX1zIjtNwz~f4pkoNdVyBa%dX#pItf*n?a)saXd!-f{UX$9sDGfoFVMPp z*`0b8+#hgf;IKfDps15~MI#f@nn@|IxoQ(>!gK(|jZo_qkiz?9ap<?}Bvi|Mtu2(ZBU}(%FSwX|%~8&-H--v< zY7J$}*G8jSRj4qiI#53O+H5EjR3ub5RNiB4IaKi-hgJou9MrYP+CivnsA#ByI}ZKC zW9>H71*n=(H=*`9A8Y>T@)x)|aHrw6Jk}aO?SYDeIsmowv6cq47OFYacBuCsYc8mT zP%WV{pvFAbra(=HN`#sNmHJrQ05t-t1Jrn^_K&r5P(7f!eva`s050ya7KY1G0$dMN z>jYH=YXMaoDg~+ul<~2a1QiP9fQp8Co~QMO@`dULWrn(wrwxXBtmCQ#RiZoeKl8NZ z73}(TsF6_jpbq6}Q*oO<>4bY5?jqc-JZ&i4_fV6dvY=MyX(w>@ZiSi-l?k;VPjf;o zgK|QxgPNMBZHAf+l?Js4YFM6j32H3VJg6B^-Se~sxMcK$S_<_BREs>PHpt(ucYs?7 z*AuQ*p7tSBBdFC-t)N2kv<6U7Q0t&#p}h079Z)LNCa5r|++6K9s28^#+Eyq(sH?f! zQ>eR8JD~D!JM`nZS`sck=b^rYa^8UZE?3)Ovg?Q8cEg>5+MKKX4YeEUTd4g|u3T*? z)EcORP}`tp!m4~|k_f?LThXc0{N`?9bYE_Qb z8aJISP$5uzpyuaj-Jq62ML?~Env&ywT6rI;8q`9lp*dQAv^56!$s>1mD6(~tWz{wZ zk1e?V*ufJ$>9$BWMw(Ui9IY!xV|`#RPqsR;ZIESEE=N1L&aPX5jXl|N$aX}QRrVw8 zG_nQ%;sWByX8-HZl96R~;*mCbBeoX!tlmTSdYwSJ57O+udZfLJ^giI_hwdk$&Yjoi zuAASkxMYf#{;jK7#Yk(_e;s&?$)?h$YfdzAjjs5OD0Ee+wA4Dj_Jm65hRu{7xslRS zeA3%_=>uHHD%F0iNzKw{Aj29YR}r3k^zhmfEUzl#@#wi;&Q-DUFcFkFr}73NMr6Jg z)kKK*GY40-2(c=2a +GL)rrYfSo>uQa=c$zy_GrGduT50e3(Bz=r`dHV~nuA0| zS8AEW8lg+y}|P^?nq)AvrOUAB@*i?Bd9j#O$cp zbSxNq1Qm$zlkEBF$v<2nnJZtp*r(5-#eYRE_K|c1QJ!d_4;n+CuAA+qsXY@HUpj<^ zd8tFO>wCK1N_x%NGjU<07cGqRA@|E;Z>&v9B8EVP-zOQdWOCwUZ#}aZFCJ=%yQhJ8 zEwH-@U1IQFOihh8(j*HWnroeIaL}E>)ARESsi}SJ4K6MCd$-rw?6cS0z6Ty;;8WvE zN+yNG&gU&s<_9Ia0^3&(Nl8TZi&xonLvkXjB)ht{PppMCI$Gh_qygR*O8cEAv?~1h zQOV@yXjwmdqx=o`zQOud0`znpXy3w=lE|ysBR0KJpTrcDeO>+?2CFHFdQ5TOzI`<> zY<}~|WY^3NJ*)otXQ|#3L`?$5@S39x3`)_ym z7~wiyyr8T@Gz zon;81ZFGylKv(DqgOQGrzXDKc4cQn>q)}Z4Gks3+3>I2U9T}|jH4SD6q;WKcA&CB@ z6%4_2&P-WMAvBb78Ekajb?J$H*geYk#%vU2Q%xU0Rk}$78KP+fea29Yw$d4f>U4l! zFuX>asfI701`VfP3^i#Or7_f^jkKE~hL+HEhT3$^_0iK%r%t2&Fk6rQpxF%d={7BA zXh1*HL57C(6WwNrqc6$79H0^Hqy`L)=^!~6n$T&Q!qAk?QW`@uxP8Y&?s8KFp~DsPKHtR4rMXCNmD7G;Vqg#MiXE(zR^`-c$?lQ z=Ln`T^eruA7)$@s4u)|woBn1PPyf(!h6%KaqRfDabe@tJCed0N!Z4ZU&=Q6zG>?uj zOr_&=pJ5uUAY7R!WIBCAfebU~BE>SiL*psl$@DILMEx0N(y!z;@6le`%*ILI(FulG z^d4Pec%MF{Jcik{o5HMsG&)1A8RpPZ>c;Q^U8bE3AJPV@7y+0|N6Eo3k1o(ihWWTM zOpI`%T!7dLg~Lm9oM9pLqaubyh~<$e79%b&d_)7NZAHMxhyx6tAX-*Jv4lF&?aBZb z!n+EJrHJYb%cwVXXZVzosaq5vgF2F|io=e<(1(Uqg<4MiX%oW=>Ol_}Rw7cOQLI9Y zV_1!NyBdl$i1!)RA~LI^SVz6+FvEI;`^xz_pvP+{Hc$$+tpV7G7{aiL2GJIP6BiJo zUs!EH++f&>c*?L1@p?@Z+Yu8PzCetqg<=O{F2hd5R)#MTxYiKPAEK%ZyAbUdb|a=T z>_Mb4WRini49>4nY-9Qc@fE|ji2V$E5$72+L_WiJi0^Bo*hgI`DwgM{E2S{(M~FHo z4$xo6%bhTjpF8O|bB zHbwCVBD6V*b2N||G5m=*!*Cu=mwz2_0nwD8y(9pGQYu_P3?s4q2Y54eqJ z%Al9Q9Y8#ryNCpa>@v6qaJFT2AJLxSK^Z&*bYb%dVQ0uGgIsj>51Ty1ZHC8XkdKsi z2h0^9{1^($pa@Wn%@afohNlcpre}y=49^jL7+#b?G2ml1C5V9?QINn8?Zm&LFZp%` zNSH_l1<;bg3($ta8<51{1L(xy3&5WDB0sbeN$sAd8_2;3z|s*hR+}s*1aG9N?sA z@h+WYRZYyL(+t&x7d>Wp4V?|z0H^^N!cY@1Y$Ko+U<5-9U?f9rkxHW(Vqtb{0@MNg z!B7|QCqq5J1%~>7e;Aw%K#!Oj0&*GR0LM228Ub!GGzQ#dXaab^&=m0L7C4*&@FJfH`3^5@=p~H6 zQFJ%`68eoKJ)HC41CUmiu%L~BoKnrPzzyGZmvf6=xK+A-kxPcLie!?N|5E0X92Z|lp>Uc$Vx zI`f4;6>*&fqP=H-P8A(IgK1pZ+P^gEFz!+L545>Im3^1syycYd2Uu4(bSynNG3TB-3sJ6%@J1ca-!RN?5amc>o@1H2ez~&h zw70pRxb9VH?d?iv1yTo9_9x>FADMlE+7UK-xh{;aFUNP06iJ6A) z#B9SpvE1;zSYtRKzA^kD_8EQ@hYbhCIm1ulyy1|zV)#YeG-Qd}h9ly+;i&L3{wjiu zzX_Z1xCl3%5VegbMIGZQQQvr4v^M@O5{+j?d*dG>*?3O8Wjrs&7%zy)#*1RQ@h>sU zcuCANUJ=eE#;YR3culM}UKcxzH^gq^P4TVqAMu^>U$NhKOJo^uixWm&oHpJOXN}q7 zobjHxY`ib78Xt<=#>?W4F-P3Te?`bO=7}f9d{JU75QN8PUeJ*OK zFGO9nSTs;c#;HQatA(PasyJmE)k}6(ePlP)S0<}|vX5F$_EpQv{%Qp|R1J{BRf8O* z8s#`um6KG9oT^&o3^h>BR)gdRYOtKA+T;Q?R4!7(CVx_^%fo67nWfg0zpBn!@{$@OZ>qKBEj3o^Y90AVtta!;1~Ol5 zD2voMS)w+QzNW^qys4=SFg2G()9cb~ikE?=7Ba%rQdTmxl2uHtWwfb{e9e?7>zmrj zW~O#B-jpPhOzmYiQwN!B>L`1fI>~;fE^?r$s~l{y%VDNuIl^h`DMy)l$Ju&rv7q?X`ozc8YDAJgXQO@A#%HEnA~9+A$OVHkUyJ7%HK_+EHM<$uym7UBp zrL&LuJvq=kOAay5mZQvR@*VRWxyU?ME-}xOpPJ{(9p(jcmpNU2XI?13H!qfl%^%An z=1=5r<|Xo+*(EQUm&)trW%8yuL*6wnm-o#prS=LF5<#QQm z*&stK8)cYflZ>=%menjxtBkR1m$8;FWIf9c+1&D_jJJFx6D+%A8_RCl&ay{# zwPecfmaklGPky(*)v*JN$$by?SXL)N$6lyTO7WE1Nx znPAmrYwI1^)_PZVvEGy2toLP#^?@8^eTaA@oz@)bvgXQ_)_l3aS|GPNtwnOD^@-eN zeJZo8&*Vkxb9vADLY7#Ir8%%fMhBA8Bv2@w0;Mt_P*KJQdMR@Py_JkWA7y)>uW}&J zPdOV{PPr9WUU?E&LGcgrS1JYtDD{I3O4}f#k{YBcV}eY|`$1-9X^=(P5@c2O1qCW6 zf`XK5LBWbMFDOLu3AQP=;7}zdI81379Ihk>M<~OCBb8~v6_xbhO3Iqx%F6EGD$3#D zDCK-`RpoAQwDKajnxckOSE52*QyPWTP&$OvRQiR~QpSeFD6>OqE6YM+m8~Illmvr6}vdoV}II zus%vwm_xZ3)>pX~ma3G5^;68@{gvqO0ZNnbfl8eK_Qz)!*VjGm=_ zg|tvFus8f_sZvU*-wEFv%+CqC;PI~?Aj0=o3pv1iKRg8Ax744N4J?$3nF>h!iA2BB z#4Rk)9~=OG2Yx`Qe*!-+V|9qwVjBd-A8{rs)lqt;6-o>Z&ggFw!L}htSBCxVKj~bh zHVw^K#A)2GDH`djUNuUW#T%(t91YJn!08c4b7HO+e>Wp=G9p5eeiLc_NRaCNYUy;O-^%F1>Cs5XA^ppL()mcgoiUTsW02-A19f~}Ej`eu zDUHq8$?0)O$0NPkhaX=&(;1%_8lQ2Q(-V+x1uK1D?Uow8F*GqFAPnhANVi40ukWkv zPVqo?go*REX&4ftPs*;Ss3p z%-9(r28!7k0g)ofmWB@Iqh4eGR~-!UuSRn+-i}27A0WL5>G}RqFPq%qUy(k{SdFxp zoAFH~TAr6tyP~M=ZbDfe5nd@EPzfQw+Zfd8WTjmGE>f++X0XnfSffGd(wXPMC9;EiqLs)A%ax z;qx%n%zR1lOiAW2`V{S4#B3+?s|_1su1gshCH!S>l=lv$t--`&k0Gs(T8wcn;0Km z;kW(ApRjnwSq}VZr^PcSxur`M&z9wZuUKAfS)Rpn*5<<(SfaVAdkV99IxfT<{z1Rg z;zNqnv-MA4+FJSZhiB?$9Y8B_zVMg76l-s{ba1)TI>C>BUm$i_$NH_oZs)0DL^E28 zV^#vL8WBh9OT8n)NS}jwwqL}nJvTDKvoZWh@U4v6RfWw)VG2GK@-5W!$FG9?57BG) z4y-E53o#($&1hUD2V@+J7DvPfdzavYm=H_$hQ22HiM{XD5S^s68^5FSn>TewOSlVT zWqYveDR6XpiAZb?va@=#o0yg1M1x92nzv*s`@6w`5i;FVp>Yw{5nA9MDTy}M$> N5xIAE9kJa1e*tu~5;Xt- diff --git a/minijort.h b/minijort.h index 924da7d..fec5f70 100755 --- a/minijort.h +++ b/minijort.h @@ -34,8 +34,8 @@ extern cell *rstack; extern cell *stack; extern FILE *IN_FILE; extern FILE *OUT_FILE; -#define F_NAMELEN_MASK 0x7f -#define F_IMMEDIATE 0x80 +#define F_NAMELEN_MASK 0xff +#define F_IMMEDIATE 0x100 #define CELL_OFFSET(cp, b) ((cell*)(((char *)(cp)) + b)) #define TOP() (*(stack - 1)) diff --git a/minijort.prj b/minijort.prj index 212ee0d0064f0d8ff27ef2f7712bd37c084e3427..2e5e549c2aa6f1e91104a0075dd1d4343dd79a2f 100755 GIT binary patch delta 146 zcmca2dqsAGIvaCPtIB3AwkS4M9)`^=Dw8{TGI;}9Rl>QY85mwIVqj>S{GTUPxs72V zgC*lGhRX~e8F(2r8UO#6Wz1rb140G{9tI8u>sFP??Y!#DCO{K5@=D4uFt9LiGepl+ s4CiD3iiNW delta 149 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 literal 1995 zcmY+Fe@s(dOWnvj5i^BxQz;d$(B(%oev5eFCd7|}QgAOF&J}Q& zcXKdKltbIXe#};`wJ4a*+aJv+%cU`6Gh2(*bR@dGvbELR?i`NO^S%eD{<%BP=lwp< z^FGh}KJSf=tI6{F%6G~!Qq$TSO})!RdmZt5cME9-0hXFyUXxdaxRTTo(9rajmz0-5C9w`d zL4nt6-B=3C4BZSF0XRWQONS1Ezy}B9y+e}s68~;O| zgb5_EIY(pL0Cv`8Dl*wwlg`vTsV5y2#zPJv(`00s zw;cGZ1afX`qX8+h>Q7tpo|8an5_lWO%ONUpdoC!J{XR<--QOr<8W;GH3_2uF2HC{} z2GP@(wy3L;F`&Q$0xya$^GXbONA_8TI3v!5;sqNpF5_$zg0ss*n8wJ3Z{?xF1&4fr z0S$47e?g&eyuy*Vvv;{}sQ!UfzhD(U5R0#3MQI0gL&w3oqTwOS!ssT7G9wL>I0Y0A zTzFcFQX~(PmnbNv(5xr6{gDi8aqhcGDd8?V6i^++ok|IJDiy5D?9%sR9)L|0H2iLC zZx1%3r~`9N5J()MF4`foyrO{Ithcx0vq7N+3*b@{rH?2hG*uZUjS7&>!Y-2ERX#y- zgSXs4wekcZz~L?l;`nHG8*MmSca=!Cd$MlIwRpyuB-p73fU-!=8M@3*VA0L(!7d%v zu!zS$ zNGP|`e&&?S^?qD^n8AwXV4y45uBYoAZ6@4e5ni9zT?YeMz;SYu{m39;N%^wg3lFIg zZOXMY1()#sZVR-wwe#x%uuA1-I@fiRRCPvj;f@N_B$}WOlQ%K%aU3PSI!?Bz@c_rM zWr0vf6IQ3IR;<3}GTVdPeZl>kdvcKNRR=GAHZUEY2XpQ0mhk-cBYEMu%)aVen)Vf+$)_dE1VYJ@PQWeqd z&3MVo-cB7m=AwU#jvdxwjGyiZWpuxmM3eAMT%iHUK+R*Cu1%1&5W{Y+7Q@$*wGEq} kj=vvh&8nqYS`U3A>tk)DPl3c^S1lG)zFdF_aQ-g;0k*n|=Kufz diff --git a/tinyjort.jrt b/tinyjort.jrt index 9fae020..ef7c5e2 100755 --- a/tinyjort.jrt +++ b/tinyjort.jrt @@ -28,8 +28,9 @@ JMP 9 @> bits. Entry: LINK - pointer to next word in the dictionary - FLAGS - byte - LENGTH - byte + META - word, made up of: + LENGTH - byte + FLAGS - byte NAME - bytes ending in \0 CODE POINTER - pointer to machine code routine ) @@ -38,26 +39,30 @@ L: DICTIONARY 0 w>t 0 w>t 0 w>t 0 w>t 0 w>t 0 w>t 0 w>t 0 w>t L: LATEST 0 w>t +0x0f const BUCKETMASK + : savelabel ( word -- ) dup type s" : " type here swap begin dup b@ dup while b, 1 + repeat b, drop lastlabel ! ; -: DICTLIST ( word -- tptr ) b@ 0x0f & cells [ L@ DICTIONARY lit ] + ; +: DICTLIST ( word -- tptr ) b@ BUCKETMASK & cells [ L@ DICTIONARY lit ] + ; : strlen ( word -- len ) 0 swap begin dup b@ while swap 1 + swap 1 + repeat drop ; : str>t ( word -- ) begin dup b@ dup while >t 1 + repeat >t drop ; -: link>t ( tptr-head -- ) dup @t swap target @ swap !t w>t ; -: DEF word dup savelabel dup DICTLIST link>t 0 >t dup strlen >t str>t +: patch!t ( tptr -- ) target @ swap !t ; +: link>t ( tptr-head -- ) dup @t swap patch!t w>t ; +: DEF word dup savelabel dup DICTLIST link>t dup strlen w>t str>t target @ cell + .hex cr ; : WORD= ( word len tptr -- f ) - 3 + dup b@t t ; @@ -71,6 +76,7 @@ L: $$CONST : CONST DEF [ L@ $$CONST lit ] w>t w>t ; +L@ $$CONST CONST $DOCONST L@ DICTIONARY CONST dictionary L@ LATEST CONST &latest @@ -99,22 +105,35 @@ L@ $$VAR CONST $DOVAR MOV SI @[ BP] NEXT -( some helpers for making manually defining colon words slightly less ugly ) -: '>t t' w>t ; -: :t DEF [ t& $DOCOLON lit ] w>t ; - :CP $DODEFERRED INC BX INC BX MOV BX @[ BX] JMP @[ BX] -: DEFERRED DEF [ t& $DODEFERRED lit ] w>t '>t ; - :ASM LIT_ LODSW PUSH AX NEXT +( some helpers for making manually defining colon words less ugly ) +: '>t t' w>t ; + +: stch? ( str -- f ) ' @ , key lit ' = , ; immediate +( DOES NOT SUPPORT ARBITRARY IMMEDIATE WORDS. + Supports [], comments, ; and numeric literals ONLY. + You must use [ for anything fancy. ) +: :t DEF [ t& $DOCOLON lit ] w>t ] + begin word dup stch? ; not while + state if dup stch? [ if drop [ ' [ , ] else + dup stch? ( if drop [ ' ( , ] else + dup tlookup dup if w>t drop else drop + number if [ t' LIT_ lit ] w>t w>t else + type s" ?" type cr then then then then else + compileword then + repeat drop [ t' return lit ] w>t [ ' [ , ] ; + +: DEFERRED DEF [ t& $DODEFERRED lit ] w>t '>t ; + :ASM INLINEDATA_ LODSW PUSH SI @@ -143,6 +162,27 @@ DEF GOTO_ L@ GOTO_IMPL w>t PUSH AX NEXT +:ASM 2dup + POP AX + POP BX + PUSH BX + PUSH AX + PUSH BX + PUSH AX + NEXT + +:ASM 3dup + POP AX + POP BX + POP CX + PUSH CX + PUSH BX + PUSH AX + PUSH CX + PUSH BX + PUSH AX + NEXT + :ASM swap POP AX POP BX @@ -151,11 +191,14 @@ DEF GOTO_ L@ GOTO_IMPL w>t NEXT :ASM over - POP AX - POP BX - POP BX - POP AX + ( this costs 1 extra byte but should save 20 clock cycles ) + MOV BX SP + PUSH @[ 4 @+ SS: BX] +( POP AX POP BX + PUSH BX + PUSH AX + PUSH BX ) NEXT :ASM t PUSH CX NEXT +:ASM >rot + POP AX + POP BX + POP CX + PUSH AX + PUSH CX + PUSH BX + NEXT + :ASM terminate MOV AH 0x4c # - MOV AL 0 # ( todo: pop ) + MOV AL 0 # ( todo: pop? ) INT 0x21 # :ASM execute @@ -248,9 +300,9 @@ L: RETFALSE JZ RETFALSE JMP RETTRUE -:t != '>t = '>t not '>t return -:t <= '>t > '>t not '>t return -:t >= '>t < '>t not '>t return +:t != = not ; +:t <= > not ; +:t >= < not ; dbg" bitwise" :ASM & @@ -281,7 +333,7 @@ dbg" bitwise" PUSH AX NEXT -:ASM >> +:ASM >> ( val count ) POP CX POP AX SHR AX CL @@ -291,8 +343,7 @@ dbg" bitwise" dbg" mem" :ASM @ POP BX - MOV AX @[ BX] - PUSH AX + PUSH @[ BX] NEXT :ASM b@ @@ -311,8 +362,7 @@ dbg" mem" :ASM @far POP ES POP BX - MOV AX @[ ES: BX] - PUSH AX + PUSH @[ ES: BX] NEXT :ASM b@far @@ -323,8 +373,8 @@ dbg" mem" NEXT :ASM ! - POP BX POP AX - MOV @[ BX] AX + POP BX + POP @[ BX] NEXT :ASM b! @@ -333,8 +383,8 @@ dbg" mem" NEXT :ASM !far - POP ES POP BX POP AX - MOV @[ ES: BX] AX + POP ES POP BX + POP @[ ES: BX] NEXT :ASM b!far @@ -344,20 +394,17 @@ dbg" mem" dbg" return stack" :ASM >r - POP AX - MOV @[ BP] AX + POP @[ BP] INC BP INC BP NEXT :ASM t &here '>t @ '>t return -:t here! '>t &here '>t ! '>t return +:t here &here @ ; +:t here! &here ! ; 0xffff CONST there -:t latest '>t &latest '>t @ '>t return -:t latest! '>t &latest '>t ! '>t return +:t latest &latest @ ; +:t latest! &latest ! ; 0 VAR, lastseg -:t segalloc '>t lastseg '>t @ '>t LIT_ 4096 w>t '>t + - '>t dup '>t lastseg '>t ! '>t return +:t segalloc lastseg @ 4096 + dup lastseg ! ; 2 CONST cell -:t allot '>t here '>t + '>t here! '>t return -:t , '>t here '>t ! '>t cell '>t allot '>t return -:t b, '>t here '>t b! '>t LIT_ 1 w>t '>t allot '>t return +:t cells cell * ; +:t allot here + here! ; +:t , here ! cell allot ; +:t b, here b! 1 allot ; dbg" i/o" :ASM overwrite @@ -450,12 +497,11 @@ dbg" i/o" -1 CONST EOF 0 VAR, fbuffer -:t fgetc '>t LIT_ 1 w>t '>t fbuffer '>t t fread - '>t fbuffer '>t ub@ - '>t fcount '>t @ '>t not '>t BZ_ target @ 3 cells + w>t - '>t drop '>t EOF '>t return -:t fputc '>t swap '>t fbuffer '>t b! - '>t LIT_ 1 w>t '>t fbuffer '>t t fwrite '>t return +: skip>t 1 + cells target @ + w>t ; +:t fgetc ( fp -- c ) + 1 fbuffer t ] drop EOF ; +:t fputc ( c fp -- ) swap fbuffer b! 1 fbuffer t infile '>t @ '>t dup '>t BZ_ target @ 4 cells + w>t - '>t drop '>t console-key '>t return - '>t fgetc '>t return +:t in-key infile @ dup BZ_ [ 3 skip>t ] drop console-key return fgetc ; DEFERRED key in-key -dbg" number" +dbg" parsing" L: BASE 10 w>t L: ISNEG? 0 >t :ASM number ( str -- num 1 | str 0 ) ( AX - current number @@ -595,17 +639,163 @@ L: write-next-digit PUSH t& &here @+ NEXT -:t type target @ '>t dup '>t b@ '>t dup '>t BZ_ target @ 7 cells + w>t - '>t emit '>t LIT_ 1 w>t '>t + '>t GOTO_ w>t '>t drop '>t drop '>t return -:t . '>t num>str '>t type '>t LIT_ key w>t '>t emit '>t return +:t type [ target @ ] + dup b@ dup BZ_ [ 6 skip>t ] + emit 1 + GOTO_ [ w>t ] + drop drop ; +:t . num>str type LIT_ [ key w>t ] emit ; -dbg" test" -( test program ) -ARRAY hex65 key - >t key 6 >t key 5 >t 0 >t -L: test-word '>t hex65 '>t number '>t . '>t . '>t terminate +:ASM whitespace? + POP AX + CMP AX key # + JZ 0 @> + CMP AX 13 # ( newline ) + JZ 1 @> + CMP AX 10 # ( linefeed ) + JZ 2 @> + CMP AX 9 # ( tab ) + JNZ 3 @> +0 <: 1 <: 2 <: + PUSH TRUE + NEXT +3 <: + PUSH FALSE + NEXT + +:ASM eoi? ( end of input ) + POP AX + CMP AX 0 # ( null ) + JZ 0 @> + CMP AX -1 # ( EOF ) + JNZ 1 @> +0 <: + PUSH TRUE + NEXT +1 <: + PUSH FALSE + NEXT + +:t word, + ( consume leading whitespace ) + 0 [ target @ ] drop key dup whitespace? not BZ_ [ w>t ] + ( consume non-whitespace / eoi characters ) + [ target @ ] dup whitespace? over eoi? or + ( if whitespace or eoi, end ) BZ_ [ 5 skip>t ] drop 0 b, return + ( otherwise, write byte and continue ) b, key GOTO_ [ w>t ] ; + +:t word here word, dup here! ; + +dbg" compiler" +:t wordflags cell + ; +:t wordname 2 cells + ; +:t wordlen wordflags ub@ ; +:t codepointer dup wordname swap wordlen + ( trailing null ) 1 + ; +:t dictbucket ( word -- p ) ub@ LIT_ [ BUCKETMASK w>t ] & cells dictionary + ; +:t new-word + ( set latest ) here latest! + ( create entry ) 0 dup , , + ( save word + calc length ) here word, here swap - + ( save length ) latest wordflags ! + ( find bucket ) latest wordname dictbucket + ( link to prev ) dup @ latest ! + ( link bucket to new ) latest swap ! ; +:t 2inc ( x y -- x+1 y+1 ) 1 + swap 1 + swap ; +:t strlen ( name -- len ) + 0 swap [ target @ ] dup b@ BZ_ [ 3 skip>t ] + 2inc GOTO_ [ w>t ] drop ; + +: patchpt target @ 0 w>t ; + +:ASM dict-lookup ( name dict -- cp meta | name 0 ) + POP BX ( dictionary ) + POP DI ( name ) + ( strlen - in DI: str, out CX: len, clobbers AX ) + XOR CX CX DEC CX ( start CX at -1 so we search until we find the 0 ) + XOR AX AX ( search for 0 ) + REPNZ SCASB + NEG CX DEC CX + SUB DI CX ( restore DI ) + DEC CX ( ignore trailing zero ) + + ( keeping CX + DI, find the next entry pointer and store in BX ) + MOV AL @[ DI] + AND AL BUCKETMASK # + SHL AX 1 # + ADD BX AX + + ( save SI ) + MOV DX SI + +L: check-next-entry + MOV BX @[ BX] + CMP BX 0 # + JZ 0 @> + CMP CL @[ 2 @+ BX] + JNZ check-next-entry + + ( we have a matching length; compare the string ) + PUSH CX + PUSH DI + MOV SI BX + ADD SI 4 # + REPZ CMPSB + POP DI + POP CX + JNZ check-next-entry + + ( we have a matching word! return success ) + MOV AX @[ 2 @+ BX] ( read flag word ) + ADD BX CX ( strlen ) + ADD BX 5 # ( header + null byte ) + PUSH BX + PUSH AX + MOV SI DX ( restore SI ) + NEXT + +0 <: ( failure; we've hit a null pointer in our linked list ) + PUSH DI ( push word pointer back onto the stack ) + PUSH FALSE + MOV SI DX ( restore SI ) + NEXT + +:t lookup dictionary dict-lookup ; + +0x100 CONST F_IMMEDIATE +:t immediate latest wordflags dup @ F_IMMEDIATE | swap ! ; +: IMMEDIATE [ L@ LATEST lit ] @t cell + dup @t 0x100 | swap !t ; + +0 VAR, &state +:t state &state @ ; +:t ] 1 &state ! ; +:t [ 0 &state ! ; IMMEDIATE +:t : new-word $DOCOLON , ] ; +:t ; LIT_ return , [ '>t [ ] ; IMMEDIATE +:t const new-word $DOCONST , , ; +:t var new-word $DOVAR , 0 , ; +:t interpretword ( cp meta -- ) F_IMMEDIATE & state not or + BZ_ [ patchpt ] execute return [ patch!t ] , ; +:t interpretnumber ( n -- n? ) state BZ_ [ patchpt ] LIT_ , , [ patch!t ] ; +:t ?err ( word -- ) type LIT_ [ key ? w>t ] emit 13 emit ; +DEFERRED err ?err +:t compileword ( word -- ) + lookup dup BZ_ [ patchpt ] interpretword return [ patch!t ] + drop number BZ_ [ patchpt ] interpretnumber return [ patch!t ] + err ; +:t interpreter + [ target @ ] word dup b@ BZ_ [ patchpt ] compileword GOTO_ [ swap w>t ] + [ patch!t ] drop ; + +dbg" boot stub" +:ASM debug NEXT +: t" begin key dup [ key " lit ] != while >t repeat drop 0 >t ; +ARRAY input t" +" +t& input VAR, inptr +:t keyinput inptr @ b@ dup BZ_ [ patchpt ] inptr @ 1 + inptr ! [ patch!t ] ; +t' keyinput t& key !t +:t tinyjort 1 2 word lookup drop execute . terminate ; 9 <: ( actual entry point ) - LEA SI test-word + MOV SI t& tinyjort # PUSH CS POP AX ADD AX 4096 #