From da7dea8906001e5a1caad003ca28f2b48cef2e84 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sat, 2 Jun 2018 23:51:56 -0400 Subject: [PATCH] v0.75: performance improvements to VM (especially for Apple II) --- Makefile | 9 +- bin/8ball20.prg | Bin 25571 -> 25571 bytes bin/8ball64.prg | Bin 25697 -> 25697 bytes bin/8ballvm20.prg | Bin 9838 -> 9432 bytes bin/8ballvm64.prg | Bin 9922 -> 9516 bytes bin/disass | Bin 17548 -> 17564 bytes bin/disass20.prg | Bin 4330 -> 4330 bytes bin/disass64.prg | Bin 4414 -> 4414 bytes bin/eightball | Bin 69008 -> 69028 bytes bin/eightballvm | Bin 28076 -> 28108 bytes disk-images/eightball.d64 | Bin 174848 -> 174848 bytes disk-images/eightball.dsk | Bin 143360 -> 143360 bytes eightballutils.h | 2 +- eightballvm.c | 267 ++++++++++++++++++++++++-------------- 14 files changed, 173 insertions(+), 105 deletions(-) diff --git a/Makefile b/Makefile index 823473c..9eb749d 100644 --- a/Makefile +++ b/Makefile @@ -114,9 +114,12 @@ eightball_a2e.o: eightball.c eightballutils.h eightballvm.h $(CC65BINDIR)/ca65 -t apple2enh eightball_a2e.s eightballvm_a2e.o: eightballvm.c eightballutils.h eightballvm.h - $(CC65BINDIR)/cc65 -Or -t apple2enh -D A2E -o eightballvm_a2e.s eightballvm.c + $(CC65BINDIR)/cc65 -r -Oirs -t apple2enh -D A2E -o eightballvm_a2e.s eightballvm.c $(CC65BINDIR)/ca65 -t apple2enh eightballvm_a2e.s +eightballvmzp_a2e.o: eightballvmzp_a2e.S + $(CC65BINDIR)/ca65 -t apple2enh eightballvmzp_a2e.S + disass_a2e.o: disass.c eightballutils.h eightballvm.h $(CC65BINDIR)/cc65 -Or -t apple2enh -D A2E -o disass_a2e.s disass.c $(CC65BINDIR)/ca65 -t apple2enh disass_a2e.s @@ -128,8 +131,8 @@ eightballutils_a2e.o: eightballutils.c eightballutils.h bin/eb: eightball_a2e.o eightballutils_a2e.o $(CC65BINDIR)/ld65 -m 8balla2e.map -o bin/eb -C apple2enh.cfg -D __HIMEM__=0xbf00 eightball_a2e.o eightballutils_a2e.o $(CC65LIBDIR)/apple2enh.lib -bin/ebvm: eightballvm_a2e.o eightballutils_a2e.o - $(CC65BINDIR)/ld65 -m 8ballvma2e.map -o bin/ebvm -C apple2enh.cfg -D __HIMEM__=0xbf00 eightballvm_a2e.o eightballutils_a2e.o $(CC65LIBDIR)/apple2enh.lib +bin/ebvm: eightballvm_a2e.o eightballutils_a2e.o eightballvmzp_a2e.o + $(CC65BINDIR)/ld65 -m 8ballvma2e.map -o bin/ebvm -C apple2enh.cfg -D __HIMEM__=0xbf00 eightballvm_a2e.o eightballutils_a2e.o eightballvmzp_a2e.o $(CC65LIBDIR)/apple2enh.lib bin/ebdiss: disass_a2e.o eightballutils_a2e.o $(CC65BINDIR)/ld65 -m disassa2e.map -o bin/ebdiss -C apple2enh.cfg -D __HIMEM__=0xbf00 disass_a2e.o eightballutils_a2e.o $(CC65LIBDIR)/apple2enh.lib diff --git a/bin/8ball20.prg b/bin/8ball20.prg index 76aefaf84d592b34587a07f78542959bf8260d8c..e3d9aebac2f103d0d5e57f0fb78e4d8f9555b7d7 100644 GIT binary patch delta 16 YcmaESobmB-#trM^7|k|sh%;sd07v5oL;wH) delta 16 YcmaESobmB-#trM^7)>^Bh%;sd07uscLI3~& diff --git a/bin/8ball64.prg b/bin/8ball64.prg index 7d4398c7ba002334fb2df119fe0a6f5dec6d2e56..86c2a0ee2a3baa484ad378081dd6b18cb56c9559 100644 GIT binary patch delta 16 YcmaEOg7M)A#tk>)7|k}{ifd;D07{Mr>Hq)$ delta 16 YcmaEOg7M)A#tk>)7)>_cifd;D07`-f=l}o! diff --git a/bin/8ballvm20.prg b/bin/8ballvm20.prg index 3acb9b6f2a5d4cece8db36d0f310e18df6b9c07c..da17974a94b29daa150ab1bc01f10e06092eb985 100644 GIT binary patch literal 9432 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 Hb^HGTQj*JR literal 9838 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 T$^^SrYtoXfaQMspx9I-^u+l8c literal 9922 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 SrWMtiuw*N~t0a}bRQ?YI8h&R0 diff --git a/bin/disass b/bin/disass index b98a8e7618d236c4c6b8870a5a72e7667e257c61..f86b10d3a00e3962ad0191b003ac944bbdae2f72 100755 GIT binary patch delta 1376 zcmXw2TWnNS6g}teJCAnm^u^E?Xl-Za&ZD*Two_Utv{Tv+wN^@-0MSImwlLb!p~W(2 zNQ4PSrB#g81AbuBP~$6+A2X>RL`gKp8XL8eNQ|HXV`BJ_`XW*Awe}_4N!DF^t#$S} zbFo`Gcl}RD-}yu7Zyq#%JNnh~i}A;LXP^7*`nA)!GxB1IY{^afs=e8x zx)8>YLx^Xj5HGleSOVuqy9vRiUj({)7-<7Rrgr#}b^QvV%V`G_9cs+*&FG-bu5-I+{m|wKNN?CxN_0dys6P zH{dps20ca_p)`>JzK-(2o2do;TgU>gr&{V4Vgt2en^szYy^*d0H&HjRjT(UM)Qfg; zI)@E9r~`a6?FR3pLvXuj07^F<114x*O$4pV!`MvMT!XN6-SssbT{^S2=y+b83;H!n zS66~7jAxhQwS;oJayFEW+JN+N#hGz`t*8gQ*QmsGYS~4=db_yK*v*Ay7rTrk7Y%kXWTd%>NuI^M#w@pPl7FBWHBRzp zXqG()q=h4d%HbN;M7{8qvU4iG1202AZ6e^Q;Wl$jg{P0ZyjIJKr%%m?;!Yow;&;?v zq585*=*Ey8zRWy5~CpytBW(ExOL zA`b}%4K-r8Q}}w)Yae^bi<^l<$eHqtx*F~*In3UrCIjPS%d3A?ZIQNZ_Er849$)1L z3WWF)?GA!#y6am6wOd0$x+67~5t?-J0BF+91A_=p3Phe1O~a&o5~uu`gz$T`ySE0&WCun&wh6Hap&>OO=wAWQ6+Z+?e7oDvZTdeS8`{bM delta 1358 zcmXw2ZERCj7(VB|x3}Hy?MAx-qin8SzwX#r$J&XLZm_Mxp^POCKcd5IbHmNejo<(i z&H6_IGicO9f*A{8#;*iIA{7%b;z!gNmmo2c7+9hh<40m7phR#YKJO*mA5Wk6d7ks0 z)06kiOv!yy^5u}syc^yn1IGud7p~c-=TGI{xpc<-{r%`b@3H(*dBHE!`MrUVH#e>e zVQq2=5dwM9Bg9#7{G=^sHwj4?(7C_>$Uy8hy$F9fYpaAw*ns9B9xspqrk9 z>!JHKAquD!nL(nfoLS=z0(N0Q~8IFPQnL$Gz-eGZN;jV?!YJ*rMe!rDzz z7b7LsgU|{dK&+bY3d)D5Sov8vTU>yYZO+PH5_ zwnE!zHS@xivJ=H-tDTElr+C=f$VJjAdaQ0P>YSq2dW4I5`6K!aSYzBeCI3P(WDW8) zG|2S`j0)FPST1*;CTfNEXO2x579(KkhocCX*Eu}PRG2}wUthtE&7e9FYc_sDL*KLN zdaQQoQBY$KoBj#pjJ*y$shZ=lvI;bDFaHEy5nszikYavK?IQ58%EiO-fSQem>??@L z{RK$4sCN~H`yt$(^g72r>&45&A>>SHR{a)l@sF@KpRzDcjvV}6WfGZ9&QqR)$4_}n zkq}>_-45)f>F)CgYPW`hbl33MgwUkH1E5I{4-6taDG+&5G!2vTMWSN!5p>fkwdY~! z`gWl42Na4r^fRXQDOTTLy4s-&OxG}VPl3vO3uvhiLxNv95mTVt>VrZhZZ*(+&r2ewZPp5Yl%b@aQBk~#5kWI+f T)Rt_b^hOij8*b|McbonXLJZbZ diff --git a/bin/disass20.prg b/bin/disass20.prg index 2a277efdeabcee95736df7fb73bd29d02afddc2c..f99569161f85b872889d98150896c926a686a8d9 100644 GIT binary patch delta 14 VcmaE*_)2lZIbKGy&F6WgnE^4@1%?0s delta 14 VcmaE*_)2lZIbKGS&F6WgnE^4%1%vH`s_O;>$IiRrSMrtuMLG)XmCKGL{S`<*+3F4xNZIQQ&*_V?{? z?{n^*v*`n4%?HL!(R^}~V>$12Dz*ByBYoP+uLCX(OnLFa_0$2+8@vs?`c0nc&G-Dp z={aj<%+_RLtfmKJ?Siq`g-rh`+#;_6IrF-85x zA~C8HS(#Oxhj13CZUqI4R?W!Da@AoN*;`@^oLpoAtq9c!kXTFicgAuH^{ol#mno|z ziLa(PHSzKD!D&t?;(*!m!Dvn#hiM<%ucg0#HvHkt_#4_+lj6~k*BZM4%RyVfX-$)n zK^;hC&C;ho0%IL2r@=c%i_HPWfUybLS3 zT0ZJhd-D_+`Pval7RvKrjM65ddbJPVfauZMS-8}2z8%IG?JY?V$1C7_Nn=v?0A2}W zvSyJ+sx*?>G%Y|{E`8}0Ekqgvbz`;`E{!y@JJx`j*<3Vl&kSBd zf8G;g8;#0)tX~g*&?@?F&%oevOnKdA#F-2=%{VNxD1Gm6o@Blxq#x_1 z^Gh_PzCs%;p$qv*#Fz}x2XHQbPq*rw+)eg|n5;YA_jCD^~BJl|0Q72Og8* z0Az-JC3R<6WEPX5MSA{5a~qtAtFciwe&2EeVC`+32>!q#cZF#aWzL5>hf&)|O%0lT zqfGS3Qi<5G8`RYh8W)Nw|DWZCo;u|L{AW=Pf9&^sibVa^lf5x4V5jt3t+IS8=rS6! zJh_str?muPO@<6Fz`G?~px?tJT{86XAipOUU5mJZE%ALU_-N}%V8vZ{m`Il5#d)Y! zSj4aJ@CUgAZQu~wLCr)3Lb-T^Q4#jBIF|^do*YB-_gkCq^MIe z%d7y|Sf%PE$0*r`*?x1p;~H&f&T=>EF#Ru=e&& z<`-yzcNRZGr@b-I^&f8}e?az@#0-6x8*CD!R4s_REjjMlOfSHW+AaCl*`|(UY`L!d z-5`AD?y6MU649?+9;iz_B(OY}v1{lh-x?Q;fMVLwl8CgYT9RB>WYiTsN~xOelX%r{ zzU){cSFica87wk|oUIc$(d(_FfIr$A!LQI|j9v6YYow<@_Mk$j+4#=sa>i=Nrk|?{ zAS5_V2l;1kOgQK_peadc7M!AKrTvk!)N z^m^{7&(w2AeNxYNa)WNFX@k4#In%4V2{)ew-FylvkZ1G@^`{K{bLjPaFG0GdFP=u3 zWjS>3U{J8Wa`DMZvSO#uLxZ$b*~=Yj1hk#jX=3YX#-YSOJ$$>h26&~)7=4B4P+{Ov znRA!bCwwMKG#`${*^WD0i|ssfxGrmttYnj=`^EWM##iYdD5c8H2Aq(~t1MrFpjc0K zEEJk?_!^JA!5>q6TMi#ZbKA!AlXS2xTd~^c`?lO5t7LiCtm0dM)4)>gG~(zV_!j#7 zXdLHcXdkCsH`CZ?K4H^*Ti4}Zof!9; zd?^+iTf!kK)=0CCjaR-E)O0K{bieFhp^mflW^943I%+Z9Jr<%sx20o( zs_t0FU#6(zAv~T2ACKc6nt^c=RUFUZYw5)CLf?gQB|0uIlsEAHokLB3#{uiULi#S0 z-Iqpgz9eh*Up9a4dim_Vvik;Ud=4^A@8gTF#3=7zZZs~%XdWQ%Z-!WXF7I!KGwNW*91`mhp7{L@!=VH%`RxTC#S=^G0%YI{6Zsgz-IE-kE^U>4%*$De-cD zM&|*9uZ?|yJWykNeRtcBNb3dP+I(g$@P6A_A1TV*MTKPx7niz=sr71`ch$8;CYP(E zY+xXlJemNZnyWVn?}WZ m`&M5k@2oc2xs!iW-QUg=cxCkjJoHh)P$aXXU delta 3039 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 Xm7IR$avRHucWEOo>Qa#Dtmyv$U6gp6 literal 28076 zcmeHwdtg+>z5kp&o3JFyCXnz_&;^5lg(M^)0Yyn50Rn-nA)uhRhGaJhAfJJcOs2mhpz-|`ZU1w%tNyD2rTEF26}ji6e3mSKYNuB&n{8E0z^NAj+D!M2ZFuG z--~?uPXN<1-_)TFG^Q^`I=z|adoNT|JQZn%e-?T4X8zU42iVV%Kg5d)nmjznLIef>Tv%$lq91-z3(z)`tROep%_9x&EBYX_>k4xE0HW_{zopnm}uyw!SSC zXsuj4x1qTyP+7IQfjny)o0|-teuX+9B1**?)@At|h^v3POl6&GM&D#RqHDXjelV@E z263hht*;+K`gI1JDq)A%1elKf$%U}f2tO%Tu+yi)BY+d3!iNlDQ>xk_APXt#lk3GS@7rhM(j%^*2(G}cg z{_70|w?z+;$)1s9@{LNwJ8tK5=JTPkTW_b9uv^-)_V*%3(yxvki0n=6?%LK7x>OwP z>Yy=2^oMwC-t$JO5XaO!yJ4=qu+;gicM_5X`WI$*Wnsd2h`AVw1L#<(UUCN#j0pV z{q`32NlD6G&!9K&e#f!(j!|zyl=f!q9iu|;=nPGldheAgbY7&)pc;~?YMPR&%<#HG zAt0hpein-voFbjt7TNrwzk)@K#)iaTyV2~-)~B@74z!ni*dNOh+_50Gl?bUFkvm|y zV0-$4p3g3nMqZ;uKSiloU2$|@Od+Q1a{ADU>_Xy51MvJYc=jv7NwDv)o7I18%%zTO zwzjnXlxNgnf>o-FFIFnmitc4sPuclu$3oP=0h^V6hxtdp5?%Jsl;~K$5^d#R11YCf z!UrYTL>$p_G?8`2t1+F8$$(Pncv{Hc)C!5UTS zAh2IMG!l9{`v^B zC*OJE91E_-`nY-RUE(x-JJpb?MNqd zWdq{YNypsZeBIj-EUPa2tDFgZgnbe<4t;pcE)~W!CLuGSjg5ov?DBec7)%|}@AYA7 zym6w3kZx!CxeYjLA$%w8*j9<`MeZ4Gm1|UQ6{6+{d;&WH>cx8e=)fhP{iT)c`2m>P zl(W}6o2M~jy|b4k8aYCR4ipzI_A%&UiM+BpGptVI(=naW64_LPzVM;NgHw@SjZ)1gO0?RmSc@g=*q3wl&4}BOJcWzayw(dxeBjs`1s;ysZc?R!icrb88Dm0`YE9&npBy#Ft!x8WHC#)rgHroc0Z z%QD1i(aiqhtha?-T;v1o#GCE5+UYrr%~DnE9~?Qo%BQW3;LJTK|I+I%g-ODzXVCep zmb{zKRo=Z{MqaWdFX>$6-ScJSeJ{zh=Y5CI(VpM=GV;D+$-C@a<$e3h$a`k6S-z(~ zILGq+pD!bCktJ{88RR*AL2L$JVjD8zZv~Y%=qU{y_;A8g?8kOIV-krW+8l8(h8w#h zFS*RZzSwj6!b$<*F?Oc5&PT=0N%+-FwnnPQ~ zS8qJkh2>75{S`9KHg@zI{vI4;n(Kk+>CN@U1PwlupnOZv^nY5=v@;2M5l2qyP5;7w z_bZXD4(zX4?ZkmzBW%0D!x7!mpND0BjMBRf*qTtUS047ZcE5J8{S{lj`R*UE-HxzC z4*#b_e)`2lK8(XVWvL&$eFZ`Am(0n*uy`+|TN@ zPHy6_tBWl@7kwcfRN}h!dq>$x?&u7Ew_j7!p-aD}c6h3h)Zs(@-75zsJEs&w zc!nXoPs`+HG=x3V^9VFo2K&*wc7s`4E&~)hxSw|+4mYXh)YyxzU-5Q!#@{d<3s0GA zl=OuuyI$?s`a_7B{e{lz=9<91LKn@~5gGb6>2EXX-K4(Bf;u7>%6z|> z;_8T8#1x|a`oE;%F~mh~Jtk7_XuvuD;UKui!pEZjp)$9W{B5B6PT9HmZ?QMajylyVZfpxhX-w-|DNqf#s* zsha^EWf@Lf+lbwClIFcS8iID4yB?Y(+fYZuD+_run-q-*v*gN@I$O#-nX=rLvRtMV z+fsruB}b)1b8uNeGP^}4MopN6{rOJorm=3Q!swQOA~Q1VVP^ovSYZpu}14ycC2EJ*4`CO=tB`X zGAg=-1owkrf61{_1p7+<&Pxq)4SXVeY)i?}O}8EuAt%zcO}GACght?Q!_i1*w%J2( z2LtG3qiJ8}!nw@TFTU`?3nvb?AJ`q$jkXbfgd9{AW=BgE;kIto1)R~(VUdJk)SdT1 zPHwvO#zc5oihZd834C z;@(JSR7#}se>PH$!Ej_8$t>RP-WVT$F4-tyxM7hI-Hw|Po4bBFf#Td-N)GKSIgUlx zvf~hrlT9`cA8tZy#f>G1-%@g7Q^|4E^9d2cs;cDpWYLbgQ6nSey#-xrXoG?}NwLio#0ThT%-naXd z%Q&=|EjKzb+`v*+&6m|<=EWy zat6B?E|_8X!*v{oC|Ot4;KhBv>b2f*6K?PY8=BWA`Q~0}&uCs}OP^cSFff5FqZh%l zrnYcPOLJ=|P~)v{!X3nLb*R3%$t$FoYl?Zgj&mn|=8h-jdyo}&qfgid*7Ml-$EByQL<2zZi>k!cTrF7P|-jGx*sr$725hKjA4&tuOmE(@DqfkXu^CW{RCk)Lg#;?eh{`I+<@>UggX$H zp$q&1;k7syKZLLuAz%D^{}GF2Agum07P}TsVe3*iQYI}q+gh*M7Kw3{o0c8g29(Cu_?fqXAgc~f%J?_;rt z5DJfLp2xi~B{}5WAZA~1#br4e<5Q7b2!9edjMI7HE8(ZViMm86iaf469dm{x6i0N& zis!n(UgB&(Rx5B;_Qk1)D{Uz}hZrxSU92hR0e|?@qJ2frQDY&Z=SBt!52rWJ+ zv%Xl9iew|X0eRoWssDqBi(<5j`KbwxuqaN^!y6J)bw~IX$2WE(xu~n?xw#Nan?3{@ z{gYUXI?#FHe~z@H;3MyMn>s^QvnsO0c@sE^pyO1-uFo0+hjn`rIO)LIYR7ThB}>fw zF=$7(AwScezeX8^`LmGUfqc1rXX@d2(xSf}`In;oHrnYO^)la!v|EthhWs{rKHJG! zr6grM1e`s4doqeVlZri4 ziaptjJ>L1A^r9|LYSBKAyJ)}1RrH((#-**@=nn_L3oOsO^A&7Ygv-C85FU4)<=@-l56fhTt(j)9cVT0;`KQ3co+V-NA;P->V=JebdVNvH zzkN5|P7v;c|2_Qs@Wg7lorYGZ>rt5g7 z>t5sz*Y82@2)!E5k@}zT9Hr+YceMT$JTK74g8zm34Tz7?zYF}adI4}Q(how)#rmyC z@#@(~8K<`Zb3D8dm*{UIB}2a-@d-NbYh0@D1?EKk8t|ETObpq{F~hi9ff3HVw1eZb7tUqtRSy$IWdK1(E#P*Q{yO;2)@ux6yvGMg-nkzp6-4HBAr4b zFv`76>MMaUZXYE$B;a+YP=r$g8Sb^@l^}sh?g$wqN??lnKBBp_45Vedz2ugpT?Qb} zJ&N4i8Wo=5evt~KN??|oXRgj+S^?4u-PaQsp$!I5?EVY6jnqa0nCIq3m~)ht4Q}(@ z`^jL8RtR8$J4~7h+8m^nx&IwW&Z*jB0F~}131mv(S~oAxII|>hy}OG*wghf;|As)0 zb`X4O+`l91T&Y`~`z>lPU7H7l29Zz$C}9wr(2!-!xG(8z2;9zxSl;A%a``@^BKfOi z@&lIKncPm)M_6!|a5;|xayiMv!#ZUNQrMuF$}v`^E;myriqsrn4LwMHvo)p<&0=v2 zReTfZoJBJ3a&lX8@NGaD_IIEp-bL}l{)oiHEiyV8)t1;UqbWcbbOCkp+zG7R@M&W3 zP7-_*N({P?Dd{cMLc5Mtk)XRUl%}_}2<>_WClL+;UZr3+U=O21Aw(7^MGT(@{@RTi zQWEq+APheR1g+X3IgTR*qs7P{K@;F$VEEf4Y0Q-*Hv(hiUPQI;>(YD}aJj{-?HKha z8GTiMVgmkfpAN=r)O{b9^+iOQ7>o%RO+_Ak5re+_y;Q!&F z-K6gT7ryGW9T)zL%nojIp;pH-LC2Ur<~}gg4zX~K?ZGj8H)-!N1DwVTr6TVSmQVxu z63gXevBpAMq5W00g zbTx`O)L7$CqZm*)d?As;m%|~4FNYfF9BLGEs6o)_yc~!LZpd+rcie%v)7gq=VmVUu z3>lrkXbuaUn80X(j9$;^6^su0fW>;E2+<&BIGllKJ6xs6*X}%un;>m6VK_=P7$=QL zBv;3Fk<=hjNaxsoeR93f?o#pQFZtD1Nv>A>M3gtp@~3#Y{3 zHDoza<|~S|LwJi)TcGk9hHwU`m8!fo!u1)AbJan#s2s`dV{$|1yo!pjnRsp|K>@3n zhbP(&Wu*ecN=O;1P4J{8>z)feL$zUvsc7#Gr>1+ZN={BLO}jk#iexPfbumfko-vpn zIx|Fa@>M`by^cT{5lVrOXr!Z24@vRFFw97RT$PYE4uwufs!J(4d$a@R zTEp#VOc)_q!udum(2yTo5O>&@e@^h?A{U z5|4?iLE^C%aU2b^sW|b((Y?qoPOvOUa_@kMtn&eCI9`i-yyBc@jU^b0S$0i~YpU!z zD6Z?o(Wa&Tg_d#+s0NEW82TF3Kz);XtDkIG5>>}sx1Ehm02vL5YeQ6z9o4cB3eH)A zL%c;3XrFn8;3+@*g)X9Hh1*)?N2_Y9tFt!D$oJ>xsgGApt!)Zt6=c;nRX2od0z%>$ zK-TK|P+R|$tkA}mK<{)R0z8Ocjf41gjhWR@0AFIN!Kr;F-aJ^bkpNMQ$N2bCeY1+r zD=jNQ3_A0(PE5qm+_tgJA82iDz(6Hccra>q0&|y zU3tJU1tmtL+c7cisP4XYyOq204L$kVKY$P%4y;7MRywW#OGgGos>gh(ntCpf@pAcG zET1_nrJN}^SD%ZF-&@96bW`XN5R796+ z(i`8dM@@{!zj63Cex+;DiWQC|bnmy(8ytfDZQu@n`d%IHu;EaBL!0We;U;vu8uUB# zS$s~dxh3SUZpIB6*>l6pOIGNg2gAKImV~yLuR?wp}cxIAG%vrbQvv>7{t@DEzyP6A zzSv(>T#OH_H3x(KkN{X#$>-9_ifhU%kWpR7Pq>BS7qCRNy!gXAK-O(9Qp~R`5$l^< zYj6QewBbW=;O1|u!=0_w;UM#U6$?tPWu&5Vse%_Toi9H+m*bzt56@v#;-}rp{UGqK zu4)SqYw@x&21_f8=B$7KL>J8|p1VLPVcrpAa+%6qQeG+W-MCt>d~m^xyrRnT3W-x( z#6p!WUTnib(duiP&vV{hP)?6%=xlO%qgv;b!h^=S^O;x;Wi1$@B8^l6mJ^#s#&&<(!R;_xRRGY16o57(Z+}B`^;)Aga)iH; zild;YBdMWLW%#sVytJ$#?X1&ZIh7<-1NQ1G+s#Ha2 z8!C1!lqMG{#OgMz#oUF9Wo@!%0F@Zcsj;ecZ2%3frMb=iaz-I!MjLU-(#P{ElJ1@H}Ol3ImBI3a&?*TuM6>Winiv*ROA*f^GPg(im}z(jB&uI zKUhPK3Lx>7`%J??JF^~;vGkfE$z(~%e95|W>D(d?Bu#-0P>Hhh^VCQKdzj{Iqs>_( zS#`~gfvnZMOqf+1Xj_XhGRwMy2=bPynrSLPH51BJL7obxOM|NhNp|=QsCVwPX=>Zm zJGC)42aiy=DR519SBM<%c+ zUtUrnLV?B>j;G3q%Z+-G=9k?pKKROyY_g%La+^cv(q(f2RC$2`=)x_XpW)L`gqR0wr}4FdV~>@DUL)O@2M4+CG0qiKzHZ2L#14h(mJB1S%RE(_H&hZOVX*Y>Eer#7L0i=+!hPQ6c>)? z5OnJ6pXwY!!B~gE@qB_#m!}lCv#7`bV_O97rxuJgCmi?4=yZIwmyYKXbhgt3Hy+n<>%H5cQ)vVzY(EnFAW=z-<3J)LHUm$`iiP{#603rJTFw$F5#cy*=~cM z1pKxQej2bp2@mN!;@1ctx50Y>=c#6bm`8Nu`CS|Q65#Qw*~t9Y@Z4mB-vo>e4#Rl_ zC#E;q;Ddk@Xf)|O;=d8r+TbIAPubv)0EbkwL(C(NX@-wwFP2HypE zh1D%R;%>m*Hh4SWnLK8c&Lh49c&82i9^hQ7+j`_3>RW8^kC6YK4gLw>B|M}x_&pAI zmks_o;LmI@zgp0QPluZLzXJTO4ekOw&TC|&ex3)s#s_~lsv%Z_^x4mzY?%HzA@hi*nEFrTT@gs-x&Wj z{FTKp72?dF3;0Hef(OC>#u8qbL3mdw;0WkB{UxVHM!_*EIWU8=A3&>#xDOqRn3w-XN-*8(SIz zn2l!^Xo7CfwM#5hOMU+XD5WUZ~cbT`o^D z%W|d(JaYNS<6}A>`Fs@cF@ukpc;sgDLFC*VK1h*Eid<6Uk|LKBxunP?MII^gNRda1 zJW}M5B99b#q{t&h9x3ujF`X3CNim%i(@8O%6w^sDofOkaF`X3CNs&*Ad{X3-BA*ob zq{t^lJ}L4^kxzH-f^%pk=KQp_O5 z3{uP>#SBu+AjM2l%$(MLedPDgt0-Dr!lk|+I}g2U2m3?CE0z>3E}h#u2kXyPE|jr! z^_MI#I4mf}uEPAX@;OCi{_=VAmX=idu_J~}7$C}@Tc~ae%XVU0)eW#2!(EHQLi3jx z&i0!NIK{}svd-U9?GM$3o7QHo-XL)9jqL{Wk1^GTk9|?8mVy32O;xDM_<@MHz-a=< z`u0Vm-``J0%?4|WqxTO>*x29~Bzi3()e_RS3FoJH^>Yz0P_N&P;LlpbS-}MUnzm+t zT~$*Je`f-VXt_V8egcEPdtt{_KYn3P>Gxw7_Dop;)<&3IoZGW)HOFpi?$*hl+=%00 zPzbj8>(;B^--xGE^VMx_Mj_P}K!0miZLln5nzh%~A+B9W<8gT&Z!ht!1#^Q;?!Ec_ zm5b+^jhVmJG2l;d^x2#cnQa>zvF(H~)T+WdGlu<#Kx>Q0Y{FhkX3?C|siCS`1Hz$M z=IU^LL(SCs8j(q;uBxq0WY%nK0zVaE_f6*DPm9~|*TB61Kk`}w4a8TGmWGhXly=TU zG_$rDV2E2%nH*k$(=3~8W}wa(Q0r>I!h{s58d(*E8Ha$X#`OZl;t_WV zJeRw~djUA~A0o~v7@`s{72$GtPGyM4{Tlk05jP!i>284M-B04(4FY;DFHE^ir(X-t zyP}N$6gc#Sh}-1?6gR_jIZwPJz@aZh+~mhHaC;yEPrNzs+z+B(fH?8ETr~0SMx44* z4(AQ@mmqFB;?dm&Z{j_KMCoOYdeA1sy$9aJD}*q5=9!MV(SHx##N+&o{+8<57@=X1HY~ax@oZr!x5-^;J_c&n6WtROnp$s&O-!E-=az86m;7X^76_>jo zN!+er7S}cWtte9#u^Ff5J_)xmh}Q|c&eP!i3HhuG;&I)?-@f|9NJAib(SF~7XE~%? zte2jhjq(6Cohdhp1QSor^9z-}c09)a3QxY|=k)=nknM_;%6X0OC_<)Y8!+)Qj5q`4 z(VsLz1k&Xcs&;CC7UyIj6W?^Lg+km>b!n3c@cBXT##uXW~Y15Gp9k-tB Pcw=jE1=q|(o*Dfgs^Jud diff --git a/disk-images/eightball.d64 b/disk-images/eightball.d64 index 772ca5d1668b47a69d23cf9644fda865e2512c49..cd96f39ca6ecb3d6879dc70541e39ae8a372d87f 100644 GIT binary patch delta 18590 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 delta 19551 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 a5L5h4EvZ);JD|Cl`^aK)!M;8JoBtoacIsaM diff --git a/disk-images/eightball.dsk b/disk-images/eightball.dsk index c8f20392ac2fbb166bd681c11061861644355d5b..bf69b707dce8f1bd6f103c660866a0699fb10f0d 100644 GIT binary patch delta 10468 zcmb_C3wRS%x^t5BLE6$3TANZHQ=oyS@6PZLT(Ll9jL+g2lG158TVPD!QGD-Y6<^)hl;hSn+z@ta?E}?fuW>(IjnY z^`p}Hr*qEv->-9yj+3d5lc~LP^eE-vT>Y<-nL~t$xHyM+c_Ecc5T6hve$f#{n`<`T zwEpI@<*Nzp$Dk6~#QTNeX|E94i;kFET~$+7z2&xzH5x?tAB_e~U%?)FYtl*3* zR{mj}6*^+^&FgD!sR90Pzj<@bMuIRrN9YN&KC(U}r}sPKwHaZ_!#v!W)*AT|nse~; zw8p=nr3df-qD{vPH+zg0k9q63UaEE0%l?L00raW)-ghW=pYz^#DYiSbN+cv<`5DxU66i4# z6HHvdHewFhZDUaZyLcqTa6iX#%`G8@6e7Y=d!vAyZH;5(VA$>izT%LDq<>9-bz|5` zAlld*=1dn65@RxJeC_Y!+8Z$f9g9e)`=v#+@u^NV%O`hj;PJg9)U{xQNPpqvV0 z6BS_RJO27FvQ-km`W&?Yz@8j+J^(dGT>#)>j=B)QKVP91 z0yuVsY5}k+S6u{Pf3CV1K(1LW0&u5UwE|GhYB7K%d1^^Oztq+tjyz6w(&UjUGTS1~ zR#M43EG3PDLwP{>M-?@71i7lL@>FFKk<@p)y0m6~O?v$+cjjJ8mO6aoA^XH*e@uZ^k> zz=||g55S$K8UXw?O-%w&maZlPXiQgA0HEUszdNr_VkRw6idLZfmo89ReM(4LQ^;B7 zdM2SB)?#Y@2Anj1d@}n1rI(4;UJ3GClw@oPj!jqLLjU6`N~5O9`1;3KJQ)8a3*Z#R zi8GWm#mdNNg$0+bs7$f7V>Go-Qdhu#BeiEj-NBqg79pM%6KMnDdaKJr?B^v3#A0Yg z+9W1KYHHl)R85TVM`~)cvy5{yP*vsSCl>80M`9)-($w_Ptrpe-?r!81qz|cOs_wr0 z6jZTOu&WF0-Qr#UM+FcQw;!1p;i!8@wnw-^;mu`eBQilh3oaKsKg9Ov3SBRQhPCYu z?leMXi4y}fg`=gPYj28{jqxUglZv^%lkIfYcd=dCY(-)fg<$=?A^yIXw)om?G>0Nq~z0`a7NGt_!4&2(REBY zNW_6e(JkP(-ISu);ZlnHfqD#Cvr}e5hKXhd&5$AX$3|(C>+t5&Fi}2_%CC{Rg!tv* zvaFvJ(}WrWVP7fc0VWK+O zgp5qWtf|!OKP2=eaa5?~so#`N*o{owj2Lj6 z#MeEHgy)6X$ZlZZ&&#X(kH+YJJWFA%vSL5SupMBdfz-$$X=slaIkAJ-2%k*jxoiha z9OF4r(`%u;aNy;LubY>zp5|T_pz|M%2#zg#@TuMizM}VDL z7rRZ0bOxb<)+lvCVrM&hb+2_XxGIm=5=3WAEL%jKm(b>d0IDs z*T$U{YnD6R8Pwy<-xbrGBvdOVa-t6>d(pU^$anB&@6b5YuyLY?5O6v;E~3$}k2FrW z+hlML*T(sk6x+6PA(M1l%|iMEj#}r?0}g)!`L>nyHSak|1oBlPkSk=tI9?6Mk5EML zG96wvlRRFojhX9xEa$A>1Dy|^O0KgMa<$IF7Jq{lwe0R@UL&4?>C|)VPUq(O7Iv59 zllPDhS_D1$s74PI?DO~g1S3gRV&B-g{FJX&+I4CV;7P^bV4HxUn(RD7c$Nt%fG+f2 zEKGxU{;n#N%dEAMYZhx`8X{@8hJ^<#u2$OZp_L&~PhLm&ete*fZuUs+drIgcGC0re zqD7rT>~+(_rVC0y)WICjv|7nS-d5TW=$AZuifP}54dh=IiG;g_wkyP+%4pk~#V!}E z92Jr6I$9xMY7b+jgZejj4%kIPAhH~+XULi5@Jk-snL@GZqu*1(X~V;TbIJ^nupfSk zf+t8yc3U)EfXusPUK3s31wcsea|~rU#T--R1nTC8*T<_xDm6 zg@D6nv(?sNHLoApifWzkB>W9_4t~hbpaL8!rh}#-_!%TUUnxoCudTM^LSL;?D$?Y& zR*(TOAONC)^p$ouux-A;2jneQwjCbizby(-l0$wJbm(@|QhSjpSSqF-uA}$1f)&mw zgN0%WHbb7eE|3btj$o#;4lK~sR!iPk+F;vP*wqGB;5}Q=tctS~xK?-1IjX*;H~o$C zaFT!Y8_JU$G$@4Me&8(C>^yLeYTmx%Eaf^!*#?Te_n#m$9xm>4x-L>2JTFk*Cr_A7 z!}!a$)DS$sqin;)eEDW{^#a!I43;&wf^HN--WIg59>H`iDAHpz*EhoLpojJF`<9{G z`B_`gj4V)$!3K{c{78le|C23fKEGip+LU#HVx2t~DR#Tf3}+F2&gI^#KP)wVOG(=? zy=RN~|5}a~diQ*opSib4!kmN#_7?Fa%TQs;1^o9#if_FI)og&lR#;^plKQwJ9rmTa zEeaao-4K3H0Sa&#Wmin(bA`%?Uvsw1LI~t_yRD?q`@4^dnX^=&{*7}~ zzz%fJVmjxjo^L6Z%lM88uI~Ac!W)}DxDMs~Lw#I*3!Ym1IV`eB9G>3-^Mxd+3|JBl zAm$#{22wz`z%zsl*XD$O_8w5e4y*)M(vH9^0S&b|2a^IT&r42uJIr-oq+q2R1cM!? zyC^l7(dR2V*XA1%i9VmBy59$z1Vu;g!tRB=p8Q8Se{=<+Z4eLao(9`5tsvZVHMQ4h zG+uQ zoPD-Ae0E_qSTT}7i;$-1WKi_^HZG)e2yY;o><{P_1fdTyeoq}3p@734fdmf5f=tnCR0zl^;K&LAo(y5LegwxCM3d?z`Ay2RsTQDaCgyVG; zBuED-w+IE3;h7vv5=Wel&3!)G4OUp_YN1#7?E>ic%Hvefh(p{Q_}W%i;WKZ2PozBP zQ@iUi+Rf1d;*Va1Xm8I;DK~&S*?w&m2q!3Q2=1v2kzgS^jT z77PzKppromWVK>vd)NvTdWb41NWhT#M8Mc%8fcjqiM<7Y5fF+n=r5vsWjUwSm>vup2e8eKuIpC&H zsDOkF%xfGd3o(9>8gv^~F8({DUM6h;xx-2tDIu`Am2`<(89B|A8->?Qp$YoVPa~dSIB&7_C6B0R_^K!xD61LgQ`Q~8@%MFtyi z50?xE4E16*Aq~gbOUJU;xvlL!yfyXV?q&!Qc=(l!>(RtYt?PNvf_qMFaby*4hT!w= zN>l(fwH7-NyRF~BHa0+jd9Q!Fl0UKu%_i$BdT;U{f;J8XYn>HI!m#b33P>L-cr6P?-+kZ&#tk@)~4F?~?a*KizZSnclwsgK)$CwOoq~^v+C2!V>n0rYAMHyNOo_;T@KDU60nHrTp91qq5x_(H;7ql@i{;GkMH= z)CuZC>i0DMj|l&`UUhp6r`)F-xxg1J2Sq*9Q~uc+d3!bbb{H}g?l%VjvTm*6B9B#S zB?6oIF3rrk;1*}aLTvDBf;rH)D{pBPyLYYfW?txRB~*Rkb#MdODQ$PR(=IRV-EngM zvON{B;Ylt8Q{r&hq;=<;!ri&@7|SU%&imaW5j3`OLxGE@TZRK?2Xp!S`_MxEsa2>% zcc+zqV-;FB?aqiB@fTL1YjkG{y+=PTO4?lx-17Hk>Xyi>5#qD2LbLhV)#$JC%_vF! zDMIp%@Ov9dmTv%f6GGlskC}MWCKQx!M>^fJ&w~Se|J>c^u2fL1{XQhfc9?gUwg&NS z#b_pPnuZK~ZXG%!{|idbeBs4E{`=uS4Gg~Y@+(JPeeKV%{2%iDF#R_`{FO44&*wjY zPRZL)y6k|j4E#32@1ro<){9D>FY%&x(q;|~zkc+MH~%B>*4xM4dH22J@1OY34*=2s z%B?W99j5l|N2Ppe8#*R;qIAB}kIcMTK%dG_!MF(H4@+ncKc@qIBKM&b`9+Yl7rwr= mALa4SbRiS}I|Y{gPdiHEuXzRy$^$4@egWyUlZX@O*8c~3#L>S1 delta 10080 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 q*e~Gr()mn{= 1 */ #define YREG evalstack[evalptr - 2] /* Only valid if evalptr >= 2 */ #define ZREG evalstack[evalptr - 3] /* Only valid if evalptr >= 3 */ @@ -213,7 +246,7 @@ void checkstackoverflow() void unsupported() { print("Unsupported instruction "); - printhexbyte(memory[pc]); + printhexbyte(MEM(pc)); print("\nPC="); printhex(pc); printchar('\n'); @@ -221,20 +254,26 @@ void unsupported() } /* - * Fetch, decode and execute a VM instruction, then advance the program counter. + * Fetch, decode and execute a VM instruction. + * Advance program counter and loop until VM_END. */ -void execute_instruction() +void execute() { - unsigned short tempword; - unsigned short *wordptr; - unsigned char *byteptr; -#ifndef __GNUC__ - unsigned short delay; + unsigned short d; +#ifdef DEBUGREGS + unsigned short i; #endif + evalptr = 0; + pc = RTPCSTART; + sp = fp = RTCALLSTACKTOP; + + while (1) { + +nextinstr: + //print("--->PC "); printhex(pc); print(" eval stk: "); printhex(evalptr); print("\n"); #ifdef DEBUGREGS - unsigned short i; print("\n"); print("--->PC "); printhex(pc); @@ -247,7 +286,7 @@ void execute_instruction() print("\n"); print("Call Stk: "); for (i = sp + 1; i <= RTCALLSTACKTOP; ++i) { - printhexbyte(memory[i]); + printhexbyte(MEM(i)); printchar(' '); } print("\nEval Stk: "); @@ -269,22 +308,22 @@ void execute_instruction() #endif printhex(pc); print(": "); - print(bytecodenames[memory[pc]]); + print(bytecodenames[MEM(pc)]); /* TODO: Should encode immediate mode as one bit of opcode to make this more efficient */ - if ((memory[pc] == VM_LDIMM) || - (memory[pc] == VM_LDAWORDIMM) || - (memory[pc] == VM_LDABYTEIMM) || - (memory[pc] == VM_LDRWORDIMM) || - (memory[pc] == VM_LDRBYTEIMM) || - (memory[pc] == VM_STAWORDIMM) || - (memory[pc] == VM_STABYTEIMM) || - (memory[pc] == VM_STRWORDIMM) || - (memory[pc] == VM_STRBYTEIMM) || - (memory[pc] == VM_JMPIMM) || - (memory[pc] == VM_BRNCHIMM) || - (memory[pc] == VM_JSRIMM)) { + if ((MEM(pc) == VM_LDIMM) || + (MEM(pc) == VM_LDAWORDIMM) || + (MEM(pc) == VM_LDABYTEIMM) || + (MEM(pc) == VM_LDRWORDIMM) || + (MEM(pc) == VM_LDRBYTEIMM) || + (MEM(pc) == VM_STAWORDIMM) || + (MEM(pc) == VM_STABYTEIMM) || + (MEM(pc) == VM_STRWORDIMM) || + (MEM(pc) == VM_STRBYTEIMM) || + (MEM(pc) == VM_JMPIMM) || + (MEM(pc) == VM_BRNCHIMM) || + (MEM(pc) == VM_JSRIMM)) { printchar(' '); - wordptr = (unsigned short *)&memory[pc + 1]; + wordptr = (unsigned short *)&MEM(pc + 1); printhex(*wordptr); printchar(' '); } else { @@ -317,7 +356,7 @@ void execute_instruction() #endif #endif - switch (memory[pc]) { + switch (MEM(pc)) { /* * Miscellaneous */ @@ -330,7 +369,7 @@ void execute_instruction() #ifdef __GNUC__ exit(0); #else - for (delay = 0; delay < 25000; ++delay); + for (d = 0; d < 25000; ++d); exit(0); #endif break; @@ -341,7 +380,7 @@ void execute_instruction() case VM_LDIMM: /* Pushes the following 16 bit word to the evaluation stack */ ++evalptr; CHECKOVERFLOW(); - wordptr = (unsigned short *)&memory[++pc]; + wordptr = (unsigned short *)&MEM(++pc); ++pc; XREG = *wordptr; break; @@ -358,52 +397,52 @@ void execute_instruction() printchar('\n'); #endif - wordptr = (unsigned short *)&memory[XREG]; + wordptr = (unsigned short *)&MEM(XREG); XREG = *wordptr; break; case VM_LDAWORDIMM: /* Imm mode - push 16 bit value pointed to by addr after opcode */ ++evalptr; CHECKOVERFLOW(); - wordptr = (unsigned short *)&memory[++pc]; /* Pointer to operand */ - wordptr = (unsigned short *)&memory[*wordptr]; /* Pointer to variable */ + wordptr = (unsigned short *)&MEM(++pc); /* Pointer to operand */ + wordptr = (unsigned short *)&MEM(*wordptr); /* Pointer to variable */ ++pc; XREG = *wordptr; break; case VM_LDABYTE: /* Replaces X with 8 bit value pointed to by X. */ CHECKUNDERFLOW(1); - XREG = memory[XREG]; + XREG = MEM(XREG); break; case VM_LDABYTEIMM: /* Imm mode - push byte pointed to by addr after opcode */ ++evalptr; CHECKOVERFLOW(); - wordptr = (unsigned short *)&memory[++pc]; /* Pointer to operand */ - byteptr = (unsigned char *)&memory[*wordptr]; /* Pointer to variable */ + wordptr = (unsigned short *)&MEM(++pc); /* Pointer to operand */ + byteptr = (unsigned char *)&MEM(*wordptr); /* Pointer to variable */ ++pc; XREG = *byteptr; break; case VM_STAWORD: /* Stores 16 bit value Y in addr pointed to by X. Drops X and Y.*/ CHECKUNDERFLOW(2); - wordptr = (unsigned short *)&memory[XREG]; + wordptr = (unsigned short *)&MEM(XREG); *wordptr = YREG; evalptr -= 2; break; case VM_STAWORDIMM: /* Imm mode - store 16 bit value X in addr after opcode. Drop X.*/ CHECKUNDERFLOW(1); - wordptr = (unsigned short *)&memory[++pc]; /* Pointer to operand */ - wordptr = (unsigned short *)&memory[*wordptr]; /* Pointer to variable */ + wordptr = (unsigned short *)&MEM(++pc); /* Pointer to operand */ + wordptr = (unsigned short *)&MEM(*wordptr); /* Pointer to variable */ ++pc; *wordptr = XREG; --evalptr; break; case VM_STABYTE: /* Stores 8 bit value Y in addr pointed to by X. Drops X and Y. */ CHECKUNDERFLOW(2); - memory[XREG] = YREG; + MEM(XREG) = YREG; evalptr -= 2; break; case VM_STABYTEIMM: /* Imm mode - store 8 bit value X in addr after opcode. Drop X.*/ CHECKUNDERFLOW(1); - wordptr = (unsigned short *)&memory[++pc]; /* Pointer to operand */ - byteptr = (unsigned char *)&memory[*wordptr]; /* Pointer to variable */ + wordptr = (unsigned short *)&MEM(++pc); /* Pointer to operand */ + byteptr = (unsigned char *)&MEM(*wordptr); /* Pointer to variable */ ++pc; *byteptr = XREG; --evalptr; @@ -425,14 +464,22 @@ void execute_instruction() printchar('\n'); #endif +#ifdef __GNUC__ wordptr = (unsigned short *)&memory[(XREG + fp + 1) & 0xffff]; +#else + wordptr = (unsigned short *)&memory[XREG + fp + 1]; +#endif XREG = *wordptr; break; case VM_LDRWORDIMM: /* Imm mode - push 16 bit value pointed to by addr after opcode */ ++evalptr; CHECKOVERFLOW(); - wordptr = (unsigned short *)&memory[++pc]; /* Pointer to operand */ + wordptr = (unsigned short *)&MEM(++pc); /* Pointer to operand */ +#ifdef __GNUC__ wordptr = (unsigned short *)&memory[(*wordptr + fp + 1) & 0xffff]; /* Pointer to variable */ +#else + wordptr = (unsigned short *)&memory[*wordptr + fp + 1]; /* Pointer to variable */ +#endif ++pc; XREG = *wordptr; break; @@ -449,39 +496,63 @@ void execute_instruction() printchar('\n'); #endif - XREG = memory[(XREG + fp + 1) & 0xffff]; +#ifdef __GNUC__ + XREG = MEM((XREG + fp + 1) & 0xffff); +#else + XREG = MEM(XREG + fp + 1); +#endif break; case VM_LDRBYTEIMM: /* Imm mode - push byte pointed to by addr after opcode */ ++evalptr; CHECKOVERFLOW(); - wordptr = (unsigned short *)&memory[++pc]; /* Pointer to operand */ + wordptr = (unsigned short *)&MEM(++pc); /* Pointer to operand */ +#ifdef __GNUC__ byteptr = (unsigned char *)&memory[(*wordptr + fp + 1) & 0xffff]; /* Pointer to variable */ +#else + byteptr = (unsigned char *)&memory[*wordptr + fp + 1]; /* Pointer to variable */ +#endif ++pc; XREG = *byteptr; break; case VM_STRWORD: /* Stores 16 bit value Y in addr pointed to by X. Drops X and Y. */ CHECKUNDERFLOW(2); +#ifdef __GNUC__ wordptr = (unsigned short *)&memory[(XREG + fp + 1) & 0xffff]; +#else + wordptr = (unsigned short *)&memory[XREG + fp + 1]; +#endif *wordptr = YREG; evalptr -= 2; break; case VM_STRWORDIMM: /* Imm mode - store 16 bit value X in addr after opcode. Drop X.*/ CHECKUNDERFLOW(1); - wordptr = (unsigned short *)&memory[++pc]; /* Pointer to operand */ + wordptr = (unsigned short *)&MEM(++pc); /* Pointer to operand */ +#ifdef __GNUC__ wordptr = (unsigned short *)&memory[(*wordptr + fp + 1) & 0xffff]; /* Pointer to variable */ +#else + wordptr = (unsigned short *)&memory[*wordptr + fp + 1]; /* Pointer to variable */ +#endif ++pc; *wordptr = XREG; --evalptr; break; case VM_STRBYTE: /* Stores 8 bit value Y in addr pointed to by X. Drops X and Y. */ CHECKUNDERFLOW(2); +#ifdef __GNUC__ memory[(XREG + fp + 1) & 0xffff] = YREG; +#else + memory[XREG + fp + 1] = YREG; +#endif evalptr -= 2; break; case VM_STRBYTEIMM: /* Imm mode - store 8 bit value X in addr after opcode. Drop X.*/ CHECKUNDERFLOW(1); - wordptr = (unsigned short *)&memory[++pc]; /* Pointer to operand */ + wordptr = (unsigned short *)&MEM(++pc); /* Pointer to operand */ +#ifdef __GNUC__ byteptr = (unsigned char *)&memory[(*wordptr + fp + 1) & 0xffff]; /* Pointer to variable */ +#else + byteptr = (unsigned char *)&memory[*wordptr + fp + 1]; /* Pointer to variable */ +#endif ++pc; *byteptr = XREG; --evalptr; @@ -491,9 +562,9 @@ void execute_instruction() */ case VM_SWAP: /* Swaps X and Y */ CHECKUNDERFLOW(2); - tempword = XREG; + d = XREG; XREG = YREG; - YREG = tempword; + YREG = d; break; case VM_DUP: /* Duplicates X -> X, Y */ CHECKUNDERFLOW(1); @@ -538,7 +609,7 @@ void execute_instruction() ++sp; ++evalptr; CHECKOVERFLOW(); - XREG = memory[sp]; + XREG = MEM(sp); break; case VM_PSHWORD: /* Push 16 bit value in X onto call stack. Drop X. */ CHECKUNDERFLOW(1); @@ -549,11 +620,9 @@ void execute_instruction() printchar('\n'); #endif byteptr = (unsigned char *)&XREG; - memory[sp] = *(byteptr + 1); - --sp; + MEM(sp--) = *(byteptr + 1); CHECKSTACKOVERFLOW(); - memory[sp] = *byteptr; - --sp; + MEM(sp--) = *byteptr; CHECKSTACKOVERFLOW(); --evalptr; break; @@ -566,8 +635,7 @@ void execute_instruction() printchar('\n'); #endif - memory[sp] = XREG & 0x00ff; - --sp; + MEM(sp--) = XREG & 0x00ff; CHECKSTACKOVERFLOW(); --evalptr; break; @@ -588,11 +656,9 @@ void execute_instruction() /* Push old FP to stack */ byteptr = (unsigned char *)&fp; - memory[sp] = *(byteptr + 1); - --sp; + MEM(sp--) = *(byteptr + 1); CHECKSTACKOVERFLOW(); - memory[sp] = *byteptr; - --sp; + MEM(sp--) = *byteptr; CHECKSTACKOVERFLOW(); fp = sp; @@ -624,10 +690,18 @@ void execute_instruction() break; case VM_ATOR: /* Convert absolute address in X to relative address */ +#ifdef __GNUC__ XREG = (XREG - fp - 1) & 0xffff; +#else + XREG = XREG - fp - 1; +#endif break; case VM_RTOA: /* Convert relative address in X to absolute address */ +#ifdef __GNUC__ XREG = (XREG + fp + 1) & 0xffff; +#else + XREG = XREG + fp + 1; +#endif break; /* * Integer math @@ -758,12 +832,12 @@ void execute_instruction() CHECKUNDERFLOW(1); pc = XREG; --evalptr; - return; /* Do not advance program counter */ + goto nextinstr; /* Do not advance program counter */ case VM_JMPIMM: /* Imm mode - jump to 16 bit word following opcode */ - wordptr = (unsigned short *)&memory[++pc]; + wordptr = (unsigned short *)&MEM(++pc); ++pc; pc = *wordptr; - return; + goto nextinstr; /* Do not advance program counter */ case VM_BRNCH: /* If Y!= 0, jump to address X. Drop X, Y. */ CHECKUNDERFLOW(2); if (YREG) { @@ -772,9 +846,9 @@ void execute_instruction() ++pc; } evalptr -= 2; - return; /* Do not advance program counter */ + goto nextinstr; /* Do not advance program counter */ case VM_BRNCHIMM: /* Imm mode - if X!=0 branch to 16 bit word following opcode */ - wordptr = (unsigned short *)&memory[++pc]; + wordptr = (unsigned short *)&MEM(++pc); ++pc; CHECKUNDERFLOW(1); if (XREG) { @@ -783,35 +857,35 @@ void execute_instruction() ++pc; } --evalptr; - return; /* Do not advance program counter */ + goto nextinstr; /* Do not advance program counter */ case VM_JSR: /* Push PC to call stack. Jump to address X. Drop X. */ CHECKUNDERFLOW(1); byteptr = (unsigned char *) &pc; - memory[sp] = *(byteptr + 1); + MEM(sp) = *(byteptr + 1); --sp; CHECKSTACKOVERFLOW(); - memory[sp] = *byteptr; + MEM(sp) = *byteptr; --sp; CHECKSTACKOVERFLOW(); pc = XREG; --evalptr; - return; /* Do not advance program counter */ + goto nextinstr; /* Do not advance program counter */ case VM_JSRIMM: /* Imm mode - push PC to calls stack, jump to 16 bit word */ - wordptr = (unsigned short *)&memory[++pc]; + wordptr = (unsigned short *)&MEM(++pc); ++pc; byteptr = (unsigned char *) &pc; - memory[sp] = *(byteptr + 1); + MEM(sp) = *(byteptr + 1); --sp; CHECKSTACKOVERFLOW(); - memory[sp] = *byteptr; + MEM(sp) = *byteptr; --sp; CHECKSTACKOVERFLOW(); pc = *wordptr; - return; /* Do not advance program counter */ + goto nextinstr; /* Do not advance program counter */ case VM_RTS: /* Pop call stack, jump to the address popped. */ CHECKSTACKUNDERFLOW(2); ++sp; - wordptr = (unsigned short *)&memory[sp]; + wordptr = (unsigned short *)&MEM(sp); pc = *wordptr; ++sp; break; @@ -835,15 +909,15 @@ void execute_instruction() break; case VM_PRSTR: /* Print null terminated string pointed to by X. Drop X */ CHECKUNDERFLOW(1); - while (memory[XREG]) { - printchar(memory[XREG++]); + while (MEM(XREG)) { + printchar(MEM(XREG++)); } --evalptr; break; case VM_PRMSG: /* Print literal string at PC (null terminated) */ ++pc; - while (memory[pc]) { - printchar(memory[pc++]); + while (MEM(pc)) { + printchar(MEM(pc++)); } break; case VM_KBDCH: /* Push character from keyboard onto eval stack */ @@ -862,7 +936,7 @@ void execute_instruction() case VM_KBDLN: /* Obtain line from keyboard and write to memory pointed to by */ /* Y. X contains the max number of bytes in buf. Drop X, Y. */ CHECKUNDERFLOW(2); - getln((char *) &memory[YREG], XREG); + getln((char *) &MEM(YREG), XREG); evalptr -= 2; break; /* @@ -873,17 +947,8 @@ void execute_instruction() break; } ++pc; -}; - -/* - * Run the program! - */ -void execute() -{ - while (1) { - execute_instruction(); } -} +}; /* * Load bytecode into memory[]. @@ -892,7 +957,7 @@ void load() { FILE *fp; char ch; - char *p = (char*)&memory[RTPCSTART]; + char *p = (char*)&MEM(RTPCSTART); pc = RTPCSTART; do { @@ -913,7 +978,7 @@ void load() } while (!fp); while (!feof(fp)) { ch = fgetc(fp); - memory[pc++] = ch; + MEM(pc++) = ch; /* Print dot for each page */ if (pc%0xff == 0) { printchar('.');