From d4bd5302f7d3ff4e68af3e0b6491353c45e0340d Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sun, 24 Jan 2021 10:14:32 -0500 Subject: [PATCH] Refactor loader, expose disk access to game code, show endgame screen * each build now generates a fresh NeutTower.dsk * VM from initial loader is now used directly by the rest of the game --- NeutTower.dsk | Bin 143360 -> 143360 bytes asm/asm.fnl | 4 +-- game/defs.fnl | 37 ++++++++++++++++--- game/disk.fnl | 94 +++++++++++++++++++++++------------------------- game/gfx.fnl | 19 ---------- game/init.fnl | 5 +++ game/level6.fnl | 5 ++- 7 files changed, 88 insertions(+), 76 deletions(-) diff --git a/NeutTower.dsk b/NeutTower.dsk index 47982632d189e8b108ec87351f36bd24faa5c2e6..fee182453dc651b006a8fbf0f574b6496e5d0e87 100644 GIT binary patch delta 17833 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 mix%I%q;hH1vInXkTwb$cW$iV?W;)u delta 18748 zcmZWR4M0>?*7wZ}KQk~efIs7JFEtfYM3;{=4+ABz;|~G@u^}f@7pE-NCqylZ z&qzo}1&IHHB#aQY_Q$|kGRCiVV$f#~SRa>J;0^2n1j#Bm|EGgTYh_$ zGRFER!|UoeWpa`3TvC#bovcgaRwZrLm2(r4pWzykVmObdj+>agg`>zAj*y^aZWqFPu-_O5cU{ydyja0y`6yb0B$FxL}p&MQ+FMH|0>P@PSS0iFLaxMUPdzF z%DMMp$Dynx zNslM(1Q}mSD$-GZ&#Ix-J%U*_Vj!+nT84+9Wp^C@xLq9om7r?E2f9__P#Tboc`xHGa(^0>w3wF&5Xk4tZ`d<>T{ zZl5j`bdfP0cNPog!QNtk#&9}cZ#Cu-A(9V8BuGAVSU0x6f73h^$+sT}=+;Pfg8!nk z#l%a5=+T$J6cgg=xRLQ&I5b3mznwHk^5sU}%S{2%N|cw5hB!o-HO(L?-8eB^X1sUn zpmp4!A@9D$?oZIY4SV&@?zKC+*P)w7cOkDs=0CiBb9%FRX|p*4=QJ;(&xQ24m_C=_ zlT1!`7S5YjDaaovRBD|C5KIc3d`@9GPn8<$EVxD?*L)Dry6jgBHBM-pDLiA8nrdgE zs1(9H-USb=yzII3VZl0qbaZ$zW!ut+@jAgX004^}*1Z_lqRWVDkE7e@#kg3hv4b|8 z#s>;OsKN($uTW0oPzo680}M0HD!ly{MJi-JyXiE-L$I)yZ_>r=0b^`OdGB`?Q1^j_ zIQc?j2mAmO&_3%U-U}^Tm^N~l?%ijc#$AMIcNXGv<1>=S6{Zb&0F3|cGsX1;!YF;> z_y8#0_zX&66cx@wx3;50kZG42OokHK`DFkv>qr|F3!Itd#?11<0hI#4^i(DUdZy+n zld&Bh-k6Sgi^O5jMCLKvSVmVio0~KQXM(9s%jnZU=PX;tML!5*JNfcLX93+qPUHIp z+tG}L@AKQikT3|~UjckR#e)gruDVPcf4W(;=Er#3UZA*zi2UrQA&XSx`&K2`1b--T7l>)qwAoZJ4 zHGtS!ihKtKk#fub%9W5ZoGI&4=m415N2k+fUMj}TA8woc2N)LlvO%ctVVpWIwgo2n z3MRqlsFWlccLqgHo%eU3A3G0uaiyvAkUw?aMaYMhAO}MilROU>=4+!6b=*AQLHZc3 z4`yI|%fO+>0U!f+&|H%a_2lb{=ZtbKsDZC+7L^epGJdd}&=z42)N&0KGF-2V*_JSog?z z8Ke>LDHMdIETa|`={9E6acdVL>bP!Tlb8tn@PtqsFevV@ z3>^I%@Pe5c2=&m#Po>bg6pHu>k~2HYuS4e^QWqD)X~>I`Rbw*BxhFDkO?BKq;mu04 z2wn@_RsiR~`&$VNMIN8@dt#l$TMQmi?&Wo69Dv?l=%G(KGc3@n8Nm6x0Xf<-%n5be zhZ&}X7bK0MJIfYz(I>hDuJuuHzIgZ@o;o^xI&CXy0l74l2cP0}Po&$qF<`es@4K45 zFMyMeUnnUY>rmGaM<^umV8>vx6nsg9x{x~!tvEb&v+llyb}knNoSZDZe}Mt9@0Y$V zBQ_4(bzA`qy@Ce@?~X>ns4YBbi+AY67Fhkqzy}(o7IIRkaR4e==pza>P$-J4^M)H3 zu$();Fot^uP%|@71A`L~YF1uBQR!a4#9cWIb{lGaB;9q?w^pQKDM4L=3ilw;*KrS} zCqr?3JdKk0RGplvDS9?7Z`4nUw_&{EI9!!u2=w|X)2&6Bk^C+)3JR)5nrK?Iu zD^{hW6{~>S~+3sU?;lcJu!p`_oWC)34#lRgFBI3h9-5)aZKdmZ;Z?Nd>2 zpOV)#$5Yz_;lMVcN}|5crWNTnfUTYa1)$gAj4=R9fdC=FqytnkzbRj&3mnO5)aK9< zMw{cSVc?LUQsGI#1CPKUczCcyA5bvTBg7qD*d0=M!ZbOcW>hGDM;{|AMQ5kxrFttY zKQJ6Bp2B0Ob#Ym=`_MqwTZN%lNXw@9=2Ucxc3+K#VfrUZf&Tp`E|CYRec|Mx#3OKg zlAM410v8@}4CM)s1N8CGeo3DS_&V;v+c0Lp97)7YGiO0v$`)!@De){?AdQ4p*hpfy zcWDBC7ZWgseRS`l1t1&`A{8x=#3n=sC+vd@aJ+*HGC)v#W8(B#^56nV0e%vRB+!EYv$vc z6X)X;uM#K`u!D=nNV1n~N`5Elf8gh9=41F+L&^41N!AQdy$Vz~9MD0Hux36Te;!;A z#BdKocG?H;Xkv@217CnNL&eAe=4cWwxzh9Vck1@(0_a(IvFk7bj#`KVYm)%s-#V9MtR+nbgVt ziB7hBCF*hgN_4V8=ynRV12l&FVCCa?;6A0eE0m*-dm_^~4~k+&X64z`gvCqKGUi7S zucs|rIXLICm8j%Csy%My;7r?A;QUo9?wtP^g?$0 zxs18&qIfPfH6bI4q%39^C71C>^LgswX>5F2>f($vJ-awLVZnen<`skDm{(wGe|E*7 zAjQjZPx zwfwpitb7=`Y9%3><(dG^3PJ*x2L~Jjc=2nWU^pc#&JLymS+c_z z9AIa50G-H@9f-H4x!vGAjmUhphE zH^IF&9}Dc_in=l}-c#@qlZYI1G>)fJm7qwm;UMG&s(v0T3(5a|`LpLZ%% z;JBBOU!_ERW^S+#?iCUCN(^U(geT>%$+~~RR%W*4dh3F1xfqT+bMcMNiFa6t#BkD? z3nei8%1MKCojB+V-{g zmXIS|!4$YhX@LAigy@DzAQm{83+%b3(j*e}BZs<|q}CYbfQ|pPUn_ zikOf3^=FViIfuycy(Wh!zz*x+u0DX`rxAbU_?M87Dm*Y}@Q}GT2kO6^I_^DqYjUWz z%Jz3HE^YbC(3WQDXW24u170m<$u0NFm$fV_Tis&z?HpLKq?vcuqGsyWq7J&&-WfT+ z0vv{zW+`WQq$*K5Do96cjN-naBaQbbiyi4iwmeJ)s zJFq+>#T8IdF=^MlFd!heLt21OYAKY?Sc5{(UE>qX7)wW3K*7rg!4&!;KrsQ#T^k{# z*BH)UfqP+H1}xyo*1i5@aWa=Wzs$c4?1345?%KhfFn4XubCN^PU5k!f^PJ?!k|2kk zLqR&88xVxf_yvW2e;4!?g@z7FN3+71HIya&S-L_VMw1NpPYE#4Uj_Xb&h+fSOq9Ev zLJv?Va4LoX4Z9j^LHqy*`-8e~92ilO{Uqi6`i>DJW4Ox$WRf8M|3=9$82CfUWq%Iy z5rl!Vh7*bYX&Lttjw>7L8Yd~v{@kGA?9V;6T2h?-IaJ(Zt8Z7_n$@@*el;%V$<@+7 z6jc(f7_gGdN&N~+eS}hfeFwcH<43Fiov&>LoGn9{74!nba< z+82&wo7Z483Gn;x^Z52fZ|M%rXS^g`@{$EyDx02>uqYulK7o{N|7dk-$I#M~ZcR|2 zDj>+?fg3|96_E$U`$B-!Tt>>`$Cr;!$VgAicz*H=Pc19`JQ7z>&Xum0#xGru?gR$_xT}#q z^m%^$psZJ@Y<}x8az(7i$c0Yo@gza1z7;r6SbQk~6?n@hD(BY)xSE>< z1FNCAU^tJ^nfw5h(mqO|ODVLDTUv^kD3CJ}zg+g*213#cvOuGf*h5rF=yc$(JsJ!ULrqhFhdSiTA>#DJ}`i5?mh4Om?ite^hdsXqwlfS3D50>-%-NLlu-8aAl=|lqhH45ehtGB59*dMRKrxy3_h)w80!yA z_+Mu~^5`5L7Z*P_Au%aAW!`*!>CKU#gw61 zSuF#cT?RPQRsC=a+qX_2?m+hBx+{Auf~SJnO_T=PF!rrH+gOzxXVCtIuOM*d14E6l{^*F|$Sy8EQ7|sZqmgx2ee<2?YPM`z~@SfcRZ;ZS@Mm2kHwwFK6ZoMT`$Pl7xQ`c=~XAYdU`D< zTqoOl8ou~~2*kt)A!duE(_#Tx*`;~x)|=-U8`Cz@5n;Dj#P5X+Hg^>}KcC(EvcB;h z{m^^^EJv=NRw0C&u7OT}#U-*eYBZsRY*V*G6D(+91GW**Vfnmx#iFmV4vC$ttBIFBuVUcd&Iuo?(vRP~-*x#P ze3FG%!?((1s8u3;=t_1J=}N!KkdpgP+v&ET0sU|(Ce@RrDANz67}b9(9f<0bVn`WM z%q&BS`DI9vRdy%EYZSMK;*Q>hb5Y!Rij!?0cPHa$s-TCq#0Mf zgK{dip%nLQLn&r&Lxv}|-8tCH6!$j89lQ(INpU{_&YRe&C2msaXu9eL=&F6?NZAM9 z#KEl+gg?c%Hzs{g@|s-044${jZhcpuLJOn`w~d*%6=mDD6-Tyj zMcIyTy;DbDQi>atBA7~lKS*Et{p5vouytFh^U~0}#_UTE(pl*ZGY-BVpiqOEaqutA zzQH9555;L=Vp?J4eg7Iyhoc#O|0dsXQmt@wpf8n5AKleI4Sl$!-GqZ-PRf8#QpaVO zvCjUtc~Fo3o00C`&C;YCyEGvM?r`;KY4cN3lgjx1LRx)%REz?jFCGw>%5P0%j8v`RqE2^Nl5BPy0q=DNh_qm1C8uRV(G;PZVy@+W~}xy%vgru zNiTz{Qxf{K*KpaFUb}PI9)Nl`0o^!CP~7ePQ3HKxlo@yRxnljD3{TueumbuqTme|= z_F>X*H2C|)_!XEjR?;+P!fvAJ7q8pl0y5Yg*r{MU16Z+Ne>xPtsq+ng<-wZj z2W!4P>b95cGZ6URr3%vSLCW`!rM|? zT}up=!U6X8Y@k;f;oV;>{$gO=R-wq0E67cGw)1R9gF|jQk3icIeegd7Vm?u2>opx= z-MrOwMv!?4zn2KVH&EQLgM!>DW52AnopCXuA26HFm;wxf2boVJv(@y8FxSi5FY)#p zD2npVMcz+*yq^HC=}2*=w4e)OEBx69J%>Jd-2 zoVA?kI(hn3o29emR9g>WKXI_TUlJ9L#FB?yN8RbJ18%*`EdEf@;6njm}0 zfoOmBVUIr50V{ICBHLu_5=FXAM+_BB9U4u=QN7@(XzB-*D@tU%l@v7rN5#=i zsC)BihqKw->wqy8wn`X|9Bu1ybZEXV`T&Szggh?DAj@0HR z?289s-64X-q!t)9vXs5BPDnOghw)kAW&P_pMDR=nrIZ}Na^>k&J#8mJG~UwMcE)wQ zt%2A+W$$qmeQE$KrLxQ9N~2jOA0V~#be--#-Zse44GgBV)3-FS^Suh`*~RSV!56W+pjK}IMe1d z)!Po48fai4RI3EK4uARU3?zQIG4uxO6*k=&bqD)}SP1W{x zxw)a*?vk62RNFh`=EiFKM{@HA)%KHe^U-SiDPC@FuC{l|%`MfS;pRitrt5|Pi|iYp zJ=j~->;nf{PF5Qji_G3E69a6GCfq~TW>EIUq6?NeH5Ya@%ZfF>0so2Ls!L=r0@Dn$ zPZf@v0}imm4}c&O4+sI~@dse2xuR!VNXVKKC z4YJ5~6%o)6Erkc|z+8v|fD_4?Nin2uB&wH;Xk z8^$f~&|E8Osz5Vca5kIXk95zQH!pc!WPq~SbTPBCUUSqur@B7us99GH(v5euJEC1J zB~wio*?oKaw4%J&J>7Dv=0aq#Ql@ppRz=DU_BqvJu%N7XzwfB~iV!4TwDR)CS=BWc zo_x4k>~3jk`LMUA>tqjvgWk^Ly{)aHc;bYsRXi@bT*uCI_p}`E{j}B9+11h_cDY2c z^^=~S*6w4jn%+-)ds%&Tg8CI_SN8v4w~Cnc~CvFoSWVHY)a zLU3#8ZTo;2$iSF<@+KVYdcM%W{@!4T0Dlfgr;cDZ!B@(|i#xyxi}Kkklns2y8hGyTKDPqEhNhN%$tY11itK6;BZPOM zWnuXmH9Muja!-v~4=*@m;6mAgeEm=PMB#tq=AVDO?>vN-p+DB?=PvDYD{-D5UIvDy z(feVPCOv)T@7MnhAD_wxyBs3vU0$Wil=<7ZEk6Ib$tD! z`}aToym9lECj^Yr3uZZS46NDOjY(6UnUxJk*_-?~TEmt{E4R$8Y~R9FZb`1RkPk?B zJ&D*w!Z+P)b21)@F7^I z$*F&;5;1hMd83I%(e8evMqTXUi950aNMYOf_Zi(|#Na;S9u9rCtIrX-vqH0*sB9s- zNzi$X``(?}tVxw6Com9+&G@v{`!%=~Cn`jX?V4$^)^I`tm|xhDf+NBpM8LU@m>O`) z;q;6FHlARdDioS$3AQ8VM+Dn7^Bi8V5jIBM9$FU~qb3UY4UAC-Yp|F7H|W7PNrpi0 ziC}%=jsWQoc%r@U8G_@lu&qD06OB8(9Wsd++%EoRCt=k@qc4B&-OuYun5iD%rUt)y z_i$T7MLip6b4TNW69t;Y{_viIA9wz9&FN@6UKrHd<>8d}9UrY9(3N}}Yw)pLvxL?w z!eP^kzwK1^nHAx%)RI;MNO8{gxj4#B!rj9_l5kN2l2ns$JBh$4KhPT9JqKV@0~pqX zI#c>)P<(U#oLKtL-l^>5U|8;v%OSeZqTq3%Nx{Ll|H%OyQjXiqJ+y?xjf?q)RcQgq>NI3cOK?6hB+&Zw?5_-KM4uPyH%+iPF+n8iPWSSW1+GC+D z)TMCy^Q`)i{+?Q4D!Z$J76b$e!JOH!SNi+LmRtkS7p@*lZ+n~N`04KMw$5J5v97LO zSLcToDDOUm;-MPu4Q9Zt01QHBf~F9Uw*(XOU5)Ml*M7GgGCKRSQ(tzlg27uASrKDk zE9#(1GViYCp;8)AqK>`baH$-_Ov8oo;@Aqt-PcjX;D|$O;c4Gp>-ta(U_Y;p6^Owa zaPGggZa>)B(G7k6C9;l=t-EV&p{nJfD($noYgJhlP*v1s5mN|mBJ;Ld2vX+KT9#-^ zHn}{a9ON(%^Z2&b#t-&aU*T)h-k^-i|tGB{=?gzT32*vzqfr) zt<)}pKK}E;E0`vt6a&tWw2g$jDXoFs)8OjtY3uH_9Pbj(S~^dkI@Z?RVEMeet@m_y z=Q;cFu2bU4w%#`W3m_A+%sYyv6+97>t}{Sv{-2xQ#95xv-;K9u}$XYrmfA< zGX&4>H=56FX}+lcYha4;;zj-3z~s!DF)m}tPZxKa5z{VSIX_l&38cnyPc-z&lg*EY%(q0tiX8M~pH6!TtW=ndLv3X~tT%~?3tg5N7 zS@;`Ud81f!(NJ{1Y09Zwg?kbB*F<}+!Za!NyD9F!I08~US8^34ep$CVa}{k9OJuf* z@J(2zGM4={u>N0xte?_0Nz48oSicI}=O>EC;iZKEBA3ah_}yRCBxfV!Z17ER;pLCZ z@elVr9`J4NpYV~Ws3{64j%A2OnV@IYdKpY z*H4r~v;94(Y2VMY=5)FFF}eLMw)$<>yimS1L#`)sm5~-ySX6m`N(*5SB&zPufQQdEDox()%#B6D_G3Gsu);X{^Kl`3Wi$XQguUPy8 z?kxSZS#wQ(HHyj_#qMSqq?4$QVkms4?{1Op-_ux6W&i0%PD_~n>j`UC(=O3+_QqImW# zSX7&_L?ICO7&fvIbd(#(pMrY$N_$Q2S$Lm6*(@u$YGd?Qk3cYtY=pSt7;c$U-z?jf z3&k<+WSz;`L^#u-O@Ybwt1m%4Bgb_-b|Z7L0aPK!Q^bjt0-R&=?X^|07e>ru^YS57 zp6+SmEiK*MU7z&qZ`uEurKPiVV8`QuQ98&FxIlH8-LG5y&Q&x@f$VZ09Pm0iHfghF zn?l}Ypn&tZgG>;xLArpd%t|Y%Cvm3NV!zw$kO`#CL`JlG}R21VJM=hcrv?&}QlUWEuy~42#5&eP4rpfi+qV zO+zv)r{`o>uZ3j7L70yC7fcWqOKZ35OdEjd!B`K#_Zol!BHnuq`lna%$-)p&i!cdb z!cZ7G(~wLR1?T$-aE{E>=dMbAcU^nEwb8Vt{@q5?X4?^V*g-bPvl$CThq=l$^l6O|WUBCNpvdrB&S=E)d>(NY2 z?$KbT$zZO@XN@xVgRz}&*8^3PPS*H0S(Tw5*h?9`k zx9X!Kv<(DOFcd6sDFZV~pJqJ0%G}a}`u%5}BZOu0Dj3M9LoWVAdH)*8H zi`c{P+0x5aV$--ZC8KPNE3jm!P4gYR9f7en&4th^(a*+Q2&gJj38Cg$hXuL$!Na(7 z;vm8Vpk-vjT-Zcc9z1NP2%D;nfg&ij!FHcX#y)gd@UUwSvybAf%y|_cHEwn1ti!z6 zg}icM?o>Pvm<@-j;ezzmC6{b+ z6QfrjLLGt`plodGrk^uWb5wS9w$YyO#ZhXDq26&yg0U_H{;OVou$y3Hb7Fa&B%1=W|E7yX3TSOc-| zb;7;e68F!RNqBn0gYu#M%`!+buIVCEEWLljd^eT`>~eeA6X#M5F1_%g6LY)2z_h=d#lzqoP|jKD4g@mQBHOt=BH@a+wMqL zvHQO2D5v|9RG@!Xp)DFwF}z4?8V-&qv2;c`_5XTbKiO#;;gUP}G`yRPa;lzMXVwOp%OJ{&-fXm^x(n$zl$lzZQ)X-@Z;lD{+&CA3Nc&!VPpNt*t_KFtZLhJn3U zAHscpq<)kWuwa*xAh6Nx_Tl?&BXKCX#4SuSHdowlu!ePrH_s=Evhzu?7Z^B=SDV86 z={0JV0ZLxTyIaf`l;*2S^G&5$sWOMD%p=t1iE4AK+MJ{|FISt_tIcM$d5_xcP~TN7 zOSLu>%uO4bn>O;zO-0QXC_dN%C1e*vY%~Bz#n5e^lij1`ib=V7P^da`*v2yljAMqtf>)`$bi;7yy@cQK7L0`<7v`7+F$kzMVQkzi{fbc6$6}x` z3cC8N(XL`KtU5Cc{%Uy>#9|7}33Zi=5diG(hf^usDUwY{3*gP-Fnea0ORe$OW`*ki zu8F-6>cwo5Frm@@0MqAa0Pn?^#S|Wy2%H5ALS1rrnL}Ov@cK`vO9`)ip{`(fHHNxE z;dM3C1(yZ-k3wBT;ib^H;J#4*ZK!J$ydpFp1bbs7TX@6yg7-3bj9*tENYI(E!e%W;Xbk&Ye8@3jQv8P9}&rf4(quFbZ zvL8Q+1tvem{@M(;*1mp*E5IFQNoW5$3dUgzN9kcDfQQKTkp|Ym28V%`Bfo?XBZ9zB zK&96vqDs4=E61*T5_Vgm3&sg!ch11>F;Q(1*kX4a_0E*j;xB@qN$R+@#+qu!VRA!#l}yX@jQOBHk&fVlT|{CAT;vS^iow#v|I@nV=i_2CElak|wZ$3U+%Z))+u)Y#cYtztj|_4jb20GI z*z>^@RILqy-IqT__|zK6x^F^dU##-ehyT1zRhp1t#YWgbZ%>}IN9}n6tnFG|e%jQ6}HMHreVAm8ev}sC^ z=`!f%QsuTwUj=7g84(0>^l#M$L4K+4D%FlCfS{n!ZXP~Zh@x7vS4@=F4~@rr`>Fjy0zxs;+9BRrRk4@% zs@yXiepmLWO5~k;RP06-Tc)yGRdD;EeHO1jjLiUWe+=XUpu%Q@F!}b#4wIO*K~Ua~ z2-0TxnL~o?+8`H6aYw-aP6N_thJ7zaaR6c%*9BFN2(pCk)V}g?(5{g|yQT!eB_Ak; loioP%-b7e8yDrGSELdqg_1;8xVDgnYLF|TG6}Om~{|8wzXDt8# diff --git a/asm/asm.fnl b/asm/asm.fnl index f25b3c9..0eb2f6f 100644 --- a/asm/asm.fnl +++ b/asm/asm.fnl @@ -126,7 +126,7 @@ (not= (type dat) :table) (error (.. "Invalid operation " dat)) - + (let [opcode (. dat 1) parser (. dat-parser opcode) pdat @@ -227,7 +227,7 @@ (fn pdat-processor.pad.bytes [pad] (string.rep "\0" pad.size)) (fn pdat-processor.block.symbols [block] - (lume.keys block.symbols)) + (lume.concat (lume.keys block.symbols) (lume.keys block.globals))) (fn pdat-processor.block.patch [block env] (local block-env (make-env block env)) diff --git a/game/defs.fnl b/game/defs.fnl index 5b0e8e5..4264781 100644 --- a/game/defs.fnl +++ b/game/defs.fnl @@ -4,9 +4,17 @@ (local asm (require :asm.asm)) (local VM (require :asm.vm)) (local tiles (require :game.tiles)) +(local Prodos (require :asm.prodos)) (local prg (asm.new)) -(local vm (VM.new prg)) +(local vm (VM.new prg {:org 0xc00})) +(Prodos.install-words vm) + +(local org { + :boot vm.code + :code (prg:org 0x4000) +}) + (local mapw 20) (local maph 12) @@ -16,10 +24,6 @@ :bell :0xff3a }) -(local org { -; :level (prg:org 0x5100) - :code vm.code -}) (local controlstate { :jaye 0 @@ -47,6 +51,27 @@ (for [_ 1 n] (table.insert block [:block [:asl :a] [:adc 0]])) block) +; core graphics words needed for booting +(vm:def :hires + [:sta :0xc050] + [:sta :0xc057] + [:sta :0xc052] + [:sta :0xc054]) + +(vm:def :cleargfx + (vm:push 0x4000) + [:block :page + [:dec vm.TOPH :x] + [:lda 0] + [:block :start + [:sta [vm.TOP :x]] + [:inc vm.TOP :x] + [:bne :start]] + [:lda vm.TOPH :x] + [:cmp 0x20] + [:bne :page]] + (vm:drop)) + ; a handful of debugging words (vm:def :. [:lda vm.TOPH :x] @@ -141,5 +166,7 @@ (let [tilelist (tiles.loadgfx tiles.fn-tiles)] (fn [label] (tiles.find-itile tilelist label)))) +(set vm.code org.code) + {: vm : prg : mapw : maph : mon : org : achar : astr : style : rot8l : deflevel : say : say-runon : itile : controlstate} diff --git a/game/disk.fnl b/game/disk.fnl index 4f9a027..de61ad5 100644 --- a/game/disk.fnl +++ b/game/disk.fnl @@ -3,8 +3,34 @@ (local Prodos (require :asm.prodos)) (local util (require :lib.util)) (local {: lo : hi} util) +(local {: org} (require :game.defs)) -(fn org-loader [org] +(fn append-boot-loader [prg] + (local vm prg.vm) + (set vm.code org.boot) + (set prg.files []) + + (vm:word :loadfile ; length addr filename -- + 0xbb00 :open :read :drop :close) + (vm:word :loadscreen :cleargfx 0x2000 0x2000 :