From ad0f3fbf6c778a582c5a0059aaf62a0c861e1f37 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Tue, 5 Mar 2019 17:35:50 -0500 Subject: [PATCH] Text animations, save memory to .jim files post-load to speed startup --- boot.img | Bin 0 -> 7923 bytes boot.jim | Bin 0 -> 923 bytes boot.jor | 17 +++++++- defs.jim | Bin 0 -> 1276 bytes defs.jor | 16 ++++--- game.exe | Bin 113325 -> 117074 bytes game.img | Bin 0 -> 9603 bytes game.jim | Bin 0 -> 5381 bytes game.jor | 81 ++++++++++++++++++++++++---------- game.prj | Bin 5281 -> 5316 bytes jorth.c | 128 ++++++++++++++++++++++++++++++++++++++++++++---------- jorth.img | Bin 0 -> 2120 bytes testbed.c | 8 ++++ 13 files changed, 197 insertions(+), 53 deletions(-) create mode 100755 boot.img create mode 100755 boot.jim create mode 100755 defs.jim create mode 100755 game.img create mode 100755 game.jim create mode 100755 jorth.img diff --git a/boot.img b/boot.img new file mode 100755 index 0000000000000000000000000000000000000000..2dc664a8e392e758321f9c173fd319770d6ef227 GIT binary patch literal 7923 zcmeHLYitzP75;YS&g{&r*Slud_BQHc?K~U;wjo84AhwHNP^Vxj$B>F7*yG*tdg9%g z&FriVt`lNPsTvXC2r9XOMwLQHAA%AkX`2R>Qk7CftCS?G%BpCpl%j}Ij6*6alZc)> z>l#)3YgH*fb}j3k_c`~>Irko2K-0dYfquPtXTXlPFIf_=kGI>|ZH}25a^uTau3Q#x zvz@eVCF5O|n{GgNKAnzdZPRiMC$8smX3EMKmK)SM%n>tb#0|%>ouJk_VA)PaCsD^v zIeI2e;u+J@UDLLL+SB1G--mJ*vwz2xSH6iWKAgXCVRjr7V`1zblOf=Ztzm4LnY#*H zn=Jn0yN}_)8@R%wz4iCoN00e_v07=>u+P7j-OB&}Q%)#Z<$v)qfrqiKVyDlCN6}KT z+b3e!*oJqseLjst^*PrutrQa4^FGBR44P>J&uc&OF&G)s#Sa2MCvenulK5QUv`>YZ z$rwpfcMWW=c*p05vDHZA341nlo=jNAXuT(Fm485bLxyAEYobq(Jg^3nVwoT#P3k!p zFNrZ?)zw<74r4TJOPPc7oPMY-Fcty%RgwSwTSaGJI8;CNmbPPATsZs~JbxC1TYy zyq=i0gX{7`Wa%!f@b}X?j(-0Tty{3$pXHXDaKXQofR+~g)ITBm z(b(efEwMNXY1u*sp+yr_Oe>P`#(rurEHO%Sy(2Ueq6 z`xKMlc*=EJEr&hr>S9wwCx&aJ)375pS^Ren#)!;eJW#fa zlT!wz>7}w~IhkObD*KKkW3U*^XxaC;jAQ6YEDF9R1*zHfl);Y#uL&C~Pe|oOT75q2 z+DRVe*2)4!owoI)CyYN;UL-uHj~GRKylRdD%@~;sl?={BHCe*rd6WCDj>(KP^GOt{ z?;wzWbo`~dQKpUMbCj+m!m(Ad;xVYRv)B~-A~Bu3W${z%SK>o5xpMWyaLybvuqS57 z8kNxk;Xo`emlta(pEI0#PwM-zU8HqK$A(_U7bQQyR3UOj59J0y$r+fvrg3tl_qM=WFXuE$0%t1n@ z*byd3nlMFIk{}gWkAEkOG*u919VAwfp$T*1tD+`M%f~6eVG?qOs08g$kx^ii{;y-e zNSQ@ifxSTZ=n%gEZuRkse;0K?*3jJrFLNRfg8L}2H%V1b>7J=#3_P&QM9o{S$@fqU znp2rFfxC%vz;{iKibq(jQed|!BGPo-aJebk0hen~{4lMwX&K`l{mg%Cx{bKwMK*E2 z?Jux?vQbyd6I}~O*@0XwF&c##%X0*tfJICsZb~I(IiV}fOosup=JI-u~E1vY#|F*l`Fo3>>mmb`iv5~ zDLa4q6r-qA@1u=gQ^Gg-d286RM|t{Z*%@}9`UT9g`)McDD!M7DGFiX|IJ9Yl#v_mE< zr@trFYF5omR$%+)1?I;B{xuH!ULakr{hC_oX?uNLZw}r(1E>ka_a!Py?QN+_`loa+ zB~;Oh2`#X0$l24Qd%F;kt8YoKxWoe)+4V0yUvNTYZ2FlVv`Cq?K0+|nP9Vj=JUMNd1l%*HS b(hFtjg|hTQS$d%?y-=23DD~tg>xJ@PZsnSZ literal 0 HcmV?d00001 diff --git a/boot.jim b/boot.jim new file mode 100755 index 0000000000000000000000000000000000000000..815b51e47a23546039d70eea28d759ba3b347409 GIT binary patch literal 923 zcmY*XPe>GD6o31DZ)U!47BeVUhz_!cHX}14yc9&1fsh@-ZkDY&yN=GzEVHu+VPaC< z0>Od}yy>-tsBS{1lJJlybC`p-4k6Jd62^MzeKVrST;}(F@ArFuzPGMlFzc|uS9F9? z%Won)3Hved6=(rrFsPL2w*%UYG~5~P z9~kJn-G6hik7BdXLG-9ko@lJ5LcB_F#36V#hPRA4unPohSVyLrtcCzg3-P}394x0| z#nduU31PA(|Hw@i>7S{=NlFUFEtirKBE)&)1&mllJBfw3M0jf4b`qoGH9iNz)3JW-*wDSiPA4?6Z;cQilSeMA7M%rO%t0kfL^rGBg19G^@r^Lq zVk+WK#6J7M)r$7n11kSsq&3Ah;#gW!iZ8+;#WxZ046SZPv``~~<(GXcnDYEF^1W;n zcsJW-kH}$H{7Eh2U!jIu6Rk(NZnZRGsrOW#ZL)_3-4iE|_^LbUdQ)osJGh2D@&@eS zHJYSdreV}8mFX!C$~|Qf6&jLT)RrR~{1u(RgiK3?F3J$Elj5+&xa0 r> interpreter r< r< swap-input ; : loadstring ' key-string load-input drop drop ; -: loadfile fdeactivate ' key-file load-input drop close ; + +: loadimage-if-uptodate ( filename -- b ) + dup image-uptodate if imagefilename open loadimage close else drop 0 then ; + +: loadjor ( filename -- ) + open fdeactivate ' key-file load-input drop factivate close ; + +: loadfile ( filename -- ) + ( active file is preserved for the currently-loading file, but the + new file is always loaded with no active files ) + fdeactivate swap + dup loadimage-if-uptodate not if + dup here swap loadjor + swap imagefilename overwrite saveimage close + else drop then factivate ; diff --git a/defs.jim b/defs.jim new file mode 100755 index 0000000000000000000000000000000000000000..8ad65f134175ac2d070dfb7d7611921f082d918e GIT binary patch literal 1276 zcmY*Z&ubi29Dn=XcV^f5@m8?1l6pv~C|E^^ziQPgT1pg2E)jZkIy+0oW_QBOBuyn2 zty{1sK|M@BFLphsF%%N0pr!wSP)V7?7Q}-KLOpB+^{_p}&v#}wDmmoM=hydrzwf>E ztw-ux;!k?iGDVU$qm@)d^^8)Qr5%-%5BO}DF1D5dFBqC$G450rjG<~^mD4*GiQ{p^ z9)k?ZX#>DabA{CdH9)}E0G=!XP21KqePK1A`yTL96L>-#rIK#Y2+mzgikTM?q>+3; zjZpG{dK1K7@OGkzYviQuia3u|Mtgg!AP?G7vj(Me=yI{TE^}IUJ`k;ld&)?|{B1R(zT&89d}VZ3O5++Z=5qSdd0&Kumf4(cI$hBT z*2>%0C=8|T5_WS7wqX(VSRww^F~qqrSZX5RD0X_U+ZBQ5FXD4j^;$KjX~69$=HX;C z<^G$)eLd?|(f?^o?+o}UHzOg?t$R^Su#C7`MsLBH)7!2R?XUyww#6gJ+>sjMWV(!d zYX$xw@GE2dGxr`GvLCg_H)^-?F7A}2d2rhn&w5k!70>xDa8viyOR^9D-|ipiwMQd& zsD7r`(Rn%OpYY9pIqhKQZ7*Cp9dXr+WN~tM3c4y%FFEsg$WLR#Q%fQ cKL}U($bGZa+{SocD^$ factivate execute fdeactivate drop r< factivate ; -: log-emit ' fputc LOGFILE withfp ; : >rot if 1 + else 1 - then ; -: for ( from to -- ) ' r> , here ' r> , ; immediate ( r: to from ) +: for ( from to -- ) + ' r> , [ ' begin , ] ( from r: to ) + ' dup , ' r@ , ' != , [ ' while , ] + ' r> , ; immediate ( r: to from ) : i ' r@ , ; immediate -: next ' r< , ' r@ , ' +towards , ( from+1 r: to ) - ' dup , ' r@ , ' = , ' BZ_ , , - ' rdrop , ' drop , ; immediate +: next + ' r< , ' r@ , ' +towards , ( from+1 r: to ) + [ ' repeat , ] ' drop , ' rdrop , ; immediate : yield rswap ; : each [ ' begin , ] ' dup , [ ' while , ] ; immediate @@ -53,7 +56,6 @@ s" jorth.log" open seekend deactivate const LOGFILE : dobreak yield 0 ; : break ' rdrop , ' dobreak , ; immediate - : min ( x y -- x|y ) 2dup > if swap then drop ; : max ( x y -- x|y ) 2dup < if swap then drop ; diff --git a/game.exe b/game.exe index 9b275877327f499547a61bb38993d533a4b1965b..22bfdb0344c64a0c691856a00502006cf09a8035 100755 GIT binary patch delta 32445 zcmcG$cU%<5|M>r!-J{)6j^ls>>Akl@P_dxE*^rzKJeu9u5~G3|V>}U~!l_Z$SYkAy zCU#?suEyAfsIg#+y=zuMKt$}^?=^cs5i4#=}8?0A(cW)gh1=jtZR|e z5-74=3hL*4j`@OXhX4*MxW5@6zo>Rv!6JdrrILZe3qHnVN{Xa6bFn+OToUB9qPuS0W+-yn3buS(M$5Z_R#?)#@Ps-4HKP@twBhba!pVT$ zwq}coOnve7qy~e>fyAN=PHXN$+_@9xu|(kB;_q%Q!Xnmo`bQnzZ|K^PplO)Sm750= z%*G;?D7mw^`|gK-?Vcd+-ps{Y#*%z)EdC~PCHO1ju3EMs7dbntHe?0Y%_>y(+54u$ zWL%AzH|fl+u?i)Q+@DtAj$3TNv!2MNqv7 zlcc!{>vv6Q7D>eT@3|+^(46ycMP1yrVXjFZdaKLLIo{t;X*#bD;-7&H#DZrqlQnO3 z;!ZIIt}#HP7$-LfJO2~@Ae3;Q%jSend8-p+KYU|4v@qgeB4hA4m}ra_J~lcrh$%eh ze60JCa&EG<7b)hJTf4b%i8{lZLZdO?+88V3N9)QY0BU1~(4RYN?Q4_qMkm~4D=gGU zw1PkP(c0NejbeLy3?lHO3uE6c%*U8EVpn!S#*xotm1SQKo4CFhvR#BaOmH zZ$uhMqhm$nDGD2mc{Ya9otBsG8UB)8C`xZIPHGUsXt@oK#nvh8$obp3$=<{?m0>-X zYUe6D{i^9Ck8tDdob;Ps>4eY*jjTS;Y({&?uMlgZ@2h{cKRx{yiCTVpj#kKQgM)-N zby?Sj?K#3P#^zo^W4*#yhcH&`zhWKA5sFN)(o6OxnmK`?rozT>N29@(cYURE5mp!z z;tnL{KR4AkFU8t&!ZI!AJmu~$WF~h4$hu$m0}GUt(Y0lUUGcoL#uqRsT00z zD*P_m3p2SB_I^xJ9QVxLC(7@o&eWe;z0@_;XS%6}i(`Ry^!RQ%Yz#5yJzRUm6tgXF z(uLLBeuevxO>b!2B8)W0Sm7u}F|XAbVrBLDM`4vx+i4}3_LRzg(7;mIU z;VeS`By|0duN05`^MyD#X==X43TM&rTpNcTI13ayw3bbLD;)m7kF&!Wj63cS*wO5T zPN?}%Arm9MsnH4k9~v8JZ(^aIfjnCtI%|ai7)=F&rD>RAuFtEc|!3x=?N)+~pr)(J5FryRXJMxy8)?JMA_?>ucW{s}G zOjvBJ_^YvN(h*=QcIoeeb!Fxl1aVI~Z{1m|r#aIqb_=6bj5Ve{qQ0o@lP<_3urn9o zz!6h5t7)u8VT+NMch)u?_Bd3hTh|!pezj@fiFqZ|{5vlpzp28TBJVLp=29FT;+BOs zjqZhwNzj38Du|faBpN|1v=}@UuG0$pxdo0n`p+8=p#9w%yK`=1nD$HKWJYjo3=6KW zg%R)gY6q>5P^}ZlJE7sNm|)4C#Kc6c5YQB_wqEG?j#nwQf&<38{+9NkhgCY^d~hvUCLaF{4?}ANKYDOb^VMN+mIE$Ri(VIqoVP*Stb-i%@rLfUBUvr|lHETQT zbh0D)k@GbV8r=usj>)w$Xl@zOZzO2mO|#aUC8WQZWQK*SVAMw%2d3hA)7WVm#f6oY zw7KXx(Dt0KY0&D0xDag0|LPA|$p2~IX$9&3v~RRRT`;C#&@?2NZ%@o~r>SEb87G-$ z?P7WeZL^b=x{4T@5ALCHjB(o&h5dSZES<_UZ*VFzXg;jlfxqw8@uptBs8ZKBqo=0Q zI>VTuT^out4gW51$$><(2BTIu-m-N3jzq1n?SEJv?XpIz|4(fQ1x=ChfC-JS+2{~`Y2&*e}LeXo}fHvSc(r6OgUH?K*iL;wHt%Qnk zCsgQl!krhwzK=r8dtp$6pm-iyb$SLkS_3(@C(6l~w83lk6zHVAv(nR*-Di;9oxtW^l3ao>7VN{^rE zgbVfDH_ojU)^YR_!zUI=isJahbb(ZGe>#84tgh!;t9pP7aV?}ateuPI=Ofv!z~ zRC}E2pXvAnEbIVG_s}aL?G4`%Z9LizXuF`@_=>+Q)e3&7I-!b0_1!CeC@OnYNvPaV z&3whLM%D0C$ETsP(xV&qir*~L3Ki%w(A7WH3E8iBPgK`XWutnCs{1QG6SF*tYA~t` zsN!Dni|~4}3)L7@zoYVf#eZ(A6@ElD5!Gf?@>hHzs}<&>H zbhFSstK&DI8-da0pc;?ruR4AYs=lZepvpycqK-Fn)C!5HmZ0j1YG<9$`88i9*9swM zm!fTrc4Zx(g31}ya#TL3=GO69s3fRLP}!l%*Vpmm(Y+9K{1$W{1f4LXj$euD4yt{q zo}&7sj{h0Y{S2x@sIH=FU&oI{#iKfc>Nu+4I$?i3Z^UVME!tyfx1n{Y;{$QV{T9_9 zsJ=%9b-WrYX&Ng1pXlbGd;XFy$8#Np?jou@R5xDoA5o>Fx{PWts-f9q z7<40F@;mUzN2ng6s{UIi^nb}eMpcgLF{)dry1e9F&9uTHR066~s3KqTpP<@;sshzs zRBooUmZN%(Y8@)8m;5Y@^$n_OR15#s>4o}Qem}Yi=w6`v8lyd|<*QH)L{*1sG^z`= zysx=dNJaGqRR*fxYxx1F+M;@oDjC)0T7EvN08|aAqERiY<&U9qK*e;?3LdCt)$;FA z0V;DnIvKk0wS26FR(SqI$6KL#^8^QcEk6j=4OB8zk5Tok<>#R)LuG^NBC0mE{1a4r zP}!k6jLN^3=TViQQlQ$3N>R%zvHBOFazwQPmGK3iY>5|*uh6-pn~kpW1-}EMjYQ>- zY9gxZFZh$F`lAX&H3(Jd3qIHi2R*7_RJ~B`e!*8_tVmR0sM?`g^MYqEmK&-_RDr1G zzu^0#vO*PuN{LE8^#wl^UHxMnABT>h`}75`LG=(-0;;OVI-%bSej=(1s1i}#MAi8P z{}Za;QKg{z169Nez5>-|R6S7rimKHMp2hiQ8LD2W)}pd}!8@axg-Y86``@?dUe)k{ z=*FY#i_xZ`dQihhqsm34Lp2K3`5OK_j;@}l2BJzwb+CrNi>eK(QK*toZK~l5Q2C>p zh$;%z(i$GDwSofGbX4xB3Tt?GRC?nh9bbq}itdXV{xHsGm8gnPy?%sOq8fe+s_Up0 zqI!g?M-9IZ2XrZ_?@*Paim%~Eq1ugVC8|TH{A&1xsMetR5!Dt{_BH%TRP#}-N3|SP zgT9*A<1{iA-41l$psT3nm)K~9Pf_hbH38MNYW@JKeyH}M8i?v-HUBB9&ZzdIN=3D+ zn!krC0@Wc@ZBhML%`0)HX@%-2ssL2;s`*~1EKwcrg8k0{-Ivw;HicGr^-#x`Vl+TC zqMCnz>H(@VsGdL634N=14%K;7S5VzRl~~QIu&xiHx{0a`Rd_XThH4Y4$Efz8a;@fL zP%TCE0#ykri)ua{RiPeTJ-P+x>ZeE%ja7UZDnC?8RFSB@tKui4vPb2D$_>@bDm|~jDrtN1&pPNGUebpcge6~EjGuZF04q52(_ zZxw$VTl_~<8K^d+l2`E(6ijLiOx9?}cgvs?n&%qx$PP z-wRb=RO3+PqB`-M=TIf0nvAL^s-4gI6RcJUM>PXg8&s>G^M7J2S5$LR`J*yC=dYu( zc%awui_t02O?l2gL05NQ$FD+Vyss06KNp`W?xWg@suES7=X_T@rE`c&D#g9WaqnK- zOI7T1@$q5@;w01FpK$N*xR)xY=e!;V(_+K{mHa8RbM>$AdWVqv%5)o4W_~Y`n4aMZ zDuM9lytTqmOyVZS`5ceCT*==<6!7hX?flt*x2k2H_`r1Sm9DVkJ$x9fp!c}izP45idF_EAqihXRVK}yQg8d4Z7yqc$Q=+tpL-VZ3URhXNL8$$qVvcV34!+^|Qx1y;lCT z$hK-=kyFjUB9B_Gv#-DZ8DI60vuZ3w;q-TqFX!v9m0Ubb@3~$&=2)`>T%3)wtmjcr>(d^ zzm+~#?Xlu3yvj6H0A-pQe2YBE9B<0!Yo0iXxjaqa9{D9Qt3$W|fB&F5SIh=?iy7gw zu9#66mEv>OJNl@Fcl2kuiT-}%6}Q~~V{&+~PIn@=u2}OjU@pG5lxW5A<=kXnh!)@d z(osj6Y^`W5O|~Lv_w@j45}c`OnRy)!2Ir>C>y4A@Xy$4aXB*_pWI69v2R$RqPyU=| z$j%N^G}w#QP1T4`LwL&TrisEU*`Tpp=abB*Vi5|k_QI02!bTtLBx1zEN=bUgnnRpT zsEa-<*-%?7!N!~c`Rvm*P~w-2ug%|J2QLW_$?(Qd#%j!8M_{7q4Q#rEymuI59r=EELH{LPDY^tn!l(=m+idS`&PSo3iY>@>f0ul%0DX{v_3&_|5A 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 delta 28815 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%0DGS zh-nx+OsAP*2F(+*Fn-vSB(WK-6r0m0Vhao-wxo?>Hfd*dK#{1L%>{K#csoib20Y81H)xLw$oW$~PPXd?U!@GLo9QyiToM-oQBDXv%YW zliqT9i{5b=gWxJ@P>l<|cX64Gp}=x-bgdw@Yb6<6=a9eaTncx6pQ2pnQ>^O( zYVNv_a$Of;eDDM6;JTRdU6*2ra2fS>T}}gCS74NIB@J=?$U<+quEI#+YI?_Y4NZ4l zOLJV;(PGz6XqD@F3>$-`Kx^AXZuAkF+*DZ9#bsNSLzn~kg+v$Pp z4%}0Gi952L!Ns;?JQqeI!~Kbf6^DKzi5~0Z`!N6K!;TSp`)rxbWC-bepda9kxMI`Rb8bEs%vCb zRnraCb-JUvL3I{Y4LwlRl1+7sG;X)a)9nsYK{&4*oeYr<~1`LR200qn6`5VN@jGeI4~ zbm~y%s}5&=>IfF7j${$)Xx2&{!`iFkSVwg{>#R;-J=IBUlscJ}s8iWEbsC$XPG?iq znQVnRi>*^PW1p&Bzru{}U6`MHH->NDSg3n<7USNN<+=A_UEK>E4GGxtrMt_agSX zdp|bTy+12;AHXKKzsjb&4`LPWud%uA1KB+HA#92JQ1-F=aJI&MB>Tkub++4m6g%i{ zd4nBxf0G?`f1CZ_K89UzAIq+~m$2*Z<5-RRcy`-;0(;^YpbbX-8GfWteMODYUZ*2n)li3n)z&u zW&xY1k=P{72W+ZlF)O!dmaz9VOW7jLGPYW?oNd;8$o6Yiuw$B)?3CtX_N!(UJF8jE z{?M#pe`(gU3!2Z^70m{AU9*YZ)@)|?HJ>x4-NIb8TbW+_1@qNzXF=K>EJ9nw;tWx_ko2xy+=4(%~<=RthrS@0$vGxpGqy3F-)}Ccm+TYn%+CSJX z?RoZ%_D^d&4<3%fDGw*%R}W|5tcQ#6w}-3nkB6IZ z$wMt%_jtx?JT$^>4~tfK=;0|m@z4q6X%L(|je?t}NzizD2?3toLWHM}5bxKFb78w@OQFg$ zTlmVem9X10N7&=pTKLYhjd0X6SNOrRop9VUPdMS(UbyVpLAc@BQKg zVVv%5VS;XqFhe(1n5!!h=Ics@rMmILa@_>sW8J&LYTYDZoo=$QNjF8 z*1acutD7Ml(9INn(ajPr>1JC5tFBzA)l~|2baR9{-CW_JZl0jlzb_c{3j~vXq2QyJ zgkb$5AyU6sh}JI=;`B>}MEx?MseZZ8TE9Zb)vpxt^dAYu`j3Sn`qjcP{TgAUeyuP? z|A{bF|EW->UoXtpZx9yhHww%3n}jv`&B8|g=fYO~7NJUS*(&VOZxasdzYtF7w+rX= zRl)`Rm%>H;PN4>G2-fO%33v3ng=hM21TyRqM8jS|W7sEn81@T#!vVo$I4JlS4hg}A z?}RYJVIk6RRERcwFT@#+2^oeTg)GByp}FBFA=~h?(Asc9=x8`8bT*t4dKyj(1%_XR zJ{H3np|9aLVW{D(Fxv3D@Q&dRVWQ!@Fxl{@Fw5|lFyHXEu+Z=yVTs`%;bX%kVYT71 zu+DHr*kbrs_{v}vb{Vb-dkxjXVZ#mKsG&yq!EjUf#c)eFW4JB+Znz^{G~5-g8|s7_ z!+qhF;entwJ`@bbM}o=tSnx4E5iFs`r$VgpnUG+#2}wp0Q;kf_Fp6Tf(NWAXI*GYP zXR(vfMeJg96?+?1VjrWMIMApTUo&dNAx5n@+~^^`Y4jAw8+GDDqh6eDG>9{dCUKV0 zORO+@i;~e-{J_{mTx#?aR~rMxwZ8Nn)KbS$t$n5d~AK=xj<8-A(DD-jpSpOie{! zQ!_EZ)LaZUwG^XG*}+Z;b~AMldzdV9AWAzjxu!A`pg7a(RdI#aAaSeLYvKW~!Q!u8Lqx0B zQ1P+XFj3<@TnzIbA!d4y6gyeGUl)tLM~QEFzaf@+j}{kuzbS6;eoOqu`)%=O?=j*( z-ebjk-X)@oPpR0%XPlVeGhS@%^N!fdXM#A)XQDXK=Us8G&m?h`&t!3j&lK^nk4605 zXR3JJXPRj9nJ(&l%fxWs_rxsU8R9FxGsXVCv&6T3XN&LomWxY#D@4mi-%4?h?;P=j z?_BYs?>w>2_kGc|$$ZhT$pSI4$wIMB6G`mdWRW<$$p_-QO%{vunk*4lH(4rHHCZMe zX|h~A*W^R-Mw1mH`K=W7ejkYuejkfX{Z@&c{Z@+u{MLwL{ML#y{MLy}{XP*l`F$$x z^;<8V^!rS_&IFT>mX%f&W%ANZ3P9{95u zA9zYk3_LBS1pXps1)dR`1^zC!4m>CJ3Oq0N5Bx(M75JApHZTy+;Df0=FoYHd2GP2} zFxn9qPP+ml@kBm~js`~4&w(*?F))^{1;&vrFo7I{lE^hEnY2Nvx>+lwlk=h5Fs8g^PbqV&SZoxj(Be)6m3ihLd-~j3q z9E2B)f@xrI2)z~@PQ!yEXk>6CjS7yYH-lrSG&q(f2glQl;3S$GoJ{kBQ)ppuDt!=~ zMoWX!>BHbmS{dw1tC7z)$mhr4Q2IMK%tF_Z(M@Dz3yvaPNHlqc#86B~EG37;QD#Uy z<%A?qUPvN!3rV8lkYpMfl0qdRsWdqxjmksP>4T6A`Y5C+?Fhm9gdr{HbVy6O8q$hx zhUC(NkUV-6(ve(3JCP~0Gc^hAN>QQRC@D0b@a*RWTqf7l=z9X6Pzgbk%RVZ&%m*l?1= zM$k`TBk5Au>-2BfXnGd*CfUN?B8TuX7_4mhfpb zHhel+!po>K{5@I{K8x0d&!#=$m2@C{4jl`hOV`5Zku7{ac}6TCpNNGN93fFg#3IU# z_<&xCSWM=KB~%)*lomuRqpcCk>F0&enB@-ylmxsirNeooUPx6q8ptu#0C3tAYtomNKfpwA+!Xh-Civ^R1m zeIL1-oT9!awGDIVzY2MTOGPsBn5aDuPO* zB57t+6fKR4rj1cC^i5P8eHWEU-$!Lx=tsQhbSkPDosDWi=b~EDpHbO#F{%|^jmn{$ zQLTwZ=aLxRmfWJ-QA~6mWkk29oaheJF}foSiS9(NN54YvMt7#E(OqambXUyzbSAnx zosaHG|3nwkwdf+ueaSbbKl#TDpyZf=lo|6X<;4u5ZZVeEsC&#{>K8MVhQth`(J{lR zBxVFniWx~|F|X6Cm{GJmW;7j*d6RyOd7IA0;O&r@vGkvq61p5yN)KYjQ$*}L6chU{ zWyDUV7O_*PZLEa~VyDvZ*lF}uY#F^1`yQ3Y&Y;z?Gig`sEIJ!oPJhK#(AC&V3bDk^ zp&{C3(Ozk?3O zSJ4mgU()ILon*NXFVlti-Q=9`4S6NtXL7=~l##HHvJ>`G?}P)?Kj9#aOgKbuCwxcq z5)RYGgky9%;Rm{q@FV@3@Dtrm_?aFh;1#sQljM+innDttDJs#0ViR2{Em1{ziE8SR z=t;d2jWjgTM8guj=#4~g8kguplM{U{G&9kU<|O*lg2Vv&9PdJIO$?^*5<}=%Vi=uC z45!}{Bj`e6Bv})q=tg1;-As(7+lg`XI5D2oNeR>>DUo85k|`xAmC};ZC@U$Qnk8jW z^Q25_m6S#8lbTVtq~=tZ)PnjYwWR(@*)%vQhlVD#rr}AJHZ&?JmqsVGrP8DhG#)Ej zk~-1Mq*rKGk^@yFInvxDCt8@~LW}Tb^0Fj1+M1-MFO%G9Z<2-%;8osVl04{-Bv1NJ zl8&w=>8U2kK=+bN^f1Ybo+NpbYqAfSl5vzI`%`#w07WGSQp@BZ>X{ruy)DV1)F(NN z`Xz_cpyUV|k*uTFla2ItvWdndd(qfrZz@Fw@rx=|;^`x>K8!9@H+SCv{2bP5CJW)H9_I z6{MJHNJW3mWdQw@GLULhUL{THYot#dOd+X5C_8m14NM(QLsCaj zN$NY4r#^-W(z#p$bQVEP&wp1zJorhh_jq<>1K>Fa57`UbM3Z=~tz zn`n9ZW?GZJh1R9x&`aM&ThqUwuhO^EuJj%BO?nj_O5aI`)4!tcE$K3yN#8{m(|6P3 z^shROXi<6GxKknm3e{YWd1{oGB48d%uDof=4JXc^9pUr{FioST4`72Rr(qk?904P zKW5&flbN;jOXe*)mwB7cXWpZWnRRp}^8r1~d`K+o2{~mwB}3LT^2>Tmfmy^NvIM;U zDzf-22bP-U$TG5=S+gvceAYS3m37NfvtC*5tT0Q%in6qJzc!8G>fZ)ARA(7s# z_ZNi(ynV|DKJebDfIF9Z?{uCoOc!TIcmU?bA~+jw;~! zh6@gjKH4D;uQf9YhfjFH_jZWKtIUje$|8p-dnQ;;ho1}2Uv!!Eg5TwB zJ&La%S-63SMTp>IXSZKiA;bx{eDF=-Bb^!xE`(nU&tHh{_ky1TzXYDY4ZYw6zu&1T zzA9qW3jVMY-ubSd9$65v3=yp%Y%fHlI>*s+c$_LJ%eiqE41oU-p1*lK_yu1HzXHBJ z{QMXESI!A|g^N)~_-~x~j<8Rc;Xi`6@Hc(0y%3>yv2SG;c#{j?5%ww9g|`hxp)lvU zG;YB}7k|a`w}L0T@K;dm(-If{G7feN=H)I%h52G@J@*E0chS|iKLUqbBJsiy!45c%mFbBz~5pad{=~btzCFewolA8l2#!-fBn|cwK08^tGz8_o4=17l zm^--gmkIcU@_V>?DEKOtz3UTkF{s|Z1|IT)ALE*Wm)Qh-r$rb>h~r6>X`O2xtz{w& zLujLGj$LAT&DGu#BfvLY8(Tt98Io>vC zDrc^gDM^(=pQ1u0*)2df! z6C%bVcvh9ypfNO1NuOiOCcuQb&3NuNxD_b;E|y!|y3;nSI|(ei@#Dol+1%{AV+w+T zx^Z{-sg=HEp{a-nRL9s;V~NN73Qxzf^9z2Q+TJnWgP%~Jh9~?~-HLW#D`$c?tDEwn zYt#OZ_o$w3cKXGsDm`CBif?ovxLxbo2zs5a`WJD|m-*yke z(mv@l_I|JwL8GRzAB1QEl?2PN4A=12zwA?MjlFqSAlO#p)u8c_7(c-izB$CZ>6!qA z`C^jBOn9@8(JBO{YWNXppMKT2DX<31vl{+RjeWYH$;ZomBHsSSbxhN#LE{Uv1ibyn z@F^rwy0)<;`fKeK{S5w9ZDU0zYwa7hk@x?p+Qu!LtJNu)ZpL!HmS5)V)5lu-mTf_B zjka;ic4=`4VcLfI8*Sqeg#WLS_M$Uxhd-@ttf;?72JJ&dtKfq@Qn2LhkEy4J{Uoy! zT;S1ok{MC&W%yAqc#B62e@6n}CK8o-L||#3HhA=;1MuG<__+r^SK251KfH7helHJt zcCNSR;1*AOriW=C=5C($X6NCedVc_1{DL3usiQ;4=n(v<`ZPTKL{EFA4}&Lr+MAdA zxt@{y4?h1vi+YAB%okOjJ_=io;m=o|_O0jUxF>HG`?o+RJQEe>3!A6?IQ|JN=l{p-F6g;8>FpId596b6tWdPxUg^K!ZTWG3Y$D@^RipunjophnTD;>sLOIHxLT%V_;;fo9Pm9T;@ z>Ki+IE%$u;uVKFPLIfG?wZ0B78X8ydFxV?p1FttURw&wFuS6|;oI#DHeabQfDR3Lh z<_7!jhTw@6R zSnr2`kAwL~OT&$g8!*dguMq!qslwP;p%3ak|9)xd3x2H;Ul#m?j8uqNZ)`ksoiIkw z&+uyaUr<=XRA&sL6Y%_#rboucGa7~j=p?)cyss&}AvwOtwC_G0d=LKhasAY<-Wx24 z81O>Gi24Zrsne(z{5aDt7rrk4;Aw(sr@}m(7--*0{@GJX;B$?yJ6qBzREU54)H*PO zCsn5Lf%cP60Q{`L77gb={C^IC_8uFAh@*k6=`2b`9Da{zl-`lD31OC^XXnt09^z}BKRPv30 z)aKw^_6U{!fBL%C*rR zyh;%o5_fqN zV1m_Py+9P1_?)m_Axa=%p4B3KD!wpPg)@4(n1FO4@N@e8q7-E~T!v9|64HL)-@(`! zGRs@+SH(2o#lX|-UyI4`#VbKN&)$eHRWz2}Mv^I8x13|* zFf4IX#Ae(YCT=+XKn3P;ZE?-y zGDi5@rFuOJ_&+YY*k)9~k<0B8+mWsSuEW^1!^9`Uh_(~yO5ju7iA7rFc8EskXMWcr z_du~5X%26>3&bAwEPft>9Zc9wMY7Ky{?C_9OUyL(5g(ugN{Rbxva2zk{lU}3da zeIqOdzQC*A-;8hfX7NST0dMpsUN9%T>d{>eyv>_FeduJF8tN^b0_)AZPXM9T0D&RAHiEZ@-pK7=s_&i^t;jqtm*}(n*ql7Ozt_B9P zu&S^Yg1wz8yk|DB9{BN24V?0gGAeHbe#SSVLs6H!5D?Ih5vSzw`d49Uew{diTlN}| z8TpIjFzi`s+kS&bd@(<s*(+}{*gdC=0>s*k@*r`|jJ%o;FAgfp{ z7Bt%rb|iLs9%so$8z3)Q7D0EixMEoYomMeB$hlqF{ivc{TJ6sM&um^?8r*vF_cg2yH<(Qu=vz*P8 z-!Yp{VJ6NV%uu}I9oev-?6P$~<&j0++D{*+>s$t1HONZ=O*rM*X3C@?^4De>tB)Wx zkSFNw5h#4LiOZW&8Y8zJp!?JF%uWPIb$+-!c7R5uk5?tJld7=<PTKV))U^ji8;D!7CKMa8p4!ezuQ2s5T z;I8lFuJ2M^H+vqdJ3`l!Quqg~_$RAkZ83^!vH8bnDao6ylq2=yh^8N>cYD@U%&Ha7 zF0QSqn77clR#(oC1x`?kMJ{in0dij(&5iZ>02HjW*>$y*qNZ~3lImKS`yrLcZYODG ztmY&&B|SPOI6?TIEG;W46#hV2sJKuRmz9XI#pQlE{xr?+5%d?9i%@ycUpk2|f#Qks Ir_(g&UoN?E1ONa4 diff --git a/game.img b/game.img new file mode 100755 index 0000000000000000000000000000000000000000..3fa9f28d58fa2a81db7a45d5d31c4860355162bd GIT binary patch literal 9603 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 Zo(yhA%AA=2jq_{c{Z1=5f*qMw_TMkRyHx-H literal 0 HcmV?d00001 diff --git a/game.jim b/game.jim new file mode 100755 index 0000000000000000000000000000000000000000..4d79ccd293a2106877af5816cdce9c1011110bbc GIT binary patch literal 5381 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 Lhj2%9S!DPh2StUT literal 0 HcmV?d00001 diff --git a/game.jor b/game.jor index bd1e3c2..0ecc60c 100755 --- a/game.jor +++ b/game.jor @@ -1,8 +1,5 @@ -: blah - ' seremit task-emit ! - ' log-emit task-echo ! ; - -' seremit task-emit ! +: blah ' seremit task-emit ! ; +blah : start-repl activate blah s" .:: J O R T H ( jean forth) ::." type cr @@ -108,6 +105,9 @@ array frames 2dup <= if drop r< +! 1 else drop drop rdrop 0 then ; : now! ( timer -- ) ticks swap ! ; +: advance! ( timer -- delta ) + dup @ ticks udelta ( timer delta ) + dup @ >rot ticks ( from to duration start ) @@ -159,10 +187,8 @@ WHITE text-color ! : footer-wait show-footer ^ENTER wait-key ; -( todo: generic say" that handles newlines, gradual text display ) -: say1 ( s -- ) clear text1 footer-wait ; -: say2 ( s1 s2 -- ) clear text1 text0 footer-wait ; -: say3 ( s1 s2 s3 -- ) clear text2 text1 text0 footer-wait ; +: say ( s -- ) clear show-footer slowtext footer-wait ; +: say" [ ' s" , ] ' say expile ; immediate : character ( iportrait color ) create , , does> dup @ text-color ! cell + @ draw-portrait ; @@ -294,6 +320,10 @@ defer player 12 9 N ' {player} defentity player +: entity-dst ( e -- x y ) + r> r@ entity.dir @ dir>pos + r@ entity.x @ r< entity.y @ world>tile +pos ; + : move-entity ( e -- ) dup entity.dir @ dir>pos ( e dx dy ) dup if swap drop swap entity.y @@ -321,9 +351,15 @@ defer player-touch ( x y -- b ) player.canmove? if 0 else 1 then then then then ; : try-move-player - player entity.dir @ dir>pos - player entity.x @ player entity.y @ world>tile +pos ( x y ) - check-player-touch not if move-player then ; + player entity-dst check-player-touch not if move-player then ; + +: check-entity-touch ( x y -- b ) + 2dup entity-at if drop drop 1 else + 2dup out-of-bounds if 1 else + WALKABLE mapflag? if 0 else 1 then then then ; + +: try-move-entity ( e -- ) + dup entity-dst check-entity-touch not if move-entity then ; player :tick 0 ^LEFT key-down if drop 1 W player entity.dir ! then @@ -335,8 +371,8 @@ player :tick ( S T U F F ) : hello-world - s" Hello, world!" say1 - s" How are you" s" today?" say2 + mary say" Hello, world!" + say" How are you\today?" player.state DRIVING f@ not player.state DRIVING f! ; : mode-move @@ -376,9 +412,10 @@ var cartimer cartimer now! car :tick 60 cartimer triggered if :| car entity.dir @ E = if W else E then car entity.dir ! - car move-entity |; JOB send + car try-move-entity |; JOB send then -:touch pete s" What an old rustbucket." say1 +:touch pete say" What an old rustbucket. +Hasn't driven in years." ;entity :noname diff --git a/game.prj b/game.prj index 7ff771fabeb3d00798a798740e6b454040a04041..8918e135027a036c2038e5097c3b023514a9c6bb 100755 GIT binary patch delta 634 zcmY+APiPZC6vn@uNj6av^S7}@V^SrCdWfP35f3FzmL{d$lyhrryR^>ht;UCw zx}*Cm8*}Cs0G&=s2;Xclg_%~vJevUS=7BS=XZ}n68g+ft03QQp#7+OK`zY!gb7IFo z&o9&W{K2L>fvco8NkwsuR4CAN2hk+8MCt&pEH%W>z_;bk`~-Q8b1B#PQ@(;*+~OWB z%-e`*7kHAdv*X%r?SYozquLX;%eL4r_E6J#n*CtUwYIjcb=fCYXM38ICQM>^aR@tW z4by|9*NN%9JBEdO4Rb%*n}$h!F{BXv8hA&jMd`&Nvv+i>M8rfMXqvOqKyx;WQhe@Dg0QfA{^aoSmHPT#J=Dze&Cn@TVR9ykgfA1+u}F*BHv;AY>i#z-TW6TupDy46vhc` zk>Vz_hyAuTM5>+}!A8Y#m5M!D4L}5Gm~T@r6*(8&TMp1n^IO?#B!z3KM`~*b`xH+h zGh1+lT#noA0bwh)OCAy8(!_P#v!aNhiEK;}iQJ7REd%#AGVcErN(~P>c{yiHT~R@@ zGt@uQU+Br!B%eaAnrT$8C)F#G=@e|)X>>^6Ovr?3_mzrI=%-HO3|fMR1Ws|d zv5h#RM5|V6vA`LC3Pj(?j~26ZBEK4T>-oicCr +#include #include "jorth.h" #include "serial.h" @@ -80,7 +81,7 @@ BINOP(f_add, i, +) BINOP(f_sub, i, -) BINOP(f_mul, i, *) BINOP(f_div, i, /) -BINOP(f_mod, i, %) +BINOP(f_mod, u, %) BINOP(f_eq, i, ==) BINOP(f_neq, i, !=) BINOP(f_ge, i, >=) @@ -314,22 +315,21 @@ void f_fwrite() { // ( length p ) void f_fgetc() { int result = EOF; if (ACTIVE_FILE) { - char byte = 0; - if (fread(&byte, 1, 1, ACTIVE_FILE) == 1) { - result = byte; - } + result = fgetc(ACTIVE_FILE); } PUSHI(result); } void f_fget() { + unsigned int result = 0; if (ACTIVE_FILE) { - int result = 0; - fread(&result, 2, 1, ACTIVE_FILE); - PUSHU(result); - } else { - PUSHU(0); // no way to signal EOF + int low = fgetc(ACTIVE_FILE); + int high = fgetc(ACTIVE_FILE); + if (low != EOF && high != EOF) { + result = low | (high << 8); + } } + PUSHU(result); } void f_fread() { // ( length p ) @@ -641,7 +641,6 @@ void f_close() { void f_open() { FILE *fp; - f_close(); fp = fopen(TOP().s, "ab+"); fseek(fp, 0, SEEK_SET); ACTIVE_FILE = fp; @@ -769,16 +768,105 @@ void f_quote() { DROP(1); } } +void f_imagefilename() { + static char imagefilename[32]; + int i; + + strcpy(imagefilename, TOP().s); + for (i = 0; i < strlen(imagefilename); i ++) { + if (imagefilename[i] == '.') break; + } + strcpy(&imagefilename[i], ".jim"); + TOP().s = imagefilename; +} + +void f_image_up_to_date() { + struct stat src, img; + int uptodate = 0; + f_dup(); + f_imagefilename(); + if (stat(TOP().s, &img) == 0 && stat(ST1().s, &src) == 0) { + uptodate = img.st_mtime > src.st_mtime; + } + DROP(1); + TOP().i = uptodate; +} + +void f_loadimage() { + cell *start, *latestNew, *tasksNew; + size_t size; + + fread(&start, sizeof(cell *), 1, ACTIVE_FILE); + fread(&latestNew, sizeof(cell *), 1, ACTIVE_FILE); + fread(&tasksNew, sizeof(cell *), 1, ACTIVE_FILE); + fread(&size, sizeof(size_t), 1, ACTIVE_FILE); + if (start != HERE) { + fseek(ACTIVE_FILE, size, SEEK_CUR); + PUSHI(0); + } else { + fread(HERE, 1, size, ACTIVE_FILE); + HERE = CELL_OFFSET(HERE, size); + LATEST = latestNew; + TASKS = tasksNew; + PUSHI(1); + } +} + +void f_saveimage() { + size_t size = (size_t)(((char*)HERE) - TOP().s); + fwrite(&TOP().p, sizeof(cell *), 1, ACTIVE_FILE); + fwrite(&LATEST, sizeof(cell *), 1, ACTIVE_FILE); + fwrite(&TASKS, sizeof(cell *), 1, ACTIVE_FILE); + fwrite(&size, sizeof(size_t), 1, ACTIVE_FILE); + fwrite(TOP().p, 1, size, ACTIVE_FILE); + DROP(1); +} void f_loadfile(char *filename) { PUSHS(filename); - f_open(); PUSHS("loadfile"); f_lookup(); DROP(1); f_cexecute(); } +// does not use the jorth interpreter defined in boot.jor +void f_loadfile_cterp(char *filename) { + cell *start = HERE; + PUSHS(filename); + f_dup(); + f_image_up_to_date(); + if (TOP().i) { + DROP(1); + f_dup(); + f_imagefilename(); + f_open(); + f_loadimage(); + f_close(); + if (TOP().i) { + DROP(2); + return; + } + } + DROP(1); + f_open(); + f_deactivate(); + PUSHS("key-file"); + f_lookup(); + DROP(1); + f_swapinput(); + f_interpreter(); + f_swapinput(); + DROP(2); + + PUSHS(filename); + f_imagefilename(); + f_overwrite(); + PUSHCP(start); + f_saveimage(); + f_close(); +} + void f_runstring(char *s) { PUSHS(s); PUSHS("loadstring"); @@ -946,6 +1034,10 @@ void f_init() { CDEF("fget", f_fget); CDEF("fwrite", f_fwrite); CDEF("fread", f_fread); + CDEF("imagefilename", f_imagefilename); + CDEF("image-uptodate", f_image_up_to_date); + CDEF("loadimage", f_loadimage); + CDEF("saveimage", f_saveimage); CDEF("memmove", f_memmove); CDEF("quiet", f_quiet); CDEF("loud", f_loud); @@ -960,17 +1052,7 @@ void f_init() { PCONST("$DOVAR", f_dovar); PCONST("$DODEFERRED", f_dodeferred); - PUSHS("boot.jor"); - f_open(); - f_deactivate(); - PUSHS("key-file"); - f_lookup(); - DROP(1); - f_swapinput(); - f_interpreter(); - f_swapinput(); - DROP(2); - + f_loadfile_cterp("boot.jor"); f_loadfile("defs.jor"); } diff --git a/jorth.img b/jorth.img new file mode 100755 index 0000000000000000000000000000000000000000..a67f4b892104108496599a81841d70cc7def0372 GIT binary patch literal 2120 zcmY*aTWB0*6#jSS%*;PCyW6eA2V(;@N|O+a(hG%_##^u2G%8Xd73^krl8oKVgxO8g zhEUq{LKRD;g<302q58BcYRrQaDy>jaXu%f6l%XuBFGdQLnzTx>erINrw&Wpm&Ue0Z z`_DOhSU;70UhdLK6r55?{MVp}!@3p=W#Q+J>z9;>PU@;?X=?%6CO(B}%NrgGmiRgr z0v0mjg06`2AU+q0E4nS#y}7ZobM2aq&%L%5x;^3=;6ebO=k-gei2j1uQ-XLk7KJe; z++K(wO_0=bN=QOTEuwkGe&LkLP7GB6B|uIQbVki7$Mp+HuoXs?e#e7R0z}kl91uND zpPT3++6H;J-z_DM9*i+)929{w=;SMNQAC^s$B5`%Q1gBH*i}fJ11I(gv_oFS=3kEE%@%zZ=x721-2xv? z5>L>~jcyiC$uUuG2C!V2pqHgBtMsbODW_94b%ji+Q!2Yjsap}=lk+u3r(@lGjTvLI z4UB`brY=D1R>=$!sW`!4;8ceFpa{R$^^&?=xuF!{;R`vFs?xaR;tt7q_iVkPfgXq7 zlYL&1H<9Fo%-zF>yzQPp%GUd;VYu6aiG4%&Om)4-qC(G ze>Wq#ZIb8+e9qh^8~M(+NGvH1v70G8YDCRYEKL**)NU=JMym;SOQBvitDXfqD1nOQ2BC^_!!7dBcyMTcakg@bP)-)SN!38 zP~_t}r9OliemEUcN}N@y^l1FW_v~+bpXl{@xk8Mv)ZT)tn#!&gL4rNLN1$U2w;{b( zxUnsx5xtb&FFa>wa&VerLYF9laxUSFB2I}uY_qGE+iZX;iwP{@7x-KM+7Sbe`5&fE0#Xx*c+bwQE zE+ddrM0Z%9-w7Y>Rx|Xib$vs|#3R>_2GGgWKE7iaZd|*?y&hLpQDDP#4m?cfWDG1Z(r>4YHZOtMnvJP z7C&>WP5dR;L`EizU=CF9stNdG#!A3)C12nkF;|^~uV?I8ZXLgqdAc4mowd;0e4*m* zNM>_Nt!B=k+&h^m^<4b5AUmaA!xy)(HG4?hXZ+wauE@?#V??iKNt7LrpZzErHjc)9 pm{s*E9nSKS?8zF~or2@;;3r?GCpI_G_VcmTms#fUL)-BQ_#d2$ItKs% literal 0 HcmV?d00001 diff --git a/testbed.c b/testbed.c index 367c2a0..123749e 100755 --- a/testbed.c +++ b/testbed.c @@ -148,6 +148,13 @@ void f_splitscreen() { DROP(1); } +void f_textc() { // ( col line c color -- ) + setWriteMode(0); + setPlaneColor(TOP().u); + DROP(1); + text_draw_char(ST2().u + (ST1().u * PAGE_STRIDE), TOP().i); + DROP(3); +} void f_text() { // ( col line s color -- ) setWriteMode(0); @@ -199,6 +206,7 @@ void game_f_init() { CDEF("split-screen", f_splitscreen); CDEF("ticks", f_ticks); CDEF("text", f_text); + CDEF("textc", f_textc); CDEF("map", f_map); CDEF("mapsize", f_mapsize); CDEF("mapsize!", f_mapsize_set);