From 99e30addc027022e8c9100dda6ad460639614f6e Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Mon, 14 May 2018 22:28:06 +0200 Subject: [PATCH] Flight sim, etc. --- src/klh/ar9.flight | Bin 0 -> 299819 bytes src/klh/cub.24 | 1950 +++++++++++++++++++++++ src/klh/cubwar.doc | 203 +++ src/klh/flight.306 | 3667 ++++++++++++++++++++++++++++++++++++++++++++ src/klh/mazser.141 | 2308 ++++++++++++++++++++++++++++ src/klh/mazwar.44 | 3183 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 11311 insertions(+) create mode 100644 src/klh/ar9.flight create mode 100644 src/klh/cub.24 create mode 100644 src/klh/cubwar.doc create mode 100644 src/klh/flight.306 create mode 100644 src/klh/mazser.141 create mode 100644 src/klh/mazwar.44 diff --git a/src/klh/ar9.flight b/src/klh/ar9.flight new file mode 100644 index 0000000000000000000000000000000000000000..963db25ce88fc327023e128a6e1f49427ec2042f GIT binary patch literal 299819 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,&P1Bu`%> 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ɫ$YQnbZDTKf5B`8l zYPENT%-PF|)g1p0st@sdZ3GVR4T#&**&t{R9(tt08jx$~j=_ zWtm)iFR@Z*qfyJzE0&#V>MdX0MdiqnKviY3au?0mosY z44KxJgIcdJiv9nYR@p$rW-3CBnZ51Fbsez!?Cq5sh*S*KlAfa%XXR{Wj2VvP+n;^X zjaSAi1XbL6IsJ;-&2v9Yv2vy40{2@9oCaKoU~JPFA6-Sk@{_d5G?F~cRM?f52@djB^SfTp_GrH>}G^Qp}g4Kv* zuP|w63qKgkC7#^u0d2YV$oQO}<)TbERg<%4)wqaNGN!@}trym`m1#lfterB4$8~i! zPv<&mypCLo`wZfHrJ)mb_kBU{*xCxw@oy>ZLrpQfYHo^H=VbLP#*R0Ys#_^E5{tcd`KYEk)oro#fEA1vTSXwOSWt(!$`gXs92#1L^s$Ml z*%Y_Xgav~wSzD?Mi zgg33=zkQG#CVs<2t&6nQr%js1%T*CtKB$g}%+veH@j}DZZ(Y?Ovs>eie38ydj=|f6 zWL$)1>NI|xg|DHgs6l5J8tqS`WW!x9G=F{51hPYy$Ka{@9-y z?^PRUuA&5SRV`dJ8QLz&aBeJejxrpQduxS6THnUZg%w;X9b4=u_d+Ia+c(&wP`exR4Wej}#_GWY$9+wCiAK zFz_y1;pZz6qa%83jTs=>8X=`M(zr?kqO4$Cz%b5n3FK^S2If>|?QpHw%NoY`G*4Gr zoT!L#c^WKE?dquHZ)P^)<_d7C95eJeMx!W*dK0Nm0u)tV$5~XRm^hHDazh;%CGZzMR>+^mO_NlduB40_q= z9jT5p)`(ZM?a*Q zYA>HU_1oss>p)@sGw5e1?Z{OtErB|jVJ4bdhr+^#5#alERFQbQP}umM-d$2DG(+51 z7Rq$~6+$CvKNL>F$}@|(dTNR;$xj9FsyekJh8BnnSXBh4I)ruq0`BcfGn(?T0(;|D zK+-W|6~mV8Y7i0Js+Bx&-RmErI!N0zx@4Ph0?00i*=g;`2_UaO&Q1vo z0tA7T(+4~cH=*+eUfG%1eNbgW!X=ku2ljFdqM04(`t<%GY?YYOyB;bav_9Q=1Zerl zRxOOr*y6WmA6q_Jr}#jX%*1@x9unzm!M>DN?gqX9hJx*eKK0T*SF3MEA~sX&1#wj$ z0~3cdw-S3B7v9{fjwY;lc8;B2C`tQ1@&x6~415U{_k7d+fvUT4LYm6;lyKdx$E0l@ z$=7K)GpmUa6a*~}2EvVN=Dk}JM(z)G?ZGYw+rWplBhsq*fgrR5dd|!W4x{w>ibeO< z>r%BFroz!ch|&cibr&NNV$<-$Mu@Haun#;H!<)~nI;C}|5apC{RqX!hVEqEO2JKQ> z1T@x8Qg4t3?4|=l&QlDr1lNcf?h46;r57}%DtY0LXo!!lEsGEW6d-5MlKGbks!hNI zFs~;@0p@h2EkRM&ElTQdA8FL3Hi?F>T;OXEO$#XAgvJ^45bb0R>TXR$y*-0fQ7od3 zrZuGZsY15uVEr7ECwgGIoS)nGhUcXSuWh^$#E)76Eqi0hht~EO4BXVwDB>{4TUK<+$r`MYicuc#6fFA zMyr!p?pZotiw@Y@jhVv+6kcGv$cpyM8;=)a(5TcZv0C8K(k7UzknJUMyMC^~0J${g z-txoGO4_e(!89UnYu@8U;dgQi57`Bt~0f-j2?*UzqIaaR>) zo?FB1=XgmJQwlNL5Il+a2uC+lxq(Katu08?8_2QwM%%9*5Ap5bt~wjUL}x(~Tu~k+ z^gfEUx_rX^vnDK<*hSg05tOrCPXZ-pLkb&vF5W*OJT<(Wx_mWbg>wli?kFpgNR~Q%l4)P0kVs)t-|( zW%2b#L&U?XUJRG-#jq~caDh)}L?t;mkrBZ`Gd^gLN?OZR-|n{sA5c>@!3T_!Hu5l_ z-^#HEKy$_9&s0c4%ngy>9CA0BNt0?SiyiPHOGAulK}fP9t4SqZ8d}cSVBFZ4bMA}} zE&eyV&QbsJY9BTiESE2v!$+5r9SANCU|@E&!@W`isNKA=LK_Bd8WDqGnccpJ!gm~$ zMbQ(#ZANXCV3ml!8r}Y(@a4TxD2|+>rr0ayOWe~{6c9yP=>C&^7)QnajI~!}25||AHhtGtTBrFo233bd^o1jD%>d zSZJR2xgIO#9>$&Hvr~Fbfj>b;We}q45qqIPJi)PN$~o1qM3B60t2H!JXgZDzoq_D! zJc4e;*BDV$Ld_~Na@H{$(<2g;74-1zeQ+GEuI|3X%W9-0ufU0k*X8DjQVZzJu4a0$nGMDWR4s#QK zr?xQ$CU}r;_vBUFguqY+1iN^kNB0!4@WK0N{oI?olbG;Y=B8;X5C$Q(%g`ai1Bbz)9&fb(_5&kMZ#%|)Mz@!Z0Xs& zu$lPyP$E+;`zH0?uxBAgq8KLqjJKF;;qgoJp|m>88obbr37qR6?dlHqJ|Hloob9PB zBU3ZRo|^n;Y^?s%AQWoJ$<( zJTgbyNBVo>*KC(D+ZHtVR#RYp2XT>xN5%&CagzrxZt-M26hj>pFCoaHV`Q03vDWG^ z3YMDPqtXq_7q#o`=^9~1uCr%gcyM-id28p6uFjq1iOB;Tl#htrMnTAQM;VrIk$bnY zjjps+iOg+{X9cuW`W#CY9Opkkz3ui2D7OyKl2*txE0Qkq+EEze(y#KtuCBqM;gJHu z)_yQuRo2&alssmph~9J%Hkm+gLnhh};wsT-*ch&eiy8u(Cjb>&xbc$|xw5XRpH`*US#uC!)w}arTLo z?TMl6RE4yF3kL6jgl|x|LnM5I!0?SXJGI2HYS#6v=|&_299zr0g6I!E~gbdOq=4Chy|B2hpbt! zePQh40<=FoUFK9*&7E84N^T~e%L`IBoM%HUvdT}bdT44zKG~c~?5(`&3qb_sx*Jnc zcjgFU8AcHEBf$#a^YJ@Q(OO3f(j>~i6e%Q`jL8KVlY&XK&v4>*HD@h1NS8b?s7rjP zs=cY~e6`AsOk$T|HyiW7P4pEAk2+3IByDjWAIYVVNvB3u?Sdk(hk8oXUi?9|^u3@v zY!ETpKfGCr!hv8(b$G$8y7G zShb1c3*06HoPA9q0Aox&s^VvGT-@X7+h$s&c!|hRoTiOc!p)rxO!NpbRF?{Qs4jer zDeW4eC>){R4-&DWx2GEOnB#Iq*3n%fW-_c}a?Cj9X@`2_M6<(|3%fT=#leK`w{6fH*cdX=?5M}wwK_WAKM@f&Lp$Q>H+amSU zCMuMBYSXe-Fmjj+HoC|tq{hom)fi0G7?f-W0@-yG2qZRC!>`LiCM-oD%0FYaPSOfb zu&1({d2o?|YuMh&o)o)ehymwyO}a5`nDu?GFDYotjXD=?4YI%NYtdg@2LeOqO}M#e zb`BraHa%(zPY9Z#(qEn*^v-sQyBv9NZJWb0vmt;nTewzp;!p@k_i9=|^Q;{S;S}}` zE)~@rQ239F3woCZEXCl#^?Z^YyuPde8Z+cUfMKKn6r(y*-c+W;%O~L(<*ERZ^jDW+ z-Dy5aZ=f`l0{?iGmpear?RhClsd83qs%;9k3M>z*Mo-Yx}Z@P7cM??0+oZR zadIi03m`b3_;i7)4vn~Q+-y+}FR_~sf^#&a7&U#BwuTsjtMxtxR|!}p6Q&VX%4DgY z$4q(?Hj@~mtWY-BGIYBytDVXo${x6YLEHluW!Xi4899;FY}uJ*%?hj0PlLj0%dg=} z;F|5%$FRDDSNp&P_hp&z8WztZ1L3XR`kENlw0JDb>J(OY>bxwwM0mx{ESAyyz-vKP z*u^RAxlV3+vHUJE3iNYc?~z#UWvBlslGf7MNH&Y$)|@%>a@M|uoc1q%>czD`c>JMk z!{R?>wIAzx{=V7=fi57f_726hK7L=e{x1tz$HB$hvaIv`$vqR-6SNM5H4iB0n%_V5 z&-EXD{;~73@_mi<{o5bjPazNRQ+p~q(ea^E=by;h%NJxFdl&!Bi8VjpvnQ*$SP>s4 zqNcaJCabxq>w>KH((+JN^O{qwS02|GM$vABetd39EY$lpAXJYN%JN zz8cpntd_5)D;2heuTrnV>cr#i{Li30RiS-j!}E{s+0$5a^Wyx8>>gF-36N{P1{n=! z$l$qg2rpeoMD|AN);6H9x2pPoR>b}K`6dx-j`Ec~J9uMn*E>bu>(n$4Rti$x`m0NO zZ~MkI>)&OiE&kgRS*fdsR@PUGei{U>wSpcRqLp7fpPyUrsL8U8YqIPux89NM$>47G zmXq5~)O^+WeEQc}%~un+zvni1Z(vNjHp{NQ?#TRz=$o*#x86Yxmfyv+%q^Bnf0?fY zhFlD!$Z|$QWk0qrvGe%p{|)duGPy@({8*XZvuz{dwC6Uy`uFf-c-=!#A5v^Pk=2~4 z$vQrAny=dO+N@)&Jd$OvKXpy*nLjsfE!LeU`fetx=I0lGO)D7NPyW-1j*m*_Uw`r` zGC0}&fts&vz9Y+S?wS^x{yXU(KP>|7t7Pq=R(L;OHT^35trD(Z3A~ef)VyEd&t6^& zc=|sAstP|LtftOTker(5ES9hO?82d}WAjzpE*N~H=zFu;{7qdCkZXAxKb3#K&$9QN zQO>`#TvYCxUKl=+{iOS?P--bCsOJ6U^RkW`75k3%tqsq=8*7wl2h+Q=6n205dUyFX zJJEnkch)^ve(lbN`Yjvb1YwQq2}96dyR+15VVf!A9ahH48-M>_eMOYM>(ti&kS(^q zZq4=CsRoL8@!2dZ-F-cvrD(q%ZCw1>@`%&-p6K|P`1jJ**JK?x9e-C=bDzLP%l=g7 zdt0CVm$nnxZ}s#1soE1AABQE`I~4KRsRMlJ=RwtS+#_moDIUCi)8*69SJRY3A(u}i zvOS;_NfggIzEW`jwmNTn-L56 znv-|IgH!d2J)+nP$>8MGCu+I}-kQ~%XQj1Xaq#*E(RWe%CA3UC`K|sBCGOaF>YDeR z`Ez;AMKw25h1%!JLl@N?TU35w{uL;2mRB9AG>x35z{R{hNiTO@;T+SjT1tmd1inow9|vZlj$ z4?!JcRJCTfd}CH~^i*3`^Rz`+*zcceKKU8Zx8w95z*Djty3z9*WT@uO{xUXVbBSd3 zwKz=LOO(sWxAA2W7WT*g{X}-jAAdmCSqZz?@Or@$bB3g4-^UKEdD3)RH5#%qD$NCl zveL<0Gt4@j(s#wC+y3R*x6p-zV_Q^`R2y&+`KtPJ?6xxASS zE-qyq6Bjr0V=cI;vElhg?%q^eBZE>iUg5^y^0nC1ci;QOwYyLLFBg6E9dLZjlY6N2 zRj2=(6E#0RedI*PC&l|8pZ<`39?3dBDcQXW=F}V|V$Id+VL#b>n}h1Ip0=m?N?dgk8WbYB1oZr)QCeOFo-{c@Jk&})XNhqcq1TTH+# z?DPk-HJ?xwmGkC)tW;N;IC_vHUYWdb84R|p7%qt{ng zm}9E2L<GQJ#%KOZ2sa82$SU0U2z;r%W_;Vd{fpj`NuzH9iPIS zBKNhRyropLHhW9+nsRm_Lb&ZeY%tbJk6iH;eXv16KM?Dz~`MaSls&!-Bq zC7V^FTGgnoQY{F}|I0B93TDbzW*7H`46e*B?>j;ZZoXD6!w9ABq3g2A$Cq%a^rkEC z+X8vDYNw7FI)vI5`#M=Z(ec^d+p>HjWF`h`yqL; zrs2#j7v7O|%x%1l5?}lPVRvs_)0dsh_&T{0_VFa~rTvMAdnjzD9BCMd7KA6=GislP( ze`=4J?d`iQtL<7WzwgX18DnMdU2H_t{&fC{+QWyjtRM~2^d^QqEz-q3pL!Z%;>>0`BHo!efn{nmT` z1Zw=Zc;uu1B%ic)%tP{jE7JYII3r1MXhvV>i#bo)e9&K}P9STWaAqK=qkY?zFkG>p zrVFV3irD$=;(cqIuU6WH9mhdY?B_MZGc32p*uDS{iqAZ-x3M_%I;ztC!hg()&sd5r zZ>=q9OjJ9Mu4gxpU-6lW3N7Bbhe;=yt4iTYb`-F9TY2dG;?Q-sJ9p(_3Gl4PpK{b$}yR*M-wX3H^p&5t1<9rH_&|I+=xe*WvC@0}{`x0TY$BaO|s ztBl{sQMf{cmpaRkCa?2w`;`sPKU7|Ge)HR3#0q>#=6-={bsS~_r1lZ@4Tm?=++C+% z{XqEI;vdU@{OpIJZ*AS; zLbkTa$gqfh(r!}PCi1JTvz~*Qxkj6KsjY|rR=xHP6M^;)Xztu|QS;l&Yx#MxJ%jKO z2sio|{jP1UwDf(AknsD)tmDgzcVug?pvYPY$jJ{a4xnMPM>2Q^olsUD$Yx}o8b@moaS6(+G70W8>;T6H5S z*8E(w%;@XSv7nGuTQHGEsYWwd#g8j*&X{~sU--fllcbj4se&8;-0a{0SeX6DsiHpo zGoev~X?<+pDT5D1tJQu*lud13mvwAi96ix-%jS!+j%ye9p6EEX`O>Uo+so(u-~axHqVEff z`%ZM+YGnxd+Le$iD1Z3Ni3iuWybHTiX-T}5?ED@kzF)5*Z?*{4w^_!ud$E;v-g;%r zud$x7E;iTPNxSwva5ptD%k~$BEZ+`!!iV4wqPI2K$@%Z!(Ii5@L+(3mia&G!#AbWo zb?wJC9xF39eBV@-U3t-Vz6?xZ7GYuSbi-NYM>K|i?F;;EpFYlylC|#=Xkia1tUB3| zTL+G3SG{(q9DZKD?|=Nl7tfsef7brSBCdRlh$~;OpY-)FU-{XiHz3S)LE4VqbrYH1 zM;S&gf8#$3v!7e)(5&$DT$!2VtHHQsm?XE@*A>lt*-y(jUzHzA*0?|BX9O)Fw?cR& z_RK$@+@`Ts1CGew>EA6(Yo7DJm(TpA{3GaVTp!w3EuC-V^VRxQKh|WgZ=eMGsg!i~ zmagDgvXyvsB{=x%PQ{HSSfDb7bamo)84poRVAfBwlWzl6S0Z>55jul7TGps)I;68l$v zt=hiE9Q(QA(T*&$pBMIaf9cN0AFA7Ag`GL`V&SRBAFA(nsQIUlKh&_-p_Ypuf2eWJ z8u--fcDBwv{!r5$9@qAf#~&)a&7t+*WxcWPpraN(4OoA#$2R{Au;IfFwp;?(`1$q+ zkK+yx{JQlpVAHqDZzulLr7yO96tM8C^1B7T_QmzzgW78xx9}OL-RY>!KZn|Vj@fb< z)E;sYS{I=9&h~Z6<;oY^J_fZaAj_!p`tMUj-Hf9aJ_}fXzvDLl01o`u%B&57F2LG7+Y?JuErf1Y7cu{>n%|G28Y@{0k!XN z%=PpgFW1d^Wa0CG^>1^q`B#7qA93WCD*zk6==8K618n-PgKeJ#Ed18N^*@4IOg;Z3 z315I(+~EK<{|0Kqh(k=c3TlHc0JYuTk4cPc4uS@IgfKA_Xu8@85%n zT|eI@nJ+x=$m@RwwObsw@D-@N-cg(X0JU^X{1b1tKXn@<8ZeB6;+t_5uTO8Yzakki1wYkf0d(+`}4HpzV94=EcBs8M zQF}kszSS6rUD^dF!il{s0sD*C;)<5dF&3^)H_@pDZ^aD12)%n%>Ho&GIIdYq1 zzOd-X>wgQi+Z?y>O{l%WQJen^wXBHpPm-_;Y7@g+-vPC6@p`o(@1;k)Uh98H5p}nw zOuq$K|DKfV8Nh}oQ?|PS8^7krtq%e={Wvw6WWMl%Bd>oRYP;Ky?m=pH{HMY*P`k(T zE!9Bnq+_-WK<(=tv-M%9y~q0eQ#*FHA@3zw@E{3)poqHL9kuW*VEua?w^R$*@F_=b zxdE{8>mJ+s2w>As+7Io4pzZ&zO)_72De>VX)b==T;oDF<=%}SSsGV}mmO-dJ=5ei$ zLhV~UT^sUVdejM6zeo{vcRFg}JAn1?bKFt`V8c_6+%gQ<_>K0+uh#bfHvQC*+a&Xa zFqb21^8(cNdSv0dP&?$sl$xOSV4`*uYL7c+>wBU0-m>~Hb&$w==`qJ#{}M&i-Q}o- z?*Z1o-*HPtz=lsda?3uz#&5PeweJIL`k6Oxn`FN5XRq4&KS6Du;}*UTwZo2DDnTuS z2mVQJ$DsCBuSx6sq4qwB=bIjHcLhSusMjPT@G(-`w zL7S-RlD#PW2(bQxZXrr-fDNBb*-ipBK9iK}Lx4@caO5_Le379X|CDnr)b4QH!jGYL z)KN?8p?20WTMk0)?d=a9ml6MU>xZHCf%bQmfnN84HpIPH;~dyfM-g@RIBMZ1fb}18 z+|q@B4WD!5mKngtXPtu9Cjgs%+5X5LW&EGoB=W^DV<2i9ptj#}3qOV0y^dPC7;5Jd zwR2E=hhw&W1Zv;r^=d=hiws}+r#u;FzFc>2qV{Ki^&d{uUIN(g`9$quz{cbuwtf__ z=~s^2CXp}JIr4@g)Fv0P@N=l$=cuL2p!Seswk$wxauHiU2DNWb)FSRV4wNXOE_sNB zUjWuW;kc#C0UN&HRckp4*!UfnzSfTeHvPsK)+U)RYPb~m&;qr)9JlaGsNL_VrFN)I zo>a>%P@7!D)=xm~JG@?P$a`_E*K0#7Mby15W%?_?`j4bsuK;XF9%9Qez{c;UHv1%C z({CNQO)_6(LN-#{2DR64Su$aiYA+$NbX z784&XgxcMXTlgK+-sq^MYoK<)FY1>yq1xDWdK{ zM=d-LSpPA{Ep-Amd^u5j7hvP}y=twW25frXk=rEm#gZd$xCCmiZ;zT@_yg45l&IYT zwMP=QZ-m-6I%exnMiF%nJ8I!1VExA(w{$IF!&e-+<;{SNKSK<{_!V7@)pK#n#FJQydj@)uDVB-(HYOS9KY&z*xYm>|uTfJ%fYj$5pQ+9^jZ4MOcP$832N zYTw%K68u%DeKb*vL8>Ee!)Ue8Z7j-UHb9Q%7$78er3( zHac%5{l$wNc|$MM4mobI32F~IYH1W|k2_||d!aUUtgT;%+Q+ z{*-AEu>R92*L{Eu-%Q!Q53n)$iml%OZ2Ge!w@K!UmpJl5c2lX8lWJ zPLt)IJrvmo~(`$nKR8wP6<})IIKCu?4XHGf9bW0&Mt}$F@8U z*qD69)^7neok_+)B44~Lv0*pFjwA_dh1eNKEloh|ZI0RUL5NLWKaF6jAp!%;Fzu7hT0kzgms8}@qEYJFh~(~A9B>yEH3$<$;a~LpDd>pXxH|=g}egIf#aO8E8`QlZMyx}IO-S4=?cBnn)VItJMAT}N*DBw*ujor2aM z0T!AzzNV~4c|-DehRShcS#a{0$3(w$Iyw_~egX_hNDoMoW)`{ z)E-S-xCd(AUMvZ5{GnywEW>+(Hp`$yY4)0@gq6xTSjm z8-D1>EuRN$Jn3T7`YXUf>&9&?_?#NQbe&|rcx~dtF{qtz+~Rhqz1dMq_e1TQ9kb;N zQ2VaLgWo`HlT)w`c`sh%1Z=pKBI-WrsKtK3`mZ`}>1}`wKXT-jF9J3$w#Qzv^|ye9 zHb-73nJ;!b@`l@?_CTU`7u4R8sC@_2z9munC8&MGFSW`uXoha!%%yV zW43$+YTxY)YyAV%qPoOlL)Rhi#n(9IhBs0~-KQM2cmrVl*B!U?2w=lc9J%Fbz{Z!n zYON;$3m1CT)=B1z+r4TV-VC)OSqL#eIPF-*nv4`v4n$=EyDI0BroT zQ_%V+z``XPx0R)3jq4=y#a&LrhPOfOwBr`Xp!QZrExjLVlZ)8$O{jfJT>#5^t$&8t z^SoN?5clF`Da&_ILfvN)u{QzMe=8CDIAFui6S3a{Y&??$;S6BmGDlt~kuUCc!`&^!1`w#xAY;v zhU6i(JPX)V?d^_Q`Y_Z!;FvAnhT59;=q6lH z2es#Wz1AV_#ml{38y=;Iy3eIdX8`M;O}Rb+*pNKLmhS*I)q3Mz&;VFycjR>v`Qi;u z!-n@jZJJLk&Oz-Ri3=Zr+P67o%XgtR%_m;a1huWMj_VNjV%ae_yq6;CKJQ@hFkt<+ z9k=vRz=mIWY|Hlmo9bL_E+_&Pu1F?9B3~R#e0U$!9&+5`0@U8=sHKlV?b{u*<@-=u z;Xw&%FK`OhA?`Vs`TZ18_XTHH@hD*ZcO19$alnS(Bx-*E*wo~%-)MGb%2x`-OV)0g}y~|NcPeN^4a&GxC z)Ydt}E?5t>>l||(@?N|m<@sTXsQZ$m7HGWv%?*pUY4g_q*M9DN`1WHc$p@ORs*u)MrVe(Bm3g(s%)o#A ztf{|rm@f#%_VJS{6xaP-#Rz{y)ziv7ojT?l=9#lQFb<7rumf`55v;b-Xk|Iz&9 zO0j1TL*GiJ*A9+7-2D7w4>iC2IP#mlia%`2Z+>^@y;nTf`1o=5LhDdF`&yfIXyUny zuTstN*VMLN|M>pr8bwJ_Kbm@fPL}?;wE|^DpR3bP{h2?OYUqfXbuYl$C%anjyHq_~ zbCdQz&o2I(hc5jZkvhG;_KS+VO_4=Kay!98m(q|^si+D*EB@%9%lrju>nDX1){9Y_~Fti6?7FS|mhZxeW%z|RYO zkp0=E8#-I=>yRmJegrUk6!7Bf1inY5UZGMoztj9)rJYdP|ChZt0gLOp(nZgyDg+1$ ziW(R+9zc`;0b(9B76LRd2*f0iga82&nvrBlXtL2$+{kf!GkC~zyZyzEJ8}ED9oy}8 zyVFTt;`YsT{A{P~>rOjvx1a4!`zC&AqX7yu+1&qMr>ag-5|W(P_kHhvH}!pN)}Gd0 zd#$zCp7(ila`K~SIl=xDl6ec~$i9?VOjyoZ6L@t&E=luTv%Aj&^aX@=@Wg&NPAR(! zkwgx;kF>~fSPJ6K(XJtD%jjc6)^=R(8p#{;48h9c=H($C2HwderEy&>18BOt`BOfZ6k|tHDH97JFMlY zvoKppo!^h+oOhsKPo0AukW@QXtsZyI+fVYEQW8CgY=L-FT`7=pM|M%`SajL@!`d+% z2GS0=wkGoBiaT-gcm#*1BT#H*#7IWwHf1D7xC!2dPeMUi&Jh1uc)L&4gCK+ONn~}D z}|xAqCnT^+}hFnK;}J#YNuR3@Gdw`;ESoCx0DWVGsdi^!}m;LMsat*_wq$O zEd}c)H*`WT;)w*2&9NL8T1WO#!}p=txL>EB-ly;$gRqow>H;vKrm=m;F@!y9eZ3g` z-;b;#1FU4pCW{ig4~^IQ0WPsP?nb+{egINpFCaH8Ela17&p3+w0@ zc7Igf9@);@xNGq2g!@et9``Y{=a2(XOi_RWzB?0)Z(1xG?hWkFu>jvc2*j}dK$yRb z)2k|^43w63-{&tRpTcD4Y)m+A^Cc(oB z$6|xh=L+1&KXoK#h}r!Sg2${kT^qnSa=HP%OGd8J&y?Et{te!g3S0F5w zYEkZUpvX!XM5%<2KB0grge|0aHp>M%zdQme?IQ{dcdRnl2buV3g!b(iPsGRycg$la z$A1R~d4BNQsOxMvE?-(dU>Q4ckJ$PF7(P-f5XPCR4bK4hUT$FPI3$V5uca84<8C_!{5mZ; z+mOzvAe;MdXRi#4$BOgW*!@OTrzMi;?~t1Fp6;i9asxaxY^0BABs3S~jnt-_Fy;>7 z4e0SbNJt1EM(8Q6l&={ zI_8;zz{nPq7^M|WeU0riWJ3o89bP6c3gCH!*gnrTcyVL{Q*?mM&uxS%wN)-%nzgQ4of3v9B@lPl)-o z5@23N%&$ojI(&-Iz09B!zHSPoTEW)(v7qKdGXU8L`~LN42b-Y8Hco@_c z6F#YP4?MT)B!2&eZmd$DwWZR_7n6LbQY^#_d{-&N0zs7y-YQTsM7)exvgVMWPuPa; zN_dL|Av)r(BpWm5mibUx+aXv4-&8o@^^C{S{(oi2#@^6&LaJ&mS+E4FJ7;a>m`%Cs z*xmMRY|Wy|G zjsDV~1B&xCP%m?FLSgOe|D1iW?GXl zrIvpx3<0XRNTDY%LzC&8G$%dV)ox@MWC7#j4Bg-Be= zm8y#9s79yJk{oy8$vwA6#!AGj_ofDV(pNsw`0USdtmdrEi^tj^MX+QgxZ&PE@iVZ5 z3|l^WVMw63IV{L5MH(~wZ80bDh3QkZmJvyc2J@p7Lo%t)x zY!l2jA?av2PT?^*_o_|M8TFdwdoL{leQ^$wb`onax>38FZidcy{~q`laZ2~Tg4iJK z0mFixmLhZ1%}AV?zAF6OaS$#qy~ZV=zx1sg$t2)Lj<8s&5R!O?X>W5J>C3xOHVHHG zN>>1$nq$yhg{S6`5WeUf??G>hrxM+VX(ai;55|v_pmf`Q(c;-qG{#{z#!AL6q=JOh zH*9c2r)4GStC!|0uQ-C)c#}z{=Fqi!3=NYf8X*r1EJ*=nbWeaj{jn0GF@>~dkcP0 z!o(}Fh zxFmt4j^lI*Q&w0cy;%vW8&!JwzAg)QH0`oZ7*wtCJW7z=<-}7%aaX6-_qrZ}rjG)U z&Rs8(-f*L;vcq$In^wZ90^3DxZ$#wfx<8%0m-Hn|haHfDPA*MzCdVCBfWQ)JF|i!N zBt%hD&;~8~R)k%#&tesV*6isGvSxT9+5Qwp0QU8naGLRa+^(>+lmR@fxJ_~2sks4- zoksVx*d2kFRcKzl9}g+&m3Q;L@-gXKS-4%Xr!02cu(+RrbW6cGHD>`F9Q{IK&=SX4 zjOA*aVsCF-jo0XtGr5<<27#d%>X8Dhy?2;2WiRAwB7!i(=yM>-#~T&3tvTKPSbVO- z+|ZhC|3Q4ZLmhKHfD+yWUcB67&+e^7F&xW;b+7Dc!Q?=3_LTrCaT zum>o)GNWc@HGqgLs9M4vL}<;37^^{q&hJcA9tveINhW{1>xb}0`$1svHY@grQ6wr_ zoU16g#p%$N?+)4T)-;6a?@|Mrk-Y$183W(U+3rLXgfL5XI^51R8(Qa)K92P5C5+IY z^wtwIo1WO8O_gj?_+pmk{R}l{68#lyW{VA!78NKhOwZ;oC0!R((NZ!4-=0{R?i ziHdy}!#=(A73lH=9P>CFoGDOX)+~w=H44Xi5l-v{IB_(#>ZL^rwp3H{HT{)*uHl}$ z_=V!0OgN$})Wd@M3+9j(UeX23&@M;pSOiD=uxO!EC$Z(%_D&==k-j+T?c~`uDH0Pu zJVJSCXdy?d$_&`7g=#O}X;XUfyqm(IXw)7;y;elyMObKRE$s9uI+=wKCduNAhX zn6=zvMc(mW3qd4fDg_}!Gmi(nmm0BdeDobA5p^@6%LDHb7S?OQ;F|bi_Yi`kSmevd>w^#~F7*rOT_c&qC6KL@Qg@>nQDXOw73xs>kk4$!?Wy1S; zHCW;`Crox=D2guG3_YMM!zEjPrU_4)nvkSF3s53hqR(WcR}6U$mGuaEs?>N6_1ayY zn3iG9u|jalVw=KWvJDQjQ9+?oe#vv-MMSKA#6aT4%Sxm9>5{ZU4?6+lSH9kW0hMo> z;`PK&@m@O!jWR;69iHO#Oht9=`6;p2{(6env(>-@=!?gCe!7VCRa`qiCEc~rDPGAG zLWY5;e6;~jfy%3=cnwcT^@AcX5(xUGE>CLPLi&P&%UgpI_&~WZ3x~47FNB?XphQfq zeo(|V1D*nvZ=d2dJl6)MaA@-XEPZX5ly(OtIWQ%O5g}0dDu2MW=ltnD&kaCqj7C8>5}w2^NUc4@Pj95X zJhdqVW&Mwnov2?qb;_VeAU%u?N>o=kBK*4Yue%=LBhl^{J&cMyJtJ?Rp;C_!oslp- zVrr8PiU_EI5vJ#O(XT1uZLFTNp<>wM*6$zaDb7zxVdTH&Ma0JV+NC2H?z!*HhLv7B z`8npp@(xK#u?I87P7Tk`tplXZu&LWp=*%lzUYc?4Sij;~D3XBT#HHD{lt>(qQ*feO zv81dVWY&{-i%-$gPspnMd5-=s(wSfES(q{JNbzz@aw`yzPWHL_fyxp53Z>?U#^(TJ7Z6@wqE`C>?f0B&ilXmdP@At zp6=m(rEu7z%=rk!bm33Iw*)nOkFil(U0c6#rdZAO_3O1Zt*)w0t8dhr>g({W&ibY% zt)d>^T`rd-KN&d`ik*<-x$ui=9}x zlk+^NhI2vJ>Vl*?(xJ!^>-lBasFB^8(Q9wK@n&ZOB0AIIq!hx@cW^kkmC0S_T0(cy zp&gTB^eGLRuglTETSdDAPG{V~Gjuz1Qcl$*+KEY%6lr91|_N02P#9Ej?gftq!> z;b_HhhKEnG)>r9#K0JH|G^v+{;GCa{fx#&3j(YJloLTIB=?xq0ef!7Qc{#t(%rI4< z6TxishE47=4Rm6lq9{K@iRP@m@jD2#o^p~N{8}PSbEMx@?a^!W9$0N&ovP_!P4OvP zb*Qn%Wb!bB+R``JML<#Q3!sxav^>w(dpFi>(D9jDYWJq05n!IzI@_a{X0o^V?7peh zRW;Xh9;s#5}SXQpwj#D_KK`K)+Y%a&q2T~u>M^lV$w0mWCOTa6i<=p?*AbsON6LNw;;zh+`xv&*nVK>~W4aF;vtmta2>m9$DEm-5p-%`&X}@*Z z)j(JkrYIkrS%W1Q_pa|#)jXrGf(!P3+`@MVdIVM%~IT?{L5)t~I`V%RJ|yCq%G z#fP^2$)gOL?b>^wPs%896(ue6Fh`lI@c61;#?D90w@naoJJOrG_As`udEgGwAaz;O z)?yu65udlgsxjS4SIz7qG(UWq$lf=13~j{V={`(=G|?h+i{zK*D|$-`O}IVO!&QosRf^ z;;KJYFJYa4R(TlqQ$WYN5U6(9>!RZ%-OGS19)@)TTGqvMuf)f9muL*z7C(DMillor zes)`$g!RSG%~~yCZ@Ow@lPD0i-@bFrQH^=ucGWHJ@DO^>HE?_uBJqhtXH(q_51~6; zMe}2O8GFICYu+~D!Gm>+S239>3RzdNC7bLQAKLY2FC&?0p|b;Km{6I+nGr?nZ%PLg z-OsQNS93}O*=O2$@x_XiK0^D!W}AoUDqPKTma#C?!}gu6a|C+C-cuoGl}(SvN3@98 zO!XvGWxDS;ODhjhY^KfjQs=xbhP`9oalCIn!*<#08W%SZ8nEv;u`HdjAKSZkpY$;7 zpnc9ZX%wb&uA*qGP<6rC-f(P?=_Xuli*}JMrq5mdbNV#oFo(t8SwELy<|zA)){V3W z<{8c-u`R5x*$Op1>S5T3y)LRupcs3db(_S_MXZKMe6IpRUE4({fg&eW=EV@DwTsYl zgsrdsgTmZmsJY{%SKmoCD@DDEEr-m0&rIurfAo^D6sDk0!Ad_L#g}i5<4b{7ix>oe@~9BPsVdBWCDGs+tR(au*THxv8;ZHfdAMUO(U{v^2VJwI zv=&zG|;YnperNUf7jjCb30PC`h_SbyERbvfj4vQJ;a+EnNGnlT7VOA*92s<@Pq$_&<0DBKh zl&i>T2B27?T{Eh8k^+nE;$Q#HaW`|MxklpFl0M5K*GR0)UoG*jk&$Kz%XV&3#9mtF zyXrQmY(|zf@q;UOv=Q3itn4jgtF$b3Y%M;R#;{I8_zaPPRplDMFk5{8NeK%(+PGu8gJCn2 z=Bm_g9ZFF1BsP2o^HNbGT+BfzasgurSqq>gH7S6iRynpFzLUe8sBO-}5nH!|zNnwO z>Z%e*eN>N2J$jPzhsLdmdn z)fPf4p=z-n=16vyZkr*{Lg(_8s|3ohcQ+msXpw7q*R}=)>9QRr>!Aojxvmvk9TCLR z?b?I)HyD=ZYHjM5GI{{*>ta~Gb5X12WV$}bHdEIi!wNu4jL>($v9&){u-xO?v3p=I zW2=GLxtBQ}L}_$(&LmoETSlP@tg`<4z50Nll}_tw{uzL+BWmK}#QLKXHc z$0`^dQ)=I`cZWdb_8n;jT?|`q?|0AE2yM3Sh$!0wK^+pD+Nk+?RKB? zAYE*dvuw}0F2*i*wj2`rVmCTVmoO4vPeqR><;J#O{J|T4!X^{D)LGgp6d=bEw{+&Q zk2~A*%`7eUd1rgoj4VPwaqY6763nmJJL69YzCL@&vMq&-ecf4FE!4+uw->gZ;4mR} zpR;}GDmKR00cVA&K=NL&7cbSJ&z+TKshiDgpI5n90T$cB_{BS=SGDCiSM^CRXiIXn zX3<9B^pCT7lZOq;RziqR4%kXvt(%%isqK)fuAx|<6Ap87rQjQO<@d~@S+m{iTwbwG zV~*9%G^@zcR>MK|T81?_+Y5>Z2<>tn-kRA!=zz;wyi{Y}PhG7w8G`Tk&h$B)m@Bpi z(&EEdSX`Jrch`0%iwn2czE6V~7wPI*F{2Bq;%u&-WmN!_xCHy`Wrt1@n&WIrPm`?6 zT}u~=0gGGcOp6rW#%*?4m+d1>ai#XcPAV>rdAqDjWgHOqb63e)s}%OJE24S5V7bb$ zwJ6sfYhPE`(SRKGS@y+S6Uixiihcb~wVzNX2(4red%G*_XnZ=B_#%`AwTNPDwtZcZ zi{;u&?5pP#QKt60?W;3vf@Q6Jb>T9FVGrA#8=bvOx8BiKyQPazi{pT*Lz@uRBk6vM zFdcdgVLLUZ+l4S4+K;gPLd&NJ)1gs&5!O1G?psBsHbF9JFS0Z;$f4MaX4Epwp*q^? zWJuspFFtw+#~UYVd|%LvxtPEfLnrL@lYrnXv|BS#OQt%<}};;?V+mDocLXL*)jUhZtK zE2If^oN~mc40JKwN(ZhJNV>c1Yg_iM4M$0WGugglS0mFo7XWJW07@zZ zw6zP+{6bf6rx>O*K<#shCG9>}Pl-^F*5~S3E{!*Bz_qtcnw>k+wfArV^SWd0b+H3& zgp$$UW%VPkyTW;3R;3s= zy7?Y`J`_Z`nOtoY*UKYdQZ_S*M2JqW^$09)U&O5y!}S4~GQ z1Kp*74oeva04{<&fkpTU`e4XdhTwI!rZRv z!`l?aL+C^&pe{fdueNuo0F-#AeU(Sm03|pUws;}{C<*bW07+ONk<#?-B{j8cm#(f|w`Og# zR*;*km9MYVDw}Gi2ItLOTHnyT?(*nUkDa-)p+PIx78lH%nTemadR=W5GfXu8x3xzv zy|dueZwj6)t*9h>e7!Aw$M~K{ikoIeHndzhn5I3R)mYzbWE_jjc>S% zJHJ>3LPZtmss6_5`!9d9q4LSg`@Z+aHzy8!f8EzF zyKDvBLWuV-|M{^E1%<_BdBE0i<*)y(y8KF1M*UM4zRRktO3U zrT1O_R?jb`(DOutHF?9$%N{__@2bSEFXWP^`+foGm~EID=1fLtjR&>+eENY(U5@!p?fsW7W@NR{YD~?4X_rUqd*dH!^0N!ikdH>{2kIthlf!Lli?AnJ9)Rl@#wIL?>dJ`amyA z^0N!jPzrNP^7C~nq}feru%V0)wUCTsGiT-QA79@b+`?|47gIQ4G`WCQ09Rq25K%la zbM;rhSKquu_!8$H`+(3@pz?g>0MwAq}X-o@ujK|D+YW9U@ck|;Dw5VbN zZ)8z#sjCxN@y~|IS(1H@=TuLS21p(>iTkRyu(7T1!^?Iw3X0Xat0k zk6LB#EPms^-OkqL9Ux=wO$&dtfq&nxTD#Ux#(?o8}UTiL3?n<}j>Yjb`HP>LjP)Wx6+&u`a?3$x24YcB2cl$L6CKTwJP`|!OD{rjQ@Vjo95^Q=4a>2L!?7T89y*Rft zV`g1zWz+KIXtjFvrWsNc+#pY}KTklxGjG<8q~OBrA`Rjyf~{h%=}QYr7>TX)dabZH zH%lk+OB7dx0X;X83gI2k&siC&K{T8(Nv6L2M%&csxS`X`d z3tV4{#C(XNpeP@*h-|2D;3(~u^ypa%sb|%VP0i31P$jv(M9Fz&wDswEdHK1hSYuUf zeWhNpIxwlJytRDcE$A>1=@s(%& zK{Vv&W@DI@msgyR0c$3H(<><$P$c9Q7b2~cwj}aPD`{a~b_wiiJ_?RepALCp;H`~g2H?@$^7D?JSc%Mj^b}@sa&^Eyg0?ODy#5T z#vy>E&@VSXmb@S|c|IfKrw#vagS@<4i-w+3ETvG&b{JV+Sy>0lSaX!nT)Tcf$Sy?F z&h^DrNSwdfugVhUOi758dOOx57ZowD4^uudg(S$91kA#c%WE51a#PK^hBZ|h>42xI zc~hMa_L~UEq-17fMR^@kl?Ty821zb*<0gWJt%G1)VfVg8B(uB ztZX2~4QsBan7-;L&Zv8!?DDMZEANZ+*Z#UW)XbS?{Kg7~zV(^bcsm26f*W^>g>CWPAj`1FmesTPb#9V#)ZAfU!kfAVZEc&764@qZ=;ZNN&(wmM)Ctf%BM#ZE; zasuj>oqgerYgP1RJNv>cjI*-EHkOpoHa1qRt81HT=V#tT1B-5vf8Cch^FE5u>E)G_ zd>J$EBgL1I(^l#uTG1ay16D{tLTN7T-YpqWRH&!L98pU18)#P-&P*%<=Mz z3u(Sq*S0UwyKX>w8!!~iSQ~=uQ0qX>GE`b}HaD)v2}EB;KLPlE8#L&~{zhh+cy3CB zp0&u&`GAF=$(%vI+n{24lSVu@rNWmrKhzq|45EPGEvYD=0$^ZYeDi)@7eFCKN=)nP zY$<>CkvG%>vovvy3-z~b=S4Se=fy$oT-F}PqTaht7Ii|H6PTYBVa4p39T-XGm0}dJ zuDQvlUu&wG;R%_r8tax^Y}+eYF?D(V0JC0s;DgAgt~7mP&ArSiY}IG3GKb>Yqf{-j zLCsYr{sfD-e{}xHgFouQADh7+O~D^6;U6vGA1&b@E#V(6;U6vG|9X}XGlDE7hbL~Q zPJ86Yg-khab>zY~?U5rFH`~jQSr4Z!*viIE!Pv~i=XPU0$Z22jR%y_|2J1uGPVX}f z={>Ud5ZF@ieoa3P!JPPUo-^AzlOX1x#zuV5SrKfxW@9c`kjMSjkZIPH9{(P`v2$%? zEoRp7erG{XV1~wdygosbGFh(gr_Ww*vTq%{vvK)_-&fr~W^2WX3+`-Ox&L?CJ=5)M z7^gFY9({kL6zdw(?QC3$NLlwJcS%O%h=rd({J+TzTQ>Ny3tOh)tixX&z*>#Iwc!n% za<~zP#$UIUY#v{aLmx$joZe$^I_V!<=Dy;LHV=G5g23--6_>|?KXJfKL?YCO(br%V5gE4=^K^a zhkl*YjaC1dL^RE!2c%@=E#y8{$R?*`CIa7YrhW!uDmtUVV9WJ~oBjJfc{o4uRMo?m zFU*a6ZofrvS(myyN;tJ^~lbVH@fYw`mo#|wDEKKFSNhB=gPqD@}MJ2 zLe^~@S;A&Y0bBC(JE)ERwY{eDD{o;J7}D47Gsv0RutAQ0^M`9wYz?RgwqyKReFtMm zNkC^q8n<6gf!!bO#W2HEJ_Za}vG8%67G*s9Pjj2D-~I6^EVi8G_*Mv>prc8F_1R*W zl#vU~-+k>7S)jf0_V&ll$VOaR;Q#i}%tyS<87?XskDl>W$A8eapsz*n7{ZjTG4D5b z*WT}Ea=Gp!7Xo~}uFcQN-|Sxrr_l?lI(FEM3WaQk%I@2hw|gJE+xs=q&aeFA!^X}j z_XW`nyjJe3x^G|b^8HV0XR_!KRtWEW+{wQA#^B{|LGf;|Gl;QDiEv)FMd7P@2D{#Y z`e#*Ld1rx7+XE&m$aYWD=NI}{^z*oZH+`Rx%LWVOE-05JeT+0%-rqUK%~g$0PhHaw zG2+JIAK9Z3BQBO|%)0rRJ|0Re2syudi-Ux-v&wn$w-gQjg&pI2dE_W?z!Ycsu4}ch z+aSqzzBKee6py*e;a!ZmiguF+q327D5mU%XU2r6DWVkrL)HuK=M|H2?qz&njRYF`v`2{{)`WfhY zeK>jJ0R@#Kkg*_l{Hx%iaW<7_etkOOJLNY05orBvxnT1j+~vWA&?C@B8#lP<-<8SR zJQ4j3jD~U6l{s}T22Ma5tdJAXGR&BM#$X&z^B;zqdax~EYL*xq+#rI0uRY!@q2O@c;-Z z!&xwc9X!*1!-iszVRYEO1OGfX8?{B-0KOK4o>mprHbywc**Oska{5jmm*mmz23jkQ z{eGDVlJMgC!^c5~^rf8}=X8xBFEtd$e%t>>j{TNloT^hHho=JyN-4-MNI}JJ8ZF9!k5#W(JpjdP^6Z>96V z@DHb6yuc^}P1R^C=tp!xg%}}YL_TJHUyONS!MOFGZ*+e6CW?wdFvg;v{nKATQ40(5 z#-D*n_a9#lT*0_rU5%63a&y2?*ucr`vhk=k$OtEpX`RjbP%xym`>OyF%5r(yps=*K z#5a%es{{V?gpDlIsHN&0zWAr8!?@0UFi}ww58}B23xnbg;=)&yco$(s#|meqq>Tfl z4r&X+@9g!yrdYmdaw<^~-Cc@}?>j0B@7z3)z4bg2-*x3XkIlh%6LFCe%b}aR-??P| ze7H?C|MrYpurN zB|dlQ=tqb^4hO$2qoxi5pN%i4C)axvcid&XR-Q`8&agDTw73%KqMilPsJ4Mb#o0;D zbbvHGWfLfz9|}Bm$!1Z%htC5lxg>*c@2kx~5H25nsX>t=D&GRk0acE6Aho_i!Vfbd zhfWJ3Oiut(I>^Q%1HA_XrB5wm3Er%A9hWlrSfo`R;3X8R@}eECv1$sv;f%0IL3pVG zFDTjIbob(hRtjk8>+V%>my1vm$ZZl1m1uwh-m-i=iCZdOUtSApuIGg-SVnV))F&nH z`0o_;$$(eSD_#_&Dd4X1xEotR%I((U{_h{>}JP>BbQq{~|cn)MvH zLwI5rkGdZk2V~YPxQU0aG$_xGWtb;F2iv1R)xSPM7UO|n_hIVRv!jnATheNq+U#vt zl&ARyrp5aJm_sL)UV*Fu-t#LesvWPh<6THV8PEu|jNTpidZ3zt&$_5(r1?#T9g`%G zw90P_su>8=Ux1%QfxfK2?wG46%I9zWrlDx^i@#OgJg+EsO-@t{DR1WOqj(M?)+1%a z;7cv6>buD~;pYwnpp#=W{><{DvG6%z?~R53*^CK!h!$ZHE`&uEAZ+Fa3G;3qQr;DO z$x9XGK=KOHGKKFW$6k6BEx3Ofypk>%YqU1+hu24p?;mm>rT!htnT7j{UB?x5fZhXw zbZpV-xK|r+Yhe$aefWrp`xt7eyvv9uuQ&kFd0#_4_U@0PL$!%_?ku$F(I*u(ISCh(!||rGd-vE3f0DUK7dQI-AvJk) z2WpN8#Ktpr3lJpDQ`Fdr9}TIII_OBv5`No|=SIy+|z2vLJk5C{f)! z(E#*PH?Id_c-|fK5lZPImPoW7D3@9$oP_GR`AJOm5FRC0pTPGb)JBPru#!r~BJu9L zN<~qj3~EM+hGyzrg~S47MkB}QL3n2~uS7`L#s4~_%)a=JqRckJM)Q#_iRs7)e!Wla zEcPg-Drse`#{nth-Bl|yCnr513f9Ux+X8b+Gu}boJg?1w$nlj4^(lNhME%j+8DQ>c zGP$XuNzaD2MO&??Tha8@7bGG%J?xa?-J_^y=0~s^xr*8##4k}$KeE1qeBA^D>W`T1 zMahPO)U8CnS@&8|as9&w|2m}pM6!{fmn0k0Z85SD%MW#LG_%1`M}LENsqno7_lhLE zg|5H-njR5;?nHmOS!M64-kmkWQQRmF3Yy~1D8$pWJ>#43wGlF? zr!b4&6Zl{Sl_`U^_X$Lptl**h)c7FSEMC-7Z4?M!tMWnktc^PZrJ3Yy^<+aj5QihV z3s_eBpK~|KhivBa1woTM5e}`ee}*y?{lf=%>R(au@;_|!-=j!;CIFJ{MrgUSe4)mz1+XY>4yD}kP(*n1me4oIC2bjF-8NALt z6G)5{s53q-(S}%5QZYlhAK~DNhsDeeHOt8f)karazeyS{ zS}@+pE=2!%H!Mh}O%RW0j-Gg` znu-e0CY!-~#f-vHB=nCK(NrR(F*xg_$)8%&J&BHDMk|-gx8EufO-Eb!g6X6ChvBq zc7ZDqw>3n8;TYRt|gII&bUtrV}PT}o8xKB|zi!tq^kx7@Zi9uK( zJr>y%Z=c8X_7|I!S>F?gMJA#N>4^{4LU<=Zi_-xFfWQ|{LEL#vmxOG1tps6-l2)tl22NMelGJu#DO1goc!X)rprNmfn*BCB9){y zk{8hYHTXQ4dltU0sHhlVhYc=K>iI>QV75@Qm8hgSOdxzF$bApG3wPCc|B(A$M(A&! z3+qQeLM&@ll$HX1eZCende!jBj)Y#ty*gzZFkd>0FypcF(NZMtu0+K6$9SS+4D-Gs zbhqxR(IKQ`Y4@?UsQjAS8i5%0bu=D5Z0%ek6`DnCnEsd*8rvdTe^t<5z6al&Af+R) z$L1O_j)mLMD|odtlb>K>pq%zbpvhdd4Vf#vwlk9-;4^#YPF{T5qTGd%g*k1GCBmGV z2xkFAWKNq$evMLzFTRaNW`s#=j$Z{`fQp-aUz_IWQL}sS-0ih@Cm)%A0^YXm#YVz zW7gNV$BiZIPJN=&ylzqMHS;T{uWt6tDmZlRj>Fc>3bGM0O=PE zL(rFWj1y=&lXDkx;|L$bQew#}H6|kCaE=QQ_L48!) z7aP73#jlOIlUHc)N`y?}(fXp=43$UgGoKDv5xqzz-T(@sFmgW&EWn&R@e6nv(TZk- zrGPkim$FC}F5j2YjSAbpkkKX#o4rk2zjpGAe>A^nRG*M}fL~((KFf@O7{$clo+S?B zPbG)_R2m@n?12cyB;SVn=Hw~x<-{POPuz(ttn@1%Gv05E}^a7Pm5bku9al=DrS6`ju4voobgM5P_88jAGZetEazy2^@SET z;#3lOQdN3c{y$OlWWLj#*I}65BtUz*n`(@DU-f39p5xjhz8I^E1H-qFOEw z@R0hTPrg&H^e=U?$W)LfOJ(i?LWh0mkpo`Ge9>K@kAr>17#QL6U0Bj!ceDiZwM#mL zp}$3#-rq`?I2^B_7Wj$Uf?*anIz&aA_}d{%J<#JjC@G4&0S!C)(~G|wazBp78GV>x z8yNO`hCRWsBMjp#G5RxxeUD*B8P>$Ga}0ZuVS`lVX0&NbkCe+I3&e|9cOvYc`zf>| zr;X{@^ZL?Z?a4h?I!WdzlXSmUQgWGMw>UfNPPNCLJCSQy5opN#c%$V6sc3;!iaG`b zvz#E;ZK7)4E|28|%SrZtRmsAUk zXJ9CSW+=m_Qsv-Uzja2K;sH0!r{&TAlz|3(gC(&DYloeh-(i?UNLVuZKE-fOv^0+3 zLqda=Uip4Na$^@_nK!wN>DuWWWZ2Yfo4S{GDQWXoX}Tlc1$V-`U@M&fG+2_@oHpDR zHc!ugG=Pbab_cMJZu{uTZ=XAr7?u)Lgrqy-L9qgfBLqm8IGY(OPCKw9x6&(+I1(XY z;y9V)2$LM`3WkJ&WQjGLV@xd0)WmvTi8w-3hQquDDjhQN2GSiVt~j`Ia&j>2P)K6& z0tb*1Rgfcj4OE1Tyg}*yhta&VD04~r#ek;6a3os<8i4#n z@j{d_L@g!uiu&}c7bd?rIb-u}R72IS3+YmvY{CIZ&moBejvgCGlHz1u$rhAX!u&{e6*tNy6jYF)5+{i{ zbcbZjV!9+ky2Drr(xR3+%cqGP#8*Ynhu=G0YzMMd zPZN18jaeU^E_N@nHcbKr^_SD?T z$$yM+>HUlJDnXr$4bmBy;)sH64F|i$acoetn}!=A;`AmmT}QL7xHn?saA|}~GTo>x zFF10bO$l+*O(Uo9ZSH@Mcu-gCqg`lN$56C5(iBH~PTOBPcU+5DueZ!VY_cRi;_>G& z@=BNyyO~MaiL{lF;T1^2jM$L8^oCdj-7D#i5$Vw`I3Zq%kT4_GiNqnOg7O-PnNEI2 zV#6ztSTQ43FWe}IsDfgNPxmq+h|eM3|4(VY`r6{*rRVNUjGQHEDP4=+`!s;uGwaUd^aukHA&L+fBeXSO7_dQjh~&SYxW_cjj?S_}N$lJiZb z-7TssPUQ;hN0yh|>87wX!~Uj@8RBXUo`_dFxt4|rcf82Q_P_a6{>INmx-$&$Nz=zNEUYj`@@ctH&Cj!3D7u&WJ18Z7?C3ZA9~wsQF8;{rHHfzeC3Qx4S3fe(h>00F)}0IZ9-&xz}L>m#Q|?8 zB9j8XJ{-S^diFfDW~DfCE=N{?ilI7*ST%_1;4Cp+=7C|W61R*DHz0^h_}G9{@-PX; zl5ZOzV}Iky`MW#ghHaQSZ$l(-SSr0=8M53@sE*L%gf>X*Z8#fdINh_(9qEr&ZX@v@ zm_(|4yAG@H%C>X_P7@>l2*>oO@J8Lb++O(CMP9yQDv-Y81oZpYG_YMrkQs-=e zW4FVb=z-H>gV&V;)$YhHY8{I%dw*CvhIIq&fNN_a5BJ@P6?1DHP7$KCIE!^T*4?dZ zgh((ld=dh{k*MQ1t_dd{1r0I4!tG&Ij|A&+*icm*-37hM$U>|&T5GrpUo*Z_vDS+h zY*BJ@K*T(7X+*c$!W+>ju1>BKER1!hEC6*W+-aJ$K~CMm|gdp$7K*}>2b*Ps0bVvkATgV*cArZ_` zFQmz0FCBgHo|J|ohr1Pg!45psDpWR=$0w z0l8I`&U(ncQRq&tNCw#)?KtUReTAy~3RKtq42m4-7V%(z1YgspkoCS4op1ZqawYah z9*;7zt)LQpE+R&@q1@Phpo(oLGzXB4^u<0+=M#p-&{1^V`h4uojgu2j>(9AH-vaSC z`T&_TP_Cl@$Mr^bj$xfk<+k)joF8zP;y9uESs;k(f>aMV0L54Z6{y3}i`&G4bA0YL z9SiV1FA&2>GcX60ae7sSlmX0X#pJ;}4P#F^T$ai0AKk| zp#b$wTSE%$q#%eT*Hd8T@#5R(B+7{69!!iCy`pu}P(8AJ7I#@PaDc=80tK*%9BSm& z4Yz$9i{vyFAp1nf-Vcx(0#zTIPM){R2iE>6v@gZQndqy0Fk% zc%IR{nRLHIy0?JFxc&70klxKkHCO}lSPYS_fDW;x%>w(}O?v$zP8X?iECuLanICjO zC0NkY*U!);*0h7gcCiQ{ZzJh>meu%?kmuJRLw?gE{xXdFDb*%vTE&H^96WyPYe`ci zr?gDl6u%4wp9d6In$A|%`6t1mJH22k1x6$K51@d0yjjE^V11{q56Y1Hr&N@#fcIs? ztL31ji-@M?rIn4_FG%%lkmAcs(q(8BBG5P@hF<+pR~{t!>5Y=$pwz-Wl4PolyK5|p zLz$HDU+1vt1oWmD;&5jsq`;w)>SvQ6F+*kk1NgM9*{P?pJ`tcg11!BeX0CAvTWZ^tLhf=K*gIy|2R9#m1FLzjzP`^eXVu2J})1 zgRqov9GZ13ri`;GfVop>F*MXi3y?Z`3|^u4@{uX1McGIfTB+(x=lnj^#eYs4D#kpgy|adU+m9EpTo&llZbV17KZjfmIbY={ok z2!zp>YV&^NKO{$8@0G;lO$*AFLvjWIj&7q?Y_qQ!wVIYPBJGn(a{TwYpGJdU0i$N{ z2V?7xaHKEYgpueC*r1>Fqa?R;Sn?(rw=ux#9XJy0SS+#b82OAE12;g*Oy8$-v~AK~PQBcDaCh4#g^ z@Gwql3L(jXqoVFq++vAsktEEP>VeK>Q{l5k*hvgC(Bs@&Y%>$DC%)zq;L9eyW=TRP zRq`4%qdmdA)#5`~WJwm~)NV*ectA%VUCP3#e6w9^fC^199oGp4&E(ktn@d^jVx2co z*Q>%HLtS&Wfe$=bz{6FsKNa49T1WnvsQTF<^!;bx3k^OsC*ip_BEw&hp}A8E3bb!>sGnSa z8>&CzUTnd%ABX#fr5gSceTAV(C~8hG&oh0B*^5`j**-|uok~sHk4ic+gg4ai4j75> zNujJ_?)rg6zfQOD(3Xv3HJ>S9ThlS6Sb&)5u2M{?f+-z*R788dFO#DRIt;;{unql( zR1XP4l)zs{B(CA4sUEs$%P?kk0dMDc97awk$j0u;mMt~qQQQ@5s5{yC^^?dT$jA9W z3x0=3Eq95%5lTgL>@a?%^D)3%N-fXNLtDgDspW|>k_T-#$fc<9m2fb_vPFm&)?`>% z$VRi+kg(Bg$;~>DXDbR2zgzf)aza!DNsyQa{oIRz&sGGwgY7Yo&sJf6q?kFZsT#+$ zpvvG4x=ZsU5iCL*z$6Z{I}t|{Nt-3Z>9H_;=gb&~lAuL;htr58A}mbK9Gy5s?_MB~ zAwa<=nCb8ukbXB{7AS~0f_5g|D$0ET^$jN*6x`Qv z^x?jSqX6mbG`F@7^lKhGlPGzOs~W^&)z5_yJr9;ixi1*yN)BNJK)p5q|0@-r*| zqpRdGd0Veuedy{PLWX}9gTnpt(6e3bMz)02luYF5i4O&myc4K&AIQT&=^1eH-QW@(vF73PDv|Hd(iWtSb~=8G{=_a{Es|I2a@z3W|we5b?0(_5h#s za_&4Cpb)d(!5QdDRX%QfATg?+i<-MPO#BShCv)0IFA%9@1A4RQfkCP8lx#XU`rRS- zyQ5Di?sw@ugx=M?2feF%kH|7aeGCN5_8zmnC+XP!J8|K~U9bsip^~7zT(=j!e?Q#} zF+v6Oh<&>E6~r29A>Bg|ODLnwz%na+RrtB%AXhjPXGIt0TjY>&^o<+?%WWhU1V#?A z*r<`&BA0In>8ul_(VLKPw+H>&e6VRd%^FWTD`CQHe+MeU!&O1Ft(|OJv^f}9vJ*5) zBT~H$>i4{!KrAk7VTKAF+HGi#ex2*PV96-Ur4)7tB;#wun53()D%UkhB*yrgEicd- zO`yd-Ic9niC(WbRV#SNCR+^t&=7p1`jPWEWBdi7)fg%lCq8E;OIQqaGnYuWVaYqD= zy%t_lDswSjJ4VFcqsSZmK6Fpc+~Gf88*zI&rnv#9P+im@oR}A!+=D+(;*67 zeIGb_$wbJdWM!Lb2+x7;NaVR4zSMq$N3S&Im)p zZkGo^H4oTqTBHxAZN!1P(T>|E4T20shiQpB8q|cK_vYImP2?dekEZ6(bqH2ZG1I=p zPib$#(>KIAa)i5*1eP`KeL~qrks|IJRW+mv<9U=3d$8qhC2sH3x?N|-QLRwblfKsA zy{v$TC?TYZRtsCQQPgo-(gJ+uVw|0qM6h1B3SXQBgz8f#nKuK&D@El9(IV^FOza@x zL5sok2H7EPlVY#LXvBWPyMD+%j2kbz!qQR(6oo^_{hAxl*lCDtu{#217*U$){TNjp ze|X5Ay4Y>QQgH@imx4=b&H^}NwYY-l1qE>&|6AHB75kj4aYOd90;#eZgyJ^T?z`n=4w-A`Q%ony{4^VMALe0!-K;cu#zB$grCJ za^=#A6omN^F1lSBa{q>wYX*(X!Cu@lQF?JXMd4U4Y7e1aE243I6m7MZrU1S34X-8| zWpr1gN??v-L~f@7i{k07^@YWzf?V^SXoP_lWfHU~lj*f+p*b9L^;%&RidmyQR^-6# zFOtE+r|&D zsaB9dP8d|&ckFS(*e1|G1&Rz$%TiRl6asR+=0_$w(r`^*`Mi1vQZOe>cCaTgV@|D4 zGxS@O{h6jhWz>Wu{aJt#QGI+B{l?VE z$xDu&zdS)a5u9$Mr}F@x1#A0A9gD_>7v!C>`+jI1l)L~rq6^&^N( z_r%i|Hdy^QBb%-rgpTyA8>ntZ1!FN-pI&yk05dkR=Yp>R@7j4p?kFFq-j2w^Yoqkl4OH)huQ*WTUM4+IzM47n z2CILA$ff1g^yLp$^CVZ=i9l5*5a}sLcdA?}9IR0pd3Sj$y+wmHIINXc<*#Oqi;-V1 z7lKL#Yvv=ex_ldxmJZhNJXYGn<=g2k8>}fnWc{@Pkk?Z_P&1#APh2}dZ`DA}g2~B0 zPkX9-71GM@+H;5y==0nF6bSnw5Y|)S%b@hs1fZq>v^fCv_@TZ)4k_)6|9txO4?x*A zKW}R8A!V=mnNxE=B6s+CQ}ZYz-w811Nkr}m@PazAfGSicQ02dD7T zjs$q~-sI#PX&0mv!7V6-VuAE9YKV{}qzd&qL^+DLC->xv`r$#h>L;m|NA29 zAaaIZ^J+&J87HjnD<7z}BQomRi(q$O%Rp@cBWL@St9A||ZP&br+=0mC$uDf~z23(Z z%ZYP$VE!V9rc;VNIH}R8;W*MdKx67zyx>v}XI|m*(u{M*`W4SYazjCj#LHA~DUmoI zr&#gAl_h26AhVvtNpeL?KOrlh=Q-xPNN0YrXJN*?BgM-ta@=xs;+O9wT(;wiHk|ou z<{j9-p;^CL`{(07dFNX9!8KLq%Q0H%j6KoXdiCS8pG=N9@BixSDe)_Nx`+Ff!eNgx z=Od8Ng+HaCvR1=Gzm51DSpCMCqH^o;nfo@a4$rLCH)>7wbyZqzeN&T$uc+eLQAsim z%YJB-&UreyxiU^u*DO&8G4?QH4-b1RWy7B6JBpoHhmg~MpxC*vYjr_V9Shel0?jY0 z-CiIo+N0Orc;n5^21ImXproV}!qHc`Ibf49d*@n0chaH3($B6oXg>R;fsOhZ;Z6*z zlulSiC3zklGG5GCav~vGrqOqQ;5?C1qyc&ZFQv?DhLm_PCMDhjIj|Lv{utr<6^~^o zEtTdl)d?o0JO&&`kSygKNa>n^`gFPBXvJ`bhflJuSLu8{JbVU}sF#M|oS%t~WEAaB zy?7eVEZS{)!w9Jgod_nTH*E6!|FyK}mtDC>COQtk+flkVWp(EHRnMNGU3A+s^ zknPz&EZey+mu=6w-thG5lM%K{7VW{XD;M6oElNxG9IyNXvQ5mcZMr{lg$1Q$|NOQJ z(it|}<62y9LN-r&Zh`IE+}mU)vMuV7(i~Y2gk4fwDn7Uk0ZcGkAG3MNGxNhdtF|eb zS1!DKOLCcQhm>Yr-d%Ue^xW#Nk3M=!N=x@{QZhF-LICBedPmqL+Y8~hqbho~R?1Dg zHEC4G04Epi6(YZkP6|u*|6$pBR)I)Q;qmU=^Ls2mcU`y*;fdTVKvMKX| zQH5zC$tJ4oaIL=Yk||K>X>&+~WLr;8nl0}@OP*U5=?%MeUdcweU2?c8-n`w?u&TE} z!L8i~9~7SUP=X%MaZ|%s)@_PW%H70rzmx<6Jg|0Kckek5tC(kA9)I{YqtQr}-7P;7BJ?K^(4u6g~uQJ^U6PdRB>@vB{(s>vW!t%*f<9BW%5^YOY71>h9gG5dzii8#H;C&RnxKR?lmWXghkcw*Yk$gRq8`F z#S+!OK##Rl@0;y|qK~6XA->4k!tjK*Db2`K}dH>su3HL)}p72jmqJ=4t`o)!;Ici zfuh&t7ugB~1czrxxx4YWwt#x}nUYEz?b#XjS43fYUVD0Z0skjML zxw^WicTfExox|n(zW5^I7hinwMckYBMyzP0Y?l_yOcQxOaAs!MLX`ET6fPbSr3}Q} z>o~b9${ww4+dww+eoQKd)TbI&N^VkL;G+e26aEftSmZLTqwGs9$2T`Z*+^{7@RAUz zV;cjT=de4lc}L{vUZPj+TIATO`J|GZt%YfLSrqS8=xG_Ek5m`hyNdYKd7vUu=5@y! zPWD78O9zFn0p+>!)2=_cNLglV@IY^fGH_R%CdO+`;SB*rW*A&z!8>t&QD11pRscl~or`Biz@5V-^o^w|9 z*RiM7O(|vJkZ9Y}Dcg30L@8Tht8wp0y=P*klRZMVHKlF)fRH_#vTn|hkTs@sY#9== z=TeT^I-#dmdCp1d3`isN+$V_kv#U^oYFMKv^P`!6Td{QR=m%1UrjDl)aQP zdrgMW+nzGJB}>R&O_{TZ_i5NtFIMMDWq48F(08vp5~8dlR-e}vA=MolIzCHb>W9v) z^)^w*FJp!CTx^KCKQ=J8OW5EW(w%KwAA<5}{v55IsimNt z{gh?J8Z$Q0ex}?juT*CAl3Jo=H@R7xX(ZN|R>Im$mHO`HG(lDA-IW%I6jODIqiMdV z_W>ehXfUmH7FQi$Uz(oQi~Vz>ltuNv*de2fp&5t!_M+KFouh`oxO0L!CSqp?Ltj|3v zddoZr*-F~LT&%~sLn3vhp0aGIKsutQ{9K4uIURUNOaO)1SInjr$c8M z*!9S1FOI`I=CrSh!z*>#OJ<6^C-gP-A)&WMFPj~&;*?&tJ0fId+Gb4*9`hMO7P3fe zf5uLR2=m$4uwKl^bmseG-G{bRk$NCD9P~Fp(Y)SysI7*@m>Xil0pYObrywg4r8LL( zXYLF!wIw#3v_@cgS+7l4&E^=IklN=E_PEv0r^=`n0Vw{=Gf9jk!L|?L~u|mHY1U9jW**5GZ z0E_L)U;o;74jC+-SjLPdR8_vHA`z>F`PwNEh(DM(j6L`q^AdRm_wwOmBH0w&93Jpn4>BqEkd6OMS|sJ?->Y%Tp=-{Eec$ zo1JZ^%ru(iX=hvGNyd1~v(C2J`Fy}-X~fLfFKTLOuGMiFYo!J?uT^)7pWJWhaBx($Y?FG`sx`(ue}sgkDP=E@AIcPe0Z}I)UnvU zk=>LzlUPRy^qh~d4naLl8RLxeWy%Egb}TkepmKghi*I7yVNz_H^AahMcZ}3}%5GkH z_{E|}KT<+0Le7g6cenn@pVkgAQXX%}7+3&-|iW~Zz^*1WY})Ug26z9?l4&fI4F5QW;Z zwJuZiC}o?0B?TgEm94e+b7N6_>k;eQGc?H5Gbq_VNLl2{-og7{_?5drLA3`(;#qxG z;Zl)Uj;!kiy!-UN8T}mP`XkQj#n~Jvu_g^4li;=;@1!|%cPdV%zO5~d*dvs6>CuXE z0r?%hvoiz{K8(=&^UH+nBfZ_VUV#4=)CSSqNqr|~Ih2xO*Lxc3qsWn>>pS~KLZm$U z&SN6zrZng~2m2z_>(u+Q@>xpC3B5l&J4EVHz0V;+e9CUUbJu#2_pr0dT}H~K#P)>6 zBGKh>uH3smN?D4tNmPMXU!BFP1OitPCM_X!rCs@}zxfjm1y_@^xLF`@wK`XY#f0pN zI9r#SBP^xH*;;K|L~3Jfzvd=A z>Ix1r*PG5tQ@+UCudi4gr}jCk%%W|suk^W9c_;+0)1~C?789e};jHLgNo%-0vF1f0 zG`Vw~joTv}DDHYvjDGHhSo8L+5$4T_)o)rMsKuH&on48y;bP0XXJwHpbe2}GrzPEc zoLPF4pbl{XTtnG8XKVh7AyO|p54A6(!@A!}Ua>mFtUa;j+8hvyyVseWRz^Q`f9A{z zS|gMV>q`fAg-DI)b)ROFI2h|*V~bL4GS*#Et$_0A`s|XClcZ)iw`ONWpyx@6tzICO z?4HF5%9)iUtn8VST(XbgJPmq5N0lgKfAZ=sWW-k=v7#D1L@F9{G;WNL8l;SY)^kK( zU(m)jczt?a`%GHQo2hTyErPi>AAqZv!Z z$o5C5*8^Fc+N~GjfhqMq(+f?U2k@h#UTE1OWS{GWwmKmj(pu{4MR{LbdFsTYuQ10~ zv84TVLhoC>ruV3zuIn{@sk51SJC-ygRsr5g*fzvce7fFSyGBsS?d|iU6uDf=Vlk!r za`8nJ?%N=nm$J15KbC_^2h~0k#rf(rZ+nkO&C&eji&&Yj)!ABKz_{pJq6IUCqLj61 zVOL1#<>@s|qW^pyDMkMLDD{@6ENUJJQLi&)@zEVZwhZ1C5wdQ5*2?`yskc0(zP4A$ zdQ)~Oy&=l-W9BWwZG3%t-@q28`WMu#-E@S*)SnJnO9Zmib)ed#pysWM^>m1^lm)6) zEaS3P#JYq>0!kO)CpxAl70Pzy>4r(+gd)Q>vC9_N8s zE|wh51m&iM!rs{6w#{{vVP(*vL@4uVsd*a}$`)wBjylHju-|zA8(C78qxXh&p%>6P z)DclfZc4*(u_y}%Q~L9oh2CPlZ_hrVH-l^GJm$^Aom4@T<;~QWx0&d~;bm9;wlerA zWvMBPhw>ei{9M*O{E$v zsd*dAk5aFa)G^93^diq{VS{Q+REO77mZ{ecB!#HAjy{x4*?i1)Vtx#-$86_~QkI2D zZa7N4TI5|KWZ^3>zUY7H`k!E3IDPqJwSoA87ncHMx{v-?`)Imnrh8^OicU`=(-Y}* zB%F?f(~)pG5>7|L=}0&o38y3BbR?XPgwv65IucGt!hdQc6mR_D`Csw$^S|j(Ivq-< zL+NxV{ilY~>CrPidZtIu^yryhM@&b;=}0&o38y3BbR?XPgwv65IucGt!av$bh(~`* zd5lNN^z*+z+CG||M5ZT^=}BaI5}6KA(~)pG5>7|L=}0&o38y3BbR?XPgwv65IucGt z!s$pj9SQ%bkx+d4o5hdJr^nIsIGP?u|I~3bJ$j}`&-Cc|$BmvWFJ3#>yVQs>%n4|C zCN_Nip=wl77h~TNCuJ%xcFN2=6vs~1REV8`gv@H_nTNeYib6g6L<$O^o@L3bDOu7) z2R2fp%*vB?W>ZhgRi^524$p-$WvPZNma9bL<;@ldcuC3MK2`6WYfnx=bLDaumkH={ zXMZJqF-oeLc;b7@N7#rxIPs)nest00A@dP%UZk0OnC3Y@qy&CwrL+QioaNMFg6FGb%OqhKXHu7y zfdqx;pZiKF+sEeLX2Jnp-a>+D2Poy;@(uZm4in!RcFmDQMQmHq-L;*?X-0wLqBb7d zp^F2VNV#~ileLJ7u#+UVUU%ct*@OKzGfX&pq_anf@Q`q2@7U5&^)+GVYrj_1*9^7> z$GwKv33e(kc4=C$YI{o+@$tAxmV&D&FBLu0CQ2y^fil>5DS}0nAq5?!d?F~CGs+`T zK3RoA23f}^EOd~EubLuVpo${62)$($Kp)SsbQH%h;ZVMZuYod$EJ}ENs0usPkLQ>t zZ#$M~))eB~iK3jB#lf1w>^ztB5&C@l*i$HAY}p0%^@Tl(vXci!StkCB;|~{?I8KU` zF8YJLa1NAO1VY(I=lYs#FWRA=Bm4O+3s@Y~sh(pKK7~x>fq7~#JV%X*R8aAw{T5~| z_3l_te0$jE1M$O0mZIpy-*<{~W|Ad;B}!qV2d-C+DxWUf2c#kgDpJqkNZ9ZOrXEUP zV!wRSpbi++$j ze0<5zm5KB8_S5fr-60jmidI`qh#OJ@AaBcr+_)%Kz#*$gsQYm^|QHRJ* zh~md{&wAedjc-)>hL_9Z=F#xaU+*tR;Epx%+=NO$(UEx@NH-Jya~ z9y65hC`H;zaY0#~9XXCDIAsF{9=oE(n?LrKqiW%tG{l@#hU)R)X!w2v?J1S9XAy_y zfSong2OEsrn7W;*Gf=?Tf>Cu@={`kG5w&?TH<#cbFt<80o!g40qr4yg!_dXK**W)3 z-VT{&syopHb1YObQ|*{&9aUG}oscr_{+H@o3wL3&WyBKoZ5)cGb|RLjU2t?YDp-bs zcbNJn6S^4~=hG*7sGJ(b2vFa;@_)v*(Erp07((jXV^1mSn>g-I?U-#+Fsx9=yEr%& z2~@_|LbkhAh_8p`b+XD1=6G)vD-zAeQGq~@0^SnTc#ERGHJ*fF3ZGPQ{xilO0EO41 zscI$8z*BeNKx_3?ksxH>J>?vGhWJ)oy8=CCD_e%q%|k@h-l7m9!$KX|1T|5Kyt7%# z*a#?*AY@nn_fci`)sHY?CS<8XFCTg|P6fx-hloC=i((|RMHQlsM0deLiayqZ%(f|NduT0ALqSwg-x*8iOs67@;P6uQ4IDbF{$dVPxfyHrtY=fMu@#9l>xS+wIi?6;o%@d1tfE=pGWn5{>ar~ZP)zb9Cpgk%zjYR-cp z`b9QE>lN9qKDoab_(EzUbG)A@faUFq7vN+8xTrXKQ0>R5oZ~kBCxpWVg!xOy7s4|>L=H>kA@$o?LWEp052z$ z@Z6V-ce<;}xTdnn7FPAT3n>HtHSkL@IYrHD5~| zRnE{%m#<-*$0>1qW&DK3sNyT6x7RM;g^JK<97O$hxGaR{nC6ES==i4zY3RBth0%Gd>1a6P%-7r1bX&Fm;+!3o$1wrV#VYYXMPHx?1?ZVRXt|e z@B&(Wzpyo_m2`IN^{#8H%)}Q6v3L%O9b@RMSI48HQx%Ciu3@u2Rg@ zo(x;h(}m-8Bsu}13FToNzADbG&qVX%m=oo#AV^UjmJB%f9?;e^0_|WddbOf+VI)L+ z^Mwqvu{ea(REc(o$YN>}4u;M*RbIPaF+I*^sjyo3aUL99AF2T=_~n!l1tlzbZ3kqc zy@C>rX5~0F90j1!=%_>iwMGG?;sxvhwQJ*`y@dGk<3&*>iZU9rU$iaJB0*)EP(0Sg z;f-ToptiC9ipInZLBHYwwe@h2@PdSK#89|r6p*!wQ4sfi!>{7X=p)tQ3U4_}4z489%@be3h=~(! zmoWNId<2;|J})y0%;JpB83RhV;p$B#`~(6kMt~VAdv(>q)A?{_Alz{wPsv*->gYFF zm587OAdDHDpk1M;JLx`sv|lM27~Vt~7sD~GVSJ@rdp-qQg*R``Z#tb%d{NHTTy^`( zg$m51s9@DLu;vt$0)ss{YWj%l@7IllSRx@6b+n^i-#Md>r&;J50@|&WpJseG@h?YV zMBE05_3~D%DO3AydB{3O=k;++H^AcI?B%du4lH8Y_nYVZS1XBc|2^lZa@1xI_v6+l z(G@@J7{#I)-F;;k>mS}rnl97ViiB)+6ualgQ;|){4d52>hwaL&X9NWcnQaUsLizfQ ze}w}?fXcrP@edTt*+6`op%>0UHf-N&LXMu4s`&xpJ1t5P4df+$So8JBXm~5SF}wxc z7=DIl>@K|Jh7A~17P3Y0bCtQgkGmOw-T8Ni!GK_EXugtK5HDc9GOu7edT?PLdj@wX z)}yPGhV%DWNgtR$v>5Qr?5FTnObuq2pvFR@;b-%^lyKv<{?YJrOz;RpiryLf6;j#U zrh5)8oYA9%n=;_+>h~7_IdN#=STU44tB`Q*3#g3amb?jzfNjFY+z*|nAJc^=}+6(J&6fzH9mFn0)Oe2#)!?+6YgyY=zpwsl z+A!XULi2kRb0y(cz^3MhudP?i=i!LvvskE^YtqALAcBhd5l$cG>qvM6o9Zem3s|3q zV5VZuG_ReBAj&h|%@2+J-Kb&~?6vpiq@O3gRb%R?`2hl7mq>+*xtcj19Q!$Pz~bin z(fj80SVx7!#txv+BIwmHZ`HM5E9QrVovE@xv@$h>W`(1;#1FHZ`02aq_}sT= zKNQ+td3fiz{{Ak{_>4W7Pj{Ht=Ptcve*5fAs80P&Y=7iQu1?L|0r$8565c&rhdW7H zXe%i;_s=)sNK$&!xX0pr7*B`HzhtA2-II;&I52qqM(!NfIzbLJ{(2Gj9^gGh4;XfhThg@!;i-!^RQS%{{^e(!;=< z8=2`m7_#8Wj$14ka#gT|xGaL+SSHMso?$7Ewjg}C0WrLTsp))t8DAw` z{S{<O& z?i6)UIq!EVCsY#shc$}gUXI7z?W}00NMI|S45`Z|Jm}pe^IgA2%$#b0c*2~E-YgjI z2W}D1e!wlud+{>S`uO3^7_F)@*79KwPHVkjc^{=0iwFDhu#Z$F0t=fT6$ig&3~j;z z&oc}0Y`7yNFO-P{Axp>Pt0XSO82=Mz$fj?JB9(d5S3(?@4O4b^w(XszQ6+0`MJRr` zHS`xRyf``e-z}F!!u-=nnBUHeLH*{H&rg-Xg{^TP+tF8xLWfX?fQ$d9{)9|i+N{Mm zvrSxLAv`}`0FAavWN8yrrW2I7xavS9E+U5mQ#l{MFb}-fP*h{P_Rr zudVMNQPHi*A3`4kpCb_OU(u^~bh4YBeAh*ES-Tx|h)bfb-`~>-J(2Bq*=qjb11-uu zmp#q(hq;7InlB0vAVoLEdwLV3>33f;j-!tf{oA$y=-aX>%N$~do|cysOfqeW3%j;W zYnj4%PuKn~R>*$%PoK7Z1$=t^9LPi~1tktPzUOj}%0Hg{(f$?25tqzUVI1kp%k{O( zUg|x6)S4~o!SUzGPn|z%E0UZOhh*E=O3syf{-~o#bny6^Vo%fgqe(q7&G+#6qxy*C z0w3U4M(bv&n*20a+kTnq{2Z+PLCLyigLOQgek6)TaOtl-JQ_Xez0g6VkEea_djxFq z*P)YS=YAi+5!%)qshj)^&=yNo=NCY`PHMX50By5`;AsWg-gG}png6}-QJ`f7Jd*nR zz=x>9x>c$sKMU4&KKM&S6B3b9xVC@e}WmhIx z$BPn=rvq%#2a@$Y4mSB4$p$_KT7-K1(Gy+(S}cO&obwXU#_uy|ge;(qj|Fg^PN40R z_VQf>+QTwm0Ee94vTl=XGUD|u+aamz#O!>_{)kLRlaD+g#>jUI!)C-qBBAN*a9PY!5F;4@TVHB^&d25UPa zb)A>N+8;HF%?0at*(kRUY|@A62O@B>k`^C*KKZg#4tx%@i=}SzD?nQ!Rh?IW784Wx zXxqg=yIuN>XE)I9P9F-fP=^oxt{*il@CB-{?vSdOAQBn^6N;joiK1;2Wx-Kz?~1)@v3a3XFu4aUm89^ z?@u0+%7L$eJ5TB+zX9B9q^k1-vI4Wshj*3(3VM6=WU?HZ=?95 zPpkymxak-n4*~67*)AVEUq2z+75ElaSUZhE-v(r&Zs1Z>hL zM)%SCldntVz-6FamcAnb|5@?($?pJdM3$?oK-(ZSU8O+VE;T*JfOb&K{^Ki(eeisp zu{`b*S5SquTdF3%3)Xg4>gr~&_9vvWs|>8;4VmgW0XFH=^yUZv75*C^y+8SeVTUoG zT`qN#-viomsj6Fnc9Ya}l>=>uO!J%q+I=#g51y}|k^lk|sKVMSRg>QbYr9YC>UOYp zJch#`yQ~td~r%L#{ep+eWWfp!8+cSE%TfQoAiZjnU5}?JSkfim;~5Dqu^fxY?V>22Vl1v z#nuCCm(=v!53mPh9X`0bCKL%E$d{KLu-hKmD(0&fq_Mm}w zHdy=f2HI_49mZPG^9b0aucfk&F0Waoa!>I=ZyUy{nMZm^DDNVoAk0XFH| z3_ouE#;Zd<`n;wYc9;RQtEF!8w?Ml=s_HpF+bT6(y+GTaemH_+uxNS;Xpcw)KKQ#9 zzi+4CrlJb#5viJd8LaJ5sjKILwZCkj?E~xhP&Uo;G}xreQrSnJ*L0~IoDH-k=~E*; z`3lh18fX^-?REq0ZlK*QH9gM&?NP%M;P0AUY6j<^3hObcnmh*9_A{xg=Yh4qB9&cx zz&buM&^`+`>5621^m)x?pq&S_r7|&j0%+?br!NEA9a7UZ2($y~(zee5?J=q8gTHGI zsToX171k3{HTgPN+hbB!&j)LNRVusogLV8;HqG-q*rYMpG#`Cl^T?(JGl6!EQSc3* ztvAXo1lpZOu?K*5kJR+M0JO(5q~F5d?-&bNsKRP2AfuNlRTfOQxv zM9+(0lP09Hk3O&Yq;hZp&>Bm`Ji z2US?l$k{V_60Gf_)YVsmwZATvT}Qw=K9K>$^D@|^>luDjJ6`p@k3O#jB!*xv&>Blb zO$FKpsj8O(ZM)QT9Ru1yqtsV`_M~i=5B{#jr(TY-#i+u1R-)C+U~NwrXv@Ib-!Rag z0PFZPeQM-*UIm+ULn`~|^V$rl9LxjSa;d9Xfp(Kr)ysjlLu$HC0qwqY>9?-|?I{B- z{9VH%Li`c!GE`x`PpWEmu(qe9u3ib&{-#uRodN6kOe%X`2b**=L)w-;ucb=mU_Q`R zNL?)nXg5n$y&7nvQqy%7XpQOA^9InKmhJMv-?f-*SFjLOSkD=SYG7?o8>OxTYk$iq z_CBx6Kv9LsqCZAYqO!&2EVPYSL?4c7CL)m&h0&lp3u7Oeeknd&+Z)?us=J#T|enlwTJU0$1G zm|-=*Rv8}V0obilRj&uwE~)9dA7G8S-}4UEv+*a^m;(K9_d9}ODXOsEFFjoIfwetr zpltwaf5$-k09ePDlJ&d`Hd&R*e!9FiPo@UTfVSE|8vxoy1MOy@?KaRp2(-ge)AJtC zs?rhsaCgluHG}1-!uo(z)n#pcJf8Q#CYxpN`swmox=amL z0o(e*IU8Y>mg2S96*ntr&u<}u2wMitfv4cpEJYkOYm>f6BD z-;>I&N5DG1mQC~g0&KEXHqB3$*D__(g6n{Gol)={plvqFZ3Wt1qu57*_Mp`Cd3tnpbKD*P{ySLsC_n2iEpN1_$=|+G2eNSo`}@+4VE9j!Wq>)O-Xs*)Em+^m#2y zDhF$Uwnpk|=|HOQ5x6q;jRSHtL7JYd*sQ^{B%7 zuvFDD!P;Jwx_Sp#`v+3l^*C6^Hxhy8W3b6d8M8tx_=2B4uPu-mf(<~sUg~ODK-(f! z^-iGelbWuJKzmqfdOiVKt8AAa{;n}X#>4GqRAGI@K)V2}?Ii* zM-5NN1#5d*>gs)9?H|gfxt<2=xGa@DpMy=-rNR94c`X+Y)FOOOF8**%OhDU!yH@7X z76bQonMvOb+`Ekmo&oNovW1>6fE$iB3R-mjm4tpE1-2`EXBMr zUboZ_&(~&1&0rg$n!PWWKYIY{PZ(km*%JU zYk7tpI)Jub>S~2RyHl#_2Y_~u)O5W7w8sq_Tmsr8iNFuf*Jerp!A?|ReO#()MPO~O zNnL#eto>uD?0ONbV(;Dw3opq2W0p9>HS*1 zfwm858>FsQ3bgG~RX+x_gHqG=3ecXE2J>72S`1>OBAWW)@7gS>8QhI3tWQW)tqiQ~ z4XLZ20BiqLD!X0<>$oAC<{1NO+80DS<+I>c`uK}%b zXW*FtTBp%r@b^2GOoOPx`jk;Suv=ztnWS0ko%$m~aDVW722*@OLfEu)qOSVSQSvYU{w--jcfd zePHdMOJ&!aU>&z50?$pb$+I(-hB(R`e)_z&Qep^>0PPm3tE~sxPN}M&16pIT=z0ri zpW@|Z;o+s_)r^{=lM#(3Dwo&S8n}N1ls_G8{?Xc8zy$7^v z`qYBKYXw@jY?mMIuFaF}3Z6n0*5`~uw}Q33Yn1vBSi7-SbiEHY$t*k9YX_U0E|vXs zd96%h2%Z62<9VXi1hhSd6&?oK5vl3=0BDWpiQXij^~mAqhr4SbsTn+rDy+{-R@(;F z_MX($9|3FsTBf>w0XE4h-NvhdP0lnz0$pA!H|%g9&^Ak5trci{rKobUt`C7W zVFMj#y%K>R?taJO`5daSz97w|?Eq_gU+U^V18cuzp#2DJl3lW17ue)1sqClEYn3uJ zcphktAD^{0pxtGleGF)gAD>;n1X_!1m)8Tdm~p1&NBFyzA=?$aA5~ail&V?>Slb6u zSAQI={Tr$5`WS3dlEmZnflXc@yVp;j*Q#Y|@ByGTo+oOZK-(u(^@~7j{P^tp1Zb_& zVBP@G`lY5H{;p*jWj=^1tS?DbtsAWE7gAS$0<8U8sqFd`Y?3CM=A8jHIY&0lPoLL} z*ARja0d1>Ma4*pI8|6L)v`36$KLc8u)byqTZDM|eziacQX7J(j{aV*|V9Ue>L1}XG z^65y&CcLfXv`=*LHLgFlOYgDn4h)hD&a4Eq+z{IEM{*g@?*1I{>4LNJj|9*?Fm`n2 z$L-g7Pr@GwI|KOE(tcK!>H&S&at@Vq6Uwq)J^re&c$t^QFXk)%r^l5G z&Kvm|?pO{!o`~fv?{dc$kXnFm0b&bg+ZGo#k2_a>dOmav&l^Gq z0_`)oU&U#>c^tzl(+*Ty<%s1h>{4P&gf(GX`y?Ec^^EdA3%~AD<0ABdeG*xH<@iiT z?-qt*Np<=2mDqB@!Yaz{C8&BXEU)*9G6&j@r{b3Rf_~r@#z1;}D3hSflYDQw5FazdmPR7f zbBwws^D{sRKmvjIdf_IXU#mCi8TWj_(Q2>GtRlXLFlb`y#D^c*CfG3XF#~L%;HN&f zQt+MPRCbdpq;=wd9Q==>+x7be$cZmd5x&X_?_p@Dy(fWiS1`xV?nz*dK>=61{mx7L z6FR@ex`=bK{sP-!N1@?fv<+X+!K;qrl46hI;zxNYm1K)~;Wvya8+qX_CMje1Vqj{& ziv~stwoQDObMNPOq6d-9SBei>WBcgg`!H<6@3W&mW#>JK&Qh+?7f=#f>gqj?h3f_V z{S~nPeq@aev5`gFEsAR&2Cx1ZK3(yh!?@Ky0~FU4sJKc=wSsb|lHEm$-(SQN(uEzS z%q#yB3n(x)MqA%Gd}gkH9*F|MwHij#Y%ja&;s9i>~Eou zjXRNz-;C_y*SPDj?L_zkJd>;9gSkx#V0gZOAC34xr4$-ixbMuJCI4u7A$&K`7cT`R z|3Xld^&7Ge;*{fTMJ1?|Le!S^;O&>wPvK_gLW&(<^C)veVMQ?|Kr%Gay6#%pO7%&j zk^jR`(6sX10t%?C0s`<7z#Ue){oi+u;Rl@yDOtY_#f)$!4gRB8gqcOdQHO`Uol=M) zm*P(NI-9$YABh(8Tj>wkJ4EGqhhNs1(RyE4e9ccvd~6hVUttm7;mVvP#K(S5^pkq| zM*;nz{X~=WVr(k`Zk!P}2|s83h*ML%Ptbw?ir)aGi0zSfAuNUm*o0rQ3EWu5Q*+Dr z?_cFCm(t0EkC`x#Xd9bl9#3KMYZOF7jPiv59zGCnwBu}{D!y_?MQ_i$<9p`}#c+e) z)6zRk4?o1s;TKS$4oU52xZ(Kg8De|l%no}GU;7Q^6o0vLPv zZYRG<`U_(m~B}50_op(qmb36?Q zYN;vJgC8?4qC7X)?NC!ToS6C3|NC{qyFUIq0`wnjLsXQ+?zGXhlmx~^ z#6lzU@955Z=3216Gc?dee2M2f6IzN0D4KTtzYfgb1AMN)#QTbpgb?Mc#6CH`^Pvp$ z_D#Z7*=@ya?<#zo<~zd~_TI_$uE1o@k?!l-#)`P9Q}~O-{5$q5j7oHjE0r5c9AN5~ z20KjlD@0FMY7yu2sx^zc>xnO4m{>H6{hkI#R;=hs#Xk150#uMKVE610AJEDEFkE^H z6b$aGNSF_OA~C}I`mW8y8Vlc;yC$#w8U~v9&!E`7ee}%}6Uu#)H&Bn*WI_KFmH9>v zIv01WCcMoPe-AwYISv$1xEAp25G)s3Rtf62VmLm&)IVb#yYU^d{uvA&s}mGfoT?k! z08H)Nz|k=xlxeTkSfGoY8>X-<>4ILOfgJ8%&n~kD@x=LpYk#7tKMIn?9~3R;ceiF;$rI?TJw-$|HIzu;TgEEyWo0o?BBw* zL{AEMxG!)$!ahyoWdUc-)o{!35!?dZSwJG&9m=S!@b2B%zC|`gr4N^g9R;vGf~z;u z1r{GMy7pb$gmo9IdaTAGBnrStA@kpY_ zgf)067QM6hNRzLf_}&xm&ChGC+m#>M#0bF^B8nGl#oy{TjVT32^61t?gzYv&nE3GL5#P_v;%kdB& z6sQvYaraO+uJ)L<3c>rvdx1dC8~URd*{r{~im!sB=2;Wdf=PmFnZ zw7UpE-4BS$*o@=ChQJuU+kxBMUbbIoo_+1fh_d-MPPEOSi^14ZveTJ9ksDh~GQ<`ed!=bz(h zlutK23uw)Av?ezaac@nmvq*^@L+{wVLiD((S2R_09o^_GMw0Igw%iLx#0rTe$LG*Q z@x)hteanmQ;ANT%?g?zxhF*k8%3zJ~{_8)7NocUru`8p3@}#jMv#2tGS=bq-^H?zn zhbJ(1hbPF|v0-5N1QDEI&veI;()RQt>~tm@&1~11?YhuoOXccU^>uMJe|v+f0Lv9^zZ}yRr#cBCnVVU{iAnhO4ltIhKGX>=L(lH|9`m zl^8z6Ajxfguxexvipg4bEw&BCU_8&kSjE%@bdY=6YdyNT!%{|k4Py9;T^wO-?8GE) z$l+`ECp=7S(TM)Qa*_zxNB0}};!o=mgXx~p3~0DzfY+Tj2C|8bagUpx#fD4H8f?f) zKS&H+vW3Tc7NtgrZ!iJFs50&f8bJt9G)FZxJH`zka}d%We7f7AltMzWm$mu9=HSF zZ`=7^q(5q=#7b2lE#?*&(@lzPn!gH8+L{LXJdV0dd_neT4VUUf1 z6CWCQ-dDqievQf!an~+GY`kYe1&F8PI=UMhw&1}!?8kd2U*UKKQ7wW@up*V#ol1qV z6`b`XyF*w&L+MpZp6!RmX)hEU(tft&?XNpwcDPeJ;f|%{$ z?GkQT5g6kGOceFI8eO_CYT<92Uh$mpj%Hn3#vbIvdHuOj&&|8r`&)B`5rGp`vOnyJ zri$NsetUE)cDleW;lRHO0;_OdLa&%L3$xqAl0B?68bYs8Np46qGn(; zTH-%Scopv~HsOw^_hj#gYuGH=`yAE+-i-@!X~gz%1JYWyrFs=TlR zd#o_fPJ96i{pRCkKly_A$_jQV-i*Ak8;|*Optl;9QQD_=HP+6u?k!x$c-s~ZDBgvf=gflzsDV#Qt(*6vNIscS z7cSZa5R2eyGxj1O)QE)fS|r5ny%3FuLwSqRX`hLWqu8T;7$rPw-X_t?84<<%LIx`T-NaKNdsJES`*n=$_<>vr-=_BSsIE!0=IVEf zck=gB>8!)MZ`J++!s?m$yMHi8qC8Qf$iWcyrZ5{?;!}P`G zJ0ctD6Gj~n{exEe;vM{>l&BI&{~^6Zd9rOjuEf2U(5b)c&)f7JjQ!^Emcr^)z~{qA zRJ;R}UHbkf@a5~cn6Kf2w+j@6HH)HXW4P#7adBP2#ly&_exIx0$JLDGAtgR?GjKD1 z^#>(9IpeUhATGOOzF-caR}@9b@GhTg+`)A}BHFz-Q6jM38oWMpEAe^6Y$vvD6IJ3C z5SvhbKe~YHR>g*xwLtB`K5a@5ws%vwDAo3o>d}#m9bw_Ab&Mz6P3`W`KDEUcpv7m7 z&JAcBOy^rIHk?H%N~E)HN>-K$;O4zf$bdzey!|)({`H5%7Xm6}GP@1~9TTi#?$Hrj zRzMF_W}@M+>PL#MOq{R+lv;lZQTAHArWmeVakK;A+z>au*_z8uDzsiQ7pWK zklPeK7?1Q#v$bPuh%Zl6G~=kUz`WOwcs_#>s`S}I*1ynHpp2QI(!U7QOqe8oPs5H<@7WHO?YLvB(!_SC zx6VXTn$CxOYebpiVVlCgbT=;WMg^7L^_QLo774ES%LXFt+R9=lk1ok7h;R}}{FQG^ z(4fk<-^E6Pcd@sI;ZX_6twVRQk-Lk!_0nCbxBmJrHqxFb2hhP&7Vb5HZ{NWeB{Lz2|R*|%Q%dL!wQQCd;R9W4*VInh7PC1Wpw8sH{_4`(w=9@rg3GuA{JFfY!@-lBlWI@i{!z)TH>CGs3?E2q+GNYyjdtl=-uVC!I z9Qp9M_@2c7?%Eq4-CX(g|BSaMFNB}F)j7Pb`nz()T;Ab2(cFCViwj>(j{6_^)Auui zW!;_U`;~(85hd+c029SOWm8pMsG+%fOK5Ff!?t7*D>pW547G&ntLsAzTS8kK>Z?O_ z4O_Q{DjPPg50wj*YnYVJkMZ&yFH4symMS1#SEZ0*>itZ;|9r$!IrcA1kxNAOE?*41 zy~2+tcjA2>G{ZkXx;8(xo;VcoV)eY0_<2VBMl*KnZ~o?kj!j7D$i^k30GIghHp8Tf znNUOOG%s#k#LM#;n?h3)O$fGCLI-i_aPWe;Oi7>13wuLMIq5S&T|e-u>lxzvDxGu3 z*vEh6Kao)w0`)gI9Aj=HI*~8LWdtMWCPuxn{|LEwMLeSf^=5MN%Jjo>8Be0z!%)k( z3{X)US{4oC5?X=F`ST~)>YKdWK7al`U{b#y#pSzXECMdP1HD_)FvgY^~BiQV^-4)MkZrXR$6hQ{X>}$Zs zP1Ljd`sY)Eq1IF-oD$TQeY2-z{^MP7y`;uvQxO|q%513-d92&)s$VEt8*?_~g;<`} zv~xu~ht~Wb*3mN*+cvx3Cld9*!9DRry(za&=aZ%pns`3%4&B9c9~E0Q&<=%)OM9qc7!rf$|=eOb*^cXCnKABO@YFc zB_x!cfh3K-4Xa91ej*yIc+XL90k$gx!-HO1drm{vg9OmA97C2Lcc!7i&Jl%;}-L@CP;G@R^-QZ@_J z9-&uw^`~8ba*?vxc(zxkEJn90fx!d4qPC(yVQNW)c~=Gsj#ul0CYOb##+ZiyO>=Clpf^FLegsd&NZqAU9y&mk? zG9+Z}L4Hoh^4l%H9NZJPM%-FL8Q=-dmt75z0D2l|-rcb}-mk6r!vv zID1Wo(0eyHyCqA=dV_NotrfBl0(Gubc8%Ka-M#Kehh~1xK>Ud-bOSfAJR7Obh&N2*{*X`usT> z=K)hTC}%%qZGpy&O*Efr_tjS_GkQtwhnd|G>Qx3B(@I#G=`ru_<}^V)?(MD=Z!McH z1|3bJ+e{4vs#5O>e{t0TcAII3x7a^7O4&!=zT>^~C>!wBZ^_$4YRKDnq9mKCUwAwB zoQzO5>`m(u!^3nrQ0UYJsw@81O~;N>?|PsmcYtOw-467p^@fncYz>}nm_wOa^Y%4w zV`MPf{D)mlY_C~|!ybuH7W39?D+QI}t=GFm>Kvqokcjgt(5W?1QZv})L}kuHSL#tx zrI4+0lPV819SCb#(3UDvPXva8ehw7#R{x>48Wv-24Gafn ziP~O)tVEO&4eZa{8DeTzU^r=wNPX8^n>x3OvK~aCIT2EQ!HxMxBP{uspiW0A8wzf) zty@jmrNF>oh^}G2g6LAhNNhe4sMYPvVKKv9jxdMCM!l7k>2RhPCpAk_z&US-Gm1qE z6#C5|6pJ%p+pwDmEbgm+{cGPj=Ew@fJT=5;$qmF@;{MeV48&rMLblkyT@jJfGA~fS zS>-UYtP373>uVvk*FAG8)_Juz zl=U#FF5i-hnKMcC1hhdWDwbWrP3v|Gs=ukZx;zBZ>JIjw6f*0P#_G&Y%52J(zFodJ zHA7t{QtdY8rK36m%t0z?K2u5Q`S6n33{YByul>+zE`qc!{~<^FF5uJN3Dj55AbPDk zpdLBN{?OhHI(#!SKsoJ!eIvUmb1q;VbUSAw>k!mV$~IBfLz$rV24eFBD(6AkeiQTF zAO$tW`DY-QHD;k`Jt@c4hhHpugp{_;G8AED`V6|kkf412+F21&>4}QY-i<0Z0=Z#YDF_f}C!o2m~z8U>=x>%FHdT};`fc};bpKUlved^EM z$z?RYYw#_Nh+(OJ=AC!6B}CbNZ>PS8)4%??cV=aikPUgG73G2&@pg8K;G>Uu`}50$ z?6|kxwLYpS_zVNo2HGXX?cLcH0fDbFygd!|#FtX&-Pt!1B30?#d90GjDaGEMgMET3 z_x5GwM=9Ir?GMimk=o(ybF7Ro$C$Ts*Lvo4>HaErnV`}Gd%~w8&~v5wSMFUOWooIv zX++?2ZSxneVj@mY#f&HFb+umotH1dZ4jI>Ke{r)wfE=sBVlsC<Ff#2AJ5fc%ZyBOFlf zB2wIPz+D_@-oBMc-6MheO)CU-!e>se66Ku_EbpGhu;zZiUs}07#2jn=S-R*;cP*FO zHI!}jx8|=HA~oPY)V^>NsRIFh#p)3AUJ5kV=7{pX@n@&;7F}`wSys@>$~;!@(t%x6 z^Vq$0pE4kNk^DaUl?F*-XibXv_kfz_ndcaj$7od@vbc> zQ7C)N>)+<@q25McOWn>WsV3h6HBN1ZtXt^430a(a53=1M>J2~^r}jg(Um&;yS)3a4 z7UEe4_5O9CsYMhr=`FNup~$Cr3vG3j`BYy^y;unN)T>XOc=Q#fngdDu>x7=&Thq&4 z!FM3un!Z%dpFUS0X=tgCxnW!}5PXH+-dZu2`&N6~+vi7Fa@h=Ju~@hI!ZVabD@1J_ z!L2QI3_`wcQ0+5WUXjn+-Xl^+eE#x9qU2J4YkdI&r|*<6m@yQkUYQRc5eU6A-kK)S zfxbwv$S<7UcQ&}F8KV+<<-x^AcL)Uc!KorbR^gqsa{p15cP?08+bd+1!Cgvkh_dqm z^Ol{+s`#oJ*KRsO2>x_$-@q2?`R9XbiGWHi0M#A^HLoDh(;>o97O2)aEG6r~KzETq zkkuRLE)_#IYbY?-A_iMHDKK~_pLxSBZ@p`%g;Y9bxkdfR8?N*pnB@|w8KB&>P`ElU zxNS4LA)M)J?@%I?t@EYkiIqrrzAxBO$6y~`??1p}yg+4nd&9cWtMzrLBchIQu;F;K zLcRK6f1X&$g%^1H_UsdS4P1cdF>khad7CMldYiBQZDsIL%5s8>hw=rMt=@t?A&Bs! z2NuE|4DsP6+oY0a=Fj$)+9_Lf^{2c3ngJr*8eCG~6?qp2O{F_Tc{>8N zvrhI?ZwaZB)N2EE%1v1wsri(3kSeBZDXBWjI{mGwRKr0oK5t_=do|om>KJ9qy+xkY zEtK_QB0J3KI-KvV9Y_jM)<@6DrmO&y;JzqjyP>xvN?GC67hm+hMA@FJ(Q^l1qHM+0 zwSWE}gly2e*B^lh-vPLLk5viV?+?_rEu}DA4C;`m;{d4nLT_cDwpxVI9@p_FZE97AyYZ z;?h*e$`oHm&Ac601QrzpoOAX>6y^?WIMk&m5mF~QKt(}emD(CrK`24Lw<4m3K+W(i zXo@&MC^LemKnYpul0~Uk+*t5m{qq0W`!Ol|)&FLB;t(l)hCBN}xg#QE$$$Bc1BELy zTwC@ma_lAL&fdS!F+?ggQoqA-7*x~hq|~T53*^ebfB!gN7FF;lL*1m9)~GGYFgZ_ZHXrAtmqwj#RAYz7)CchDd!eM1H87 zzN9GUyQh9-dl?+U83@SA3M?bxr7fE>OeCKMh;d2YUqTG|j%!t-w64bU=DAiqHe+Oii55Sh;b&*l)H`jkMdWMJ0D0wKajK_W2lbA}%v4Ao&s3d+c zRb~Q}+)Wuz>*V*w_)9c_pKzc0-fhA0+GsgHCJsM{Y-$?|jem#(;K^u)Qh=uU4xuFd zW44~}QpJjRX-9(T6;MhydvNvD<{f|j4dJax)DuDbR@_}#1TPZ>j*H6pE50t?j3Omo z7PFJJh>Gyw0FSoaxODbl=Nw1wE$h6%_6I z<_fZSAzk?dO;z@?qEGk*hw1y7psszVD4z(uWff?Lpv1{xcuO_>5GixWqJ(SkO1<*> zc#e7UHVSawywUY}&1NFq8UIv-9e}sF!Vl9;U&j&P@Vd2bwGGGdDX;Q{1##e>`2F2Q zR#3XpGZmoJ*{u9iyjiPodj@qm+M!mE-5({34{_9r2%0bmnaXz;)#dO7HC3cS7Jqv; zn|=O~ZT6{y&BV7S{>%JQ<<38}`3&CrKx7f62$fX`0E5f+v1^B+i;7Tr3Z{3Wx|F^I z=ZYHC0fRa@Zu<+%2jliM>o?=}zpy8Xw~HWyv)j{>sv%467P5&Qqe}cEs`S-(W<2@5 z?XS{_?|AweQwcwcQ(WJ_ivZeR0#@WmFTr4(`24pMuI(QUKSF;#xn!0S-Vi;GlLpBi z7r@7J&wAe7v{6wG@q*7&M#KDUU%AADXMf`Z#ml#B8$a6@3F;j=L_$d{sjCI})TFoy zO5vycapgNo5mnNQU8qPcj2uVTPT62oU4~CO)KtOFnT3!u_N=1jr!rjQ<-PFvahp_` z1HD;ee~Hla|F-unKvi99ntPx3Yr8pnpL39)asWAkFH{hGAqN2w0Z|de2XFupP>F~y z6dyRYZPH#RZRMuZnRF_h$=IpPtvl&V+Dd2AncTEvIVn4nq%#>iO@%7A|G(D1*80}J{`J`VthN5ZcIW^Rhz(KfR%DPg4WGwv zzuGS+b7`rx3ch!=>leof-{e%}_x*q9#F5mYtdnH6KayWYb6b5w2|towgCj?I%KZ@o z;T4nR*zl%)xd8o5ZiYR}Lv4dwK^X3!2 zJW6(Seu*T>upxOtei$Re@CqbjYNiiq2YbLKQ!X6AVK@ICQ{c__Flola1{XjsiR4H* zbYw^F!02OH!#$a5L`N~?1@Y!W^(6&2 zPRedY2J%~!>@p`qk#aj_zs+D3=)l+`|BHV4ZB9ne-sEH?*LJh_vH$VajboYehIj^) z-xY)PQ3iO(gYX9aHa6KuDwD8nwvt;g)8)L;*O6(JX`7b(cw8I*9O_O-!@s9%738-E z{|kP!g~lywV3?88TTZ-K8N2VX%UqJN=^S&<-=c8rP>1<6BQ_l^XuXxxFC8Z}-MfW;Zcx16oVQN{pFWwa zJ$(T_QCd*xNIDEIl0FkQWSJh3q`x5Ib`&`c%O|lh)Pqdo5~w{^e)WhQ{88*j*8$Js zMa3m6dKI5Hm#olWCLt;jSQIL400%J zWc%Zn(f$uv+E{fQ##v$gV^k)e>lUvOQ|T6DPbU_u20sSe!C#;$ zNVyS4%I2;xp%)Nq=U!mgz6DLjc4Y`7nf%@&?<9hEGH%ywDKuwT(J+z~C{Q*Gmd0sI z<*ilyktdm=h1!#Y&4|Dlg}oGijy7R0=HrCxjqY!$j6z?=j!|@$F$!UpH9Rs&^oPZf zgi8*ja4v0Y%^b!McwtLT{q$bK_e{1A+Kit~8UB03&aFfk?>0@30V(f`Puw9z*4(^H zmnK*sg6hg!b}6!rHnWC#GixSoCC%hAIxKc6$`r#0L*esj3VE4qrj?XNN1!6r6!r>* zwR0G%8hIKTimY9e)I0eB!uL8&&|4v5oW|Hs6AYc#lV5?ZtpmtKlJT%~CPA*jjPS)H zXdV435a>~}jAtm*Mus-B_*&Y#!$0bW>M)JTr2A^P5M+*cXJ&$B=kNJR#qpsNfh5eIh&8j|4)9Ks^ag$F0o z^+A@qoC{Zw9>$hpygZw8OG&Mq z7F0?r4&O#Hac6)e(MD4!*cC2@OHQ-t4Mcg`x!*CofavpP2q~=yf zf8;reNMIdu!wmi$u~gG_6SnduZj&M#(ppf)*AMk$eUfIuHedom#GCio$*Z8faU;f3v`Rr4|R~uS^c7fGe z8yFgWJHb15RFVcqu8uyL(l^#>#(z{$`A{=5&4Iu66$G~kI<-D>t6Z|4!mMmPj-l6D zmKs3?Ve!^;G+kJ4BjOx=5|t@~Ra0z4IV5Z8WK71?8Lejr-|3gE%nr)^)`!#9fGv|64zh z6q`Z#&W#TR9k=eDO1wFehSn36K+1WNzX5%-wjZ{ZiDe8876tRBL*W$r42Bo$OQg%5&JxS+9}2u9ZBH`)Xm%c&ALDEp1A!ph%66-`OQ~>z!Dq0H zNrOff2Gq=ojcX&W2%@arbYcPd+0^byl0~}rboqbh{_z&-W=qFnT*{>>vj|iqtJ@`6 z_)PUrC)`;_ig>@T2kkpdmfbNOeRVQhQ;Ex0HeBCteUGYtXhJfoNB8IvsC`(X2TdQ) zv+oX+7}+>Mn9BI<-n{L%e@goMJYL$6-{!kWWqe9Ygdzg&ofQUh8ro~8$b zSzFlzQX{}T-0kyyG9=^ib*cp5B>>L&@Iq|!#s{r#7a)A;k|Hk-ZP1GA8L<~Ac1CwgO?MvQn-P~IkU`FwEW(&bq$rZz?nb3aiM6EIS`sOx$t7z#4!q3e zBQls~BstTE({?zlWV>j9EHWlCYlD9 zpv{e`8)2CH5oXN&oR%N7oOhQm?lLU z$yo2+{8fJh@BX;=lfvk8gYO=N(F(`+$YFV7HopDEB#Mkt38Kmy4{;&MyC&f@u+QmpXD3bL?H_|kTQQ~ZOJ zHjiYF^5aX--v()sV>`=5m_q_xnqWIiKwD{~vkdcxq+Be$w+w4_X@|`k0~rvqy((FZLd&47dVV+>BB4&$sYEj ziRVsNe}xHetOjBF7LU#$wfA%YH*|}i4RBY+Wg}yAk%KPFOT0zW(zWeJRf6|s&nhwY zBUXw+xzNLz4*t~jF~qXmVuTxEJrs6- zvhVUDZ?jFEj2|<;w0%1L*ov?;y^$U!l~vj@w*ctvpL2PJ)BA4F441?BkxF6wXt1MG z8IOT5w*JmQL_;y68<f#Qc+2`c{JWG<+P{}|~6xEa#`jUVyY(eU8BKHzg=e)|{t zYrwb6-}!H(@SE^e;B(C|+Lv3E+t+C11Zw2_9^7P&PL#lpcuBvxrQ>p(?7MU|{lK1j zX~LteuId2YaN#cH3>YLgqtVi95t@4cBkeHSDBivetAV~Dlfu%wsX>p4$0W=&4e%RsnohC@ZJB2$Nm$k?`>aJ4nNY5MsQ++9=HB* z{)=t+DbQZUrNO0~=Si@Ror3kD^+%i!3sxn^11{4sn;)+~BkoHgRzCyQb6v2(%edKp z1{(zVJcZ{0N1llDeSn+&jYdPEDm)LkHl!YmVJ!@YTkt&KZVm5)EIDmHi+lci!bgak z_I2=06amjSW1^m?!8*ExtPjhP5$72ptR{kWJueXW$?<^ua%zCGn*O!^2w2Z2VCY!T z*TE}5n<->H@I2ti7ot9R9&oM{l4=sr)(S~KJP)`rq8hpA=YV#v;DT?V2>6l_XrBe^ zFx^r6J_74JYobjC>-vePi+>|nx9Pf9e-y0eQz0CD8)&nHtmiz?nx1=o9|NuFUqPJ; zv~>cJe-qHQ2~K|uXi3k82Hr&x_8P%@a8JpIV~=2c*TFg;5v-a5*7Z}t`nP~}o34BH z$H96&6S2YffEH^Z{E>-0545J|Uf(A`YmA#@3Ah&BWqR81HvsK+QA_;^pfx>h1m8yy zafc_KpMZ6k4)J_=u^e%p6Gf`&U|lbmZPoRoH1hGB1AnegLNDd zvc5sE&c}tYnhn-acf(Rx(B}!+bDeZxEuMSHU{^gsks2SmzT$Sj_?JdRbJ>zZbnQDYlNh_7-$bVHkaa_pyM!`Ct62j_I zu&!4{tp6Zb_Xi@aPB!nkEieRc0PTDs>$wE9Q6Z|xKwB*&)dHYxOdV60{}9l22}vFH zuFyo_T76(?9H zzC;>TQ;Wg6UKe%o9|!CHPzdW}^B&`K7LB*Jfi_3Tdfo!s6+%>T1MNC9+fty7iF)}@ z0IfNj>acg^n5b9q4vMh1o0+~1)^WFTSFU9z9n=3@mHL#8|LRLux>wI1at2JO<<_gjO2w3+gCR#Fiuhm5B1X^>6==l(6R|-)j z321ADq*@EK+l0yZ&jIaTp)Vcg?!{|7{z$iO6k*>jL_HsYb(|HlN-|jIPlT|#5v;6$strK9UD%BO3839C+!gDvcdyOV0A3VF?0bc%=Toqbb3#^02kU%6 z2&+wCU2mlxhyorKOHYDze=Z>CWb@-3+Ur2OM96wR1KM&Ss$>AI@!Cj3LNm~|i+cH= z0@?#YQir{J?V?_xAd0Y?PKZ69gLOP=qMZTO`J#!o6|C#+R2mcT{jHuJ+jw+%8WHX< zOq(F<_j*OLP$FjusF(jd(DsUY>9BmSQ`9Ro6-C$&nVAlPbv$n7nhn-@!OV6iSl4?(*#8_@_g87c zg30>Fc{EP}+5#c#83x))A*##=+AU_bT|jFt7X8ly?I9tl!}7f@AsI?V5q5K}=(!En z@r007a=G{=_n86+L&sI-V4=N^^AgbJSAk6rC^<}3SspiSl0)s2cpL4@Df<}Z4)io{5U_>vw$`#WW6%bRtr(3 z0B9RUz0^ZM+a)CZ7l8Iin$Rum-D^z3G*8Sy5%v>8)N2Lncv{FRg?j0~SunH*H0^%_XrCFI zWp$Xl7e752QK7{s!G78VtAcf$H^EkbbzU^Vo(AjsSP1(sf_0CYhCn9oohpPwO98e- z$a?(%TO&l3Du8VflIp_%yGJ1MU&6{(5{(;xxsMwZ@hyJDZhlSl>R=tu30b8Ytn-q{ zNIe7AbzP{-e;KSt7Qz8Cd2fmk4iy4zsgU&sfp&usRn`G*tB_RB0&S0|m;X(ml|{V* zFn4c)s8^^6McB`nnI?jDJa6V&1J-%j%=Qtmu1|!p{|Z=-RkUt^On#iF+G3zxDP+A# zKwFzeMh&OjN-fZu-xJkyK)W|p3^Z>6twl%%VD4VO01zrg5%#k})SC>}@e?7dYy|6k zQwXb%f^~hGDu#r&!Fue%rEP#r-kWafp$urtgsgWe(AEi2WfRc02}$)apxq}R_}>Lu zYuW>0s@FpSn7daK07B&`!v2U5^`?Mz{8Y#)TfjQ62x0Ycu&&R9u>U=<9;c{UfNb8I zA%sH}K)cFBn+miWO|%U_yWK?l1kmm`E#ZBjwF$`p?A@yi$xs!Fu%8p6-gK~z7lf?R z1lIYM5LTZA>-t=@uKy}nkK05`Ht(HbqOAtnav|%@0NQ#Xsx$*_yO30$0@?#Y(*FU_ z+J(LXuy=1jNQTy-2>YW#)H?&L<3%B>w1RcMErivl!MeT>Rr6m1>+y=J1<2;TS)yv8 z8lYWmW}F4Io6LOMfVRWT_8Fi(XtvmgK9H0?*v%E9cNSR3OQsIm!8+eH zvwaq<%UmJ)KLYDfguCDX**u?=GF~D!0psfWk<^#sjEBb)c;2;opW&{hjsZvoIY3Q^?{&~^z)^#afy5&hBs z70`NxWB~T=eLzTtI#GoEX(8$@1nYQB$SQqco!5l0`Z8G89dk?=1nWr@W)mQr_bxQ` zuoGz43R!Ov&^8HCOv9rXH2xkU>&auS>-rb zr@2B@Uj^&BD}?>G!FrNJ)dFPm-h5HD&~BhzXQC|y+L(#<1kmm_(Y^+>$4pDO1GED| zG5~w`P7#u!Jt)HdtPu5whWd!lvycfop+O|)e5-o+-`y+FHO z$a>3xwpoZOr-0U6BC2ly?K5JTa1UT733UZv?%t_pmitkH{k)lH1z5*LA*-AQ>-<;< zs~5q#MpMNyVHB)qs;F6jOy0Xx)GTxmU~9~bs{ppe%=ck{HJ6C$C9G$S`v&nltR@33 zM#V73nMzjx=I)&)0E7;q2>Ww_^;Uy*TryQ~2CVbCh*d9xb(>!kH7i(8is+F6GI?)- z5DxVL?FPYl*8y#-5LM0sZI6gk-vnA&n2crz+5~e*fVq29Obr}G5%%YWsJ8~JN80&Sg;^=<;%HX*7!2DJNxr1~zlA8fZ5PS#JZ-ZWp4;6F|EkU(>eICpBYr z!|%TD1Gi1oQ1b(~E@~Kn<$Kda4MPv3F#8K;_Dx_NZ<+Z&3D)_!fTCUn>vjuaO$Y0l zVKyIGzqeEfhhY6fUb@FkD&z-x=jiB-W6`D(98trDwifK+`@MTK9cpbVBYgfiv{_-) z;rHY**wOmYBZM#fdjex>#@m}s2lis z_+0Yn=r0xeC_Z4LhXY+-@zR5SIvB7L<)nxEza|}{NyJCqnQT?Vf6zPS{OMjFZ$~~q z+uuEf-ei1Eimao^R}pC&{)2woOBC5ck#36IOp!FR`r0e86E^S8BVQNd(~vKB7+X#+ z&Aib)6))Vrg|w-(bC%kjltQ9ivl6hqbh!2FB)}c<&7pi>N4`@BAiIdTH;BWm>stcR zfoTwpWPn>n371pCE^y25{4qAUR~B{`P6by;=^m$at4~LL4V-ijYwS zJ~cSxe@LmpK7NI^`VXX}Kky*-1g2n$OWU^!)Re7wX!u^UrzasTh45vjO^zbA77dgh zOhfZF%vo4Bt-VLD^((O@@);k1lk^ zpN)?7$)iNlO&z#EL&n`sIooi%9c>hEpc4!2w>ojf9kWo2lnZ~e@Xx*im)&um+m?ox zFCcjNR1KAT4eicuJ0jcS>9w@6a2Mx)Ze zuACAahJ^6IE?`j)Kv>;R)J#wbG~lS0iK4Eml6OIM5@SIzmLzT=e0zuRdxspxk&!kWD~+tgVVm6muEKIirNsIgMSs zYgK#pyMS*JJ6JcM(LmTm$~h#c+fDTd>5ni_-jbFlN$Zbg)UuaT}+m$fTn$`Q(A`ZEBPb(prqp)6g`im+_f> zqI9y|aYu9F&9illeVvu?g%QS{ca3)cC+dbYatU2p3exQuhDPZ4>bo?&7;OTPKdv#F z5*@USj&gKT4c?;~>;PK-8DifjwsX>y+IDh9Gl}j?8mk)B${P30O5Hq@hAZ+pk27@Gaujx3=!wz>+u@6!a4781qU7-qHWuT*#Eir}Qjk%(s zzVq9Q_}z`ZKjRviR}!0gyzj-$3suqSLZ7j|7jIXlD(uM%HxfKLd943)8#a<;nmTv3 zU8IK(#y9MV>Gxxa>szAX_ge^t-ud8Pli%MIr%(|_aFnV%%-e`)9Jb!buxtgIk05Oj;55HxI{)L zZ>D})qWEXshbnHssGeOt*^50SI? zJ1B^6S{NWJ)AQjeJ<`fZht~XcRX*XH!Nx#X*pKimW@%Yv`b>{cw#LYoM+*lkqAf2x zMzu4A<)xf3{BvLc^hh~gBu;3P7CRVW-PCwv=llbqVh!j!@M zD6DiTb&;j?%C$3z!r}#C38%J@FkNz|w&Ww{rId3Ei_l{}r;VdWUyK~2OCy%y8()k* z^zGvQzJ%Iyf4uEjFZ3{$)VyJyUFB?Azqj-NA#Dw>h0$SZ`HopmG$1zgJA+xz< zbmpWs5j?tA&OZx9Vk9z+md56l6U`Dunyb^XVbx4wOlv&Mu&r}1!fhG)a)Caw{r)Pj zU;Di8>Z4GVd}FxsKYexz_!4BXG`O!wbG#s}9iTS(0^MdHJKKhLJKR5UnkyvA9_yLt zPLe!#8zhE5!>iq}j2{DF1(Eq=n`aE=vL4Vo4q?!7jmkflz)P&&hx?@>3z&*GFXzl<&|@*dUCd`z1V07>BP+tfU6|5ZiEE8RY2$aCQ7)4?SzBni zn_iF-ws1jomB9%@@OB)5p+u@GT0hcYlPJ0{GKLMbTqOb#x1rg|qV0@T;IK7kc?ZCIM$cbB5dL0=Y zd{&AK5-VeZj~vDXA34k|J;BW48BnreN;b@LGv z{4T2C?fX5OA2HaABxjlrDQw(jQrs)HpsJafE1WkD12|%1l0OTB|Jdgvehv7phhY{y zu)psW9zFYBEB&D4Pn?iJJS|TKsHJrPy%znAuG^fT7enK%m_}2ex_vZE(!D-oEhy$| zZd%+Eihg;DdLxZoSOb5%zDEB=Q%G{wl-7OOgf9YRhIft$Bl~Tqh2jfo0f7_3{ zk_Z8{(P zJ8uxag=UfQ5y>bVEvTQs*u-yRxMA_{X`rYCOGpn=7h1+PH2k+HaxN8#>)G@ZxRecJ ziRI+z=&%*jFU&`>W9Bfvz0e0Dyg9r>S>a0_ja>d&K!p@PrqZBOLpkb>uD(5lujD)Q zJP~Pp%$YFi#h1N|lvcOKm4oq-Fpe~C%CG~pxeX6tIeLDaV&nhjKfbk#@zrFad2C3F zg$I8M%pUK_6k6oQ4iN9T&$K4K>+_#VW^$CDSuvxdk~z zTshyRl5z6~8O@hZ{;yv@P5Nv3F7uh7mvP!KyEAqBJKx*wO{?SCB{>c)-u*BvX?7k3 z;xkq?BDafjmNFUT?3s{H*5`~s6?KeBh#r5=7=6T{@oO@`ZCryi_n;J zo2c@5;cN`wRcY=*T$yj4S(UXD_%w-XWWP0^S`e)&6+|R|-~ILd)(k;&o>^(5Gw~cB zuPXnxGr?F<8T4~>t2S<)?*+-aAAKkEix&x>N~rj|W-{p|lU5!jpr8`6V#*~Si#|zC zLm#y9ZxE=ZmQ7U{_t~D1Ai}WwnW#P~v2$pyp&?w$-h&+A(ned2TcS{S z-aJW~mzN29Q6w!I4kL_jJtoRAXF4=A1kG95yFG>3*y%iH$|5b>rw`Z&-!e{S2vagc zID+kyL>V6Mx$tZ%ZTJh+oFc|9zD60US(?`@&3=Drzl$)J(YzK7haRP!nfX9xz4dgj zR$)vZf7Y8Z2N#}b=NawIFD32HZ>Cbi&X_d(&To~A=Q4y<-d#>X0M2u*5~GrK^fyyn zkiEEVF7_@xq+Oi*+f&5z<03f)4Q36jKC0W@-%Ocx`z>voLlM%MeSzb_GS9-&&py|tIR&J(^-3Zq@*TF=*i0Q0+z zhxHa7So2C)BH1L#JBWvJ6A$$(Jp4Qbd_7CD;*$FXVae#jX;S3a&2Oa0y~G1j+_*@92*&*g zj866=REDROXcVgF8li48n6gvd=#2@gN0@b+4XbR*Pu)cn9+Hh7VMHWIiCD#Q1&txU zBFURUSLW%)5B7<@(hSS400#C%8u-k@of)$wS=uohz=y3*jy7cAHgD

VCA5HF30o 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 ;EQUIV. + +A0=0 +A1=1 +A2=2 +A3=3 +A4=4 +A5=5 +A6=6 +A7=7 +A10=10 +A11=11 +A12=12 +A13=13 +IFN CMU,{ +A14=14 +A15=15 +A16=16 +} +IFN ITS,{ ;INTERRUPT HANDLER REGISTERS +I14=14 +I15=15 +I16=16 +} +P=17 + +SHPCRX==0 ;X COORDINATE +SHPCRY==SHPCRX+1 ;Y COORDINATE +SHPCRZ==SHPCRY+1 ;Z COORDINATE +SHPCRF==SHPCRZ+1 ;FORWARD FACING +SHPCRU==SHPCRF+1 ;UPWARD FACING +SHPRNC==SHPCRU+1 ;REINCARNATIONS +SHPFRD==SHPRNC+1 ;FORWARD RADAR RANGE +SHPMRX==SHPFRD+1 ;MOBILE RADAR X +SHPMRY==SHPMRX+1 ;MOBILE RADAR Y +SHPMRZ==SHPMRY+1 ;MOBILE RADAR Z +SHPBLZ==SHPMRZ+1 ;BLAZERS LEFT +SHPHIT==SHPBLZ+1 ;HITS +SHPTIM==SHPHIT+1 ;TIME BLAZERS RECHARGED +SHPTRC==SHPTIM+1 ;NUMBER OF TRACED SHIP +SHPRAT==SHPTRC+1 ;RATING +SHPNUM==SHPRAT+1 ;PLAYER NUMBER +SHPINB==SHPNUM+1 ;INPUT BUFFER +SHPOUB==SHPINB+3 ;OUTPUT BUFFER +SHPINU==SHPOUB+3 ;INPUT UUO +SHPOUU==SHPINU+1 ;OUTPUT UUO +SHPTTY==SHPOUU+1 ;TTY NUMBER +SHPNAM==SHPTTY+1 ;POINTER TO NAME +SHPLEN==SHPNAM+1 ;LENGTH OF SHIP BLOCK + +IFN ITS,{ +LOC 41 + JSR UUOH ;UUO HANDLER TO SIMULATE SOME 10-50 STUFF + JSR INT ;INTERRUPT HANDLER FOR I/O +LOC 100 + + ;SIMULATED 10-50 UUO'S + OPDEF CALLI [1000,,0] + OPDEF TTCALL [2000,,0] + OPDEF INPUT [3000,,0] + OPDEF OUTPUT [4000,,0] +UUOMAX==4 + OPDEF RESET [CALLI 0] +MSTIME= +LOCK= +HIBER= + +TYIC==16 ;TTY INPUT CH +TYOC==17 ;TTY OUTPUT CH +$OPCOD==331100 ;BYTE PTR FIELD +$ACFLD==270400 ;" + + +PAT: +PATCH: BLOCK 100 + +UUOH: 0 + MOVEM A13,A13SAV# + LDB A13,[$OPCOD,,40] ;GET OP CODE OF UUO + CAIG A13,UUOMAX ;CHECK + JRST @UUOTAB(A13) ;GO DO IT + .VALUE ;BAD UUO +UUORET: MOVE A13,A13SAV + JRST @UUOH + +UUOTAB: [.VALUE] ;0 + UCALLI ;CALLI E + UTTCAL ;TTCALL AC, + UINPT ;INPUT + UOUTPT ;OUTPUT + +UCALLI: HRRZ A13,40 ;GET E + CAIN A13,0 ;RESET? + JRST URESET + CAIN A13,23 ;MSTIME? + JRST UMSTIM + CAIN A13,60 ;LOCK? + JRST ULOCK + CAIN A13,72 ;HIBER? + JRST UHIBER + .VALUE ;UNIMPLEMENTED CALLI + +URESET: .SUSET [.SMSK2,,[0]] ;DISABLE AND + .SUSET [.SIFPIR,,[0]] ;CLEAR ALL 2ND WD INTS. + .IOPDL ;RESET IOPDL (MIGHT USE SOMEDAY) + + MOVSI A13,-17 ;AOBJN TRHU IO CHANNELS +URSET1: XCT CLSETB(A13) ;CLOSE + SETOM CHNCNT(A13) ;SET BUFFER CNT=-1 + AOBJN URSET1 + SETZM TTYSTI + SETZM TTYSTO + SETZM INAVAL + JRST UUORET + +UMSTIM: MOVEM A12,A12SAV# + .PDTIME A12, ;GET TIME IN 60TH'S + IMULI A12,<=1000/=60> ;SO AS TO APPROX. MILLISECS. + LDB A13,[$ACFLD,,40] ;GET AC FIELD + MOVEM A12,(A13) ;STORE + MOVE A12,A12SAV + JRST UUORET + +ULOCK: JRST UUORET + +UHIBER: LDB A13,[$ACFLD,,40] + HLRZ A13,(A13) ;GET LH OF HIBER'S AC + CAIE A13,20 ;ONLY THIS COMBINATION IMPLEMENTED + .VALUE + SKIPN INAVAL ;SKIP WHEN INPUT AVAILABLE + .HANG ;ELSE WAIT FOREVER + AOS UUOH ;SKIP ON RETURN + JRST UUORET + + +UINPT: MOVEM A12,A12SAV + MOVEM A11,A11SAV# + LDB A12,[$ACFLD,,40] + LSH A12,1 ;*2 + SUBI A12,2 ;GET INPUT CHANNEL # + SKIPG A11,CHNCNT(A12) ;CHARS IN BUFFER WAITING? + .VALUE ;UGH, TRIED TO 'INPUT' WHEN NOTHING THERE. + MOVE A13,CHTPGB(A12) ;GET ADDR OF PGM BUFFER BLK + MOVEM A11,1(A13) ;STORE # CHARS + MOVE A11,CHSTPT(A12) ;GET PTR TO BEG OF BUFF + MOVEM A11,(A13) ;STORE PTR + MOVE A11,CHMSK(A12) ;GET BIT FOR MASK + ANDCAM A11,INAVAL ;TURN OFF BIT FOR THIS CHANNEL + MOVE A11,A11SAV + MOVE A12,A12SAV + JRST UUORET + +UOUTPT: MOVEM A12,A12SAV + MOVEM A11,A11SAV + LDB A12,[$ACFLD,,40] + LSH A12,1 + SUBI A12,1 ;GET CHANNEL # (OUTPUT!) + DPB A12,[$ACFLD,,IOTINS] + MOVE A13,CHTPGB(A12) ;GET ADDR OF PGM BUFFER BLK + MOVE A12,CHSTPT(A12) ;GET START PTR TO BUFFER + MOVEM A12,(A13) ;STORE IN PGM BLK + MOVEI A11,CHBFMX ;SET UP MAX CHS IN BUFF + SKIPG 1(A13) ;SEE IF OUTPUTTING BECAUSE BUFFER FULL + SKIPA A11,[CHBFMX-1] ;YES, JUST USE THIS # + SUB A11,1(A13) ;SUB. TO FIND # CHARS TO OUTPUT + + HRRZM A12,IOTPTR + IDIVI A11,5 ;FIND # WHOLE WDS (BLOCK OUTPUT) + JUMPE A11,UOUTP2 ;NO WHOLE WDS + MOVN A11,A11 ;NEGATE + HRLM A11,IOTPTR ;FOR AOBJN TYPE PTR + XCT IOTINS ;DO WHOLE WDS. +UOUTP2: JUMPE A12,UOUTP3 ;NO LEFTOVER CHARS? + MOVE A11,@IOTPTR ;SHOULD GET LAST (PARTIAL) WD + LSH A11,@BLSHTB(A12) ;BLOCK PTR SHIFT TO GET CHARS RIGHT ADJ. + MOVE A12,BPTRTB(A12) ;BLOCK PTR + MOVEM A12,IOTPTR ;SET UP + XCT IOTINS ;SPIT OUT LAST CHARS +UOUTP3: MOVEI A11,CHBFMX + MOVEM A11,1(A13) ;SET UP CNT AGAIN (BUFF PTR WAS INIT'D BEFORE .IOT) + MOVE A11,A11SAV + MOVE A12,A12SAV + JRST UUORET + +TTYSTI: 0 ;-1 WHEN TYIC OPEN +TTYSTO: 0 ;-1 WHEN TYOC OPEN + +IOTINS: .IOT 0,IOTPTR +IOTPTR: 0 + +BPTRTB: 0 + 377777,,A11 + 477777,,A11 + 577777,,A11 + 677777,,A11 + -1,,A11 + +BLSHTB: 0 + 0,,-=28 + 0,,-=21 + 0,,-=14 + 0,,-=7 + 0 + + +UTTCAL: LDB A13,[$ACFLD,,40] + JRST @UTTCAC(A13) ;GO TO APPROPRIATE TTCALL ROUT. +UTTCAC: UTTC0 + UTTC1 + [.VALUE] + UTTC3 +REPEAT =12,{ [.VALUE] +} + + ;INCHRW - INPUT CHAR, WAIT UNTIL. +UTTC0: SKIPE TTYSTI ;SEE IF TTYI OPEN OR NOT + JRST UTTC01 ;YUP + .OPEN TYIC,[0,,'TTY'] ;UNIT ASCII IN + .VALUE + SETOM TTYSTI +UTTC01: .IOT TYIC,A13 ;GET CHAR + MOVEM A13,@40 ;STORE + JRST UUORET + + ;OUTCHR - OUTPUT A CHAR +UTTC1: LDB A13,[000700,,@40] ;GET THE CHAR + SKIPE TTYSTO ;SEE IF TTYO OPEN OR NOT + JRST UTTC11 ;YUP + .OPEN TYOC,[1,,'TTY'] ;UNIT ASCII OUT + .VALUE + SETOM TTYSTO +UTTC11: .IOT TYOC,A13 + JRST UUORET + + ;OUTSTR - OUTPUT A STRING +UTTC3: MOVE A13,40 ;GET ADDR OF STRING + HRLI A13,440700 ;SET UP PTR + MOVEM A13,OSTRPT# + SKIPE TTYSTO + JRST UTTC32 + .OPEN TYOC,[1,,'TTY'] + .VALUE + SETOM TTYSTO + CAIA +UTTC31: .IOT TYOC,A13 +UTTC32: ILDB A13,OSTRPT ;GET CHAR + JUMPN A13,UTTC31 ;LOOP TIL FIND NULL + JRST UUORET +} + SUBTTL MAIN LOOP + +CUBSTR: RESET ;DROP OLD CHANNELS + MOVE P,[-STKL,,STACK] + PUSHJ P,INITAL ;GET PLAYERS IN + MOVEI A1,1 ;LOCK INTO CORE + LOCK A1, + CAI + MOVEI A10,SHIPS ;FIRST SHIP + +MAINLP: PUSHJ P,QUERY ;FIND SOME COMMANDS + JRST MAINCM ;GOT ONE + MOVSI A1,20 ;WAIT FOR TTY INPUT + HIBER A1, + HALT ;WHAT? + JRST MAINLP + +MAINCM: PUSHJ P,MAKMOV ;INTERPRET MOVE + MOVEI A0,">" + PUSHJ P,OUTCHR ;COMMAND PROMPT + XCT SHPOUU(A10) ;FORCE OUTPUT + JRST MAINLP + SUBTTL MAKMOV - COMMAND INTERPRETER +MAKMOV: PUSHJ P,INPCHR ;GET THE COMMAND + POPJ P, ;NOTHING THERE + TRZ A0,040 ;UPPER CASE + MOVE A1,[-CMNDCT,,CMNDTB] ;COMMAND TABLE + +MAKDCD: HRRZ A2,(A1) ;COMMAND CHARACTER + CAIN A0,(A2) + JRST MAKDSP ;DISPATCH IT + AOBJN A1,MAKDCD + +MAKERC: MOVEI A1,MESG01 ;"WHAT?" + PUSHJ P,OUTSTR + +MAKCLR: PUSHJ P,INPCHR + POPJ P, + JRST .-2 + +MAKERE: MOVEI A1,MESG01 ;"WHAT?" + PJRST OUTSTR + +MAKDSP: HLRZ A2,(A1) ;GET ROUTINE ADDRESS + JRST (A2) + +MAKCMR: PUSHJ P,INPCHR ;GET SECOND CHARACTER + JRST MAKERE + TRZ A0,040 ;UPPER CASE + CAIN A0,"N" ;"RN"? + PJRST RENAMP + CAIN A0,"T" ;"RT"? + JRST MAKCMC + MOVEI A1,4 + CAIN A0,"R" ;"RR"? + JRST MAKCCJ + MOVEI A1,5 + CAIN A0,"L" ;"RL"? + JRST MAKCCJ + JRST MAKERC + +MAKCMC: MOVEI A1,(A1) + SUBI A1,CMNDTB ;MAKE INDEX +MAKCCJ: PUSHJ P,CHGORE ;CHANGE ORIENTATION + JRST MAKCLR + +MAKCMN: PUSHJ P,INPCHR ;GET INPUT + JRST MAKERE + TRZ A0,040 + CAIN A0,"P" ;"NP"? + PJRST NEWPLR + CAIE A0,"M" ;"NM"? + JRST MAKERC + PUSHJ P,RATING + JRST MAKCLR + +MAKCMM: PUSHJ P,INPCHR ;GET INPUT + PJRST MMOVE ;"M" + TRZ A0,040 + CAIN A0,"V" ;"MV"? + JRST MAKMV2 + CAIN A0,"R" ;"MR"? + PJRST MOBRDR + CAIE A0,"S" ;"MS"? + JRST MAKERC + PJRST MESSAG + +MAKCMF: PUSHJ P,INPCHR ;GET INPUT + PJRST FORRDR ;ASSUME "FR" + TRZ A0,040 + CAIN A0,"R" ;REALLY "FR"? + PJRST FORRDR + CAIN A0,"B" ;"FB"? + JRST MAKMV1 + CAIE A0,"A" ;"FA"? + JRST MAKERC + PUSHJ P,FACING + JRST MAKCLR + +MAKMV1: PUSHJ P,BLAZER ;FIRE BLAZER + JRST MAKCLR + +MAKMV2: PUSHJ P,MMOVE + JRST MAKCLR + SUBTTL MOVE ROUTINE +MMOVE: MOVE A1,SHPCRF(A10) ;FORWARD FACING NUMBER + MOVEI A2,GENWK1 ;WORK AREA 1 + PUSHJ P,NVFUNC ;INTERPRET NUMBER + MOVEI A1,(A10) ;COPY POINTER + HRLI A1,-3 ;3 WORDS + SETZ A2, + +MOVER1: MOVE A0,(A1) ;GET COORDINATE + ADDB A0,GENWK1(A2) ;ACCUMULATE + JUMPLE A0,MOVER2 ;OUT OF CUBE + CAMLE A0,CUBSIZ + JRST MOVER2 + AOJ A2, + AOBJN A1,MOVER1 ;REPEAT + MOVE A0,GENWK1 ;REPLACE COORDINATES + MOVEM A0,SHPCRX(A10) + MOVE A1,GENWK1+1 + MOVEM A1,SHPCRY(A10) + MOVE A1,GENWK1+2 + MOVEM A1,SHPCRZ(A10) + POPJ P, + +MOVER2: MOVEI A1,MESG02 ;"NO" + PJRST OUTSTR + SUBTTL QUERY - TERMINAL POLLING ROUTINE +QUERY: MOVEI A7,(A10) ;REMEMBER WHERE I STARTED + +QUERY1: ADDI A10,SHPLEN ;NEXT SHIP + CAMLE A10,LSTSHP ;TOO FAR? + MOVEI A10,SHIPS ;RECYCLE + SKIPE SHPINB+2(A10) ;DATA IN BUFFER? + POPJ P, ;USE THAT SHIP +IFN CMU,{ MOVEI A1,1 ;SKIP ON INPUT READY + MOVE A2,SHPTTY(A10) ;FOR THIS TTY + MOVE A3,[2,,1] + TRMOP. A3, + CAIA +} +IFN ITS,{ MOVE A1,SHPNUM(A10) ;GET PLAYER # + LSH A1,1 ;*2 + SUBI A1,2 ;TO GET INPUT CHANNEL + MOVE A1,CHMSK(A1) ;GET BIT MASK FOR IT + AND A1,INAVAL ;SEE IF BIT IS ON (IE INPUT AVAILABLE) + SKIPE A1 +} + POPJ P, + CAIE A10,(A7) ;LAST ONE? + JRST QUERY1 ;NO + +CPOPJ1: AOS (P) +CPOPJ: POPJ P, + SUBTTL BLAZER ROUTINE +BLAZER: MSTIME A0, ;GET CURRENT TIME + CAMGE A0,SHPTIM(A10) ;BLAZER READY? + JRST BLZR06 ;NO + SOSGE SHPBLZ(A10) ;ONE LESS BLAZER + JRST BLZR08 ;OUT OF FIRES + MOVE A3,SHPCRX(A10) ;COPY COORDINATES + MOVE A4,SHPCRY(A10) + MOVE A5,SHPCRZ(A10) + ADDI A0,=2000 ;TWO SECOND + MOVEM A0,SHPTIM(A10) ;DELAY + MOVE A1,SHPCRF(A10) ;FORWARD FACING + MOVEI A2,A11 ;INTO REGISTERS + PUSHJ P,NVFUNC + +BLZR05: MOVE A7,NPLARS + MOVEI A6,SHIPS + +BLZR01: CAIN A6,(A10) ;MY SHIP? + JRST BLZR03 + CAME A3,SHPCRX(A6) + JRST BLZR03 + CAME A4,SHPCRY(A6) + JRST BLZR03 + CAMN A5,SHPCRZ(A6) + PJRST KILL ;SCORE A HIT + +BLZR03: ADDI A6,SHPLEN ;NEXT SHIP + SOJG A7,BLZR01 + MOVEI A1,3 + +BLZR04: MOVE A0,2(A1) + ADD A0,A10(A1) + JUMPE A0,BLZR09 + CAMLE A0,CUBSIZ ;OFF THE EDGE? + JRST BLZR09 + MOVEM A0,2(A1) ;NEW BLAZER POSITION + SOJG A1,BLZR04 + JRST BLZR05 ;CHECK THE SHIPS AGAIN + +BLZR06: MOVEI A1,MESG03 ;"NOT YET" + PJRST OUTSTR + +BLZR08: SETZM SHPBLZ(A10) ;FIX COUNT + MOVEI A1,MESG04 ;"OUT OF BLAZERS" + PJRST OUTSTR +BLZR09: MOVEI A1,MESG05 ;"MISSED" + PJRST OUTSTR + SUBTTL KILL ROUTINE +; INPUT: A10 POINTS TO WINNER, A6 TO LOSER +; OUTPUT: RETURNS A10. + +KILL: AOS SHPRAT(A10) ;TWO POINTS FOR A HIT + AOS SHPRAT(A10) + SOS SHPRAT(A6) + SOS SHPRAT(A6) + SOSG SHPHIT(A6) ;CAN HE TAKE MORE? + JRST KILL10 ;NO, REINCARNATE + MOVEI A0,3 + SUB A0,SHPHIT(A6) ;WHICH HIT IS THIS + ADDI A0,060 + DPB A0,[POINT 7,MESG06+1,20] + MOVEI A7,(A10) + MOVEI A10,(A6) ;WRITE TO LOSER + MOVEI A1,MESG06 ;"HIT #N FROM ' + PUSHJ P,OUTSTR + MOVE A1,SHPNAM(A7) + PUSHJ P,OUTRPT + PUSHJ P,OUTCRL + XCT SHPOUU(A10) ;FORCE OUTPUT + MOVEI A10,(A7) ;BACK TO WINNER + MOVEI A1,MESG07 ;"BLAZER HIT ON " + PUSHJ P,OUTSTR + MOVE A1,SHPNAM(A6) + PUSHJ P,OUTRPT + PUSHJ P,OUTCRL + MOVE A1,SHPNUM(A7) ;GET SHIP # + CAME A1,SHPTRC(A6) ;WAS HE TRACKING ME? + JRST CPOPJ ;NO + SETZM SHPTRC(A6) ;DROP THE TRACE + MOVEI A1,MESG08 ;"TRACE HAS BEEN BROKEN" + PUSHJ P,OUTSTR + MOVEI A10,(A6) ;BACK TO LOSER + MOVEI A1,MESG09 + PUSHJ P,OUTSTR + XCT SHPOUU(A10) ;FORCE OUTPUT + MOVEI A10,(A7) + AOS SHPRAT(A7) ;ONE POINT + SOS SHPRAT(A6) + POPJ P, + +KILL10: MOVEI A7,(A10) ;SAVE WINNER'S SHIP + MOVEI A10,(A6) + MOVEI A1,MESG10 ;"YOU HAVE BEEN KILLED BY" + PUSHJ P,OUTSTR + MOVE A1,SHPNAM(A7) + PUSHJ P,OUTRPT + PUSHJ P,OUTCRL + MOVEI A0,12 ;TEN POINTS + ADDM A0,SHPRAT(A7) + MOVN A0,A0 + ADDM A0,SHPRAT(A6) + MOVEI A10,SHIPS ;CHECK ALL OTHER SHIPS + MOVE A5,NPLARS + +KILL12: CAMN A6,SHPTRC(A10) ;IN HIS TRACE? + SETZM SHPTRC(A10) ;NO LONGER + PUSHJ P,OUTCRL + MOVE A1,SHPNAM(A6) + PUSHJ P,OUTRPT + MOVEI A1,MESG11 ;"KILLED BY" + PUSHJ P,OUTSTR + MOVE A1,SHPNAM(A7) + PUSHJ P,OUTRPT + PUSHJ P,OUTCRL + XCT SHPOUU(A7) + ADDI A10,SHPLEN + SOJG A5,KILL12 + MOVEI A0,3 ;SALVAGED BLAZERS + ADDM A0,SHPBLZ(A7) + MOVEI A10,(A6) + AOS SHPRNC(A6) ;REINCARNATION + PUSHJ P,INIPLR ;RESTART SHIP + MOVEI A1,MESG12 ;"YOU HAVE BEEN REINCARNATED" + PUSHJ P,OUTSTR + XCT SHPOUU(A6) ;FORCE TYPEOUT + MOVEI A10,(A7) ;BACK TO WINNER + POPJ P, + SUBTTL INIPLR - INITIALIZE SHIP VARIABLES +INIPLR: PUSH P,A2 ;SAVE REGISTER + MOVEI A2,(A10) + HRLI A2,-3 ;WORD COUNTER + +IPLR10: PUSHJ P,RANDOM + FMPR A0,CUBSZF ;CUBE LOCATION + FADRI A0,(1.0) ;PLUS ONE + PUSHJ P,IFIX + MOVEM A0,(A2) + AOBJN A2,IPLR10 + PUSHJ P,RANDOM + FMPRI A0,(6.0) ;PICK A FACING + FADRI A0,(1.0) + PUSHJ P,IFIX + MOVEM A0,SHPCRF(A10) ;FORWARD FACING + +IPLR20: PUSHJ P,RANDOM + FMPRI A0,(6.0) + FADRI A0,(1.0) + PUSHJ P,IFIX + MOVEM A0,SHPCRU(A10) ;UPWARD FACING + AOJ A0, + ASH A0,-1 + MOVE A1,SHPCRF(A10) + AOJ A1, + ASH A1,-1 + CAMN A0,A1 + JRST IPLR20 + MOVE A0,NPLARS + IMULI A0,3 + MOVEM A0,SHPBLZ(A10) ;NEW BLAZERS + MOVEI A0,3 + MOVEM A0,SHPHIT(A10) + SETZM SHPTRC(A10) + SETZM SHPTIM(A10) + POP P,A2 + POPJ P, + SUBTTL NEWPLR ROUTINE +NEWPLR: CAIE A10,SHIPS ;FIRST ONE? + JRST NPLR09 ;NO + SETZ A2, + +NPLR01: PUSHJ P,INPCHR ;START TTY NUMBER + JRST NPLR11 + SUBI A0,060 + JUMPL A0,NPLR02 ;POOR + CAILE A0,7 + JRST NPLR02 + ASH A2,3 ;APPEND DIGIT + ADD A2,A0 + JRST NPLR01 + +NPLR02: JUMPE A2,NPLR10 ;NO TTY # + ADDI A0,060 ;REPAIR LAST CHAR + MOVE A1,NPLARS + IMULI A1,SHPLEN + MOVEI A7,SHIPS(A1) ;THE NEW SHIP + MOVE A6,SHPNAM(A7) + HRRZ A1,A6 ;COPY POINTER + SETZM (A1) + SETZM 1(A1) + SETZM 2(A1) + SETZM 3(A1) + MOVEI A5,=18 + JRST NPLR06 + +NPLR05: PUSHJ P,INPCHR ;GET NAME CHARACTER + JRST NPLR08 ;DONE + +NPLR06: CAME A6,SHPNAM(A7) ;UNCHANGED? + JRST NPLR07 + CAIN A0," " + JRST NPLR05 + +NPLR07: IDPB A0,A6 + SOJG A5,NPLR05 + MOVEI A1,MESG14 ;"NAME TOO LONG" + PUSHJ P,OUTSTR + JRST MAKCLR + +NPLR08: CAMN A6,SHPNAM(A7) ;GET ANYTHING? + JRST NPLR12 + SETZM SHPRNC(A7) + SETZM SHPRAT(A7) + TRO A2,200000 + MOVEM A2,SHPTTY(A7) + PUSHJ P,INITTY ;START UP TERMINAL + JRST NPLR13 + SETZM SHPTIM(A7) ;READY TO FIRE + MOVEI A10,(A7) + PUSHJ P,INIPLR ;PUT HIM IN SPACE + AOS NPLARS + MOVEI A10,SHIPS ;BACK TO CONTROLLER + POPJ P, + +NPLR09: MOVEI A1,MESG01 ;"WHAT?" + PUSHJ P,OUTSTR + JRST MAKCLR + +NPLR10: MOVEI A1,MESG15 ;"TTY #?" + PUSHJ P,OUTSTR + JRST MAKCLR + +NPLR11: MOVEI A1,MESG01 ;"WHAT?" + PJRST OUTSTR + +NPLR12: MOVEI A1,MESG16 ;"NO NAME" + PJRST OUTSTR + +NPLR13: MOVEI A1,MESG17 ;"BAD TTY" + PJRST OUTSTR + SUBTTL MESSAGE SENDING ROUTINE +MESSAG: SETZ A3, + MOVE A2,[POINT 7,A3] ;READY TO INSERT + MOVEI A4,5 + +MSGR01: PUSHJ P,INPCHR ;GET NAME CHARACTER + JRST MAKERE + CAIN A0,":" ;NAME TERMINATOR? + JRST MSGR03 + CAIN A0," " + JRST MSGR01 + IDPB A0,A2 + SOJG A4,MSGR01 + +MSGR02: PUSHJ P,INPCHR + JRST MAKERE + CAIN A0,":" ;TERMINATOR? + JRST MSGR02 + +MSGR03: SETZ A5, ;ASSUME *ALL + CAMN A3,STARB ;IS IT? + JRST MSGR05 + SETO A5, + MOVEI A6,SHIPS + MOVE A4,NPLARS + MOVEI A7,(A10) ;SAVE SENDERS SHIP + +MSGR04: CAMN A3,@SHPNAM(A6) ;RIGHT NAME? + JRST MSGR05 ;YES + ADDI A6,SHPLEN + SOJG A4,MSGR04 + MOVEI A1,MESG18 ;"WHO?" + PUSHJ P,OUTSTR + JRST MAKCLR + +MSGR05: MOVE A3,[POINT 7,GENWK1] + +MSGR06: PUSHJ P,INPCHR + JRST MSGR07 + IDPB A0,A3 ;ACCUMULATE + JRST MSGR06 + +MSGR07: SETZ A0, + IDPB A0,A3 ;TERMINATE + JUMPE A5,MSGR08 ;FOR *ALL? + MOVEI A10,(A6) ;RECIEVER + MOVEI A1,MESG19 ;"MESSAGE FROM " + PUSHJ P,OUTSTR + MOVE A1,SHPNAM(A7) + PUSHJ P,OUTRPT + MOVEI A1,MESG20 ;" : " + PUSHJ P,OUTSTR + MOVE A1,[POINT 7,GENWK1] + PUSHJ P,OUTSTR + PUSHJ P,OUTCRL + XCT SHPOUU(A10) ;FORCE TYPEOUT + MOVEI A10,(A7) + POPJ P, + +MSGR08: MOVEI A7,(A10) ;SAVE SENDER + MOVEI A10,SHIPS + MOVE A4,NPLARS + +MSGR09: CAIN A10,(A7) + JRST MSGR10 + MOVEI A1,MESG21 ;"MSG TO ALL FROM " + PUSHJ P,OUTSTR + MOVE A1,SHPNAM(A7) + PUSHJ P,OUTRPT + MOVEI A1,MESG20 + PUSHJ P,OUTSTR + MOVE A1,[POINT 7,GENWK1] + PUSHJ P,OUTRPT + PUSHJ P,OUTCRL + XCT SHPOUU(A10) ;FORCE OUTPUT + +MSGR10: ADDI A10,SHPLEN + SOJG A4,MSGR09 + MOVEI A10,(A7) + POPJ P, + SUBTTL CHGORE ROUTINE +CHGORE: MOVE A4,A1 ;COPY INDEX + MOVE A1,SHPCRF(A10) ;FORWARD FACING + MOVEI A2,GENWK1 + PUSHJ P,NVFUNC + MOVE A1,SHPCRU(A10) ;UPWARD FACING + MOVEI A2,GENWK2 + PUSHJ P,NVFUNC + JRST .+1(A4) ;DISPATCH + JRST CHG010 + JRST CHG020 + JRST CHG030 + JRST CHG040 + JRST CHG050 + JRST CHG060 + +; LEFT TURN +CHG010: HRREI A3,-1 + CAIA + +; RIGHT TURN +CHG020: MOVEI A3,1 + MOVEI A1,GENWK1 + MOVEI A2,GENWK2 + PUSHJ P,CROSS + JRST CHG070 + +; TURN UP +CHG030: MOVSI A1,-3 +CHG034: MOVE A2,GENWK2(A1) + MOVN A0,GENWK1(A1) + MOVEM A0,GENWK2(A1) + MOVEM A2,GENWK1(A1) + AOBJN A1,CHG034 + JRST CHG070 + +; TURN DOWN +CHG040: MOVSI A1,-3 +CHG044: MOVE A2,GENWK1(A1) + MOVN A0,GENWK2(A1) + MOVEM A0,GENWK1(A1) + MOVEM A2,GENWK2(A1) + AOBJN A1,CHG044 + JRST CHG070 + +; ROLL RIGHT +CHG050: SKIPA A3,[-1] + +; ROLL LEFT +CHG060: MOVEI A3,1 + MOVEI A1,GENWK2 + MOVEI A2,GENWK1 + PUSHJ P,CROSS + +CHG070: MOVEI A1,GENWK1 + PUSHJ P,VNFUNC + MOVEM A0,SHPCRF(A10) ;NEW FORWARD FACING + MOVEI A1,GENWK2 + PUSHJ P,VNFUNC + MOVEM A0,SHPCRU(A10) ;NEW UPWARD FACING + POPJ P, + SUBTTL CROSS ROUTINE +CROSS: MOVE A4,1(A1) + IMUL A4,2(A2) + MOVE A5,2(A1) + IMUL A5,1(A2) + SUB A4,A5 + MOVE A11,A4 + + MOVE A4,2(A1) + IMUL A4,(A2) + MOVE A5,(A1) + IMUL A5,2(A2) + SUB A4,A5 + MOVE A12,A4 + + MOVE A4,(A1) + IMUL A4,1(A2) + MOVE A5,1(A1) + IMUL A5,(A2) + SUB A4,A5 + MOVE A13,A4 + + MOVSI A4,-3 + +CROSSL: MOVE A5,A11(A4) + IMUL A5,A3 + MOVEM A5,(A1) + AOJ A1, + AOBJN A4,CROSSL + POPJ P, + SUBTTL MOBILE RADAR ROUTINE +MOBRDR: PUSHJ P,INPCHR ;FIND DATA + JRST MOBR03 ;DEFAULTED + HRLZI A2,-3 + JRST MOBR02 + +MOBR01: PUSHJ P,INPCHR + JRST MOBR03 + +MOBR02: CAIN A0,040 ;BLANK? + JRST MOBR01 + CAIN A0,"," + JRST MOBR01 + SUBI A0,060 + JUMPL A0,MOBR03 + CAILE A0,11 + JRST MOBR03 + MOVEM A0,A11(A2) ;REMEMBER INDEX + AOBJN A2,MOBR01 + MOVEM A11,SHPMRX(A10) + MOVEM A12,SHPMRY(A10) + MOVEM A13,SHPMRZ(A10) + PUSHJ P,INPCHR + CAIA + JRST .-2 + +MOBR03: SKIPE SUPPRT ;SUPPRESS PRINT? + JRST MOBR05 + MOVEI A2,SHPMRX(A10) ;MR PARAMETERS + HRLI A2,-3 + MOVE A3,[POINT 7,MESG22,20] + +MOBR04: MOVE A0,(A2) ;PICK UP INDEX + ADDI A0,060 + IDPB A0,A3 + IBP A3 ;SKIP + IBP A3 + AOBJN A2,MOBR04 + MOVEI A1,MESG22 + PUSHJ P,OUTSTR + +MOBR05: MOVE A1,SHPCRF(A10) ;FORWARD FACING + MOVEI A2,GENWK2 + PUSHJ P,NVFUNC + MOVE A1,SHPCRU(A10) ;UPWARD FACING + MOVEI A2,GENWK3 + PUSHJ P,NVFUNC + MOVE A1,GENWK2 + ADD A1,GENWK2+1 + ADD A1,GENWK2+2 + MOVEM A1,SUMWK2 + MOVE A1,GENWK3 + ADD A1,GENWK3+1 + ADD A1,GENWK3+2 + MOVEM A1,SUMWK3 + MOVEI A3,SHPMRX(A10) + MOVSI A2,-3 + +MOBR06: PUSHJ P,CORSEL ;SELECT COORDINATE + MOVEI A0,1 + JUMPGE A1,.+3 + MOVN A0,A0 + MOVM A1,A1 + IMUL A0,(A3) + SOJ A1, + MOVE A6,A1 + ADDI A6,(A10) + ADD A0,(A6) + MOVEM A0,GENWK1(A1) + AOJ A3, + AOBJN A2,MOBR06 + MOVEI A0,SHPCRF(A10) + MOVEI A1,GENWK1 + PJRST PRTRDR ;PERFORM RADAR + SUBTTL FORWARD RADAR ROUTINE +FORRDR: CAIE A0,"R" ;COULD THERE BE A NUMBER? + JRST FORD02 ;NO + +FORD01: PUSHJ P,INPCHR + JRST FORD02 + CAIN A0," " + JRST FORD01 + SUBI A0,060 + JUMPL A0,MAKERC + CAIL A0,10 + JRST MAKERC + MOVEM A0,SHPFRD(A10) ;FORWARD RANGE + PUSHJ P,INPCHR ;CLEAR INPUT + CAIA + JRST .-2 + +FORD02: MOVE A1,SHPCRF(A10) + MOVEI A2,GENWK1 + PUSHJ P,NVFUNC + MOVE A0,SHPFRD(A10) + ADDI A0,060 + DPB A0,[POINT 7,MESG23+1,34] + MOVEI A1,MESG23 ;"DISP = N" + PUSHJ P,OUTSTR + MOVE A0,SHPCRU(A10) + SOJ A0, + TRNN A0,1 + ADDI A0,2 + SETOM FRFLAG ;FORWARD RADAR FMT + MOVEM A0,GENWK4 + MOVE A0,SHPCRF(A10) + MOVEM A0,GENWK4+1 + MOVE A1,SHPFRD(A10) + MOVSI A2,-3 + +FORD03: MOVE A0,GENWK1(A2) + IMUL A0,A1 + ADD A0,(A10) + MOVEM A0,GENWK1(A2) + AOJ A10, + AOBJN A2,FORD03 + SUBI A10,3 + MOVEI A0,GENWK4 ;DIRECTION NUMBERS + MOVEI A1,GENWK1 + PUSHJ P,PRTRDR + SETZM FRFLAG + POPJ P, + SUBTTL CORSEL COORDINATE SELECTOR +; ROUTINE TO SELECT THE CURRENT FORWARD AXIS (LH(A2)=-3), +; CURRENT UPWARD AXIS (LH(A2)=-2), OR THE LEFT TO RIGHT AXIS +; (LH(A2)=-1). +; THIS ROUTINE MAPS THE COORDINATE DISPLACEMENT TYPED IN BY THE +; PLAYER INTO THE ABSOLUTE X, Y, Z COORDINATES USED INTERNALLY. +; A 1, 2, OR 3 IS RETURNED IN A1 WHICH INDICATES RESPECTIVELY +; THAT THE X, Y, OR Z AXIS IS THE FORWARD, UPWARD, OR +; LEFT-RIGHT AXIS. THE RETURNED VALUE IS ALSO POSITIVE +; OR NEGATIVE WHICH INDICATES THAT THE SHIP IS ORIENTED +; IN THE POSITIVE OR NEGATIVE DIRECTION. + +CORSEL: HLRE A1,A2 ;COPY CODE + JRST .+4(A1) ;DISPATCH + JRST CORS30 + JRST CORS20 + MOVSI A1,-3 ;LAST + +CORS10: SKIPE GENWK2(A1) + CAIA + SKIPE GENWK3(A1) +CORS12: AOBJN A1,CORS10 + MOVEI A1,1(A1) + IMUL A1,SUMWK2 + IMUL A1,SUMWK3 + POPJ P, + +CORS20: MOVSI A1,-3 ;SECOND + SKIPN GENWK3(A1) + AOBJN A1,.-1 + MOVEI A1,1(A1) + IMUL A1,GENWK3-1(A1) + POPJ P, + +CORS30: MOVSI A1,-3 ;FIRST + SKIPN GENWK2(A1) + AOBJN A1,.-1 + MOVEI A1,1(A1) + IMUL A1,GENWK2-1(A1) + POPJ P, + SUBTTL PRTRDR ROUTINE +PRTRDR: PUSH P,A0 ;SAVE A0 + PUSH P,A1 + SKIPN FRFLAG + JRST PRDR01 + MOVEI A2,GENWK2 + MOVE A1,@A0 ;GET FF + PUSHJ P,NVFUNC + MOVE A1,-1(P) ;RECOVER A0 + MOVE A1,1(A1) ;GET UF + MOVEI A2,GENWK3 + PUSHJ P,NVFUNC + MOVE A0,GENWK2 + ADD A0,GENWK2+1 + ADD A0,GENWK2+2 + MOVEM A0,SUMWK2 + MOVE A0,GENWK3 + ADD A0,GENWK3+1 + ADD A0,GENWK3+2 + MOVEM A0,SUMWK3 + +; S=SUM(FRF)*SUM(URF)*LSIGN((FF+1)/2,(UF+1)/2) + +PRDR01: MOVE A1,-1(P) ;RESTORE A0 + MOVE A2,(A1) ;GET FF + MOVE A3,1(A1) ;AND UF + AOJ A2, + AOJ A3, + ASH A2,-1 + ASH A3,-1 + SOJ A2, + SOJ A3, + IMULI A2,3 + ADD A2,A3 + MOVE A6,LSIGN(A2) + IMUL A6,SUMWK2 + IMUL A6,SUMWK3 + +; LRF(J)=(1-IABS(FRF(J)+URF(J)))*S + MOVSI A2,-3 + +PRDR02: MOVE A1,GENWK2(A2) + ADD A1,GENWK3(A2) + MOVM A1,A1 + MOVEI A0,1 + SUB A0,A1 + IMUL A0,A6 + MOVEM A0,GENWK5(A2) + AOBJN A2,PRDR02 +; TAKE EACH SHIP AND FILL IN 'CUBEWK' +; WITH THE APPROPRIATE SHIP NUMBERS IN ASCII. + MOVEI A4,SHIPS + MOVN A3,NPLARS + HRLZ A3,A3 + +PRDR03: MOVEI A2,061(A3) ;THIS SHIP'S NUMBER + MOVE A1,SHPCRX(A4) + SOJ A1, + IMULI A1,=64 + MOVE A0,SHPCRY(A4) + SOJ A0, + IMULI A0,10 + ADD A1,A0 + MOVE A0,SHPCRZ(A4) + SOJ A0, + ADD A1,A0 + MOVEM A2,CUBEWK(A1) ;FILL ADDRESSED LOCATION + ADDI A4,SHPLEN + AOBJN A3,PRDR03 + MOVE A1,(P) ;RECOVER A1 + +; F=FRF(1)*X +FRF(2)*Y +FRF(3)*Z + MOVE A0,(A1) + IMUL A0,GENWK2 + MOVE A3,1(A1) + IMUL A3,GENWK2+1 + ADD A0,A3 + MOVE A3,2(A1) + IMUL A3,GENWK2+2 + ADD A0,A3 + MOVEM A0,GENWK6 + +; U=URF(1)*X +URF(2)*Y +URF(3)*Z + MOVE A0,(A1) + IMUL A0,GENWK3 + MOVE A3,1(A1) + IMUL A3,GENWK3+1 + ADD A0,A3 + MOVE A3,2(A1) + IMUL A3,GENWK3+2 + ADD A0,A3 + MOVEM A0,GENWK6+1 + +; L=LRF(1)*X +LRF(2)*Y +LRF(3)*Z + MOVE A0,(A1) + IMUL A0,GENWK5 + MOVE A3,1(A1) + IMUL A3,GENWK5+1 + ADD A0,A3 + MOVE A3,2(A1) + IMUL A3,GENWK5+2 + ADD A0,A3 + MOVEM A0,GENWK6+2 + +; FILL IN THE SCREEN + MOVSI A2,-11 + +PRDR04: MOVE A3,UOFSET(A2) + ADD A3,GENWK6+1 + MOVE A4,LOFSET(A2) + ADD A4,GENWK6+2 + +; (A5,A6,A7)_FRF(J)*F +URF(J)*A3 +LRF(J)*A4 + MOVSI A11,-3 + +PRDR05: MOVE A0,GENWK2(A11) + IMUL A0,GENWK6 + MOVE A1,GENWK3(A11) + IMUL A1,A3 + ADD A0,A1 + MOVE A1,GENWK5(A11) + IMUL A1,A4 + ADD A0,A1 + MOVEM A0,5(A11) + AOBJN A11,PRDR05 + + JUMPLE A5,PRDR06 ;CHECK FOR CUBE WALL + JUMPLE A6,PRDR06 + JUMPLE A7,PRDR06 + CAMLE A5,CUBSIZ + JRST PRDR06 + CAMLE A6,CUBSIZ + JRST PRDR06 + CAMLE A7,CUBSIZ + JRST PRDR06 + +; SCREEN(J,K) = CUBEWK(A5,A6,A7) + SOJ A5, + SOJ A6, + SOJ A7, + IMULI A5,=64 + IMULI A6,10 + ADD A5,A6 + ADD A5,A7 + MOVE A5,CUBEWK(A5) + MOVEM A5,SCREEN(A2) + CAIN A5,"-" ;EMPTY? + JRST PRDR07 + SUBI A5,060 + CAMN A5,SHPNUM(A10) ;OWN SHIP? + JRST PRDR07 + SKIPE FRFLAG ;FORWARD RADAR + JRST PRDR07 + SOJ A5, + IMULI A5,SHPLEN + MOVEI A6,(A10) ;SAVE SENDER + MOVEI A10,SHIPS(A5) + MOVEI A1,MESG24 ;"BEING SCANNED" + PUSHJ P,OUTSTR + XCT SHPOUU(A10) ;FORCE OUTPUT + MOVEI A10,(A6) + JRST PRDR07 + +PRDR06: MOVEI A5,"*" + MOVEM A5,SCREEN(A2) + +PRDR07: AOBJN A2,PRDR04 + SKIPE SUPPRT ;TRACE? + JRST PRDR09 + MOVSI A2,-11 + MOVE A3,[POINT 7,MESG25] + +PRDR08: MOVE A0,SCREEN(A2) ;GET TYPEOUT + IDPB A0,A3 + IBP A3 + IBP A3 + AOBJN A2,PRDR08 + MOVEI A1,MESG25 ;THE SCAN + PUSHJ P,OUTSTR + +PRDR09: MOVEI A0,"-" ;EMPTINESS + MOVE A1,[-=512,,CUBEWK] + MOVEM A0,(A1) + AOBJN A1,.-1 + POP P,A1 + POP P,A0 + POPJ P, + SUBTTL MATHEMATICAL UTILITIES +IFIX: MOVEM A0,FIXWRK ;SAVE SIGN + MOVM A0,A0 + MULI A0,400 + EXCH A0,A1 + ASH A0,-243(A1) + SKIPGE FIXWRK + MOVNS A0,0 + POPJ P, + +NVFUNC: PUSH P,A3 ;SAVE A3 + HRLI A2,-3 +NVFNC1: SETZM (A2) ;ASSUME CLEAR + HLRE A3,A2 ;ASSUME CLEAR + MOVEI A0,4 + ADD A0,A3 + MOVE A3,A1 + AOJ A3, + ASH A3,-1 + CAME A3,A0 + JRST NVFNC2 + ASH A0,2 + MOVE A3,A1 + ASH A3,1 + SUB A3,A0 + ADDI A3,1 + MOVN A3,A3 + MOVEM A3,(A2) +NVFNC2: AOBJN A2,NVFNC1 + POP P,A3 + POPJ P, + +VNFUNC: PUSH P,A2 + HRLI A1,-3 + MOVEI A2,4 +VNFNC1: SKIPN (A1) + JRST VNFNC2 + MOVE A0,A2 + SUB A0,(A1) + SUBI A0,1 + ASH A0,-1 +VNFNC2: ADDI A2,4 + AOBJN A1,VNFNC1 + POP P,A2 + POPJ P, + SUBTTL FACING ROUTINE +FACING: MOVE A2,[POINT 7,MESG26] + MOVE A3,SHPCRU(A10) ;UPWARD FACING + MOVE A3,FACNAM-1(A3) + IDPB A3,A2 + ASH A3,-7 + IDPB A3,A2 + IBP A2 + IBP A2 + MOVE A3,SHPCRF(A10) ;FORWARD FACING + MOVE A3,FACNAM-1(A3) + IDPB A3,A2 + ASH A3,-7 + IDPB A3,A2 + MOVE A2,[POINT 7,MESG26+2,6] + MOVEI A4,(A10) + HRLI A4,-3 + +FACNG1: MOVE A0,(A4) ;GET COORDINATE + ADDI A0,060 ;MAKE INTO ASCII + IDPB A0,A2 + IBP A2 + IBP A2 + AOBJN A4,FACNG1 + MOVEI A1,MESG26 ;INFORMATION LINE + PJRST OUTSTR + SUBTTL RATING ROUTINE +RATING: MOVEI A1,MESG27 ;HEADER LINE + PUSHJ P,OUTSTR + MOVEI A5,SHIPS + MOVN A4,NPLARS + MOVS A4,A4 + HRRI A4,1 + +RATNG1: MOVE A2,[POINT 7,MESG28] + MOVE A1,SHPNUM(A5) + ADDI A1,060 + IDPB A1,A2 + IBP A2 + IBP A2 + IBP A2 + MOVE A3,SHPNAM(A5) + MOVEI A6,=18 + +RATNG2: ILDB A0,A3 + JUMPE A0,RATNG3 + IDPB A0,A2 + SOJA A6,RATNG2 + +RATNG3: MOVEI A0," " + IDPB A0,A2 + SOJG A6,.-1 + MOVM A6,SHPRAT(A5) ;RATING + MOVEI A1,5 + +RATNG4: IDIVI A6,12 + ADDI A7,060 + PUSH P,A7 + JUMPE A6,RATNG8 ;IF DONE + SOJG A1,RATNG4 + JRST RATNG7 + +RATNG6: MOVEI A7," " + PUSH P,A7 + +RATNG8: SOJG A1,RATNG6 + +RATNG7: MOVEI A1,5 ;ASSUMED LENGTH + SKIPL SHPRAT(A5) + JRST RATNG5 + MOVEI A1,4 + POP P,A0 + MOVEI A0,"-" + IDPB A0,A2 + +RATNG5: POP P,A0 + IDPB A0,A2 + SOJG A1,RATNG5 + + MOVEI A1,3 + SUB A1,SHPHIT(A5) + ADDI A1,060 + DPB A1,[POINT 7,MESG28+6,27] + MOVE A6,SHPBLZ(A5) + IDIVI A6,12 + ADDI A6,060 + MOVE A2,[POINT 7,MESG28+8,6] + DPB A6,A2 + ADDI A7,060 + IDPB A7,A2 + MOVE A2,[POINT 7,MESG28+9,27] + MOVE A6,SHPRNC(A5) + IDIVI A6,12 + ADDI A6,060 + ADDI A7,060 + DPB A6,A2 + IDPB A7,A2 + MOVEI A1,MESG28 + PUSHJ P,OUTSTR + ADDI A5,SHPLEN + AOBJN A4,RATNG1 + POPJ P, + SUBTTL TRACE ROUTINES +TRACEA: MOVE A2,SHPTRC(A10) ;GET TRACE POINTER + JUMPE A2,TRACEB ;TRY TO MAKE TRACE + PUSHJ P,INPCHR + CAIA + JRST .-2 + +TRACA1: SOJ A2, + IMULI A2,SHPLEN + ADDI A2,SHIPS + MOVE A3,[POINT 7,MESG29+3] + HRLI A2,-3 + +TRACA2: MOVE A0,(A2) ;GET COORDINATE + ADDI A0,060 + IDPB A0,A3 + IBP A3 + IBP A3 + AOBJN A2,TRACA2 + MOVEI A1,MESG29 + PUSHJ P,OUTSTR + MOVEI A3,(A10) ;SAVE TRACING SHIP + MOVEI A10,-3(A2) ;GET TRACED SHIP + MOVEI A1,MESG24 ;"BEING SCANNED" + PUSHJ P,OUTSTR + XCT SHPOUU(A10) ;FORCE OUTPUT + MOVEI A10,(A3) + POPJ P, + +TRACEB: SETOM SUPPRT ;SUPPRESS PRINT + PUSHJ P,MOBRDR + SETZM SUPPRT + MOVSI A1,-11 + +TRACB1: MOVE A2,SCREEN(A1) ;INSPECT SPACE + CAIN A2,"*" ;CUBE EDGE? + JRST TRACB2 + CAIE A2,"-" ;VOID? + JRST TRACB3 ;NO, A SHIP + +TRACB2: AOBJN A1,TRACB1 + MOVEI A1,MESG30 ;"NOBODY THERE" + PJRST OUTSTR + +TRACB3: SUBI A2,060 ;MAKE NUMBER + CAMN A2,SHPNUM(A10) ;MY OWN? + JRST TRACB2 + MOVEM A2,SHPTRC(A10) ;TRACE IS ON + JRST TRACA1 ;SHOW HIS POSITION + SUBTTL RENAME ROUTINE +RENAMP: MOVE A2,SHPNAM(A10) ;POINT TO NAME + HRRZ A1,A2 + SETZM (A1) + SETZM 1(A1) + SETZM 2(A1) + SETZM 3(A1) + MOVEI A3,=18 + +RENAM1: PUSHJ P,INPCHR + JRST RENAM3 + CAME A2,SHPNAM(A10) ;LEADING CHAR? + JRST RENAM2 + CAIN A0," " + JRST RENAM1 + +RENAM2: IDPB A0,A2 + SOJG A3,RENAM1 + PUSHJ P,INPCHR + CAIA + JRST .-2 + MOVEI A1,MESG14 + PUSHJ P,OUTSTR + +RENAM3: MOVE A0,SHPNUM(A10) + ADDI A0,060 + DPB A0,[POINT 7,MESG36+1,34] + MOVEI A7,(A10) + MOVEI A10,SHIPS + MOVE A2,NPLARS + +RENAM4: MOVEI A1,MESG36 ;PLAYER NOW NAMED + PUSHJ P,OUTSTR + MOVE A1,SHPNAM(A7) + PUSHJ P,OUTRPT + PUSHJ P,OUTCRL + XCT SHPOUU(A10) + ADDI A10,SHPLEN + SOJG A2,RENAM4 + MOVEI A10,(A7) + POPJ P, + SUBTTL CUBESIZE ROUTINE +CBSIZP: CAIE A10,SHIPS ;FIRST PLAYER? + JRST MAKERC +CBSIZ1: PUSHJ P,INPCHR + JRST MAKERE + CAIN A0,"U" ;EXTRA CHARACTER? + JRST CBSIZ1 + CAIN A0," " + JRST CBSIZ1 + DPB A0,[POINT 7,MESG37+3,27] + SUBI A0,060 + JUMPLE A0,MAKERC + CAILE A0,10 + JRST MAKERC + MOVEM A0,CUBSIZ + FSC A0,233 + MOVEM A0,CUBSZF + MOVEI A10,SHIPS + MOVE A3,NPLARS + +CBSIZ2: HRLI A10,-3 + MOVE A2,[POINT 7,MESG37+7,13] + +CBSIZ3: PUSHJ P,RANDOM + FMPR A0,CUBSZF + FADRI A0,(1.0) + PUSHJ P,IFIX + MOVEM A0,(A10) + ADDI A0,060 + IDPB A0,A2 + IBP A2 + IBP A2 + AOBJN A10,CBSIZ3 + SUBI A10,3 + MOVEI A1,MESG37 ;"CUBE SIZE IS NOW ", + PUSHJ P,OUTSTR ;"YOU ARE NOW AT " + XCT SHPOUU(A10) + ADDI A10,SHPLEN + SOJG A3,CBSIZ2 + MOVEI A10,SHIPS + POPJ P, + SUBTTL INITIALIZATION ROUTINE +INITAL: MOVEI A1,6 ;DEFAULT CUBESIZE + MOVEM A1,CUBSIZ + MOVSI A1,(6.0) + MOVEM A1,CUBSZF + MOVEI A1,"-" ;VOID MARKER + MOVE A2,[-=512,,CUBEWK] + MOVEM A1,(A2) + AOBJN A2,.-1 + +INIT01: TTCALL 3,MESG31 ;"HOW MANY PLAYERS?" + TTCALL 0,A1 + SUBI A1,060 + JUMPLE A1,INIT01 + CAILE A1,12 + JRST INIT01 + MOVEM A1,NPLARS + CAIGE A1,5 ;CUBE TOO SMALL? + JRST INIT02 + MOVEI A0,10 + MOVEM A0,CUBSIZ + MOVSI A0,(8.0) + MOVEM A0,CUBSZF + +INIT02: TTCALL 3,MESG32 ;"GIVE ME TTY NUMBERS" + MOVEI A7,SHIPS + +INIT03: TTCALL 0,A2 ;GET HIGH DIGIT + SUBI A2,060 + JUMPL A2,INIT07 + CAILE A2,7 + JRST INIT07 + ASH A2,3 + TTCALL 0,A3 + SUBI A3,060 + JUMPL A3,INIT07 + CAILE A3,7 + JRST INIT07 + MOVEI A0," " + TTCALL 1,A0 + ADD A2,A3 + TRO A2,200000 ;ADD TTY BITS + MOVEM A2,SHPTTY(A7) + ADDI A7,SHPLEN + SOJG A1,INIT03 + MOVEI A7,SHIPS ;NOW TRY TO INIT THEN + MOVE A2,NPLARS + +INIT04: PUSHJ P,INITTY + JRST INIT08 ;CAN'T OPEN TTY + ADDI A7,SHPLEN + SOJG A2,INIT04 + TTCALL 3,MESG38 + MOVEI A10,SHIPS + MOVE A7,NPLARS + +INIT05: MOVEI A1,MESG33 ;"GIVE ME YOUR NAME" + PUSHJ P,OUTSTR + XCT SHPOUU(A10) + SETZM SHPBLZ(A10) ;MY INDICATOR + ADDI A10,SHPLEN + SOJG A7,INIT05 + PUSHJ P,GETNAM ;GET NAMES + TTCALL 3,MESG34 + MOVEI A10,SHIPS + MOVE A7,NPLARS + +INIT06: MOVEI A1,MESG34 ;"LET THE WAR BEGIN" + PUSHJ P,OUTSTR + XCT SHPOUU(A10) + ADDI A10,SHPLEN + SOJG A7,INIT06 + POPJ P, + +INIT07: TTCALL 3,MESG35 ;"BAD TTY #" + JRST INIT03 + +INIT08: TTCALL 3,MESG17 ;"CANT GET TO TTY" + MOVE A1,NPLARS + JRST INIT02 ;START OVER + SUBTTL NAME GETTING ROUTINE +GETNAM: MOVEI A10,SHIPS ;READY FOR QUERY + MOVE A6,NPLARS + +GETNM1: PUSHJ P,QUERY + JRST GETNM2 ;INTERPRET + MOVSI A1,20 + HIBER A1, ;WAIT FOR TTY LINE + HALT + JRST GETNM1 + +GETNM2: SKIPE SHPBLZ(A10) ;NAME ALREADY THERE? + JRST GETNM7 ;YES + MOVE A2,SHPNAM(A10) ;POINT TO NAME + MOVEI A3,=18 + HRRZ A1,A2 + SETZM (A1) + SETZM 1(A1) + SETZM 2(A1) + SETZM 3(A1) + +GETNM3: PUSHJ P,INPCHR + JRST GETNM5 + CAME A2,SHPNAM(A10) ;LEADING BLANKS? + JRST GETNM4 + CAIN A0," " + JRST GETNM3 + +GETNM4: IDPB A0,A2 + SOJG A3,GETNM3 + MOVEI A1,MESG14 ;"NAME TOO LONG" + PUSHJ P,OUTSTR + XCT SHPOUU(A10) + JRST GETNM7 ;RETRY + +GETNM5: CAMN A2,SHPNAM(A10) ;NULL NAME? + JRST GETNM6 + PUSHJ P,INIPLR ;FILL IN SHIP BLOCK + SETZM SHPRNC(A10) ;NO DEATHS YET + SETZM SHPRAT(A10) + SOJG A6,GETNM1 + POPJ P, ;ALL READY + +GETNM6: MOVEI A1,MESG16 ;"NO NULL NAMES" + PUSHJ P,OUTSTR + XCT SHPOUU(A10) + JRST GETNM1 + +GETNM7: PUSHJ P,INPCHR + JRST GETNM1 + JRST .-2 + SUBTTL TELETYPE INITIALIZER +INITTY: MOVE A5,SHPTTY(A7) ;GET TTY NUMBER +IFN CMU,{ TRZ A5,200000 ;CLEAR TRMNO. BIT + MOVE A11,A5 + TRZ A5,000007 + ASH A5,3 + TRZ A11,000070 + ADD A5,A11 + TRO A5,202020 + HRLI A5,646471 + MOVEI A4,1 ;SET LINE MODE + MOVEI A6,SHPINB(A7) + HRLI A6,SHPOUB(A7) + MOVE A11,SHPOUU(A7) ;FIND OUTPUT UUO + TLZ A11,777000 ;KILL UUO CODE + TLO A11,050000 ;ADD OPEN CODE + HRRI A11,A4 + XCT A11 + POPJ P, ;FAILED +} +IFN ITS,{ MOVE A11,A5 + ROT A11,-3 ;GET FIRST 3 BITS + MOVEI A5,(A11) + LSH A5,6 + ROT A11,3 + ANDI A11,7 + ADDI A5,(A11) + ADDI A5,'T00' ;GET TNN + HRLI A5,0 ;SET UP MODE (UNIT ASCII IN) + MOVE A4,SHPNUM(A7) ;FIND PLAYER # (TO GET CHANNEL # FROM) + LSH A4,1 + SUBI A4,2 ;INPUT CHANNEL IS <#*2>-2 + HRRZI A6,A5 ;EFF ADDR FOR .OPEN + HLL A6,OPNTAB(A4) ; .OPEN CH, + XCT A6 + POPJ P, ;INPUT OPEN FAILED + CAIN A4,TYIC + SETZM TTYSTI + ADDI A4,1 ;OUTPUT CH= INPUT+1 + HLL A6,OPNTAB(A4) + HRLI A5,3 ;MODE=BLOCK OUT + XCT A6 + POPJ P, ;FAILED + CAIN A4,TYOC + SETZM TTYSTO + + SETOM CHNCNT(A4) ;SET RANDOM VARIABLES FOR EACH CH + MOVEI A5,CHBFMX + MOVEM A5,SHPOUB+2(A7) ;SET UP BUFFER CNT + MOVE A5,CHSTPT(A4) ;PTR INTO BUFFER + MOVEM A5,SHPOUB+1(A7) + MOVEI A5,SHPOUB+1(A7) + MOVEM A5,CHTPGB(A4) ;SAVE INDEX TO BLK + + SOJ A4, + SETOM CHNCNT(A4) + SETZM SHPINB+2(A7) + MOVEI A5,SHPINB+1(A7) + MOVEM A5,CHTPGB(A4) + MOVE A5,CHMSK(A4) ;GET BIT MSK + .SUSET [.SIMSK2,,A5] ;ENABLE INPUT INTS. ON THIS CHANNEL +} + MOVEM A7,LSTSHP + AOS (P) + POPJ P, + SUBTTL RANDOM NUMBER GENERATOR +RANDOM: MOVE A0,RANNUM + MUL A0,RANLST + ASHC A0,4 + LSH A1,-4 + ADD A0,A1 + TLZE A0,760000 + ADDI A0,1 + MOVEM A0,RANLST + HLRZ A1,A0 + FSC A1,216 + HRLI A0,0 + FSC A0,174 + FAD A0,A1 + POPJ P, + SUBTTL TELETYPE I/O ROUTINES +OUTCHR: SOSG SHPOUB+2(A10) ;CHECK SPACE + XCT SHPOUU(A10) ;GET MORE + IDPB A0,SHPOUB+1(A10) ;INSERT CHARACTER + POPJ P, + +OUTSTR: HRLI A1,440700 ;ADD POINTER + +OUTRPT: ILDB A0,A1 ;GET CHARACTER + JUMPE A0,CPOPJ + PUSHJ P,OUTCHR + JRST OUTRPT + +OUTCRL: MOVEI A0,015 + PUSHJ P,OUTCHR + MOVEI A0,012 + PJRST OUTCHR + +INPCHR: SOSGE SHPINB+2(A10) ;CHARACTERS READY? + XCT SHPINU(A10) + ILDB A0,SHPINB+1(A10) + JUMPE A0,INPCHR ;IGNORE NULLS + CAIN A0,033 + JRST INPCH1 ;TREAT ESC LIKE EOL + CAIN A0,015 ;IGNORE CR + JRST INPCHR + CAIE A0,012 ;LINE FEED? DO EOL HANDLING + JRST CPOPJ1 ;ORDINARY RETURN + +INPCH1: SETZB A0,SHPINB+2(A10) +IFN ITS,{ PUSH P,A1 + MOVE A1,SHPNUM(A10) ;GET PLAYER # + LSH A1,1 + SUBI A1,2 ;GET INPUT CH # FOR PLAYER + SETOM CHNCNT(A1) ;INDICATE MUST INITIALIZE BUFFER + MOVE A1,CHMSK(A1) ;GET BIT FOR THIS CHAN + .SUSET [.SADF2,,A1] ;CLEAR DEFER BIT; ENABLE INTS FOR CHAN + POP P,A1 ;I.E. NOW FREE TO GET MORE CHARS INTO BUFFER +} + POPJ P, + +IFN ITS,{ +INT: 0 + 0 + SKIPL I15,INT ;GET INT. BITS + JRST INTFW ;HMM, NOT I/O INT. + ANDI I15,177777 ;IO CHANNEL FIELD- LAST 16. BITS + JFFO I15,INT0 ;GET CNT OF LEADING 0'S + JRST INTRET ;NOTHING LEFT +INT0: SUBI I16,=35 ;GET -<# OF CH> + MOVN I16,I16 ;CH # + ANDCM I15,CHMSK(I16) ;KILL THE BIT FOR CHAN WE'RE HANDLING + MOVEM I15,INT ;AND SAVE + + MOVE I14,I16 + .ITYIC I14, + JRST INT99 ;NOT REALLY ANYTHING THERE + XCT IOTTB(I16) ;GET CHAR INTO I14 + CAIN I14,177 ;RUBOUT? + JRST INTRBT + AOSG I15,CHNCNT(I16) ;ADD ONE TO COUNT IN BUFFER + JRST INTBFI ;IF ZERO, SIGN TO GO INITIALIZE BUFFER(RETURN TO INT20) +INT20: CAIN I14,15 ;CR? + JRST INTCR + CAILE I15,CHBFMX ;CHECK FOR BLOATED BUFFER + JRST INT90 ;THROW AWAY CHAR IF FULL + IDPB I14,CHBFPT(I16) ;STORE + +INT99: SKIPE I15,INT ;GET INT. WD AGAIN + JFFO I15,INT0 ;MUNG IF ANYTHING LEFT +INTRET: .DISMIS INT+1 ;RETURN TO MAIN PROGRAM + +INT90: MOVE I14,CHMSK(I16) ;GET BIT MSK + IORM I14,INAVAL ;AND INDICATE INPUT AVAILABLE + .SUSET [.SIDF2,,I14] ;AND DEFER INTS FOR THIS CHAN + JRST INT99 + +INTRBT: MOVEI I15,1(I16) ;GET OUTPUT CH # + SOSL CHNCNT(I16) ;DECREMENT CNT + JRST INTRB5 ;NOTHING LEFT + LDB I14,CHBFPT(I16) ;GET LAST CHAR + XCT IOTTB(I15) ;OUTPUT CHAR + MOVE I15,CHBFPT(I16) ;DECREMENT POINTER. + ADD I15,[70000,,0] ;INCREASE P + SKIPG I15, ;SKIP + SUB I15,[430000,,1] ;UNLESS WENT OFF EDGE...RESET + MOVEM I15,CHBFPT(I16) ;STORE DECREMENTED PTR BACK + JRST INT99 +INTRB5: MOVEI I14,15 ;OUTPUT CR + XCT IOTTB(I15) + MOVEI I14,12 ;AND LF + XCT IOTTB(I15) + SETZM CHNCNT(I16) ;ZERO CNT + MOVE I15,CHSTPT(I16) ;GET PTR TO START + MOVEM I15,CHBFPT(I16) ;AND SET UP + JRST INT99 + +INTCR: AOS I15,CHNCNT(I16) ;INCRMENT CNT AGAIN FOR LF + IDPB I14,CHBFPT(I16) ;DEPOSIT CR + MOVEI I14,12 ;AND SUPPLY LF + IDPB I14,CHBFPT(I16) + MOVE I15,CHMSK(I16) ;AND NOW DEFER INTS ON THIS CHANNEL + .SUSET [.SIDF2,,I15] + IORM I15,INAVAL ;AND TURN ON BIT INDICATING INPUT AVAIL ON THIS CHAN. + JRST INT99 ;THRU WITH THIS CHAN + +INTBFI: MOVE I15,CHSTPT(I16) ;INITIALIZE...GET PTR TO START OF BUFFER + MOVEM I15,CHBFPT(I16) ;STORE + MOVEI I15,1 ;AND CNT + MOVEM I15,CHNCNT(I16) + JRST INT20 ;RETURN TO PROCESS INPUT CHAR + +INTFW: .VALUE ;STOP IF HIT INT. NOT PROVIDED FOR + .DISMIS INT+1 + + +INAVAL: 0 ;BITS IN THIS WORD INDICATE INPUT AVAILABLE +CHTPGB: BLOCK 20 ;FOR EACH CH, ADDR+1 OF MAIN PROGRAM'S DEC-STYLE BLOCK +CHNCNT: BLOCK 20 +CHBFPT: BLOCK 20 +CHBFMX== =100 ;# CHARS MAXIMUM IN EACH BUFF. +CHBFWL==</5>+1 ;FIND # WDS PER BUFFER (ENSURE ROOM FOR 2 EXTRA CHARS) +CHSTPT: FOR C_0,17 +{ 440700,,CHBUFF+CHBFWL*C +} +CHBUFF: BLOCK 20*CHBFWL ;ROOM FOR ALL BUFFERS + +OPNTAB: FOR C_0,17 +{ .OPEN C, +} +CLSETB: FOR C_0,17 +{ .CLOSE C, +} +IOTTB: FOR C_0,17 +{ .IOT C,I14 +} +CHMSK: FOR C_0,17 +{ 1C +} + +} ;END OF BIG CONDITIONAL + + SUBTTL CONSTANTS +CMNDTB: MAKCMC,,"L" + MAKCMR,,"R" + MAKCMC,,"U" + MAKCMC,,"D" + MAKCMM,,"M" + MAKCMN,,"N" + MAKCMF,,"F" + CBSIZP,,"C" + MAKMV1,,"B" + TRACEA,,"P" + TRACEB,,"T" +CMNDCT==.-CMNDTB + +STARB: ASCIZ "*" +RANNUM: 4544,,503720 + +LSIGN: OCT 0,1,777777777777,777777777777,0,1 + OCT 1,777777777777,0 +LOFSET: OCT 777777777777,0,1,777777777777,0,1 + OCT 777777777777,0,1 +UOFSET: OCT 1,1,1,0,0,0 + OCT 777777777777,777777777777,777777777777 +FACNAM: 26053 + 26055 + 26253 + 26255 + 26453 + 26455 + +MESG01: ASCIZ "What? +" +MESG02: ASCIZ "No +" +MESG03: ASCIZ "Not yet +" +MESG04: ASCIZ "Out of Blazers +" +MESG05: ASCIZ "Missed +" +MESG07: ASCIZ "Blazer hit on " +MESG08: ASCIZ "Trace on you has been broken +" +MESG09: ASCIZ "Trace lock has been broken +" +MESG10: ASCIZ "You have been killed by " +MESG11: ASCIZ " killed by " +MESG12: ASCIZ "You have been reincarnated +" +MESG14: ASCIZ "Name too long +" +MESG15: ASCIZ "Teletype number not given +" +MESG16: ASCIZ "Name not given +" +MESG17: ASCIZ "Unable to initialize teletype +" +MESG18: ASCIZ "Receiver not found +" +MESG19: ASCIZ "Message from " +MESG20: ASCIZ ": " +MESG21: ASCIZ " +Msg to all from " +MESG24: ASCIZ " +*****Being Scanned! +" +MESG27: ASCIZ " RATING HITS BLZRS DEATHS +" +MESG30: ASCIZ "No ship seen to Trace +" +MESG31: ASCIZ "How many players? 1-8 : " +MESG32: ASCIZ " +Enter TTY numbers, two digits each +: " +MESG33: ASCIZ "Enter name to identify your ship : " +MESG34: ASCIZ "All players ready, proceed with game +" +MESG35: ASCIZ "Bad TTY number +" +MESG38: ASCIZ "Obtaining Player names. +" + SUBTTL VARIABLES +STKL==100 +STACK: BLOCK STKL + +GENWK1: BLOCK 3 +GENWK2: BLOCK 3 +GENWK3: BLOCK 3 +GENWK4: BLOCK 2 +GENWK5: BLOCK 3 +GENWK6: BLOCK 3 + +SUMWK2: 0 +SUMWK3: 0 + +CUBEWK: BLOCK =512 +SCREEN: BLOCK 9 + +NPLARS: 0 +LSTSHP: 0 +CUBSIZ: 0 +CUBSZF: 0 +RANLST: 1,,-1 +SUPPRT: 0 +FRFLAG: 0 +FIXWRK: 0 + +SHIPS: FOR N_1,10 +{ BLOCK =15 + N + BLOCK 6 + INPUT N, + OUTPUT N, + 0 + POINT 7,NAMES+<*4> +} + +NAMES: BLOCK 40 + +MESG06: ASCIZ " +HIT #0 from " +MESG22: ASCIZ " + 0, 0, 0 +" +MESG23: ASCIZ " +DIST = 0 +" +MESG25: ASCIZ "0 0 0 +0 0 0 +0 0 0 + +" +MESG26: ASCIZ "+x ++x =>( 0, 0, 0) +" +MESG28: ASCIZ "0) 00000 0 00 00 +" +MESG29: ASCIZ "Traced ship = (0, 0, 0) +" +MESG36: ASCIZ " +Player 0 is now named " +MESG37: ASCIZ " +Cubesize is now 0 +You are now at (0, 0, 0) +" + + END CUBSTR +  \ No newline at end of file diff --git a/src/klh/cubwar.doc b/src/klh/cubwar.doc new file mode 100644 index 00000000..cebd4c10 --- /dev/null +++ b/src/klh/cubwar.doc @@ -0,0 +1,203 @@ + + + CUBE WAR + + Cubewar is a computer game played on conventional terminals +between from two to eight players. It has been transmitted through +the ARPANet from its originator, Jim Sulzen at UC-at-Irvine. +It is a highly interactive program, +which will be kept quite busy handling all of its +terminals. Thus, it will often be a load on the system, +and a moderately used system may not be able to provide adequate +response to Cubewar. According, it should be used during idle +time whenever possible. + + The game is played within a cube of space, from 6 +to 8 cubes on a side. Each player is a 'ship' in this cubical +space, provided with simple means of locating others, and armed +with a 'blazer' to attack other ships. The cubes which make up +cubical space might be thought of as quarants in StarTrek, within +which a ship may have varying locations. This is not the case. +A ship is either in one cube, or it is not; there are no variations +on the fact of being 'in' a particular cube. + + A ship has a particular direction in which it is facing, +one direction which is directly in 'front' of the ship. +This is one of the six possible directions relative to the cube, +with no grades in between. Consider a left-handed Cartesian +coordinate system. The direction directly in front of you +is 'plus-X', while the opposite is 'minus-X.' To your right +is the 'plus-Y' direction, to your left is 'minus-Y,' upward is +'plus-Z' and downward is 'minus-Z.' This is the system used in +defining Cubewar directions. In addition, a cube has a three-digit +address, from (1,1,1) to (8,8,8) assuming a size-8 cube. + + In addition to a 'forward' direction, the ship has a definite +'upward' direction. The two facings, forward and upward, are used +to specify what area of space is examined by the Radar commands. +The two facings, of course, will be 90 degrees apart. +You have six commands to alter the orientation of your ship: +Right Turn (RT), Left Turn (LT), UP, Down (DN), Rotate Right +(RR), and Rotate Left (RL). + + The ships have movement ability, through the Move (MV) +command. This causes the ship to take one step in the 'forward' +direction. There is no way to order the ship to 'keep moving,' +you must issue a MV for each step. The ship will not be permited +to leave the cube; there is nowhere else to go. + Radar: There are two commands available to let you see +what is outside of your ship. These are Forward Radar and +Mobile Radar. Both of these show you a grid of nine squares, +giving you the contents of nine cubes in space. What is shown +is either an asterisk, a dash, or a number. An asterisk indicates +that the cube section is outside the cube, and the dash indicates +that the cube section is empty. A one-digit number indicates that the +cube section is occupied by a ship, and the number shows which +ship. By this you may recognize you, your friends, and your enemies. + + The difference between the Forward and Mobile Radars is in +which cube sections are shown. The simple one is the Forward radar. +It takes a parameter, entered like 'FR2', which gives the distance +between your ship and the start of the display. For example, +a 'FR' command alone would produce something like + + - - - + - 1 - + - - - + +which means that you (ship #1) have nothing around you. With forward +radar the nine locations shown will be in the same 'plane' as your ship. +Consider your orientation, with a specific forward and upward direction. +Forward radar shows you what is in front of you or just on each side of +you, and never what is above or below you. For reasonableness it will +also not show you what is behind you. This means that the bottom line shown +is waste; you can make better use of the display by pushing the scan forward +a few cubes, like 'FR1', which might show + + - - 5 + - - - + - 1 - + +which shows your ship one step backwards. It also shows ship #5 two +cubes ahead of you and one to the right. Recall the commands given +above. Perform a RT, an MV, and a LT. Where are you now? +Another 'FR1' gives you + - 5 - + - - - + - 1 - +so you are on the same plane, but one step to your right. + You have on the front of your ship a Blazer which will project +directly in front of your ship until it hits something. It will enter +each cube in front of you until it finds a ship, or the edge of the cube. +Since ship 5 is right in front of you, typing 'FB' will result in the +message 'BLAZER HIT ON PHANTOM' or something like it. This means that you +hit him. It also tells you 'his' name, the name he typed what the game +started up. Now if you FB again, if he hasn't moved yet, you will get +another similar message. A ship can take two blazer hits. The third +time it gets hit, it is 'destroyed', and disappears, with the message +'PLAYER PHANTOM KILLED BY NOVICE' sent to all the players. +(The name NOVICE was what ever you said you were.) Your victim got +recreated someplace else in the cube. + Mobile Radar: This is rather more complicated than Forward +Radar. This takes a three-digit number as parameter. These numbers +give the location of a cube in space, with the given displacement +from your ship. The first digit is the X-displacement, the second Y, +the last Z. Thus, 'MR300' refers to the third cube in front of you. +What does it do with this cube? It takes a cross-section of the +cube around that cube section, at right angles to the line between you +and that section. That is, it shows what is above and below the given +cube section. Consider the previous example with FR. Given the situation + + - 5 - + - - - + - 1 - + +the command 'MR200' will give the display + + - - - + - 5 - + - - - + +which means that ship 5 is at range 2 (since MR200 found him) and +directly in front of you (which you knew). Now do a DN (Down), Move, +and UP. Consider where you are now. FR finds nothing, since the +enemy is not on your plane, but on the one above you. But 'MR200' gives + + - 5 - + - - - + - - - + +which means that he is still 2 steps in front of you, but, as you see, +one level above you. + + This permits you to examine much more space than FR permits. +You can use FR to look for ships to shoot at immediately. Mobile +Radar will permit you to examine a whole 'tunnel' in front of you +to find someone who can't see you on Forward Radar. To give him +a warning, whenever anybody is shown an a Mobile Radar scan be gets +the message '***BEING SCANNED' which gives him a chance to move. + Scoring: To give some way of comparing the performances of +the many players, points are scored for each player. Two points are +scored for hitting somebody with a blazer, and ten for killing him. +The 'Name' command, NM, gives a display of the performances of all +the players. For instance, + + RATING HITS BLZRS DEATHS +1) NOVICE 16 0 13 0 +2) LORD BALTIMORE 48 1 19 0 +3) AVENGER 5 2 7 1 +4) PIMPERNEL - 41 0 9 3 +5) PHANTOM - 28 0 6 2 + +Observe the Rating column. Every time you get two points, +your opponent loses two points. The hits column shows how many +hits the ship has taken, towards the limit of three. The BLZRS +column shows how many Blazer fires the ship has left. Each ship +starts with 3 times as many blazers as there are players, and +get 3 as a bonus whenever it kills another ship. The Deaths column +shows how many times the player took his three hits and had to be +recreated. + EtCetera: The Message command permits you to send messages +to other players, or to all the players at once. The formats are + MS phant:got you! +or MS *:everyone after number 5! + +where the player's name is given followed by a colon and the message. +In some versions the first five letters of the name are required, +in others the first three. To send the message to everyone +the player name is given as an asterisk. + + The Trace command (TR) may be issued when you see somone +on the Mobile radar. Thereafter, you can issue Print Trace (PT) and be +told where in space that ship has gone to. It is given in cube-relative +locations, so you must know where you are to make use of the information. +The Facing command (FA) gives a display like + +Z + +X => (4,6,1) +which means that your ship is at X=4, Y=6, Z=1, and that +X is in +front of you and +Z is above you. + + Due to all sorts of reasons you may be disenchanted with the +name you gave when you started the game. To change it type + RNnewname +and it will be announced to everyone to keep things straight. + + The default Cube size is 6X6X6. If there are 5 or more +players it goes up to 8X8X8, which is the absolute limit. +Should you wish to change the size, the player who started the game +can say + CU 7 +for instance, to change the size to 7X7X7. + + The game may be in progress when another player arrives. +Rather than restarting the game, the person who is running it can issue + NP25newplayername +to define TTY25, for instance, to be player 'newplayername'. +If he doesn't like his name, after all, he can change it. + CubeWar is started by a RUN CUBWAR[A630DK32]. +Answer the question "How Many Players?" with the number 1 through 8, +no CR required. Provide the TTY numbers as two digits each, no more +no less, no delimiters, no carriage return. If it says you blew it, +and asks again, retype all the TTY numbers. CUBWAR is maintained +and developed by Dave King, KING@CMUA or KING@CMUB. + z't \ No newline at end of file diff --git a/src/klh/flight.306 b/src/klh/flight.306 new file mode 100644 index 00000000..622e72ca --- /dev/null +++ b/src/klh/flight.306 @@ -0,0 +1,3667 @@ +TITLE FLIGHT SIM. + +A=1 +B=2 +C=3 +D=4 +X=5 +Y=6 +I=7 +J=10 +P=11 + +LC%ES==12 +LP%IF==13 +ZP%MD==14 +Z%IN==12 + +U=15 +V=16 +W=17 + +IMD==6 +ZMD==0 +PMD==1 +VMD==4 +VCMD==5 +CMD==3 +IMX=574 +OMX==570 +IORSET=633550 +DISCH==5 +SDISCH==4 +TTCH==6 +CLCH==2 +SISET==100 +PDS==100 +DDT=34000 +DSIS==3000 +MXMEM==12100+CLCH + +FOOF==1 + + +; UUO DEFINEINGS + +PRNT=001000,,0 +SAC=002000,,0 +UAC=003000,,0 +WATE=004000,,0 ;UNUSED UUO +VAAX=005000,,0 ;UNUSED UUO +MACDMP=37400 + R==V +S==J + +Z%SC==U +Z%ST==W + +IMD==6 +ZMD==0 +PMD==1 +VMD==4 +CMD==3 + +SIXTH==252 +PDS==300 +MX==1 +TEN==2 +IMX==574 +STDS==2440 +MVDS==3000 + +DEFINE 4PUT L +IRPS Q,,A B C D,R,,L + MOVEI 0,R + JSP Q,(Q) +TERMIN +TERMIN +.OPEN=.OPEN +.CLOSE=.CLOSE +.DSTART=.DSTART +.DSTOP=.DSTOP +.DCLOCE=.DCLOSE +.IOT=.IOT +.SLEEP=.SLEEP +.SUSET=.SUSET +.DISMIS=.DISMIS +.CORE=.CORE + + LOC 41 + JSR UUOH + + LOC 40+2*TTCH + JSR TTYBK + + LOC 40+2*CLCH + JSR CLOCK + + LOC 40+2*DISCH + BLKO DIS,BLKOP + JRST 4,. + + LOC 40+2*SDISCH + JSR DISIN + JRST 4,. + LOC 100 + + +GO: CONO IORSET+CLCH + CONO 460,0 + CONO TTY,TTCH + MOVE A,[JSR UUOH] + MOVEM A,41 + MOVE P,[-PDS,,PDL-1] + PUSHJ P,DSTOP + + SETZM REMX + MOVE A,[50.0] + MOVEM A,REMY + MOVE A,NODEG + PUSHJ P,ANGXY + MOVEM A,SINA + MOVEM B,SINB + MOVE A,[360.0] + FDVR A,NODEG + PUSHJ P,FIX + MOVEM A,NOLINS + + CONO 420,40 + SETZM COUNT' + SETOM TTYOFF' + SETOM ONCE' + SETOM ONCE1' + SETZM TRACE' + MOVEI A,SISET-1 + MOVEM A,INPNTR + MOVEM A,OTPNTR + CONO PI,12276 + + MOVEI A,XTAB + MOVEM A,MACDMP+0 + MOVEI A,YTAB + MOVEM A,MACDMP+1 + MOVEI A,ZTAB + MOVEM A,MACDMP+2 + MOVEI A,XTAB1 + MOVEM A,MACDMP+3 + MOVEI A,YTAB1 + MOVEM A,MACDMP+4 + MOVEI A,ZTAB1 + MOVEM A,MACDMP+5 +IDL: JRST TEST1 + +TIME: 0 + +TEST1: MOVE P,[-PDS,,PDL-1] ; GO FLY + PUSHJ P,DSTOP + MOVSI A,-6 + SETZM ROL(A) + AOBJN A,.-1 + MOVE A,[1000.0] + MOVEM A,XE + + MOVEI A,3777 + MOVEM A,EVLI + PUSHJ P,SETUPF + MOVE A,TIME + PUSHJ P,FLT + MOVEM A,LTIME +RELIN1: PUSHJ P,SWBP + PUSHJ P,FLY + PUSHJ P,MVINS + PUSHJ P,MAIRP + + PUSHJ P,DCRFT + JRST RELIN1 + +TEST: MOVE P,[-PDS,,PDL-1] ; RANDOME POSISHIONING + PUSHJ P,DSTOP + SETZM DZON + MOVSI A,-6 + SETZM ROL(A) + AOBJN A,.-1 + MOVSI A,(1000.0) + MOVEM A,XE + +RELIN: PUSH P,U + PUSH P,V + PUSH P,W + PUSH P,I + PUSH P,J + + PUSHJ P,SWBP + DATAI 420,B + + SETZM A + TLNN B,100000 + MOVN A,TIPA + TLNN B,40000 + MOVE A,TIPA + FADRM A,PCH + + MOVE A,[360.0] + SKIPGE PCH + FADRM A,PCH + MOVE A,[-360.0] + CAMLE A,[360.0] + FADRM A,PCH + + SETZM A + TLNN B,400000 + MOVE A,TIPA + TLNN B,200000 + MOVN A,TIPA + FADRM A,YAW + + MOVE A,[360.0] + SKIPGE YAW + FADRM A,YAW + MOVE A,[-360.0] + CAMLE A,[360.0] + FADRM A,YAW + + TLNN B,20000 + SETOM RMONE + TLNN B,20000 + JRST CONT + SKIPE RMONE + AOS A,GOING + SETZM RMONE + MOVE A,GOING + CAIL A,4 + SETZB A,GOING + SKIPN GOING + JRST CONT + CAIN A,2 + JRST CONT + + CAIN A,1 + MOVE B,[MOVE C,VEMC(B)] + CAIN A,3 + MOVE B,[MOVN C,VEMC(B)] + MOVEM B,PMI + + MOVSI B,-3 +REMV: MOVE A,MXTB + SUBI A,3777 + PUSHJ P,FLT + FMPR A,[0.005] +PMI: JRST 4,. + FMPR C,A + FADRM C,XE(B) + AOBJN B,REMV + +CONT: POP P,J + POP P,I + POP P,W + POP P,V + POP P,U + + PUSHJ P,DCRFT + JRST RELIN + +DCRFT: PUSHJ P,TRNS +ITS: TRN GETITS + MOVEI A,WORLD + PUSHJ P,GETPE +IFN FOOF,[ SETOM DOBJ + MOVEI A,LFOO + TRN P,GETPE + SKIPL DOBJ + SETZM FOOP] + + MOVEI A,RUNW + PUSHJ P,GETPE + MOVEI A,HEL + TRN P,GETPE +DSENT: MOVEI A,3000 ;STOP DISPLAY + IDPB A,BP + PUSHJ P,DSTART + POPJ P, + + +TIPA: 1.0 +RMONE: 0 +GOING: 0 +FOOP: 77777 + +GETITS: MOVEI A,WORLD1 + PUSHJ P,GETPE + JRST DSENT + IFN FOOF,[LFOO: AOS I,FOOP + CAIG I,10 + POPJ P, + SETZM DOBJ + MOVE I,[200-BARIND,,200] + JRST ILOOP] + +WORLD1: MOVSI I,-8 + JRST ILOOP +WORLD: MOVSI I,-36 + JRST ILOOP +PYR: MOVSI I,-8 +ILOOP: MOVE U,XTAB(I) + MOVE V,YTAB(I) + MOVE W,ZTAB(I) + JSP A,(A) +ILOOP1: MOVE U,XTAB1(I) + MOVE V,YTAB1(I) + MOVE W,ZTAB1(I) + JSP A,(A) + AOBJN I,ILOOP + POPJ P, + +GFROB: MOVSI U,@GFSC +GFSC: MOVSI W,236000 + MOVE V,W + XOR V,U + TLC V,236000 +GFLP: JSP A,(A) + MOVSI V,40 + ADDB V,W + XOR V,U + TLC V,236000 + JSP A,(A) + CAMGE W,[236740,,] + JRST GFLP + ADD U,[40,,] + TLNE U,740 + JRST GFSC + POPJ P, + +RUNW: MOVSI I,(MOVN V,(I)) + HLLM I,ILOOP+1 + HLLM I,ILOOP1+1 + MOVE I,[-14,,9] + PUSHJ P,ILOOP + MOVSI I,(MOVN U,(I)) + HLLM I,ILOOP + HLLM I,ILOOP1 + MOVE I,[-10,,8+5] + PUSHJ P,ILOOP + MOVSI I,(MOVE V,(I)) + HLLM I,ILOOP+1 + HLLM I,ILOOP1+1 + MOVE I,[-10,,8+5] + PUSHJ P,ILOOP + MOVE I,[-1,,8] + PUSHJ P,ILOOP + MOVSI I,(MOVE U,(I)) + HLLM I,ILOOP + HLLM I,ILOOP1 + POPJ P, + + HEL: SETZM W + MOVE I,NOLINS +HELBK: SETZB U,V + JSP A,(A) + MOVE U,REMX + MOVE V,REMY + JSP A,(A) + FMPR U,SINB + FMPR V,SINA + FADR U,V + MOVEM U,SAVX + MOVE U,REMX + MOVE V,REMY + FMPR V,SINB + FMPR U,SINA + FSBR V,U + MOVE U,SAVX + MOVEM U,REMX + MOVEM V,REMY + FADR W,AOSZ + SOJG I,HELBK + POPJ P, + +NODEG: 13.5 +AOSZ: 13.0 + +REMX: 0 +REMY: 0 +SINA: 0 +SINB: 0 +NOLINS: 0 + + +TRNS: MOVEM A,INDX' + MOVSI C,-3 ;GET SIN ROL PCH YAW +RESIN: MOVE A,ROL(C) + PUSHJ P,SIND + MOVEM A,SINR(C) + AOBJN C,RESIN + + MOVSI C,-3 ;GET COS ROL PCH YAW +RECOS: MOVE A,ROL(C) + PUSHJ P,COSD + MOVEM A,COSR(C) + AOBJN C,RECOS + + MOVE A,COSY ;GET VECTOR EMC + FMPR A,COSP + MOVEM A,VEMC ;X COMPONENT + MOVE A,SINY + FMPR A,COSP + MOVEM A,VEMC+1 ;Y COMPONENT + MOVE A,SINP + MOVEM A,VEMC+2 ;Z COMPONENT + + SETOM FTRN' ;GET VMC AND VMPC + SETZM C +GETPRM: MOVE A,SINY + FMPR A,COSR + MOVE B,COSY + FMPR B,SINP + FMPR B,SINR + FSBR A,B + MOVEM A,VMC(C) ; X COMP + + MOVN A,COSY + FMPR A,COSR + MOVE B,SINY + FMPR B,SINP + FMPR B,SINR + FSBR A,B + MOVEM A,VMC+1(C) ; Y COMP + + MOVE A,COSP + FMPR A,SINR + MOVEM A,VMC+2(C) ; Z COMP + AOSE FTRN + POPJ P, + EXCH A,SINR + EXCH A,COSR + EXCH A,SINR + MOVNS COSR + MOVEI C,3 + JRST GETPRM + + +GETPE: JSP A,(A) + SETZM FPFLG' + PUSHJ P,GETXYT + MOVEM X,X1 + MOVEM Y,Y1 + JSP A,(A) + PUSHJ P,GETXYT + + SKIPN B,FPFLG + JRST WING + CAIN B,2 + JRST GETPE + SKIPGE D + EXCH X,X1 + SKIPGE D + EXCH Y,Y1 + FSBRM X,X1 ; X1 Y1 IS BAD PNT + FSBRM Y,Y1 + EXCH X,X1 + EXCH Y,Y1 + FSC X,33 + FSC Y,33 + EXCH X,X1 + EXCH Y,Y1 + FADRM X,X1 + FADRM Y,Y1 + +WING: MOVEM A,SAVA1 + PUSHJ P,DVEC + SKIPE DLIN + SETOM DOBJ + MOVE A,SAVA1 + JRST GETPE + +SAVA1: 0 +DOBJ: 0 + +GETXYT: MOVE B,U + FSBR B,XE + MOVEM B,VPE + FMPR B,VEMC + MOVE C,V + FSBR C,YE + MOVEM C,VPE+1 + FMPR C,VEMC+1 + FADR B,C + MOVE C,W + FSBR C,ZE + MOVEM C,VPE+2 + FMPR C,VEMC+2 + FADR B,C + MOVSI D,(-1.0) + JFCL 10,.+1 + FDVR D,B ; D CONTANES T + JFCL 10,MUNGD +FMUNG: SKIPGE D + AOS FPFLG + + MOVE B,VPE + FMPR B,VMC + MOVE C,VPE+1 + FMPR C,VMC+1 + FADR B,C + MOVE C,VPE+2 + FMPR C,VMC+2 + FADR B,C + MOVE X,D + FMPR X,B + FDVR X,SCALE ; X CONTANES 340 X + + MOVE B,VPE + FMPR B,VMPC + MOVE C,VPE+1 + FMPR C,VMPC+1 + FADR B,C + MOVE C,VPE+2 + FMPR C,VMPC+2 + FADR B,C + MOVE Y,D + FMPR Y,B + FDVR Y,SCALE ; Y CONTANES 340 Y + FADR X,[511.0] + FADR Y,[511.0] + POPJ P, + +MUNGD: ASH D,-12 + TLC D,300400 + JRST FMUNG + X1: 0 +Y1: 0 + +ROL: 0 +PCH: 0 +YAW: 0 + +XE: 0 +YE: 0 +ZE: 0 + +SINR: 0 +SINP: 0 +SINY: 0 + +COSR: 0 +COSP: 0 +COSY: 0 +VEMC: BLOCK 3 +VMC: BLOCK 3 ;VMC MUST FOLOW VMPC +VMPC: BLOCK 3 +VPE: BLOCK 3 +SCALE: 0.002 + DVEC: SETOM DLIN + SETZM ONEON' + JUMPL X,SECT + CAMLE X,[1023.0] + JRST SECT + JUMPL Y,SECT + CAMG Y,[1023.0] + SETOM ONEON +SECT: SKIPGE X1 + JRST NOTTWO + MOVE A,[1023.0] + CAMG A,X1 + JRST NOTTWO + SKIPGE Y1 + JRST NOTTWO + CAMG A,Y1 + JRST NOTTWO + SKIPL ONEON + JRST SECON +TWOON: PUSHJ P,XYFIX + EXCH X,X1 + EXCH Y,Y1 + PUSHJ P,XYFIX + +NEWDV: TRN TWOON1 + + MOVEI ZP%MD,PMD + MOVE Z%IN,UVIN + PUSHJ P,ZRM + MOVEI ZP%MD,VMD + MOVEI LP%IF,0 + PUSHJ P,PNT + MOVE A,X + MOVE B,Y +REVEC: MOVN X,A + MOVN Y,B + ADD X,X1 + ADD Y,Y1 + MOVM C,X + MOVM D,Y + CAILE C,177 + JRST TLONG + CAILE D,177 + JRST TLONG + MOVEI LC%ES,1 + MOVEI LP%IF,1 + JRST LIN + +TLONG: SETZM DOEX' + CAMLE C,D + SETOM DOEX + SKIPE DOEX + EXCH C,D + IMULI C,376 + IDIV C,D + AOS C + ASH C,-1 + MOVEI D,177 + SKIPE DOEX + EXCH C,D + SKIPGE X + MOVNS C + SKIPGE Y + MOVNS D + MOVE X,C + MOVE Y,D + MOVEI LC%ES,0 + MOVEI LP%IF,1 + PUSHJ P,LIN + ADD A,X + ADD B,Y + JRST REVEC + +SECON: MOVE C,X1 + MOVE D,Y1 + FSBR C,X + FSBR D,Y + MOVM ZP%MD,C + MOVM B,D + SUB ZP%MD,B + SETZM INVRT + MOVE A,X1 + MOVE B,Y1 + JUMPL ZP%MD,SECON1 + EXCH A,B + EXCH C,D + SETOM INVRT +SECON1: MOVEM A,XSAV + MOVEM B,YSAV + JRST SQZVEC + +NOTTWO: SKIPL ONEON + JRST NUNON + MOVE C,X + MOVE D,Y + FSBR C,X1 + FSBR D,Y1 + MOVM A,C + MOVM B,D + SETZM INVRT + CAMG B,A + SETOM INVRT + CAMG B,A + EXCH X,Y + CAMG B,A + EXCH D,C + MOVEM X,XSAV + MOVEM Y,YSAV + JRST SQZVEC + NUNON: MOVE A,X + MOVE B,Y + FSBR A,X1 + FSBR B,Y1 + MOVMS A + MOVMS B + SETZM INVRT' + CAMG B,A + SETOM INVRT + SKIPE INVRT + EXCH X,Y + SKIPN INVRT + JRST .+4 + EXCH A,X1 + EXCH A,Y1 + EXCH A,X1 + + MOVEI A,0 + PUSHJ P,GETX + SKIPL B + JRST FLGMIN + MOVE A,[1023.0] + PUSHJ P,GETX + JUMPL B,DVLOS + +FLGMAX: MOVE C,A + MOVE D,[1023.0] + MOVEM C,XSAV' + MOVEM D,YSAV' + CAMG Y,Y1 + FSBR C,X + CAMG Y,Y1 + FSBR D,Y + CAMLE Y,Y1 + FSBR C,X1 + CAMLE Y,Y1 + FSBR D,Y1 + JRST SPOUT + +FLGMIN: MOVE C,A + SETZM D + MOVEM C,XSAV + MOVEM D,YSAV + CAML Y,Y1 + FSBR C,X + CAML Y,Y1 + FSBR D,Y + CAMGE Y,Y1 + FSBR C,X1 + CAMGE Y,Y1 + FSBR D,Y1 +SPOUT: SKIPN INVRT + JRST SQZVEC + EXCH X,Y + EXCH A,X1 + EXCH A,Y1 + EXCH A,X1 + +SQZVEC: MOVM A,D + FDVR A,[-126.99] + FDVR C,A + FDVR D,A + + SKIPE INVRT + EXCH C,D + MOVE X,XSAV + MOVE Y,YSAV + SKIPE INVRT + EXCH X,Y + PUSHJ P,XYFIX + MOVEI ZP%MD,PMD + MOVE Z%IN,UVIN + PUSHJ P,ZRM + MOVEI ZP%MD,VCMD + MOVEI LP%IF,0 + PUSHJ P,PNT + MOVE X,C + MOVE Y,D + PUSHJ P,XYFIX + MOVEI LC%ES,1 + MOVEI LP%IF,1 + JRST LIN + +GETX: MOVE B,Y1 + FSBR A,Y + FSBR B,Y + FDVR A,B + SKIPGE A + JRST SPLOS + CAML A,[1.0] + JRST SPLOS + MOVE B,[1.0] + FSBR B,A + FMPR B,X + FMPR A,X1 + FADR A,B + SKIPGE A + JRST SPLOS + CAMLE A,[1023.0] + JRST SPLOS + SETZM B + POPJ P, + +SPLOS: SETOM B + POPJ P, + +DVLOS: SETZM DLIN + POPJ P, + +DLIN: 0 +UVIN: 7 + +TWOON1: MOVEI A,020150 ;GO IN TO POINT MODE SCALE 2 INT 7 + IDPB A,BP + SUB X,X1 + SUB Y,Y1 + ASH X,-1 + ASH Y,-1 + ADDM X,X1 + ADDM Y,Y1 + MOVMS X + MOVMS Y + MOVEI A,200000 + DPB X,[000700,,A] + DPB Y,[100700,,A] + MOVE X,X1 + MOVE Y,Y1 + TRO X,102000 + TRO Y,220000 + IDPB Y,BP + IDPB X,BP + IDPB A,BP + TRC A,500200 + IDPB A,BP + POPJ P, + + +MAIRP: MOVE A,ALRTIP + MOVEM A,ROL + + MOVE A,CMPS + PUSHJ P,FLT + FMPR A,[0.0879] + MOVEM A,YAW + + MOVE A,EVLI + PUSHJ P,FLT + FMPR A,[0.0219] + FSBR A,[45.0] + MOVEM A,PCH + + MOVE A,WAIS + PUSHJ P,FLT + MOVE B,A + MOVE A,YAW + PUSHJ P,COSD + FMPR A,B + FMPR A,BUGMV + FADRM A,XE + MOVE A,YAW + + PUSHJ P,SIND + FMPR A,B + FMPR A,BUGMV + FADRM A,YE + + MOVE A,ALTUD + PUSHJ P,FLT + FMPR A,[0.244] + MOVEM A,ZE + + POPJ P, + +BUGMV: -0.003 + DSTART: PUSH P,A + PUSH P,B + MOVE B,WCHBP + MOVEI A,DSL1-1 + TRNE B,1 + MOVEI A,DSL2-1 + MOVEM A,DSLP' + SETZM DSTOPD + CAME A,WUTDIS + TRN .-1 + POP P,B + POP P,A +CPOPJ: POPJ P, + +DSTOP: SETOM DSTOPD' + CONO DIS,100 + POPJ P, + +DISIN: 0 + CONSO DIS,7 + JRST RELOD + CONSO DIS,400 ;2400 PIT PEN DEBUG FETCH + JRST APLG + + SKIPE DZON + JRST RELOD + + AOSG TICK + JRST RELOD + CONO DIS,0 + JRST 12,@DISIN + +APLG: CONO DIS,15200+SDISCH_3+DISCH + JRST 12,@DISIN + +RELOD: MOVEM A,DSAVA + + SKIPL DZON + JRST NORMD + SETCMM ZOST + MOVEI A,DSL0-1 + SKIPE ZOST + +NORMD: MOVE A,DSLP + MOVEM A,BLKOP' + MOVEM A,WUTDIS' + CONO DIS,100+SDISCH_3+DISCH + MOVE A,DSAVA + JRST 12,@DISIN + +SWBP: PUSH P,A + PUSH P,X + PUSH P,Y + AOS A,WCHBP' + MOVE X,[442200,,DSL1] + MOVE Y,[442200,,DSL2] + MOVEM X,BP' + TRNE A,1 + MOVEM Y,BP + POP P,Y + POP P,X + POP P,A + POPJ P, + + +TICK: 0 +ZOST: 0 +DSAVA: 0 + +OVER: PUSH P,A ; OVER SKIPS WHEN DISL IS FULL + PUSH P,B + MOVE A,WCHBP + MOVEI B,DSL1 + TRNE A,1 + MOVEI B,DSL2 + HRRZ A,BP + SUB A,B + CAIL A,MVDS-20 + AOS -2(P) + POP P,B + POP P,A + POPJ P, + ;FLOATING POINT SINE AND COSINE. +;ANS IN A,B; COSQ GIVES COS OF LAST SIN ARG, -SIN OF LAST COS +SIND: FMPR A,[.01745329251994] ;PI/180 + JRST SIN + +COSD: FMPR A,[.01745329251994] +COS: FADR A,[1.5707963267] ;PI/2 +SIN: CAMG A,[164475536723] ;.00015148419(SAVES A CONSTANT. COULD USE .000211431983) + CAMGE A,[-.0001] ;SMALLNESS OF ABS X PERMITS SIN X _ X + JRST .+2 + POPJ P, ;AND THREATENS UNDERFLOW + PUSH P,B + FDVR A,[1.5707963267] ;PI/2 + MOVEM A,SINTM' + MULI A,400 + TSC A,A ;CAML A,...SETZB B,SINTM WOULD PREVENT HUGE ANSWER FOR ARG > 2**27 + ASH B,-243(A) + DPB B,[10100,,SINOB] + MOVNS A,B + ANDCMI A,1 + TLC A,232000 + FAD A,A + FADRB A,SINTM +SINQ: TRNN B,2 +SINR1: SKIPA B,SINTM + MOVNS B,SINTM + FMPR B,[164475536723] ;.00015148419 + FMP A,A + FADR A,[574377353254] ;-4.0084431 + FMPR B,A + FADR A,[574142162777] ;-6.4652405 + FMPR B,A + FADR A,[202444705313] ;2.2881683 + FMPR A,A + FADR A,[210547761702] ;179.98621 + FMPRB A,B + POP P,B + POPJ P, + +COSQ: MOVSI A,(1.0) + SKIPL SINTM + MOVNS A + FADRB A,SINTM +SINOB: SETCMI B,. + JRST SINQ + + +;FLOATING POINT SQUARE ROOT FUNCTION + +SQRT: MOVEM B,BSAV1 + MOVMS A + JUMPLE A,SQ2 + ASHC A,-33 + SUBI A,201 + ROT A,-1 + HRRM A,SQ1 + LSH A,-43 + ASH B,-10 + FSC B,177(A) + MOVEM B,ST + FMP B,S1(A) + FAD B,S2(A) + MOVE A,ST + FDV A,B + FAD B,A + FSC B,-1 + MOVE A,ST + FDV A,B + FADR A,B +SQ1: FSC A,0 +SQ2: MOVE B,BSAV1 + POPJ P, + +S1: 0.8125 + 0.578125 +S2: 0.302734 + 0.421875 + +ST: 0 +BSAV1: 0 + +;FLOATING POINT ARCTANGENT, VERSION 1 + +ATAN: MOVEM B,BSAV + MOVM B,A + CAMG B,A1 + JRST ATANX + MOVEM A,C2 + CAML B,A2 + JRST AT4 + MOVEM C,C1 + MOVSI C,201400 + SETZM I1 + CAMG B,C + AOSA I1 + FDVM C, B + MOVEM B,C3 + FMP B, B + MOVE C,KB3 + FAD C, B + MOVE A,KA3 + FDVM A,C + FAD C, B + FAD C,KB2 + MOVE A,KA2 + FDVM A,C + FAD C,B + FAD C,KB1 + MOVE A,KA1 + FDV A,C + FADR A,KB0 + FMPR A,C3 + MOVE B,A3 + SKIPN I1 + FSBRM B,A + SKIPA C,C1 +AT4: MOVE A,A3 + SKIPGE C2 + MOVNS A +ATANX: MOVE B,BSAV + POPJ P, + +A1: 145000000000 +A2: 233000000000 +A3: 201622077325 +KB0: 0.1746554388 +KB1: 6.762139240 +KB2: 3.316335425 +KB3: 1.448631538 +KA1: 3.709256262 +KA2: -7.106760045 +KA3: -0.2647686202 + + + +C1: 0 +C2: 0 +C3: 0 +I1: 0 +BSAV: 0 + + +TTYBK: 0 + PUSH P,A + PUSH P,B + + CONSZ TTY,10 + JRST TYOINT + CONSZ TTY,40 + JRST TYIINT + JRST 4,0 + +TYIINT: DATAI TTY,A + ANDI A,177 +TBACK: MOVE B,COUNT + CAIL B,SISET + JRST .+2 + PUSHJ P,TYO + MOVEM A,TYI + XCT TTAB(A) + JRST OUT1 + +TYOINT: SKIPLE COUNT + JRST .+4 + CONO TTY,200+TTCH + SETOM TTYOFF' + JRST OUT1 + MOVE A,OTPNTR + DATAO TTY,TTYTAB(A) + SOS COUNT + SOSL OTPNTR + JRST OUT1 + MOVEI A,SISET-1 + MOVEM A,OTPNTR + +OUT1: POP P,B + POP P,A + JRST 12,TTYBK@ + + + +TYO: PUSH P,B + MOVE B,COUNT + CAIL B,SISET + JRST .-2 + MOVE B,INPNTR + MOVEM A,TTYTAB(B) + AOS COUNT + SOSL INPNTR + JRST OUT + MOVEI B,SISET-1 + MOVEM B,INPNTR + +OUT: AOSN TTYOFF + CONO TTY,10+TTCH + POP P,B + POPJ P, + + +TTYW: SKIPL TTYOFF + JRST .-1 + POPJ P, + +TYI: 0 + + +CLOCK: 0 + PUSH P,A + PUSH P,B + PUSH P,C + CONSZ 200000 + JRST PIDLOV +AOST: CONSO 1000 + JRST SOMLOS + AOS TIME + SKIPE TRACE + AOS TIME1' + CONO 001000+CLCH + + MOVE A,[-3,,150] +XPT1: DATAO IMX,A + CONO IMX,0 + CONSO IMX,10 + JRST .-1 + DATAI IMX,B + ASH B,1 + TLC B,232000 + FAD B,B + MOVEM B,MXTB3-150(A) + AOBJN A,XPT1 + + MOVEI A,171 +XPT2: DATAO IMX,A + CONO IMX,0 + CONSO IMX,10 + JRST .-1 + DATAI IMX,A + ASH A,1 + PUSHJ P,FLT + MOVEM A,MXTB3+3 + MOVE A,[-8,,70] +XINPUT: DATAO IMX,A + CONO IMX,0 + CONSO IMX,10 + JRST .-1 + DATAI IMX,B + ASH B,1 + MOVEM B,MXTB-70(A) + AOBJN A,XINPUT + + TMOUT: SKIPN TRACE + JRST TMOUT1 + JFCL + SETZM NOCAL' + MOVSI B,-20 +RECNT: MOVE A,PTAB(B) + AND A,[777000,,0] + CAME A,[TRN 0] + AOS NOCAL + AOBJN B,RECNT + MOVE B,NOCAL + EXCH B,LNOCAL' + SKIPG NOCAL + PUSHJ P,PT1 + CAMN B,NOCAL + JRST SAMEN + SETOM ONCE + SETOM ONCE1 + +SAMEN: SKIPL ONCE + JRST NORM + MOVEI B,1770 + IDIV B,MULBG + MOVN B,B + HRLZ B,B + PUSHJ P,PROUT + AOBJN B,.-1 + JRST TMOUT1 + +NORM: PUSHJ P,PROUT + + +TMOUT1: SKIPGE DSTOPD + JRST RELOUT + + SETOM TICK + CONSO DIS,7 + CONO PI,4000+200_- + +RELOUT: POP P,C + POP P,B + POP P,A + JRST 12,@CLOCK + +PROUT: PUSH P,B + MOVSI C,-20 +REPR: XCT PTAB(C) + MOVE B,PTAB(C) + AND B,[777000,,0] + CAME B,[TRN 0] + PUSHJ P,PT1 + AOBJN C,REPR + POP P,B + POPJ P, + + +PIDLOV: CONO 400000 + PRNT [ASCII /PDL OVER FLOW +/] + JRST 10,.+1 + PUSHJ P,TTYW + JRST DDT + +SOMLOS: CONI A + CONO 0 + PRNT [ASCII /NON X MEM OR SOME LOSS CONI A +/] + JRST 10,.+1 + PUSHJ P,TTYW + JRST DDT + + +PT3: PUSHJ P,.+1 +PT2: PUSHJ P,.+1 +PT1: PUSH P,X + PUSH P,Y + SAC + AOSN ONCE + SETZM NOPTSS + SKIPN NOPTSS + PUSHJ P,SETUP + MOVE X,TIME1 + IMUL X,MULBG + ANDI X,1777 + MOVE Y,A + ASH Y,-4 + ADDI Y,1000 + MOVEI ZP%MD,PMD + MOVEI LP%IF,1 + PUSHJ P,PNT + AOS X,NOPTSS' +NPBUG: MOVEI Y,1770 + IDIV Y,MULBG + IMUL Y,NOCAL + CAML X,Y + PUSHJ P,ZEROL + UAC + POP P,Y + POP P,X + POPJ P, + +SETUP: SKIPE NOPTSS + POPJ P, + SKIPN ONCE + PUSHJ P,DSTOP + SETZM WCHBP + PUSHJ P,SWBP + MOVEI ZP%MD,PMD + MOVEI Z%IN,3 + PUSHJ P,ZRM + POPJ P, + +ZEROL: SETZM NOPTSS + MOVEI ZP%MD,ZMD + MOVEI LP%IF,0 + PUSHJ P,PNT + MOVEI X,3000 + IDPB X,BP + AOSE ONCE1 + POPJ P, + MOVEI X,DSL2-1 + MOVEM X,DSLP + SETZM DSTOPD + POPJ P, + POPJ P, + +MULBG: 3 + +IMXBK1: 0 + CONSO IMX,10 + JRST .-1 +; MOVEM A,IMXPTR + MOVEI A,100 + SOJG A,. + SETZM A + LDB A,[301400,,MXTB1+0] + MOVEM A,MXTB+0 + LDB A,[141400,,MXTB1+0] + MOVEM A,MXTB+1 + LDB A,[001400,,MXTB1+0] + MOVEM A,MXTB+2 + LDB A,[301400,,MXTB1+1] + MOVEM A,MXTB+3 + LDB A,[141400,MXTB1+1] + MOVEM A,MXTB+4 + LDB A,[001400,,MXTB1+1] + MOVEM A,MXTB+5 + LDB A,[301400,,MXTB1+2] + MOVEM A,MXTB+6 + LDB A,[141400,,MXTB1+2] + MOVEM A,MXTB+7 + MOVE A,[-8,,MXTB1-1] +; EXCH A,IMXPTR +; CONO IMX,37760+IMXCH + JRST 12,@IMXBK + + +IMXBK: 0 +; BLKI IMX,IMXPTR + JRST REIMX + JRST 12,@IMXBK +REIMX: MOVEM A,ISAVA + MOVE A,[-8,,MXTB-1] +; MOVEM A,IMXPTR + CONO IMX,12040 + MOVE A,ISAVA + JRST 12,@IMXBK +DCBK: 0 +; MOVEM A,MXTBP + AOS A,WDC' + TRNE A,1 + JRST DCBK1 + MOVE A,[-8,,MXTB-1] +; EXCH A,MXTBP + CONO 764,21140 +; CONO DC,4160+DCCH + JRST 12,@DCBK + +DCBK1: JRST 12,@DCBK +MXTB1: BLOCK 8 +ISAVA: 0 + +UUOH: 0 + PUSH P,A + PUSH P,40 + PUSH P,UUOH + LDB A,[330500,,40] + XCT UUOTAB(A) + POP P,UUOH + POP P,40 + POP P,A + JRST @UUOH + + +GETNO: MOVE A,NO + SETZM NO + POPJ P, + +;UUO RUTEENS + + +PRINT: MOVSI A,440700 + HRR A,40 + MOVEM A,ULDBP' +PBACK: MOVE A,COUNT + CAIL A,SISET + POPJ P, + ILDB A,ULDBP + CAIN A," + POPJ P, + PUSHJ P,TYO + JRST PBACK + +SACR: EXCH 12,SAV11' + EXCH 13,SAV12' + EXCH 14,SAV13' + EXCH 15,SAV14' + EXCH 16,SAV15' + EXCH 17,SAV16' + POPJ P, + +UACR: EXCH 12,SAV13' + EXCH 13,SAV12' + EXCH 14,SAV13' + EXCH 15,SAV14' + EXCH 16,SAV15' + EXCH 17,SAV16' + POPJ P, + + +WATER: POPJ P, ;UNUSED UUO +VARUT: POPJ P, ;UNUSED UUO + +NVWAT: HRRZ A,40 + CAML A,NVBUG + JRST NVWAT + POPJ P, + +NVBUG: 30 + +;TTY RUTEENS + +NUMBER: MOVE B,NO' + LSH B,3 + ADDI B,-60(A) + MOVEM B,NO' + POPJ P, + +IDL1: MOVE P,[-PDS,,PDL-1] + JRST 10,IDL + +FLSHIO: CONO DIS,100 + CONO IMX,0 + DATAO 20,[-1] + POPJ P, + +GODDT: POP P,B + POP P,A + CONO PI,400 + JRST DDT + +PR: CONO TTY,200+TTCH + SETOM TTYOFF + CONO PI,200 + JRST 12,@TTYBK + RODE==50000.0 +VCSIS==400 + +XTAB: 1000.0 ; PYRIMID (8 LINES) + 1064.0 + RODE + 1000.0 + 1000.0 + 1064.0 + 1064.0 + 1000.0 + + 100.0 ; RUN WAY (13 LINES) + 100.0 + 100.0 + 0 + 0 +; 0 + 50.0 + 37.5 + 62.5 + 25.0 + 50.0 + 75.0 + 100.0 + 100.0 + + 100.0 ; GLIDE SLOPE (1 LINES> + + -1000000.0 ;HORIZON (4 LINES) + +1000000.0 + +1000000.0 + -1000000.0 + + 500000.0 ;MOUNTINS + 250000.0 + 500000.0 + 250000.0 + BLOCK VCSIS + +YTAB: 00.0 ; PIRMID + -RODE + 64.0 + RODE + 00.0 + 00.0 + 64.0 + 64.0 + + -1700.0 ; RUNWAY + -1700.0 + -1200.0 + -50.0 + -450.0 +; -850.0 + -800.0 + -925.0 + -925.0 + -1050.0 + -1050.0 + -1050.0 + -1700.0 + -1500.0 + + 0 ; GLIDE SLOPE + + -1000000.0 ; HORIZON + -1000000.0 + +1000000.0 + +1000000.0 + + 1000000.0 ;MOUNTINS + 1000000.0 + -1000000.0 + -1000000.0 + + BLOCK VCSIS + +ZTAB: REPEAT 10,0 ; PIRMID + REPEAT 15,0 ; RUN WAY + -200.0 ; GLIDE SLOPE + REPEAT 4,0 ;HORIZON + REPEAT 4,0 ;MOUNTAINS + + BLOCK VCSIS + +XTAB1: RODE ; PIRMID + 1064.0 + 1000.0 + 1000.0 + 1032.0 + 1032.0 + 1032.0 + 1032.0 + + 100.0 ;RUN WAY + -100.0 + -100.0 + 0 + 0 +; 0 + 50.0 + 37.5 + 62.5 + 25.0 + 50.0 + 75.0 + 0 + 0 + + -100.0 ; GLIDE SLOPE + + +1000000.0 ; HORIZON + +1000000.0 + -1000000.0 + -1000000.0 + + 375000.0 ;MOUNTINS + 375000.0 + 375000.0 + 375000.0 + + BLOCK VCSIS + +YTAB1: 00.0 ; PIRIMID + RODE + 64.0 + -RODE + 32.0 + 32.0 + 32.0 + 32.0 + + 1700.0 ; RUN WAY + -1700.0 + -1200.0 + -350.0 + -750.0 +; -1150.0 + -900.0 + -1025.0 + -1025.0 + -1150.0 + -1150.0 + -1150.0 + -1500.0 + -1300.0 + + 0 ; GLIDE SLOPE + + -1000000.0 ; HORIZON + +1000000.0 + +1000000.0 + -1000000.0 + + 1000000.0 ;MOUNTINS + 1000000.0 + -1000000.0 + -1000000.0 + + BLOCK VCSIS + +ZTAB1: 00.0 ; PIRIMED + 00.0 + 00.0 + 00.0 + 45.0 + 45.0 + 45.0 + 45.0 + + + REPEAT 15,0 ; RUN WAY + + -200.0 ; GLIDE SLOPE + + REPEAT 4,0 ; HORIZON + + 50000.0 ;MOUNTINS + 50000.0 + 30000.0 + 30000.0 + + BLOCK VCSIS + + IFN FOOF,[ +BARIND==200 + +ZZ==. + DEFINE LINE1 X0,Y0,Z0,X1,Y1,Z1 + LOC XTAB+BARIND + X0 + LOC YTAB+BARIND + Y0 + LOC ZTAB+BARIND + Z0 + LOC XTAB1+BARIND + X1 + LOC YTAB1+BARIND + Y1 + LOC ZTAB1+BARIND + Z1 +BARIND==BARIND+1 + TERMIN + + DEFINE HBAR LN,LD,RD,XO,YO,XT,YT + LINE1 \,\,0.0,\,\<.OP FADR YO <.OP FMPR YT LN>>,0.0 + LINE1 \,\<.OP FADR YO <.OP FMPR YT LN>>,0.0,\<.OP FSBR XO <.OP FMPR 5.0 XT>>,\<.OP FADR YO <.OP FMPR YT <.OP FADR LN RD>>>,7.0 + LINE1 \<.OP FSBR XO <.OP FMPR 5.0 XT>>,\<.OP FADR YO <.OP FMPR YT <.OP FADR LN RD>>>,7.0,\<.OP FSBR XO <.OP FMPR 10.0 XT>>,\<.OP FADR YO <.OP FMPR LN YT>>,0.0 + LINE1 \<.OP FSBR XO <.OP FMPR 10.0 XT>>,\<.OP FADR YO <.OP FMPR LN YT>>,0.0,\,\<.OP FADR YO <.OP FMPR YT LN>>,0.0 + LINE1 \<.OP FSBR XO <.OP FMPR 5.0 XT>>,\<.OP FADR YO <.OP FMPR YT <.OP FADR LN RD>>>,7.0,\<.OP FSBR XO <.OP FMPR 5.0 XT>>,\<.OP FADR YO <.OP FMPR YT LD>>,7.0 + LINE1 \<.OP FSBR XO <.OP FMPR 5.0 XT>>,\<.OP FADR YO <.OP FMPR YT LD>>,7.0,\,\,0.0 + LINE1 \,\,0.0,\<.OP FSBR XO <.OP FMPR 10.0 XT>>,\,0.0 + LINE1 \<.OP FSBR XO <.OP FMPR 10.0 XT>>,\,0.0,\<.OP FSBR XO <.OP FMPR 5.0 XT>>,\<.OP FADR YO <.OP FMPR LD YT>>,7.0 + LINE1 \<.OP FSBR XO <.OP FMPR 10.0 XT>>,\,0.0,\<.OP FSBR XO <.OP FMPR 10.0 XT>>,\<.OP FADR YO <.OP FMPR LN YT>>,0.0 + TERMIN + + DEFINE VBAR LN,LD,RD,XO,YO,XT,YT + LINE1 \,\,0.0,\<.OP FADR XO <.OP FMPR XT LN>>,\,0.0 + LINE1 \<.OP FADR XO <.OP FMPR XT LN>>,\,0.0,\<.OP FADR XO <.OP FMPR XT <.OP FADR LN RD>>>,\<.OP FSBR YO <.OP FMPR 5.0 YT>>,7.0 + LINE1 \<.OP FADR XO <.OP FMPR XT <.OP FADR LN RD>>>,\<.OP FSBR YO <.OP FMPR 5.0 YT>>,7.0,\<.OP FADR XO <.OP FMPR LN XT>>,\<.OP FSBR YO <.OP FMPR 10.0 YT>>,0.0 + LINE1 \<.OP FADR XO <.OP FMPR LN XT>>,\<.OP FSBR YO <.OP FMPR 10.0 YT>>,0.0,\<.OP FADR XO <.OP FMPR XT LN>>,\,0.0 + LINE1 \<.OP FADR XO <.OP FMPR XT <.OP FADR LN RD>>>,\<.OP FSBR YO <.OP FMPR 5.0 YT>>,7.0,\<.OP FADR XO <.OP FMPR XT LD>>,\<.OP FSBR YO <.OP FMPR 5.0 YT>>,7.0 + LINE1 \<.OP FADR XO <.OP FMPR XT LD>>,\<.OP FSBR YO <.OP FMPR 5.0 YT>>,7.0,\,\,0.0 + LINE1 \,\,0.0,\,\<.OP FSBR YO <.OP FMPR 10.0 YT>>,0.0 + LINE1 \,\<.OP FSBR YO <.OP FMPR 10.0 YT>>,0.0,\<.OP FADR XO <.OP FMPR LD XT>>,\<.OP FSBR YO <.OP FMPR 5.0 YT>>,7.0 + LINE1 \,\<.OP FSBR YO <.OP FMPR 10.0 YT>>,0.0,\<.OP FADR XO <.OP FMPR LN XT>>,\<.OP FSBR YO <.OP FMPR 10.0 YT>>,0.0 + TERMIN + + VBAR 100.0,5.0,-5.0,0.0,0.0,1.0,-1.0 + HBAR 60.0,-5.0,-5.0,100.0,10.0,1.0,1.0 + HBAR 40.0,-5.0,-5.0,55.0,10.0,1.0,1.0 + + VBAR 80.0,-5.0,5.0,10.0,100.0,1.0,-1.0 + HBAR 70.0,5.0,-5.0,100.0,100.0,1.0,1.0 + VBAR 80.0,-5.0,5.0,90.0,170.0,-1.0,1.0 + HBAR 70.0,5.0,-5.0,0.0,170.0,-1.0,-1.0 + + VBAR 80.0,-5.0,5.0,10.0,200.0,1.0,-1.0 + HBAR 70.0,5.0,-5.0,100.0,200.0,1.0,1.0 + VBAR 80.0,-5.0,5.0,90.0,270.0,-1.0,1.0 + HBAR 70.0,5.0,-5.0,0.0,270.0,-1.0,-1.0 + +LOC ZZ +] + TTYTAB: BLOCK SISET +INPNTR: SISET-1 +OTPNTR: SISET-1 +SENSD: -1 +PAT: BLOCK 100 +UUOTAB: REPEAT 40,JRST 4,1 +TTAB: REPEAT 200,JFCL + MXTB2+5 + +XTAB2: BLOCK 20 +YTAB2: BLOCK 20 +XTAB3: BLOCK 20 +YTAB3: BLOCK 20 + + +PTAB: REPEAT 20,TRN + JRST 4,. + +ZZ==. + + LOC PTAB + REPEAT 4,MOVE A,MXTB+.RPCNT +LOC ZZ +MXTB3: BLOCK 5 +MXTB: BLOCK 12 +MXTB2: BLOCK 8 + +MXTB2P: MXTB2+3 + MXTB2+7 + MXTB2+6 + MXTB2+0 + MXTB2+1 + MXTB2+2 + +MXTB2Q: MXTB2+4 + +; UUOS + +ZZ==. + + + LOC UUOTAB+PRNT_<-33> + PUSHJ P,PRINT + + LOC UUOTAB+SAC_<-33> + PUSHJ P,SACR + + LOC UUOTAB+UAC_<-33> + PUSHJ P,UACR + + LOC UUOTAB+WATE_<-33> + PUSHJ P,WATER ;UNUSED UUO + + LOC UUOTAB+VAAX_<-33> + PUSHJ P,VARUT ;UNUSED UUO + + LOC ZZ + + +; TTY COMANDS + +ZZ==. + + + LOC TTAB+"C ;SENS OF DISP + SETCMM DZON + + LOC TTAB+"D ;GO TO DDT + JRST GODDT + + LOC TTAB+"F ; GO FLY + JRST 10,TEST1 + + LOC TTAB+"I ;JRST TO GO + JRST 10,GO + + LOC TTAB+11 ;^I JRST IDL + PUSHJ P,IDL1 + + LOC TTAB+"L ;FLUSH ALL I/O + PUSHJ P,FLSHIO + + LOC TTAB+"P + JRST 10,CPOTS ; CALABRATE POTS + + LOC TTAB+"T + JRST 10,TEST + + + LOC TTAB+"X ;TRACE SCOPE + SETCMM TRACE + + + LOC TTAB+"Z ;SETZM NUMBER BUFF + PUSHJ P,GETNO + + LOC TTAB+"0 ;INPUT NUMBERS INTO BUFF + REPEAT 10,PUSHJ P,NUMBER + + LOC ZZ + + + +; JRST 4 ERRORS + + +;TTY SPAZZ JRST 4,0 + +;UUOH SPAZZ JRST 4,1 + + SETUPF: SETOM FIRST' + SETOM FIRST1' + SETZM BSTOL' + SETZM ALRTIP' + SETZM CMPS' + MOVEI A,7 + MOVEM A,CHIN1' + SETOM A + PUSHJ P,DRINS + POPJ P, + +FLY1: MOVE A,MXTB3+3 + FSBR A,MINP+3 + FMPR A,DIFP+3 + FSBR A,TOPS + MOVN A,A + PUSHJ P,FIX + MOVEM A,THRI + + MOVE A,MXTB3+1 + FSBR A,MINP+1 + FMPR A,DIFP+1 + FSBR A,TOPS + MOVN A,A + PUSHJ P,FIX + MOVEM A,EVLI1 + PUSHJ P,ISSTL + + MOVE A,MXTB3+2 + FSBR A,MINP+2 + FMPR A,DIFP+2 + JFCL + JFCL + PUSHJ P,FIX + MOVEM A,ALRI + + MOVE A,MXTB3 + FSBR A,MINP + FMPR A,DIFP + JFCL + JFCL + PUSHJ P,FIX + MOVEM A,RUDI1 + + POPJ P, + +CPOTS: MOVE P,[-PDS,,PDL-1] + PUSHJ P,RSTAB + MOVSI B,-4 +REPT: MOVE A,MXTB3(B) + CAMGE A,MINP(B) + MOVEM A,MINP(B) + CAMLE A,MAXP(B) + MOVEM A,MAXP(B) + MOVE A,MAXP(B) + FSBR A,MINP(B) + MOVE C,TOPS + FDVR C,A + MOVEM C,DIFP(B) + AOBJN B,REPT + JRST REPT-1 + +MAXP: 3438.0 + 4072.0 + 1316.0 + 3676.0 + +MINP: 2322.0 + 196.0 + 676.0 + 2722.0 + +DIFP: 3.6693548 + 1.0565015 + 6.3984375 + 4.2924528 +î + RSTAB: MOVSI A,-4 + MOVE B,TOPS + SETZM MAXP(A) + MOVEM B,MINP(A) + AOBJN A,.-2 + POPJ P, + +EVLI1: 3777 +RUDI1: 0 +TOPS: 4095.0 +STL1: 2000 +STL2: 777 +LTFOO: 0 + +ISSTL: MOVEI A,3777 + MOVE B,WAIS + CAMG B,STL1 + MOVEM A,EVLI1 + MOVE B,EVLI + CAMGE B,STL2 + MOVEM A,EVLI1 + MOVE A,TIME + ADDI A,60. + MOVEM A,LTFOO + POPJ P, + FLY: TRN FLY1 + MOVE A,MXTB + MOVEM A,THRI' + MOVEI A,3777 + MOVEM A,RUDI1 + MOVNI B,100 + MOVN C,B + DATAI 420,A + TLNN A,100000 + ADDM B,EVLI1 + TLNN A,40000 + ADDM C,EVLI1 + MOVEI B,3777 + TLNN A,400000 + MOVEI B,3777+2000 + TLNN A,200000 + MOVEI B,3777-2000 + MOVEM B,ALRI' + SKIPGE EVLI1 + SETZM EVLI1 + MOVEI A,7777 + CAMGE A,EVLI1 + MOVEM A,EVLI1 + POPJ P, + + +INIMX: PUSH P,B + HLRZ B,A + HRRZ A,A + DATAO IMX,A + CONO IMX,0 + CONSO IMX,10 + JRST .-1 + DATAI IMX,A + ASH A,(B) + POP P,B + POPJ P, + +THRICH: 0,,15 +RUDICH: 2,,150 +EVLICH: 3,,151 +ALRICH: 2,,152 +EVLI: 0 +RUDI: 0 + +INIT: MOVE A,RUDICH + PUSHJ P,INIMX + MOVEI B,3777 + SUB B,A + MOVEM B,RUDIBG' + + MOVE A,EVLICH + PUSHJ P,INIMX + MOVEI B,3777 + SUB B,A + MOVEM B,EVLIBG' + + MOVE A,ALRICH + PUSHJ P,INIMX + MOVEI B,3777 + SUB B,A + MOVEM B,ALRIBG' + + POPJ P, + +DRINS: PUSH P,A + PUSH P,X + PUSH P,Y + PUSH P,R + MOVE A,[442200,,DSL0] + MOVEM A,BP' + PUSHJ P,DTIC + PUSHJ P,DCOM + TRN P,DADF + PUSHJ P,DAIS + PUSHJ P,DART + PUSHJ P,DALT + PUSHJ P,DRPM + PUSHJ P,DTBK + PUSHJ P,DRAT +; PUSHJ P,DIPS + + MOVEI A,3000 + IDPB A,BP + SETOM DZON' + + POP P,R + POP P,Y + POP P,X + POP P,A + POPJ P, + + +MVINS: MOVE A,TIME + PUSHJ P,FLT + EXCH A,LTIME + FSBR A,LTIME + FMPR A,[-0.1] + MOVEM A,ETIME + + MOVE A,MXTB + MOVEI B,0 + CAIL A,3777 + SETOM B + SKIPE AUTO + PUSHJ P,AINS + MOVEM B,DZON + HRRZ B,BOTOM + SETZM GRND + CAMN B,ALTUD + SETOM GRND + PUSHJ P,MRPM + PUSHJ P,MART + PUSHJ P,MAIS + PUSHJ P,MRAT + PUSHJ P,MALT + PUSHJ P,MTBK + PUSHJ P,MCOM + PUSHJ P,MTIC +; PUSHJ P,MIPS + POPJ P, + + +ETIME: 0 +LTIME: 0 +GRND: 0 +AUTO: -1 +DHITE: 3000 + +AINS: MOVE A,ALTUD + CAMG A,DHITE + SETZB B + CAML A,DHITE + SETOM B + POPJ P, + +DGLS: MOVEI A,SIXTH*1 + MOVEM A,XOFS + MOVEI A,SIXTH*5 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[10.0] + PUSHJ P,RING + MOVEI A,071423 + PUSHJ P,DNAM + POPJ P, + +DIN: 4 + +DTIC: MOVEI A,SIXTH*1 + MOVEM A,XOFS + MOVEI A,SIXTH*5 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[0.1] + PUSHJ P,RING + MOVE R,[0.2] + PUSHJ P,RING + MOVE R,[0.3] + PUSHJ P,RING + MOVE R,[10.0] + PUSHJ P,RING + MOVEI A,241103 + PUSHJ P,DNAM + MOVEI A,TCLC + MOVEI B,60. + MOVEI C,4 + MOVE X,[0.0] + MOVE Y,[360.0] + SETOM 360DG' + PUSHJ P,LINS + POPJ P, + +DCOM: MOVEI A,SIXTH*3 + MOVEM A,XOFS + MOVEI A,SIXTH*5 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[0.1] + PUSHJ P,RING + MOVE R,[0.2] + PUSHJ P,RING + MOVE R,[0.3] + PUSHJ P,RING + MOVE R,[10.0] + PUSHJ P,RING + MOVEI A,040722 + PUSHJ P,DNAM +DCOM1: MOVEI A,TCOM + MOVEI B,36. + MOVEI C,2 + MOVE X,[0.0] + MOVE Y,[360.0] + SETOM 360DG' + PUSHJ P,LINS + POPJ P, + +DADF: MOVEI A,SIXTH*5 + MOVEM A,XOFS + MOVEI A,SIXTH*5 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[10.0] + PUSHJ P,RING + MOVEI A,010406 + PUSHJ P,DNAM + JRST DCOM1 + +DNAM: PUSH P,X + PUSH P,Y + MOVE X,BP + MOVEM X,SBP1' + MOVE X,[-1.0] + MOVE Y,[-3.0] + PUSHJ P,POS + MOVEI ZP%MD,CMD + PUSHJ P,ZRMF + MOVEI LC%ES,1 + PUSHJ P,CHR + POP P,Y + POP P,X + POPJ P, + DAIS: MOVEI A,SIXTH*1 + MOVEM A,XOFS + MOVEI A,SIXTH*3 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[0.1] + PUSHJ P,RING + MOVE R,[0.2] + PUSHJ P,RING + MOVE R,[0.3] + PUSHJ P,RING + MOVE R,[10.0] + PUSHJ P,RING + MOVEI A,TAIS + MOVEI B,21. + MOVEI C,1 + MOVE X,[0.0] + MOVE Y,[320.0] + SETZM 360DG + PUSHJ P,LINS + MOVEI A,110123 + PUSHJ P,DNAM + MOVE A,[0.0] + MOVE B,[2.0] + MOVE X,[4.5] + MOVE Y,[1.5] + PUSHJ P,BOX + MOVE X,[-1.5] + MOVE Y,[2.0] + PUSHJ P,POS + MOVEI ZP%MD,CMD + MOVEI Z%IN,3 + MOVEI Z%SC,1 + MOVEI Z%ST,0 + MOVE A,BP + MOVEM A,SBPC' + PUSHJ P,ZRMF + MOVEI A,232401 + IDPB A,BP + MOVEI A,141437 + IDPB A,BP + POPJ P, + +DART: MOVEI A,SIXTH*3 + MOVEM A,XOFS + MOVEI A,SIXTH*3 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[10.0] + PUSHJ P,RING + MOVE R,[7.5] + PUSHJ P,RING + MOVE A,[0.0] + MOVE B,[0.0] + MOVE X,[10.0] + MOVE Y,[0.5] + PUSHJ P,BOX + POPJ P, + +DALT: MOVEI A,SIXTH*5 + MOVEM A,XOFS + MOVEI A,SIXTH*3 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[0.1] + PUSHJ P,RING + MOVE R,[0.2] + PUSHJ P,RING + MOVE R,[0.3] + PUSHJ P,RING + MOVE R,[10.0] + PUSHJ P,RING + MOVEI A,TALT + MOVEI B,50. + MOVEI C,4. + MOVE X,[0.0] + MOVE Y,[360.0] + SETOM 360DG + PUSHJ P,LINS + MOVEI A,011424 + PUSHJ P,DNAM + POPJ P, + +DRPM: MOVEI A,SIXTH*1 + MOVEM A,XOFS + MOVEI A,SIXTH*1 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[0.1] + PUSHJ P,RING + MOVE R,[0.2] + PUSHJ P,RING + MOVE R,[0.3] + PUSHJ P,RING + MOVE R,[10.0] + PUSHJ P,RING + MOVEI A,TRPM + MOVEI B,36. + MOVEI C,4 + MOVE X,[200.0] + MOVE Y,[520.0] + SETZM 360DG + PUSHJ P,LINS + MOVEI A,222015 + PUSHJ P,DNAM + POPJ P, + +DTBK: MOVEI A,SIXTH*3 + MOVEM A,XOFS + MOVEI A,SIXTH*1 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[0.1] + PUSHJ P,RING + MOVE R,[0.2] + PUSHJ P,RING + MOVE R,[0.3] + PUSHJ P,RING + MOVE R,[10.0] + PUSHJ P,RING + MOVE X,[2.0] + MOVE Y,[2.0] + MOVE A,[0.0] + MOVE B,[8.0] + PUSHJ P,BOX + MOVE A,[6.0] + MOVE B,[5.0] + PUSHJ P,BOX + MOVE A,[-6.0] + MOVE B,[5.0] + PUSHJ P,BOX + MOVEI I,4 + MOVE X,[10.0] + MOVE Y,[2.0] + MOVE A,[0.0] + MOVE B,[-5.0] + PUSHJ P,BOX + MOVE X,[2.0] + PUSHJ P,BOX + MOVE X,[-6.0] + MOVE Y,[5.0] + PUSHJ P,POS + MOVEI ZP%MD,CMD + PUSHJ P,ZRMF + MOVEI A,143737 + IDPB A,BP + MOVE X,[6.0] + MOVE Y,[5.0] + PUSHJ P,POS + MOVEI ZP%MD,CMD + PUSHJ P,ZRMF + MOVEI A,223730 + IDPB A,BP + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[1.0] + MOVEI I,7 + MOVEI A,-120 + ADDM A,YOFS + PUSHJ P,RING + MOVE A,SBPP + MOVEM A,SBP' + LDB A,SBP + MOVEM A,SBALL' + POPJ P, + +DRAT: MOVEI A,SIXTH*5 + MOVEM A,XOFS + MOVEI A,SIXTH*1 + MOVEM A,YOFS + MOVE I,DIN + MOVEI S,1 + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE R,[0.1] + PUSHJ P,RING + MOVE R,[0.2] + PUSHJ P,RING + MOVE R,[0.3] + PUSHJ P,RING + MOVE R,[10.0] + PUSHJ P,RING + MOVEI A,TRAT + MOVEI B,12. + MOVEI C,0 + MOVE X,[0.0] + MOVE Y,[360.0] + SETOM 360DG + PUSHJ P,LINS + MOVEI A,031415 + PUSHJ P,DNAM + POPJ P, + +DIPS: PUSH P,A + PUSH P,X + PUSH P,Y + PUSH P,GAN + MOVE X,[1.0] + MOVEM X,GAN +; HLRZ X,XYTEN +; HRRZ Y,XYTEN + MOVEI S,2 + MOVEI I,7 + ADDI Y,11 + MOVEM X,XOFS + MOVEM Y,YOFS + MOVEI A,355240 + PUSHJ P,DNAM + MOVE A,SBP1 + MOVEM A,SIPS' + POP P,GAN + POP P,Y + POP P,X + POP P,A + POPJ P, + +MTIC: MOVEI A,SIXTH*1 + MOVEM A,XOFS + MOVEI A,SIXTH*5 + MOVEM A,YOFS + MOVE I,NIN + MOVEI S,0 + + MOVE R,[15.0] + MOVE A,TIME + PUSHJ P,FLT + FDVR A,[10.0] + PUSHJ P,TNED + FDVR A,[60.0] + MOVE R,[14.0] + PUSHJ P,TNED + FDVR A,[12.0] + MOVE R,[11.0] + JRST TNED + +TNED: SKIPN DZON + POPJ P, + PUSH P,A + PUSHJ P,ANGXY + SETZM X + MOVE Y,R + FMPR Y,GAN + PUSHJ P,ROT1 + PUSHJ P,LINE + POP P,A + POPJ P, + +MCOM: MOVEI A,SIXTH*3 + MOVEM A,XOFS + MOVEI A,SIXTH*5 + MOVEM A,YOFS + MOVE R,LNTHN + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE I,NIN + MOVEI S,0 + MOVE A,CMPS + CAILE A,7777 + SUBI A,7777 + SKIPGE A + ADDI A,7777 + MOVEM A,CMPS + MOVE A,COMPI + ASH A,-7 + PUSHJ P,FLT + FMPR A,ETIME + PUSHJ P,FIX + ADDB A,CMPS + SKIPN DZON + POPJ P, + PUSHJ P,NEDL + PUSHJ P,LINE + POPJ P, + +NIN: 5 + +MADF: POPJ P, + +MAIS: MOVEI A,SIXTH*1 + MOVEM A,XOFS + MOVEI A,SIXTH*3 + MOVEM A,YOFS + SKIPE GRND + MOVE A,THRI + SKIPL GRND + MOVE A,EVLI + SKIPL GRND + ADDI A,440 + SUB A,WAIS + PUSHJ P,FLT + MOVE B,[0.015] + SKIPE GRND + PUSHJ P,ROLING + FMPR A,B + FMPR A,ETIME + PUSHJ P,FIX + ADDB A,WAIS + MOVE R,LNTHN + MOVE X,[0.0] + MOVE Y,[340.0] + MOVE I,NIN + MOVEI S,0 + SKIPN DZON + POPJ P, + PUSHJ P,NEDL + PUSHJ P,LINE + POPJ P, + +ROLING: MOVE B,[0.004] + SKIPGE A + MOVE B,[0.01] + POPJ P, + +MART: MOVEI A,SIXTH*3 + MOVEM A,XOFS + MOVEI A,SIXTH*3 + MOVEM A,YOFS + MOVE I,NIN + MOVEI S,0 + MOVE A,EVLI1 + SUB A,EVLI + ASH A,-4 + PUSHJ P,FLT + FMPR A,ETIME + PUSHJ P,FIX + ADDB A,EVLI + PUSHJ P,FLT + FDVR A,[4095.0] + FMPR A,[180.0] + MOVEM A,SAVAF' + MOVE X,[0.0] + MOVE Y,[-15.0] + FMPR X,GAN + FMPR Y,GAN + SKIPN DZON + JRST .+3 + PUSHJ P,ANGXY + PUSHJ P,ROT1 + MOVEM X,X1F' + MOVEM Y,Y1F' + MOVN A,SAVAF + MOVE X,[0.0] + MOVE Y,[-15.0] + FMPR X,GAN + FMPR Y,GAN + PUSHJ P,ANGXY + PUSHJ P,ROT1 + MOVE A,ALRI + SUBI A,3777 + PUSHJ P,FLT + FMPR A,[0.001] + MOVN A,A + +MDED: MOVEM A,MABA' + MOVMS A + CAMG A,DEDZ + SETZB A,MABA + HRRZ A,BOTOM + CAME A,ALTUD + JRST NOBT + MOVE A,BTBUG + SKIPL ALRTIP + MOVN A,BTBUG + MOVEM A,MABA + MOVM A,ALRTIP + CAMLE A,BTBUG + JRST NOBT + SETZB A,ALRTIP + SETZM MABA +NOBT: MOVE A,MABA + + FMPR A,ETIME + FADRB A,ALRTIP + + MOVEM A,MABA + MOVMS A + CAMG A,TLIM + JRST NOLIM + MOVE A,TLIM + SKIPGE MABA + MOVN A,TLIM + MOVEM A,MABA + MOVEM A,ALRTIP + +NOLIM: MOVE A,MABA + PUSHJ P,ANGXY + PUSHJ P,ROT1 + MOVEM X,X2' + MOVEM Y,Y2' + MOVE X,X1F + MOVE Y,Y1F + SKIPN DZON + POPJ P, + PUSHJ P,ROT1 + PUSHJ P,POSLIN + POPJ P, + +TLIM: 70.0 +DEDZ: 0.2 +BTBUG: 2.0 + +MALT: MOVEI A,SIXTH*5 + MOVEM A,XOFS + MOVEI A,SIXTH*3 + MOVEM A,YOFS + MOVE I,NIN + MOVEI S,0 + MOVE R,[10.0] + MOVE X,[0.0] + MOVE Y,[360.0] + MOVE A,RATOC + SUBI A,3777 + ASH A,-5 + PUSHJ P,FLT + FMPR A,ETIME + PUSHJ P,FIX + ADDB A,ALTUD + +BOTOM: CAIL A,40 + JRST NOGND + HRRZ A,BOTOM + MOVEM A,ALTUD + +NOGND: IDIVI A,7777 + IMULI A,7777/10. + PUSH P,B + IDIVI B,10. + ADD A,B + POP P,B + SKIPN DZON + POPJ P, + PUSHJ P,NEDL + PUSHJ P,LINE + MOVE A,B ; B IS REMBER BIG HAND + MOVE R,LNTHN + MOVE X,[0.0] + MOVE Y,[360.0] + PUSHJ P,NEDL + PUSHJ P,LINE + POPJ P, + +MRPM: MOVEI A,SIXTH*1 + MOVEM A,XOFS + MOVEI A,SIXTH*1 + MOVEM A,YOFS + MOVE R,LNTHN + MOVE X,[200.0] + MOVE Y,[520.0] + MOVEI S,0 + MOVE I,NIN + MOVE A,THRI + SUB A,WRPM + PUSHJ P,FLT +BRPM: FMPR A,[0.1] + FMPR A,ETIME + PUSHJ P,FIX + ADDB A,WRPM + SKIPN DZON + POPJ P, + PUSHJ P,NEDL + PUSHJ P,LINE + POPJ P, + +MTBK: MOVEI A,SIXTH*3 + MOVEM A,XOFS + MOVEI A,SIXTH*1 + MOVEM A,YOFS + MOVE R,LNTHN + MOVE I,NIN + MOVEI S,0 + MOVE X,[270.0] + MOVE Y,[450.0] + MOVE B,RUDI1 + SUB B,RUDI + ASH B,-2 + MOVE A,B + PUSHJ P,FLT + FMPR A,ETIME + PUSHJ P,FIX + MOVE B,A + ADDB B,RUDI + SUBI B,3777 + ASH B,-1 + MOVN A,ALRTIP + FMPR A,[50.0] + PUSHJ P,FIX + ADD A,B + MOVEM A,COMPI' + ADDI A,3777 + SKIPN DZON + JRST .+3 + PUSHJ P,NEDL + PUSHJ P,LINE + MOVE B,RUDI + SUBI B,3777 + MOVN B,B +ASHB: ASH B,-5 + MOVE A,ALRTIP + PUSHJ P,FIX + ASH A,0 + MOVN A,A + ADD B,A + MOVE A,SBALL + ADD A,B + DPB A,SBP + POPJ P, + WFOO: 0 +MRAT: MOVEI A,SIXTH*5 + MOVEM A,XOFS + MOVEI A,SIXTH*1 + MOVEM A,YOFS + MOVE A,EVLI + CAMGE A,STL2 ;STALL POINT + JRST STOL + MOVE B,WAIS + CAMG B,STL1 + JRST STOL + MOVE B,CHIN + CAIE B,3 + PUSHJ P,EXIN + PUSHJ P,SETIN + PUSHJ P,FLT + FSBR A,[777'.0] + FDVR A,[3584.0] + MOVE B,[1.0] + FSBR B,A + MOVE A,WRPM + PUSHJ P,FLT + FDVR A,[4095.0] + FMPR A,[2561.0] + FADR A,[2000.0] + FMPR A,B + PUSHJ P,FIX +ST1: MOVE R,LNTHN + MOVE X,[90.0] + MOVE Y,[450.0] + MOVE I,NIN + MOVEI S,0 + SUB A,WCLM + PUSHJ P,FLT + FMPR A,WFOO + FMPR A,ETIME + PUSHJ P,FIX + ADDB A,WCLM + SUBI A,3777 + MOVE B,[0.1] + SKIPL A + FSC B,2 + MOVEM B,WFOO + SKIPL A + ASH A,-2 + ADDI A,3777 + MOVEM A,RATOC' + SKIPN DZON + POPJ P, + + HRRZ A,BOTOM + CAME A,ALTUD + JRST NGOUT + MOVE A,RATOC1 + PUSHJ P,FLT + FSBR A,[2047.0] + MOVN A,A + FMPR A,[0.1] + FMPR A,ETIME + PUSHJ P,FIX + ADDB A,RATOC1 + JRST NGOUT1 +NGOUT: MOVE A,RATOC + MOVEM A,RATOC1 +NGOUT1: PUSHJ P,NEDL + PUSHJ P,LINE + POPJ P, + +STOL: AOS A,BSTOL + CAIL A,3 + SETZM BSTOL + SKIPN BSTOL + PUSHJ P,EXIN + PUSHJ P,SETIN + MOVEI A,1777 + JRST ST1 + +SETIN: PUSH P,BP + PUSH P,A + MOVE A,SBPC + MOVEM A,BP + MOVEI ZP%MD,CMD + MOVE Z%IN,CHIN + MOVEI Z%SC,1 + MOVEI Z%ST,0 + PUSHJ P,ZRMF + POP P,A + POP P,BP + POPJ P, + +EXIN: EXCH A,CHIN + EXCH A,CHIN1 + EXCH A,CHIN + POPJ P, + +RATOC1: 0 + +MIPS: PUSH P,A + PUSH P,BP + PUSH P,SIPS + MOVE A,SIPS + MOVEM A,BP + PUSHJ P,DIPS + POP P,SIPS + POP P,BP + POP P,A + POPJ P, + +LINS: PUSH P,A + PUSH P,B + PUSH P,C + PUSH P,R + PUSH P,X + PUSH P,Y + MOVEM A,TBP' + MOVEM B,NOBL' + MOVEM C,NOLL' + MOVEM R,RADG' + MOVEM X,STRG' + MOVEM Y,STPG' + SETZM LINL' + SETZM NOTMS' + PUSHJ P,STGR + JRST RELINF + + + +RELINF: MOVEI ZP%MD,PMD + MOVE Z%IN,I + MOVE Z%SC,S + MOVEI Z%ST,0 + PUSHJ P,ZRMF + PUSHJ P,XYFIX + ASH X,@S + ASH Y,@S + MOVEI LP%IF,0 + MOVEI ZP%MD,ZMD + ADD X,XOFS + ADD Y,YOFS + PUSHJ P,PNTF + PUSHJ P,LNTHL + MOVEI ZP%MD,VMD + MOVEI Z%SC,0 + PUSHJ P,ZRMF + MOVEI LC%ES,1 + MOVEI LP%IF,1 + PUSHJ P,LIN + MOVEI ZP%MD,ZMD + MOVE Z%SC,S + SKIPE LINL + JRST NOCHR + MOVEI ZP%MD,PMD + MOVE Z%IN,I + PUSHJ P,ZRMF + PUSH P,A + HRRZ A,TBP + ADD A,NOTMS + MOVE A,@A + SKIPN A + JRST POPAF + POP P,A + PUSHJ P,COMCP + MOVEI LP%IF,0 + MOVEI ZP%MD,CMD + PUSHJ P,PNTF + PUSH P,A + MOVE A,TBP + ADD A,NOTMS + HLRZ C,@A + IDPB C,BP + MOVEI C,373737 + IDPB C,BP + POP P,A +NOCHR: AOS LINL + AOS NOTMS + MOVE C,NOTMS + CAML C,NOBL + JRST OUTGR + MOVE C,LINL + CAMLE C,NOLL + SETZM LINL + MOVE X,XSAV1 + MOVE Y,YSAV1 + PUSHJ P,ROT1 + MOVEM X,XSAV1 + MOVEM Y,YSAV1 + JRST RELINF +OUTGR: POP P,Y + POP P,X + POP P,R + POP P,C + POP P,B + POP P,A + POPJ P, + +POPAF: POP P,A + JRST NOCHR + +STGR: PUSH P,C + MOVE A,STRG + MOVE Y,GAN + FMPR Y,RADG + SETZM X + PUSHJ P,ANGXY + PUSHJ P,ROT1 + MOVEM X,XSAV1' + MOVEM Y,YSAV1' + MOVE C,STPG + FSBR C,STRG + MOVE A,NOBL + SKIPN 360DG + SOS A + PUSHJ P,FLT + FDVRM C,A + PUSHJ P,ANGXY + POP P,C + POPJ P, + + +LNTHL: MOVE X,XSAV1 + MOVE Y,YSAV1 + SKIPE LINL + JRST LITL + FMPR X,[-0.4] + FMPR Y,[-0.4] + JRST BIGO +LITL: FMPR X,[-0.2] + FMPR Y,[-0.2] +BIGO: PUSHJ P,XYFIX + POPJ P, + +COMCP: PUSH P,A + PUSH P,B + MOVE X,XSAV1 + MOVE Y,YSAV1 + FMPR X,[1.4] + FMPR Y,[1.4] + PUSHJ P,XYFIX + MOVE B,TBP + ADD B,NOTMS + HRRZ B,@B + MOVE A,[-10] + SKIPE B + MOVE A,[-5] + ASH A,@S + ADD X,A + MOVE A,[-3] + ASH A,@S + ADD Y,A + ADD X,XOFS + ADD Y,YOFS + POP P,B + POP P,A + POPJ P, + + +TALY: PUSH P,A + HLRZ A,BP + LSH A,-14 + SKIPE A + JRST TAL3 + MOVEI A,3000 + REPEAT 6,IDPB A,BP + POP P,A + POPJ P, +TAL3: MOVEI A,3000 + REPEAT 7,IDPB A,BP + POP P,A + POPJ P, + +ANGXY: MOVE B,A + PUSHJ P,COSD + EXCH A,B + PUSHJ P,SIND + POPJ P, + +NEDL: PUSH P,A + PUSH P,B + PUSHJ P,FLT + FSBR Y,X + FDVR Y,[4095.0] + FMPR A,Y + FADR A,X + PUSHJ P,ANGXY + MOVE X,[0.0] + MOVE Y,GAN + FMPR Y,R + MOVEM A,SSIN' + MOVEM B,SCOS' + PUSHJ P,ROT1 + POP P,B + POP P,A + POPJ P, + +ROT1: PUSH P,X + PUSH P,Y + FMPR X,B + FMPR Y,A + FADR X,Y + MOVEM X,SAVX' + POP P,Y + POP P,X + FMPR Y,B + FMPR X,A + FSBR Y,X + MOVE X,SAVX + POPJ P, + + +LINE: PUSH P,X + PUSH P,Y + MOVEI ZP%MD,PMD + MOVE Z%IN,I + MOVE Z%SC,S + MOVEI Z%ST,0 + PUSHJ P,ZRMF + MOVE X,XOFS + MOVE Y,YOFS + MOVEI LP%IF,0 + MOVEI ZP%MD,VMD + PUSHJ P,PNTF + MOVE X,-1(P) + MOVE Y,(P) + PUSHJ P,XYFIX + MOVEI LC%ES,1 + MOVEI LP%IF,1 + PUSHJ P,LIN + POP P,Y + POP P,X + POPJ P, + + + +POSLIN: PUSH P,A + PUSH P,B + PUSH P,X + PUSH P,Y + PUSH P,XOFS + PUSH P,YOFS + PUSHJ P,XYFIX + ADDM X,XOFS + ADDM Y,YOFS + MOVE X,X2 + MOVE Y,Y2 + PUSHJ P,XYFIX + ADD X,-1(P) + ADD Y,(P) + SUB X,XOFS + SUB Y,YOFS + ASH X,-1 + ASH Y,-1 + MOVE A,X + MOVE B,Y + PUSHJ P,XYFLT + PUSHJ P,LINE + ADDM A,XOFS + ADDM B,YOFS + PUSHJ P,LINE + POP P,YOFS + POP P,XOFS + POP P,Y + POP P,X + POP P,B + POP P,A + POPJ P, + + +BOX: PUSH P,A + PUSH P,B + PUSH P,X + PUSH P,Y + MOVEI ZP%MD,PMD + MOVE Z%IN,I + MOVE Z%SC,S + MOVEI Z%ST,0 + PUSHJ P,ZRMF + FMPR X,GAN + FMPR Y,GAN + PUSHJ P,XYFIX + MOVEM X,XSAV' + MOVEM Y,YSAV' + ASH X,@S + ASH Y,@S + ASH X,-1 + ASH Y,-1 + ADD X,XOFS + ADD Y,YOFS + FMPR A,GAN + FMPR B,GAN + EXCH A,B + PUSHJ P,FIX + EXCH A,B + PUSHJ P,FIX + ASH A,@S + ASH B,@S + ADD X,A + ADD Y,B + MOVEI LP%IF,0 + MOVEI ZP%MD,VMD + PUSHJ P,PNTF + MOVEI LC%ES,0 + MOVEI LP%IF,1 + MOVEI X,0 + MOVN Y,YSAV + PUSHJ P,LIN + MOVN X,XSAV + MOVEI Y,0 + PUSHJ P,LIN + MOVEI X,0 + MOVE Y,YSAV + PUSHJ P,LIN + MOVE X,XSAV + MOVEI Y,0 + MOVEI LC%ES,1 + PUSHJ P,LIN + POP P,Y + POP P,X + POP P,B + POP P,A + POPJ P, + + +POS: PUSH P,A + PUSH P,X + PUSH P,Y + MOVEI ZP%MD,PMD + MOVE Z%IN,I + MOVE Z%SC,S + MOVEI Z%ST,0 + PUSHJ P,ZRMF + FMPR X,GAN + FMPR Y,GAN + PUSHJ P,XYFIX + ASH X,@S + ASH Y,@S + ADD X,XOFS + ADD Y,YOFS + MOVE A,[-2] + ASH A,@S + ADD X,A + MOVE A,[-3] + ASH A,@S + ADD Y,A + MOVEI LP%IF,0 + MOVEI ZP%MD,ZMD + PUSHJ P,PNTF + POP P,Y + POP P,X + POP P,A + POPJ P, + + + +RING: JRST RING1 + PUSH P,A + PUSH P,B + PUSH P,C + PUSH P,X + PUSH P,Y + MOVEI ZP%MD,PMD + MOVE Z%IN,I + MOVE Z%SC,S + MOVEI Z%ST,0 + PUSHJ P,ZRMF + MOVEM X,XSAV' + FSBR Y,X + FDVR Y,NOPTS + PUSHJ P,XYFIX + MOVE C,Y + MOVE A,XSAV + PUSHJ P,ANGXY + MOVE X,[0.0] + MOVE Y,R + FMPR Y,GAN + PUSHJ P,ROT1 + MOVE A,NOPTS + MOVEI LP%IF,1 + PUSHJ P,ANGXY + JRST PLTP+1 +PLTP: PUSHJ P,ROT1 + PUSH P,X + PUSH P,Y + PUSHJ P,XYFIX + ASH X,@S + ASH Y,@S + ADD X,XOFS + ADD Y,YOFS + PUSHJ P,PNTF + POP P,Y + POP P,X + CAIN C,1 + MOVEI ZP%MD,ZMD + SOJGE C,PLTP + POP P,Y + POP P,X + POP P,C + POP P,B + POP P,A + POPJ P, + +RING1: PUSH P,A + PUSH P,B + PUSH P,X + PUSH P,Y + PUSH P,R + MOVEI ZP%MD,PMD + MOVE Z%IN,I + JFCL + MOVE Z%SC,S + MOVEI Z%ST,0 + PUSHJ P,ZRMF + MOVE X,R + MOVE Y,[0.0] + FMPR X,GAN + PUSHJ P,XYFIX + ASH X,@S + ASH Y,@S + ADD X,XOFS + ADD Y,YOFS + MOVEI LP%IF,0 + MOVEI ZP%MD,IMD + PUSHJ P,PNTF + MOVE A,BP + MOVEM A,SBPP' + MOVE A,R + FMPR A,GAN + PUSHJ P,FIX + MOVE R,A + MOVN B,S + ASH A,(B) + PUSHJ P,CIRCR + POP P,R + POP P,Y + POP P,X + POP P,B + POP P,A + POPJ P, + + +E==S +M==LC%ES +T==LP%IF + + +CIRCR: MOVEM 15,ACBLK+15 + MOVEI 15,ACBLK + BLT 15,ACBLK+14 + MOVSI A,265012 ;.7071068 + MULI A,(R) + DPB A,[014200,,B] ;EVEN PROD > 0 + MOVEI C,(R) + IMUL C,C + SUBI C,(A) ;R*R-Y + IMUL A,B + SUB C,A ;R*R-Y-2*Y*Y + JUMPLE C,BGOOD + SUBI C,(B) + CAIGE C,3 + AOSA B + ADDI B,2 +BGOOD: MOVNI E,1(B) + ASH E,21 + IDIVI B,8 + HRRM B,BIGIN + HRRM C,PHASIN + MOVSI X,-4 + MOVEI Y,0 + MOVE M,BP + MOVEI A,200000 + TLZE M,220000 + TROA Y,4 + AOSA M + IDPB A,BP + IDPB A,BP + MOVE B,BP + IDPB A,B +CRLUP: HRRM M,BPA(X) + MOVE T,PHASES(Y) + HLLM T,BPA(X) + ADD T,IDBS(X) + MOVEM T,A(X) +BIGIN: ADDI M,. +PHASIN: ADDI Y,. + TRZE Y,8 + AOS M + AOBJN X,CRLUP + SKIPE Y + TLOA M,220000 + SOS M + HRLS Y,BP + ADDI Y,1 + BLT Y,(M) + MOVEI Y,600000 + DPB Y,M + MOVEM M,BP + MOVNI Y,1 ;14 10 + MOVEI T,0 ;17 3 13 + MOVEI X,(R) + PUSHJ P,CIRLP + MOVSI 15,ACBLK + BLT 15,15 + POPJ P, +CIRLP: AOBJP E,CDUN + ADDI Y,2 + ADDI T,(Y) + CAIL T,(X) + SOJA X,CDIAG + 4PUT 2 14 3 10 + PUSHJ P,CIRLP + 4PUT 14 3 10 2 + POPJ P, +CDIAG: SUBI T,(X) ;.+2,DOUT+2=CAT; .+6,+8 MONK + SUBI T,1(X) + 4PUT 16 17 13 12 + PUSHJ P,CIRLP +CDOUT: 4PUT 16 17 13 12 + POPJ P, +CDUN: TRNN E,400000 + JRST CDOUT + POPJ P, +ACBLK: BLOCK 16 +IRPC Q,,ABCD +IDB!Q: REPEAT 4,[ + JSP Q,(Q) + IDPB 0,BP!Q] + MOVSI 0,-20000 + ADDM 0,BP!Q +JDB!Q: REPEAT 4,[ + JSP Q,(Q) + IDPB 0,BP!Q] + MOVE 0,[420000,,1] + ADDM 0,BP!Q + JRST IDB!Q +TERMIN +IRPC Q,,ABCD +BP!Q: 0 +TERMIN +IDBS: IRPC Q,,ABCD + IDB!Q +TERMIN +PHASES: 420400,,1 + 360400,,3 + 320400,,5 + 260400,,7 + 200400,,13 + 140400,,15 + 100400,,17 + 040400,,21 + + + +PNT: PUSH P,A + ANDI Y,1777 + MOVEI A,200000+PMD_15(Y) + IDPB A,BP + LDB A,[1200,,X] + DPB ZP%MD,[150300,,A] + DPB LP%IF,[120100,,A] + IDPB A,BP + POP P,A + POPJ P, + + +CHR: PUSH P,A + IDPB A,BP + SKIPG LC%ES + JRST CHROUT + MOVEI A,373737 + IDPB A,BP +CHROUT: POP P,A + POPJ P, + +PNTF: PUSH P,A + PUSH P,X + PUSH P,Y + ANDI X,1777 + ANDI Y,1777 + MOVEI A,PMD + DPB A,[150300,,Y] + MOVE A,ZP%MD + DPB A,[150300,,X] + TRZ Y,2000 + TRZ X,2000 + SKIPE LP%IF + TRO X,2000 + TRZ X,200000 + TRO Y,200000 + IDPB Y,BP + IDPB X,BP + POP P,Y + POP P,X + POP P,A + POPJ P, + + + +LIN: PUSH P,X + PUSH P,Y + TRNN X,400000 + JRST DOY + MOVMS X + TRO X,200 +DOY: TRNN Y,400000 + JRST DDOY + MOVMS Y + TRO Y,200 +DDOY: ANDI X,377 + ANDI Y,377 + LSH Y,10 + ADD X,Y + TRZ X,600000 + SKIPLE LC%ES + TRO X,400000 + SKIPLE LP%IF + TRO X,200000 + IDPB X,BP + POP P,Y + POP P,X + POPJ P, + + +ZRMF: PUSH P,A + PUSH P,B + SETZM B + MOVE A,ZP%MD + DPB A,[150300,,B] + MOVE A,Z%IN + DPB A,[000300,,B] + MOVE A,Z%SC + DPB A,[040200,,B] + TRZ B,3000 + SKIPLE Z%ST + TRO B,3000 + TRO B,10 + TRO B,100 + TRZ B,10000 + IDPB B,BP + POP P,B + POP P,A + POPJ P, + + +ZRM: DPB ZP%MD,[150300,,Z%IN] + TRO Z%IN,110 + IDPB Z%IN,BP + POPJ P, + +XYFIX: PUSH P,Y+1 + MULI Y,400 + TSC Y,Y + ASH Y+1,-243(Y) + MULI X,400 + TSC X,X + ASH X+1,-243(X) + MOVE X,X+1 + MOVE Y,Y+1 + POP P,Y+1 + POPJ P, + +XYFLT: TLC X,232000 + FAD X,X + TLC Y,232000 + FAD Y,Y + POPJ P, + +FIX: PUSH P,A+1 + MULI A,400 + TSC A,A + ASH A+1,-243(A) + MOVE A,A+1 + POP P,A+1 + POPJ P, + +FLT: TLC A,232000 + FAD A,A + POPJ P, + + +NOPTS: 2.0 +FOOI: 0 +GAN: 8.0 +CHIN: 3 +WRPM: 0 +WAIS: 0 +WCLM: 0 + +LNTHN: 14.0 +ALTUD: 7777 +XOFS: 0 +YOFS: 0 +PDL: BLOCK PDS +DSL0: BLOCK STDS +DSL1: BLOCK MVDS +DSL2: BLOCK MVDS + TCOM: 401640,,0 + 0 + 0 + 406340,,0 + 0 + 0 + 406640,,0 + 0 + 0 + 400540,,0 + 0 + 0 + 616240,,1 + 0 + 0 + 616540,,1 + 0 + 0 + 402340,,0 + 0 + 0 + 626140,,1 + 0 + 0 + 626440,,1 + 0 + 0 + 402740,,0 + 0 + 0 + 636040,,1 + 0 + 0 + 636340,,1 + 0 + 0 + 0 + + +TCLC: 616240,,1 + 0 + 0 + 0 + 0 + 406140,,0 + 0 + 0 + 0 + 0 + 406240,,0 + 0 + 0 + 0 + 0 + 406340,,0 + 0 + 0 + 0 + 0 + 406440,,0 + 0 + 0 + 0 + 0 + 406540,,0 + 0 + 0 + 0 + 0 + 406640,,0 + 0 + 0 + 0 + 0 + 406740,,0 + 0 + 0 + 0 + 0 + 407040,,0 + 0 + 0 + 0 + 0 + 407140,,0 + 0 + 0 + 0 + 0 + 616040,,1 + 0 + 0 + 0 + 0 + 616140,,1 + 0 + 0 + 0 + 0 + 0 + +TAIS: 406040,,0 + 0 + 626040,,1 + 0 + 646040,,1 + 0 + 666040,,1 + 0 + 706040,,1 + 0 + 616060,,0 + 0 + 616260,,0 + 0 + 616460,,0 + 0 + 616660,,0 + 0 + 617060,,0 + 0 + 626060,,0 + 0 + +TALT: 406040,,0 + 0 + 0 + 0 + 0 + 406140,,0 + 0 + 0 + 0 + 0 + 406240,,0 + 0 + 0 + 0 + 0 + 406340,,0 + 0 + 0 + 0 + 0 + 406440,,0 + 0 + 0 + 0 + 0 + 406540,,0 + 0 + 0 + 0 + 0 + 406640,,0 + 0 + 0 + 0 + 0 + 406740,,0 + 0 + 0 + 0 + 0 + 407040,,0 + 0 + 0 + 0 + 0 + 407140,,0 + 0 + 0 + 0 + 0 + + + +TRAT: 406340,,0 + 406440,,0 + 406540,,0 + 0 + 406540,,0 + 406440,,0 + 406340,,0 + 406240,,0 + 406140,,0 + 406040,,0 + 406140,,0 + 406240,,0 + +TRPM: 406040,,0 + 0 + 0 + 0 + 0 + 406540,,0 + 0 + 0 + 0 + 0 + 616040,,1 + 0 + 0 + 0 + 0 + 616540,,1 + 0 + 0 + 0 + 0 + 626040,,1 + 0 + 0 + 0 + 0 + 626540,,1 + 0 + 0 + 0 + 0 + 636040,,1 + 0 + 0 + 0 + 0 + 636540,,1 + + + +END + \ No newline at end of file diff --git a/src/klh/mazser.141 b/src/klh/mazser.141 new file mode 100644 index 00000000..521e8348 --- /dev/null +++ b/src/klh/mazser.141 @@ -0,0 +1,2308 @@ +TITLE MAZE + +; PDP-10 Half of MAZE Game, by Dave Lebling (January, 1974) +; Much altered by Ken Harrenstien (KLH @ MIT-AI) since. + +; MAZE COMMANDS: These are typed on the command line. Any number may +; be typed. + +; C - evade usage restrictions. this is for debugging purposes. +; normally MAZE can only be played on weekends and from 8pm to +; 8am during the week. + +; I - causes input from imlac to be scripted to the file ;MAZIN >. + +; L - informs the program that you are already loaded, and therefore +; do not need the auto-load feature. + +; O - causes output to imlac to be scripted to the file ;MAZOUT >. + +; Q - brings up MAZE in quiet mode. that implies that no loading be +; done and output be done to the TTY in ascii mode. useful for +; debugging. + +; R - causes MAZE to come up as a ROBOT. does a :PROCED when it is +; done initializing. typing control-G to a robot causes him to +; die and leave the game gracefully. + +; S - causes MAZE to record info about use, specifically time, user name, +; and tty #. + +; Additionally, the first player up has the option of loading an alter- +; nate maze. Typing CRLF to the query forgoes that option. Otherwise +; a file specification of the file to be used should be typed. The file +; itself is expected to contain 32. words of description, each word 16. +; bits right-justified. A bit that is on defines a wall, a bit that is +; zero defines a hallway. + +; MAZE PROTOCOL: Whenever certain ascii characters are received, the +; program expects the next several (from one to about 10) to be argu- +; ments to those characters. The first argument in all cases is the +; ID# of the IMLAC originating the command. ID#s run from 1 to 8. + +; PLAYER LEAVES GAME ; sent out when cntrl-Z typed. +; 001 +; + +; PLAYER MOVED ; defines position. see new protocol. +; 002 +; +; +; +; + +; PLAYER DIED ; announced with glee by shooting imlac. +; 003 +; +; + +; ANNOUNCE NEW PLAYER ; this is actually inserted in buffers by the 10. +; 004 +; +; <6 characters of ID name (login name)> +; <4 characters of score, 2 for, 2 against, \ 100> + +; any other characters received by IMLAC MAZE are displayed in a four +; line ring ("talk") buffer at the bottom of the display, unless "new protocol" is +; in effect; this protocol echoes only 010-017 and 040-137 inclusive, all +; other codes have some significance under the new protocol. + +; NEW PROTOCOL for MOVING +; The lower 3 bits of char are taken as ID of originator, and +; the upper 4 bits designate an action as follows: + +; 02x - Turn right +; 03x - Turn left +; 14x - Turn around +; 15x - Move forward 1 step in current direction +; 16x - Move backward 1 step etc. +; 17x - Reserved, no function. + +; Hence, one character serves to transmit "relative movement" information which +; amounts to a much more efficient way of communicating with the imlacs. The +; program is I/O and not CPU bound. + +.MLLIT==1 + +DEFINE SETF TEXT,FLG ;useful set-flag macro! +IFDEF FLG,.STOP +.TAG FOOBAR +PRINTC "TEXT +FLG=" +.TTYMAC FLAG +IFSE FLAG,YES,FLG==1 +IFSE FLAG,NO,FLG==0 +IFSE FLAG,Y,FLG==1 +IFSE FLAG,N,FLG==0 +IFNDEF FLG,FLG==FLAG +TERMIN +IFNDEF FLG,.GO FOOBAR +TERMIN + +; assembler conditionals + SETF [Fast protocol?]NPTCL ; when set, use new protocol + SETF [Debug error checking?]DEBUG ; when set, put in extra error checking + SETF [Stats?]STATS ; when set, keep stats on MAZE use + +; ac definitions + +FLAGS=0 ; program flags +A=1 +B=2 +C=3 +D=4 +E=5 ; offset of impure page! don't touch! +T=6 ; super temporary, assume clobbered by all subr. calls. +;=7 ; +G=10 ; used by interrupt routines only. +H=11 ; " +I=12 ; " + +TO=13 ; holds state of TTY output buffer +ID=14 ; hold id for use in general routines +ME=15 ; hold id number of this player +FLGNUM=16 ; buffer change flag (local copy) + +P=17 ; pdl pointer + + ; paging hackery. +IPAG==2 ; # of global impure page +IOFF==IPAG*2000 +PPAG==IPAG+1 ; # of page beginning global pure +POFF==PPAG*2000 + + ; program flags +LOADED==1 ; maze program already loaded, don't load it again +QUIET==2 ; not using an imlac (debug) +SCRIN==4 ; script input to ;MAZREC > (debug) +SCROUT==10 ; script output to ;MAZOUT > (debug) +ROBBY==20 ; ROBOT player +CHEAT==40 ; play during day +SPYSTA==100 ; collect spy statistics + + ; random definitions +TTYS==9. ; number of players (one is global buffer) +BUFSIZ==50 ; size of console input buffers +TYIMSK==1 ; tty interrupt mask bit + + ; call uuo definitions +CIMM==1000,,0 ; immediate argument +CRTN==2000,,0 ; return argument +CERR==3000,,0 ; return error code +CTL==4000,,0 ; control +CTLI==5000,,0 ; immediate control + + ; channels +TYIC==1 ; tty input channel +TYOC==2 ; tty output channel +SCRI==3 ; input script channel +SCRO==4 ; output script channel +LCI==5 ; loading input +LCO==6 ; loading output + +; macro for system calls +DEFINE SYSCAL A,B + .CALL [SETZ ? SIXBIT /A/ ? B ((SETZ))] +TERMIN + +; macro for reducing pain +DEFINE PUSHAE AC,LIST +IRP LOC,,[LIST] +PUSH AC,LOC +TERMIN +TERMIN +DEFINE POPAE AC,LIST +IRP LOC,,[LIST] +POP AC,LOC +TERMIN +TERMIN + +; macros to output text +DEFINE TYPE ARG + MOVEI A,[ASCIZ ARG] + PUSHJ P,LINOUT +TERMIN +DEFINE TYPECR ARG + MOVEI A,[ASCIZ ARG] + PUSHJ P,LINCR +TERMIN + +; Random macro to make defaulting filenames easier. +DEFINE DEFULT LOC,DEFARG + SKIPN LOC + JRST [MOVEM A,LOC ? MOVE A,DEFARG ? EXCH A,LOC ? JRST .+1] +TERMIN + ; * LOCAL IMPURE VARIABLES * +LOC 42 + JSR TTYINT ; interrupt handler vector + +LOC 100 + ; push down stack +PDLNTH==50 ; length of pdl +PDL: BLOCK PDLNTH ; pdl +OUTBUF: BLOCK 7 + +; variables for alternate maze reading and loading + +; command buffer -- for reading name of alternate MAZE file +COMLNG==20. ; length of command buffer +COMMND: BLOCK COMLNG ; command buffer +COMPTR: 440700,,COMMND ; byte pointer into command buffer + +; loading buffer +LODSIZ==1000 ; size of loading buffer +LODBUF: BLOCK LODSIZ +OB: 440700,,LODBUF+100 + +; TTY output buffer (SIOT faster than unit mode) +TTYSIZ==200. ;buffer up 200 chars +TTYBUF: BLOCK /5 +TTYPTR: 440700,,TTYBUF +TTYCNT: 0 ;countdown of chars in buffer. + +; variables for care and feeding of imlac program in core. +IMLLEN: 0 ; length in wds of imlac prgm, if in core at IMLPRG. +IMLPGP: 0 ; holds -<# pgs>,,imlpag for use in freeing the core. + + +; local byte pointers into global buffers +BPSPTR: -TTYS,,BPS +BPS: BLOCK TTYS + +; information about this player + +FIRST: 0 ; non-zero if first player +MYNAME: 0 ; sixbit of my uname (or ROBOTn) +MYBIT: 0 ; 1 lsh'ed by my id-1 (ID 3 => 4) +QNAME: 0 ; name we want (typed in by "name") +MYSNAM: 0 ; sname which job had on startup. used to open script files. + +; tty interrupt dispatch + +TTYINT: 0 + 0 + MOVEI I,TYIC + .ITYIC I, ; get interrupting char if any + .DISMIS TTYINT+1 ; nothing? + PUSH P,A + .IOT TYIC,A ; something there, get the char. +IFN DEBUG,[ + CAILE A,177 + JSR BUGHLT +] + PUSHJ P,@CHRVEC(A) ; go do routine +NOMSG: POP P,A + .DISMIS TTYINT+1 ; return + +; Character vectoring table. fast and simple (and all that room in the page +; was going to waste anyway...) + +CHRVEC: CPOPJ ; 000 - nil + GETOUT ; 001 - Player left game + NEWLOC ; 002 - Player moved + MURDER ; 003 - Player was shot + CPOPJ ; 004 - New player in game(ignore, imlac never sends) + CPOPJ ; 005 - nil + CPOPJ ; 006 - nil + SUICID ; 007 - ^G, kill self and return to DDT +IFN NPTCL,[ +REPEAT 10,COMTLK ; 010-017 echoed to talk buffer. +REPEAT 10,NCMDIR ; 020-027 New Protocol "turn right" +REPEAT 10,NCMDIR ; 030-037 New Protocol "turn left" +REPEAT 100,COMTLK ; 040-137 echoed to talk buffer. +REPEAT 10,NCMDIR ; 140-147 New Protocol "turn around" +REPEAT 10,NCMFWD ; 150-157 New Protocol "move forward" +REPEAT 10,NCMBKD ; 160-167 New Protocol "move backward" +REPEAT 10,CPOPJ ; 170-177 nil +] +IFE NPTCL,[ +REPEAT 170,COMTLK ; 010-177 echoed in talk buffer +] +CPOPJ: POPJ P, + +DBUGSW: DEBUG ; set nonzero if debugging. + +BUGHLT: 0 ;halt here if bug hit. + .VALUE ;should not try to return anything but chars 40-137! + JRST @BUGHLT ;if $P'd, try to continue. + +; * quit * + +QUIT: 0 ; JSR'd to, so can tell where we came from + SKIPE DBUGSW + .VALUE ;don't die if debugging. + .VALUE [ASCIZ ".JPC/ +:KILL "] + JRST .-1 ; if continued, .value again + ; * ROBOT PLAYER VARIABLES * + +; firing variables +ATIME: 0 ; if nonzero, time when fired bullet arrives +ALOCN: 0 ; if nonzero, where robot was when bullet fired +AVICTI: 0 ; if nonzero, id bits of possible victims + +; macro variables +ANEXT: 0 ; if non-zero, next time we move, do this +APEEK: 0 ; turn-around-and-peek probability, 0 - 40 + +DOZE: 40 ; time between robot moves * 4, initially 1/3 second + +SEEDHI: 0 ; seeds for random number generator +SEEDLO: 0 + +; robot move decision data + +AHEAD: 0 ; views in four directions +ARIGHT: 0 ; 0 -- wall immediately ahead +ABACK: 0 ; n,,m -- n is number of squares before wall +ALEFT: 0 ; m is id bits of people who can be seen + +AHMOVE: 0 ; coords to use to actually do four possible +ARMOVE: 0 ; things +ABMOVE: 0 +ALMOVE: 0 + +AHPROB: 0 ; value and later normalized probability for +ARPROB: 0 ; each possible move +ABPROB: 0 +ALPROB: 0 + +FFIPAG==<.+1777>/2000 ;first free locally impure page. + ; * GLOBAL IMPURE * + +LOC IOFF ; page 2 + +; the maze that the game is in, where to find it +; (note that if global maze exists, specs here are ignored and global is used.) +SCN1: 0 ; name1 (0 if using default assembled maze) +SCN2: 0 ; name2 +SCDIR: 0 ; user +SCDEV: 0 ; device + +; definitions for use in loading alternate mazes +MAZSIZ==40 ; number of words in a maze +MAZIML==<12+<40*4>+12+<2*4>+6+4>/5 ; number of words after imtraning +MAZBEG==10020 ; location of beginning of maze in imlac + +; flag that something happened +FLGGLO: 0 ; aos'ed for every message + +; global information tables + +GPSPTR: -TTYS,,<.-IOFF>+1 ; pointers into global input buffers +GPS: 440700,,GB0-IOFF(E) + 440700,,GB1-IOFF(E) + 440700,,GB2-IOFF(E) + 440700,,GB3-IOFF(E) + 440700,,GB4-IOFF(E) + 440700,,GB5-IOFF(E) + 440700,,GB6-IOFF(E) + 440700,,GB7-IOFF(E) + 440700,,GB8-IOFF(E) + +GGPPTR: -TTYS,,<.-IOFF>+1 ; guaranteed good pointers into global input buffers +GGP: 440700,,GB0-IOFF(E) + 440700,,GB1-IOFF(E) + 440700,,GB2-IOFF(E) + 440700,,GB3-IOFF(E) + 440700,,GB4-IOFF(E) + 440700,,GB5-IOFF(E) + 440700,,GB6-IOFF(E) + 440700,,GB7-IOFF(E) + 440700,,GB8-IOFF(E) + +GBSPTR: -TTYS,,<.-IOFF>+1 ; console buffers +GBS: +GB0: BLOCK BUFSIZ +GB1: BLOCK BUFSIZ +GB2: BLOCK BUFSIZ +GB3: BLOCK BUFSIZ +GB4: BLOCK BUFSIZ +GB5: BLOCK BUFSIZ +GB6: BLOCK BUFSIZ +GB7: BLOCK BUFSIZ +GB8: BLOCK BUFSIZ + +; global player information + +; id name +IDSPTR: -TTYS,,<.-IOFF>+1 ; sixbit (uname of each player) +IDS: BLOCK TTYS + +; score +SCRPTR: -TTYS,,<.-IOFF>+1 ; left half times winner, right half times dead +SCORE: BLOCK TTYS + +; dead +DEAPTR: -TTYS,,<.-IOFF>+1 ; non-zero when a player is dead +DEAD: BLOCK TTYS + +; coordinates +COOPTR: -TTYS,,<.-IOFF>+1 ; left half is direction, right offset in maze +COORD: BLOCK TTYS + +; buffer locks +LCKPTR: -TTYS,,<.-IOFF>+1 ; -1 implies buffer locked -- don't read from it +LOCKED: BLOCK TTYS + + ; the maze itself + +; it is 512. words long (16. wide by 32. high). normally the assembled +; in version is used, but if an alternate maze is used it is loaded in +; on top. + +; -1 == wall +; 0 -- empty square +; n -- id bits of all those in this square ORed together + +; macro to make a "row" of the maze +; bits in argument that are 1 become filled squares, 0 bits become empty +; squares. note that the entire border is filled in! +DEFINE ROWMAK RRR +RR=RRR +REPEAT 16.,[ + IFE , 0 + IFN , -1 + RR=RR_1 +] +TERMIN + +LAMAZE: 0 ; -1 implies this is already set up (only used if + ; non-standard maze being used + +; the maze itself +AMAZE: ROWMAK 177777 + ROWMAK 106401 + ROWMAK 124675 + ROWMAK 121205 + ROWMAK 132055 + ROWMAK 122741 + ROWMAK 106415 + ROWMAK 124161 + ROWMAK 121405 + ROWMAK 135775 + ROWMAK 101005 + ROWMAK 135365 + ROWMAK 121205 + ROWMAK 127261 + ROWMAK 120205 + ROWMAK 106765 + ROWMAK 124405 + ROWMAK 166575 + ROWMAK 122005 + ROWMAK 107735 + ROWMAK 120001 + ROWMAK 135575 + ROWMAK 105005 + ROWMAK 125365 + ROWMAK 125225 + ROWMAK 121265 + ROWMAK 105005 + ROWMAK 135375 + ROWMAK 100201 + ROWMAK 135675 + ROWMAK 110041 + ROWMAK 177777 + +; stuff from here to end of page is located for benefit of random programs +; that want to get at maze data; same reason applies to use of indexed +; (by E) pointers, so that global tables can be mapped to other addresses +; by other programs. + +LOC IOFF+1737 +ESSPTR: -9.,,<.-IOFF>+1 ; Table filled with either a NOP or POPJ +ESSWS: REPEAT 9.,ESPOPJ ; E & S instruction, so it can detect + ; (non) existence of players. +ESNOP==20,,0 ; E&S NOP indicates player active +ESPOPJ==22,,0 ; E&S POPJ indicates nonexistent + +LOC IOFF+1757 +UNMPTR: -9.,,<.-IOFF>+1 ; so can tell actual unames of players. +UNM: BLOCK 9. + +IFN STATS,[ +; more or less positive identification of this page as a MAZE page. +LOC IOFF+1776 + SIXBIT /MAZE/ + SIXBIT /EZAM/ +] + ; * SHARED PURE * + +LOC POFF ; pure pages start here + +; the default file containing an IMTRANed version of the IMLAC half of the +; program. Not used unless INITializing or there is no imlac program +; resident in core, in which case this is tried. +IMLDIR: SIXBIT /IMLAC / ; directory +IMLDEV: SIXBIT /DSK/ +IMLFN1: SIXBIT /M/ +IMLFN2: SIXBIT /IML/ + +; default file containing alternate maze. +MAZDEV: SIXBIT /DSK/ +MAZDIR: SIXBIT /IMLAC/ +MAZFN1: SIXBIT // ;NO STANDARD FN1 FOR MAZE FILE +MAZFN2: SIXBIT /MAZE/ + +; command character definitions + +%OUT==1 ; leave game +%MOV==2 ; move +%DIE==3 ; player dead +%NEW==4 ; new player enters game + +%COMSZ==4 ; max old-protocol value + +; pointers to beg of each global input buffer +GSSPTR: -TTYS,,GSS ; reset routines use these +GSS: 440700,,GB0-IOFF(E) + 440700,,GB1-IOFF(E) + 440700,,GB2-IOFF(E) + 440700,,GB3-IOFF(E) + 440700,,GB4-IOFF(E) + 440700,,GB5-IOFF(E) + 440700,,GB6-IOFF(E) + 440700,,GB7-IOFF(E) + 440700,,GB8-IOFF(E) + +; "pointer values" upon which to reset global buffer ptrs. +GSSEND: 010700,,+GB0-IOFF(E) + 010700,,+GB1-IOFF(E) + 010700,,+GB2-IOFF(E) + 010700,,+GB3-IOFF(E) + 010700,,+GB4-IOFF(E) + 010700,,+GB5-IOFF(E) + 010700,,+GB6-IOFF(E) + 010700,,+GB7-IOFF(E) + 010700,,+GB8-IOFF(E) + + +; Handy-dandy quik-ref table of player-ID bit masks +IDBITB: 0 + REPEAT 8.,1_.RPCNT + ; here to join game and then enter loop + +JOIN: PUSHJ P,NEWGUY ; initialize a new player + +; now set local ptrs to same as global ones +; we use pointers from a table set up at end of each command -- this +; ensures lack of gross timing errors when loser is caught will pants down + MOVE C,GGPPTR ; aobjn pointer to "good" global pointers + ADDI C,IOFF + MOVE B,BPSPTR ; aobjn pointer to local pointer table +SETLU1: MOVE A,(C) + MOVEM A,(B) + AOBJN C,.+1 + AOBJN B,SETLU1 + +; hang waiting for a message -- our copy of message count different +; from global means one has arrived +THELUP: PUSHJ P,TTYFRC ; force out any TTY output generated + CAMN FLGNUM,FLGGLO ; hang on flgglo changing + .HANG ; means message has occurred + MOVE FLGNUM,FLGGLO ; copy it to flgnum + +; first look to see if we're dead + SKIPN DEAD(ME) + JRST BUFTOP ; not dead, thank goodness + HRRZ A,COORD(ME) ; dead. get coord +IFN DEBUG,[ + CAIL A,1000 + JSR BUGHLT +] + MOVE B,IDBITB(ME) ; and set up bit to + ANDCAM B,AMAZE(A) ; remove us from global maze. + MOVEI A,45. ; allow 1.5 sec for imlac's "died" display to + .SLEEP A, ; finish. + SETZM DEAD(ME) ; and make us alive again + +; loop through buffers +BUFTOP: MOVSI ID,-TTYS ; aobjn ptr thru buffs, start with global id 0 + +; our buffer? +CHKQUE: CAIN ME,(ID) ; ignore our own buffer + JRST BUFLUP + MOVE C,BPS(ID) ; get local buffer pointer + +; global pointer same as local and buffer not locked? +QUELUP: CAME C,GPS(ID) ; same as global? + SKIPE LOCKED(ID) ; don't if he is locked + JRST BUFLUP ; bptrs same or his is locked + +; output chars from buffer until pointer same as local one + ILDB A,C ; get next character + PUSHJ P,TTYO ; put it out + CAMN C,GSSEND(ID) ; reached end of buffer? + MOVE C,GSS(ID) ; yes, reset to beginning (wraparound) + MOVEM C,BPS(ID) + JRST QUELUP ; loop + +; here to move to next buffer +BUFLUP: AOBJN ID,CHKQUE ; loop + JRST THELUP ; reenter main loop at the hang + ; * JOIN GAME * + +; first check if this is someone reentering after lossage (crash of +; IMLAC program, for instance) +NEWGUY: MOVE A,IDSPTR ; aobjn pointer to id names + ADDI A,IOFF + AOBJN A,.+1 ; skip talk buffer + MOVE B,(A) + CAMN B,MYNAME ; same as my name? + JRST NEWID ; yes, just reuse it + AOBJN A,.-3 ; loop + +; not reentering, so just find zero id slot. + MOVE A,IDSPTR + ADDI A,IOFF + AOBJN A,.+1 ; ignore talk buffer + SKIPN (A) ; zero? + JRST NEWID ; yes + AOBJN A,.-2 ; loop + +; no room -- i'm not sure if this will even type out reasonably. + TYPECR [Sorry, game is full now, try again later] + JSR QUIT ; kill job + +; here we have a new id +NEWID: HRRZS A ; points to slot in id table + SUBI A,IDS ; get offset -- it will be id number + MOVE ME,A ; id of new player + +; set up global data +; ME/ my id number + MOVE A,MYNAME ; my id name + MOVEM A,IDS(ME) ; put it out + .SUSET [.RUNAM,,A] + MOVEM A,UNM(ME) + SETZM DEAD(ME) ; i'm alive! + +; send out new player message +; sent out on TTY so our IMLAC will be informed -- remember that what +; goes in our buffer is ignored by us + SETOM LOCKED(ME) ; lock buffer + MOVEI A,%NEW ; command + PUSHJ P,TTYO ; type it, as our IMLAC must be told too + PUSHJ P,PUT ; new player + +; new player's id number + MOVE A,ME + PUSHJ P,TTYO + PUSHJ P,PUT ; new player's id number + +; now output name of new player + MOVE B,MYNAME ; sixbit of my name + MOVE C,[440600,,B] +OIDLP: ILDB A,C + ADDI A,40 + PUSHJ P,TTYO + PUSHJ P,PUT + CAME C,[000600,,B] + JRST OIDLP ; loop + +; now send score + MOVE B,SCORE(ME) ; my score + MOVE C,SCBPTR ; byte pointers +OSCRXX: LDB A,(C) + IORI A,100 + PUSHJ P,TTYO + PUSHJ P,PUT + AOBJN C,OSCRXX + +; loop through everyone who is active +; to get new player up to date + MOVEI C,1 ; start with id one, ignore talk buffer +IDTOP: CAME C,ME ; if me, ignore + SKIPN A,IDS(C) ; player exists? + JRST IDLOOP ; no + +; output someone's id and position +; from our IMLAC's point of view they are new players + MOVEI A,%NEW + PUSHJ P,TTYO + MOVE A,C + PUSHJ P,TTYO +; now id name and position if any + MOVE B,IDS(C) ; id name + PUSHJ P,OSIX + MOVE B,SCORE(C) ; score + PUSHJ P,OSCORE + MOVE A,C ; A/ id of who we send + SKIPE B,COORD(C) ; B/ position + PUSHJ P,SENDB ; sends a position in COORD format + +IDLOOP: CAIE C,TTYS-1 ; done? + AOJA C,IDTOP ; no, loop + +; now let the losers read it + MOVE A,GPS(ME) + MOVEM A,GGP(ME) ; set up first guaranteed good pointer. + MOVE A,[ESNOP] + MOVEM A,ESSWS(ME) ; now tell E&S we're alive. + SETZM LOCKED(ME) ; unlock the buffer + AOS FLGGLO ; indicate a message sent + POPJ P, ; return + +SENDB: PUSH P,A + MOVEI A,%MOV + PUSHJ P,PUT + PUSHJ P,TTYO + MOVE A,(P) ; get ID of person to move + PUSHJ P,PUT + PUSHJ P,TTYO + HLRZ A,B ; get direction + IORI A,100 + PUSHJ P,PUT + PUSHJ P,TTYO + LDB A,[000400,,B] ; get x coord + IORI A,100 + PUSHJ P,PUT + PUSHJ P,TTYO + LDB A,[040500,,B] ; get y coord + IORI A,100 + PUSHJ P,PUT + PUSHJ P,TTYO + POP P,A + POPJ P, + + +; * ROUTINES TO EXECUTE UPON IMLAC INPUT ARE HERE * +; These routines are interrupt driven and clobber G,H,I with +; reckless abandon. In general the only acc smashed which is shared with +; non-interrupt routines is A; it and any others are saved. +; Robots make no use of these routines, as they get their information +; directly from the global-impure tables. + +DEFINE CMINIT + SETOM LOCKED(ME) ; lock buffer + PUSHJ P,PUT ; put command in buffer +TERMIN + +PJRST==JRST ; replaces pushj p, foo ? popj p, with pjrst foo + +; Interrupt routines PJRST here when done - standard return. +ENDMES: MOVE A,GPS(ME) ; end of message, update "good" buffer pointer + MOVEM A,GGP(ME) + SETZM LOCKED(ME) ; unlock buffer + AOS FLGGLO ; signal that we sent a message + POPJ P, + +; control G means leave game gracefully if possible, abruptly if must. +SUICID: MOVEI A,%OUT + PUSHJ P,PUT ; send "OUT" message + MOVE A,ME ; and say its me + JRST GETOU1 ; go die, never return. + +COMTLK: PUSHJ P,TPUT ; put char in talk buffer (global id 0) + ; this is only place where anything is inserted in it. + PJRST ENDMES ; return + + ; New Protocol uses single character for any change of direction or +;position. Old protocol used 5 chars per change. Hopefully reduction +;of I/O (the limiting factor) will approach 1/5 over old mode. + +; Bits 1.7-1.6 If both 0 or both 1, rest of character is a command. +; Bits 1.6-1.4 Command #. +; = 0 Old style protocol command +; = 1 Reserved +; = 2 Turn Right (no move) +; = 3 Turn Left (no move) +; = 4 Flip over (no move) +; = 5 Move Forward (no turn) +; = 6 Move Backward (no turn) +; = 7 Reserved +; Bits 1.3-1.1 Player ID. + +IFN NPTCL,[ +DEFINE NCMINI + MOVE G,A + TRZ G,100 ; remove any such bit + LSHC G,-3 ; get command # in g + LSH H,-33. ; and player ID in h + CAIE H,-1(ME) ; check, should be our own ID (0-7 cmp'd with 1-8) + POPJ P, ; ugh, isn't us, ignore char. + SETOM LOCKED(ME) ; ah, lock buffer + PUSHJ P,PUT ; insert command. +TERMIN + + ; Change Direction +NCMDIR: NCMINI + SETZM DEAD(ME) + HLRZ A,COORD(ME) ;get direction already existing +IFN DEBUG,[ + CAILE A,3 + JSR BUGHLT +] + MOVE A,@(G)[ 0 + 0 + (A)[1 ? 2 ? 3 ? 0] ;get new direction for right-turn + (A)[3 ? 0 ? 1 ? 2] ;for left turn + (A)[2 ? 3 ? 0 ? 1]] ;for flip-over. + HRLM A,COORD(ME) + PJRST ENDMES + + ; Move Backward +NCMBKD: HLRZ I,COORD(ME) +IFN DEBUG,[ + CAILE I,3 + JSR BUGHLT +] + MOVE I,(I)[2 ? 3 ? 0 ? 1] ; set direction to move backwards + JRST NCMFW1 + + ; Move Forward +NCMFWD: HLRZ I,COORD(ME) ; for fwd move, just get direction. +IFN DEBUG,[ + CAILE I,3 + JSR BUGHLT +] +NCMFW1: NCMINI + SETZM DEAD(ME) + HRRZ G,COORD(ME) ;get our coordinate +IFN DEBUG,[ + CAIL G,1000 + JSR BUGHLT +] + MOVE H,IDBITB(ME) ;get our id bit + ANDCAM H,AMAZE(G) ;remove us from that coordinate + ; now separate x, y and adjust according to direction + IDIVI G,16. ;get y in g, x in h (0,0 is upper left) + XCT (I)[SOS G ;go north, decrement y + AOS H ;go east, increment x + AOS G ;go south, increment y + SOS H] ;go west, decrement x + DPB G,[040500,,H] ; overlay Y onto X (loses only if X neg) + ANDI H,777 ; for which purpose safety mask is made. + HRRM H,COORD(ME) ;update global offset + MOVE A,IDBITB(ME) + IORM A,AMAZE(H) ;put us back in maze + PJRST ENDMES + +] ;END OF IFN NPTCL + + + ; * COMMAND HANDLERS * + +; * PLAYER QUIT * + +; this command takes a single argument, the id of the guy who is quitting. +; the ID, SCORE, and COORDINATE are zeroed. the buffer is unlocked, and +; the player is removed from the global maze. the job is then killed. + +GETOUT: CMINIT + .IOT TYIC,A ; read argument (id# of who quit) +GETOU1: PUSHJ P,PUT ; enter here to kill robot + +; if not me who quit, don't do anything to our stuff + CAME A,ME + PJRST ENDMES + +; zero information about this loser + MOVE A,[ESPOPJ] + MOVEM A,ESSWS(ME) ; tell E&S we're not there + SETZM IDS(ME) + SETZM SCORE(ME) + SETZM COORD(ME) + AOS FLGGLO + SETZM LOCKED(ME) + MOVE A,ME + PUSHJ P,REMOVE + .LOGOUT ;try to logout, in case disowned. + .BREAK 16,140000 ; tell DDT to kill us. + JRST .-2 + +; * PLAYER MOVED * + +; this command gives a new location for us. first argument is id of +; who moved (thanx to gat you can move other people!) rest of arguments +; are direction (N=0, E=1, S=2, W=3), and an X and Y coordinate within +; the maze of the new location (X=0-15, Y=0-31). all but the id are +; ORed with 100 so that the ascii is always good. + +NEWLOC: CMINIT + .IOT TYIC,A ; get id of who moved +IFN DEBUG,[ + CAIL A,10 + JSR BUGHLT ; if arg bad. +] + PUSHJ P,PUT ; put it out in buffer + SETZM DEAD(A) ; if we moved we ain't dead yet! + PUSHJ P,REMOVE ; remove us from old position + +; set up id bit of who moved + MOVE G,IDBITB(A) ; pluck from handy table + +; new direction + .IOT TYIC,A ; get direction + PUSHJ P,PUT ; put it out + ANDI A,3 ; AND it down to 3 bits + HRLM A,COORD(ME) ; put out as new direction +; new x loc + .IOT TYIC,A ; get x + PUSHJ P,PUT ; put it out + MOVE H,A ; save x loc + ANDI H,17 ; AND it down to 4 bits (0-15) +; new y loc + .IOT TYIC,A ; get y + PUSHJ P,PUT ; put it out + ANDI A,37 ; AND it to 5 bits (0-31) + +; update coordinate and global maze + LSH A,4 ; y*16 + x = offset in global maze + ADD A,H + HRRM A,COORD(ME) ; put out as new offset + IORM G,AMAZE(A) ; add us to global maze using id bit and offset (a) + PJRST ENDMES + +; * PLAYER DIED * + +; player was shot. message is originated by shooter, and comes in as +; his id, id of who was shot. updates SCORE of each. left half is +; times you were murderer, right is times you were victim. + +MURDER: CMINIT + .IOT TYIC,A ; get id of murderer +IFN DEBUG,[ + CAIL A,10 + JSR BUGHLT +] + MOVSI G,1 ; aos his score of kills + ADDM G,SCORE(A) + PUSHJ P,PUT ; put him out + .IOT TYIC,A ; id of victim +IFN DEBUG,[ + CAIL A,10 + JSR BUGHLT +] + AOS SCORE(A) ; aos his score of deaths + SETOM DEAD(A) ; make him dead + PUSHJ P,PUT ; put him out + PJRST ENDMES + +; adding and removing people in global maze (somewhat localized for debugging) + +; remove a guy from global maze (only done by guy himself either at +; end of game or if he notices he's dead or if he moves) +; A/ guy to remove +REMOVE: + +IFN DEBUG,[ + CAIL A,10 + JSR BUGHLT +] + PUSH P,B + PUSH P,C + HRRZ B,COORD(A) ; get his coordinate + MOVE C,IDBITB(A) ; and his bit +IFN DEBUG,[ + CAIL B,1000 + JSR BUGHLT +] + ANDCAM C,AMAZE(B) ; AND to remove him + POP P,C + POP P,B + POPJ P, + +; put a guy into global maze +; A/ offset into global maze +; B/ id bit of guy to add +ADDGUY: + +IFN DEBUG,[ + CAIL A,1000 + JSR BUGHLT +] + IORM B,AMAZE(A) ; OR his id bit into global maze + POPJ P, + ; * OUTPUT ROUTINES * + +; * output single character to TTY * + +TTYO: IDPB A,TO ;deposit character in buffer + SOSLE TTYCNT ;drop through if buffer full + POPJ P, + + ; Force tty buffer out. +TTYFRC: MOVEI TO,TTYSIZ + SUBB TO,TTYCNT ;get # of chars to output + JUMPE TO,TTYFR2 + MOVE TO,TTYPTR + TRNE FLAGS,SCROUT + PUSHJ P,OSRCIP + SYSCAL SIOT,[CIMM TYOC ? TO ? TTYCNT] + JSR QUIT +TTYFR2: MOVEI TO,TTYSIZ + MOVEM TO,TTYCNT + MOVE TO,TTYPTR + POPJ P, + + + ; script crlf if old-style command character +OSRCIP: PUSH P,A + PUSH P,B + .IOT SCRO,["|] + MOVE B,TTYCNT +OSCRI2: ILDB A,TO + CAILE A,%COMSZ + JRST .+3 + .IOT SCRO,[15] + .IOT SCRO,[12] +; script space if not command character + CAILE A,%COMSZ + .IOT SCRO,[40] +; now convert to number and output + LDB T,[060300,,A] + IORI T,"0 + .IOT SCRO,T + LDB T,[030300,,A] + IORI T,"0 + .IOT SCRO,T + LDB T,[000300,,A] + IORI T,"0 + .IOT SCRO,T + SOJG B,OSCRI2 + MOVE TO,TTYPTR + POP P,B + POP P,A + POPJ P, + +; here to script input +ISCRIP: TRNN FLAGS,SCRIN ; if scripting, do other hair + POPJ P, + .IOT SCRI,[40] +; now convert to number and output + LDB T,[060300,,A] + IORI T,"0 + .IOT SCRI,T + LDB T,[030300,,A] + IORI T,"0 + .IOT SCRI,T + LDB T,[000300,,A] + IORI T,"0 + .IOT SCRI,T + POPJ P, + +; here to script a crlf +SICRLF: TRNN FLAGS,SCRIN + POPJ P, + .IOT SCRI,[^M] + .IOT SCRI,[^J] + POPJ P, + +; * output a character into a global buffer * + +; put a character out into talk buffer +TPUT: PUSH P,ID + SETZ ID, + PJRST PUT1 + +; put character out in my buffer +PUT: PUSH P,ID + MOVE ID,ME ; for buffer pointer update + +PUT1: +IFN DEBUG,[ + PUSH P,B ; CHECK VALIDITY OF PTR + HRRZ B,GPS(ID) + CAIGE B,GB0-IOFF + JSR BUGHLT + CAILE B,GB8+BUFSIZ-IOFF + JSR BUGHLT + POP P,B +] + IDPB A,GPS(ID) ; put out character + PUSHJ P,ISCRIP + PUSH P,A ; update buffer pointer +IFN DEBUG,[ + CAIL ID,10 + JSR BUGHLT +] + MOVE A,GPS(ID) + CAMN A,GSSEND(ID) ; buffer pointer at end of buffer? + MOVE A,GSS(ID) ; if so, reset (wraparound to beg) + MOVEM A,GPS(ID) + POP P,A + POP P,ID + POPJ P, + +; * output sixbit to tty * + +OSIX: PUSH P,I + MOVE I,[440600,,B] +OSIXLP: ILDB A,I + ADDI A,40 + PUSHJ P,TTYO + CAME I,[000600,,B] + JRST OSIXLP + POP P,I + POPJ P, + +; * output score to tty * + +OSCORE: PUSH P,I + MOVE I,SCBPTR +OSCRLP: LDB A,(I) + IORI A,100 + PUSHJ P,TTYO + AOBJN I,OSCRLP + POP P,I + POPJ P, + +SCBPTR: -4,,.+1 + 300600,,B + 220600,,B + 060600,,B + 000600,,B + +; * output messages * + +LINCR: PUSHJ P,LINOUT + .IOT TYOC,[15] + POPJ P, + +LINOUT: PUSH P,A + HRLI A,440700 +LOUP: ILDB T,A ; pick up letter + JUMPE T,FINZ ; zero if done + CAIE T,^J + .IOT TYOC,T ; output letter + JRST LOUP ; back for more +FINZ: POP P,A + POPJ P, + +; * ROBOT PLAYER SETUP * + +; proceed the job +ROBOT: .VALUE [ASCIZ /:PROCED +/] + +; find an id number + MOVE A,IDSPTR + ADDI A,IOFF + AOBJN A,.+1 ; ignore talk buffer + SKIPN (A) + JRST ROBID + AOBJN A,.-2 + JSR QUIT ; kill job, no room + +; here we have a new id +ROBID: HRRZS A + SUBI A,IDS + MOVE ME,A ; id of new player + +; send new player message + SETOM LOCKED(ME) + PUSHJ P,SICRLF + MOVEI A,%NEW ; new player + PUSHJ P,PUT + MOVE A,ME ; id # + PUSHJ P,PUT +; name is "ROBOTn", where n is id number +IRPC X,,[ROBOT] + MOVEI A,"X + PUSHJ P,PUT +TERMIN + MOVE A,ME + IORI A,60 + PUSHJ P,PUT + +; set up id slot, MYNAME, and MYBIT + SKIPN A,QNAME + MOVE A,[SIXBIT /ROBOT0/] + PUSHJ P,NAMEX + AOJA A,.-1 + MOVEM A,IDS(ME) ; id name slot + MOVEM A,MYNAME ; local copy of our name + .SUSET [.RUNAM,,A] + MOVEM A,UNM(ME) + MOVE A,ME + MOVEI B,1 + LSH B,-1(A) + MOVEM B,MYBIT ; id bit -- word with bit # "ID" one + +; send my score + MOVE B,SCORE(ME) + MOVE I,SCBPTR +ROBSCR: LDB A,(I) + IORI A,100 + PUSHJ P,PUT + AOBJN I,ROBSCR + MOVE I,GPS(ME) ; set up "good" pointer to our global buffer + MOVEM I,GGP(ME) + MOVE A,[ESNOP] + MOVEM A,ESSWS(ME) ; tell E&S we're alive. + SETZM LOCKED(ME) ; unlock buffer + ; * ROBOT PLAYER LOOP * + +; comes here to restart after dying +ROBNEW: SOS A,DOZE ; go a little faster to compensate for dying + CAIGE A,4 ; can't get faster than four, though + AOS DOZE + SETZM DEAD(ME) ; make us alive again + MOVE A,ME + PUSHJ P,REMOVE ; remove corpse from maze + +; random start up position +ROBRAN: PUSHJ P,RANDOM ; random direction + ANDI A,3 ; 3 bits + MOVE B,A ; save it + PUSHJ P,RANDOM ; random position + ANDI A,777 ; 9 bits +ROBRLP: SKIPL AMAZE(A) ; space in maze not wall? + JRST ROBLOC ; exit + SOJE A,ROBRAN ; wall, go back one + JRST ROBRLP ; loop + +; put out new location +ROBLOC: HRL A,B ; direction in left half + MOVEM A,COORD(ME) ; xy coord + HRRZS A ; A/ coord + MOVE B,MYBIT ; B/ id bit + PUSHJ P,ADDGUY ; add to global maze + PUSHJ P,SENDME ; send out my position + +; loop for robot player + +ROBLUP: SKIPE DEAD(ME) ; am i dead? + JRST ROBNEW ; yes, better do something about it + PUSHJ P,AUTO ; do something + MOVE A,DOZE ; sleep for a while + LSH A,-2 ; doze for DOZE/4 + .SLEEP A, + +; pending shot? + SKIPN ATIME ; if non-zero, a shot is pending + JRST ROBLUP ; no, just loop + .RDTIME A, ; time + CAMGE A,ATIME ; two seconds passed? + JRST ROBLUP ; no, loop + PUSHJ P,ADEAD ; kill anyone left there + SETZM ATIME ; no more shot + JRST ROBLUP ; loop + ; * ROBOT PLAYER DECISION ROUTINES * + +; decides on and executes a move for the robot +AUTO: PUSHJ P,ASETUP ; set up moves and "vision" data + SKIPE ATIME ; skip if no pending shot + JRST AMOVE ; pending shot, can't fire again + +; fire at anyone visible +AFIRE: HRRE A,AHEAD ; look for visible people ahead + JUMPLE A,AMOVE ; no one visible + +; someone visible + SETZM ANEXT ; flush any pending "macro" + MOVEM A,AVICTI ; victims + MOVE A,COORD(ME) ; my current position + MOVEM A,ALOCN ; save it + .RDTIME A, + ADDI A,60. ; two seconds from now we will check them + MOVEM A,ATIME ; save it + POPJ P, ; return + +; couldn't fire, so we move instead +AMOVE: MOVE A,ME ; get my id # + PUSHJ P,REMOVE ; remove from the global maze + SKIPN ANEXT ; skip if we already have a move planned + JRST AMOVE1 ; nope + +; here to use pre-planned move + MOVE A,ANEXT ; get pre-planned move + SETZM ANEXT ; remove "macro" + JRST AMOVE2 ; go use it + +; here to figure out a move +AMOVE1: PUSHJ P,AVALUE ; returns the "best" move in A + +; here to actually do a move +AMOVE2: MOVEM A,COORD(ME) ; new position + HRRZS A ; coordinate + MOVE B,MYBIT ; my id bit + PUSHJ P,ADDGUY ; add myself back into maze + PUSHJ P,SENDME ; and send out new location + POPJ P, ; return + ; * ROBOT PLAYER MOVE SELECTOR * + +; returns a move based on a random selection weighted as follows (where N +; is the number of squares before a wall is hit in a given direction): + +; move forward: 10*N, or N if other players are visible +; turn right: 10*N +; turn left: 10*N +; turn back: 1 + +; algorithm is such that robot never turns to face a blank wall, and if +; he turns to look down a corridor, he always advances at least one square +; into the corridor. + +AVALUE: PUSH P,B + PUSH P,C + SETZM AHPROB ; zero value/probability locations + SETZM ARPROB + SETZM ABPROB + SETZM ALPROB + SETZ C, ; zero value total + +; move forward + MOVE A,AHEAD ; view forward + JUMPE A,AVALR ; negative -- wall + HLRZ B,A ; empty squares + HRRZS A ; visible people + SKIPN A ; any visible? + IMULI B,10 ; no, weight by 10 + MOVEM B,AHPROB ; value of move forward + ADD C,B ; update total of values + +; turn right +AVALR: MOVE A,ARIGHT ; view right + JUMPE A,AVALB ; anything? + HLRZ B,A ; get number of squares + IMULI B,10 ; weight by 10 + MOVEM B,ARPROB ; value of move right + ADD C,B ; update total + +; turn back +AVALB: MOVE A,ABACK ; view back + JUMPE A,AVALL ; wall? + MOVEI B,1 ; currently just value of 1 + MOVEM B,ABPROB + ADD C,B ; update total + +; turn left +AVALL: MOVE A,ALEFT ; view left + JUMPE A,AVALN ; wall? + HLRZ B,A ; free squares + IMULI B,10 ; weight by 10 + MOVEM B,ALPROB ; value of turn left + ADD C,B ; update total + +; normalize the values to numbers between 0 and 1000 +; which mark off the boundaries between probabilities. +AVALN: ; C/ total of values + +IRP AX,,[AHPROB,ARPROB,ABPROB,ALPROB] + MOVE A,AX ; get value + PUSHJ P,NORMAL ; normalize + ADDB A,B ; total + MOVEM A,AX ; put it back out +TERMIN + +; remainder of 1000. in B + PUSHJ P,RANDOM ; get random number between 0 and 1000. + IDIVI A,1000. ; remainder ends up in B + +; move forward? + CAML B,AHPROB ; less than ahead number? + JRST ARCHK ; nope + MOVE A,AHMOVE ; move forward! + JRST AVALX ; return + +; turn right? +ARCHK: CAML B,ARPROB ; less than turn right number? + JRST ABCHK + MOVE A,ARMOVE ; turn right + PUSHJ P,DOMOVE ; and always go forward after that + MOVEM B,ANEXT ; put out as "macro" + JRST AVALX + +; turn around +ABCHK: CAML B,ABPROB ; turn around? + JRST ALCHK ; nope + MOVE A,ABMOVE ; get turn + JRST AVALX + +; turn left +ALCHK: CAML B,ALPROB ; turn left? + JRST ANULL ; nope + MOVE A,ALMOVE + PUSHJ P,DOMOVE ; after left turn always move forward + MOVEM B,ANEXT ; put out as "macro" + JRST AVALX + +; no move, do nothing -- happens sometimes due to roundoff errors +ANULL: MOVE A,COORD(ME) ; just return current position + +; check to see if better to do quick turn around to look for people +; sneaking up on us +AVALX: HLRZ B,COORD(ME) ; current direction + HLRZ T,A ; new direction + CAME T,B ; directions same? + JRST AVAL1 ; no, zero apeek +; directions same, should we turn around? + AOS APEEK + EXCH B,A + PUSHJ P,RANDOM ; random number + EXCH B,A + ANDI B,37 ; make it between 0 and 37 + CAMLE B,APEEK ; less than apeek? + JRST AVALXX ; nope, don't peek + MOVE A,COORD(ME) ; yes, peek. instead of what we were + MOVEM A,ANEXT ; going to do, return "back" move and + MOVE A,ABMOVE ; then turn back to current position next time +AVAL1: SETZM APEEK ; zero peek count -- either turned or peeked + +; return move in A -- equals coordinates of player after move made +AVALXX: POP P,C + POP P,B + POPJ P, + ; find out who died -- called 2 seconds after a shot was fired. +; anyone still visible from where we fired the shot will be dead. +; send out messages indicating they are dead. +ADEAD: PUSHAE P,[A,B,C] + MOVE A,ALOCN ; pick up where we were + PUSHJ P,SEE ; find out who is visible + AND A,AVICTIM ; keep only those who were visible before + JUMPLE A,JFFXIT ; exit if everyone got away + +; tell them they're dead + MOVE B,A ; save id bits of who dies + +JFFLUP: JFFO B,JFFDO ; find first bit +JFFXIT: POPAE P,[C,B,A] ; exit, no bits on anymore + POPJ P, + +; here a bit was found in victim word, so tell him he's dead +JFFDO: MOVNS C ; - + ADDI C,36. ; bit position of loser = id# + MOVE A,C ; get id# into A + PUSHJ P,ADIE ; die! +; now turn off that bit from victim word + MOVEI A,1 + LSH A,-1(C) ; C is number of bit that should be on + TRZ B,(A) + JRST JFFLUP ; and loop to find next victim + +; kill a specific hacker, id# in a +; whenever robot kills someone, he slows down a little bit, to compensate +; for being so good. idea is that eventually he reaches an equilibrium +; with caliber of his opposition. +ADIE: SKIPE DEAD(A) ; skip only if not already dead + POPJ P, + SETOM LOCKED(ME) ; lock buffer + PUSHJ P,SICRLF + PUSH P,A ; save his id# + MOVEI A,%DIE ; send player died message + PUSHJ P,PUT + MOVE A,ME ; my id (as murderer) + PUSHJ P,PUT + POP P,A ; recover his id + PUSHJ P,PUT ; send it (as victim) + SETOM DEAD(A) ; make him dead + AOS SCORE(A) ; increment times killed for victim + MOVSI T,1 + ADDM T,SCORE(ME) ; and increment my count of wins. + AOS DOZE ; slow me down a bit, i'm getting too good + MOVE T,GPS(ME) ; and update "good" buffer pointer + MOVEM T,GGP(ME) + SETZM LOCKED(ME) ; unlock buffer + AOS FLGGLO ; and indicate message sent + POPJ P, ; return + ; checks for those who can be seen from a given place +; pass coord-like contents in A, returns those who can be seen + +SEE: PUSHAE P,[B,C,D] + HRRZ B,A ; B/ coordinate + HLRZ C,A ; C/ direction + SETZB A,D ; A/ people visible + ; D/ number of squares +IFN DEBUG,[ + CAILE B,777 + JSR BUGHLT + CAILE C,3 + JSR BUGHLT +] +SEELUP: XCT AFORW(C) ; move forward + SKIPGE AMAZE(B) ; wall? + JRST SEERX ; yes, exit + +; add to information we are gathering +SEEADD: IOR A,AMAZE(B) ; add new victims + AOS D ; add another square + JRST SEELUP ; loop + +; normal exit +SEERX: HRL A,D ; return A/ ,, + POPAE P,[D,C,B] + POPJ P, + ; pick up our position and collect view in each direction and create +; move we would use if we moved/turned in that direction. +ASETUP: PUSHAE P,[A,B] + +; forward move + MOVE A,COORD(ME) + MOVE B,A + MOVEM A,AHMOVE ; for the moment, move ahead is noop + PUSHJ P,SEE ; what is ahead? + MOVEM A,AHEAD ; save it + JUMPE A,ASETU1 ; if wall, go on to right turn + HLRZ A,AHMOVE ; no wall, figure out what move ahead + MOVE B,AHMOVE ; would be by executing appropriate + XCT AFORW(A) ; instruction from AFORW table + MOVEM B,AHMOVE ; real forward move +; turn right +ASETU1: MOVE B,COORD(ME) + PUSHJ P,ASTURN ; do turn + MOVEM A,ARMOVE ; result of right turn + PUSHJ P,SEE ; what is to right? + MOVEM A,ARIGHT +; turn back + PUSHJ P,ASTURN ; do turn + MOVEM A,ABMOVE ; result of back turn + PUSHJ P,SEE ; what is behind us? + MOVEM A,ABACK +; turn left + PUSHJ P,ASTURN ; do turn + MOVEM A,ALMOVE ; result of left turn + PUSHJ P,SEE ; what is off to left? + MOVEM A,ALEFT +; exit + POPAE P,[B,A] + POPJ P, + +; instructions to move in NESW direction +AFORW: SUBI B,1._4 ; move to north + AOS B ; move to east + ADDI B,1._4 ; move to south + SOS B ; move to west + +; turn to next direction +ASTURN: ADD B,[1,,0] ; just aos direction + AND B,[3,,777] ; and AND back to legal information + MOVE A,B ; return in A and B + POPJ P, + ; normalize to 1000. +; A/ value to normalize +; C/ total of values being normalized +NORMAL: PUSH P,B + IMULI A,1000. ; multiply times 1000 + IDIV A,C ; and divide by total of values + POP P,B + POPJ P, + +; random number generator stolen from HAKMEM +RANDOM: PUSH P,B + MOVE A,SEEDHI + MOVE B,SEEDLO + MOVEM A,SEEDLO + LSHC A,35. + XORB A,SEEDHI + MOVMS A + POP P,B + POPJ P, + +; given a direction/coordinate in A, returns new coordinate in B +DOMOVE: PUSH P,A + MOVE B,A ; coord into B + HLRZS A ; direction + XCT AFORW(A) ; move forward + POP P,A + POPJ P, + +; send current location from COORD(id#) +; A/ an id # +SENDA: PUSH P,B + MOVE B,A ; into B +IFN DEBUG,[ + CAILE B,7 + JSR BUGHLT +] + SETOM LOCKED(B) ; lock buffer + MOVEI A,%MOV ; move command + PUSHJ P,PUT ; put it out + MOVE A,B ; id# + PUSHJ P,PUT ; put it + HLRZ A,COORD(B) ; direction + IORI A,100 + PUSHJ P,PUT ; put it + LDB A,[000400,,COORD(B)] ; x coordinate + IORI A,100 + PUSHJ P,PUT ; put it + LDB A,[040500,,COORD(B)] ; y coordinate + IORI A,100 + PUSHJ P,PUT ; put it + PUSH P,GPS(B) ; set up "good" global buffer pointer + POP P,GGP(B) ; core-core transfer. + SETZM LOCKED(B) ; unlock buffer + AOS FLGGLO ; and indicate message sent + POP P,B + POPJ P, + +; same as SENDA but always uses local ID # +SENDME: PUSH P,A + PUSHJ P,SICRLF + MOVE A,ME ; get id of me + PUSHJ P,SENDA ; and send + POP P,A + POPJ P, + +CONSTANTS ;try to keep most commonly ref'd stuff in 1 page. +VARIABLES + +; start up + +START: MOVEI E,IOFF ; OFFSET of impure page + MOVE P,[-PDLNTH,,PDL] ; set up pdl pointer + + .RDTIME A, ; seeds for random number generator + MOVEM A,SEEDHI + MOVE A,[3.14159] + MOVEM A,SEEDLO + + .BREAK 12,[5,,COMMND] ; get command line that started us + .SUSET [.RUNAM,,MYNAME] ; get our uname -- (id unless robot or id given) + .SUSET [.RSNAM,,MYSNAM] ; get initial sname for use by script-file opens + .SUSET [.SSNAM,,MYNAME] ; and set sname to uname, to wipe out traces + ; of where loaded from. might be set to name + ; which player uses in maze, but too obvious. + + +; read command line and set flag bits in FLAGS appropriately + +RESTRT: MOVE A,[440700,,COMMND] + SETZ FLAGS, + +COMRED: ILDB B,A ; get next character from command line + CAIL B,"a ; convert to uppercase + CAILE B,"z + CAIA + SUBI B,40 + CAIGE B,40 ; halt on any cntrl (null, ^M, etc) + JRST TTYOPN ; no more + + CAIN B,"" ; " -- read name + PUSHJ P,NAMRED + CAIN B,"L ; L -- don't load IMLAC program + TRO FLAGS,LOADED + CAIN B,"I ; I -- script input to ";MAZIN >" + JRST [ TRO FLAGS,SCRIN + .CALL ISCOPN ; open file to script input from imlac + JSR QUIT + JRST .+1] + CAIN B,"O ; O -- script output to ";MAZOUT >" + JRST [ TRO FLAGS,SCROUT + .CALL OSCOPN ; open fie to script output to imlac + JSR QUIT + JRST .+1] + CAIN B,"Q ; Q -- don't output at all (debugging) + TRO FLAGS,QUIET + CAIN B,"R ; R -- this player is a robot + TRO FLAGS,ROBBY + CAIN B,"C ; C -- evade usage restrictions + TRO FLAGS,CHEAT +IFN STATS,[ + CAIN B,"S ; S -- Spy statistics + TRO FLAGS,SPYSTA +] + JRST COMRED ; loop to read another character + + +ISCOPN: SETZ ? SIXBIT /OPEN/ ? [.UAO,,SCRI] ? ['DSK,,0] + [SIXBIT /MAZIN/] ? [SIXBIT />/] ? SETZ MYSNAM + +OSCOPN: SETZ ? SIXBIT /OPEN/ ? [.UAO,,SCRO] ? ['DSK,,0] + [SIXBIT /MAZOUT/] ? [SIXBIT />/] ? SETZ MYSNAM + ; open ttys for initial interaction +TTYOPN: +IFN STATS,[ + TRNE FLAGS,SPYSTA + PUSHJ P,REINIT ;WRITE OUT INCRIMINATING INFO +] + .OPEN TYIC,[.UAI,,'TTY] + JSR QUIT + .OPEN TYOC,[.UAO,,'TTY] + JSR QUIT + +; output name of program and ground rules + TYPECR [MAZE.76] + +; see if legitimate to play. time must be right and user must be real +; DMS user (ie, he must have a directory) + TRNE FLAGS,CHEAT + JRST QSHARE ; don't bother, he's cheating + +; does he have a directory? open it and see + SYSCAL OPEN,[CIMM LCI ? ['DSK,,0] + [SIXBIT /.FILE./] ? [SIXBIT /(DIR)/] ? MYNAME] + SKIPA + JRST TIMCHK + +; doesn't have a directory, so he can't play + TYPECR [Sorry, MAZE is not available at this time.] + JSR QUIT ; leave game + +; is it night or weekend? if not, can't play +TIMCHK: .CLOSE LCI, ; close channel open to dir + .RLPDT A, + LDB C,[320300,,B] ; get day of week + CAIE C,0 ; skip if sunday + CAIN C,6 ; don't skip if saturday + JRST QSHARE ; you can play! you lucky devil + +; its not weekend, but maybe its night time + .RTIME A, ; what time is it? + CAML A,[SIXBIT /080000/] ; before 8am? + CAML A,[SIXBIT /200000/] ; after 8pm? + JRST QSHARE ; he can play, by god! + +; time of day is wrong + TYPECR [Sorry, you cannot play MAZE during the day, come back later.] + JSR QUIT ; die horribly + ; This stuff needs to be $G'd before PDUMP'ing so that +; the mapping from file will happen correctly, and so there will be an +; imlac program available... +%CBLOK==2000 ;not defined in MIDAS yet +INIT: MOVEI P,PDL +; SYSCAL CORBLK,[CIMM %CBPRV ? [-1] ? CIMM PPAG] +; .VALUE +; SYSCAL CORBLK,[CIMM %CBNDW ? [-1] ? CIMM IPAG] +; .VALUE + .OPEN TYIC,[.UAI,,'TTY] + .VALUE + .OPEN TYOC,[.UAO,,'TTY] + .VALUE + TYPECR [Give filespec of IMTRANed imlac program] +INIT2: TYPE [(CR for DSK:IMLAC;M IML): ] + PUSHJ P,RCMD + PUSHJ P,SCNAME ; parse filename + DEFULT SCDEV,IMLDEV + DEFULT SCDIR,IMLDIR + DEFULT SCN1,IMLFN1 + DEFULT SCN2,IMLFN2 + +; now have filespec to pull imlac program from. Open channel + SYSCAL OPEN,[[.BII,,LCI] ? SCDEV ? SCN1 ? SCN2 ? SCDIR] + JRST [ TYPECR [Can't open file, try again.] + JRST INIT2] + SYSCAL FILLEN,[CIMM LCI ? CRTN IMLLEN] ;get length of file + .VALUE ;ugh bletch! + +; Have LCI channel ready, now read into core at IMLPAG. + MOVE C,IMLLEN ; get # wds in imlac progm + ADDI C,1777 ; round up to # pages + IDIVI C,2000 + MOVN A,C ;keep # pgs in C for later use + HRLZS A + HRRI A,IMLPAG ; now have -<# pgs>,,page # to start at. + MOVEM A,IMLPGP ; store ptr. for when freeing. + SYSCAL CORBLK,[CIMM %CBNDW ? [-1] ? A ? [%JSNEW]] ;get pgs for imlac pgm storage + .VALUE ; failed. + MOVN A,IMLLEN + HRLZS A + HRRI A,IMLPRG ; now fix up aobjn for input + .IOT LCI,A ; get pgm + .CLOSE LCI, ; won, close it. + + MOVE A,[COMMND,,COMMND+1] ; zero command buffer before + SETZM COMMND ; dumping. + BLT A,COMMND+COMLNG-1 + + ; at this point should have finished all mods to core. + SYSCAL CORBLK,[CIMM %CBPRV+%CBNDW+%CBLOK ? [-1] ? CIMM 0] ;ensure locked + .VALUE + MOVEI A,FFIPAG + CAIL A,IPAG ;if page 1 isn't used, + JRST INIT4 + SYSCAL CORBLK,[CIMM 0 ? [-1] ? CIMM FFIPAG] ;then flush it. + .VALUE +INIT4: SYSCAL CORBLK,[CIMM %CBNDW+%CBPUB+%CBLOK ; make page 2 global impure. + [-1] ? CIMM IPAG] + .VALUE + + ; Now form aobjn for call to purify all global pure pages. + MOVE A,C ; find # pgs used for imlac pgm storage + ADDI A,IMLPAG ; get page # of first non-pure + SUBI A,PPAG ; find # of pages to purify + MOVNS A,A + HRLZS A + HRRI A,PPAG + SYSCAL CORBLK,[CIMM %CBPRV+%CBLOK ? [-1] ? A] ; make pages private & locked + .VALUE ; (OK since only 3 or so) + + TYPECR [Mapping done, now dump.] + .VALUE [ASCIZ /:PDUMP /] + .VALUE [ASCIZ /:KILL /] ;in case he tries to $P + + +; free the pages occupied by resident imlac program. +IMLPGF: PUSH P,A + SKIPL A,IMLPGP ; get the AOBJN page ptr + JRST POPAJ + SYSCAL CORBLK,[CIMM 0 ? [-1] ? A] ;flush them! + JSR QUIT + SETZM IMLLEN + SETZM IMLPGP ; clear all indicators to existence of page +POPAJ: POP P,A + POPJ P, + ; set up sharing properly -- all MAZEs have same high segment +; automagically, but they manually share page 2, where all the goodies +; are + +; get sharer of my first high-seg page, if any +QSHARE: SYSCAL CORTYP,[CIMM PPAG ? CRTN A ? CRTN B] ; find out state of high seg page + JSR QUIT ; call failed, die + MOVEM B,FIRST ; save result for later misuse + JUMPG B,GETHIM ; if >0, is job number of sharer + +; result was -1, therefore we are first one up -- make page 2 writeable, +; shared, and locked. + SYSCAL CORBLK,[CIMM %CBNDW+%CBPUB+%CBLOK ? [-1] ? CIMM IPAG] + JSR QUIT ; failed, die + +; now tell him he is winner, ask if wants special maze + TYPECR [You are the first rat in - specify maze file to use] + TYPE [(CR for standard maze):] +ASKMAZ: PUSHJ P,RCMD ; read command line + PUSHJ P,SCNAME ; parse it + +; hack defaults: "DSK:IMLAC;xxxxx MAZE" + SKIPN SCN1 + JRST START2 ; if no fn1 given, use default (assembled)maze. + DEFULT SCDEV,MAZDEV + DEFULT SCDIR,MAZDIR + DEFULT SCN2,MAZFN2 + PUSHJ P,GETMAZ ; try to get it + JRST [ TYPE [Couldn't get maze, try again:] + JRST ASKMAZ] + SETOM LAMAZE ; indicate global maze set up. + JRST START2 ; now that we have hacked defaults, load + +; get global writeable page 2; all other than first up come here. +; job number of sharer we want is in B +GETHIM: TRO B,400000 ; get it bit + SYSCAL CORBLK,[CIMM %CBNDW+%CBPUB+%CBLOK + [-1] ? CIMM IPAG ? B ? CIMM IPAG] ;get it + JSR QUIT ; lost, die + +; inform loser of his state + TYPECR [You are joining a game already in progress] + JRST START2 + + +; now load console if he didn't ask you not to +; unless funny bits on, we always load the IMLAC half of the program +; if non-standard maze being used, we read that even when funny bits +; are on if we are first up, so that global copy of maze can be initialized. +; in general, maze not loaded for ROBBY (player is robot), LOADED (player +; claims to be loaded already), and QUIET (for debugging). + +; name ok? +START2: SKIPN A,QNAME ; gave his own name? + JRST STARTL + PUSHJ P,NAMEX ; skip if name is unique. + AOJA A,.-1 ; AOS it until it is. + MOVEM A,MYNAME + +; load it +STARTL: TRNE FLAGS,ROBBY\LOADED\QUIET + JRST START3 ; skip MAZE loading if requested. + TYPECR [Hang on!] + MOVEI A,60. ; wait a couple sec so he can read typeout. + .SLEEP A, + PUSHJ P,LOADER ; load the MAZE program itself + PUSHJ P,LODMAZ ; load global maze into imlac +START3: PUSHJ P,IMLPGF ; free the pages occupied by imlac prog (if it existed) + TRNE FLAGS,ROBBY ; if robot, don't open TTYs + JRST ROBOT ; and go off into special routine. + + ; open TTY for playing. + .OPEN TYIC,[.UII,,'TTY] ; normal input + JSR QUIT + TRNE FLAGS,QUIET ; skip if not quiet mode + JRST [ .OPEN TYOC,[.UAO,,'TTY] ; quiet, use "normal" ASCII + JSR QUIT + JRST JOIN] + .OPEN TYOC,[40+.UIO,,'TTY] ; super-image output. + JSR QUIT + SYSCAL TTYGET,[CIMM TYIC ; make superimage on input also. + CRTN A ? CRTN B ? CRTN C] + JSR QUIT + TLO C,2 ; set superimage input bit. + SYSCAL TTYSET,[CIMM TYIC ? A ? B ? C] + JSR QUIT + + ; Final initialization. + MOVEI TO,TTYSIZ + MOVEM TO,TTYCNT ; set count of chars in output buffer + MOVE TO,TTYPTR ; and set up ptr + .SUSET [.SMASK,,[TYIMSK]] ;enable TTY interrupt only + .SUSET [.SMSK2,,[0]] + +; start IMLAC program at 10000 + MOVEI A,30. ; sleep for half a sec. first + .SLEEP A, + .IOT TYOC,[^A] + .IOT TYOC,[^F] + .RESET TYIC, ;reset input so anything he typed before start is zapped + .SUSET [.SPICLR,,[-1]] ;and now enable input ints! + JRST JOIN + + ; ** ALTERNATE MAZE LOADING ROUTINES ** + +; start up a load -- open tty for output, start 40 loader, sleep for +; one second + +LSTART: .OPEN LCO,[40+.BIO,,'TTY] ; superimage block output + .VALUE + MOVE A,[477777,,[ASCII / /]] + .IOT LCO,A ; start console at 40. + MOVEI A,30. + .SLEEP A, + POPJ P, + +; load the maze program + +LOADER: SKIPE IMLLEN ; if no imlac prog in core, get from default file. + JRST FLOADR ; ah, pull from core. + SYSCAL OPEN,[[.BII,,LCI] ? IMLDEV ? IMLFN1 ? IMLFN2 ? IMLDIR] + JSR QUIT ; open failed, die + PUSHJ P,LSTART + PUSHJ P,LOAD + .CLOSE LCI, + .CLOSE LCO, + POPJ P, + +; given an channel (LCI) output it to the TTY + +LOAD: MOVE A,[-LODSIZ,,LODBUF] + MOVE B,A + .IOT LCI,A + MOVE C,B + MOVE B,A + HLLZS A + SUBM C,A + .IOT LCO,A + JUMPGE B,LOAD + .CLOSE LCI, + POPJ P, + + +; load maze program from our own core and flush pages. +FLOADR: PUSHJ P,LSTART + PUSHJ P,FLOAD + .CLOSE LCO, + POPJ P, + +; "fast load" or "fake load" as you wish. +FLOAD: PUSH P,A + MOVN A,IMLLEN + HRLZS A + HRRI A,IMLPRG ; make AOBJN to imtran'd file in core. + .IOT LCO,A + POP P,A + POPJ P, + + + +; load the global maze into imlac over top of dummy one. + +LODMAZ: TRNE FLAGS,ROBBY\LOADED\QUIET + POPJ P, ; don't load if flags disagree. + PUSHAE P,[A,B,C,D] + PUSHJ P,LSTART ; start the load + +; load the block loader + SYSCAL OPEN,[[.BII,,LCI] ? ['DSK,,0] + [SIXBIT /IMLAC/] ? [SIXBIT /BLKLDR/] ? [SIXBIT /IMLAC/]] + JSR QUIT + PUSHJ P,LOAD ; load it + +; fake up LODBUF by munching global maze back into maze-file format. + PUSHJ P,MSETDN + MOVE A,[440700,,LODBUF+100] + MOVEM A,OB + +; IMTRAN the loaded file and output it to imlac + MOVEI A,MAZSIZ ; count of words in block + PUSHJ P,EMIT2 +; set up address + MOVEI A,MAZBEG ; address to load block + PUSHJ P,EMIT4 +; do checksum + MOVE A,[-MAZSIZ,,LODBUF] + PUSHJ P,CHKSUM ; also does fake indirect hack + MOVE D,A ; save checksum +; output good words + MOVE C,[-MAZSIZ,,LODBUF] +DATLUP: MOVE A,(C) ; get a word + PUSHJ P,EMIT4 ; output it + AOBJN C,DATLUP ; and loop +; output checksum + MOVE A,D + PUSHJ P,EMIT4 ; output it + +; output auto-start block + MOVEI A,2 ; two words long + PUSHJ P,EMIT2 + MOVEI A,37713 ; address to load + PUSHJ P,EMIT4 + MOVEI A,113714 ; 3713/ JMP @3714 + PUSHJ P,EMIT4 + MOVEI A,101 ; 3714/ 101 + PUSHJ P,EMIT4 + MOVEI A,114015 ; checksum + PUSHJ P,EMIT4 + +; here to write out block of count and address -1, which indicates +; loading is done + SETO A, + PUSHJ P,EMIT2 ; two chars of count + SETO A, + PUSHJ P,EMIT4 ; four chars of location + +; now output the imtraned file + MOVE A,[-MAZIML,,LODBUF+100] + .IOT LCO,A + .CLOSE LCO, + +; exit from maze loader +LODMAX: POPAE P,[D,C,B,A] + POPJ P, + ; GETMAZ - pulls file defined by SCDIR, SCDEV, SCN1,SCN2 into LODBUF +;and munches into global maze format. + +GETMAZ: PUSH P,A + SYSCAL OPEN,[[.BII,,LCI] ? SCDEV ? SCN1 ? SCN2 ? SCDIR] + JRST POPAJ ; non-skip return if lose. + MOVE A,[-LODSIZ,,LODBUF] + .IOT LCI,A ; ZAP + .CLOSE LCI, + PUSHJ P,MSETUP ; convert into global format + POP P,A + AOS (P) ; skip return if win. + POPJ P, + +; given an alternate maze in LODBUF, we update the global maze in AMAZE +; in this routine. for each word, a one bit is a wall, a zero bit is a hallway. +MSETUP: PUSHAE P,[A,B,C,D] + MOVE B,[-MAZSIZ,,LODBUF] ; aobjn pointer to words + SETZ C, ; offset in AMAZE +; loop through words +MSET1: MOVEI D,100000 ; first bit + MOVE A,(B) ; get a word +; loop through bits +MSET2: SETZM AMAZE(C) ; assume zero + TDNE A,D ; is it? + SETOM AMAZE(C) ; no, make it -1 + AOS C ; move to next word of AMAZE + LSH D,-1 ; next bit mask + JUMPN D,MSET2 ; loop if mask still non-zero + AOBJN B,MSET1 ; loop for next word after mask runs out +; return + POPAE P,[D,C,B,A] + POPJ P, + +; given global maze, reverse MSETUP and form a maze-file formatted buffer +;in LODBUF. +MSETDN: PUSHAE P,[A,B,C,D] + MOVE B,[-MAZSIZ,,LODBUF] + SETZ C, +MSETD1: MOVEI D,100000 + SETZ A, +MSETD2: SKIPGE AMAZE(C) ; test cell in maze + IORI A,(D) ; -1 means filled, set bit in word. + AOJ C, ; increment offset into global maze + LSH D,-1 + JUMPN D,MSETD2 ;loop til 16-bit wd done + MOVEM A,(B) ; store wd in lodbuf + AOBJN B,MSETD1 + POPAE P,[D,C,B,A] + POPJ P, + + ; * IMTRAN UTILITY ROUTINES * + +; emit a character -- right most 4 bits of word +; A/ character +EMIT: IORI A,100 ; make it right sort of ascii + IDPB A,OB + POPJ P, + +; emit 2 characters -- right most 8 bits of word +; A/ 2 characters +EMIT2: PUSH P,B + MOVE B,A + LDB A,[040400,,B] ; get first char + PUSHJ P,EMIT ; output + LDB A,[000400,,B] ; get second char + PUSHJ P,EMIT ; output + POP P,B + POPJ P, + +; emit four characters -- rightmost 16 bits of word +; A/ four characters +EMIT4: PUSHAE P,[B,C,D] + MOVE B,A + MOVE C,[200400,,B] ; abptr + MOVNI D,4 ; count + ; loop through four chars +EMIT4L: ILDB A,C ; get it + PUSHJ P,EMIT ; output it + AOJL D,EMIT4L ; loop til done + POPAE P,[D,C,B] + POPJ P, + +; do checksum on a block +; A/ cptr to block +CHKSUM: PUSHAE P,[B,C] + MOVE B,A + SETZ A, +CHK1: MOVE C,(B) + TLZE C,20 + TRO C,100000 + ANDI C,177777 + MOVEM C,(B) + ADD A,C + CAILE A,177777 + AOS A + ANDI A,177777 + AOBJN B,CHK1 + POPAE P,[C,B] + POPJ P, + ; * COMMAND READER * + +; used to read names of files and such +RCMD: MOVE B,[440700,,COMMND] + MOVEM B,COMPTR + MOVEI C,0 +RCMD1: .IOT TYIC,A + CAIN A,177 + JRST RUB + IDPB A,B + CAML B,[350700,,COMMND+COMLNG-1] + JRST RCFUL + CAIL A,40 + AOJA C,RCMD1 +RCMDX: MOVEI A,0 + IDPB A,B + POPJ P, + +RCFUL: MOVEI A,15 + IDPB A,B + JRST RCMDX + +RUB: SOJL C,RCMD + LDB A,B + .IOT TYOC,A + ADD B,[070000,,] + TLNE B,400000 + ADD B,[347777,,-1] + JRST RCMD1 + +; * PARSE A FILE SPEC READ IN * + +SCNAME: SETZM SCN1 + SETZM SCN2 + SETZM SCDEV + SETZM SCDIR + MOVSI C,-4 +SCNGET: PUSHJ P,GETSYL + CAIN A,': + MOVEM B,SCDEV + CAIN A,'; + MOVEM B,SCDIR + JUMPG A,SCNGET + MOVEM B,SCN1(C) + JUMPL A,SCNX + AOBJN C,SCNGET +SCNX: popj p, + SKIPE A,SCDEV + HLRM A,(D) + SKIPE A,SCN1 + MOVEM A,1(D) + SKIPE A,SCN2 + MOVEM A,2(D) + SKIPN SCDIR + POPJ P, + MOVE A,SCDIR + MOVEM A,3(D) + POPJ P, + ; * parse a syllable from a command line * + +GETSYL: PUSH P,[0] + MOVE B,[440600,,(P)] +GETSLP: PUSHJ P,GETCCA + JUMPE A,GETSX ; no char + CAIN A, + JRST GETQOT + SUBI A,40 + JUMPL A,GETSX + JUMPE A,GETSP + CAIE A,': + CAIN A,'; + JRST GETSX +GETSPT: CAIL A,100 + SUBI A,40 + TLNE B,770000 + IDPB A,B + JRST GETSLP +GETQOT: PUSHJ P,GETCCA + SUBI A,40 + JUMPGE A,GETSPT + JRST GETSX +GETSP: TLNE B,400000 + JRST GETSLP +GETSX: POP P,B + POPJ P, + +; * get a character from command line * +GETCCA: ILDB A,COMPTR + JUMPE A,GETZER + CAIE A,14 + CAIN A,12 + JRST GETCCA + CAIE A,15 + POPJ P, +GETZER: PUSH P,COMPTR + SETZ T, + IDPB T,COMPTR + POP P,COMPTR + POPJ P, + +NAMRED: PUSH P,B + PUSH P,C + SETZ B, + MOVE C,[440600,,B] +NAMRLP: ILDB T,A + CAIL T,40 + CAIN T,"" + JRST NAMEND + CAIGE T,100 + JRST .+3 + SUBI T,40 + JRST .-3 + IDPB T,C + JRST NAMRLP +NAMEND: SKIPE B + MOVEM B,QNAME + POP P,C + POP P,B + POPJ P, + +NAMEX: PUSH P,B + MOVE B,IDSPTR + ADDI B,IOFF + CAMN A,(B) + JRST NAMEXX + AOBJN B,.-2 + AOS -1(P) +NAMEXX: POP P,B + POPJ P, + +IFN STATS,[ +REINIT: PUSHAE P,[A,B,C,D] +REC1: SYSCAL OPEN,[[100000+.BIO,,LCI] ;WRITEOVER MODE + ['DSK,,0] ? [SIXBIT /.TTYS_/] + [SIXBIT /LOADED/] ? [SIXBIT /IMLAC/]] + JRST TRYAGN + SYSCAL FILLEN,[CIMM LCI ? CRTN A] + JRST ENDREC + SYSCAL ACCESS,[CIMM LCI ? A] + JFCL + MOVE D,[440700,,OUTBUF] + .SUSET [.RUNAM,,A] + MOVE C,A + PUSHJ P,OUTSIX + MOVE A,[SIXBIT / /] + PUSHJ P,OUTSIX + .RDATI A, + PUSHJ P,OUTSIX + MOVE A,[SIXBIT / /] + PUSHJ P,OUTSIX + MOVE A,B + PUSHJ P,OUTSIX + MOVE A,[ASCII / +/] + MOVEM A,OUTBUF+6 + MOVE A,[-7,,OUTBUF] + .IOT LCI,A +ENDREC: .CLOSE LCI, + POPAE P,[D,C,B,A] + POPJ P, + +TRYAGN: SYSCAL OPEN,[[.BIO,,LCI] ? ['DSK,,0] ;TRY NON-WRITEOVER + [SIXBIT /.TTYS_/] ? [SIXBIT /LOADED/] + [SIXBIT /IMLAC/]] + JRST ENDREC + .CLOSE LCI, + JRST REC1 + +OUTSIX: PUSH P,B + MOVE B,[440600,,A] + ILDB T,B + ADDI T,40 + IDPB T,D + CAME B,[600,,A] + JRST .-4 + POP P,B + POPJ P, +] +CONSTANTS +VARIABLES + + +; See IMLLEN and IMLPGP and INIT and FLOADR for details of imlac-program residence. +IMLPAG==<.+1777>/2000 ; page # where imlac program gets stored in core + ; (force to page boundary) +IMLPRG==IMLPAG*2000 ; corresponding address + + END START + \ No newline at end of file diff --git a/src/klh/mazwar.44 b/src/klh/mazwar.44 new file mode 100644 index 00000000..24579226 --- /dev/null +++ b/src/klh/mazwar.44 @@ -0,0 +1,3183 @@ +TITLE MAZE.3 GREG THOMPSON (GAT) 04/11/74 +; +; DEFINE IMLAC INSTRUCTION SET +; +.INSRT IMSRC;IMDEFS > +; +; INSTRUCTIONS TO GAME +; +; MAZE +; +; Maze is a experiment in 3 dimensional graphics and intertask +; teleconferencing. It is a hunt and seek game that can involve up to +; eight Imlacs. The Imlac user is placed in a 16 by 32 square maze and +; attempts to hunt down and destroy the other inhabitents of the maze (the +; other Imlac users) before they do the same to him. Each player is +; represented by his uname (1 through 8 characters) as he moves through the +; maze. The various keys that are used to move through the maze and to +; fire are described below. +; +; UP ARROW - Move forward 1 square. +; DOWN ARROW - Back up one square. +; LEFT ARROW - Turn 90 degrees to the left. +; RIGHT ARROW- Turn 90 degrees to the right. +; FUNCTION 4 - Turn 180 degrees around. +; PAGE XMIT - Peek around the corner to the left. +; XMIT - Peek around the corner to the right. +; ESC - Fire. +; CTRL -Z - Exit maze program. +; FORM - Erase dispay buffer. +; FUNCTION 7 - Look at maze from top. +; +; The player enters the maze by typing MAZE to monit or MAZE^k to +; DDT, while at an imlac. The screen will be blank for a minute or two +; while the imlac side of the maze program is loaded after which the player +; is placed in to the maze along with any other players. A letter on the +; top of the screen indicates the direction you are currently facing. The +; unames of the other players are listed on the sides followed their score +; and the number of times they were shot. Anytime a player is shot the +; bell will ring and an "!" will be placed next to the shooting players +; score and an "*" will be placed next to the number of times shot counter +; of the player that was just shot. Holding down the up or down arrow keys +; will cause them to repeat. After a shot is fired the player who is being +; shot at has two seconds to get out of view of the position that the +; shooting player was at at the time he fired the shot. All other +; characters typed are placed in a display buffer at the bottom of all the +; imlac's screen. Holding the Function-7 (or TAB as the case my be) will +; allow you to view your position in the maze from the top. +; The 3 buttons on the mouse and the 5 keyset buttons may be used as +; controls and have the following functions, starting from the left of the +; mouse; peek left, fire, peek right, turn around, turn left, move +; forward, turn right, and move backwards. +; Users may specify their own mazes if they are the first player in a +; maze by giving a file name after "maze to use: ". Just a CR will default +; to the standard maze. User mazes must have a specific format if they are +; to be able to work. They must begin with a LOC 10020 followed by the label +; MAZE: on the first of 32. octal words which form a bit map for the +; maze. The maze must end with LOC 17713, JMP@ .+1, 101, and an END. +; After assembling the maze must be imtraned by using the "IMTRAN" command. +; A muddle function exists for printing out formated source mazes. It is +; initiated by floading "imlac;maze print" in muddle and then issuing +; $ where the output file +; spec defaults to the TTY. An example of a formated source maze is given +; below: +; +; +;.INSRT IMSRC;IMDEFS > +; +; LOC 10020' +; +; MAZE: 177777 ; HERE IS THE 32 WORD MAZE. +; 106401 ; NO FOUR SQUARES MAY BE EMPTY. +; 124675 ; AND SHARE A COMMON CORNER. +; 121205 ; ALL OUTSIDE WALLS MUST BE FILLED IN. +; 132055 ; THIS IS THE DEFAULT MAZE. +; 122741 +; 106415 +; 124161 +; 121405 +; 135775 +; 101005 +; 135365 +; 121205 +; 127261 +; 120205 +; 106765 +; 124405 +; 166575 +; 122005 +; 107735 +; 120001 +; 135575 +; 105005 +; 125365 +; 125225 +; 121265 +; 105005 +; 135375 +; 100201 +; 135675 +; 110041 +; 177777 +; +; END 101' ; AUTO START BACK INTO CONSOLE PROGRAM + + +; Players start in random loctions. + +; The current default maze is: +; +; N O R T H +; +; +; $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ +; $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ +; $$$ $$$$$$ $$$ $$$ +; $$$ $$$$$$ $$$ $$$ +; $$$ $$$ $$$ $$$$$$ $$$$$$$$$$$$ $$$ +; $$$ $$$ $$$ $$$$$$ $$$$$$$$$$$$ $$$ +; $$$ $$$ $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$ $$$ +; $$$ $$$$$$ $$$ $$$ $$$$$$ $$$ +; $$$ $$$$$$ $$$ $$$ $$$$$$ $$$ +; $$$ $$$ $$$ $$$$$$$$$$$$ $$$ +; $$$ $$$ $$$ $$$$$$$$$$$$ $$$ +; $$$ $$$$$$ $$$ $$$$$$ $$$ +; $$$ $$$$$$ $$$ $$$$$$ $$$ +; $$$ $$$ $$$ $$$$$$$$$ $$$ +; $$$ $$$ $$$ $$$$$$$$$ $$$ +; $$$ $$$ $$$$$$ $$$ $$$ +; $$$ $$$ $$$$$$ $$$ $$$ +; $$$ $$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$ $$$ +; $$$ $$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$ $$$ +; $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ +; $$$ $$$$$$$$$ $$$ $$$$$$$$$$$$ $$$ $$$ +; $$$ $$$$$$$$$ $$$ $$$$$$$$$$$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$ $$$ +; W $$$ $$$ $$$$$$$$$ $$$ $$$$$$ $$$ E +; $$$ $$$ $$$$$$$$$ $$$ $$$$$$ $$$ +; E $$$ $$$ $$$ $$$ $$$ A +; $$$ $$$ $$$ $$$ $$$ +; S $$$ $$$$$$ $$$$$$$$$$$$$$$ $$$ $$$ S +; $$$ $$$$$$ $$$$$$$$$$$$$$$ $$$ $$$ +; T $$$ $$$ $$$ $$$ $$$ $$$ T +; $$$ $$$ $$$ $$$ $$$ $$$ +; $$$$$$$$$ $$$$$$ $$$ $$$$$$$$$$$$$$$ $$$ +; $$$$$$$$$ $$$$$$ $$$ $$$$$$$$$$$$$$$ $$$ +; $$$ $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$ +; $$$ $$$$$$$$$$$$$$$$$$ $$$$$$$$$ $$$ +; $$$ $$$$$$$$$$$$$$$$$$ $$$$$$$$$ $$$ +; $$$ $$$ $$$ +; $$$ $$$ $$$ +; $$$ $$$$$$$$$ $$$$$$ $$$$$$$$$$$$$$$ $$$ +; $$$ $$$$$$$$$ $$$$$$ $$$$$$$$$$$$$$$ $$$ +; $$$ $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$$$$$$$$$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$$$$$$$$$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$$$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$$$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ $$$ +; $$$ $$$$$$$$$ $$$ $$$$$$$$$$$$$$$$$$ $$$ +; $$$ $$$$$$$$$ $$$ $$$$$$$$$$$$$$$$$$ $$$ +; $$$ $$$ $$$ +; $$$ $$$ $$$ +; $$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$$$$ $$$ +; $$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$$$$ $$$ +; $$$ $$$ $$$ $$$ +; $$$ $$$ $$$ $$$ +; $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ +; $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ +; +; +; S O U T H + +; MAZE PROTOCOL: MESSAGES ARE SENT TO ALL OTHER IMLACS +; DO NOT SEND TO ORIGINATING IMLAC +; +; 001 -- PLAYER LEAVES GAME +; +; +; 002 -- PLAYER MOVED +; +; +; +; +; +; 003 -- PLAYER DIED +; +; +; +; 004 -- ANNOUNCE NEW PLAYER +; +; <6 CHARS OF ID NAME> +; <2 CHAR # OF HITS WITH 100 BIT ON> (HIGH ORDER 6 BITS THEN LOW ORDER 6 BITS) +; <2 CHAR # OF DEATHS WITH 100 BIT ON> +; +; 014 -- ERASE DISPLAY RING BUFFER +; +; +; IDS MUST BE >= 1 AND <= 8. +; +; ALL INCOMING MESSAGES ARE CHECKED FOR LEGALITY. BAD MESSAGES ARE FLUSHED. +; A NUMBER IN THE STATUS LINE INDICATES THE NUMBER OF BAD MESSAGES RECIEVED. +; INFORMATION CONCERNING THE LAST BAD MESSAGE RECIEVED IS SAVED FOR LATER EVALUATION. +; +; ALL CHARACTERS SUBROUTINES AND THE DJMS TABLE IS UP IN THE CONSOLE PROGRAM (SSV). +; THE DJMS TABLE IS ACCESSED THROUGH LOCATION 24 OCTAL WHICH STARTS WITH THE ENTRY +; FOR OCTAL CODE 40 (SPACE). +; +; ANY CHARACTERS TYPED ON CONSOLE (>014') ARE SENT TO PDP-10 AND SHOULD +; BE ECHOED TO ALL! CONSOLES INCLUDING THE ORIGINATOR. +; +; ANY OTHER CHARACTERS RECEIVED BY IMLAC ARE DISPLAYED IN A +; RING BUFFER AT THE BOTTOM OF THE PICTURE. +; +; THE FIRST ANNOUNCE NEW PLAYER MESSAGE THE IMLAC RECIEVES DEFINES ITS ID. +; +; THIS VERSION REQUIRES A GRAPHICS IMLAC WITH LONG VECTOR HARDWARE +; MULTI-LEVEL SUBROUTINING, AND 8K DISPLAY ADDRESSING MOD. +; +; THE MESSAGE SWITCHING PROGRAM ON THE 10 MUST ALSO KEEP TRACK +; OF THE CURRENT SCORES OF ALL THE PLAYERS SO WHEN A NEW PLAYER +; JOINS INTO A ALREADY EXISTING GAME HE MAY RECIEVE THE CURRECT +; SCORES OF ALL THE PLAYERS. +; +; WHEN AN IMLAC WANTS TO JOIN AN EXISTING MAZE THE FOLLOWING OCCURS: +; 1) THE MAZE PROGRAM IS LOADED INTO HIS IMLAC. +; 2) THE CURRENT MAZE IS LOADED ON TOP OF THE DEFAULT MAZE +; IF THE DEFAULT MAZE IS NOT BEING USED. +; 3) A TYPE 4 MESSAGE IS SENT TO ALL IMLACS ANOUNCING THE +; NEW IMLAC. THE NEW IMLAC GETS HIS ID FROM THIS MESSAGE. +; 4) TYPE 4 MESSAGES FOR ALL THE OTHER PLAYERS ARE SENT TO +; THE NEW IMLAC. +; +; +; WRITTEN BY: +; +; STEVE COLLEY CAL TECH ORIGINAL IDEA OF MAZE, STAND-ALONE MAZE +; & CRUDE MULTIPLE PLAYERS +; GREG THOMPSON M.I.T. FULL MULTIPLE PLAYERS ADDITIONS +; P. D. LEBLING M.I.T. PDP-10 MESSAGE SWITCHER AND ROBOTS +; HOWARD PALMER STANFORD ORIGINAL IDEA & STAND-ALONE VERSION OF MAZE +; +; further munged by KLH/CBF for fast new protocol. + +EXPUNGE MOVE,PTR,EXP ; To keep midas from barfing "RES" at use of these syms in prg. +FAST==1 ; to assemble fast-protocol version. +cheat==0 ;conditional to assemble cheater stuffs + +.mllit==1 + + LOC 10000' + +RADIX 8. +.ADDR.=1 + + JMP START ; STARTING POINT + JMP RESTART ; RESTARTING ENTRY POINT + JMP LEAVE ; ENTRY TO RETURN TO SSV (ON ERROR) + JMP RETN ; REENTER MAZE MAIN LOOP + + LOC 10020' + +MAZE: 177777 ; HERE IS THE 32 WORD MAZE + 106401 ; NO FOUR SQUARES MAY BE EMPTY + 124675 ; AND SHARE A COMMON CORNER + 121205 ; ALL OUTSIDE WALLS MUST BE FILLED IN + 132055 + 122741 + 106415 + 124161 + 121405 + 135775 + 101005 + 135365 + 121205 + 127261 + 120205 + 106765 + 124405 + 166575 + 122005 + 107735 + 120001 + 135575 + 105005 + 125365 + 125225 + 121265 + 105005 + 135375 + 100201 + 135675 + 110041 + 177777 + +; DSTAT, DX, DY, DIR IS MY POSITION AND POINT INTO INFO TABLE + +DSTAT: 0 ; STATUS FLAG +DX: 0 ; X POSITION OF THIS IMLAC +DY: 0 ; Y POSITION OF THIS IMLAC + ; START OUT BIG SO WE WON'T SHOW UP ON MAP +DIR: 0 ; DIRECTION HE IS POINTING + ; BITS 14 AND 15 HAVE MEANING + ; BIT 14 BIT 15 + ; 0 0 NORTH + ; 0 1 EAST + ; 1 0 SOUTH + ; 1 1 WEST +DPTR=10' ; INDEX LOC 10 USED AS POINTER +VISPT=11' +VISPT2=12' +VISPT3=13' +VISPT4=14' +VISPT5=15' + ; INDEX LOCATION 16' AND 17' USED BY INTERUPT ROUTINE +NEXTBIT:0 +ETEM: 0 +WPTR: 0 +WPTR2: 0 +CNT: 0 ; COUNTERS +CNT2: 0 +KILL: 0 ; LAST PLAYER KILLED BY THIS IMLAC +PTR4: 0 ; POINTERS +PTR3: 0 +PTR2: 0 +PTR: 0 +XDELTA: 0 +YDELTA: 0 +BEAMBIT:0 +LASTRIG:0 +LASTLEF:0 +HALLNGTH:0 +MYREAL: 0 ; THE REAL ID OF THIS IMLAC +MYBIT: 0 ; THE ID OF THIS IMLAC +mybit1: 0 ; MYBIT-1 (normalize to 0-7) +IID: 0 ; TEMPORARY IMLAC ID USED FOR SEE ROUTINE +MPTR: 0 +BIT: 0 +KEY: 0 ; LAST KEY READ IN +HOME: 1372' ; CTRL Z [EXITS PROGRAM] +BACKUP: 204' ; DOWN ARROW (BACKUP ONE SQUARE) +RTURN: 205' ; RIGHT ARROW (TURN 90 DEGREES RIGHT) +MOVE: 206' ; UP ARROW (MOVE FORWARD ONE SQUARE) +LTURN: 210' ; LEFT ARROW (TURN 90 DEGREES LEFT) +TURNA: 234' ; FUNCTION 4 (TURN 180 DEGREES AROUND) +TEM1: 0 ; TEMPORARYS +TEM2: 0 +TEM3: 0 +PEEKR: 202' ; XMIT (PEEK TO THE RIGHT) +FIRE: 233' ; ESC (FIRE) +PEEKL: 216' ; PAGE XMIT (PEEK TO THE LEFT) +ERING: 214' ; FORM (ERASE RING BUFFER) +TOPVW: 211' ; TAB (GET A TOP VIEW OF MAZE) +KEYSET: 0 ; LAST VALUE FROM KEYSET +KSCNT: 0 ; KEYSET REPEAT COUNTER +TOPSW: -1 ; INDICATES WHETHER A TOP OR INSIDE VIEW +ifn fast,[ +relcnt: 0 ;counter of rel positions between abs +] + SUBTTL Start of game + +; START OF GAME + +START: IOF ; DISABLE ANY INTERUPTS + CLA + DAC ICNT ; SET NO MESSAGE PENDING + DAC MYBIT ; INDICATE WE HAVE NO ID + MSW ; SET INITIAL KEYSET VALUE + DAC KEYSET + LAC [7776'] ; LIMIT SSV'S DISPLAY LIST + DAC@ [25'] + JMS ERASE ; RESET RING BUFFER + LAC [MESAGE-1] ; SET UP YOU WERE SHOT MESSAGE + DAC 11' + LAC [YWSB-1] + DAC 12' + LWC 17. + DAC CNT2 +SETUPN: LAC@ 12' + JMS GETCHR + DAC@ 11' + ISZ CNT2 + JMP SETUPN + +; NOW WAIT FOR OUR ID + + JMS CHARIN + LAC MYBIT ; WAIT FOR IDENTIFIER MESSAGE TO COME IN + ASN ; HAS IT BEEN SET YET? + JMP .-3 ; NO, KEEP WAITING + STA + DAC TOPSW ; DISPLAY TOP VIEW + +; PLACE PLAYER IN MAZE + +RESTART:KCF ; RESET KEYBOARD +RESET1: JMS RANDOM + AND [17'] + DAC@ DX + JMS RANDOM + AND [37'] + DAC@ DY + JMS PNTBIT + LAC@ MPTR + AND BIT + ASZ + JMP RESET1 + JMS RANDOM + AND [3] + DAC@ DIR + LAC [AD1] ; RESET TO MAIN SCREEN + DAC WHICHD +ifn fast,[ + cla + dac relcnt ; force abs. position out first thing. +] + JMP RETN4 + +RETN2: CLA ; LOOK FROM INSIDE MAZE + DAC TOPSW +; +; SEND NEW POSITION TO 10 +; +RETN4: STA ; SET TO PLAYING STATUS + DAC@ DSTAT + JMS PRINT ; BUILD CURRENT DISPLAY +ife fast,[ + jms absmsg ; send out absolute position + jmp retn +] +ifn fast,[ + lac relcnt + asm ; if GE 0, something wants an abs pos sent out. + jms absmsg ; sigh, send absolute + jmp retn ; and continue + + +relmsg: 0 + ior mybit1 + jms send1 + isz relcnt + nop + jmp@ relmsg + +] ;end of ifn fast + +; Send new absolute position +absmsg: 0 +ifn fast,[ + lwc 20 ;number of rel messages before an abs + dac relcnt ;set counter +] + LAW 2 ; SEND MOVED MESSAGE CODE + JMS SEND1 + LAC MYBIT ; SEND MY ID + JMS SEND1 + LAC@ DIR ; SEND NEW DIRECTION + AND [3] ; SEND ONLY LOWER 2 BITS! + IOR [100'] + JMS SEND1 + LAC@ DX ; SEND NEW X LOCATION + IOR [100'] + JMS SEND1 + LAC@ DY ; SEND NEW Y LOCATION + IOR [100'] + JMS SEND1 + jmp@ absmsg ;return + SUBTTL Main Loop +; MAIN LOOP + +RETN: JMS CHARIN ; GET STUFF FROM TEN + JMS DISP ; MAINTAIN DISPLAY +RETN3: KSF ; NO, IS THERE A KEY DOWN? + JMP KSCHK ; NO, NOW CHECK KEYSET + CAL ; YES, READ THE KEY + KRC + DAC KEY + LWC 8. ; SET UP TO REPT KEY (TIME BEFORE START REPEATING) + DAC REPTCNT +REPT: LAC KEY +KEYREPT:SAM HOME ; IS IT CTRL-Z? + JMP KEYCHK + LAC MYBIT ; REMOVE ME FROM MAZE + DAC ININFO + JMP GONER + +; CHECK KEYSET + +KSCHK: CLA + MSW + SAM KEYSET ; HAS IT CHANGED? + JMP .+2 ; YES, SO DO SOMETHING ABOUT IT + JMP RETN ; NO, RE-ENTER MAIN LOOP + DAC KEYSET ; SAVE NEW VALUE + LWC 15. ; SET UP TO REPEAT + DAC KSCNT +KSREPT: LAC [BACKUP] ; NOW FIGURE WHICH KEY TO SIMULATE + DAC PTR + LAC KEYSET + IOR [174340'] ; TURN ON BITS TO IGNORE + CMA\CLL + ASN + JMP RETN + RAR 1 + LSZ + JMP GOTIT + XAM PTR + IAC + XAM PTR + JMP .-6 +GOTIT: LAC@ PTR ; GET APPROPRIATE KEY + DAC KEY + JMP KEYREPT + +; SEE IF WE ARE BLOWING UP + +KEYCHK: LAC BIGEXP ; IF SO THEN IGNORE KEYS + ASZ + JMP RETN ; YES, SO WAIT IT OUT + +; CHECK FOR VARIOUS KEYBOARD COMMANDS + +KEY1: LAC KEY + SAM RTURN ; TURN RIGHT? + JMP KEY2 + ISZ@ DIR + NOP +ifn fast,[ + lac [20'] ; new protocol for right turn + jms relmsg +] + JMP RETN2 +KEY2: SAM LTURN ; LEFT TURN? + JMP KEY3 + LAC@ DIR + SUB [1] + DAC@ DIR +ifn fast,[ + lac [30'] ; new protocol for left turn + jms relmsg +] + JMP RETN2 +KEY3: SAM MOVE ; MOVE FORWARD? + JMP KEY4 + JMS MOVER + JMP RETN +ifn fast,[ + lac [150'] ; new protocol for move forward + jms relmsg +] + JMP RETN2 +KEY4: SAM PEEKL ; PEEK LEFT? + JMP KEY5 + JMS MOVER + JMP RETN + LAC@ DIR + SUB [1] + DAC@ DIR + JMS HOLD + LAC@ DIR + SUB [1] + DAC@ DIR +PEEKER: JMS MOVER + JMP RETN + JMS ADIR2 + JMP RETN2 +KEY5: SAM PEEKR ; PEEK RIGHT? + JMP KEY6 + JMS MOVER + JMP RETN + ISZ@ DIR + NOP + JMS HOLD + ISZ@ DIR + NOP + JMP PEEKER +KEY6: SAM TURNA ; TURN AROUND? + JMP KEY7 + JMS ADIR2 +ifn fast,[ + lac [140'] ; new protocol for turn-around + jms relmsg +] + JMP RETN2 +KEY7: SAM BACKUP ; BACK UP? + JMP KEY8 + JMS ADIR2 + JMS MOVER + JMP key7np + JMS ADIR2 +ifn fast,[ + lac [160'] ; new protocol for move backwards. + jms relmsg +] + JMP RETN2 +key7np: JMS ADIR2 ; Can't move backwards, restore direction. + JMP RETN + +ADIR2: 0 + LAC@ DIR + ADD [2] + DAC@ DIR + JMP@ ADIR2 + +KEY8: SAM FIRE ; FIRE? + JMP KEY9 + +; LOOK FOR VISIBLE OPPONENT TO SHOOT AT + + LAC [THING+4] ; SET DISPLAY LIST POINTER + DAC PTR + LWC 8. ; 8 POSSIBLE IMLACS + DAC CNT2 + LAC [IM1+4] ; SET INFO TABLE POINTER + DAC VISPT + IAC + DAC PTR2 +CHKNEXT:LAC@ PTR ; GET DISPLAY BODY + SAM [DNOP] ; IS HE VISIBLE? + JMP NOTDNOP +NOTHIM: LAC VISPT ; NO, BUMP POINTERS TO NEXT PLAYER + ADD [11.] +BUMPTRS:DAC VISPT + IAC + DAC PTR2 + LAC PTR + ADD [6] + DAC PTR + ISZ CNT2 ; DID WE CHECK THEM ALL + JMP CHKNEXT ; NO + JMP RETN ; YES, RETURN +NOTDNOP:SAM JMSEXP ; COULD HE ALREADY BE EXPLODING? + JMP FOUNONE ; NO, SO WE FOUND A OPPONENT TO SHOOT AT + JMP NOTHIM ; YES, SO DON'T FIRE AT HIM +FOUNONE:LAC@ PTR2 ; ARE WE ALREADY FIRING ON THIS GUY? + ASZ ; IF SO THEN DON'T FIRE AGAIN + JMP NOTHIM + LWC 80. ; SET 2 SECOND DELAY TO ALLOW PLAYER TO DODGE IT + DAC@ VISPT + LAC@ DIR + DAC@ VISPT + LAC@ DX ; SAVE OUR LOCATION + DAC@ VISPT + LAC@ DY + DAC@ VISPT + LAC VISPT ; NOW CHECK NEXT PLAYER + ADD [7] + JMP BUMPTRS +; +; DOES HE WANT SCREEN ERASED? +; +KEY9: SAM ERING + JMP VIEWTOP ; NO + JMS ERASE ; YES, SO ERASE IT + JMP RETN ; THEN RETURN TO MAIN LOOP +; +; +; LOOK AT MAZE FROM TOP +; +VIEWTOP:SAM TOPVW ; LOOK AT MAZE FROM TOP? +ife cheat, jmp sendit +ifn cheat, JMP CHNGP + STA ; YES, SET FLAG FOR TOP VIEW + DAC TOPSW + JMS PRINT ; AND BUILD DISPLAY +VTWAIT: JMS CHARIN + JMS DISP + CAL + KRB + SAM TOPVW ; DISPLAY TOP VIEW AS LONG + JMP .+2 ; AS KEY IS HELD DOWN + JMP VTWAIT + CLA ; LOOK INSIDE AGAIN + DAC TOPSW + JMS PRINT + JMP RETN + +ifn cheat,[ +; +; SECRET ID SWITCHING KEYS +; +; CTRL-REPT 0 TO : +; 0 RETURN TO ORIGINAL ID +; N CHANGES TO ID N +; : COMPLEMENT FORWARD SQUARE +; +CHNGP: SUB [3260'] + ASP + JMP SENDIT + SAM [10.] ; CTRL-REPT : ? + JMP .+2 ; NO + JMP ZAP ; YES + ASN ; CTRL-REPEAT 0? + LAC MYREAL ; IF SO GET MY REAL ID + SUB [9.] + ASM + JMP RETN + ADD [9.] + DAC TEM1 + SAL 3 + ADD [IML1-8.] ; SEE IF THIS PLAYER IS PLAYING + DAC TEM2 ; BY SEEING IF HIS NAME EXISTS + LAC [DJMS D040,] + SAM@ TEM2 + JMP .+2 + JMP RETN + LAC TEM1 + JMS GETD ; CHANGE US TO NEW ID + JMS PRINT ; DISPLAY NEW VIEW + JMP RETN +ZAP: JMS MOV ; SET UP PTRS TO NEXT SQUARE + LAC@ MPTR ; NOW FLIP BIT + XOR BIT + DAC@ MPTR + JMS PRINT ; REBUILD DISPLAY + JMP RETN +] ;end of ifn cheat. + +; SEND OTHER CHARACTERS TO 10 +; +SENDIT: +ifn cheat, ADD [3260'] + AND [177'] + SAM [15'] ; CR? + JMP .+2 + JMP SENDOK + SUB [40'] ; CONTROL CODE? + ASP + JMP RETN ; YES, SO IGNORE IT + sub [100'] ;it's a 40-177 char, see if it's 140-177 + asp + add [40'] ;no, it's 40-137, get char back. + add [100'] ;yes, 140-177. make it uppercase. + +SENDOK: JMS SEND1 ; NOW SEND IT TO 10. char is either 40-137 or 15. + JMP RETN +; +; HOLD A POSITION FOR AS LONG AS THE SAME KEY IS HELD DOWN +; +HOLD: 0 + JMS PRINT ; UPDATE DISPLAY +HOLD1: JMS CHARIN ; GET STUFF FROM TEN + JMS DISP ; MAINTAIN DISPLAY + CAL + KRB + SAM KEY ; IS THE SAME KEY DOWN? + JMP TSTKS ; NO, TEST KEY SET FOR KEY STILL DOWN + JMP HOLD1 ; YES, HOLD THIS LOCATION +TSTKS: CLA + MSW + ASN ; DO WE HAVE THE HARDWARE? + JMP@ HOLD ; NO, JUST RETURN + AND [2400'] ; IF EITHER PEEK LEFT OR RIGHT STILL + XOR [2400'] + ASZ ; DOWN THEN HOLD POSITION + JMP HOLD1 + JMP@ HOLD ; RETURN +; +; POINT MPTR TO APPROPRIATE WORD MAZE (Y) +; AND BIT TO APPROPRIATE BIT IN WORD FOR OUR +; CURRENT LOCATION +; +PNTBIT: 0 + LAC [MAZE] + ADD@ DY + DAC MPTR + LAC@ DX + ASZ + JMP PNT1 + LAC [100000'] + JMP PNT2 +PNT1: CIA + DAC CNT + CLL + LAC [100000'] + RAR 1 + ISZ CNT + JMP .-2 +PNT2: DAC BIT + JMP@ PNTBIT +; +; MOVE FORWARD ONE SQUARE +; +MOV: 0 + CLA ; CLEAR OUT INCREMENTS + DAC TEM1 ; Y INCREMENT + DAC TEM2 ; X INCREMENT + JMS PNTBIT ; POSITION TO CURRENT POSITION + LAC@ DIR ; SEE WHICH DIRECTION WE ARE HEADING + AND [1] + ASZ + JMP MOVEWE + JMS CREMENT ; MOVE NORTH OR SOUTH + DAC TEM1 + ADD MPTR + DAC MPTR + JMP@ MOV ; RETURN +MOVEWE: JMS CREMENT ; MOVE WEST OR EAST + AND [20'] + IOR [RAL 1] + DAC NOPER + LAC BIT + CLL +NOPER: NOP + DAC BIT + JMS CREMENT + CIA + DAC TEM2 ; SET X INCREMENT + JMP@ MOV +MOVER: 0 + JMS MOV ; MOVE FORWARDS ONE SQUARE + LAC@ MPTR ; SEE IF IT IS A WALL + AND BIT + ASZ + JMP@ MOVER ; A OPEN SQUARE + LAC TEM2 ; UPDATE X TO THIS SQUARE + ADD@ DX + DAC@ DX + LAC TEM1 ; UPDATE Y + ADD@ DY + DAC@ DY + ISZ MOVER ; AND INDICATE WE MOVED BY SKIPPING + JMP@ MOVER +; +; RETURN 1 OR -1 ACCORDING TO WHICH DIRECTION WE ARE HEADING +; +CREMENT: 0 + LAC@ DIR + SAR 1 + AND [1] + ASN + LAC [-1] + JMP@ CREMENT + +; REFRESHING ROUTINE + +REFR: 0 + DSF + SSF + JMP@ REFR + SCF + LAC WHICHD ; GET APPROPRIATE DISPLAY LIST ADDRESS + DLA + DON + STA ; INDICATE 40 CYCLE SYNC + DAC SYNC + JMP@ REFR +WHICHD: AD1 ; CONTAINS ADDRESS OF CURRENT DISPLAY +SYNC: 0 ; 40 CYCLE SYNC FLAG +BIGEXP: 0 ; OUR EXPLOSION COUNTER +JMSEXP: DJMS EXPLOSIN +EXP: DDSP + DDSP + DDSP +INC1: DDSP +INC2: DDSP +INC3: DDSP + DRJM +EXPLOSIN:DLXA 1000 + DJMS WAIT + DSTS 3 + INC E,D03 + INC D03,100' + DJMS EXP + INC E,D00 +INC4: INC D00,D00 + INC 100',100' + DJMS EXP + INC E,D00 +INC5: INC D00,D00 +INC6: INC D00,D00 + INC 100',100' + DJMP EXP + +; KEEP DISPLAY AND TIMED OCCURANCES RUNNING +; +DISP: 0 + JMS REFR ; KEEP UP DISPLAY + LAC SYNC ; HAS THE 40 CYCLE SYNC OCCURED YET? + ASM + JMP@ DISP ; NO, JUST RETURN + CLA ; YES, RESET IT + DAC SYNC +; +; CHECK FOR OUR BLOWING UP +; + LAC BIGEXP ; ARE WE BLOWING UP? + ASN + JMP CHKOPP ; NO + ISZ BIGEXP ; IS IT FINSHED? + JMP UPDTBIG ; NO, UPDATE IT + JMP RESTART ; YES, NOW RESTART THE IMLAC +; +; UPDATE 4 POINTERS +; +BUMPPTS:0 + LAC VISPT2 + ADD [5] + DAC VISPT2 + LAC VISPT3 + ADD [5] + DAC VISPT3 + LAC VISPT4 + ADD [5] + DAC VISPT4 + LAC VISPT5 + ADD [5] + DAC VISPT5 + JMP@ BUMPPTS +; +; UPDATE A DLXA OR DLYA +; +UPDTSUB:0 + LAC@ VISPT2 ; GET OLD DLXA OR DLYA + ADD@ VISPT ; ADD IN INCREMENT + AND [1777'] ; MASK TO POSITION BITS + DAC TEM2 ; SAVE NEW POSITION + LAC@ VISPT3 ; GET OLD DLXA OR DLYA AGAIN + AND [30000'] ; GET DLXA OR DLYA OPCODE BIT + IOR TEM2 ; OR IN POSITION + DAC@ VISPT4 ; STORE IT BACK ON TOP OF OLD DLXA OR DLYA + JMP@ UPDTSUB ; RETURN + +; UPDATE OUR EXPLOSION ROUTINE +; +UPDTBIG:LWC 8. ; EIGHT PIECES TO UPDATE + DAC CNT ; SET COUNTER + LAC [BIGX1INC-1] ; SET POINTER TO UPDATE LIST + DAC VISPT + LAC [BIGX1-1] ; SET POINTERS TO DISPLAY LIST + DAC VISPT2 + DAC VISPT3 + DAC VISPT4 +UPDTLOOP:JMS UPDTSUB ; UPDATE X + JMS UPDTSUB ; UPDATE Y + JMS BUMPPTS ; UPDATE POINTERS + ISZ CNT ; HAVE I DONE ALL 8 BITS? + JMP UPDTLOOP ; NO, DO NEXT ONE +; YES, FALL THROUGH +; OPPONENTS EXPLOSION ROUTINE +; +CHKOPP: LAC [THING-2] ; CHECK EXPLOSION TIMERS + DAC PTR + LAC [IM1-2] + DAC PTR2 + LWC 9. + DAC CNT2 +OPPBUMP:LAC PTR + ADD [6.] + DAC PTR + LAC PTR2 + ADD [11.] + DAC PTR2 + SUB [9.] + DAC PTR3 + ISZ CNT2 + JMP OPPLOOP + JMP UPDATE +OPPLOOP:LAC@ PTR2 ; SEE IF THERE IS AN EXPLOSION ON THIS PLAYER + ASN + JMP OPPBUMP + ISZ@ PTR2 ; YES, BUT HAS IT RUN OUT? + JMP OPPBUMP + CLA + DAC@ PTR3 ; YES, SO INDICATE PLAYER UNACTIVE + LAC [DNOP] + DAC@ PTR ; TURN HIS EXPLOSION OFF + JMP OPPBUMP +; +; KEEP UPDATEING RANDOM EXPLOSION +; +UPDATE: JMS RANDOM ; UPDATE EXPLOSION (GET RANDOM NUMBER) + AND [77'] + DAC TEM1 + IOR [INC E,B00] + DAC INC1 + AND [77'] + SAL 3 + SAL 3 + SAL 2 + DAC TEM2 + ADD TEM1 + XOR [INC 344,344] + DAC INC2 + LAC TEM2 + IOR [INC B00,100'] + DAC INC3 + JMS RANDOM + AND [77'] + DAC TEM1 + SAL 3 + SAL 3 + SAL 2 + IOR TEM1 + IOR [140300'] + DAC INC4 + XOR [22044'] + DAC INC5 + DAC INC6 + +; CHECK FOR BULLET FIRED AND IF IT HITS ITS MARK +; +CHKBULL:LAC [THING+3] + DAC PTR2 + IAC + DAC PTR3 + LAC [IM1+5] + DAC PTR + SUB [5] + DAC SEEPT + LWC 8. ; 8 IMLACS TO CHECK + DAC CNT2 +DISP1: LAC@ PTR + ASZ + JMP DISP2 +DISPNO: LAW 11. + ADD PTR + DAC PTR + SUB [5] + DAC SEEPT + LAW 6 + ADD PTR2 + DAC PTR2 + IAC + DAC PTR3 + ISZ CNT2 + JMP DISP1 +; +; NOW CHECK FOR REPTING KEYS +; + LAC REPTCNT ; REPT ON? + ASN + JMP CHKKS ; NO, BUT CHECK FOR KEYSET REPEAT + ISZ REPTCNT + JMP CHKKS + CLA + KRB + SAM KEY + JMP CHKKS + SAM MOVE ; ONLY REPEAT : MOVE FORWARDS? + JMP .+2 + JMP .+3 + SAM BACKUP ; MOVE BACKWARDS? + JMP CHKKS + LWC 3. + DAC REPTCNT + JMP REPT ; DO KEY AGAIN +REPTCNT:0 +CHKKS: LAC KSCNT ; KEYSET REPT ON? + ASN + JMP@ DISP ; NO, SO RETURN + ISZ KSCNT + JMP@ DISP + CLA + MSW + SAM KEYSET ; IS IT THE SAME?? + JMP@ DISP + SAM [3433'] ; MOVE FORWARDS? + JMP .+2 + JMP .+3 + SAM [3436'] ; MOVE BACKWARDS? + JMP@ DISP + LWC 3. + DAC KSCNT + JMP KSREPT +; +; IF THERE IS STILL A PLAYER VISIBLE THEN KILL IT +; +DISP2: ISZ@ PTR ; IS IT TOTALLY FIRED YET? + JMP DISPNO + LAC@ SEEPT ; IS HE STILL ALIVE + ASM + JMP DISPNO + ISZ PTR + LAC@ PTR ; GET OUR OLD DIRECTION + AND [3] + DAC@ [SAVEDIR] + ISZ PTR + LAC@ PTR ; GET OUR OLD X + DAC@ [SAVEDX] + ISZ PTR + LAC@ PTR ; GET OUR OLD Y + DAC@ [SAVEDY] + LAC PTR ; RESET POINTER + SUB [3] + DAC PTR + SUB [5] + DAC PTR4 ; SET UP POINTER FOR SEE ROUTINE + LAW 9. + ADD CNT2 + DAC KILL + DAC IID + JMS@ [SEE] ; SEE IF PLAYER HASN'T MOVED OUT OF THE WAY + JMP DISPNO ; HE MADE IT IN TIME + COA ; NO, SO SHOOT HIM DOWN + DAC@ PTR4 ; INDICATE THAT HE IS NOW DYING + LAW 3 ; SEND PLAYER KILLED MESSAGE + JMS SEND1 + LAC MYBIT ; SEND MY ID + JMS SEND1 + LAC KILL ; SEND ID OF PLAYER KILLED + JMS SEND1 + LAC [DNOP] + DAC@ PTR2 ; TURN OFF EYES + LAC JMSEXP ; PUT IN EXPLOSION IN PLACE OF ID + DAC@ PTR3 + LAC PTR4 ; POINT TO EXPLOSION COUNT + ADD [9.] + DAC PTR4 + LWC 60. ; SET EXPLOSION TO LAST 1 1/2 SEC. + DAC@ PTR4 + LAC MYBIT ; BUMP OUR SCORE + JMS UPSCORE + JMP DISPNO + +; SEND A WORD TO THE 10 +; +SEND1: 0 + DAC TEM1 ; SAVE CHARACTER + JMS REFR ; KEEP DISPLAY UP + TSF ; WAIT FOR OUTPUT FLAG + JMP .-2 ; NOT READY YET + LAC TEM1 ; GET CHARACTER BACK + TPC ; TRANSMIT CHARACTER + LAC TEM1 + JMP@ SEND1 ; RETURN +; +; RANDOM NUMBER GENERATOR +; +RANDOM: 0 + lac rnd + add mybit + ral 2 + dac rnd + xor@ rnd + dac rnd + jmp@ random +RND: 0 + + +; UPDATE SCORE IN INFO TABLES AND IN DISPLAY LIST +; ENTER WITH ID IN AC + +UPSCORE:0 + DAC SAVEID ; SAVE ID + LWC 8. ; NOW TURN ALL ! AND  * OFF + DAC UPCNT + LAC [SCORE+3] + DAC PTSCORE +CLRALL: LAC [DNOP] + DAC@ PTSCORE + LAW 5 + ADD PTSCORE + DAC PTSCORE + LAC [DNOP] + DAC@ PTSCORE + LAW 9. + ADD PTSCORE + DAC PTSCORE + ISZ UPCNT + JMP CLRALL + LAC SAVEID ; NOW BUMP SHOOTING PLAYERS SCORE + JMS POSITION ; POSITION US TO CORRECT TABLE + LAC ITEMP1 ; BUMP POINTER TO COUNT + ADD [4] + DAC ITEMP1 + ISZ@ ITEMP1 ; BUMP SCORE BY ONE + NOP + LAC SAVEID ; POINT TO SHOOTING PLAYERS SCORE IN DISPLAY + JMS POINTSC + JMS SCOREIT + LAW 41' ; INSERT EXCLAMATION MARK + JMS GETCHR + DAC@ PTSCORE + LAC KILL ; NOW DO SHOT PLAYER SHOT COUNT + JMS POSITION + ADD [10.] + DAC ITEMP1 + ISZ@ ITEMP1 ; BUMP IT ALSO + NOP + LAC KILL ; NEXT UPDATE THE SHOT COUNT IN DISPLAY + JMS POINTSC + ADD [5] + DAC PTSCORE + JMS SCOREIT + LAW 52' ; INSERT ASTERIC + JMS GETCHR + DAC@ PTSCORE + BEL ; RING BELL INDICATING PLAYER SHOT + JMP@ UPSCORE ; RETURN +POINTSC:0 + CIA + DAC UPCNT + LAC [SCORE-14.] ; POINT TO DISPLAY LIST TO UPDATE SCORE + ADD [14.] + ISZ UPCNT + JMP .-2 + DAC PTSCORE + JMP@ POINTSC +; +; SCORE GENERATOR SUBROUTINE +; ENTER WITH ITEMP1 -> SCORE TO BE CONVERTED +; PTSCORE -> 3 WORDS WHERE DJMSES ARE TO BE PLACED +; LEAVE WITH PTSCORE -> WORD 4 (ONE PAST THE 3 DJMSES) +; +SCOREIT:0 + CLA + DAC HUNDR + DAC TENS + DAC ONES + LAC@ ITEMP1 ; GET CURRENT SCORE + SUB [1000.] ; MAKE IT MOD 1000 + ASM + JMP .-2 + ADD [1000.] + DAC@ ITEMP1 ; STORE IT BACK FOR POSTERITY + SUB [100.] + ASP + JMP DOTENS + ISZ HUNDR + JMP .-4 +DOTENS: ADD [100.] + SUB [10.] + ASP + JMP DOONES + ISZ TENS + JMP .-4 +DOONES: ADD [10.] + DAC ONES + LAC HUNDR + ASN + JMP ZROSUP + JMS DODIGIT + LAC TENS +DTENS: JMS DODIGIT + LAC ONES + JMS DODIGIT + JMP@ SCOREIT +ZROSUP: LWC 20' + JMS DODIGIT + LAC TENS + ASN + LWC 20' + JMP DTENS +DODIGIT:0 + ADD [60'-40'] + ADD@ [24'] + DAC UPCNT + LAC@ UPCNT +DACIT: DAC@ PTSCORE + ISZ PTSCORE + JMP@ DODIGIT +SAVEID: 0 +PTSCORE:0 +UPCNT: 0 +ONES: 0 +TENS: 0 +HUNDR: 0 + +; BUILD A LONG VECTOR INSTRUCTION +; +LV: 0 + LAC XDELTA + AND [40000'] + DAC TEM3 + LAC XDELTA + ASP + CIA + DAC XDELTA + LAC YDELTA + AND [20000'] + IOR TEM3 + DAC TEM3 + LAC YDELTA + ASP + CIA + DAC YDELTA + SUB XDELTA + ASM + JMP LV1 + AND [7777'] + IOR [40000'] + DAC@ DPTR + LAC XDELTA + IOR BEAMBIT + DAC@ DPTR + LAC YDELTA + JMP LV2 +LV1: CIA + AND [7777'] + IOR [40000'] + DAC@ DPTR + LAC YDELTA + IOR BEAMBIT + DAC@ DPTR + LAC XDELTA + IOR [10000'] +LV2: IOR TEM3 + DAC@ DPTR + JMP@ LV + +; GENERATE NEW DISPLAY +; SEND I MOVED MESSAGE TO 10 +; SET UP POSSIBLE VISIBLE OPPONENTS + +PRINT: 0 + LAC@ DSTAT ; CHECK STATUS OF PLAYER + ASZ ; IS HE NOT PLAYING? + JMP INGAME ; NO + LAW 116' ; YES, DISPLAY A "N" THEN + JMP SETST +HEACT: LAC [DJMS D040,] ; IF HE IS ACTIVE THEN DON'T DISPLAY ANYTHING + JMP SETST2 +INGAME: ASP ; IS HE DYING? + JMP HEACT ; NO, THEN HE IS ACTIVE! + LAW 104' ; YES, THEN DISPLAY A "D" FOR DEAD +SETST: JMS GETCHR ; GET THE CHARACTER +SETST2: DAC@ [DEAD] ; PUT IT IN DISPLAY + LAC@ DIR ; FIRST DO DIRECTION LETTER + AND [3] + ADD [DIRLET] + DAC TEM1 + LAC@ TEM1 + JMS GETCHR + DAC@ [LETTER] + LAC TOPSW ; SEE IF TOP OR INSIDE VIEW + ASN + JMP INSIDE +TOPV: LAC [DLIST-1] ;WRITE OVER MAZE DISPLAY LIST + DAC DPTR + LAC [DLYA 1600',] + DAC@ DPTR + LAC [DJMS DNL3,] + DAC@ DPTR + LWC 32. + DAC CNT + LAC [MAZE-1] + DAC PTR + LAC@ DY + SAL 3 + SAL 1 + ADD@ DX + IAC + CIA + DAC PTR4 +NXTW: LWC 16. + DAC CNT2 + LAC [100000'] + DAC BIT + ISZ PTR +NXTB: ISZ PTR4 ; HAVE WE REACHED OUR LOCATION? + JMP .+2 + JMP ME + LAC@ PTR ; SEE IS SQUARE OPEN OR CLOSED + AND BIT + ASZ + JMP ON + LAC [DJMS SPMAZE,] + JMP ON+1 +ME: LAC@ DIR ; FIGURE OUT WHICH ARROW TO USE + AND [3] + ADD [ARROWS] + DAC PTR3 + LAC@ PTR3 + JMP ON+1 +ON: LAC [DJMS CHARMZE,] + DAC@ DPTR + CLL + LAC BIT + RAR 1 + DAC BIT + ISZ CNT2 ; THIS LINE DONE? + JMP NXTB + LAC [DJMS DNL3,] + DAC@ DPTR + ISZ CNT + JMP NXTW ; THIS ROW DONE? + CLA ; DHLT AT END + DAC@ DPTR + JMP@ PRINT +INSIDE: JMS PNTBIT + LAC [WALLS] + DAC WPTR + IAC + DAC WPTR2 + CLA + DAC CNT + LAC [DLIST-1] + DAC DPTR + LAC [20000'] + DAC BEAMBIT + DSN + JMP .-1 + LAC@ DIR + AND [1] + ASZ + JMP EW + JMS CREMENT + DAC TEM1 + CIA + AND [20'] + IOR [RAL 1] + DAC NOP2 + XOR [20'] + DAC NOP3 +PRNT1: LAC MPTR + ADD TEM1 + DAC NEXTBIT + LAC@ NEXTBIT + AND BIT + DAC NEXTBIT + LAC BIT + CLL +NOP2: NOP + AND@ MPTR + JMS LBIT + LAC BIT + CLL +NOP3: NOP + AND@ MPTR + JMS RBIT + LAC MPTR + ADD TEM1 + DAC MPTR + LAC NEXTBIT + JMS ENDCHECK + LAC CNT + SAM [31.] ; SPECIAL CHECK + JMP .+2 + JMP CLOSEOUT + ISZ WPTR + ISZ WPTR2 + ISZ CNT + JMP PRNT1 +EW: JMS CREMENT + DAC TEM1 + AND [20'] + IOR [RAL 1] + DAC NOP4 + DAC NOP5 +PRNT2: LAC BIT + CLL +NOP5: NOP + AND@ MPTR + DAC NEXTBIT + LAC MPTR + ADD TEM1 + DAC TEM2 + LAC BIT + AND@ TEM2 + JMS LBIT + LAC MPTR + SUB TEM1 + DAC TEM2 + LAC BIT + AND@ TEM2 + JMS RBIT + LAC BIT + CLL +NOP4: NOP + DAC BIT + LAC NEXTBIT + JMS ENDCHECK + ISZ WPTR + ISZ WPTR2 + ISZ CNT + JMP PRNT2 +LBIT: 0 + DAC LASTLEF + ASZ + JMP LB1 + LAC@ WPTR ; HALLWAY + CIA + ADD WALLS + IOR [10000'] + DAC@ DPTR + LAC@ WPTR + ADD WALLS + IOR [20000'] + DAC@ DPTR + LAC [DJMS WAIT,] + DAC@ DPTR + LAC CNT + ASN + JMP LB2 + CAL + DAC XDELTA + LAC@ WPTR + SAL 1 + CIA + DAC YDELTA + JMS LV +LB2: LAC@ WPTR2 + CIA + ADD WALLS + IOR [20000'] + DAC@ DPTR + LAC [DJMS WAIT,] + DAC@ DPTR + CAL + DAC YDELTA + LAC@ WPTR + SUB@ WPTR2 + DAC XDELTA + JMS LV + JMS FIX + CAL + DAC XDELTA + LAC@ WPTR2 + SAL 1 + DAC YDELTA + JMS LV + LAC [20000'] + DAC BEAMBIT + CAL + DAC YDELTA + LAC@ WPTR2 + SUB@ WPTR + DAC XDELTA + JMS LV + JMP@ LBIT +LB1: LAC@ WPTR2 ; WALL + CIA + ADD WALLS + IOR [10000'] + DAC@ DPTR + LAC@ WPTR2 + ADD WALLS + IOR [20000'] + DAC@ DPTR + LAC [DJMS WAIT,] + DAC@ DPTR + LAC@ WPTR + SUB@ WPTR2 + DAC YDELTA + CIA + DAC XDELTA + JMS LV + LAC@ WPTR + CIA + ADD WALLS + IOR [10000'] + DAC@ DPTR + XOR [30000'] + DAC@ DPTR + LAC [DJMS WAIT,] + DAC@ DPTR + LAC@ WPTR + SUB@ WPTR2 + DAC XDELTA + DAC YDELTA + JMS LV + JMP@ LBIT +RBIT: 0 + DAC LASTRIG + ASZ + JMP RB1 + LAC@ WPTR ; HALLWAY + ADD WALLS + IOR [10000'] + DAC@ DPTR + XOR [30000'] + DAC@ DPTR + LAC [DJMS WAIT,] + DAC@ DPTR + LAC CNT + ASN + JMP RB2 + CAL + DAC XDELTA + LAC@ WPTR + SAL 1 + CIA + DAC YDELTA + JMS LV +RB2: LAC@ WPTR2 + CIA + ADD WALLS + IOR [20000'] + DAC@ DPTR + LAC [DJMS WAIT,] + DAC@ DPTR + CAL + DAC YDELTA + LAC@ WPTR2 + SUB@ WPTR + DAC XDELTA + JMS LV + JMS FIX + CAL + DAC XDELTA + LAC@ WPTR2 + SAL 1 + DAC YDELTA + JMS LV + LAC [20000'] + DAC BEAMBIT + CAL + DAC YDELTA + LAC@ WPTR + SUB@ WPTR2 + DAC XDELTA + JMS LV + JMP@ RBIT +RB1: LAC@ WPTR2 ; WALL + ADD WALLS + IOR [10000'] + DAC@ DPTR + XOR [30000'] + DAC@ DPTR + LAC [DJMS WAIT,] + DAC@ DPTR + LAC@ WPTR + SUB@ WPTR2 + DAC XDELTA + DAC YDELTA + JMS LV + LAC@ WPTR2 + ADD WALLS + IOR [10000'] + DAC@ DPTR + LAC@ WPTR2 + CIA + ADD WALLS + IOR [20000'] + DAC@ DPTR + LAC [DJMS WAIT,] + DAC@ DPTR + LAC@ WPTR + SUB@ WPTR2 + DAC XDELTA + CIA + DAC YDELTA + JMS LV + JMP@ RBIT +FIX: 0 + CLL + LAC NEXTBIT + ASN + STL + CLA + RAR 3 + DAC BEAMBIT + JMP@ FIX +ENDCHECK:0 + ASN + JMP@ ENDCHECK +CLOSEOUT:LAC CNT ; SET LENGTH OF HALLWAY + DAC HALLNGTH + LAC@ WPTR2 + ADD WALLS + IOR [20000'] + DAC@ DPTR + XOR [30000'] + DAC@ DPTR + LAC [DJMS WAIT,] + DAC@ DPTR + CAL + DAC YDELTA + LAC@ WPTR2 + SAL 1 + DAC ETEM + CIA + DAC XDELTA + JMS LV + LAC LASTLEF + ASZ + LAC [20000'] + DAC BEAMBIT + CAL + DAC XDELTA + LAC ETEM + CIA + DAC YDELTA + JMS LV + LAC [20000'] + DAC BEAMBIT + CAL + DAC YDELTA + LAC ETEM + DAC XDELTA + JMS LV + LAC LASTRIG + ASN + JMP EN1 + CAL + DAC XDELTA + LAC ETEM + DAC YDELTA + JMS LV +EN1: CAL + DAC@ DPTR ; INSERT THE DHLT + JMS VISIBLE ; NOW CHECK FOR VISIBLE OPPONENTS + JMP@ PRINT + +; CHECK FOR VISIBLE OPPONENTS +; +VISIBLE:0 + LWC 9. ; 8 IMLACS TO DO + DAC CNT2 + LAC [DSPTCH-1] ; SET POINTER TO IMLAC INFO TABLES + DAC VISPT + LAC [THING-1] ; SET UP POINTER TO DLYA'S + DAC VISPT2 + IAC ; POINT TO DSTS'S + DAC VISPT3 + ADD [2] ; POINT TO DJMS'S EYES + DAC VISPT4 + IAC ; POINT TO DJMS'S BODY (NAME) + DAC VISPT5 +VISLOOP:ISZ CNT2 ; HAVE WE CHECKED ALL 8? + JMP .+2 ; NO + JMP@ VISIBLE ; YES, RETURN + LAC@ VISPT ; GET ADDRESS OF IMLAC'S INFO TABLE + DAC SEEPT + DAC PTR4 + LAC@ SEEPT ; MAY CHANGE IT ON US, SO GET STATUS + ASZ ; IS THIS IMLAC PLAYING? + JMP PLAYING ; YES + JMP .+3 +BLOWING:LAC JMSEXP + JMP .+2 +NOSEE: LAC [DNOP] ; NO, SO MAKE HIM INVISBLE OR EXPLODING + ISZ VISPT2 ; DON'T CHANGE Y + ISZ VISPT3 ; DON'T CHANGE DSTS + DAC@ VISPT5 ; SET TO INVISIBLE OR EXPLODING + LAC [DNOP] ; NO EYES WANTED + DAC@ VISPT4 +BUMP: JMS BUMPPTS ; UPDATE POINTERS TO NEXT IMLAC + JMP VISLOOP ; NOW DO NEXT IMLAC +; +; ACTIVE PLAYER +; +PLAYING:LAW 9. ; SET ID + ADD CNT2 + DAC IID + JMS SEEUS ; SEE IF IT CAN BE SEEN + JMP NOSEE ; CAN'T BE SEEN + LAC@ PTR4 ; COULD HE BE BLOWING UP? + ASP + JMP HEVIS ; HE IS VISIBLE + JMP BLOWING ; HE IS BLOWING UP +SEEUS: 0 + LAC@ DIR + AND [3] + DAC@ [SAVEDIR] + LAC@ DX + DAC@ [SAVEDX] + LAC@ DY + DAC@ [SAVEDY] + JMS@ [SEE] + JMP@ SEEUS + ISZ SEEUS + JMP@ SEEUS +SEEPT: 0 +FTEMP: 0 +; +; VISIBLE OPPONNENT! +; +FIGX: 0 + LAC@ [DISTAN] ; NOW I KNOW I SEE HIM + ADD [WALLS] ; GET CURRECT POSITION FOR NAME + DAC FTEMP + LAC@ FTEMP + CIA + ADD WALLS + IOR [20000'] ; MAKE IT A DLYA + JMP@ FIGX +HEVIS: JMS FIGX ; FIGURE THE NEW DLXA + DAC@ VISPT2 ; STICK IT IN + LAC@ [DISTAN] ; GET DISTANCE TO OPPONENT + SAR 3 ; SCALE IT TO 2 SIGNIFICANT BITS + XOR [3] ; COMPLEMENT MEANNING + IOR [DSTS 0] ; MAKE IT A DSTS INSTRUCTION + DAC@ VISPT3 ; STICK IT IN DISPLAY + JMS FIGEYES ; FIGURE OUT WHETHER OR NOT EYES SHOULD BE DISPLAYED + DAC@ VISPT4 + LAC IID ; NOW SEE WHICH OPPONENT WE CAN SEE + ADD [TNUM-1] ; GET APPROPRIATE NAME + DAC TEM2 + LAC@ TEM2 + DAC@ VISPT5 ; STICK APPROPRIATE DJMP TO NAME IN DISPLAY LIST + JMP BUMP ; NOW DO NEXT OPPONENT +FIGEYES:0 + LAC@ DIR ; SEE IF WE ARE FACING EACH OTHER + AND [3] + ADD [4] + SUB@ [IDIR] + AND [3] + ADD [EYTAB] + DAC FTEMP + LAC@ FTEMP + JMP@ FIGEYES +; +; SHIFT TO THE LEFT 13 SUBROUTINE +; +SAR13:0 + SAR 3 + SAR 3 + SAR 3 + SAR 3 + SAR 1 + ASN + LAW 1 + JMP@ SAR13 + +; BLOW US UP AND START AGAIN + +ENDER: CLA ; RETURN TO INSIDE DISPLAY + DAC TOPSW + LAC [AD2] ; SET BLOW UP DISPLAY AS CURRENT DISPLAY + DAC WHICHD + LAC [BIGX1INC-1] ; SET POINTER TO INCREMENT TABLE + DAC VISPT + LWC 4. ; 8 PIECES TO DO BUT WE WILL SET UP 2 AT A TIME + DAC CNT +BLOWLOOP:JMS RANDOM ; GET RANDOM NUMBER + JMS SAR13 ; SCALE IT TO 2 +- SIG BITS + DAC TEM1 ; SAVE FOR NEXT BIT + DAC@ VISPT ; STORE DELTA IN FIRST X + JMS RANDOM ; GET ANOTHER RANDOM NUMBER + JMS SAR13 ; SCALE IT TOO + DAC TEM2 ; ALSO SAVE IT + DAC@ VISPT ; STORE DELTA IN FIRST Y + LAC TEM1 ; GET BACK FIRST DELTA X + CIA ; WE WANT TO BALANCE EXPLOSION SO + DAC@ VISPT ; MAKE NEXT BIT GO OPPOSITE DIRECTION + LAC TEM2 ; STORE SECOND Y ALSO IN OPPOSITE DIRECTION + CIA + DAC@ VISPT + ISZ CNT ; ARE WE DONE WITH SETTING UP DELTAS + JMP BLOWLOOP ; NO, DO NEXT 2 + LAC [BIGX1-1] ; NOW RESET DISPLAY LIST DLXAS AND DLYAS + DAC TEM1 + LWC 8. ; EIGHT BITS TO DO + DAC CNT +CLRLOOP:JMS CLRSUB ; RESET THE DLXA + JMS CLRSUB ; RESET THE DLYA + LAC TEM1 ; UPDATE POINTER TO NEXT BIT OF EXPLOSION + ADD [5] + DAC TEM1 + ISZ CNT ; DID WE DO ALL EIGHT BITS? + JMP CLRLOOP ; NO, DO THE REST + JMP RETN ; WAIT EXPLOSION OUT +CLRSUB: 0 + ISZ TEM1 ; POSITION POINTER + LAC@ TEM1 ; GET DLXA OR DLYA + AND [30000'] ; GET OPCODE BITS + IOR [1000'] ; POSITION TO CENTER OF SCREEN + DAC@ TEM1 ; STUFF IT BACK + JMP@ CLRSUB ; RETURN + +; TTY INPUT HANDLER + +CHARIN: 0 + RSF ; TTY INPUT? + JMP EXIT ; NO, SO IGNORE INTERUPT + CLA + RRC ; GET CHARACTER + AND [177'] ; MASK TO 7 CHARACTERS + DAC INCHAR ; SAVE IT +; +; CHECK TO SEE IF WE ARE WAITING FOR CHARACTERS +; + LAC ICNT + ASN + JMP SETUP ; NO SO INTERPRET CHARACTER WE GOT + LAC INCHAR ; YES, SO STUFF CHARACTER IN INFO TABLE + DAC@ 17' + ISZ ICNT ; WAS THAT ALL WE WANTED? + JMP EXIT ; NO, WAIT FOR MORE + JMP@ IDSPTCH ; YES, GO TO ROUTINE NOW +SETUP: LAC [ININFO-1] ; SET UP INPUT BUFFER + DAC 17` +; +; CHECK FOR IMLAC WANTS OUT MESSAGE +; IF HE DOES THEN DO THE FOLLOWING: +; 1) INDICATE IMLAC NON-ACTIVE IN INFO TABLE +; 2) DNOP HIS SCORE, BODY, EYES AND NAME +; +CHK1: LAC INCHAR ; GET CHARACTER READ BACK + SAM [1] ; IS IT TYPE 1? + JMP CHK2 ; NO, CHECK NEXT TYPE + LWC 1 ; WAIT FOR ONE MORE WORD [ID] + DAC ICNT + LAC [DTYP1] ; SET UP DISPATCH ADDRESS +SETOUT: DAC IDSPTCH + JMP EXIT ; WAIT FOR CHARACTERS TO COME IN +DTYP1: JMS TESTID ; GET ID OF IMLAC THAT WANTS OUT +GONER: ASN + JMS ERROR ; ERROR IF ID = 0 + JMS POSITION ; GET POSITION INTO INFO TABLE + DAC 17' + LWC 10. + DAC ICNT2 ; CLEAR INFO ENTRY + CLA + DAC@ ITEMP1 ; CLEAR STATUS + DAC@ 17' ; CLEAR THE REST + ISZ ICNT2 + JMP .-2 + JMS GETCNT ; NOW CLEAR DISPLAY LIST SCORE + LAC [SCORE-15.] + ADD [14.] + ISZ ICNT2 + JMP .-2 + DAC 17' + LAC [DNOP] ; DNOP ALL DIGITS + DAC@ 17' + DAC@ 17' + DAC@ 17' + DAC@ 17' + ISZ 17' + DAC@ 17' + DAC@ 17' + DAC@ 17' + DAC@ 17' + JMS GETCNT ; NOW CLEAR DISPLAYED NAME + LAC [IML1-9.] + ADD [8.] + ISZ ICNT2 + JMP .-2 + DAC 17' + LAC [DJMS D040,] ; GET SPACE + DAC@ 17' + DAC@ 17' + DAC@ 17' + DAC@ 17' + DAC@ 17' + DAC@ 17' + DAC@ 17' + JMS GETCNT ; FINALLY MAKE HIM INVISIBLE + LAC [THING-4] + ADD [6] + ISZ ICNT2 + JMP .-2 + DAC 17' + LAC [DNOP] + DAC@ 17' ; CLEAR EYES + DAC@ 17' ; CLEAR BODY (NAME) + LAC ININFO ; SEE IF IT IS MY REAL IT THAT IS LEAVING + SAM MYREAL ; IF SO THEN EXIT PROGRAM, RETURN TO SSV + JMP CHKNR +; +; EXIT ROUTINE +; SEND PLAYER WANTS OUT TO 10 +; THEN RETURN TO SSV +; + LAW 1 ; SEND I WANT OUT CODE + JMS SEND1 + LAC MYREAL ; SEND MY ID + JMS SEND1 + LAC [17776'] ; RESTORE SSV'S BUFFER TO FULL BUFFER + DAC@ [25'] +LEAVE: IOF ; TURN OFF INTERUPTS + JMP@ .+1 ; NOW EXIT TO SSV + 101' ; ADDRESS OF WHERE TO EXIT TO +CHKNR: SAM MYBIT ; SEE IF IT IS THE GUY WE ARE SIM. + JMP EXIT ; IF NOT THEN WE ARE DONE + LAW 1 ; SENT LEAVING MESSAGE TO 10 FOR HIM + JMS SEND1 + LAC MYBIT + JMS SEND1 + LAC MYREAL ; RETURN TO OUR REAL ID + JMS GETD + JMS PRINT ; REBUILD DISPLAY + JMP EXIT + SUBTTL Player Moved (Type 1) +; CHECK FOR MOVED TO NEW LOCATION MESSAGE +; IF IT IS THEN DO THE FOLOWING: +; 1) INDICATE PLAYER ACTIVE IN INFO TABLE +; 2) UPDATE DIR, X, AND Y IN INFO TABLE +; 3) CHECK VISIBILITY AND SET IT CORRECTLY +; +CHK2: +ifn fast,[ + sub [20'] ; no chance of move if <20 + asp ; skip if 0 or + + jmp chk23 ; negative, not a new protocol move. + sub [20'] ; a move if 17< x <40 + asp + jmp chk22 ;ah, if 20=< and <40, definitely new-ptcl move. + sub [100'] ; a move if GE 140 + asp + jmp insrtch ; 40=< and <140, a char. +chk22: lac inchar + jmp@ [chki20] ;new ptcl move. go hack. +chk23:] + + lac inchar + SAM [2] ; IS IT TYPE 2? + JMP CHK3 ; NO BUT SEE IF IT IS TYPE 3 + LWC 4 ; 4 MORE WORDS TO COME + DAC ICNT + LAC [DTYP2] ; SET UP DISPATCH LOCATION + JMP SETOUT +DTYP2: JMS TESTID + DAC IID + JMS POSITION ; INDICATE PLAYER IS ACTIVE IN INFO TABLES + LAC@ ITEMP1 ; GET CURRENT STATUS + ASZ + ASP ; IGNORE MESSAGE IF HE IS EXPLODING + JMP .+2 + JMP EXIT + STA + DAC@ ITEMP1 ; SAY PLAYER IS ACTIVE + ISZ ITEMP1 + LAC ININFO+1 ; SAVE NEW DIRECTION + IOR [100'] + AND [103'] + SAM ININFO+1 + JMS ERROR ; DIRECTION GREATER THAN 3 + AND [3] ; OR NOT IN 10N FORMAT + DAC@ ITEMP1 + ISZ ITEMP1 + LAC ININFO+2 ; SAVE NEW X LOCATION + JMS TESTLOC ; MAKE SURE IT IS LEGAL + DAC@ ITEMP1 + ISZ ITEMP1 + LAC ININFO+3 ; SAVE NEW Y LOCATION + JMS TESTLOC + DAC@ ITEMP1 + + ;re-entry pt from higher 2k +chk25: JMS GETCNT ; SET UP POINTER TO HIS DISPLAY LIST SLOT + LAC [THING-7] + ADD [6] + ISZ ICNT2 + JMP .-2 + DAC 17' + JMS SEEUS ; CAN HE BE SEEN? + JMP NOTVIS ; NO + JMS FIGX ; YES, NOW FIGURE DLXA + DAC@ 17' ; STORE IT AWAY + LAC@ [DISTAN] ; NOW FIGURE DSTS + SAR 3 + XOR [3] + IOR [DSTS 0] + DAC@ 17' + ISZ 17' ; SKIP OVER WAIT + JMS FIGEYES ; NEXT DO EYES + DAC@ 17' ; STORE THEM + LAC IID ; LAST IS NAME + ADD [TNUM-1] + DAC ITEMP1 + LAC@ ITEMP1 + DAC@ 17' + JMP MCHK ; SEE IF ID IS OURS +NOTVIS: LAC [DNOP] ; IF NOT VISIBLE THEN MAKE IT SO + ISZ 17' ; SKIP DLXA + ISZ 17' ; SKIP DSTS + ISZ 17' ; SKIP OVER WAIT + DAC@ 17' ; CLEAR EYES + DAC@ 17' ; CLEAR BODY (NAME) +MCHK: LAC IID ; SEE IF IT IS US + SAM MYBIT + JMP EXIT ; NO, DONE + JMS PRINT ; IF SO THEN UPDATE DISPLAY + JMP EXIT ; DONE + SUBTTL Player Died (Type 3) +; CHECK FOR PLAYER SHOT MESSAGE +; IF SO THEN DO THE FOLLOWING: +; 1) INDICATE IN TABLE THAT HE IS BLOWING UP +; 2) BUMP SHOOTING PLAYERS SCORE +; 3) GENERATE EXPLOSION IF VISIBLE +; 4) IF THIS IMLAC GOT HIT THEN: +; A) SET LIFE FLAG TO SHOT +; B) PUT NAME OF WHO SHOT US IN WHODIDIT +; +CHK3: SAM [3] ; TYPE 3? + JMP CHK4 ; NO, BUT TRY TYPE 4 + LWC 2 ; TWO WORDS TO WAIT FOR + DAC ICNT + LAC [DTYP3] ; SET DISPATCH ADDRESS + JMP SETOUT +DTYP3: JMS TESTID + LAC ININFO+1 + ASN + JMS ERROR ; ID ZERO + SUB [9.] + ASP + JMP .+3 + ADD [9.] + JMS ERROR ; ID GREATER THAN 8 + ADD [9.] + DAC KILL ; SAVE DYING ID FOR UPSCORE + JMS POSITION ; INDICATE PLAYER IS DYING + COA + DAC@ ITEMP1 + LAC ITEMP1 + ADD [5] + DAC ITEMP1 + ADD [4] + DAC ITEMP2 + CAL ;TURN OFF ANY FIRING WE HAVE ON HIM + DAC@ ITEMP1 + LWC 60. ; SET EXPLOSION TO LAST 1 1/2 SEC + DAC@ ITEMP2 + LAC ININFO+1 ; SEE IF I WAS SHOT + SAM MYBIT + JMP NOTME + LAC ININFO + ADD [TNUM-1] ; SAY WHO DID IT IN WHODIDIT + DAC ITEMP2 + LAC@ ITEMP2 + DAC@ [WHODIDIT] + LAC ININFO ; WAIT LONGER IN BIG + DAC BIGEXP ; EXPLOSION IF WE ARE PLAYING OURSELVES + SAM MYREAL ; SO OUR NEW STARTING LOC WILL BE IN EFFECT + JMP .+3 + LWC 120. + JMP .+2 + LWC 80. + XAM BIGEXP + JMS UPSCORE ; UPDATE SCORES + JMP ENDER +NOTME: LAC ININFO+1 ; NOW POINT INTO DISPLAY LIST + CIA + DAC ICNT2 + LAC [THING-2] + ADD [6] + ISZ ICNT2 + JMP .-2 + DAC ITEMP2 + SUB [1] ; SET POINTER TO EYES + DAC ITEMP1 + LAC@ ITEMP2 ; IS HE CURRENTLY VISIBLE? + SAM [DNOP] + JMP VIS1 ; YES + JMP NOEXPLO ; NO +VIS1: LAC [DNOP] + DAC@ ITEMP1 ; YES, CLEAR EYES + LAC JMSEXP ; STICK IN JMS TO EXPLOSION + DAC@ ITEMP2 +NOEXPLO:LAC ININFO ; BUMP SCORES + JMS UPSCORE ; AND UPDATE SCORES IN DISPLAY LIST + JMP EXIT + SUBTTL New Name (Type 4) +; CHECK TO SEE IF NEW NAME SPECIFIED +; IF SO THEN DO THE FOLLOWING: +; 1) FILL IN APPROPRATE NAME DISPLAY SUBROUTINE +; 2) IF MYBIT = 0 THEN ASSIGN THE ID TO MYBIT +; +CHK4: SAM [4] ; TYPE 4? + JMP ERASER ; NO, KEEP LOOKING + LWC 11. ; 11. MORE CHARACTERS TO WAIT FOR + DAC ICNT + LAC [DTYP4] ; SET DISPATCH ADDRESS + JMP SETOUT +DTYP4: JMS TESTID + LAC MYBIT ; SEE IF MYBIT IS ZERO + ASZ + JMP GOTMINE + LAC ININFO ; YES, SO SET OUR ID + DAC MYREAL + JMS GETD +ife fast, DAC@ [ORIG] ; INDICATE ORIGIONAL ID IN DISPLAY +GOTMINE:LAC [ININFO] ; SET UP POINTERS FOR TRANSFER + DAC 16' + JMS GETCNT + LAC [IML1-8.] ; REMEMBER 1ST CHAR IS OFFSET CHAR + ADD [8.] + ISZ ICNT2 + JMP .-2 + DAC 17' + DAC ITEMP2 + CLA + DAC SPACES + LWC 6 ; MOVE 6 CHARACTER NAME + DAC ICNT2 +CONVNXT:LAC@ 16' + SUB [140'] ; TRANSLATE TO LOWER CASE + ASM + SUB [40'] + ADD [140'] + SAM [40'] ; SPACE? + JMP .+2 ; NO + ISZ SPACES ; YES COUNT THEM FOR OFFSET CHAR + JMS GETCHR ; CONVERT TO DJMS + DAC@ 17' + ISZ ICNT2 + JMP CONVNXT + LAC SPACES ; NOW FIX OFFSET CHARACTER + ADD [CENTER] + DAC ITEMP1 + LAC@ ITEMP1 + DAC@ ITEMP2 + LAC ININFO ; NOW STORE SCORES + JMS POSITION + ADD [4] + DAC ITEMP1 + JMS FIXSCO ; DO # OF OPPONENTS SHOT + LAC ININFO + JMS POINTSC + JMS SCOREIT + LAC ITEMP1 + ADD [6] + DAC ITEMP1 + JMS FIXSCO ; NOW DO # OF TIMES SHOT + LAC ININFO + JMS POINTSC + ADD [5] + DAC PTSCORE + JMS SCOREIT + JMP EXIT +FIXSCO: 0 + LAC@ 16' + AND [77'] + SAL 3 + SAL 3 + DAC ITEMP2 + LAC@ 16' + AND [77'] + IOR ITEMP2 + DAC@ ITEMP1 + JMP@ FIXSCO +SPACES: 0 + +; SET UP OUR ID +; +; ENTER WITH ID IN AC +; +GETD: 0 + DAC MYBIT + sub [1] + dac mybit1 ; store normalized 0-7 ID. + ADD [DSPTCH] + DAC ITEMP1 + LAC@ ITEMP1 ; SET UP DSTAT, DX, DY, AND DIR PTRS + DAC DSTAT + IAC + DAC DIR + IAC + DAC DX + IAC + DAC DY +ife fast,[ + LAC MYBIT ; NOW GET OUR ID IN CHARACTER + IOR [60'] + JMS GETCHR + DAC@ [CURENT] ; SAY OUR CURRENT ID IN DISPLAY +] + JMP@ GETD +; +; +; ERASE RING BUFFER? +; +ERASER: SAM [14'] ; TYPE 4? + JMP INSRTCH ; NO, JUST INSERT INTO RING BUFFER + JMS ERASE + JMP EXIT +ERASE: 0 + LWC 4 ; RESET LINE COUNT + DAC RINGLC + LAC [RINGST] ; RESET BOTH POINTERS + DAC RNGPT + IAC + DAC RNGPT2 + LAC [DJMS D012,] ; REPLACE DJMP TO CURSER + DAC@ RNGPT + LAC [DJMS CUR,] + DAC@ RNGPT2 + LAC [DJMP RINGST,] + DAC@ [RING] + DAC@ [RINGEND] + JMP@ ERASE +; +; GET DJMS FOR A CHARACTER +; +GETCHR: 0 + AND [177'] ; MASK TO 7 BITS + SAM [12'] ; LINE FEED? + JMP .+3 + LAC [DJMS D012,] + JMP STORECH + SAM [10'] ; BACK SPACE? + JMP .+3 + LAC [DJMS D010,] + JMP STORECH + SAM [15'] ; CR? + JMP .+3 + LAC [DJMS D015,] + JMP STORECH + SUB [40'] ; DON'T ALLOW ANYTHING BELOW 40 + ASP + CLA + ADD [40'] + SUB [140'] ; TRANSLATE TO LOWER CASE + ASM + SUB [40'] + ADD [140'-40'] + ADD@ [24'] ; CONVERT TO DJMS + DAC ITEMP1 + LAC@ ITEMP1 +STORECH:DAC ITEMP1 + JMP@ GETCHR + +; INSERT CHARACTER INTO RING BUFFER +; +INSRTCH:JMS FORWARD + LAC INCHAR + JMS GETCHR ; GET DJMS FOR CHARACTER + SAM [DJMS D012,] + JMP NOTNL ; NO + ISZ RINGLC ; YES, BUT IS THERE ROOM ON SCREEN? + JMP NOTNL + JMS ROLL + JMP OK +NOTNL: LAC RNGPT2 + SAM RNGPT ; HAVE WE FILLED ENTIRE BUFFER? + JMP OK ; NO + JMS ROLL ; YES, ROLL TOP LINE OFF +OK: LAC [DJMP CUR,] + DAC@ RNGPT2 + JMS BACK ; BACK UP POINTER + LAC ITEMP1 ; GET DJMS AGAIN + DAC@ RNGPT2 ; STICK IN ON TOP OF OLD DJMP CUR + JMS FORWARD ; MOVE POINTER BACK UP + LAC INCHAR + SAM [15'] + JMP EXIT ; DONE + LAW 12' + DAC INCHAR + JMP INSRTCH +FORWARD:0 ; ROLL RNGPT2 FORWARD ONE SLOT + LAC RNGPT2 + IAC + SAM [RINGEND] + JMP .+2 + LAC [RINGST] + DAC RNGPT2 + JMP@ FORWARD +BACK: 0 + STA + ADD RNGPT2 + SAM [RING] + JMP .+2 + LAC [RINGEND-1] + DAC RNGPT2 + JMP@ BACK + +; +ROLL: 0 ; ROLL RINGPT FORWARD ONE LINE +LOOK: LAC RNGPT + IAC + SAM [RINGEND] + JMP .+2 + LAC [RINGST] + SAM RNGPT2 + JMP .+4 + JMS ERASE + JMS FORWARD + JMP@ ROLL + DAC RNGPT + LAC@ RNGPT + SAM [DJMS D012,] + JMP LOOK +MOVED: LAC RNGPT + AND [7777'] + IOR [160000'] + DAC@ [RING] + STA + ADD RINGLC + DAC RINGLC + JMP@ ROLL +; +; RETURN FROM CHARACTER READ +; +EXIT: JMP@ CHARIN +GETCNT: 0 + LAC ININFO ; GET ID OF MESSAGE ORIGINATOR + CIA ; MAKE IT INTO A COUNT + DAC ICNT2 + JMP@ GETCNT +POSITION:0 + ADD [DSPTCH-1] ; POINT TO CORRECT STATUS INDICATOR + DAC ITEMP1 + LAC@ ITEMP1 + DAC ITEMP1 + DAC SEEPT ; ALSO SET SEEPT FOR TYPE 2 COMMAND + JMP@ POSITION +TESTID: 0 ; TEST FOR VALID ID IN ININFO + LAC ININFO + ASN ; ALSO CAN'T BE ZERO + JMS ERROR ; ID ZERO OR SAME AS MYBIT + SUB [9.] ; CAN'T BE > OR = TO 9. + ASP + JMP TESTOK + LAC ININFO + JMS ERROR ; ID GREATER THAN 8 +TESTOK: LAC ININFO ; ALL OK SO RETURN WITH ID IN AC + JMP@ TESTID +TESTLOC:0 ; TEST TO SEE IF LEGAL LOCATION + AND [77'] ; MINIMUM IS LOCATION 1 + ASN + JMS ERROR ; LOCATION ZERO + SUB [32.] + ASP + JMP .+3 + ADD [32.] + JMS ERROR ; LOCATION GREATER THAN 31. + ADD [32.] + JMP@ TESTLOC + SUBTTL Error Handling Routine +; ERROR HANDLING ROUTINE +; +ERROR: 0 ; ADDRESS OF WHERE THE ERROR WAS FOUND + DAC ERRAC ; SAVE AC ERROR MESSAGE + LAC IDSPTCH ; SAVE DISPATCH ADDRESS + DAC ERRDSP + LWC 11. + DAC ICNT2 ; NOW SAVE INFO AREA + LAC [ININFO-1] + DAC 17' + LAC [ERRINFO-1] + DAC 16' +SVELOP: LAC@ 17' + DAC@ 16' + ISZ ICNT2 + JMP SVELOP + ISZ ERRCNT ; BUMP THE ERROR COUNT + NOP + LAC ERRCNT ; NOW DISPLAY IT + JMS GETCHR + DAC@ [ERRCHAR] + JMP EXIT ; NOW IGNORE BAD MESSAGE +ERRAC: 0 ; SAVED AC +ERRDSP: 0 ; SAVED DISPATCH ADDRESS +ERRCNT: 60' ; ERROR COUNT + SUBTTL Routine Variables +; ROUTINES VARIABLES +; +INCHAR: 0 ; LAST CHARACTER READ IN +ICNT: 0 ; THE NUMBER OF CHARACTERS WE ARE WAITING FOR +ICNT2: 0 ; GENERAL PURPOSE COUNTER USED IN ROUTINE +ITEMP1: 0 ; TEMPORARY LOCATIONS +ITEMP2: 0 ; ANOTHER TEMPORARY LOCATION +IDSPTCH:0 ; DISPATCHING ADDRESS FOR COMMAND ROUTINES +RNGPT: RINGST ; FIRST CHARACTER OF RING BUFFER POINTER +RNGPT2: RINGST+1 ; LAST CHARACTER OF RING BUFFER POINTER +RINGLC: -4 ; RING BUFFER LINE COUNTER +ININFO: 0 ; INPUT INFORMATION FROM 10 BUFFER + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +; +; CONSTANTS GO HERE AT END OF THIS 2K !!!!! ANY REFS TO OR FROM +; SUCCEEDING 2K MUST BE INDIRECT-ADDRESS! BLEAH!!!!!! (KLH) +; +CONSTANTS + +;LOC 14000 ;happens about here anyway, just needs precision. + +; +; DISTANCES TO WALLS TABLE +; +WALLS: 511. ; DISTANCES TO WALLS + 450. + 358. + 281. + 225. + 184. + 155. + 133. + 116. + 103. + 92. + 83. + 75. + 70. + 64. + 60. + 56. + 53. + 50. + 47. + 45. + 43. + 41. + 39. + 37. + 35. + 33. + 31. + 29. + 27. + 25. +; +; ERROR SAVING OF INFO INFORMATION AREA +; +ERRINFO:0 ; HOLDS 2ND CHARACTER OF LAST BAD MESSAGE + 0 ; HOLDS THE REST OF THE MESSAGE + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +; +; N DIRECTION LETTER TABLE +; E +; S +; W +; +DIRLET: 116' + 105' + 123' + 127' +; +; YOU WERE SHOT BY: MESSAGE +; +YWSB: 131' + 117' + 125' + 40' + 127' + 105' + 122' + 105' + 40' + 123' + 110' + 117' + 124' + 40' + 102' + 131' + 72' +; +; EYES AND ARROWS TABLE +; +EYTAB: DJMS AWAY + DJMS TOLEFT + DJMS EYES + DJMS TORIGHT +; +; OFFSET FOR NAME TABLE +; +CENTER: DJMS OFF6 + DJMS OFF5 + DJMS OFF4 + DJMS OFF3 + DJMS OFF2 + DJMS OFF1 + DNOP +OFF6: INC E,DM30 + INC DM30,100' +OFF5: INC E,DM30 + INC DM20,100' +OFF4: INC E,DM30 + INC DM30,100' +OFF3: INC E,DM30 + INC DM20,100' +OFF2: INC E,DM30 + INC DM30,100' +OFF1: INC E,DM30 + INC DM20,140' +; +; DJMSES TO NAME LABELS ROUTINES +; +TNUM: DJMS IML1 + DJMS IML2 + DJMS IML3 + DJMS IML4 + DJMS IML5 + DJMS IML6 + DJMS IML7 + DJMS IML8 +; +; BIG EXPLOSION INFO TABLE +; +BIGX1INC:0 +BIGY1INC:0 +BIGX2INC:0 +BIGY2INC:0 +BIGX3INC:0 +BIGY3INC:0 +BIGX4INC:0 +BIGY4INC:0 +BIGX5INC:0 +BIGY5INC:0 +BIGX6INC:0 +BIGY6INC:0 +BIGX7INC:0 +BIGY7INC:0 +BIGX8INC:0 +BIGY8INC:0 + SUBTTL Imlac Info Tables +; IMLAC INFORMATION TABLES +; +DSPTCH: IM1 + IM2 + IM3 + IM4 + IM5 + IM6 + IM7 + IM8 +IMINFL==11. ;# wds info per imlac +IM1: 0 ; STATUS WORD -1 IF ACTIVE 1 IF DYING 0 IF NOT IN GAME + 0 ; DIRECTION + 0 ; X LOCATION + 0 ; Y LOCATION + 0 ; PLAYERS SCORE + 0 ; BULLET COUNTER + 0 ; MY DIRECTION AT TIME OF FIRE + 0 ; MY X LOCATION AT TIME OF FIRE + 0 ; MY Y LOCATION AT TIME OF FIRE + 0 ; EXPLOSION TIMER + 0 ; SHOT DEAD COUNTER +IM2: BLOCK IMINFL +IM3: BLOCK IMINFL +IM4: BLOCK IMINFL +IM5: BLOCK IMINFL +IM6: BLOCK IMINFL +IM7: BLOCK IMINFL +IM8: BLOCK IMINFL + SUBTTL SEE Test +; TEST TO SEE IF PLAYER WHOSE ID IS IN IID IS VISIBLE +; SEEPT SHOULD POINT TO STATUS WORD IN INFO TABLE +; DISTAN WILL CONTAIN DISTANCE TO OPPONENT ON RETURN IF VISIBLE +; SKIPS IF PLAYER SEEN +; +SEE: 0 + CLA + DAC DISTAN + LAC@ [SEEPT] ; SET UP LOCAL SEEPT + DAC SEEPT2 + ISZ SEEPT2 ; POINT TO DIRECTION + LAC@ SEEPT2 + DAC IDIR ; SAVE DIRECTION IN IDIR + ISZ SEEPT2 ; POINT TO X LOCATION + LAC@ SEEPT2 + DAC IX ; SAVE IT IN IX + ISZ SEEPT2 + LAC@ SEEPT2 ; NOW GET Y LOC + DAC IY + LAC SAVEDIR ; SEE WHICH WAY WE ARE POINTING + AND [1] + ASZ + JMP WEAST ; WEST OR EAST +SNORTH: LAC IX ; SOUTH OR NORTH CHECK HIS X TO MY X + SAM SAVEDX ; DOES IT MATCH? + JMP@ SEE ; NO + LAC IY ; YES, NOW GET THE Y DIFFERENCE + SUB SAVEDY + ASN ; IS HE IN MY SQUARE? + JMP@ SEE ; YES, THEN I CAN'T SEE HIM + DAC SEEPT2 ; SAVE DISTANCE TO HIM + ASP ; SEE IF DISTANCE POSITIVE + JMP HENORTH ; NO, HE MUST BE NORTH OF ME + CIA ; YES, SO HE IS SOUTH OF ME + DAC SEEPT2 ; MAKE DISTANCE NEGATIVE + JMP HESOUTH +HEEAST: LAW 2 +HENORTH=HEEAST + AND SAVEDIR ; SEE IF I AM LOOKING NORTH + ASZ ; IF NOT THEN I CAN'T SEE HIM + JMP@ SEE ; I LOOK SOUTH SO I CAN'T SEE HIM + JMP CHKLN ; OK SO FAR, NOW CHECK LENGTH OF HALL +HESOUTH:LAW 2 +HEWEST=HESOUTH + AND SAVEDIR ; SEE IF I AM LOOKING SOUTH + ASN ; IF NOT THEN I CAN'T SEE HIM + JMP@ SEE ; I NO SEE HIM + JMP CHKLN ; SO FAR SO GOOD, BUT CHECK HALLWAY LENGTH +WEAST: LAC IY ; CHECK HIS Y TO MY Y + SAM SAVEDY ; IT MUST MATCH + JMP@ SEE ; CAN'T SEE HIM + LAC IX ; NOW GET THE X DIFFERENCE + SUB SAVEDX + ASN ; IS HE IN MY SQUARE? + JMP@ SEE ; YES, SO I CAN'T SEE HIM + DAC SEEPT2 ; SAVE THE DISTANCE TO HIM + ASP ; BUT SEE IF POSITIVE DISTANCE + JMP HEWEST ; NO, NEGATIVE SO HE IS WEST OF ME + CIA + DAC SEEPT2 + JMP HEEAST ; HE IS EAST OF ME +CHKLN: LAC SEEPT2 + CIA ; SET DISTANCE TO OPPONENT + DAC DISTAN +CHKLN1: LAW 1 + AND SAVEDIR + ASZ + JMP CHKLN3 + JMS CREM2 + ADD SAVEDY + DAC SAVEDY +CHKLN2: LAC [MAZE] + ADD SAVEDY + DAC MPTR2 + LAC SAVEDX + ASZ + JMP PT1 + LAC [100000'] + JMP PT2 +PT1: CIA + DAC MCNT + CLL + LAC [100000'] + RAR 1 + ISZ MCNT + JMP .-2 +PT2: DAC BIT2 + LAC@ MPTR2 + AND BIT2 ; SEE IF IT IS AN OPEN SQUARE + ASZ + JMP@ SEE + ISZ SEEPT2 ; ARE WE AS FAR AS THE OPPONENT? + JMP CHKLN1 ; NO + LAC@ [IID] ; YES, SEE IF HE IS ME + SAM@ [MYBIT] + ISZ SEE ; DON'T SKIP IF SO (CAN'T SEE ME) + JMP@ SEE +CHKLN3: JMS CREM2 + CIA + ADD SAVEDX + DAC SAVEDX + JMP CHKLN2 +CREM2: 0 + LAC SAVEDIR + SAR 1 + AND [1] + ASN + LAC [-1] + JMP@ CREM2 +DISTAN: 0 +SAVEDIR:0 +SAVEDX: 0 +SAVEDY: 0 +SEEPT2: 0 +MCNT: 0 +MPTR2: 0 +IY: 0 ; OBJECT ID Y LOCATION +IX: 0 ; OBJECT ID X LOCATION +IDIR: 0 ; OBJECT ID IMLAC DIRECTION +BIT2: 0 + SUBTTL New-protocol checking/munching + +; CHKI20 routine to handle new-protocol checking and munching, +; as well as old. +;put here since no room in lower 2k of core. + +ifn fast,[ + +chki20: and [7] ;get normalized ID, no need to test range! + iac ;make it 1-8. + dac@ [iid] ;store for what wants it. + jms@ [position] ;set up itemp1 and seept pointers into info tabs + lac@ [itemp1] + dac ctemp1 ;get itemp1 into a var within our 2k. + lac@ ctemp1 ;get current status + asz + asp ;ignore this msg if he's exploding + jmp .+2 + jmp@ [exit] + sta + dac@ ctemp1 ;say player is active + lac ctemp1 + iac + dac plrd ;save ptr to direction + iac + dac plrx ;save ptr to x coord + iac + dac plry ;save ptr to y coord + dac ctemp1 + dac@ [itemp1] + ;itemp1 is now satisfactorily updated, and + ;indices into position tables done, now do function. + lac@ [inchar] + and [70'] ;only interested in function digit + sar 3 + add [jmp plrvec] + dac plrjmp +plrjmp: 0 +plrvec: jmp badvec + jmp badvec + jmp plrtrn ; 2 - right turn + jmp plltrn ; 3 - left turn + jmp plflip ; 4 - turn around + jmp plmove ; 5 - move forward + jmp plback ; 6 - move backward +badvec: jms@ [error] ; 7 - bad + jmp@ [exit] + +plrd: 0 ;pointer to direction +plrx: 0 ;pointer to x coord +plry: 0 ;guess what + +plrtrn: lac@ plrd ;get direction + iac ;right turn + and [3] + dac@ plrd + jmp plrdon +plltrn: lac@ plrd + sub [1] ;left turn + and [3] + dac@ plrd + jmp plrdon +plflip: lac@ plrd + add [2] ;turn right twice to turn-around + and [3] + dac@ plrd + jmp plrdon +plback: lac@ plrd ;backward-- reverse direction then move. + add [2] + jmp .+2 +plmove: lac@ plrd + and [3] + add [jmp pldvec] + dac plmjmp +plmjmp: 0 +pldvec: jmp plmnor ;north + jmp plmea ;east + jmp plmsou ;south + jmp plmwes ;west +plmnor: lac@ plry + sub [1] ;decrement Y coord for north moving + jms@ [testloc] + dac@ plry + jmp plrdon +plmea: lac@ plrx + iac ;increment X coord for east + jms@ [testloc] + dac@ plrx + jmp plrdon +plmsou: lac@ plry + iac ; incrment Y coord for south + jms@ [testloc] + dac@ plry + jmp plrdon +plmwes: lac@ plrx + sub [1] ; decrement X coord for west + jms@ [testloc] + dac@ plrx + jmp plrdon + +plrdon: lac@ [iid] ;get player id again + dac@ [ininfo] ;and fake out stupid routine + jmp@ [chk25] ;done with new ptcl handling. + +ctemp1: 0 ;pointer substi. for itemp1 +] ;end of ifn fast + +CONSTANTS + SUBTTL Display stuff +; NAME SUBROUTINES +; 5 CHARACTER NAME +; +IML1: REPEAT 7,DJMS D040 + DRJM ; RETURN JUMP +IML2: REPEAT 7,DJMS D040 + DRJM +IML3: REPEAT 7,DJMS D040 + DRJM +IML4: REPEAT 7,DJMS D040 + DRJM +IML5: REPEAT 7,DJMS D040 + DRJM +IML6: REPEAT 7,DJMS D040 + DRJM +IML7: REPEAT 7,DJMS D040 + DRJM +IML8: REPEAT 7,DJMS D040 + DRJM +; +; GSV CHARACTER SUBROUTINES +; +CUR: INC E,D0M1 + INC D0M3,B30 + INC B30,B30 + INC D03,D20 + INC D01,T + DJMP DLIST +WAIT: INC E,P ; 40 MICROSECOND WAIT + REPEAT 8.,INC P,P + INC P,140 +D010: INC E,DM30 + INC DM30,DM30 + INC DM20,140' +D012: INC E,D0M3 ; END_OF_LINE + INC D0M3,D0M3 + INC D0M3,D0M3 + INC D0M3,D0M3 + INC X,X +D015: DLXA 200 + DJMS WAIT + DRJM +DNL3: DLXA 540 + DJMP DNL+1 +DNL2: DLXA 1710 + DJMP .+2 +DNL: DLXA 10 + DJMS WAIT + DJMP D012 +D040: INC E,D30 ; SPACE + INC D30,D30 + INC D20,X +EYES: INC E,D03 ; EYES + INC D03,D03 + INC D03,DM33 + INC B00,B00 + INC D30,D30 + INC B00,B00 + INC DM30,D00 + INC D0M3,D0M3 + INC D0M3,D0M3 + INC D0M3,140' +CMZE: INC E,B03 + INC B03,B03 + INC B03,B03 + INC B03,B02 + INC B30,B30 + INC B30,B10 + INC B0M3,B0M3 + INC B0M3,B0M3 + INC B0M3,B0M3 + INC B0M2,BM30 + INC BM30,BM30 + INC BM10,B12 + INC B12,B12 + INC B12,B12 + INC B12,B12 + INC B12,B12 + INC B12,DM30 + INC DM30,DM30 + INC DM10,B1M2 + INC B1M2,B1M2 + INC B1M2,B1M2 + INC B1M2,B1M2 + INC B1M2,B1M2 + INC B1M2,D10 + INC 140',140' +CHARMZE:DJMS CMZE + DJMP CMZE +SPMAZE: INC E,D30 + INC D30,D30 + INC D30,D30 + INC D30,D30 + INC D10,140' +ARROWS: DJMS UPARR + DJMS RIGHTARR + DJMS DOWNARR + DJMS LEFTARR +RIGHTARR:INC E,D33 + INC D03,D33 + INC B30,B30 + INC B30,B10 + INC BM2M2,B02 + INC B02,B2M2 + INC D3M3,D3M3 + INC D0M3,140' +LEFTARR:INC E,D33 + INC D03,D33 + INC B22,B0M2 + INC B0M2,BM22 + INC B30,B30 + INC B30,B10 + INC D3M3,D3M3 + INC D0M3,140' +UPARR: INC E,D30 + INC D30,D30 + INC D23,B03 + INC B03,B03 + INC B01,BM2M2 + INC B20,B20 + INC BM22,D00 + INC D3M3,D3M3 + INC D3M3,D2M3 + INC D0M1,140' +DOWNARR:INC E,D30 + INC D30,D30 + INC D23,B12 + INC BM20,B1M2 + INC B03,B03 + INC B03,B01 + INC D3M3,D3M3 + INC D3M3,D2M3 + INC D0M1,140' +AWAY: DLV D,0,20. + DLV B,0,15. + DLV B,-2,-5. + DLV B,4.,0 + DLV B,-2.,5. + DLV D,0,-35. + DRJM +TOLEFT: DLV D,0,20. + DLV B,-15.,0 + DLV B,5.,2 + DLV B,0,-4. + DLV B,-5.,2 + DLV D,15.,-20. + DRJM +TORIGHT:DLV D,0,20. + DLV B,15.,0 + DLV B,-5.,2. + DLV B,0,-4. + DLV B,5.,2. + DLV D,-15.,-20. + DRJM + +; +; BIG EXPLOSION DISPLAY LIST +; +AD2: DHVS 2 + DADR ; TURN ON 8K DISPLAY ADDRESSING + DLXA 500 + DLYA 1200 + DJMS WAIT +; +; YOU WERE SHOT BY: +; +MESAGE: REPEAT 17.,DJMS DNOP + DLXA 1000 + DLYA 1000 + DJMS WAIT +; +; DJMS TO PLAYER WHO DID THE KILLING +; +WHODIDIT:DJMS D040 + DSTS 3 + +IRP N,,[1,2,3,4,5,6,7,8] +BIGX!N: DLXA 1000 +BIGY!N: DLYA 1000 + DJMS WAIT + DNOP + DNOP + DNOP + DJMS EXPLOSIN+2 +TERMIN + DHLT + SUBTTL Main Display List +; START OF MAIN DISPLAY LIST + +AD1: DHVS 1 + DADR ; TURN ON 8K DISPLAY ADDRESSING + ; (USE 0 BIT TO INDICATE WHICH 4K) + DLXA 50 + DLYA 1300 + DJMS WAIT + DJMS IML1 + DJMS DNL +SCORE: REPEAT 4,DNOP ; DISPLAY NAMES AND SCORES HERE + DJMS DNL + REPEAT 4,DNOP + DLXA 50 + DLYA 1100 + DJMS WAIT + DJMS IML2 + DJMS DNL + REPEAT 4,DNOP + DJMS DNL + REPEAT 4,DNOP + DLXA 50 + DLYA 700 + DJMS WAIT + DJMS IML3 + DJMS DNL + REPEAT 4,DNOP + DJMS DNL + REPEAT 4,DNOP + DLXA 50 + DLYA 500 + DJMS WAIT + DJMS IML4 + DJMS DNL + REPEAT 4,DNOP + DJMS DNL + REPEAT 4,DNOP + DLXA 1724 + DLYA 1300 + DJMS WAIT + DJMS IML5 + DJMS DNL2 + REPEAT 4,DNOP + DJMS DNL2 + REPEAT 4,DNOP + DLXA 1724 + DLYA 1100 + DJMS WAIT + DJMS IML6 + DJMS DNL2 + REPEAT 4,DNOP + DJMS DNL2 + REPEAT 4,DNOP + DLXA 1724 + DLYA 700 + DJMS WAIT + DJMS IML7 + DJMS DNL2 + REPEAT 4,DNOP + DJMS DNL2 + REPEAT 4,DNOP + DLXA 1724 + DLYA 500 + DJMS WAIT + DJMS IML8 + DJMS DNL2 + REPEAT 4,DNOP + DJMS DNL2 + REPEAT 4,DNOP + DLYA 1720 +; +; STATUS LINE +; + DLXA 60 + DJMS WAIT +ife fast,[ +ORIG: DJMS D040 ; ORIGIONAL ID + DJMS D040 +CURENT: DJMS D040 ; CURRENT ID + DJMS D040 +] +DEAD: DJMS D040 ; STATUS OF PLAYER + DJMS D040 +ERRCHAR:DJMS D040 ; NUMBER OF MESSAGES IN ERROR +; +; +; N, S, E, OR W LETTER +; + DLXA 1000 + DJMS WAIT + DSTS 3 +LETTER: DJMS D040 +; +; THIS IS WHERE THE 8 POSSIBLE PLAYERS APPEAR +; +; DLXA 1000 +; DLYA +; DSTS +; DJMS WAIT +; DJMS +; DJMS +; + +THING=.+1 +REPEAT 8.,[ + DLXA 1000 + DJMS D040 + DJMS D040 + DJMS WAIT + DJMS D040 + DJMS D040 +] + +; RING BUFFER + + DSTS 1 + DLXA 200 + DLYA 130 + DJMS WAIT +RING: DJMP RINGST +RINGST: DJMS D012 + DJMP CUR + BLOCK 160. +RINGEND:DJMP RINGST + +; DISPLAY LIST FOR MAZE STARTS HERE + +DLIST: DHLT + +; RETURN TO CONSOLE PROGRAM AFTER LOADING + + END 101' + \ No newline at end of file