From ae047ad3be09d38573b5cab895472e31ef7d47c7 Mon Sep 17 00:00:00 2001 From: sparky4 Date: Tue, 24 Nov 2015 13:48:20 -0600 Subject: [PATCH] wwww --- 16.exe | Bin 77503 -> 77502 bytes 16/x/default.fnt | 260 +++++++++++++ 16/x/makefile | 81 ++++ 16/x/modex.bak | Bin 0 -> 25600 bytes 16/x/modex.def | 163 ++++++++ 16/x/modex.h | 153 ++++++++ 16/x/modex.lbr | 39 ++ 16/x/modex.pas | 194 ++++++++++ 16/x/modex/DEMO01.EXE | Bin 0 -> 10208 bytes 16/x/modex/DEMO01.PAS | 126 ++++++ 16/x/modex/DEMO02.EXE | Bin 0 -> 24688 bytes 16/x/modex/DEMO02.PAS | 125 ++++++ 16/x/modex/DEMO03.EXE | Bin 0 -> 14256 bytes 16/x/modex/DEMO03.PAS | 152 ++++++++ 16/x/modex/DEMO04.DAT | Bin 0 -> 37662 bytes 16/x/modex/DEMO04.EXE | Bin 0 -> 24384 bytes 16/x/modex/DEMO04.PAS | 198 ++++++++++ 16/x/modex/DEMO05.EXE | Bin 0 -> 22528 bytes 16/x/modex/DEMO05.PAS | 131 +++++++ 16/x/modex/DEMO06.DAT | Bin 0 -> 77568 bytes 16/x/modex/DEMO06.EXE | Bin 0 -> 10864 bytes 16/x/modex/DEMO06.PAS | 135 +++++++ 16/x/modex/DEMO07.EXE | Bin 0 -> 7440 bytes 16/x/modex/DEMO07.PAS | 68 ++++ 16/x/modex/MATH.INC | 34 ++ 16/x/modex/PLASMA.PAS | 103 +++++ 16/x/modex/QIX2.EXE | Bin 0 -> 10336 bytes 16/x/modex/QIX2.PAS | 210 ++++++++++ 16/x/modex/README.TXT | 8 + 16/x/modex/SINCOS.INC | 518 +++++++++++++++++++++++++ 16/x/modex/THREED.ASM | 872 ++++++++++++++++++++++++++++++++++++++++++ 16/x/modex/THREED.H | 32 ++ 16/x/modex/THREED.PAS | 40 ++ 16/x/mxbb.asm | 278 ++++++++++++++ 16/x/mxcc.asm | 644 +++++++++++++++++++++++++++++++ 16/x/mxcg.asm | 69 ++++ 16/x/mxcl.asm | 151 ++++++++ 16/x/mxcr.asm | 380 ++++++++++++++++++ 16/x/mxel.asm | 167 ++++++++ 16/x/mxfb.asm | 194 ++++++++++ 16/x/mxfp.asm | 326 ++++++++++++++++ 16/x/mxgc.asm | 54 +++ 16/x/mxgi.asm | 132 +++++++ 16/x/mxgm.asm | 63 +++ 16/x/mxgp.asm | 56 +++ 16/x/mxgv.asm | 25 ++ 16/x/mxhl.asm | 76 ++++ 16/x/mxit.asm | 98 +++++ 16/x/mxll.asm | 82 ++++ 16/x/mxln.asm | 414 ++++++++++++++++++++ 16/x/mxot.asm | 330 ++++++++++++++++ 16/x/mxpb.asm | 22 ++ 16/x/mxpf.asm | 420 ++++++++++++++++++++ 16/x/mxpg.asm | 589 ++++++++++++++++++++++++++++ 16/x/mxpi.asm | 267 +++++++++++++ 16/x/mxpn.asm | 60 +++ 16/x/mxpp.asm | 121 ++++++ 16/x/mxra.asm | 37 ++ 16/x/mxrp.asm | 101 +++++ 16/x/mxsa.asm | 44 +++ 16/x/mxsc.asm | 50 +++ 16/x/mxsi.asm | 317 +++++++++++++++ 16/x/mxsl.asm | 62 +++ 16/x/mxsm.asm | 508 ++++++++++++++++++++++++ 16/x/mxsp.asm | 57 +++ 16/x/mxss.asm | 72 ++++ 16/x/mxtl.asm | 169 ++++++++ 16/x/mxvs.asm | 110 ++++++ 16/x/mxwd.asm | 28 ++ 16/x/mxwm.asm | 39 ++ 16/x/mxwp.asm | 62 +++ 16/x/mxwr.asm | 28 ++ bakapi.exe | Bin 84086 -> 77911 bytes exmmtest.exe | Bin 60945 -> 60946 bytes makefile | 9 +- planrpcx.exe | Bin 53347 -> 53346 bytes scroll.exe | Bin 94513 -> 94515 bytes src/bakapi.c | 4 +- src/lib/bakapee.c | 1 + src/lib/bakapee.h | 3 +- test.exe | Bin 49370 -> 49369 bytes 81 files changed, 10355 insertions(+), 6 deletions(-) create mode 100755 16/x/default.fnt create mode 100755 16/x/makefile create mode 100755 16/x/modex.bak create mode 100755 16/x/modex.def create mode 100755 16/x/modex.h create mode 100755 16/x/modex.lbr create mode 100755 16/x/modex.pas create mode 100755 16/x/modex/DEMO01.EXE create mode 100755 16/x/modex/DEMO01.PAS create mode 100755 16/x/modex/DEMO02.EXE create mode 100755 16/x/modex/DEMO02.PAS create mode 100755 16/x/modex/DEMO03.EXE create mode 100755 16/x/modex/DEMO03.PAS create mode 100755 16/x/modex/DEMO04.DAT create mode 100755 16/x/modex/DEMO04.EXE create mode 100755 16/x/modex/DEMO04.PAS create mode 100755 16/x/modex/DEMO05.EXE create mode 100755 16/x/modex/DEMO05.PAS create mode 100755 16/x/modex/DEMO06.DAT create mode 100755 16/x/modex/DEMO06.EXE create mode 100755 16/x/modex/DEMO06.PAS create mode 100755 16/x/modex/DEMO07.EXE create mode 100755 16/x/modex/DEMO07.PAS create mode 100755 16/x/modex/MATH.INC create mode 100755 16/x/modex/PLASMA.PAS create mode 100755 16/x/modex/QIX2.EXE create mode 100755 16/x/modex/QIX2.PAS create mode 100755 16/x/modex/README.TXT create mode 100755 16/x/modex/SINCOS.INC create mode 100755 16/x/modex/THREED.ASM create mode 100755 16/x/modex/THREED.H create mode 100755 16/x/modex/THREED.PAS create mode 100755 16/x/mxbb.asm create mode 100755 16/x/mxcc.asm create mode 100755 16/x/mxcg.asm create mode 100755 16/x/mxcl.asm create mode 100755 16/x/mxcr.asm create mode 100755 16/x/mxel.asm create mode 100755 16/x/mxfb.asm create mode 100755 16/x/mxfp.asm create mode 100755 16/x/mxgc.asm create mode 100755 16/x/mxgi.asm create mode 100755 16/x/mxgm.asm create mode 100755 16/x/mxgp.asm create mode 100755 16/x/mxgv.asm create mode 100755 16/x/mxhl.asm create mode 100755 16/x/mxit.asm create mode 100755 16/x/mxll.asm create mode 100755 16/x/mxln.asm create mode 100755 16/x/mxot.asm create mode 100755 16/x/mxpb.asm create mode 100755 16/x/mxpf.asm create mode 100755 16/x/mxpg.asm create mode 100755 16/x/mxpi.asm create mode 100755 16/x/mxpn.asm create mode 100755 16/x/mxpp.asm create mode 100755 16/x/mxra.asm create mode 100755 16/x/mxrp.asm create mode 100755 16/x/mxsa.asm create mode 100755 16/x/mxsc.asm create mode 100755 16/x/mxsi.asm create mode 100755 16/x/mxsl.asm create mode 100755 16/x/mxsm.asm create mode 100755 16/x/mxsp.asm create mode 100755 16/x/mxss.asm create mode 100755 16/x/mxtl.asm create mode 100755 16/x/mxvs.asm create mode 100755 16/x/mxwd.asm create mode 100755 16/x/mxwm.asm create mode 100755 16/x/mxwp.asm create mode 100755 16/x/mxwr.asm diff --git a/16.exe b/16.exe index 76cd8d247db381edde51f57af9aff50d16ad07a8..5eebd937486634b9d4f80cf101d90d475c644eaa 100755 GIT binary patch delta 46345 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 z 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 M;bD2^``qKw|J#I()Bpeg delta 46346 zcmW)nS5%Wt7lq&SLI|OS4xtLtReEm$MGz4J(m|SZAqiL@L5hR`VnwkccEt}AX;G?l z3q=tK2qGe(#E2M>lKifJF3y^pS?jFXH)o!`r+E_EG6~i62+#lp0w4ekT$2?F-SPi6 z|6hv#swi+kq|ra1`Pn&59W^MxvZMR<`+E7Sib5c$3EC;_lWB*+y@x=*UjTy^csSkrw4p$&!r zc9WHX^lCIoFL!jNHGqJeH_)bZo4c84${uD56l*&lLg2Dm5o!YCR_wgLYH4>&j%{)z zK-LJCU7L5*w6fBDZ!E}br9e1WfKE-8Y~?G5ZG&iQ@Ral&z#2qm(@x|PG9r}N538NB zfFkU3)LafxkD7sPup1FCF<>TO9#=uD&x!|`v89lfRH5mfI!HA~S4s;xaYI?{+7HMz z`Qm7yARySIe^F|&+Tb<5blXnI2@_sm>MjACW1@{Mkw+S@o%H>8t(au$(U{m@WFR%F z(y!~(5p5mIQ^B;PgbJI4)W}!qMK-llp`6V zK%yyRCp#_;L99-(lch{P%}Ci1>N0kK=cWMgBB?vDj8*x>eAsA#5`ApJkw+%C7 z8_x7ZmMeCkTb|}-)K#XEAm(-q&xr&Z_>qMZFG1B$ebJ|mgKQvKBrAwn*=a~pG_l?6 zJWWm*FE3FS3y$MYu(0)`ybi-hNoUFrbJ3k4SZ)uZL3UEf4_qS7=weTd7$xHPX{!bn z-Sxx~JelDFX8&fGXseWjjC9s3Sr${Ty=k!Dh7|Rc-@kblUrc%vFGp&YDJH%tnp7wn z+T1IDM?oe;@R12)`hxol*N7h(W(Kq*SFp+w3kfLcvt+vwX`ymx)%_UyF3>KlR4=Z* zSuZzlEeoyky{M-QAY$B4_-z$JwF+R?hCbqj&U{c#7Z}5Kfp^z~ag@1dp()4*iLNhM zj@9kxhFzGVppf^_7`1MU{y=S=9!S(WVs48LL}1KHELSbzLpQb z&WhJyq$yS9Vy0*Lmo#L;|=zV!U+dn<8H~)Ovj-QI4NGJVVNgp}8tD2~^c({(v7n-gj*(>R@ zQNq#HYMSee`WH?QeS@S%e*UN1F_x3kW$YkJ$2 z%P*joeTnlg-z>bWo~fwn6HmAJC-oWJ*H$oaM)tE?qN%~T?S)1F%u0vl&uqtHLd}QD z?L{)3SDKYhnNTPuL#$}BZxN!ue5f9)ks&mr;jiyMxO?pC9T?lXS>|@b!MbES^x|-s zhARHr4jqj&5EZldM6UO!B6tG1c+Nm-9Wp?#k>T@lItIy3pL>>lIYi#=)24Oe#v@Q= zetDmmK7dxMU|79gG%owws`%!I%%Z{a?G9B!xv^AEyt@i{)vuv}PYPFj7r#Ig zp+03pOMhgx``Wy`596;0YM^R40^+J*WBA)(^v2s%y*9S!(C3)=CM0OTRJN)f#<0W7 zOW0ob#g|_Ch#tCWY=YEo{fIC)Q45-5GdgDbRo7bPKd*C=1<7s4458kk9n%aXV|fzQgC(zRC@GCFHbKNl#3IC!^Qd)j!fatv~AG7b*blIkEW^r zb$LJ7M)p;dtEC_ekCBnqt9oe!>jcxon0Xku?jQ^v=x%V@eo2Ul!OPs65n5-GzgP#8 z$NAQlb1oVp7j?pv_T;3 z4GD71jTu%R;MK~}1OvUYlv7d{^n{wtlAie1J!b9mw|N4NkMKG~g8m-)@m7U-oFgQD zI+;Thc_V=FG-h&b7?N!NmhxSkF~f z{C`(z4)X}X;;S|5Ad0TkrlONo$ca<}Glh|BER0UmwKk-sxlpq7+jg2jm5NBug~18i ze_N<*>(uQudFv$d@C7A-=JsMBm1UhcaqzSo)H>9|JbV=yx@weaV*S%1-PkBzZ+GAZ z|0gsP9e`v_^~hj^oM@pnd9gS>@j~!xWCZyy>(e6L3lLg6q(ZHUqtq7)lHq32)UvRb zid%9hTDws*1n=#7?;}LwUIx5ZzlaS_&H8?5!NgBh_3pWVeI^DrTC;8(eeugn+|j6+ z!0K6P2i6bL7p12ve+=sj_BELN8a<#0`dkKg|BKpHTdFvrr69KKS@#8oob!d{@mEPR z^Vdw^nN6xQfb@3!=d%$x!5L(?N+s-Vbc(Y&&5@jKmUn5|>PN1;UW|Ufb_6N@Mcq^Q zV=*Bj`pG8*uNKZ;a}=guCqExDcQe;eVg(_@j3Pl#!M(+QUdSv?-@4)_g5NR`dh!g{ zc|c~}-9sxHw~RaDlxV?eD%OGI``WyuvabU6)>6I`$c%yD@ZE$QGs$l@V5tfb+at70 zsfLr333myM2Ih^mvQUjQDd&m4IXZ7s=1g2TshQW83L(dO1U_+lyg&sx*Vd=40PDnL=sxrrXyu6>J^=X}2=*Cz!>7!a31C zVuIcrp--j@sr!7zsWyrddUjo@w!fHfjLdcGGj! zBmdg!q`L&{myDyyyy>?Q@h9hY1xQyM_q*K~9pivY6K7+#*G2ZOiyUZQ;v{U@gT0Ty zMjQAt73%9|*sX@#ZB1CrCWcV8$|R`_ZK{Sw0DUUXGk<$kQ?#i$?i(8+hXcjsj{y6H zhhn42fOcX=fzFgN3ZOZWg{cXE<`IHsMiQ8UW-CQ0KJ`|kdBr#<0g-Qxre?ahK+svh zp_K3=Q5>t|HqKEkmR_mkLr0Qb!c)@N`{QxR_368kk~b2QDQQuNM{9sjcmyshF8O#G z;5H&7^-}j)lJ>T53P3d8H4HHZjh*zQBucRy;}7AhEWnp(=4R|;X(TGq6x?sJM{oCk z2IIh~>pHgM*MB+&1A)L=0B{&+5cmUrz}_Tw6e%!(JQA(73>?&80|x?tdXJBQ`#7*q zX)+sdt#a~@zyDug0>EO@9weW;ib0pmNT(SwuF=ScId41|$#;9gEnTuf#HsA0aq{qD@gO5Lps zlDlQS&qK5(3!%6I79x`+S^#n{7ZF7)X%#@zhTe>=Q{7W@Gt);)cx2P6kDWBB!m7vE zZ6jgf830uMY)h|uOCJG&{MkL4i?I=X9=gTjxC-|yS)vtYFSWM1TX{U7kM04P8HW%) z#mfc8S*r_n(60ibuIKpH0qMnjQE;hoQ{J(Wqgs3dC$30|dQNTf$w8yWABUfjS|WV% z=rcXmCrC$qaGT^O^rVATva}rZRk_-MSHf$0;W>JTKkH^&L8#h7GtfZLCg>wMSK95U zF*;Fa8#!pAc>a^wHEeNv2v_djDf*$wSFgk+DWt7hZQNYh4$D*#$ev@bghA;gI`$9k z2d@TpMi&cWUUc}~k#GCty0gxx{odS5o~FVMZtVOHiAPH}Ppfwoe3+zx*ZG1%PkuFM zXnGX2GXLSY=>A01`g6(kldIPqvo@MQ;H5H^`zwi?&qOA73;DZ+yM(^43xtwO9%PBa zQMJtp$nU~_M9U;(6WmYvvk+WZqQ7I9Wl*vXqy1#mEeRQ%X08yNc;h&nUYn2bu;TlqZ&};32dDt z3?zMr=Q_vOkj0>Hc#MndB4G41g3`&g5Z+!0Z*51x^fMY?Zp4O$tUEL;6P+!b?hN7Y zt_g#TcMJUWJ9&#%@bsUZ}$t6 z=X8}F+cAS_LN-}3XA?;s|M$MqudU~=u6>g~G=_xA|89#{imi;*b9i3gUc5HC%+VD> z`HPQeEM&bO&mbNB^_MM^gTj|#TGg&m#}#buPe12S^{g9QGk1FlFgcf#hDLSVV5BuefxM1JWy5*9aQkbF`bXbBRUY#?N z$KY==ewBthKl>~#+0HacT8XQcDhm<&SgA12D3A&Msq5LIFvRFt``tOn(Ivm|4q^9Q zhEEa_F@63Z_u7Pnc;l1#@qSc<@6sSkp3*DKi>{PDr*^e->G2EUD**u!xb5M|fx z+nn=xrEUk$Fy?8o6`F@h{02j1b-1Un+X^m_PCLK=R$mWV&F;Jj&ne6NU9m2$Ft(8^ zJ<59nS{-g|_5FhK0b?iJYuykq6HgI+qsG>KBWA99maS|(*HdfeGd5*!0F#gAd7CKf zGiQn`jTCq1?GV454&QfjhL$n^RlvV~CgO*D&YAkk-{LflJ)*7(1v!6&;M6{XS^awu z;J=B4$gQOd$5grWa7|UHOO5P@$1hrtA|P(g1{m>o9>@_uo&%r}=*?U;Id0ViZXQOF zYtyNKuc_BHE5VmdzXLf0?0Ha-lSq2fs4NjH=t3y6#6Z=hrUv@>D)am>ypo&lZ#?kV zokf!b{(7*)A-&YwpySN zi9FlI=@JT#?vj#(YJR1NTmyY<;O2jo5JasYf8NV2>4Kqt_N*cYe&uk-7v|Icc1*|n z`G6QMk*LW-EOj>G2c$1)MzdO=%5T8ZDm?sh-iacg$1PoCbQAo{VSoh59}m_vJ*D5C z%=Igr4%Gd<{Y0|&_v6q#8KHYmW_mTC9b>>^&x5D<{0?K_`k0#^fQQ8`*}ZJH$b~Yk9)Ct zt?syM`o~dCkI`|}5C-BLvYoQm5DNxy^-_xV=O2Wx*4y$Kzd;_54indgjxmMy5Mh{a z^sd{JPh@^4FBAji= z-yU~ZU$U>RZ8pTF=^<}g%yrX5xLypUW$yfGyJcqe4p4u&;rLrap1AxITMJ0LwwG!J z=83`9?P>k9faxr80ltuEH&8uwHDUrFGTx5{ynT<<%kf54*@!lzqeapU{sb^F~6I)37(0wQ`*o%=SS`P0h9^1 z*QerOELfyWT%$45-K~mg9POqXLGCN7WR7Ghtq`J)5RV~Fr_wy4i+bWIZHqv}Q^9{O%T zp+XxCqDCQDbI$46Hv^t6xN8KfyUMp=p=%o8-CW}MfojFwR^zTe`BP*S4gFop?x+FgWU43>gF+&Q0jt)Fet4lSPG{heO6(-WZYkzG@^It zXB+cF+}lfsUv}@be%zzFObA_c&dFL3IqEH^PMS+FPibRD9gl0}NBK-M`Y*(Q&ve=* z*oa8P(mFVs5Y}BVw6OJ4(`>0T=M>PR&6!1DSM8N;SnGr{LlQ^L{VH@VY1AARX>`s zFCw3yep3C&fr8|LW;$q~#j!~^03kDyH%7JSFKxx^a`uSaVVha19HWRieXRJQhwggt zP4qf3{OBXsYbMqrX>aEXiTvknVNJ$SoQ44q8AKd-^dJ5svZUGjnIpKP)Nj!lh<@1i zI?5y!15jkcU)vxXxDtyJ(#l+GjgbPHLBe_$2!o; zgy8sRT4KrcsqSACvYNt2>L7*EydUJ3N02`RKPYR9Ul*}=4`kl$r1D0OkxTZ;1O-Z+ z)eSbJeg~nZyP&1gvRlx5kZ}9`ci#`BIBAF~pbF$dE@g|h@(G=$yp`c@nq!qY{Rgpg zlkOD7&arVo!`Sy!7UwsKIfCxQ52CHv0@d!54fqOFDZI$2#6CGLu=Tb%FYL;NJl>8K z4HGPt6u2OAqN>|Veo#ClzyAfQKqY35TytG@dhwDA?u!weI@Ff3tix8Dv=sH7NjEJ2tYO-M_oq#n5wMPn65Ms22%k0ymf4hHt5 zPDRDQqv|u{qaw%B2nGqVQm(sR?zAt_iaL5bP&0KeGBY+jDYD)cFtXTVzbpsk6B5Hy z_L`;P?2Mc}o;!$brbUsDB_454#wC#xo*$1B0v;Zr&XoDY6zAgO%a#PE#La}rq#b12 z#FQQN1bJs)+Lnixfw8G-+DZyFDmtt2T8lP0^=JeoH6;hz0{D9zN{rf0w9!nUp!x0| zx#KS4pZ7ww#h*+N03$XbWdxC)O1T&QOynCNcG*$EBPSos*M}I!+#;9f<`J)ne+T!&%!IC?F!d3R791 zDq^&UB6_G^*799Fg6t)-JEkt`gX7Q4ctTRLho9q+mZr<|O@Cr|>y zqg_+<2=6ph#tA73;x8~iZqKcmAstrGJrmrBDAV|4>cFFFg`?v;lYq&hqbHuG?t=p( zZ5Ud6G-mt=OIo+;Pj|d`nxn?cGUvLWq;V|ZGjNS1=bM(}$PA}D2D7PS2GC@WaBBF+ zqY3+c#49!r#U`hFIO0FOK*VQH;87isrU^$VeYmfylKPdHSftUyjvc?xq)IBPDUH{; z`n%*wCO;z>7*Gt!pED9XlT(4-CVih2McPAM@%+Seh^RI>Gd`{2Rpi$w*TkbF3>q&& z{`KQ+h%oRFMfRFJQwcvivHv^%R3!Q!pN*$D$*^sdV%Xr~b7)DZzB=s~4pl=u52;veZc7EUD4d9u&^?ti1CMir>u z-T7UAsNJ~FSZd!+1&0HX2k)k3?>%4&;E}kydSc3i$l9l#virYB(mf0cFYnny3ygL? z^EWUe>}b4Qae1|pOs09t%gUH1@$HG}^7#psm{+z_s*gQRjRZTD7JEb-W`}uxC~L5} zyJIp<@xv%1GDW3VzvkW*2&%(gz^oaO8DSV zQ09IL`C39E22bmVK2@wHZ!~?Q)+gq2X|?xe+R+ma@QMiF@VHGn5UMdyZA-gI|DbbL zznUIFFUtcDC8xH^+v~MLx|4j9_&JeOqZ=2)RTu7}f-#Y)!(Bak=e+JxJ}yShpzx;n z@21{F7Cb7_?P0u^Xt>oIqgtN>ReB=DmcimlPKk+wq_}f)AGkSg@aQXtF;8U~%9@y9 z&3B+Ua8;q)$vfz?uulyVxwPG@;3j(P+bNrOs;N3`<|xwHjF3H(Lw|Tuz5#*xBZ)SA zAXaOejzV?kx2*~d2H?Op5&+!R14@I#`p%0AvzMv?FK_6;87{>9(^6bTc1R#>9y&iK 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 IiQnn}0U!= + DB 078h, 084h, 004h, 008h, 010h, 000h, 010h, 000h ; ? + DB 07Ch, 082h, 0BAh, 0A6h, 0BEh, 080h, 07Ch, 000h ; @ + DB 078h, 084h, 084h, 0FCh, 084h, 084h, 084h, 000h ; A + DB 0F8h, 084h, 084h, 0F8h, 084h, 084h, 0F8h, 000h ; B + DB 078h, 084h, 080h, 080h, 080h, 084h, 078h, 000h ; C + DB 0F0h, 088h, 084h, 084h, 084h, 088h, 0F0h, 000h ; D + DB 0FCh, 080h, 080h, 0F0h, 080h, 080h, 0FCh, 000h ; E + DB 0FCh, 080h, 080h, 0F0h, 080h, 080h, 080h, 000h ; F + DB 078h, 084h, 080h, 09Ch, 084h, 084h, 078h, 000h ; G + DB 084h, 084h, 084h, 0FCh, 084h, 084h, 084h, 000h ; H + DB 038h, 010h, 010h, 010h, 010h, 010h, 038h, 000h ; I + DB 01Ch, 008h, 008h, 008h, 088h, 088h, 070h, 000h ; J + DB 084h, 088h, 090h, 0E0h, 090h, 088h, 084h, 000h ; K + DB 080h, 080h, 080h, 080h, 080h, 080h, 0FCh, 000h ; L + DB 0C6h, 0AAh, 092h, 082h, 082h, 082h, 082h, 000h ; M + DB 082h, 0C2h, 0A2h, 092h, 08Ah, 086h, 082h, 000h ; N + DB 078h, 084h, 084h, 084h, 084h, 084h, 078h, 000h ; O + DB 0F8h, 084h, 084h, 0F8h, 080h, 080h, 080h, 000h ; P + DB 078h, 084h, 084h, 084h, 094h, 088h, 076h, 000h ; Q + DB 0F8h, 084h, 084h, 0F8h, 090h, 088h, 084h, 000h ; R + DB 078h, 084h, 080h, 078h, 004h, 084h, 078h, 000h ; S + DB 0FEh, 010h, 010h, 010h, 010h, 010h, 010h, 000h ; T + DB 084h, 084h, 084h, 084h, 084h, 084h, 078h, 000h ; U + DB 084h, 084h, 084h, 084h, 084h, 048h, 030h, 000h ; V + DB 082h, 082h, 082h, 082h, 092h, 0AAh, 0C6h, 000h ; W + DB 082h, 044h, 028h, 010h, 028h, 044h, 082h, 000h ; X + DB 044h, 044h, 044h, 038h, 010h, 010h, 010h, 000h ; Y + DB 0FEh, 004h, 008h, 010h, 020h, 040h, 0FEh, 000h ; Z + DB 078h, 040h, 040h, 040h, 040h, 040h, 078h, 000h ; [ + DB 000h, 080h, 040h, 020h, 010h, 008h, 004h, 000h ; \ + DB 078h, 008h, 008h, 008h, 008h, 008h, 078h, 000h ; ] + DB 010h, 028h, 044h, 082h, 000h, 000h, 000h, 000h ; ^ + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0FFh ; _ + DB 020h, 020h, 010h, 000h, 000h, 000h, 000h, 000h ; ` + DB 000h, 000h, 038h, 004h, 03Ch, 044h, 07Ch, 000h ; a + DB 000h, 040h, 040h, 078h, 044h, 044h, 078h, 000h ; b + DB 000h, 000h, 03Ch, 040h, 040h, 040h, 03Ch, 000h ; c + DB 000h, 004h, 004h, 03Ch, 044h, 044h, 03Ch, 000h ; d + DB 000h, 000h, 038h, 044h, 07Ch, 040h, 03Ch, 000h ; e + DB 000h, 00Ch, 010h, 03Ch, 010h, 010h, 010h, 000h ; f + DB 000h, 000h, 03Ch, 044h, 044h, 03Ch, 004h, 038h ; g + DB 000h, 040h, 040h, 078h, 044h, 044h, 044h, 000h ; h + DB 000h, 010h, 000h, 010h, 010h, 010h, 010h, 000h ; i + DB 000h, 004h, 000h, 004h, 004h, 004h, 044h, 038h ; j + DB 000h, 040h, 040h, 050h, 060h, 050h, 048h, 000h ; k + DB 000h, 030h, 010h, 010h, 010h, 010h, 010h, 000h ; l + DB 000h, 000h, 068h, 054h, 054h, 044h, 044h, 000h ; m + DB 000h, 000h, 078h, 044h, 044h, 044h, 044h, 000h ; n + DB 000h, 000h, 038h, 044h, 044h, 044h, 038h, 000h ; o + DB 000h, 000h, 078h, 044h, 044h, 078h, 040h, 040h ; p + DB 000h, 000h, 03Ch, 044h, 044h, 03Ch, 004h, 004h ; q + DB 000h, 000h, 05Ch, 060h, 040h, 040h, 040h, 000h ; r + DB 000h, 000h, 038h, 040h, 07Ch, 004h, 07Ch, 000h ; s + DB 000h, 010h, 038h, 010h, 010h, 010h, 018h, 000h ; t + DB 000h, 000h, 044h, 044h, 044h, 044h, 038h, 000h ; u + DB 000h, 000h, 044h, 044h, 044h, 028h, 010h, 000h ; v + DB 000h, 000h, 044h, 044h, 054h, 054h, 06Ch, 000h ; w + DB 000h, 000h, 044h, 028h, 010h, 028h, 044h, 000h ; x + DB 000h, 000h, 044h, 044h, 044h, 03Ch, 004h, 07Ch ; y + DB 000h, 000h, 07Ch, 004h, 038h, 040h, 07Ch, 000h ; z + DB 000h, 008h, 010h, 010h, 030h, 010h, 010h, 008h ; { + DB 000h, 010h, 010h, 010h, 000h, 010h, 010h, 010h ; | + DB 000h, 020h, 010h, 010h, 018h, 010h, 010h, 020h ; } + DB 064h, 098h, 000h, 000h, 000h, 000h, 000h, 000h ; ~ + DB 000h, 010h, 028h, 044h, 082h, 082h, 0FEh, 000h ;  + DB 07Ch, 080h, 080h, 080h, 080h, 07Ch, 004h, 07Ch ; #128 + DB 000h, 028h, 000h, 044h, 044h, 044h, 038h, 000h ; #129 + DB 03Ch, 000h, 07Ch, 044h, 07Ch, 040h, 07Ch, 000h ; #130 + DB 07Eh, 081h, 038h, 004h, 03Ch, 044h, 07Ch, 000h ; #131 + DB 024h, 000h, 038h, 004h, 03Ch, 044h, 07Ch, 000h ; #132 + DB 078h, 000h, 038h, 004h, 03Ch, 044h, 07Ch, 000h ; #133 + DB 018h, 018h, 038h, 004h, 03Ch, 044h, 07Ch, 000h ; #134 + DB 000h, 000h, 078h, 080h, 080h, 078h, 008h, 038h ; #135 + DB 07Ch, 082h, 038h, 044h, 07Ch, 040h, 03Ch, 000h ; #136 + DB 048h, 000h, 038h, 044h, 07Ch, 040h, 03Ch, 000h ; #137 + DB 078h, 000h, 038h, 044h, 07Ch, 040h, 03Ch, 000h ; #138 + DB 000h, 028h, 000h, 010h, 010h, 010h, 010h, 000h ; #139 + DB 010h, 028h, 000h, 010h, 010h, 010h, 010h, 000h ; #140 + DB 000h, 030h, 000h, 010h, 010h, 010h, 010h, 000h ; #141 + DB 048h, 000h, 078h, 084h, 0FCh, 084h, 084h, 000h ; #142 + DB 030h, 030h, 078h, 084h, 0FCh, 084h, 084h, 000h ; #143 + DB 038h, 000h, 0FCh, 080h, 0F0h, 080h, 0FCh, 000h ; #144 + DB 000h, 000h, 07Eh, 008h, 07Eh, 048h, 07Eh, 000h ; #145 + DB 07Eh, 090h, 090h, 0FCh, 090h, 090h, 09Eh, 000h ; #146 + DB 07Ch, 082h, 038h, 044h, 044h, 044h, 038h, 000h ; #147 + DB 028h, 000h, 038h, 044h, 044h, 044h, 038h, 000h ; #148 + DB 070h, 000h, 038h, 044h, 044h, 044h, 038h, 000h ; #149 + DB 038h, 044h, 000h, 044h, 044h, 044h, 038h, 000h ; #150 + DB 070h, 000h, 044h, 044h, 044h, 044h, 038h, 000h ; #151 + DB 028h, 000h, 044h, 044h, 044h, 03Ch, 004h, 07Ch ; #152 + DB 048h, 000h, 078h, 084h, 084h, 084h, 078h, 000h ; #153 + DB 048h, 000h, 084h, 084h, 084h, 084h, 078h, 000h ; #154 + DB 000h, 010h, 038h, 040h, 040h, 040h, 038h, 010h ; #155 + DB 038h, 044h, 040h, 0E0h, 040h, 040h, 082h, 0FCh ; #156 + DB 044h, 07Ch, 010h, 07Ch, 010h, 07Ch, 010h, 000h ; #157 + DB 0F0h, 088h, 08Ah, 0F7h, 082h, 082h, 082h, 000h ; #158 + DB 00Ch, 012h, 010h, 018h, 030h, 010h, 090h, 060h ; #159 + DB 03Ch, 000h, 038h, 004h, 03Ch, 044h, 07Ch, 000h ; #160 + DB 000h, 018h, 000h, 010h, 010h, 010h, 010h, 000h ; #161 + DB 01Ch, 000h, 038h, 044h, 044h, 044h, 038h, 000h ; #162 + DB 01Ch, 000h, 044h, 044h, 044h, 044h, 038h, 000h ; #163 + DB 07Ch, 000h, 078h, 044h, 044h, 044h, 044h, 000h ; #164 + DB 07Ch, 000h, 044h, 064h, 054h, 04Ch, 044h, 000h ; #165 + DB 018h, 024h, 024h, 01Eh, 000h, 03Eh, 000h, 000h ; #166 + DB 01Ch, 022h, 022h, 01Ch, 000h, 03Eh, 000h, 000h ; #167 + DB 010h, 000h, 010h, 020h, 040h, 042h, 03Ch, 000h ; #168 + DB 000h, 000h, 000h, 0FCh, 080h, 080h, 000h, 000h ; #169 + DB 000h, 000h, 000h, 0FCh, 004h, 004h, 000h, 000h ; #170 + DB 040h, 044h, 048h, 057h, 021h, 047h, 004h, 007h ; #171 + DB 040h, 044h, 048h, 052h, 026h, 04Ah, 01Fh, 002h ; #172 + DB 010h, 000h, 010h, 010h, 010h, 010h, 010h, 000h ; #173 + DB 000h, 024h, 048h, 090h, 048h, 024h, 000h, 000h ; #174 + DB 000h, 048h, 024h, 012h, 024h, 048h, 000h, 000h ; #175 + DB 022h, 088h, 022h, 088h, 022h, 088h, 022h, 088h ; #176 + DB 055h, 0AAh, 055h, 0AAh, 055h, 0AAh, 055h, 0AAh ; #177 + DB 0DBh, 077h, 0DBh, 0EEh, 0DBh, 077h, 0DBh, 0EEh ; #178 + DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h ; #179 + DB 018h, 018h, 018h, 018h, 0F8h, 018h, 018h, 018h ; #180 + DB 018h, 018h, 0F8h, 018h, 0F8h, 018h, 018h, 018h ; #181 + DB 036h, 036h, 036h, 036h, 0F6h, 036h, 036h, 036h ; #182 + DB 000h, 000h, 000h, 000h, 0FEh, 036h, 036h, 036h ; #183 + DB 000h, 000h, 0F8h, 018h, 0F8h, 018h, 018h, 018h ; #184 + DB 036h, 036h, 0F6h, 006h, 0F6h, 036h, 036h, 036h ; #185 + DB 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h ; #186 + DB 000h, 000h, 0FEh, 006h, 0F6h, 036h, 036h, 036h ; #187 + DB 036h, 036h, 0F6h, 006h, 0FEh, 000h, 000h, 000h ; #188 + DB 036h, 036h, 036h, 036h, 0FEh, 000h, 000h, 000h ; #189 + DB 018h, 018h, 0F8h, 018h, 0F8h, 000h, 000h, 000h ; #190 + DB 000h, 000h, 000h, 000h, 0F8h, 018h, 018h, 018h ; #191 + DB 018h, 018h, 018h, 018h, 01Fh, 000h, 000h, 000h ; #192 + DB 018h, 018h, 018h, 018h, 0FFh, 000h, 000h, 000h ; #193 + DB 000h, 000h, 000h, 000h, 0FFh, 018h, 018h, 018h ; #194 + DB 018h, 018h, 018h, 018h, 01Fh, 018h, 018h, 018h ; #195 + DB 000h, 000h, 000h, 000h, 0FFh, 000h, 000h, 000h ; #196 + DB 018h, 018h, 018h, 018h, 0FFh, 018h, 018h, 018h ; #197 + DB 018h, 018h, 01Fh, 018h, 01Fh, 018h, 018h, 018h ; #198 + DB 036h, 036h, 036h, 036h, 037h, 036h, 036h, 036h ; #199 + DB 036h, 036h, 037h, 030h, 03Fh, 000h, 000h, 000h ; #200 + DB 000h, 000h, 03Fh, 030h, 037h, 036h, 036h, 036h ; #201 + DB 036h, 036h, 0F7h, 000h, 0FFh, 000h, 000h, 000h ; #202 + DB 000h, 000h, 0FFh, 000h, 0F7h, 036h, 036h, 036h ; #203 + DB 036h, 036h, 037h, 030h, 037h, 036h, 036h, 036h ; #204 + DB 000h, 000h, 0FFh, 000h, 0FFh, 000h, 000h, 000h ; #205 + DB 036h, 036h, 0F7h, 000h, 0F7h, 036h, 036h, 036h ; #206 + DB 018h, 018h, 0FFh, 000h, 0FFh, 000h, 000h, 000h ; #207 + DB 036h, 036h, 036h, 036h, 0FFh, 000h, 000h, 000h ; #208 + DB 000h, 000h, 0FFh, 000h, 0FFh, 018h, 018h, 018h ; #209 + DB 000h, 000h, 000h, 000h, 0FFh, 036h, 036h, 036h ; #210 + DB 036h, 036h, 036h, 036h, 03Fh, 000h, 000h, 000h ; #211 + DB 018h, 018h, 01Fh, 018h, 01Fh, 000h, 000h, 000h ; #212 + DB 000h, 000h, 01Fh, 018h, 01Fh, 018h, 018h, 018h ; #213 + DB 000h, 000h, 000h, 000h, 03Fh, 036h, 036h, 036h ; #214 + DB 036h, 036h, 036h, 036h, 0FFh, 036h, 036h, 036h ; #215 + DB 018h, 018h, 0FFh, 018h, 0FFh, 018h, 018h, 018h ; #216 + DB 018h, 018h, 018h, 018h, 0F8h, 000h, 000h, 000h ; #217 + DB 000h, 000h, 000h, 000h, 01Fh, 018h, 018h, 018h ; #218 + DB 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ; #219 + DB 000h, 000h, 000h, 000h, 0FFh, 0FFh, 0FFh, 0FFh ; #220 + DB 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h ; #221 + DB 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh ; #222 + DB 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h, 000h, 000h ; #223 + DB 000h, 000h, 062h, 094h, 088h, 094h, 062h, 000h ; #224 + DB 000h, 0F0h, 088h, 0F0h, 088h, 088h, 0F0h, 080h ; #225 + DB 000h, 0F8h, 088h, 080h, 080h, 080h, 080h, 000h ; #226 + DB 000h, 0FCh, 048h, 048h, 048h, 048h, 048h, 000h ; #227 + DB 0FCh, 084h, 040h, 020h, 040h, 084h, 0FCh, 000h ; #228 + DB 03Ch, 040h, 038h, 044h, 044h, 044h, 038h, 000h ; #229 + DB 000h, 000h, 044h, 044h, 044h, 078h, 040h, 040h ; #230 + DB 000h, 036h, 048h, 008h, 008h, 008h, 008h, 000h ; #231 + DB 038h, 010h, 038h, 044h, 044h, 038h, 010h, 038h ; #232 + DB 078h, 084h, 084h, 0FCh, 084h, 084h, 078h, 000h ; #233 + DB 078h, 084h, 084h, 084h, 048h, 048h, 0CCh, 000h ; #234 + DB 078h, 004h, 038h, 044h, 044h, 044h, 038h, 000h ; #235 + DB 000h, 000h, 06Ch, 092h, 092h, 06Ch, 000h, 000h ; #236 + DB 000h, 000h, 03Ah, 044h, 05Ah, 022h, 05Ch, 000h ; #237 + DB 018h, 020h, 040h, 078h, 040h, 020h, 018h, 000h ; #238 + DB 078h, 084h, 084h, 084h, 084h, 084h, 084h, 000h ; #239 + DB 000h, 0FCh, 000h, 0FCh, 000h, 0FCh, 000h, 000h ; #240 + DB 020h, 020h, 0F8h, 020h, 020h, 000h, 0F8h, 000h ; #241 + DB 020h, 010h, 008h, 010h, 020h, 000h, 07Ch, 000h ; #242 + DB 008h, 010h, 020h, 010h, 008h, 000h, 07Ch, 000h ; #243 + DB 00Ch, 012h, 010h, 010h, 010h, 010h, 010h, 010h ; #244 + DB 010h, 010h, 010h, 010h, 010h, 010h, 090h, 060h ; #245 + DB 000h, 010h, 000h, 07Ch, 000h, 010h, 000h, 000h ; #246 + DB 000h, 032h, 04Ch, 000h, 032h, 04Ch, 000h, 000h ; #247 + DB 038h, 044h, 044h, 038h, 000h, 000h, 000h, 000h ; #248 + DB 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h ; #249 + DB 000h, 000h, 000h, 000h, 018h, 000h, 000h, 000h ; #250 + DB 00Eh, 008h, 008h, 008h, 048h, 028h, 018h, 008h ; #251 + DB 038h, 024h, 024h, 024h, 024h, 000h, 000h, 000h ; #252 + DB 03Ch, 004h, 03Ch, 020h, 03Ch, 000h, 000h, 000h ; #253 + DB 000h, 000h, 03Ch, 03Ch, 03Ch, 03Ch, 000h, 000h ; #254 + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h ; #255 diff --git a/16/x/makefile b/16/x/makefile new file mode 100755 index 00000000..d3ad8b71 --- /dev/null +++ b/16/x/makefile @@ -0,0 +1,81 @@ +# +# MODEX library makefile (for Borland MAKE) +# Copyright (c) 1993,1994 by Alessandro Scotti +# +LIBINCS = MODEX.DEF + +LIBOBJS = MXBB.OBJ \ + MXCC.OBJ \ + MXCG.OBJ \ + MXCL.OBJ \ + MXCR.OBJ \ + MXFB.OBJ \ + MXFP.OBJ \ + MXGC.OBJ \ + MXGI.OBJ \ + MXGM.OBJ \ + MXGP.OBJ \ + MXGV.OBJ \ + MXHL.OBJ \ + MXIT.OBJ \ + MXLL.OBJ \ + MXLN.OBJ \ + MXOT.OBJ \ + MXPB.OBJ \ + MXPF.OBJ \ + MXPG.OBJ \ + MXPI.OBJ \ + MXPN.OBJ \ + MXPP.OBJ \ + MXRA.OBJ \ + MXRP.OBJ \ + MXSA.OBJ \ + MXSC.OBJ \ + MXSI.OBJ \ + MXSL.OBJ \ + MXSM.OBJ \ + MXSP.OBJ \ + MXSS.OBJ \ + MXTL.OBJ \ + MXVS.OBJ \ + MXWD.OBJ \ + MXWM.OBJ \ + MXWP.OBJ \ + MXWR.OBJ + +# +# ASM compiler +# +ASMC = tasm +ASMO = /m5 /p + +# +# PAS compiler +# +PASC = tpc +PASO = /m -$D- -$L- -$S- + +# +# LIB maker, uses response file +# +LIBC = tlib + +.asm.obj: + $(ASMC) $(ASMO) $< + +target: modex.lib +# modex.tpu modex.tpp + +#modex.tpu: $(LIBOBJS) modex.pas +# $(PASC) $(PASO) modex +# copy modex.tpu .. +# copy modex.pas .. + +#modex.tpp: $(LIBOBJS) modex.pas +# $(PASC) /cp $(PASO) modex +# copy modex.tpp .. + +modex.lib: modex.lbr $(LIBOBJS) + $(LIBC) modex.lib @modex.lbr + +$(LIBOBJS): modex.def diff --git a/16/x/modex.bak b/16/x/modex.bak new file mode 100755 index 0000000000000000000000000000000000000000..560a1c68304c56844f41325820f296a21192ac4e GIT binary patch literal 25600 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 literal 0 HcmV?d00001 diff --git a/16/x/modex.def b/16/x/modex.def new file mode 100755 index 00000000..45bd900f --- /dev/null +++ b/16/x/modex.def @@ -0,0 +1,163 @@ +;------------------------------------------------------------ +; +; MODEX.DEF - Include file +; Copyright (c) 1993-1994 by Alessandro Scotti +; +JUMPS +LOCALS + +TRUE EQU 1 ; Boolean constants +FALSE EQU 0 + +USE286 = FALSE ; TRUE enables 80286 instructions +USE386 = FALSE ; TRUE enables 80386 (and 80286) instructions + +IF USE286 EQ TRUE + P286 +ENDIF + +IF USE386 EQ TRUE + P386 + USE286 = TRUE +ENDIF + +MXVERSION EQU 0128h ; Library version (1.40) + +;------------------------------------------------------------ +; +; VGA definitions +; +MISC EQU 3C2h ; Miscellaneous output +TS EQU 3C4h ; Timing Sequencer index register +GDC EQU 3CEh ; Graphics Data Controller index register +CRTC EQU 3D4h ; CRTC index register +STATUS EQU 3DAh ; Input Status register one + +;------------------------------------------------------------ +; +; Raster operators +; +OP_SET EQU 0 +OP_MOVE EQU 0 ; Same as OP_SET +OP_AND EQU 1 +OP_OR EQU 2 +OP_XOR EQU 3 +OP_TRANS EQU 4 +OP_ADD EQU 5 ; Must be last op + +;------------------------------------------------------------ +; +; Polygon fill functions +; +POLYSCANBUFSIZE EQU 4*1024 + +;------------------------------------------------------------ +; Macro to push registers, variables or flags onto the stack +; Usage: .push "loc16"[,"loc16"...] +; where "loc16" is a 16-bit register, a word-sized variable or the +; keyword "FLAGS". +; Exmpl: .push ax, flags, var1 +; .pop ax, flags, var1 +; +.push MACRO r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10 + IFNB + .ERROR <.PUSH has more than 10 arguments> + ENDIF + IRP $reg, + IFB <$reg> ;; Is argument blank? + EXITM ;; Yes, exit + ELSEIFIDNI <$reg>, ;; Is argument the keyword "FLAGS"? + pushf ;; Yes, push flags + ELSE + push $reg ;; Push argument + ENDIF + ENDM +ENDM + +;------------------------------------------------------------ +; Macro to pop registers, variables or flags from the stack +; Usage: .pop "loc16"[,"loc16"...] +; where "loc16" is a 16-bit register, a word-sized variable or the +; keyword "FLAGS". +; Exmpl: .push ax, flags, var1 +; .pop ax, flags, var1 +; +.pop MACRO r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10 + IFNB + .ERROR <.POP has more than 10 arguments> + ENDIF + IRP $reg, + IFNB <$reg> ;; Is argument non-blank? + IFIDNI <$reg>, ;; Yes, is it the keyword "FLAGS"? + popf ;; Yes, pop flags + ELSE + pop $reg ;; Pop argument + ENDIF + ENDIF + ENDM +ENDM + +;------------------------------------------------------------ +; +.enter MACRO localsize + IF USE286 EQ TRUE + enter localsize, 0 + ELSE + push bp + mov bp, sp + sub sp, localsize + ENDIF +ENDM + +;------------------------------------------------------------ +; +.leave MACRO argsize + IF USE286 EQ TRUE + leave + ELSE + mov sp, bp + pop bp + ENDIF + IFNB + ret argsize + ELSE + ret + ENDIF +ENDM + +;------------------------------------------------------------ +; +.shr MACRO arg, count + IF USE286 EQ TRUE + shr arg, count + ELSE + $temp = count + WHILE $temp GT 0 + shr arg, 1 + $temp = $temp-1 + ENDM + ENDIF +ENDM + +;------------------------------------------------------------ +; +.shl MACRO arg, count + IF USE286 EQ TRUE + shl arg, count + ELSE + $temp = count + WHILE $temp GT 0 + shl arg, 1 + $temp = $temp-1 + ENDM + ENDIF +ENDM + +;------------------------------------------------------------ +; +.chk386 MACRO name, jump + IF USE386 EQ FALSE + .OUT "Warning: ", , " needs a 386 or better to run!" + jmp @@jump + ENDIF +ENDM diff --git a/16/x/modex.h b/16/x/modex.h new file mode 100755 index 00000000..2c1f1ebe --- /dev/null +++ b/16/x/modex.h @@ -0,0 +1,153 @@ +/* + MODEX.H - C/C++ include file for the MODEX library + Copyright (c) 1994 Alessandro Scotti +*/ + +#ifndef _MODEX_H_ // Avoid nested inclusions +#define _MODEX_H_ + +// +// Video modes +// +#define MX_TEXT 0 // 80x25 text +#define MX_320x175 1 // 320x175x256 +#define MX_320x200 2 // 320x200x256, 4 pages, aspect 6:5 +#define MX_320x240 3 // 320x240x256, 3 pages, aspect 1:1 +#define MX_320x350 4 // 320x350x256 +#define MX_320x400 5 // 320x400x256, 2 pages +#define MX_320x480 6 // 320x480x256, 1 page +#define MX_360x175 7 // 360x175x256 +#define MX_360x200 8 // 360x200x256, 3 pages +#define MX_360x240 9 // 360x240x256, 2 pages +#define MX_360x350 10 // 360x350x256 +#define MX_360x400 11 // 360x400x256, 1 page +#define MX_360x480 12 // 360x480x256, 1 page +#define MX_400x600 13 // 400x600x256, 1 page + +// +// Fade effects +// +#define MX_FADEIN 0 +#define MX_FADEOUT 1 + +// +// Raster ops +// +#define OP_SET 0 // No operator +#define OP_AND 1 // And +#define OP_OR 2 // Or +#define OP_XOR 3 // Xor +#define OP_TRANS 4 // Transparent +#define OP_ADD 5 // Additive +#define OP_MOVE 0 // Alias for OP_SET + +// +// Temporary definitions +// +#define MXBYTE unsigned char +#define MXBOOL short int +#define MXSINT short int +#define MXUINT unsigned short int +#define MXAPI far pascal +#define MXPTR void far * + +// Functions + +#ifdef __cplusplus // Avoid C++ name mangling +extern "C" { +#endif + +// +// Initialization +// +MXSINT MXAPI mxInit( void ); // Returns 0 if successful +void MXAPI mxTerm( void ); +MXUINT MXAPI mxGetVersion( void ); +// +// Mode setting +// +void MXAPI mxChangeMode( MXUINT mode ); +void MXAPI mxSetMode( MXUINT mode ); +void MXAPI mxGetAspect( MXUINT far *aspectx, MXUINT far *aspecty ); +void MXAPI mxGetScreenSize( MXUINT far *width, MXUINT far *height ); +// +// Hardware support +// +void MXAPI mxWriteMode( MXBYTE wm ); +void MXAPI mxSplitScreen( MXUINT line ); +void MXAPI mxStartAddress( MXUINT sa ); +void MXAPI mxStartLine( MXUINT sl ); +void MXAPI mxWaitDisplay( void ); +void MXAPI mxWaitRetrace( void ); +void MXAPI mxWritePlane( MXBYTE wp ); +void MXAPI mxReadPlane( MXBYTE rp ); +void MXAPI mxRowAddress( MXBYTE ra ); +// +// Virtual screen +// +void MXAPI mxGetVirtualScreen( MXUINT far *width, MXUINT far *height ); +void MXAPI mxSetVirtualScreen( MXUINT width, MXUINT height ); +void MXAPI mxPan( MXUINT x, MXUINT y ); +// +// Clipping +// +MXBOOL MXAPI mxGetClip( void ); +MXBOOL MXAPI mxGetClipRegion( MXSINT far *x, MXSINT far *y, MXSINT far *w, MXSINT far *h ); +MXBOOL MXAPI mxSetClip( MXBOOL ); +void MXAPI mxSetClipRegion( MXUINT x, MXUINT y, MXUINT width, MXUINT height ); +// +// Graphics +// +void MXAPI mxBitBlt( MXSINT sx, MXSINT sy, MXUINT width, MXUINT height, MXSINT dx, MXSINT dy ); +void MXAPI mxFillBox( MXSINT x, MXSINT y, MXUINT width, MXUINT height, MXUINT color, MXUINT op ); +MXBYTE MXAPI mxGetPixel( MXSINT x, MXSINT y ); +void MXAPI mxPutPixel( MXSINT x, MXSINT y, MXBYTE color ); +void MXAPI mxLine( MXSINT x1, MXSINT y1, MXSINT x2, MXSINT y2, MXUINT color, MXUINT op ); +void MXAPI mxGetImage( MXPTR img, MXSINT x, MXSINT y, MXUINT width, MXUINT height ); +void MXAPI mxPutImage( MXPTR img, MXSINT x, MXSINT y, MXUINT w, MXUINT h, MXUINT op ); +void MXAPI mxPutTile( MXPTR tile, MXSINT x, MXSINT y, MXUINT width, MXUINT height ); +void MXAPI mxTransPutTile( MXPTR tile, MXSINT x, MXSINT y, MXUINT w, MXUINT h ); +void MXAPI mxCircle( MXSINT x, MXSINT y, MXUINT radius, MXBYTE color ); +void MXAPI mxStretchImage( MXPTR img, MXSINT x, MXSINT y, MXUINT w, MXUINT h, MXUINT neww, MXUINT newh, MXUINT op ); +// +// Palette +// +void MXAPI mxColorToGray( MXPTR source, MXPTR dest, MXUINT count ); +void MXAPI mxGammaCorrect( MXPTR source, MXPTR dest, MXUINT count ); +void MXAPI mxGetColor( MXUINT index, MXSINT far *r, MXSINT far *g, MXSINT far *b ); +void MXAPI mxSetColor( MXUINT index, MXSINT red, MXSINT green, MXSINT blue ); +void MXAPI mxGetPalette( MXPTR palette, MXUINT index, MXUINT count ); +void MXAPI mxSetPalette( MXPTR palette, MXUINT index, MXUINT count ); +void MXAPI mxFadePalette( MXPTR, MXUINT, MXUINT, MXUINT, MXUINT, MXUINT, MXUINT ); +void MXAPI mxRotatePalette( MXPTR palette, MXUINT count, MXSINT step ); +// +// Text +// +MXSINT MXAPI mxSetFont( MXPTR font, MXUINT charwidth, MXUINT charheight ); +void MXAPI mxSetTextColor( MXUINT color, MXUINT op ); +void MXAPI mxGetTextStep( MXSINT far *deltax, MXSINT far *deltay ); +void MXAPI mxSetTextStep( MXSINT deltax, MXSINT deltay ); +void MXAPI mxOutChar( MXSINT x, MXSINT y, char c ); +void MXAPI mxOutText( MXSINT x, MXSINT y, char far *sz ); +// +// Convex polygons +// +void MXAPI mxFillPoly( MXUINT, MXPTR, MXPTR, MXUINT, MXUINT ); +void MXAPI mxGouraudPoly( MXUINT, MXPTR, MXPTR, MXPTR, MXUINT, MXUINT ); +void MXAPI mxTexturePoly( MXUINT, MXPTR, MXPTR, MXPTR, MXPTR, MXUINT, MXUINT ); + +#ifdef __cplusplus +} +#endif + +// +// Remove temporary defines +// +#undef MXBYTE +#undef MXBOOL +#undef MXSINT +#undef MXUINT +#undef MXPTR +#undef MXAPI + +#endif // _MODEX_H_ diff --git a/16/x/modex.lbr b/16/x/modex.lbr new file mode 100755 index 00000000..93fc7801 --- /dev/null +++ b/16/x/modex.lbr @@ -0,0 +1,39 @@ ++-MXBB.OBJ & ++-MXCC.OBJ & ++-MXCG.OBJ & ++-MXCL.OBJ & ++-MXCR.OBJ & ++-MXFB.OBJ & ++-MXFP.OBJ & ++-MXGC.OBJ & ++-MXGI.OBJ & ++-MXGM.OBJ & ++-MXGP.OBJ & ++-MXGV.OBJ & ++-MXHL.OBJ & ++-MXIT.OBJ & ++-MXLL.OBJ & ++-MXLN.OBJ & ++-MXOT.OBJ & ++-MXPB.OBJ & ++-MXPF.OBJ & ++-MXPG.OBJ & ++-MXPI.OBJ & ++-MXPN.OBJ & ++-MXPP.OBJ & ++-MXPT.OBJ & ++-MXRA.OBJ & ++-MXRP.OBJ & ++-MXSA.OBJ & ++-MXSC.OBJ & ++-MXSI.OBJ & ++-MXSL.OBJ & ++-MXSM.OBJ & ++-MXSP.OBJ & ++-MXSS.OBJ & ++-MXTL.OBJ & ++-MXVS.OBJ & ++-MXWD.OBJ & ++-MXWM.OBJ & ++-MXWP.OBJ & ++-MXWR.OBJ diff --git a/16/x/modex.pas b/16/x/modex.pas new file mode 100755 index 00000000..7d9d26ed --- /dev/null +++ b/16/x/modex.pas @@ -0,0 +1,194 @@ +(* + Turbo Pascal interface to the MODEX library + Copyright (c) 1993,1994 by Alessandro Scotti +*) +unit ModeX; +interface + +const + (* Video modes *) + MX_TEXT = 0; + MX_320x175 = 1; + MX_320x200 = 2; + MX_320x240 = 3; + MX_320x350 = 4; + MX_320x400 = 5; + MX_320x480 = 6; + MX_360x175 = 7; + MX_360x200 = 8; + MX_360x240 = 9; + MX_360x350 = 10; + MX_360x400 = 11; + MX_360x480 = 12; + MX_400x600 = 13; + + (* Fade effects *) + MX_FADEIN = 0; + MX_FADEOUT = 1; + + (* Raster ops *) + OP_SET = 0; + OP_AND = 1; + OP_OR = 2; + OP_XOR = 3; + OP_TRANS = 4; + OP_ADD = 5; + OP_MOVE = 0; (* Alias for OP_SET *) + +procedure mxBitBlt( SX, SY: integer; Width, Height: word; DX, DY: integer ); +procedure mxCircle( CX, CY: integer; Radius: word; Color: byte ); +procedure mxChangeMode( Mode: word ); +procedure mxColorToGray( ColorPalette, GrayPalette: pointer; Count: word ); +procedure mxFadePalette( Palette: pointer; Cmd, Start, Count, R, G, B: word ); +procedure mxFillBox( X, Y: integer; Width, Height: word; Color: byte; Op: word ); +procedure mxGammaCorrect( ColorPalette, GammaPalette: pointer; Count: word ); +procedure mxGetAspect( var AspectX, AspectY: word ); +function mxGetClipRegion( var X1, Y1, Width, Height: word ): boolean; +function mxGetClip: boolean; +procedure mxGetImage( Image: pointer; X, Y: integer; Width, Height: word ); +procedure mxGetPalette( Palette: pointer; Start, Count: word ); +function mxGetPixel( X, Y: word ): byte; +procedure mxGetScreenSize( var Width, Height: word ); +procedure mxGetTextStep( var DeltaX, DeltaY: integer ); +function mxGetVersion: word; +procedure mxGetVirtualScreen( var Width, Height: word ); +procedure mxInit; +procedure mxLine( X1, Y1, X2, Y2: integer; Color, Op: word ); +procedure mxOutChar( X, Y: integer; C: char ); +procedure mxOutText( X, Y: integer; S: pointer ); +procedure mxPan( X, Y: word ); +procedure mxPutImage( Image: pointer; X, Y: integer; Width, Height, Op: word ); +procedure mxPutPixel( X, Y: word; C: byte ); +procedure mxPutTile( Tile: pointer; X, Y: integer; Width, Height: word ); +procedure mxReadPlane( Plane: byte ); +procedure mxRotatePalette( Palette: pointer; Count: word; Step: integer ); +procedure mxRowAddress( RowAddress: byte ); +function mxSetClip( Clip: boolean ): boolean; +procedure mxSetClipRegion( X1, Y1, Width, Height: word ); +procedure mxSetColor( Index, R, G, B: word ); +procedure mxSetFont( Font: pointer; Width, Height: word ); +procedure mxSetMode( Mode: word ); +procedure mxSetPalette( Palette: pointer; Start, Count: word ); +procedure mxSetTextColor( Color, Op: word ); +procedure mxSetTextStep( DeltaX, DeltaY: integer ); +procedure mxSetVirtualScreen( Width, Height: word ); +procedure mxStretchImage( Image: pointer; X, Y: integer; Width, Height, NewWidth, NewHeight, Op: word ); +procedure mxSplitScreen( Line: word ); +procedure mxStartAddress( StartAddress: word ); +procedure mxStartLine( Line: word ); +procedure mxTerm; +procedure mxTransPutTile( Tile: pointer; X, Y: integer; Width, Height: word ); +procedure mxWaitDisplay; +procedure mxWaitRetrace; +procedure mxWriteMode( Mode: byte ); +procedure mxWritePlane( Plane: byte ); + +procedure mxFillPoly( Count: word; var Map, Points; Color: word ); +procedure mxGouraudPoly( Count: word; var Map, Points, Colors; BaseColor: word ); +procedure mxTexturePoly( Count: word; var Map, Points, ImgPoints, Texture; Width: word ); + +procedure mxOutStr( X, Y: integer; S: string ); + +implementation + +procedure mxBitBlt; external; +procedure mxChangeMode( Mode: word ); external; +procedure mxCircle; external; +procedure mxColorToGray; external; +procedure mxFadePalette; external; +procedure mxFillBox; external; +procedure mxGammaCorrect; external; +procedure mxGetAspect( var AspectX, AspectY: word ); external; +function mxGetClipRegion; external; +function mxGetClip: boolean; external; +procedure mxGetImage; external; +procedure mxGetPalette( Palette: pointer; Start, Count: word ); external; +function mxGetPixel( X, Y: word ): byte; external; +procedure mxGetScreenSize( var Width, Height: word ); external; +procedure mxGetTextStep( var DeltaX, DeltaY: integer ); external; +function mxGetVersion: word; external; +procedure mxGetVirtualScreen( var Width, Height: word ); external; +procedure mxInit; external; +procedure mxLine( X1, Y1, X2, Y2: integer; Color, Op: word ); external; +procedure mxOutChar( X, Y: integer; C: char ); external; +procedure mxOutText( X, Y: integer; S: pointer ); external; +procedure mxPan( X, Y: word ); external; +procedure mxPutImage; external; +procedure mxPutPixel( X, Y: word; C: byte ); external; +procedure mxPutTile; external; +procedure mxReadPlane( Plane: byte ); external; +procedure mxRotatePalette; external; +procedure mxRowAddress( RowAddress: byte ); external; +function mxSetClip( Clip: boolean ): boolean; external; +procedure mxSetClipRegion( X1, Y1, Width, Height: word ); external; +procedure mxSetColor( Index, R, G, B: word ); external; +procedure mxSetFont( Font: pointer; Width, Height: word ); external; +procedure mxSetMode( Mode: word ); external; +procedure mxSetPalette( Palette: pointer; Start, Count: word ); external; +procedure mxSetTextColor( Color, Op: word ); external; +procedure mxSetTextStep( DeltaX, DeltaY: integer ); external; +procedure mxSetVirtualScreen( Width, Height: word ); external; +procedure mxSplitScreen( Line: word ); external; +procedure mxStartAddress( StartAddress: word ); external; +procedure mxStartLine; external; +procedure mxStretchImage; external; +procedure mxTerm; external; +procedure mxTransPutTile; external; +procedure mxWaitDisplay; external; +procedure mxWaitRetrace; external; +procedure mxWriteMode( Mode: byte ); external; +procedure mxWritePlane( Plane: byte ); external; + +procedure mxFillPoly; external; +procedure mxGouraudPoly; external; +procedure mxTexturePoly; external; +{$L MXPB} +{$L MXPF} +{$L MXPG} +{$L MXPT} + +{$L MXBB} +{$L MXCC} +{$L MXCG} +{$L MXCL} +{$L MXCR} +{$L MXFB} +{$L MXFP} +{$L MXGI} +{$L MXGM} +{$L MXGP} +{$L MXGV} +{$L MXHL} +{$L MXIT} +{$L MXLN} +{$L MXOT} +{$L MXPI} +{$L MXPN} +{$L MXPP} +{$L MXRA} +{$L MXRP} +{$L MXSA} +{$L MXSC} +{$L MXSI} +{$L MXSL} +{$L MXSM} +{$L MXSP} +{$L MXSS} +{$L MXTL} +{$L MXVS} +{$L MXWD} +{$L MXWM} +{$L MXWP} +{$L MXWR} + +(* + Prints a Turbo Pascal string. + Note: BP 7.0 supports ASCIIZ strings (PChar type). +*) +procedure mxOutStr; +begin + S := S + #0; + mxOutText( X, Y, @S[1] ); +end; + +end. diff --git a/16/x/modex/DEMO01.EXE b/16/x/modex/DEMO01.EXE new file mode 100755 index 0000000000000000000000000000000000000000..28caff88c58a0b8ce5a4d23c6544c00cda8482fc GIT binary patch literal 10208 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 320 ) then begin + S.X := 320; + S.DX := -S.DX; + end; + if( S.X < -16 ) then begin + S.X := -16; + S.DX := -S.DX; + end; + if( S.Y > 240 ) then begin + S.Y := 240; + S.DY := -S.DY; + end; + if( S.Y < -16 ) then begin + S.Y := -16; + S.DY := -S.DY; + end; + (* Draw the sprite, note the Page offset added to the *) + (* Y coordinate of the image *) + mxPutImage( @S.Image, S.X, Page+S.Y, S.W, S.H, OP_TRANS ); +end; + +begin + (* Initialize library *) + mxInit; + + (* Enter graphics mode *) + mxSetMode( MX_320x240 ); + + (* Print initialization message *) + mxSetTextColor( 15, OP_TRANS ); + mxOutStr( 4, 4, 'Initializing...' ); + + (* Initialize sprites *) + for I:=1 to MAX_SPRITE do sxInit( S[I] ); + + (* Draw background *) + for I:=1 to 192 do begin + mxCircle( 160, 480+120, I, I+63 ); + mxCircle( 161, 480+120, I, I+63 ); + end; + + (* Compute and set palette *) + for I:=1 to 192 do with Palette[I+63] do begin + R := 0; + G := 0; + B := 0; + if( I < 64 ) then + R := I shr 1+31 + else if( I < 128 ) then + G := (I-64) shr 1+31 + else + B := (I-128) shr 1+31; + end; + mxSetPalette( @Palette[64], 64, 192 ); + + (* Main loop *) + Page := 240; + while( not KeyPressed ) do begin + (* Set clip region to current page *) + mxSetClipRegion( 0, Page, 320, 240 ); + mxSetClip( TRUE ); + (* Restore background *) + mxBitBlt( 0, 480, 320, 240, 0, Page ); + (* Draw sprites *) + for I:=1 to MAX_SPRITE do sxMove( S[I] ); + (* Print message *) + mxOutStr( 4, Page+4, 'Some sprites moving...' ); + (* Flip page *) + mxStartLine( Page ); + Page := 240-Page; + (* Animate palette *) + mxSetPalette( @Palette[64], 64, 192 ); + mxRotatePalette( @Palette[64], 192, 3 ); + end; + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/x/modex/DEMO02.EXE b/16/x/modex/DEMO02.EXE new file mode 100755 index 0000000000000000000000000000000000000000..14e7dc72b16e421ae94767feaa07cb3988f49db1 GIT binary patch literal 24688 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 L6~S)>H$VReFZ-F@ literal 0 HcmV?d00001 diff --git a/16/x/modex/DEMO02.PAS b/16/x/modex/DEMO02.PAS new file mode 100755 index 00000000..6b4fb6f9 --- /dev/null +++ b/16/x/modex/DEMO02.PAS @@ -0,0 +1,125 @@ +(* + DEMO02 - Texture mapping and palette rotation + (c) 1994 by Alessandro Scotti +*) +uses Crt, Modex, Plasma, Threed; + +const + LSIZE = 85; + Trans : TPoint = ( X:0; Y:0; Z:0 ); +type + T2DPoint = record + X, Y: integer; + end; + TTexture = record + Desc : array[ 0..3 ] of T2DPoint; + Width : word; + Data : array[ 1..64*64 ] of byte; + end; + TQuad = record + VtxCnt : word; + Vtx : array[ 0..3 ] of word; + Texture: word; + end; +var + Vtx : array[ 0..7 ] of TPoint; + XVtx : array[ 0..7 ] of TPoint; + VVtx : array[ 0..7 ] of T2DPoint; + Face : array[ 0..5 ] of TQuad; + Txts : array[ 0..5 ] of TTexture; + Nrm : array[ 0..5 ] of TPoint; + XNrm : array[ 0..5 ] of TPoint; + Page : word; + Palette: array[ byte ] of record R, G, B: byte; end; + +(* Make a 64x64 plasma to be used as texture *) +procedure MakeTexture( Idx: word ); +var + I: word; +begin + mxFillBox( 0, 0, 64, 64, 0, OP_SET ); + MakePlasma( 0, 0, 64, 64, 96, Random(192)+1, Random(192)+1, Random(192)+1 ); + mxGetImage( @Txts[Idx].Data, 0, 0, 64, 64 ); + (* Texture vertexes are 8:8 fixed, add $80 (0.5) for best results *) + with Txts[Idx] do begin + Desc[0].X := $80; Desc[0].Y := $80; + Desc[1].X := $80; Desc[1].Y := $3F80; + Desc[2].X := $3F80; Desc[2].Y := $3F80; + Desc[3].X := $3F80; Desc[3].Y := $80; + Width := 64; + end; +end; + +procedure Init; +var + I: integer; +begin + (* Build vertexes for a cube *) + with Vtx[0] do begin X:=-LSIZE; Y:=-LSIZE; Z:=-LSIZE; end; + with Vtx[1] do begin X:=+LSIZE; Y:=-LSIZE; Z:=-LSIZE; end; + with Vtx[2] do begin X:=-LSIZE; Y:=+LSIZE; Z:=-LSIZE; end; + with Vtx[3] do begin X:=+LSIZE; Y:=+LSIZE; Z:=-LSIZE; end; + with Vtx[4] do begin X:=-LSIZE; Y:=-LSIZE; Z:=+LSIZE; end; + with Vtx[5] do begin X:=+LSIZE; Y:=-LSIZE; Z:=+LSIZE; end; + with Vtx[6] do begin X:=-LSIZE; Y:=+LSIZE; Z:=+LSIZE; end; + with Vtx[7] do begin X:=+LSIZE; Y:=+LSIZE; Z:=+LSIZE; end; + for I:=0 to 7 do begin (* Make points 16:16 fixed *) + Vtx[I].X := Vtx[I].X*$10000; + Vtx[I].Y := Vtx[I].Y*$10000; + Vtx[I].Z := Vtx[I].Z*$10000; + end; + (* Build faces *) + with Face[0] do begin Vtx[0]:=0; Vtx[1]:=2; Vtx[2]:=3; Vtx[3]:=1; end; + with Face[1] do begin Vtx[0]:=4; Vtx[1]:=5; Vtx[2]:=7; Vtx[3]:=6; end; + with Face[2] do begin Vtx[0]:=0; Vtx[1]:=1; Vtx[2]:=5; Vtx[3]:=4; end; + with Face[3] do begin Vtx[0]:=1; Vtx[1]:=3; Vtx[2]:=7; Vtx[3]:=5; end; + with Face[4] do begin Vtx[0]:=2; Vtx[1]:=0; Vtx[2]:=4; Vtx[3]:=6; end; + with Face[5] do begin Vtx[0]:=7; Vtx[1]:=3; Vtx[2]:=2; Vtx[3]:=6; end; + for I:=0 to 5 do Face[I].Texture := I; + (* Build textures and palette *) + Randomize; + FillChar( Palette, SizeOf(Palette), 0 ); + MakePlasmaPalette( Palette, PAL_RGB ); + mxSetPalette( @Palette, 0, 193 ); + for I:=0 to 5 do MakeTexture( I ); +end; + +var + AX, AY, AZ: byte; + I: word; +begin + mxInit; + mxSetMode( MX_320x240 ); + Init; + Page := 240; (* Start with hidden page *) + + AX := 0; + AY := 0; + AZ := 0; + (* Init 3D transforms, perspective is intentionally exaggerated *) + tdSetTranslation( Trans ); + tdSetPerspective( 400*$10000, $10000, $10000 ); + (* Main loop, all magic here! *) + while( not KeyPressed ) do begin + tdSetRotation( AX, AY, AZ ); (* Set new angles *) + tdTransform( Vtx, XVtx, 8 ); (* 3D transform points *) + tdTransformToImage( XVtx, VVtx, 8, 160, 120+Page ); + Inc( AX, 1 ); (* Bump angles *) + Inc( AY, 1 ); + Inc( AZ, 2 ); + mxSetClipRegion( 0, Page, 320, 240 ); (* Set clip to new page *) + mxSetClip( TRUE ); + mxFillBox( 0, Page, 320, 240, 0, OP_MOVE ); (* Clear screen *) + mxRotatePalette( @Palette[1], 192, 3 ); (* Rotate palette *) + (* Draw cube: backface culling is straighforward in this case, so *) + (* it can be handled by the polygon filling procedure *) + for I:=0 to 5 do + mxTexturePoly( 4, Face[I].Vtx, VVtx, Txts[I].Desc, Txts[I].Data, Txts[I].Width ); + mxStartLine( Page ); (* Flip pages *) + mxSetPalette( @Palette[1], 1, 192 ); (* Set new palette *) + Page := 240-Page; + end; + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/x/modex/DEMO03.EXE b/16/x/modex/DEMO03.EXE new file mode 100755 index 0000000000000000000000000000000000000000..c646c4b0283db932174d915432747c2176034195 GIT binary patch literal 14256 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 RADIUS*RADIUS ) then goto Retry; + Z := Toggle( Round( Sqrt( Abs( RADIUS*RADIUS-X*X-Y*Y ) ) ) ); + case Random(3) of + 0: Swap( X, Z ); + 1: Swap( Y, Z ); + end; + X := X * $10000; Y := Y * $10000; Z := Z * $10000; + end; + end; + (* Initialize morphing *) + Move( CubeVtx^, Vtx^, SizeOf(Vtx^) ); + Status := 0; + Count := WAITCOUNT; +end; + +procedure Morph; +var + I: integer; +begin + (* Fully unoptimized, slowest loop I could think of! *) + for I:=0 to MAXVTX-1 do begin + Vtx^[I].X := ((CubeVtx^[I].X * Morph1)+(SphereVtx^[I].X * Morph2)) div MS; + Vtx^[I].Y := ((CubeVtx^[I].Y * Morph1)+(SphereVtx^[I].Y * Morph2)) div MS; + Vtx^[I].Z := ((CubeVtx^[I].Z * Morph1)+(SphereVtx^[I].Z * Morph2)) div MS; + end; +end; + +var + AX, AY, AZ: byte; + I: word; + C: char; +begin + mxInit; + mxSetMode( MX_320x240 ); + Init; + Page := 240; (* Start with hidden page *) + + AX := 0; + AY := 0; + AZ := 0; + (* Init 3D transforms, perspective is intentionally exaggerated *) + tdSetTranslation( Trans ); + tdSetPerspective( 400*$10000, $10000, $10000 ); + C := #0; + repeat + tdSetRotation( AX, AY, AZ ); (* Set new angles *) + tdTransform( Vtx^, XVtx^, MAXVTX ); (* 3D transform points *) + tdTransformToImage( XVtx^, VVtx, MAXVTX, 160, 120+Page ); + Inc( AX, 1 ); (* Bump angles *) + Inc( AY, 1 ); + Inc( AZ, 2 ); + mxSetClipRegion( 0, Page, 320, 240 ); (* Set clip to new page *) + mxSetClip( TRUE ); + mxFillBox( 0, Page, 320, 240, 0, OP_MOVE ); (* Clear screen *) + (* Draw points *) + for I:=0 to MAXVTX-1 do + mxPutPixel( VVtx[I].X, VVtx[I].Y, 128 + XVtx^[I].Z shr 18 ); + mxStartLine( Page ); (* Flip pages *) + Page := 240-Page; + (* Morph *) + if( Odd(Status) ) then begin + Morph; + Inc( Morph1, Delta1 ); + Inc( Morph2, Delta2 ); + if( Morph1 < 0 )or( Morph2 < 0 ) then Inc( Status ); + if( Status = 4 ) then Status := 0; + end + else begin + Dec( Count ); + if( Count < 0 ) then begin + Inc( Status ); + Count := WAITCOUNT; + Morph1 := InitMorph1[Status]; + Morph2 := InitMorph2[Status]; + Delta1 := InitDelta1[Status]; + Delta2 := InitDelta2[Status]; + end; + end; + until( KeyPressed ); + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/x/modex/DEMO04.DAT b/16/x/modex/DEMO04.DAT new file mode 100755 index 0000000000000000000000000000000000000000..72aaad08ac55e4d161e7868374296a4e42554684 GIT binary patch literal 37662 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%0D)*4A2IO9KMZYD#oU43C^WOCfTg8_%RD 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�-ncKj8QX2BIutynAlnfJ{;J0ue86t5F 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 XG;Ye`)EVP3#M6mPm!(a=?*#mR$DZhs literal 0 HcmV?d00001 diff --git a/16/x/modex/DEMO04.EXE b/16/x/modex/DEMO04.EXE new file mode 100755 index 0000000000000000000000000000000000000000..1fec5e8aa383353d986ca1e4420838b09e61eef4 GIT binary patch literal 24384 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 Im202>1y)VB#{d8T literal 0 HcmV?d00001 diff --git a/16/x/modex/DEMO04.PAS b/16/x/modex/DEMO04.PAS new file mode 100755 index 00000000..1a946315 --- /dev/null +++ b/16/x/modex/DEMO04.PAS @@ -0,0 +1,198 @@ +(* + DEMO04 - Multiple textures and triple buffering (3 pages) + (c) 1994 by Alessandro Scotti +*) +uses Crt, Modex, Threed; + +const + MAXVTX = 256; + MAXCUB = 2; + MAXTXT = 2; + Trans : TPoint = ( X:0; Y:0; Z:0 ); + TxtSunDial: array[ 0..7 ] of word = ( + $7F80,$0080, $0080,$0080, $0080,$7E80, $7F80,$7E80 ); + TxtSapphire : array[ 0..7 ] of word = ( + $0080,$0080, $0080,$1F80, $1F80,$1F80, $1F80,$0080 ); + TxtMarble: array[ 0..7 ] of word = ( + $0080,$8080, $0080,$FD80, $7F80,$FD80, $7F80,$8080 ); +type + T2DPoint = record + X, Y: integer; + end; + TTexture = record + Desc : array[ 0..3 ] of record X, Y: word end; + Width : word; + Data : pointer; + end; + TQuad = record + Vtx : array[ 0..3 ] of word; + Texture: word; + end; + TCube = record + Face : array[ 0..5 ] of TQuad; + Base : integer; + end; +var + Vtx, XVtx: array[ 0..MAXVTX ] of TPoint; + VVtx : array[ 0..MAXVTX ] of T2DPoint; + Cube : array[ 0..MAXCUB ] of TCube; + ZList : array[ 0..MAXCUB ] of integer; + VtxCnt : word; + Txts : array[ 0..MAXTXT ] of TTexture; + Page : word; + Palette : array[ byte ] of record R, G, B: byte; end; + TxtDat1, TxtDat2: pointer; + +(* Add a new entry to the vertex array *) +procedure AddVtx( PX, PY, PZ: longint ); +begin + with Vtx[VtxCnt] do begin X:=PX*$10000; Y:=PY*$10000; Z:=PZ*$10000; end; + Inc( VtxCnt ); +end; + +procedure MakeCube( var C: TCube; X1,Y1,Z1, X2,Y2,Z2, TX,TY,TZ, Texture: integer ); +const + FaceIdx: array[ 0..23 ] of integer = ( + 0,1,2,3, 0,4,5,1, 1,5,6,2, 2,6,7,3, 3,7,4,0, 6,5,4,7 ); +var + I, VC: integer; +begin + VC := VtxCnt; + C.Base := VC; + AddVtx( X1+TX, Y1+TY, Z1+TZ ); + AddVtx( X2+TX, Y1+TY, Z1+TZ ); + AddVtx( X2+TX, Y2+TY, Z1+TZ ); + AddVtx( X1+TX, Y2+TY, Z1+TZ ); + AddVtx( X1+TX, Y1+TY, Z2+TZ ); + AddVtx( X2+TX, Y1+TY, Z2+TZ ); + AddVtx( X2+TX, Y2+TY, Z2+TZ ); + AddVtx( X1+TX, Y2+TY, Z2+TZ ); + for I:=0 to 23 do C.Face[I shr 2].Vtx[I and 3] := VC+FaceIdx[I]; + for I:=0 to 5 do C.Face[I].Texture := Texture; +end; + +procedure MakeTexture( Idx: integer; var VtxData ); +var + P: ^word; + I: integer; +begin + P := @VtxData; + with Txts[Idx] do begin + for I:=0 to 3 do begin + Desc[I].X := P^; Inc( P ); + Desc[I].Y := P^; Inc( P ); + end; + Width := 129; + Data := TxtDat1; + end; +end; + +procedure Init; +var + I: integer; + V: integer; + F: file; + P: array[ 1..768 ] of byte; +begin + (* Initialize objects *) + VtxCnt := 0; + MakeCube( Cube[0], -64,-64,8, 64,64,-8, 0,0,0, 1 ); (* Sundial *) + Cube[0].Face[0].Texture := 0; + V := VtxCnt; + MakeCube( Cube[1], -16,-16,16, 16,16,-16, 0,0,0, 2 ); (* Sapphire *) + tdSetTranslation( Trans ); + tdSetRotation( 32, 32, 00 ); + tdRotate( Vtx[V], XVtx[V], 8 ); (* Got to rotate this cube *) + for I:=V to V+7 do begin + Vtx[I].X := XVtx[I].X; + Vtx[I].Y := XVtx[I].Y; + Vtx[I].Z := XVtx[I].Z + 100*$10000; + end; + MakeCube( Cube[2], -64,-4,48, 64,4,-48, 0,68,56, 1 ); (* Marble *) + (* Load texture and palette *) + Assign( F, 'DEMO04.DAT' ); + Reset( F, 1 ); + BlockRead( F, P, SizeOf(P) ); + mxSetPalette( @P, 0, 256 ); + GetMem( TxtDat1, 63*1024 ); + BlockRead( F, TxtDat1^, 129*286 ); + Close( F ); + TxtDat2 := Ptr( Seg(TxtDat1^), Ofs(TxtDat1^)+129*254 ); + (* Init textures *) + MakeTexture( 0, TxtSundial ); + MakeTexture( 1, TxtMarble ); + MakeTexture( 2, TxtSapphire ); + Txts[2].Data := TxtDat2; +end; + +(* Sort procedure, not worth optimizing with only a few objects *) +procedure SortObjects; +var + I, J, K: integer; + ZMax: array[ 0..MAXCUB ] of longint; + ZI: integer; + L: longint; +begin + for I:=0 to MAXCUB do begin + L := XVtx[Cube[I].Base].Z; + for J:=1 to 7 do + if( L > XVtx[Cube[I].Base+J].Z ) then L := XVtx[Cube[I].Base+J].Z; + ZMax[I] := L; + ZList[I] := I; + end; + for I:=0 to MAXCUB-1 do begin + ZI := I; + for J:=I+1 to MAXCUB do + if( ZMax[ZList[J]] > ZMax[ZList[ZI]] ) then ZI := J; + if( ZI <> I ) then begin + K := ZList[I]; + ZList[I] := ZList[ZI]; + ZList[ZI] := K; + end; + end; +end; + +var + AX, AY, AZ: byte; + I, J, K: word; +begin + mxInit; + mxSetMode( MX_320x240 ); + Init; + Page := 240; (* Start with hidden page *) + + (* Init 3D transforms, perspective is intentionally exaggerated *) + AX := 0; AY := 0; AZ := 0; + tdSetTranslation( Trans ); + tdSetPerspective( 600*$10000, $10000, $10000 ); + (* Main loop, all magic here! *) + while( not KeyPressed ) do begin + tdSetRotation( AX, AY, AZ ); (* Set new angles *) + tdTransform( Vtx, XVtx, VtxCnt ); (* 3D transform points *) + tdTransformToImage( XVtx, VVtx, VtxCnt, 160, 120+Page ); + Inc( AX, 1 ); (* Bump angles *) + Inc( AY, 2 ); + Inc( AZ, 1 ); + mxSetClipRegion( 0, Page, 320, 240 ); (* Set clip to new page *) + mxSetClip( TRUE ); + mxFillBox( 0, Page, 320, 240, 0, OP_MOVE ); (* Clear screen *) + (* Draw objects *) + SortObjects; + for I:=0 to MAXCUB do with Cube[ZList[I]] do begin + for J:=0 to 5 do begin + K := Face[J].Texture; + mxTexturePoly( 4, Face[J].Vtx, VVtx, Txts[K].Desc, Txts[K].Data^, Txts[K].Width ); + end; + end; + (* Flip page: at 320x240 the Start Address Register Low is always zero *) + case Page of + 0 : begin PortW[$3D4] := $000C; Page := 240; end; + 240: begin PortW[$3D4] := $4B0C; Page := 480; end; + 480: begin PortW[$3D4] := $960C; Page := 0; end; + end; + mxWaitRetrace; (* If the frame rate seems low, try to remove this line *) + end; + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/x/modex/DEMO05.EXE b/16/x/modex/DEMO05.EXE new file mode 100755 index 0000000000000000000000000000000000000000..21a7c207f7134ed187a08530637509b96b37b19e GIT binary patch literal 22528 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 CoI~RP literal 0 HcmV?d00001 diff --git a/16/x/modex/DEMO05.PAS b/16/x/modex/DEMO05.PAS new file mode 100755 index 00000000..819c5cf3 --- /dev/null +++ b/16/x/modex/DEMO05.PAS @@ -0,0 +1,131 @@ +(* + DEMO05 - A Gouraud-shaded rotating torus + (c) 1994 Alessandro Scotti +*) +uses Crt, Modex, Threed; + +(* Define ALTPAL for alternate palette *) +{$define ALTPAL} + +const + MAXVTX1 = 15; RADIUS1 = 70; (* MAXVTX1+1 must be multiple of 4 *) + MAXVTX2 = 15; RADIUS2 = 30; + MAXVTX = (MAXVTX1+1)*(MAXVTX2+1)-1; + MAXFACE = MAXVTX; + Trans : TPoint = ( X:0; Y:0; Z:0 ); (* Object translation *) + Light : TPoint = ( X:0; Y:0; Z:-63*$10000 ); (* Light direction *) +type + TQuad = record + QVtx : array[ 0..3 ] of integer; + end; +var + Vtx, XVtx : array[ 0..MAXVTX ] of TPoint; (* Points *) + VVtx : array[ 0..MAXVTX ] of record X, Y: integer end; + Face : array[ 0..MAXFACE ] of TQuad; (* Polys *) + Culled : array[ 0..MAXFACE ] of integer; + GNrm,XGNrm: array[ 0..MAXVTX ] of TVector; (* Gouraud normals *) + VtxLight : array[ 0..MAXVTX ] of integer; (* Points brightness *) + Page : word; + +function GetVtx( I1, I2: integer ): integer; +begin + GetVtx := (I1 mod (MAXVTX1+1))*(MAXVTX2+1) + I2 mod (MAXVTX2+1); +end; + +procedure Init; +var + R, N, X, Y, Z: real; + I, J, K, V: integer; +begin + (* Build vertexes *) + for I:=0 to MAXVTX1 do begin + K := (I + (MAXVTX1+1) shr 2) mod (MAXVTX1+1); + R := RADIUS1 + RADIUS2*Cos( 2*K*Pi / (MAXVTX1+1) ); + for J:=0 to MAXVTX2 do begin + V := I*(MAXVTX2+1)+J; (* Index of current vertex *) + (* Compute coordinates of current vertex *) + X := R*Cos(2*J*Pi / (MAXVTX2+1)); (* Get coordinates *) + Y := R*Sin(2*J*Pi / (MAXVTX2+1)); + Z := RADIUS2*Sin(2*K*Pi / (MAXVTX1+1)); + Vtx[V].X := Round( X )*$10000; (* Save coordinates *) + Vtx[V].Y := Round( Y )*$10000; + Vtx[V].Z := Round( Z )*$10000; + (* Compute direction of Gouraud normal thru current vertex *) + X := X - RADIUS1*Cos(2*J*Pi / (MAXVTX2+1)); + Y := Y - RADIUS1*Sin(2*J*Pi / (MAXVTX2+1)); + N := Sqrt( X*X + Y*Y + Z*Z ); (* Get vector length *) + GNrm[V].X := Trunc( X*$10000/N ); (* Save normal vector *) + GNrm[V].Y := Trunc( Y*$10000/N ); + GNrm[V].Z := Trunc( Z*$10000/N ); + end; + end; + (* Generate faces so that depth-sorting is not needed: there are still *) + (* some *very* little errors, but this is the best I could devise *) + J := 0; + K := 0; + for I:=0 to MAXFACE do with Face[I] do begin + QVtx[0] := GetVtx( J, K ); + QVtx[1] := GetVtx( J, K+1 ); + QVtx[2] := GetVtx( J+1, K+1 ); + QVtx[3] := GetVtx( J+1, K ); + Inc( K ); + if( K > MAXVTX2 ) then begin + K := 0; + Inc( J ); + end; + end; +{$ifndef ALTPAL} + for I:=0 to 63 do mxSetColor( I+64, 0, 0, I ); (* Blue palette *) +{$else} + for I:=0 to 31 do mxSetColor(I+64, 0, I shl 1, 0); (* Green neon palette *) + for I:=32 to 63 do mxSetColor ( I+64, (I-32) shl 1, 63, (I-32) shl 1 ); +{$endif} +end; + +var + AX, AY, AZ: byte; + I: word; +begin + mxInit; + mxSetMode( MX_320x240 ); + Init; + Page := 240; (* Start with hidden page *) + + AX := 0; + AY := 0; + AZ := 0; + (* Init 3D transforms, perspective is intentionally exaggerated *) + tdSetTranslation( Trans ); + tdSetLight( Light ); + tdSetPerspective( 400*$10000, $10000, $10000 ); + (* Main loop, all magic here! *) + while( not KeyPressed ) do begin + tdSetRotation( AX, AY, AZ ); (* Set new angles *) + tdTransform( Vtx, XVtx, MAXVTX+1 ); (* 3D transform points *) + tdTransformToImage( XVtx, VVtx, MAXVTX+1, 160, 120+Page ); + tdRotate( GNrm, XGNrm, MAXVTX+1 ); (* Rotate Gouraud normals *) + tdTransformLight( XGNrm, VtxLight, MAXVTX+1 ); + (* Backplane culling is not really needed here! *) + FillChar( Culled, SizeOf(Culled), 0 ); + tdBackPlaneCull( Face, XVtx, Culled, MAXFACE+1, SizeOf(TQuad) ); + Inc( AX, 1 ); (* Bump angles *) + Inc( AY, 2 ); + Inc( AZ, 3 ); + mxSetClipRegion( 0, Page, 320, 240 ); (* Set clip to new page *) + mxSetClip( TRUE ); + mxFillBox( 0, Page, 320, 240, 0, OP_MOVE ); (* Clear screen *) + (* Draw polygons *) + for I:=0 to MAXFACE do with Face[I] do + if( Culled[I] >= 0 ) then mxGouraudPoly( 4, QVtx, VVtx, VtxLight, 64 ); + (* Flip page: at 320x240 the Start Address Register Low is always zero *) + case Page of + 0 : begin PortW[$3D4] := $000C; Page := 240; end; + 240: begin PortW[$3D4] := $4B0C; Page := 480; end; + 480: begin PortW[$3D4] := $960C; Page := 0; end; + end; + mxWaitRetrace; (* Uncomment this instruction if screen flickers *) + end; + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/x/modex/DEMO06.DAT b/16/x/modex/DEMO06.DAT new file mode 100755 index 0000000000000000000000000000000000000000..1ac2c2bb8f8c79a7cf1f3c968f75e8e5ac8cd705 GIT binary patch literal 77568 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 P3zel81wBCVexm$;I2yv& literal 0 HcmV?d00001 diff --git a/16/x/modex/DEMO06.EXE b/16/x/modex/DEMO06.EXE new file mode 100755 index 0000000000000000000000000000000000000000..f1308e8a536aa9d3d4574566fd018d698d5ef784 GIT binary patch literal 10864 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 G@BaZ%)XT^K literal 0 HcmV?d00001 diff --git a/16/x/modex/DEMO06.PAS b/16/x/modex/DEMO06.PAS new file mode 100755 index 00000000..f26af067 --- /dev/null +++ b/16/x/modex/DEMO06.PAS @@ -0,0 +1,135 @@ +(* + DEMO06 - Magnifying glass + (c) 1994 Alessandro Scotti +*) +uses Crt, Modex; + +const + R = 40; (* Lens radius *) + K : real = 1.8; (* Magnifying factor, less makes a stronger lens *) +type + TLine = array[ 0..319 ] of byte; + PLine = ^TLine; + TScreen = array[ 0..239 ] of PLine; +var + VScreen: TScreen; (* Virtual screen *) + BallX : array[ 0..R, 0..R ] of integer; + BallY : array[ 0..R, 0..R ] of integer; + Sprite : array[ -R..R, -R..R ] of byte; + Page : word; + +(* Returns "lens-view" coordinates of X,Y *) +procedure GetCoords( var X, Y: integer ); +var + LR, Z, SinA, SinB, TgB, Q: real; +begin + LR := Sqrt( X*X + Y*Y ); + if( LR = 0 ) then Exit; + if( LR < R ) then begin + Z := Sqrt( R*R - LR*LR ); + SinA := LR / R; + SinB := SinA / K; + TgB := SinB / Sqrt( 1-SinB*SinB ); + Q := LR - TgB*Z; + X := Round( X * ( Q/LR ) ); + Y := Round( Y * ( Q/LR ) ); + end; +end; + +procedure Init; +var + F : file; + Palette: array[ 0..767 ] of record R, G, B: byte; end; + X, Y, + X2, Y2 : integer; +begin + (* Load background image *) + Assign( F, 'demo06.dat' ); + Reset( F, 1 ); + BlockRead( F, Palette, 768 ); + mxSetPalette( @Palette, 0, 256 ); + for Y:=0 to 239 do begin + New( VScreen[Y] ); + BlockRead( F, VScreen[Y]^, 320 ); + mxPutImage( VScreen[Y], 0, 480+Y, 320, 1, OP_MOVE ); + end; + Close( F ); + (* Build lens *) + for X:=0 to R do begin + for Y:=0 to R do begin + X2 := X; + Y2 := Y; + GetCoords( X2, Y2 ); + BallX[X, Y] := X2; + BallY[X, Y] := Y2; + end; + end; +end; + +procedure PutLens( OX, OY: integer ); +var + X, Y: integer; +begin + for X:=0 to R do begin + for Y:=0 to R do begin + Sprite[Y][X] := VScreen[ OY+BallY[X,Y] ]^[ OX+BallX[X,Y] ]; + Sprite[Y][-X] := VScreen[ OY+BallY[X,Y] ]^[ OX-BallX[X,Y] ]; + Sprite[-Y][X] := VScreen[ OY-BallY[X,Y] ]^[ OX+BallX[X,Y] ]; + Sprite[-Y][-X] := VScreen[ OY-BallY[X,Y] ]^[ OX-BallX[X,Y] ]; + end; + end; + (* Draw the sprite *) + mxPutImage( @Sprite, OX-R, OY-R+Page, 2*R+1, 2*R+1, OP_MOVE ); +end; + +function Delta: integer; +begin + Delta := Random(3)+2; +end; + +procedure Check( Cond: boolean; var Coord, DeltaC: integer; NewCoord, Sign: integer ); +begin + if( Cond ) then begin + Coord := NewCoord; + DeltaC := Sign*Delta; + end; +end; + +var + X, Y, DX, DY: integer; + C: char; +begin + mxInit; + mxSetMode( MX_320x240 ); + Init; + Page := 240; + X := R; + Y := R; + Randomize; + DX := Delta; + DY := Delta; + + (* Main loop *) + repeat + (* Update video *) + mxBitBlt( 0, 480, 320, 240, 0, Page ); + PutLens( X, Y ); + mxCircle( X, Page+Y, R, 0 ); + (* Update lens coordinates *) + Inc( X, DX ); + Check( X+R >= 319, X, DX, 319-R, -1 ); + Check( X <= R, X, DX, R, +1 ); + Inc( Y, DY ); + Check( Y+R >= 239, Y, DY, 239-R, -1 ); + Check( Y <= R, Y, DY, R, +1 ); + (* Flip pages: double buffering, avoid wait for display *) + case Page of + 0 : begin PortW[$3D4] := $000C; Page := 240; end; + 240: begin PortW[$3D4] := $4B0C; Page := 0; end; + end; + mxWaitRetrace; (* Wait for hidden page to show *) + until( KeyPressed ); + + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/x/modex/DEMO07.EXE b/16/x/modex/DEMO07.EXE new file mode 100755 index 0000000000000000000000000000000000000000..8a401169bba312a0d668452c9df6086505c394a8 GIT binary patch literal 7440 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 639, X, DX, 319, -1 ); + Check( X < 0, X, DX, 0, +1 ); + Inc( Y, DY ); + Check( Y+200 >= 399, Y, DY, 199, -1 ); + Check( Y < 0, Y, DY, 0, +1 ); + mxPan( X, Y ); + mxWaitRetrace; + end; + + (* Shutdown *) + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/x/modex/MATH.INC b/16/x/modex/MATH.INC new file mode 100755 index 00000000..742af410 --- /dev/null +++ b/16/x/modex/MATH.INC @@ -0,0 +1,34 @@ +; +; MATH.INC - Include file for THREED.ASM +; + +; 3-dimensional point, coordinates in fixed format (16:16) +; +TPOINT STRUC + X DD ? + Y DD ? + Z DD ? +TPOINT ENDS + +; 2-dimensional point, coordinates in integer format +; +TIMAGEPOINT STRUC + IX DW ? + IY DW ? +TIMAGEPOINT ENDS + +; Fixed-point divide: EAX = EAX / arg +; +.xdiv MACRO arg + xor edx, edx + shld edx, eax, 16 + shl eax, 16 + idiv arg +ENDM + +; Fixed-point multiply: EAX = EAX * arg +; +.xmul MACRO arg + imul arg + shrd eax, edx, 16 +ENDM diff --git a/16/x/modex/PLASMA.PAS b/16/x/modex/PLASMA.PAS new file mode 100755 index 00000000..237e292a --- /dev/null +++ b/16/x/modex/PLASMA.PAS @@ -0,0 +1,103 @@ +unit Plasma; +interface + +const + PAL_RGB = 0; + PAL_CLOUDS = 1; + PAL_LANDSCAPE = 2; + +procedure MakePlasma( X, Y: integer; W, H: word; C1, C2, C3, C4: byte ); +procedure MakePlasmaPalette( var Palette; What: word ); + +implementation uses Modex; + +procedure NewColor( XA, YA, X, Y, XB, YB: integer ); +var + Color: longint; +begin + Color := Abs( XA-XB )+Abs( YA-YB ); + Color := Random( Color shl 1 )-Color; + Color := (Color+mxGetPixel( XA, YA )+mxGetPixel( XB, YB )+1) shr 1; + if( Color < 1 ) then Color := 1; + if( Color > 192 ) then Color := 192; + if( mxGetPixel( X, Y ) = 0 ) then + mxPutPixel( X, Y, Lo(Color) ); +end; + +procedure Divide( X1, Y1, X2, Y2: integer ); +var + X, Y, Color: integer; +begin + if not( (X2-X1<2)and(Y2-Y1<2) ) then begin + X := (X1+X2) shr 1; + Y := (Y1+Y2) shr 1; + NewColor( X1, Y1, X, Y1, X2, Y1 ); + NewColor( X2, Y1, X2, Y, X2, Y2 ); + NewColor( X1, Y2, X, Y2, X2, Y2 ); + NewColor( X1, Y1, X1, Y, X1, Y2 ); + Color := (mxGetPixel( X1, Y1 )+mxGetPixel( X2, Y1 )+ + mxGetPixel( X2, Y2 )+mxGetPixel( X1, Y2 )) shr 2; + mxPutPixel( X, Y, Color ); + Divide( X1, Y1, X, Y ); + Divide( X, Y1, X2, Y ); + Divide( X, Y, X2, Y2 ); + Divide( X1, Y, X, Y2 ); + end; +end; + +procedure MakePlasma; +begin + Dec( W ); + Dec( H ); + mxPutPixel( X, Y, C1 ); + mxPutPixel( X, Y+H, C2 ); + mxPutPixel( X+W, Y+H, C3 ); + mxPutPixel( X+W, Y, C4 ); + Divide( X, Y, X+W, Y+H ); +end; + +procedure MakePlasmaPalette; +type + TPal = array[ byte ] of record R, G, B: byte end; +var + I: word; +begin + FillChar( TPal(Palette)[1], 192*3, 0 ); + case What of + PAL_CLOUDS: + for I:=1 to 192 do begin + TPal(Palette)[I].R := Abs( I-96 )*63 div 96; + TPal(Palette)[I].G := Abs( I-96 )*63 div 96; + TPal(Palette)[I].B := 63; + end; + PAL_LANDSCAPE: + begin + for I:=0 to 31 do begin + TPal(Palette)[I+1].R := I; + TPal(Palette)[I+1].G := I; + TPal(Palette)[I+1].B := I + I shr 1+15; + end; + for I:=32 to 63 do begin + TPal(Palette)[I+1].R := 0; + TPal(Palette)[I+1].G := I; + TPal(Palette)[I+1].B := 0; + end; + for I:=64 to 191 do begin + TPal(Palette)[I+1].R := (I-64) div 3 + 15; + TPal(Palette)[I+1].G := (I-64) div 3 + 15; + TPal(Palette)[I+1].B := (I-64) div 3 + 15; + end; + end; + else + for I:=1 to 64 do begin + TPal(Palette)[I].G := I-1; + TPal(Palette)[I].B := 64-I; + TPal(Palette)[I+64].R := I-1; + TPal(Palette)[I+64].G := 64-I; + TPal(Palette)[I+128].B := I-1; + TPal(Palette)[I+128].R := 64-I; + end; + end; +end; + +end. \ No newline at end of file diff --git a/16/x/modex/QIX2.EXE b/16/x/modex/QIX2.EXE new file mode 100755 index 0000000000000000000000000000000000000000..a10d7db5a0a62654c70c632d8ce6b078a520613c GIT binary patch literal 10336 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 DJ^3nG literal 0 HcmV?d00001 diff --git a/16/x/modex/QIX2.PAS b/16/x/modex/QIX2.PAS new file mode 100755 index 00000000..d1b59791 --- /dev/null +++ b/16/x/modex/QIX2.PAS @@ -0,0 +1,210 @@ +{$E-,N+} +uses Crt, Modex; + +const + DEFVERT = 12; (* Vertex count *) + DEFREPL = 3; (* Repetition count *) + DEFQIXS = 2; (* Qixs *) + FADESPEED = 48; +type + TPoint = record + X, Y : integer; + end; + TRGB = record + R, G, B: byte; + end; + TQix = record + Color: integer; + Vert : array[ 0..DEFVERT-1, 0..DEFREPL-1 ] of TPoint; + Delta: array[ 0..DEFVERT-1 ] of TPoint; + end; +var + Page : integer; + MaxX, + MaxY : word; + Qix : array[ 0..DEFQIXS-1 ] of TQix; + Pal : array[ byte ] of TRGB; + +type + TReal = double; + TRPoint = record + X, Y: TReal; + end; + TMatrix = array[ 0..3, 0..3 ] of TReal; +var + M: TMatrix; + G: array[ 0..DEFVERT-1 ] of TRPoint; + C: array[ 0..DEFVERT-1 ] of TRPoint; + +procedure BumpPal( Idx, DR, DG, DB, Steps: integer ); +var + I: integer; +begin + for I:=1 to Steps do begin + Pal[Idx+1].R := Pal[Idx].R + DR; + Pal[Idx+1].G := Pal[Idx].G + DG; + Pal[Idx+1].B := Pal[Idx].B + DB; + Inc( Idx ); + end; +end; + +procedure InitPalette; +begin + with Pal[0] do begin R:=0; G:=0; B:=0; end; + with Pal[1] do begin R:=0; G:=0; B:=62; end; + BumpPal( 1, 0, 2, -2, 31 ); + BumpPal( 32, 2, -2, 0, 31 ); + BumpPal( 63, -2, 2, 2, 31 ); + BumpPal( 94, 2, 0, -2, 31 ); + BumpPal( 125, -2, -2, 2, 31 ); +end; + +procedure Init( var Qix: TQix; Color: integer ); +var + I: integer; +begin + FillChar( Qix.Vert, SizeOf(Qix.Vert), 0 ); + for I:=0 to DEFVERT-1 do begin + Qix.Vert[I, DEFREPL-1].X := Random( MaxX ); + Qix.Vert[I, DEFREPL-1].Y := Random( MaxY ); + Qix.Delta[I].X := Random(5)+1; + Qix.Delta[I].Y := Random(5)+1; + end; + Qix.Color := Color; + + (* Initialize matrix (Catmull-Rom) *) + M[0,0] := -1/2; M[0,1] := 3/2; M[0,2] := -3/2; M[0,3] := 1/2; + M[1,0] := 1; M[1,1] := -5/2; M[1,2] := 2; M[1,3] := -1/2; + M[2,0] := -1/2; M[2,1] := 0; M[2,2] := 1/2; M[2,3] := 0; + M[3,0] := 0; M[3,1] := 1; M[3,2] := 0; M[3,3] := 0; +end; + +procedure mxBezier( var Qix: TQix; I0, Idx, N: integer ); +var + I, J: integer; + T, T2, T3: TReal; + X0, Y0, X, Y: TReal; + Delta: TReal; +begin + (* Compute coefficients *) + for I:=0 to 3 do begin + C[I].X := 0; + for J:=0 to 3 do C[I].X := C[I].X + M[I,J]*Qix.Vert[(I0+J) mod DEFVERT,Idx].X; + C[I].Y := 0; + for J:=0 to 3 do C[I].Y := C[I].Y + M[I,J]*Qix.Vert[(I0+J) mod DEFVERT,Idx].Y; + end; + X0 := C[3].X; + Y0 := C[3].Y; + Delta := 1 / N; + T := 0; + for I:=1 to N do begin + T := T + Delta; + T2 := T*T; + T3 := T*T2; + X := C[0].X*T3 + C[1].X*T2 + C[2].X*T + C[3].X; + Y := C[0].Y*T3 + C[1].Y*T2 + C[2].Y*T + C[3].Y; + mxLine( Round(X0), Page+Round(Y0), Round(X), Page+Round(Y), Qix.Color, OP_SET ); + X0 := X; + Y0 := Y; + end; +end; + +procedure Plot( var Qix: TQix; Idx: integer ); +var + I, J: integer; +begin + for I:=0 to DEFVERT-1 do begin + mxBezier( Qix, I, Idx, 12 ); + end; +end; + +procedure Update( var Qix: TQix; Idx: integer ); +var + I: integer; +begin + for I:=0 to DEFVERT-1 do with Qix do begin + Inc( Vert[I,Idx].X, Delta[I].X ); + if( Vert[I,Idx].X < 0 ) then begin + Vert[I,Idx].X := 0; + Delta[I].X := Random( 5 )+1; + end; + if( Vert[I,Idx].X > MaxX ) then begin + Vert[I,Idx].X := MaxX; + Delta[I].X := -Random( 5 )-1; + end; + Inc( Vert[I,Idx].Y, Delta[I].Y ); + if( Vert[I,Idx].Y < 0 ) then begin + Vert[I,Idx].Y := 0; + Delta[I].Y := Random( 5 )+1; + end; + if( Vert[I,Idx].Y > MaxY ) then begin + Vert[I,Idx].Y := MaxY; + Delta[I].Y := -Random( 5 )-1; + end; + end; +end; + +procedure Copy( var Qix: TQix; Dest, Src: integer ); +var + I: integer; +begin + for I:=0 to DEFVERT-1 do with Qix do begin + Vert[I,Dest].X := Vert[I,Src].X; + Vert[I,Dest].Y := Vert[I,Src].Y; + end; +end; + +procedure AnimateQix; +var + Q, Idx, I, J, P, Count: integer; +begin + Count := 0; + P := DEFREPL-1; + I := 0; + J := 1; + repeat + mxSetClipRegion( 0, Page, MaxX+1, MaxY+1 ); + mxSetClip( TRUE ); + mxFillBox( 0, Page, MaxX+1, MaxY+1, 0, OP_SET ); + for Q:=0 to DEFQIXS-1 do begin + Copy( Qix[Q], I, P ); + Update( Qix[Q], I ); + for Idx:=0 to DEFREPL-1 do begin + Plot( Qix[Q], Idx ); + end; + end; + I := (I+1) mod DEFREPL; + J := (J+1) mod DEFREPL; + P := (P+1) mod DEFREPL; + Inc( Count ); + mxStartLine( Page ); + if( Count >= FADESPEED ) then begin + for Q:=0 to DEFQIXS-1 do begin + Inc( Qix[Q].Color ); + if( Qix[Q].Color > 156 ) then + Qix[Q].Color := 1; + end; + Count := 0; + end; + Page := 240-Page; + until( KeyPressed ); +end; + +var + I: integer; +begin + Randomize; + mxInit; + mxSetMode( MX_320x240 ); + mxGetScreenSize( MaxX, MaxY ); + for I:=0 to DEFQIXS-1 do + Init( Qix[I], (I*(155 div DEFQIXS)) mod 155 + 1 ); + InitPalette; + mxSetPalette( @Pal, 0, 157 ); + Page := 240; + Dec( MaxX ); + Dec( MaxY ); + AnimateQix; + mxSetMode( MX_TEXT ); + mxTerm; +end. diff --git a/16/x/modex/README.TXT b/16/x/modex/README.TXT new file mode 100755 index 00000000..306e8b9a --- /dev/null +++ b/16/x/modex/README.TXT @@ -0,0 +1,8 @@ +ModeX - A graphical library for DOS programs +Copyright (c) 1993-1994 Alessandro Scotti +http://www.ascotti.org/ + +Please look at the above site in the "Art of..." and +then in the "Old programs" section for more information. + + diff --git a/16/x/modex/SINCOS.INC b/16/x/modex/SINCOS.INC new file mode 100755 index 00000000..6986eeeb --- /dev/null +++ b/16/x/modex/SINCOS.INC @@ -0,0 +1,518 @@ +; +; SINCOS.INC - Sin/cos tables for THREED.ASM +; + +tblSin LABEL DWORD + DD 0 + DD 411733 + DD 823219 + DD 1234209 + DD 1644455 + DD 2053710 + DD 2461729 + DD 2868265 + DD 3273072 + DD 3675909 + DD 4076531 + DD 4474698 + DD 4870169 + DD 5262706 + DD 5652074 + DD 6038037 + DD 6420363 + DD 6798821 + DD 7173184 + DD 7543226 + DD 7908725 + DD 8269459 + DD 8625213 + DD 8975771 + DD 9320922 + DD 9660458 + DD 9994176 + DD 10321873 + DD 10643353 + DD 10958422 + DD 11266890 + DD 11568571 + DD 11863283 + DD 12150850 + DD 12431097 + DD 12703856 + DD 12968963 + DD 13226258 + DD 13475586 + DD 13716797 + DD 13949745 + DD 14174291 + DD 14390298 + DD 14597637 + DD 14796184 + DD 14985817 + DD 15166424 + DD 15337895 + DD 15500126 + DD 15653022 + DD 15796488 + DD 15930439 + DD 16054795 + DD 16169479 + DD 16274424 + DD 16369565 + DD 16454846 + DD 16530216 + DD 16595628 + DD 16651044 + DD 16696429 + DD 16731757 + DD 16757007 + DD 16772163 + DD 16777216 + DD 16772163 + DD 16757007 + DD 16731757 + DD 16696429 + DD 16651044 + DD 16595628 + DD 16530216 + DD 16454846 + DD 16369565 + DD 16274424 + DD 16169479 + DD 16054795 + DD 15930439 + DD 15796488 + DD 15653022 + DD 15500126 + DD 15337895 + DD 15166424 + DD 14985817 + DD 14796184 + DD 14597637 + DD 14390298 + DD 14174291 + DD 13949745 + DD 13716797 + DD 13475586 + DD 13226258 + DD 12968963 + DD 12703856 + DD 12431097 + DD 12150850 + DD 11863283 + DD 11568571 + DD 11266890 + DD 10958422 + DD 10643353 + DD 10321873 + DD 9994176 + DD 9660458 + DD 9320922 + DD 8975771 + DD 8625213 + DD 8269459 + DD 7908725 + DD 7543226 + DD 7173184 + DD 6798821 + DD 6420363 + DD 6038037 + DD 5652074 + DD 5262706 + DD 4870169 + DD 4474698 + DD 4076531 + DD 3675909 + DD 3273072 + DD 2868265 + DD 2461729 + DD 2053710 + DD 1644455 + DD 1234209 + DD 823219 + DD 411733 + DD 0 + DD -411733 + DD -823219 + DD -1234209 + DD -1644455 + DD -2053710 + DD -2461729 + DD -2868265 + DD -3273072 + DD -3675909 + DD -4076531 + DD -4474698 + DD -4870169 + DD -5262706 + DD -5652074 + DD -6038037 + DD -6420363 + DD -6798821 + DD -7173184 + DD -7543226 + DD -7908725 + DD -8269459 + DD -8625213 + DD -8975771 + DD -9320922 + DD -9660458 + DD -9994176 + DD -10321873 + DD -10643353 + DD -10958422 + DD -11266890 + DD -11568571 + DD -11863283 + DD -12150850 + DD -12431097 + DD -12703856 + DD -12968963 + DD -13226258 + DD -13475586 + DD -13716797 + DD -13949745 + DD -14174291 + DD -14390298 + DD -14597637 + DD -14796184 + DD -14985817 + DD -15166424 + DD -15337895 + DD -15500126 + DD -15653022 + DD -15796488 + DD -15930439 + DD -16054795 + DD -16169479 + DD -16274424 + DD -16369565 + DD -16454846 + DD -16530216 + DD -16595628 + DD -16651044 + DD -16696429 + DD -16731757 + DD -16757007 + DD -16772163 + DD -16777216 + DD -16772163 + DD -16757007 + DD -16731757 + DD -16696429 + DD -16651044 + DD -16595628 + DD -16530216 + DD -16454846 + DD -16369565 + DD -16274424 + DD -16169479 + DD -16054795 + DD -15930439 + DD -15796488 + DD -15653022 + DD -15500126 + DD -15337895 + DD -15166424 + DD -14985817 + DD -14796184 + DD -14597637 + DD -14390298 + DD -14174291 + DD -13949745 + DD -13716797 + DD -13475586 + DD -13226258 + DD -12968963 + DD -12703856 + DD -12431097 + DD -12150850 + DD -11863283 + DD -11568571 + DD -11266890 + DD -10958422 + DD -10643353 + DD -10321873 + DD -9994176 + DD -9660458 + DD -9320922 + DD -8975771 + DD -8625213 + DD -8269459 + DD -7908725 + DD -7543226 + DD -7173184 + DD -6798821 + DD -6420363 + DD -6038037 + DD -5652074 + DD -5262706 + DD -4870169 + DD -4474698 + DD -4076531 + DD -3675909 + DD -3273072 + DD -2868265 + DD -2461729 + DD -2053710 + DD -1644455 + DD -1234209 + DD -823219 + DD -411733 +tblCos LABEL DWORD + DD 16777216 + DD 16772163 + DD 16757007 + DD 16731757 + DD 16696429 + DD 16651044 + DD 16595628 + DD 16530216 + DD 16454846 + DD 16369565 + DD 16274424 + DD 16169479 + DD 16054795 + DD 15930439 + DD 15796488 + DD 15653022 + DD 15500126 + DD 15337895 + DD 15166424 + DD 14985817 + DD 14796184 + DD 14597637 + DD 14390298 + DD 14174291 + DD 13949745 + DD 13716797 + DD 13475586 + DD 13226258 + DD 12968963 + DD 12703856 + DD 12431097 + DD 12150850 + DD 11863283 + DD 11568571 + DD 11266890 + DD 10958422 + DD 10643353 + DD 10321873 + DD 9994176 + DD 9660458 + DD 9320922 + DD 8975771 + DD 8625213 + DD 8269459 + DD 7908725 + DD 7543226 + DD 7173184 + DD 6798821 + DD 6420363 + DD 6038037 + DD 5652074 + DD 5262706 + DD 4870169 + DD 4474698 + DD 4076531 + DD 3675909 + DD 3273072 + DD 2868265 + DD 2461729 + DD 2053710 + DD 1644455 + DD 1234209 + DD 823219 + DD 411733 + DD 0 + DD -411733 + DD -823219 + DD -1234209 + DD -1644455 + DD -2053710 + DD -2461729 + DD -2868265 + DD -3273072 + DD -3675909 + DD -4076531 + DD -4474698 + DD -4870169 + DD -5262706 + DD -5652074 + DD -6038037 + DD -6420363 + DD -6798821 + DD -7173184 + DD -7543226 + DD -7908725 + DD -8269459 + DD -8625213 + DD -8975771 + DD -9320922 + DD -9660458 + DD -9994176 + DD -10321873 + DD -10643353 + DD -10958422 + DD -11266890 + DD -11568571 + DD -11863283 + DD -12150850 + DD -12431097 + DD -12703856 + DD -12968963 + DD -13226258 + DD -13475586 + DD -13716797 + DD -13949745 + DD -14174291 + DD -14390298 + DD -14597637 + DD -14796184 + DD -14985817 + DD -15166424 + DD -15337895 + DD -15500126 + DD -15653022 + DD -15796488 + DD -15930439 + DD -16054795 + DD -16169479 + DD -16274424 + DD -16369565 + DD -16454846 + DD -16530216 + DD -16595628 + DD -16651044 + DD -16696429 + DD -16731757 + DD -16757007 + DD -16772163 + DD -16777216 + DD -16772163 + DD -16757007 + DD -16731757 + DD -16696429 + DD -16651044 + DD -16595628 + DD -16530216 + DD -16454846 + DD -16369565 + DD -16274424 + DD -16169479 + DD -16054795 + DD -15930439 + DD -15796488 + DD -15653022 + DD -15500126 + DD -15337895 + DD -15166424 + DD -14985817 + DD -14796184 + DD -14597637 + DD -14390298 + DD -14174291 + DD -13949745 + DD -13716797 + DD -13475586 + DD -13226258 + DD -12968963 + DD -12703856 + DD -12431097 + DD -12150850 + DD -11863283 + DD -11568571 + DD -11266890 + DD -10958422 + DD -10643353 + DD -10321873 + DD -9994176 + DD -9660458 + DD -9320922 + DD -8975771 + DD -8625213 + DD -8269459 + DD -7908725 + DD -7543226 + DD -7173184 + DD -6798821 + DD -6420363 + DD -6038037 + DD -5652074 + DD -5262706 + DD -4870169 + DD -4474698 + DD -4076531 + DD -3675909 + DD -3273072 + DD -2868265 + DD -2461729 + DD -2053710 + DD -1644455 + DD -1234209 + DD -823219 + DD -411733 + DD 0 + DD 411733 + DD 823219 + DD 1234209 + DD 1644455 + DD 2053710 + DD 2461729 + DD 2868265 + DD 3273072 + DD 3675909 + DD 4076531 + DD 4474698 + DD 4870169 + DD 5262706 + DD 5652074 + DD 6038037 + DD 6420363 + DD 6798821 + DD 7173184 + DD 7543226 + DD 7908725 + DD 8269459 + DD 8625213 + DD 8975771 + DD 9320922 + DD 9660458 + DD 9994176 + DD 10321873 + DD 10643353 + DD 10958422 + DD 11266890 + DD 11568571 + DD 11863283 + DD 12150850 + DD 12431097 + DD 12703856 + DD 12968963 + DD 13226258 + DD 13475586 + DD 13716797 + DD 13949745 + DD 14174291 + DD 14390298 + DD 14597637 + DD 14796184 + DD 14985817 + DD 15166424 + DD 15337895 + DD 15500126 + DD 15653022 + DD 15796488 + DD 15930439 + DD 16054795 + DD 16169479 + DD 16274424 + DD 16369565 + DD 16454846 + DD 16530216 + DD 16595628 + DD 16651044 + DD 16696429 + DD 16731757 + DD 16757007 + DD 16772163 diff --git a/16/x/modex/THREED.ASM b/16/x/modex/THREED.ASM new file mode 100755 index 00000000..5ecd3ba3 --- /dev/null +++ b/16/x/modex/THREED.ASM @@ -0,0 +1,872 @@ +COMMENT / + Fixed-point math functions and 3D transforms + Copyright (c) 1993,94 by Alessandro Scotti +/ +WARN PRO +P386 +JUMPS +LOCALS + +INCLUDE MATH.INC + +PUBLIC tdFixedMul +PUBLIC tdGetNormal +PUBLIC tdRotate +PUBLIC tdGetSurfaceLight +PUBLIC tdSetLight +PUBLIC tdSetRotation +PUBLIC tdSetTranslation +PUBLIC tdTransform +PUBLIC tdTransformToImage +PUBLIC tdTransformLight +PUBLIC tdBackPlaneCull +PUBLIC tdSetPerspective + +;----------------------------------------------------------- +; +; Data segment +; +MATH_DATA SEGMENT USE16 PARA PUBLIC 'DATA' + ASSUME ds:MATH_DATA + +INCLUDE SINCOS.INC ; Fixed 8:24 sin/cos table + +XRotation TPOINT <> ; 3x3 rotation matrix +YRotation TPOINT <> +ZRotation TPOINT <> + +Translation TPOINT <> ; Translation vector + +Light TPOINT <> ; Light vector +AmbientLight DW 00 ; Ambient light + +XScale DD 10000h ; Scaling factor for X coordinate +YScale DD 10000h ; Scaling factor for Y coordinate +PerspectiveDistance DD 20000000h + +MATH_DATA ENDS + +;----------------------------------------------------------- +; +; Code segment +; +MATH_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MATH_TEXT, es:NOTHING, fs:NOTHING + +tdSetPerspective PROC PASCAL FAR + ARG Perspective:DWORD, \ + ScaleX:DWORD, \ + ScaleY:DWORD + USES ds + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + mov eax, [Perspective] + mov [PerspectiveDistance], eax + mov eax, [ScaleX] + mov [XScale], eax + mov eax, [ScaleY] + mov [YScale], eax + + ret +tdSetPerspective ENDP + + +;----------------------------------------------------------- +; +; Sets the rotation matrix. +; +; Input: +; RX = X-axis rotation angle +; RY = X-axis rotation angle +; RZ = X-axis rotation angle +; Output: +; none +; +tdSetRotation PROC PASCAL FAR + ARG RX:WORD, \ + RY:WORD, \ + RZ:WORD + USES ds, si, di + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + mov bx, [RZ] + mov si, [RY] + mov di, [RX] + shl bx, 2 + shl si, 2 + shl di, 2 + + push ebp ; We use EBP as a scratch register + +; Set X rotation + mov eax, tblCos[bx] + imul tblCos[si] + mov [XRotation.X], edx + + mov eax, tblSin[bx] + imul tblCos[si] + mov [XRotation.Y], edx + + mov eax, tblSin[si] + sar eax, 8 ; Convert fixed 8:24 to fixed 16:16 + mov [XRotation.Z], eax + +; Set Y rotation + mov eax, tblCos[bx] + imul tblSin[si] ; EDX:EAX = fixed 16:48 + shrd eax, edx, 24 ; EAX = fixed 8:24 + imul tblSin[di] ; EDX:EAX = fixed 16:48 + mov ebp, eax + mov ecx, edx + mov eax, tblSin[bx] + imul tblCos[di] + add eax, ebp + adc edx, ecx ; EDX:EAX = fixed 16:48 + neg edx + mov [YRotation.X], edx + + mov eax, tblSin[bx] + imul tblSin[si] + shrd eax, edx, 24 + imul tblSin[di] + mov ebp, eax + mov ecx, edx + mov eax, tblCos[bx] + imul tblCos[di] + sub eax, ebp + sbb edx, ecx + mov [YRotation.Y], edx + + mov eax, tblCos[si] + imul tblSin[di] + mov [YRotation.Z], edx + +; Set Z rotation + mov eax, tblCos[bx] + imul tblSin[si] + shrd eax, edx, 24 + imul tblCos[di] + mov ebp, eax + mov ecx, edx + mov eax, tblSin[bx] + imul tblSin[di] + sub eax, ebp + sbb edx, ecx + mov [ZRotation.X], edx + + mov eax, tblSin[bx] + imul tblSin[si] + shrd eax, edx, 24 + imul tblCos[di] + mov ebp, eax + mov ecx, edx + mov eax, tblCos[bx] + imul tblSin[di] + add eax, ebp + add edx, ecx + neg edx + mov [ZRotation.Y], edx + + mov eax, tblCos[si] + imul tblCos[di] + mov [ZRotation.Z], edx + + pop ebp ; Restore EBP + + ret +tdSetRotation ENDP + +;----------------------------------------------------------- +; +; Sets the translation vector. +; +; Input: +; TV = pointer to translation vector +; Output: +; none +; +tdSetTranslation PROC PASCAL FAR + ARG TV:DWORD + USES ds, es, di + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + les di, [TV] + mov eax, es:[di].X + mov [Translation.X], eax + mov eax, es:[di].Y + mov [Translation.Y], eax + mov eax, es:[di].Z + mov [Translation.Z], eax + + ret +tdSetTranslation ENDP + +;----------------------------------------------------------- +; +; Transforms an array of TPOINT. +; +; Input: +; Source = pointer to source array of TPOINT +; Dest = pointer to destination array of TPOINT +; Count = number of entries to transform +; Output: +; none +; +tdTransform PROC PASCAL FAR + ARG Source:DWORD, \ + Dest:DWORD, \ + Count:WORD + LOCAL Adjust:DWORD + USES ds, si, es, di, fs + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + lfs si, [Source] + les di, [Dest] + + ALIGN DWORD +@@Loop: +; Transform Z coordinate + mov eax, fs:[si].X + imul [ZRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, fs:[si].Y + imul [ZRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, fs:[si].Z + imul [ZRotation.Z] + add eax, ecx + adc edx, ebx + mov ebx, eax + shrd eax, edx, 16 + add eax, [Translation.Z] ; EAX = new Z coord (fixed 16:16) + mov es:[di].Z, eax +; Get perspective factor + mov ebx, [PerspectiveDistance] + sub eax, ebx + neg eax ; EAX = PD - Z + xor edx, edx + shld edx, eax, 16 + shl eax, 16 + idiv ebx ; EAX = fixed 16:16 result + mov [Adjust], eax + +; Transform X coordinate + mov eax, fs:[si].X + imul [XRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, fs:[si].Y + imul [XRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, fs:[si].Z + imul [XRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + add eax, [Translation.X] + imul [Adjust] + shrd eax, edx, 16 + mov es:[di].X, eax + +; Transform Y coordinate + mov eax, fs:[si].X + imul [YRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, fs:[si].Y + imul [YRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, fs:[si].Z + imul [YRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + add eax, [Translation.Y] + imul [Adjust] + shrd eax, edx, 16 + mov es:[di].Y, eax + + add si, SIZE TPOINT + add di, SIZE TPOINT + dec [Count] + jnz @@Loop + + ret +tdTransform ENDP + +;----------------------------------------------------------- +; +; Transforms an array of TPOINT into an array of TIMAGEPOINT. +; +; Input: +; Source = pointer to source array of TPOINT +; Dest = pointer to destination array of TIMAGEPOINT +; Count = number of entries to transform +; DeltaX = translation distance for the X coordinate +; DeltaY = translation distance for the Y coordinate +; Output: +; the maximum Z value +; +tdTransformToImage PROC PASCAL FAR + ARG Source:DWORD, \ + Dest:DWORD, \ + Count:WORD, \ + DeltaX:WORD, \ + DeltaY:WORD + LOCAL Adjust:DWORD, \ + Max:DWORD + USES ds, si, es, di, fs + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + lfs si, [Source] + les di, [Dest] + mov [Max], 80000000h + +@@Loop: +; Check max Z + mov eax, fs:[si].Z + cmp eax, [Max] + jle @@1 + mov [Max], eax +@@1: + +; Transform X coordinate + mov ax, WORD PTR fs:[si].X[2] + add ax, [DeltaX] + mov es:[di].IX, ax + +; Transform Y coordinate + mov ax, WORD PTR fs:[si].Y[2] + add ax, [DeltaY] + mov es:[di].IY, ax + + add si, SIZE TPOINT + add di, SIZE TIMAGEPOINT + dec [Count] + jnz @@Loop + + mov eax, [Max] + shld edx, eax, 16 + ret +tdTransformToImage ENDP + +;----------------------------------------------------------- +; +; Sets the light source. +; +; Input: +; Light = pointer to light vector +; Output: +; none +; +tdSetLight PROC PASCAL FAR + ARG L:DWORD + USES ds, es, di + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + les di, [L] + mov eax, es:[di].X + mov [Light.X], eax + mov eax, es:[di].Y + mov [Light.Y], eax + mov eax, es:[di].Z + mov [Light.Z], eax + + ret +tdSetLight ENDP + +;----------------------------------------------------------- +; +; Computes light intensity for an array of surfaces. +; +; Input: +; Normals = pointer to an array of surface normals +; Lights = pointer to an array of integer to be filled with +; light intensity +; Count = number of elements to transform +; Output: +; none +; +tdTransformLight PROC PASCAL FAR + ARG Normals:DWORD, \ + Lights:DWORD, \ + Count:WORD + USES ds, si, es, di, fs + + mov ax, SEG MATH_DATA + mov fs, ax + ASSUME fs:MATH_DATA + + lds si, [Normals] + les di, [Lights] + ASSUME ds:NOTHING + +; Intensity is given by the dot product between the Light vector and +; the surface normal +@@Loop: + mov eax, ds:[si].Z + imul [Light.Z] + mov ebx, eax + mov ecx, edx + mov eax, ds:[si].Y + imul [Light.Y] + add ebx, eax + adc ecx, edx + mov eax, ds:[si].X + imul [Light.X] + add eax, ebx + adc edx, ecx ; EDX:EAX = fixed 32:32 intensity + add dx, [AmbientLight] + test dx, dx + jg @@1 + xor dx, dx ; Return 0 for no light +@@1: + mov es:[di], dx + inc di + inc di + add si, SIZE TPOINT + dec [Count] + jnz @@Loop + + ASSUME fs:NOTHING + ret +tdTransformLight ENDP + +;----------------------------------------------------------- +; +; Returns the light value given the normal to a surface. +; +; Input: +; Normal = pointer to TPOINT surface normal vector +; Output: +; AX = light intensity (>=0) +; Notes: +; the normal is rotated according to the current setting. +; +tdGetSurfaceLight PROC PASCAL FAR + ARG Normal:DWORD + USES ds, esi, es, di + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + les di, [Normal] + +; Transform Z coordinate + mov eax, es:[di].X + imul [ZRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, es:[di].Y + imul [ZRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, es:[di].Z + imul [ZRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + imul [Light.Z] + shrd eax, edx, 16 + mov esi, eax + +; Transform X coordinate + mov eax, es:[di].X + imul [XRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, es:[di].Y + imul [XRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, es:[di].Z + imul [XRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + imul [Light.X] + shrd eax, edx, 16 + add esi, eax + +; Transform Y coordinate + mov eax, es:[di].X + imul [YRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, es:[di].Y + imul [YRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, es:[di].Z + imul [YRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + imul [Light.X] + shrd eax, edx, 16 + add eax, esi + shr eax, 16 + +; Add ambient light + add ax, [AmbientLight] + test ax, ax + jge @@Exit + xor ax, ax + +@@Exit: + ret +tdGetSurfaceLight ENDP + +;----------------------------------------------------------- +; +; Rotates an array of TPOINT. +; +; Input: +; Source = pointer to source array of TPOINT +; Dest = pointer to destination array of TPOINT +; Count = number of entries to transform +; Output: +; none +; +tdRotate PROC PASCAL FAR + ARG Source:DWORD, \ + Dest:DWORD, \ + Count:WORD + USES ds, si, es, di, fs + + mov ax, SEG MATH_DATA + mov ds, ax + ASSUME ds:MATH_DATA + + lfs si, [Source] + les di, [Dest] + +@@Loop: +; Transform Z coordinate + mov eax, fs:[si].X + imul [ZRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, fs:[si].Y + imul [ZRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, fs:[si].Z + imul [ZRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + mov es:[di].Z, eax + +; Transform X coordinate + mov eax, fs:[si].X + imul [XRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, fs:[si].Y + imul [XRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, fs:[si].Z + imul [XRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + mov es:[di].X, eax + +; Transform Y coordinate + mov eax, fs:[si].X + imul [YRotation.X] + mov ecx, eax + mov ebx, edx + mov eax, fs:[si].Y + imul [YRotation.Y] + add ecx, eax + adc ebx, edx + mov eax, fs:[si].Z + imul [YRotation.Z] + add eax, ecx + adc edx, ebx + shrd eax, edx, 16 + mov es:[di].Y, eax + + add si, SIZE TPOINT + add di, SIZE TPOINT + dec [Count] + jnz @@Loop + + ret +tdRotate ENDP + +tdFixedMul PROC PASCAL FAR + ARG F1:DWORD, \ + F2:DWORD + + mov eax, [F1] + imul [F2] + shr eax, 16 + + ret +tdFixedMul ENDP + +;----------------------------------------------------------- +; +; Returns in EAX the square root of EDX:EAX. +; +subSqrt PROC NEAR + push esi + push edi + + add eax, eax + adc edx, 0 + mov eax, edx ; Just discard the low bits + + mov esi, eax + xor edi, edi + shld edi, esi, 16 + shl esi, 16 +@@Loop: + mov ebx, eax + mul eax + add eax, esi + adc edx, edi + shrd eax, edx, 1 + shr edx, 1 + div ebx + cmp eax, ebx + jne @@Loop + +; Adjust EAX + shl eax, 8 + + pop edi + pop esi + ret +subSqrt ENDP + +;----------------------------------------------------------- +; +; Finds the unitary normal to a given surface. +; +; Input: +; Dest = pointer to TPOINT (vector) result +; P1, P2, P3 = pointer to TPOINT points on surface +; Output: +; none +; Notes: +; the normal is given by the cross-product between (P3-P1) and +; (P2-P1), so its orientation depends on the parameters order. +; +tdGetNormal PROC PASCAL FAR + ARG Dest:DWORD, \ + P1:DWORD, \ + P2:DWORD, \ + P3:DWORD + LOCAL V1:TPOINT, \ + V2:TPOINT, \ + N:TPOINT + USES ds, si, es, di + +; Get vector V1 + lds si, [P1] + les di, [P3] + mov eax, es:[di].X + sub eax, ds:[si].X + mov [V1.X], eax + mov eax, es:[di].Y + sub eax, ds:[si].Y + mov [V1.Y], eax + mov eax, es:[di].Z + sub eax, ds:[si].Z + mov [V1.Z], eax + +; Get vector V2 + les di, [P2] + mov eax, es:[di].X + sub eax, ds:[si].X + mov [V2.X], eax + mov eax, es:[di].Y + sub eax, ds:[si].Y + mov [V2.Y], eax + mov eax, es:[di].Z + sub eax, ds:[si].Z + mov [V2.Z], eax + +; Get normal vector (V1 x V2) + mov eax, [V1.Z] + imul [V2.Y] + mov ebx, eax + mov ecx, edx + mov eax, [V1.Y] + imul [V2.Z] + sub eax, ebx + sbb edx, ecx + shrd eax, edx, 16 + mov [N.X], eax + + mov eax, [V1.X] + imul [V2.Z] + mov ebx, eax + mov ecx, edx + mov eax, [V1.Z] + imul [V2.X] + sub eax, ebx + sbb edx, ecx + shrd eax, edx, 16 + mov [N.Y], eax + + mov eax, [V1.Y] + imul [V2.X] + mov ebx, eax + mov ecx, edx + mov eax, [V1.X] + imul [V2.Y] + sub eax, ebx + sbb edx, ecx + shrd eax, edx, 16 + mov [N.Z], eax + +; Get normal length + mov eax, [N.X] + imul eax + mov ebx, eax + mov ecx, edx + mov eax, [N.Y] + imul eax + add ebx, eax + adc ecx, edx + mov eax, [N.Z] + imul eax + add eax, ebx + adc edx, ecx ; EDX:EAX = N.X*N.X + N.Y*N.Y + N.Z*N.Z + call subSqrt ; EAX = normal length + mov ebx, eax + +; Adjust vector and save it + les di, [Dest] + mov eax, [N.X] + cdq + shld edx, eax, 16 + shl eax, 16 + idiv ebx + mov es:[di].X, eax + mov eax, [N.Y] + cdq + shld edx, eax, 16 + shl eax, 16 + idiv ebx + mov es:[di].Y, eax + mov eax, [N.Z] + cdq + shld edx, eax, 16 + shl eax, 16 + idiv ebx + mov es:[di].Z, eax + + ret +tdGetNormal ENDP + +TPOLY STRUC + Vtx DW 4 DUP(?) +TPOLY ENDS + +;----------------------------------------------------------- +; +; Performs surface removal on an array of polygons. +; +; Input: +; Poly = pointer to an array of TPOLY +; Vertex = pointer to an array of TPOINT +; Dest = pointer to an array of integer +; Count = number of polygons to check +; Step = size of TPOLY structure +; Output: +; if the n-th polygon is invisible the n-th entry of the +; Dest array is set to -1, other entries are not modified +; (so it's possible to use the Light array for Dest, because +; the light intensity is always >= 0) +; +tdBackPlaneCull PROC PASCAL FAR + ARG Step:WORD, \ + Poly:DWORD, \ + Vertex:DWORD, \ + Dest:DWORD, \ + Count:WORD + USES ds, si, es, di, fs + ASSUME ds:NOTHING + + mov ds, WORD PTR Vertex[2] + les di, [Poly] + mov fs, WORD PTR Dest[2] + +@@Loop: + mov ax, es:[di].Vtx[2] ; Index of 2nd vertex + shl ax, 2 + mov bx, ax + shl ax, 1 + add bx, ax ; BX = index*SIZE TPOINT + add bx, WORD PTR [Vertex] ; BX = offset of 2nd vertex + mov ax, es:[di].Vtx[4] ; Index of 3rd vertex + shl ax, 2 + mov si, ax + shl ax, 1 + add si, ax + add si, WORD PTR [Vertex] ; SI = offset of 3rd vertex + mov ecx, ds:[si].X + sub ecx, ds:[bx].X ; ECX = V3.X-V2.X + mov edx, ds:[si].Y + sub edx, ds:[bx].Y ; EDX = V3.Y-V2.Y + mov ax, es:[di].Vtx[0] ; Index of 1st vertex + shl ax, 2 + mov si, ax + shl ax, 1 + add si, ax + add si, WORD PTR [Vertex] ; SI = offset of 1st vertex + mov eax, ds:[si].X + sub eax, ds:[bx].X ; EAX = V1.X-V2.X + mov esi, ds:[si].Y + sub esi, ds:[bx].Y ; ESI = V1.Y-V2.Y + imul edx + mov ebx, eax + xchg ecx, edx ; ECX:EBX = (V1.X-V2.X)*(V3.Y-V2.Y) + mov eax, esi + imul edx ; EDX:EAX = (V1.Y-V2.Y)*(V3.X-V2.X) + sub eax, ebx + sbb edx, ecx + jl @@Next ; Polygon is visible + mov bx, WORD PTR [Dest] ; FS:BX -> current Dest entry + mov WORD PTR fs:[bx], -1 ; Remove polygon +@@Next: + add WORD PTR [Dest], 2 ; Next entry for dest + add di, [Step] ; Next polygon + dec [Count] + jnz @@Loop + + ret +tdBackPlaneCull ENDP + +MATH_TEXT ENDS +END diff --git a/16/x/modex/THREED.H b/16/x/modex/THREED.H new file mode 100755 index 00000000..b993ef86 --- /dev/null +++ b/16/x/modex/THREED.H @@ -0,0 +1,32 @@ +typedef struct { + long x, y, z; +} TVECTOR; + +#define PVECTOR TVECTOR far * + +#define TPOINT TVECTOR +#define PPOINT PVECTOR + +#define VPTR void far * + +#ifdef __cplusplus +extern "C" { +#endif + +long far pascal tdFixedMul( long, long ); +int far pascal tdGetSurfaceLight( PPOINT ); +long far pascal tdTransformToImage( VPTR, VPTR, short, short, short ); + +void far pascal tdBackPlaneCull( VPTR, VPTR, VPTR, short, short ); +void far pascal tdGetNormal( VPTR, PPOINT, PPOINT, PPOINT ); +void far pascal tdRotate( VPTR, VPTR, short ); +void far pascal tdSetLight( PVECTOR ); +void far pascal tdSetRotation( short, short, short ); +void far pascal tdSetTranslation( PVECTOR ); +void far pascal tdSetPerspective( long, long, long ); +void far pascal tdTransform( VPTR, VPTR, short ); +void far pascal tdTransformLight( VPTR, VPTR, short ); + +#ifdef __cplusplus +} +#endif diff --git a/16/x/modex/THREED.PAS b/16/x/modex/THREED.PAS new file mode 100755 index 00000000..8b712c9d --- /dev/null +++ b/16/x/modex/THREED.PAS @@ -0,0 +1,40 @@ +unit ThreeD; +interface + +type + TVector = record + X, Y, Z : longint; + end; + TPoint = TVector; + +function tdFixedMul( F1, F2: longint ): longint; +function tdGetSurfaceLight( var Normal: TPoint ): integer; +function tdTransformToImage( var Source, Dest; Count, DeltaX, DeltaY: integer ): longint; + +procedure tdBackPlaneCull( var Poly, Vertex, Dest; Count, Step: word ); +procedure tdGetNormal( var Dest, P1, P2, P3: TVector ); +procedure tdRotate( var Source, Dest; Count: word ); +procedure tdSetLight( var Light: TVector ); +procedure tdSetRotation( RX, RY, RZ: word ); +procedure tdSetTranslation( var TV: TVector ); +procedure tdSetPerspective( PD, XF, YF: longint ); +procedure tdTransform( var Source, Dest; Count: word ); +procedure tdTransformLight( var Source, Dest; Count: word ); + +implementation + +function tdGetSurfaceLight; external; +procedure tdSetRotation( RX, RY, RZ: word ); external; +procedure tdGetNormal; external; +procedure tdSetTranslation( var TV: TVector ); external; +procedure tdTransform( var Source, Dest; Count: word ); external; +procedure tdRotate; external; +function tdTransformToImage; external; +procedure tdSetLight( var Light: TVector ); external; +procedure tdSetPerspective; external; +procedure tdTransformLight; external; +function tdFixedMul( F1, F2: longint ): longint; external; +procedure tdBackPlaneCull; external; +{$L THREED} + +end. diff --git a/16/x/mxbb.asm b/16/x/mxbb.asm new file mode 100755 index 00000000..ac6668ce --- /dev/null +++ b/16/x/mxbb.asm @@ -0,0 +1,278 @@ +;----------------------------------------------------------- +; +; MXBB.ASM - Bit block transfer +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxBitBlt + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN subHorizontalLineInfo : NEAR + +EXTRN mx_VideoSegment : WORD +EXTRN mx_BytesPerLine : WORD + +;----------------------------------------------------------- +; +; Moves a block of video memory. +; +; Input: +; SX, SY = source coordinates +; Width = source width +; Height = source height +; DX, DY = destination coordinates +; Output: +; none +; +; Note: overlapping regions are not allowed. +; +mxBitBlt PROC FAR + ARG DestY:WORD, \ + DestX:WORD, \ + Height:WORD, \ + Width:WORD, \ + SY:WORD, \ + SX:WORD = ARG_SIZE + LOCAL PlaneWidth:WORD:4, \ + SourceOffset:WORD, \ + DestOffset:WORD, \ + Count:BYTE, \ + ReadPlane:BYTE, \ + WritePlane:BYTE, \ + LeftMask:BYTE, \ + RightMask:BYTE = AUTO_SIZE + .enter AUTO_SIZE + .push ds, si, es, di + +; Exit now if null width + cmp [Width], 0 + je @@Exit + +; Calls the proper procedure to handle transfer + mov ax, [SX] + and al, 03h ; AL = source plane + mov dx, [DestX] + and dl, 03h ; DL = destination plane + mov bx, OFFSET subPlaneBlt + cmp al, dl ; Same source and destination plane? + jne @@BitBlt ; No, use slow procedure + mov bx, OFFSET subMoveBlt +@@BitBlt: + call bx + +@@Exit: + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE + +;----------------------------------------------------------- +; Uses write mode 1 for maximum speed. Only works if source +; and destination are plane-aligned. +; +subMoveBlt PROC NEAR +; Get horizontal line info and address of destination + mov bx, [DestX] + mov ax, [DestY] + mov cx, [Width] + call subHorizontalLineInfo + mov [LeftMask], al + mov [RightMask], ah + mov [Width], cx + +; Setup segments + mov ax, [mx_VideoSegment] + mov ds, ax + mov es, ax + +; Get address of source pixel + mov ax, [SY] + mul [mx_BytesPerLine] + mov si, [SX] + .shr si, 2 + add si, ax + +; Set write mode 1 + mov dx, GDC + mov ax, 4105h + out dx, ax + cld + +; Move left block +@@L0: + mov ah, [LeftMask] + or ah, ah + jz @@C0 + mov dx, TS + mov al, 02h + out dx, ax ; Set write plane mask + mov ax, [mx_BytesPerLine] + dec ax + mov cx, [Height] + .push si, di +@@L1: + movsb + add si, ax + add di, ax + dec cx + jnz @@L1 + .pop si, di + inc si + inc di + +; Move center block +@@C0: + mov bx, [Width] + test bx, bx + jz @@R0 + mov dx, TS + mov ax, 0F02h + out dx, ax ; Enable all planes + mov ax, [mx_BytesPerLine] + sub ax, bx + mov dx, [Height] + .push si, di +@@C1: + mov cx, bx ; CX = image width + rep movsb ; Cannot use "movsw" here! + add si, ax ; Next scan line + add di, ax ; Next scan line + dec dx ; All lines processed? + jnz @@C1 ; No, continue + .pop si, di + add si, bx + add di, bx + +; Move right block +@@R0: + mov ah, [RightMask] + or ah, ah + jz @@Done + mov dx, TS + mov al, 02h + out dx, ax ; Set write plane mask + mov ax, [mx_BytesPerLine] + dec ax + mov cx, [Height] +@@R1: + movsb + add si, ax + add di, ax + dec cx + jnz @@R1 + +@@Done: + mov dx, GDC + mov ax, 4005h + out dx, ax ; Restore write mode 0 + +@@Exit: + ret +subMoveBlt ENDP + +;----------------------------------------------------------- +; Moves one plane at a time. +; +subPlaneBlt PROC NEAR +; Compute extra bytes and width count for each plane + mov cx, [Width] + mov bx, cx + shr bx, 1 + shr bx, 1 ; Width for each plane + and cl, 03h + mov al, 00001000b + shr al, cl + mov si, 3 SHL 1 +@@PatchLoop: + mov PlaneWidth[si], bx + shr al, 1 + adc bx, 0 + dec si + dec si + jge @@PatchLoop + +; Get pixel addresses + mov ax, [mx_VideoSegment] + mov ds, ax + mov es, ax + mov ax, [SY] + mul [mx_BytesPerLine] + mov si, [SX] + shr si, 1 + shr si, 1 + add si, ax ; DS:SI points to source + mov [SourceOffset], si + mov ax, [DestY] + mul [mx_BytesPerLine] + mov di, [DestX] + shr di, 1 + shr di, 1 + add di, ax ; ES:DI points to destination + mov [DestOffset], di + +; Adjust plane for output to VGA registers + mov ax, [SX] + and al, 03h + mov [ReadPlane], al + mov cx, [DestX] + and cl, 03h + mov al, 00010001b + shl al, cl + mov [WritePlane], al + +; Ready to move now + cld + mov [Count], 4 ; Four planes + lea bx, PlaneWidth ; SS:[BX] = width in bytes for plane +@@PlaneLoop: + cmp WORD PTR ss:[bx], 0 + je @@Done + mov ah, [WritePlane] + and ah, 0Fh + mov al, 02h + mov dx, TS + out dx, ax ; Select write plane + mov ah, [ReadPlane] + mov al, 04h + mov dx, GDC + out dx, ax ; Select read plane + mov dx, [Height] + mov ax, [mx_BytesPerLine] + sub ax, ss:[bx] ; AX = extra bytes per line +@@Loop: + mov cx, ss:[bx] + shr cx, 1 + rep movsw + rcl cx, 1 + rep movsb + add si, ax + add di, ax + dec dx + jnz @@Loop ; Repeat for all lines + inc bx + inc bx ; Select width for next plane + inc [ReadPlane] + and [ReadPlane], 03h ; Should be faster on 386 using + jnz @@ReadPlaneOk ; BTR and ADC... + inc [SourceOffset] +@@ReadPlaneOk: + rol [WritePlane], 1 + adc [DestOffset], 0 + mov si, [SourceOffset] + mov di, [DestOffset] + dec [Count] + jnz @@PlaneLoop ; Repeat for all planes + +@@Done: + ret +subPlaneBlt ENDP + +mxBitBlt ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxcc.asm b/16/x/mxcc.asm new file mode 100755 index 00000000..4f78adb9 --- /dev/null +++ b/16/x/mxcc.asm @@ -0,0 +1,644 @@ +;----------------------------------------------------------- +; +; MXCC.ASM - Fast clip line function +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC xsubClipLine + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD +EXTRN mx_VideoSegment : WORD + +EXTRN mx_ClipX1 : WORD +EXTRN mx_ClipY1 : WORD +EXTRN mx_ClipX2 : WORD +EXTRN mx_ClipY2 : WORD + +tblGroups LABEL WORD + DW 10, tbl00 + DW 10, tbl10 + DW 9, tbl20 + DW -1, 0 + DW 10, tbl40 + DW 10, tbl50 + DW 9, tbl60 + DW -1, 0 + DW 6, tbl80 + DW 6, tbl90 + DW 5, tblA0 + DW -1, 0 + DW -1, 0 + DW -1, 0 + DW -1, 0 + DW -1, 0 +tbl00 DW cc00, cc01, cc02, ccFF, cc04, cc05, cc06, ccFF, cc08, cc09, cc0A +tbl10 DW cc10, ccFF, cc12, ccFF, cc14, ccFF, cc16, ccFF, cc18, ccFF, cc1A +tbl20 DW cc20, cc21, ccFF, ccFF, cc24, cc25, ccFF, ccFF, cc28, cc29 +tbl40 DW cc40, cc41, cc42, ccFF, ccFF, ccFF, ccFF, ccFF, cc48, cc49, cc4A +tbl50 DW cc50, ccFF, cc52, ccFF, ccFF, ccFF, ccFF, ccFF, cc58, ccFF, cc5A +tbl60 DW cc60, cc61, ccFF, ccFF, ccFF, ccFF, ccFF, ccFF, cc68, cc69 +tbl80 DW cc80, cc81, cc82, ccFF, cc84, cc85, cc86 +tbl90 DW cc90, ccFF, cc92, ccFF, cc94, ccFF, cc96 +tblA0 DW ccA0, ccA1, ccFF, ccFF, ccA4, ccA5 + +ccTT: clc + ret +ccFF: stc + ret + +; Group 00 ------------------------------------------------- +; +cc00: + clc + ret +cc01: + jmp ClipQLeft +cc02: + jmp ClipQRight +cc04: + jmp ClipQTop +cc05: + call ClipQLeft + cmp si, [mx_ClipY1] + jge ccTT + jmp ClipQTop +cc06: + call ClipQRight + cmp si, [mx_ClipY1] + jge ccTT + jmp ClipQTop +cc08: + jmp ClipQBottom +cc09: + call ClipQLeft + cmp si, [mx_ClipY2] + jle ccTT + jmp ClipQBottom +cc0A: + call ClipQRight + cmp si, [mx_ClipY2] + jle ccTT + jmp ClipQBottom + +; Group 10 ------------------------------------------------- +; +cc10FF: + stc + ret +cc10TT: + clc + ret +cc10: + jmp ClipPLeft +cc12: + call ClipPLeft + jmp ClipQRight +cc14: + call ClipPLeft + cmp bx, [mx_ClipY1] + jl cc10FF + jmp ClipQTop +cc16: + call ClipPLeft + cmp bx, [mx_ClipY1] + jl cc10FF + call ClipQTop + cmp cx, [mx_ClipX2] + jle cc10TT + jmp ClipQRight +cc18: + call ClipPLeft + cmp bx, [mx_ClipY2] + jg cc10FF + jmp ClipQBottom +cc1A: + call ClipPLeft + cmp bx, [mx_ClipY2] + jg cc10FF + call ClipQBottom + cmp cx, [mx_ClipX2] + jle cc10TT + jmp ClipQRight + +; Group 20 ------------------------------------------------- +; +cc20TT: + clc + ret +cc20FF: + stc + ret +cc20: + jmp ClipPRight +cc21: + call ClipPRight + jmp ClipQLeft +cc24: + call ClipPRight + cmp bx, [mx_ClipY1] + jl cc20FF + jmp ClipQTop +cc25: + call ClipPRight + cmp bx, [mx_ClipY1] + jl cc20FF + call ClipQTop + cmp cx, [mx_ClipX1] + jge cc20TT + jmp ClipQLeft +cc28: + call ClipPRight + cmp bx, [mx_ClipY2] + jg cc20FF + jmp ClipQBottom +cc29: + call ClipPRight + cmp bx, [mx_ClipY2] + jg cc20FF + call ClipQBottom + cmp cx, [mx_ClipX1] + jge cc20TT + jmp ClipQLeft + +; Group 40 ------------------------------------------------- +; +cc40TT: + clc + ret +cc40FF: + stc + ret +cc40: + jmp ClipPTop +cc41: + call ClipPTop + cmp di, [mx_ClipX1] + jl cc40FF + call ClipQLeft + cmp si, [mx_ClipY1] + jge cc40TT + jmp ClipQTop +cc42: + call ClipPTop + cmp di, [mx_ClipX2] + jg cc40FF + jmp ClipQRight +cc48: + call ClipPTop + jmp ClipQBottom +cc49: + call ClipPTop + cmp di, [mx_ClipX1] + jl cc40FF + call ClipQLeft + cmp si, [mx_ClipY2] + jle cc40TT + jmp ClipQBottom +cc4A: + call ClipPTop + cmp di, [mx_ClipX2] + jg cc40FF + call ClipQRight + cmp si, [mx_ClipY2] + jle cc40TT + jmp ClipQBottom + + +; Group 50 ------------------------------------------------- +; +cc50TT: + clc + ret +cc50FF: + stc + ret +cc50: + call ClipPLeft + cmp bx, [mx_ClipY1] + jge cc50TT + jmp ClipPTop +cc52: + call ClipQRight + cmp si, [mx_ClipY1] + jl cc50FF + call ClipPTop + cmp di, [mx_ClipX1] + jge cc50TT + jmp ClipPLeft +cc58: + call ClipQBottom + cmp cx, [mx_ClipX1] + jl cc50FF + call ClipPTop + cmp di, [mx_ClipX1] + jge cc50TT + jmp ClipPLeft +cc5A: + call ClipPLeft + cmp bx, [mx_ClipY2] + jg cc50FF + call ClipQRight + cmp bx, [mx_ClipY1] + jl cc50FF + cmp si, [mx_ClipY2] + jle cc50TT + jmp ClipQBottom + +; Group 60 ------------------------------------------------- +; +cc60TT: + clc + ret +cc60FF: + stc + ret +cc60: + call ClipPRight + cmp bx, [mx_ClipY1] + jge cc60TT + jmp ClipPTop +cc61: + call ClipQLeft + cmp si, [mx_ClipY2] + jl cc60FF + call ClipPTop + cmp di, [mx_ClipX2] + jle cc60TT + jmp ClipPRight +cc68: + call ClipQBottom + cmp cx, [mx_ClipX2] + jg cc60FF + call ClipPRight + cmp bx, [mx_ClipY1] + jge cc60TT + jmp ClipPTop +cc69: + call ClipQLeft + cmp si, [mx_ClipY1] + jl cc60FF + call ClipPRight + cmp bx, [mx_ClipY2] + jg cc60FF + cmp si, [mx_ClipY2] + jle cc69_1 + call ClipQBottom +cc69_1: + cmp bx, [mx_ClipY1] + jge cc60TT + jmp ClipPTop + +; Group 80 ------------------------------------------------- +; +cc80TT: + clc + ret +cc80FF: + stc + ret +cc80: + jmp ClipPBottom +cc81: + call ClipPBottom + cmp di, [mx_ClipX1] + jl cc80FF + jmp ClipQLeft +cc82: + call ClipPBottom + cmp di, [mx_ClipX2] + jg cc80FF + jmp ClipQRight +cc84: + call ClipPBottom + jmp ClipQTop +cc85: + call ClipPBottom + cmp di, [mx_ClipX1] + jl cc80FF + call ClipQLeft + cmp si, [mx_ClipY1] + jge cc80FF + jmp ClipQTop +cc86: + call ClipPBottom + cmp di, [mx_ClipX2] + jg cc80FF + call ClipQRight + cmp si, [mx_ClipY1] + jge cc80TT + jmp ClipQTop + +; Group 90 ------------------------------------------------- +; +cc90TT: + clc + ret +cc90FF: + stc + ret +cc90: + call ClipPLeft + cmp bx, [mx_ClipY2] + jle cc90TT + jmp ClipPBottom +cc92: + call ClipQRight + cmp si, [mx_ClipY2] + jg cc90FF + call ClipPBottom + cmp di, [mx_ClipX1] + jge cc90TT + jmp ClipPLeft +cc94: + call ClipQTop + cmp cx, [mx_ClipX1] + jl cc90FF + call ClipPLeft + cmp bx, [mx_ClipY2] + jle cc90TT + jmp ClipPBottom +cc96: + call ClipPLeft + cmp bx, [mx_ClipY1] + jl cc90FF + call ClipQRight + cmp si, [mx_ClipY2] + jg cc90FF + cmp bx, [mx_ClipY2] + jle cc96_1 + call ClipPBottom +cc96_1: + cmp si, [mx_ClipY1] + jge cc90TT + jmp ClipQTop + +; Group A0 ------------------------------------------------- +; +ccA0TT: + clc + ret +ccA0FF: + stc + ret +ccA0: + call ClipPRight + cmp bx, [mx_ClipY2] + jle ccA0TT + jmp ClipPBottom +ccA1: + call ClipQLeft + cmp si, [mx_ClipY2] + jg ccA0FF + call ClipPBottom + cmp di, [mx_ClipX2] + jle ccA0TT + jmp ClipPRight +ccA4: + call ClipQTop + cmp cx, [mx_ClipX2] + jg ccA0FF + call ClipPRight + cmp bx, [mx_ClipY2] + jle ccA0TT + jmp ClipPBottom +ccA5: + call ClipQLeft + cmp si, [mx_ClipY2] + jg ccA0FF + call ClipPRight + cmp bx, [mx_ClipY1] + jl ccA0FF + cmp si, [mx_ClipY1] + jge ccA5_1 + call ClipQTop +ccA5_1: + cmp bx, [mx_ClipY2] + jle ccA0TT + jmp ClipPBottom + +; Y1 = (Y2-Y1)*(mx_ClipX1-X1)/(X2-X1)+Y1 = (SI-BX)*(mx_ClipX1-DI)/(CX-DI)+BX +; X1 = mx_ClipX1 +ClipPLeft: + mov ax, si + sub ax, bx + mov dx, [mx_ClipX1] + sub dx, di + imul dx + mov bp, cx + sub bp, di + idiv bp + add bx, ax + mov di, [mx_ClipX1] + clc + ret + +; Y1 = (Y2-Y1)*(mx_ClipX2-X1)/(X2-X1)+Y1 = (SI-BX)*(mx_ClipX2-DI)/(CX-DI)+BX +; X1 = mx_ClipX2 +ClipPRight: + mov ax, si + sub ax, bx + mov dx, [mx_ClipX2] + sub dx, di + imul dx + mov bp, cx + sub bp, di + idiv bp + add bx, ax + mov di, [mx_ClipX2] + clc + ret + +; X1 = (X2-X1)*(mx_ClipY2-Y1)/(Y2-Y1)+X1 = (CX-DI)*(mx_ClipY2-BX)/(SI-BX)+DI +; Y1 = mx_ClipY2 +ClipPBottom: + mov ax, cx + sub ax, di + mov dx, [mx_ClipY2] + sub dx, bx + imul dx + mov bp, si + sub bp, bx + idiv bp + add di, ax + mov bx, [mx_ClipY2] + clc + ret + +; X1 = (X2-X1)*(mx_ClipY1-Y1)/(Y2-Y1)+X1 = (CX-DI)*(mx_ClipY1-BX)/(SI-BX)+DI +; Y1 = mx_ClipY1 +ClipPTop: + mov ax, cx + sub ax, di + mov dx, [mx_ClipY1] + sub dx, bx + imul dx + mov bp, si + sub bp, bx + idiv bp + add di, ax + mov bx, [mx_ClipY1] + clc + ret + +; Y2 = (Y1-Y2)*(mx_ClipX1-X2)/(X1-X2)+Y2 = (BX-SI)*(mx_ClipX1-CX)/(DI-CX)+SI +; X2 = mx_ClipX1 +ClipQLeft: + mov ax, bx + sub ax, si + mov dx, [mx_ClipX1] + sub dx, cx + imul dx + mov bp, di + sub bp, cx + idiv bp + add si, ax + mov cx, [mx_ClipX1] + clc + ret + +; Y2 = (Y1-Y2)*(mx_ClipX2-X2)/(X1-X2)+Y2 = (BX-SI)*(mx_ClipX2-CX)/(DI-CX)+SI +; X2 = mx_ClipX1 +ClipQRight: + mov ax, bx + sub ax, si + mov dx, [mx_ClipX2] + sub dx, cx + imul dx + mov bp, di + sub bp, cx + idiv bp + add si, ax + mov cx, [mx_ClipX2] + clc + ret + +; X2 = (X1-X2)*(mx_ClipY2-Y2)/(Y1-Y2)+X2 = (DI-CX)*(mx_ClipY2-SI)/(BX-SI)+CX +; Y2 = mx_ClipY1 +ClipQBottom: + mov ax, di + sub ax, cx + mov dx, [mx_ClipY2] + sub dx, si + imul dx + mov bp, bx + sub bp, si + idiv bp + add cx, ax + mov si, [mx_ClipY2] + clc + ret + +; X2 = (X1-X2)*(mx_ClipY1-Y2)/(Y1-Y2)+X2 = (DI-CX)*(mx_ClipY1-SI)/(BX-SI)+CX +; Y2 = mx_ClipY1 +ClipQTop: + mov ax, di + sub ax, cx + mov dx, [mx_ClipY1] + sub dx, si + imul dx + mov bp, bx + sub bp, si + idiv bp + add cx, ax + mov si, [mx_ClipY1] + clc + ret + +;----------------------------------------------------------- +; +; Checks the coordinates of a line against the active +; clip region. +; Uses the Sobkow-Pospisil-Yang (SPY) algorithm: this was +; supposed to be twice as fast as Cohen-Sutherland, but my +; tests show only a very small increase in speed and a noticeable +; increase of the program size! Maybe this is caused by the +; slow speed of VGA cards, so probably a better test should +; be performed with lines drawn in RAM. +; +; Input: +; AX, BX = X1, Y1 +; CX, DX = X2, Y2 +; Output: +; CF = set if line is full clipped +; AX, BX = clipped X1, Y1 +; CX, DX = clipped X2, Y2 +; Note: +; destroys SI, DI +; +xsubClipLine PROC NEAR + push bp + xor si, si ; SPY code + + cmp dx, [mx_ClipY2] + jle @@1 + or si, 08h + jmp @@2 +@@1: + cmp dx, [mx_ClipY1] + jge @@2 + or si, 04h +@@2: + + cmp cx, [mx_ClipX2] + jle @@3 + or si, 02h + jmp @@4 +@@3: + cmp cx, [mx_ClipX1] + jge @@4 + or si, 01h +@@4: + + cmp bx, [mx_ClipY2] + jle @@5 + or si, 80h + jmp @@6 +@@5: + cmp bx, [mx_ClipY1] + jge @@6 + or si, 40h +@@6: + + cmp ax, [mx_ClipX2] + jle @@7 + or si, 20h + jmp @@8 +@@7: + cmp ax, [mx_ClipX1] + jge @@8 + or si, 10h +@@8: + + mov di, si + and di, 000Fh ; Index of procedure + and si, 00F0h + .shr si, 2 ; Index of group (times 4) + cmp di, cs:tblGroups[si] ; Is index within range? + jg @@Exit ; No, line is full clipped + mov si, cs:tblGroups[si+2] ; Get offset of group table + shl di, 1 ; We must index word elements + add si, di ; Make full offset + mov di, ax ; Move X1 to DI and free AX + mov si, cs:[si] ; Get subroutine address + xchg dx, si ; Move Y2 to SI and free DX + call dx ; Call the proper subroutine + mov ax, di ; Restore AX to X1 + mov dx, si ; Restore DX to Y2 + pop bp + ret + +@@Exit: + pop bp + stc + ret +xsubClipLine ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxcg.asm b/16/x/mxcg.asm new file mode 100755 index 00000000..42163d7a --- /dev/null +++ b/16/x/mxcg.asm @@ -0,0 +1,69 @@ +;----------------------------------------------------------- +; +; MXCG.ASM - Color to gray conversion +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxColorToGray + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Converts RGB colors to gray shades. +; +; Input: +; CPal = pointer to color palette +; GPal = pointer to destination (gray) palette +; Count = number of colors to convert +; Output: +; none +; +; Note: CPal and GPal may point to the same buffer. +; +mxColorToGray PROC FAR + ARG Count:WORD, \ + DPal:DWORD, \ + SPal:DWORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds, si, es, di + + mov cx, [Count] + jcxz @@Exit + lds si, [SPal] + les di, [DPal] + cld +; We use the standard formula +; gray=(red*30 + green*59 + blue*11)/100 +; in the equivalent form +; gray=(red*77 + green*151 + blue*28)/256 +; which doesn't need the last divide. + mov bx, 77 SHL 8 + 151 +@@Loop: + lodsb ; Red + mul bh + mov dx, ax + lodsb ; Green + mul bl + add dx, ax + lodsb ; Blue + mov ah, 28 + mul ah + add ax, dx + mov al, ah + stosw ; Save new RGB + stosb + loop @@Loop + +@@Exit: + .pop ds, si, es, di + .leave ARG_SIZE +mxColorToGray ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxcl.asm b/16/x/mxcl.asm new file mode 100755 index 00000000..aaa0bac3 --- /dev/null +++ b/16/x/mxcl.asm @@ -0,0 +1,151 @@ +;----------------------------------------------------------- +; +; MXCL.ASM - Bresenham circle +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxCircle + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD +EXTRN mx_VideoSegment : WORD +EXTRN mx_ClipX1 : WORD +EXTRN mx_ClipY1 : WORD +EXTRN mx_ClipX2 : WORD +EXTRN mx_ClipY2 : WORD + +;----------------------------------------------------------- +; +; Draws a circle using the Bresenham algorithm. +; +; Input: +; XC, YC = center coordinates +; Radius = circle radius +; Color = circle color +; Output: +; none +; Note: +; computes only points in the first octant, all other +; points are obtained by symmetry. +; +mxCircle PROC FAR + ARG Color:BYTE:2, \ + Radius:WORD, \ + YC:WORD, \ + XC:WORD = ARG_SIZE + LOCAL Delta:WORD = AUTO_SIZE + .enter AUTO_SIZE + .push ds, si, di + + xor si, si ; X + mov di, [Radius] ; Y + mov ax, 3 + sub ax, di + sub ax, di + mov [Delta], ax ; Delta = 3-R*2 + + mov ds, [mx_VideoSegment] + +@@Loop: + cmp si, di ; + jg @@Done ; Exit when X > Y +; Draw points + mov ax, si + mov bx, di + call @@subPutPixel + mov ax, si + neg ax + mov bx, di + call @@subPutPixel + mov ax, si + mov bx, di + neg bx + call @@subPutPixel + mov ax, si + neg ax + mov bx, di + neg bx + call @@subPutPixel + mov ax, di + mov bx, si + call @@subPutPixel + mov ax, di + neg ax + mov bx, si + call @@subPutPixel + mov ax, di + mov bx, si + neg bx + call @@subPutPixel + mov ax, di + neg ax + mov bx, si + neg bx + call @@subPutPixel +; Moves coordinates to next point + mov ax, [Delta] + test ax, ax + jl @@Next + mov ax, di + .shl ax, 2 + sub ax, 4 + sub [Delta], ax + dec di +@@Next: + mov ax, si + .shl ax, 2 + add ax, 6 + add [Delta], ax + inc si + jmp @@Loop + +@@Done: + xor ax, ax + .pop ds, si, di + .leave ARG_SIZE + +;--------------------------------------- +; Put pixel function. +; Input: +; BX = X coordinate (relative to center) +; AX = Y coordinate (relative to center) +; DS = video segment +@@subPutPixel: + add bx, [XC] ; Get absolute coordinates + add ax, [YC] + + cmp bx, [mx_ClipX1] ; Clip pixel + jl @@subExit + cmp bx, [mx_ClipX2] + jg @@subExit + cmp ax, [mx_ClipY1] + jl @@subExit + cmp ax, [mx_ClipY2] + jg @@subExit + + mul [mx_BytesPerLine] ; Get pixel offset + mov cx, bx ; Save X coordinate + .shr bx, 2 + add bx, ax ; DS:BX = pixel offset + + and cl, 3 ; Set write plane + mov ax, 0102h + shl ah, cl + mov dx, TS + out dx, ax + + mov al, [Color] ; Write pixel + mov ds:[bx], al + +@@subExit: + retn +mxCircle ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxcr.asm b/16/x/mxcr.asm new file mode 100755 index 00000000..ca1fa7bb --- /dev/null +++ b/16/x/mxcr.asm @@ -0,0 +1,380 @@ +;----------------------------------------------------------- +; +; MXCR.ASM - Clip functions +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxSetSysClipRegion +PUBLIC mxGetClipRegion +PUBLIC mxSetClipRegion +PUBLIC mxSetClip +PUBLIC mxGetClip + +PUBLIC subClipBox +PUBLIC subClipImage + +PUBLIC mx_ClipX1 +PUBLIC mx_ClipY1 +PUBLIC mx_ClipX2 +PUBLIC mx_ClipY2 + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_CodeSegment : WORD + +mx_ClipX1 DW ? ; Clip coordinates +mx_ClipY1 DW ? +mx_ClipX2 DW ? +mx_ClipY2 DW ? + +mx_SysClipX1 DW ? ; System clip coordinates +mx_SysClipY1 DW ? ; (active when mx_ClipStatus is FALSE) +mx_SysClipX2 DW ? +mx_SysClipY2 DW ? + +mx_UserClipX1 DW ? ; User clip coordinates +mx_UserClipY1 DW ? ; (active when mx_ClipStatus is TRUE) +mx_UserClipX2 DW ? +mx_UserClipY2 DW ? + +mx_ClipStatus DB ? + +;----------------------------------------------------------- +; +; Toggles clipping between user and system regions. +; +; Input: +; ClipStatus = TRUE (FALSE) to enable (disable) clipping +; Output: +; AX = old clip status +; +mxSetClip PROC FAR + ARG ClipStatus:BYTE:2 = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov ax, [mx_UserClipX1] + mov bx, [mx_UserClipY1] + mov cx, [mx_UserClipX2] + mov dx, [mx_UserClipY2] + cmp [ClipStatus], TRUE + je @@Done + mov ax, [mx_SysClipX1] + mov bx, [mx_SysClipY1] + mov cx, [mx_SysClipX2] + mov dx, [mx_SysClipY2] +@@Done: + mov [mx_ClipX1], ax + mov [mx_ClipY1], bx + mov [mx_ClipX2], cx + mov [mx_ClipY2], dx + + mov al, [ClipStatus] + xchg al, [mx_ClipStatus] + xor ah, ah + + .pop ds + .leave ARG_SIZE +mxSetClip ENDP + +;----------------------------------------------------------- +; +; Returns the current clipping status. +; +; Input: +; none +; Output: +; TRUE (FALSE) if clipping enabled (disabled) +; +mxGetClip PROC FAR + ASSUME ds:NOTHING + mov al, [mx_ClipStatus] + xor ah, ah + ret +mxGetClip ENDP + +;----------------------------------------------------------- +; +; Sets the system clip region and disables user clipping. +; +; Input: +; Width = width in pixels of clip region +; Height = height in pixels of clip region +; Output: +; old clip status. +; +mxSetSysClipRegion PROC FAR + ARG Height:WORD, \ + Width:WORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + xor ax, ax ; Sys clip region always starts at (0,0) + mov [mx_SysClipX1], ax + mov [mx_SysClipY1], ax + mov ax, [Width] + dec ax + mov [mx_SysClipX2], ax + mov ax, [Height] + dec ax + mov [mx_SysClipY2], ax + + IF USE286 EQ TRUE + push FALSE + ELSE + mov ax, FALSE + push ax + ENDIF + call mxSetClip + + .pop ds + .leave ARG_SIZE +mxSetSysClipRegion ENDP + +;----------------------------------------------------------- +; +; Sets the clip region. +; +; Input: +; X, Y = coordinates of top left corner of clip region +; Width = width in pixels of clip region +; Height = height in pixels of clip region +; Output: +; none (no checking on parameters) +; +mxSetClipRegion PROC FAR + ARG Height:WORD, \ + Width:WORD, \ + Y:WORD, \ + X:WORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov ax, [X] + mov [mx_UserClipX1], ax + mov ax, [Y] + mov [mx_UserClipY1], ax + mov ax, [Width] + add ax, [X] + dec ax + mov [mx_UserClipX2], ax + mov ax, [Height] + add ax, [Y] + dec ax + mov [mx_UserClipY2], ax + + mov al, [mx_ClipStatus] + cmp al, TRUE + jne @@Exit + push ax + call mxSetClip + +@@Exit: + xor ax, ax + .pop ds + .leave ARG_SIZE +mxSetClipRegion ENDP + +;----------------------------------------------------------- +; +; Returns the current user clip region. +; +; Input: +; X, Y = pointers to integer coordinates of top left corner +; Width = pointer to word width of clip region +; Height = pointer to word height of clip region +; Output: +; AX = current clip status +; +mxGetClipRegion PROC FAR + ARG Height:DWORD, \ + Width:DWORD, \ + Y:DWORD, \ + X:DWORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push es, di + + mov ax, [mx_UserClipX1] + les di, [X] + mov es:[di], ax + mov ax, [mx_UserClipY1] + les di, [Y] + mov es:[di], ax + + mov ax, [mx_UserClipX2] + sub ax, [mx_UserClipX1] + inc ax + les di, [Width] + mov es:[di], ax + mov ax, [mx_UserClipY2] + sub ax, [mx_UserClipY1] + inc ax + les di, [Height] + mov es:[di], ax + + mov al, [mx_ClipStatus] + xor ah, ah + .pop es, di + .leave ARG_SIZE +mxGetClipRegion ENDP + +;----------------------------------------------------------- +; +; Internal use: checks the coordinates of a rectangle against +; the active clip region. +; This function assumes that a "raw" image has to be clipped, +; so it returns in SI the number of "raw" bytes to skip if +; X, Y were clipped. +; +; Input: +; BX, AX = X, Y coordinates of rectangle (signed) +; CX = box width +; DX = box height +; Output: +; CF = set if rectangle is full clipped +; BX, AX = new X, Y coordinates of rectangle +; CX, DX = clipped width and height +; SI = number of bytes to skip before copying a buffer +; DI destroyed +; +subClipImage PROC NEAR + ASSUME ds:NOTHING + xor si, si + +; Check clip height + mov di, [mx_ClipY1] + cmp ax, di + jge @@CheckBottom + sub di, ax ; Number of lines to clip + sub dx, di ; New box height + jle @@Exit + mov ax, di + mov di, dx ; Save box height into DI + mul cx ; DX:AX = number of bytes to skip + mov si, ax + mov dx, di ; Restore box height + mov ax, [mx_ClipY1] +@@CheckBottom: + mov di, [mx_ClipY2] + cmp ax, di + jg @@Exit + inc di + sub di, dx + sub di, ax + jge @@DoneHeight ; None, continue + add dx, di ; Clip lines +@@DoneHeight: + +; Check clip width +@@CheckLeft: + mov di, [mx_ClipX1] + cmp bx, di + jge @@CheckRight + sub di, bx ; Number of columns to clip left + sub cx, di + jle @@Exit + add si, di ; Update skip count + mov bx, [mx_ClipX1] +@@CheckRight: + mov di, [mx_ClipX2] + cmp bx, di + jg @@Exit + inc di + sub di, bx + sub di, cx + jge @@DoneWidth ; None, exit + add cx, di ; New box width +@@DoneWidth: + +; Set return flag and exit +@@Done: + clc + ret +@@Exit: + stc + ret +subClipImage ENDP + +;----------------------------------------------------------- +; +; Internal use: checks the coordinates of a rectangle against +; the active clip region. +; +; Input: +; BX, AX = X, Y coordinates of rectangle (signed) +; CX = box width +; DX = box height +; Output: +; CF = set if rectangle is full clipped +; BX, AX = new X, Y coordinates of rectangle +; CX, DX = clipped width and height +; DI destroyed +; +subClipBox PROC NEAR + ASSUME ds:NOTHING + +; Check clip height + mov di, [mx_ClipY1] + cmp ax, di + jge @@CheckBottom + sub di, ax ; Number of lines to clip + sub dx, di ; New box height + jle @@Exit + mov ax, [mx_ClipY1] +@@CheckBottom: + mov di, [mx_ClipY2] + cmp ax, di + jg @@Exit + inc di + sub di, dx + sub di, ax ; Clipped some point? + jge @@DoneHeight ; No, continue + add dx, di ; Clip lines (DI is negative) +@@DoneHeight: + +; Check clip width +@@CheckLeft: + mov di, [mx_ClipX1] + cmp bx, di + jge @@CheckRight + sub di, bx ; Number of columns to clip left + sub cx, di + jle @@Exit + mov bx, [mx_ClipX1] +@@CheckRight: + mov di, [mx_ClipX2] + cmp bx, di + jg @@Exit + inc di + sub di, bx + sub di, cx ; Clipped some point? + jge @@DoneWidth ; No, exit + add cx, di ; New box width (DI is negative) +@@DoneWidth: + +; Set return flag and exit +@@Done: + clc + ret +@@Exit: + stc + ret +subClipBox ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxel.asm b/16/x/mxel.asm new file mode 100755 index 00000000..2c9dda2a --- /dev/null +++ b/16/x/mxel.asm @@ -0,0 +1,167 @@ +;----------------------------------------------------------- +; +; MXEL.ASM - Mid-point ellipse +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxEllipse + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD +EXTRN mx_VideoSegment : WORD +EXTRN mx_ClipX1 : WORD +EXTRN mx_ClipY1 : WORD +EXTRN mx_ClipX2 : WORD +EXTRN mx_ClipY2 : WORD + +;----------------------------------------------------------- +; +; Draws an ellipse using the mid-point algorithm. +; +; Input: +; XC, YC = center coordinates +; A = horizontal radius +; B = vertical radius +; Color = ellipse color +; Output: +; none +; Note: +; computes only points in the first quadrant, all other +; points are obtained by symmetry. +; +mxEllipse PROC FAR + ARG Color:BYTE:2, \ + B:WORD, \ + A:WORD, \ + YC:WORD, \ + XC:WORD = ARG_SIZE + LOCAL A2:DWORD, \ + B2:DWORD, \ + CC:DWORD, \ + DD:DWORD, \ + X:DWORD, \ + Y:DWORD = AUTO_SIZE + .enter AUTO_SIZE + .push ds, si, di + + .chk386 mxEllipse, @@Exit + +; Initialize variables + xor eax, eax + mov [X], ax ; X = 0 + mov ax, [A] + mul eax ; EAX = A*A + mov [DD], eax ; DD = A*A + shl eax, 1 + mov [CC], eax ; CC = 2*A*A + shl eax, 1 + mov [A2], eax ; A2 = 4*A*A + movzx edx, [B] + mov [Y], edx + mul edx ; EAX = 4*A*A*B + sub [DD], eax ; DD = A*A - 4*A*A*B + movzx eax, [B] + mul eax ; EAX = B*B + shl eax, 2 ; EAX = 4*B*B + mov [B2], eax ; B2 = 4*B*B + add [CC], eax ; CC = 2*A*A + 4*B*B + add [D1], eax ; DD = A*A - 4*A*A*B + 4*B*B + +; Draw initial points + call subPlot4 + +; First loop +@@Loop1: + mov eax, [X] ; Check slope + mul [B2] + mov ecx, eax + mov eax, [Y] + mul [A2] + sub eax, ecx + sub eax, [CC] ; EAX = Y*A2 - X*B2 - CC + jle @@Done1 ; Crossed critical point, jump to next loop + + mov ecx, [DD] ; Get error + test ecx, ecx ; Positive? + jl @@Draw1 ; No, use default step + + mov eax, 1 + sub eax, [Y] + mul [A2] + shl eax, 1 + add ecx, eax ; Bump error + dec WORD PTR [Y] ; Decrement Y coordinate + +@@Draw1: + mov eax, [X] + shl eax, 1 + add eax, 3 + mul [B2] + add ecx, eax ; Bump error + mov [DD], ecx ; Save error + inc WORD PTR [X] ; Increment X coordinate + + call subPlot4 ; Draw points + jmp @@Loop1 +@@Done1: + +; Initialize variables + shr [B2], 2 + mov eax, [X] + mul eax + add [X] + shl eax, 2 + inc eax + mul [B2] + mov [DD], eax + mov eax, [Y] + mul eax + add [Y] + dec eax + add [Y] + sub eax, [B2] + add [DD], eax + shl [B2], 3 + inc WORD PTR [X] + +; Second loop +@@Loop2: + cmp WORD PTR [Y], 0 + ja @@Done2 + + mov ecx, [DD] + test ecx, ecx + jge @@Draw2 + + mov eax, [X] + inc eax + mul [B2] + add ecx, eax + inc WORD PTR [X] + +@@Draw2: + mov eax, [Y] + shl eax, 1 + sub eax, 3 + neg eax + imul [A2] + add ecx, eax + dec WORD PTR [Y] + + call subPlot4 + jmp @@Loop2 +@@Done2: + +@@Exit: + xor ax, ax + .leave ARG_SIZE +mxEllipse ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxfb.asm b/16/x/mxfb.asm new file mode 100755 index 00000000..41ea5deb --- /dev/null +++ b/16/x/mxfb.asm @@ -0,0 +1,194 @@ +;----------------------------------------------------------- +; +; MXFB.ASM - Fill box function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxFillBox + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD +EXTRN mx_VideoSegment : WORD +EXTRN subClipBox : NEAR +EXTRN subHorizontalLineInfo : NEAR + +;----------------------------------------------------------- +; +; Raster op functions. Raster op is limited to OP_MOVE, +; OP_AND, OP_OR and OP_XOR. The VGA hardware is used to +; perform the selected logical functions on up to four +; pixel at a time. +; +subRepFill PROC NEAR + mov ah, al + shr cx, 1 + rep stosw + rcl cx, 1 + rep stosb + ret +subRepFill ENDP +; +subFill PROC NEAR +@@Loop: + mov ds:[bx], al + add bx, dx + loop @@Loop + ret +subFill ENDP +; +subRepMove PROC NEAR + mov si, di +@@Loop: + mov ah, ds:[si] ; Dummy read to latch the data + mov ds:[si], al + inc si + loop @@Loop + ret +subRepMove ENDP +; +subMove PROC NEAR +@@Loop: + mov ah, ds:[bx] ; Dummy read to latch the data + mov ds:[bx], al + add bx, dx + loop @@Loop + ret +subMove ENDP + +;----------------------------------------------------------- +; +; Fills a rectangle with a specified color. +; +; Input: +; X, Y = X, Y coordinates of rectangle +; Width = width of rectangle +; Height = height of rectangle +; Color = fill color +; Op = raster operator +; Output: +; none +; +; Note: raster op is limited to OP_MOVE, OP_AND, OP_OR and OP_XOR. +; +mxFillBox PROC FAR + ARG Op:WORD, \ + Color:BYTE:2, \ + Height:WORD, \ + Width:WORD, \ + Y:WORD, \ + X:WORD = ARG_SIZE + LOCAL LeftMask:BYTE, \ + RightMask:BYTE, \ + FillFunction:WORD, \ + RepFillFunction:WORD = AUTO_SIZE + .enter AUTO_SIZE + .push ds, si, es, di + ASSUME ds:NOTHING + +; Clip rectangle + mov bx, [X] + mov ax, [Y] + mov cx, [Width] + mov dx, [Height] + call subClipBox + jc @@Exit ; Full clipped + + mov [Height], dx ; Save clipped height + call subHorizontalLineInfo ; Get additional info, init DI + mov [Width], cx + mov [LeftMask], al + mov [RightMask], ah + +; Initialize segments + mov ax, [mx_VideoSegment] + mov es, ax ; ES:DI points to pixel + mov ds, ax + cld ; Clear direction flag + +; Select fill functions + mov [FillFunction], OFFSET subFill + mov [RepFillFunction], OFFSET subRepFill + mov ax, [Op] ; Get raster op + cmp al, OP_XOR + ja @@1 ; Assume it's a fill + cmp al, OP_MOVE + je @@1 + .shl al, 3 + mov ah, al + mov al, 03h + mov dx, GDC + out dx, ax ; Set GDC logical function + mov [FillFunction], OFFSET subMove + mov [RepFillFunction], OFFSET subRepMove +@@1: + +; Fill left block +@@L0: + mov ah, [LeftMask] + or ah, ah + jz @@C0 ; Nothing to do, go to center block + mov dx, TS + mov al, 02h + out dx, ax ; Set write plane mask + mov dx, [mx_BytesPerLine] + mov cx, [Height] + mov bx, di + mov al, [Color] + call [FillFunction] ; Fill this column + inc di ; Update starting video offset + +; Fill center block +@@C0: + mov cx, [Width] + jcxz @@R0 ; Nothing to do, go to right block + mov dx, TS + mov ax, 0F02h + out dx, ax ; Write to all planes + mov al, [Color] + mov bx, di + mov dx, [Height] + push di ; Save pixel address +@@C1: + mov di, bx ; Update video offset + call [RepFillFunction] ; Fill current scan line + mov cx, [Width] ; Restore byte count + add bx, [mx_BytesPerLine] ; Bump to next scan line + dec dx ; Done all lines? + jnz @@C1 ; No, continue + pop di ; Restore pixel address + add di, [Width] ; Go to right block + +; Fill right block +@@R0: + mov ah, [RightMask] + or ah, ah + jz @@Done ; Nothing to do, exit + mov dx, TS + mov al, 02h + out dx, ax ; Set write plane mask + mov dx, [mx_BytesPerLine] + mov cx, [Height] + mov bx, di + mov al, [Color] + call [FillFunction] ; Fill this column + +; Restore VGA registers +@@Done: + mov dx, GDC + mov ax, 0003h + out dx, ax ; Set logical function to "move" + +@@Exit: + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE +mxFillBox ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxfp.asm b/16/x/mxfp.asm new file mode 100755 index 00000000..8eea25be --- /dev/null +++ b/16/x/mxfp.asm @@ -0,0 +1,326 @@ +;----------------------------------------------------------- +; +; MXFP.ASM - Fade palette function +; Copyright (c) 1992-1994 ARTIS s.r.l. +; Author: Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxFadePalette + +MAXCOLOR EQU 256 +FADE_IN EQU 0 +FADE_OUT EQU 1 + +; The actual speed of fading depends on the number of passes (FADE_SPEED) and +; the delay between two consecutive passes (FADE_DELAY). Below are the +; default values, used when no parameters are specified. +; +FADE_DELAY EQU 1 ; Vert. retraces between video updates +FADE_SPEED EQU 48 ; Speed of effect (max 127) + +; Bit field record for fade commands +; +FADE_COMMAND RECORD fpDELAY:8,fpSPEED:7,fpDIRECTION:1 + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +DB 'Copyright (c) 1992-1994 ARTIS s.r.l. All rights reserved.' + +;----------------------------------------------------------- +; +; Fades a VGA palette. +; +; Input: +; Buffer = pointer to source/destination palette +; Command = fading direction and optional parameters +; Start = index of first color to fade +; Count = number of color to fade +; Red = destination red +; Green = destination green +; Blue = destination blue +; Output: +; none +; Notes: +; - about 1.5 Kbytes of stack space are needed for internal buffers; +; - the Command argument usually is 0 to fade in and 1 to fade out, +; however additional parameters may be specified. To set the effect +; speed, i.e. the number of iterations needed to completely fade a +; palette, shift the value one bit left and "or" it with the +; direction bit (range is 0..127). To set the delay between two +; consecutive passes, shift it eight bits left (range is 0..255). +; +mxFadePalette PROC FAR + ARG bBlue:WORD, \ + bGreen:WORD, \ + bRed:WORD, \ + wCount:WORD, \ + wStartIdx:WORD, \ + wCommand:WORD, \ + vfpPalette:DWORD = ARG_SIZE + LOCAL bSPalette:BYTE:MAXCOLOR*3, \ + bDPalette:BYTE:MAXCOLOR*3, \ + bLoopIndex:BYTE, \ + bLoopStep:BYTE, \ + bLoopCount:BYTE, \ + wDelay:WORD, \ + wSpeed:WORD = AUTO_SIZE + ASSUME ds:NOTHING + .enter AUTO_SIZE + .push si, di, ds, es ; Save registers +; +; Check parameters and setup variables +; +@@GetDelay: + mov [wDelay], FADE_DELAY ; Set default delay + mov ax, [wCommand] ; Get command word + and ax, MASK fpDELAY ; Mask delay command + jz @@GetSpeed ; No command, get speed + IF USE286 EQ TRUE + shr ax, fpDELAY + ELSE + mov cl, fpDELAY ; Get size of delay field + shr ax, cl ; Right justify the field + ENDIF + mov [wDelay], ax ; Set new delay + +@@GetSpeed: + mov ax, [wCommand] ; Get command + and ax, MASK fpSPEED ; Mask speed + IF USE286 EQ TRUE + shr ax, fpSPEED + ELSE + mov cl, fpSPEED ; Get size of speed field + shr ax, cl ; Right justify the field + ENDIF + or ax, ax ; Any speed specified? + jnz @@SetVariables ; Yes, set variables + mov ax, FADE_SPEED ; Set default speed + +@@SetVariables: + mov [wSpeed], ax ; Set speed + inc ax ; Number of iterations + mov [bLoopCount], al ; Set loop count + mov [bLoopStep], 1 ; Assume we're fading in + mov [bLoopIndex], 0 +; +; Check bounds for bad values +; + mov ax, [wStartIdx] ; Get first index + cmp ax, MAXCOLOR ; Is in the valid range? + jae @@Exit ; No, exit + add ax, [wCount] ; Get last index + cmp ax, MAXCOLOR ; Is in the valid range? + jbe @@BoundsOk ; Yes, continue + mov ax, MAXCOLOR + sub ax, [wStartIdx] + mov [wCount], ax ; Set count to maximum value + or ax, ax + jz @@Exit ; Nothing to do, exit +@@BoundsOk: +; +; Copy the source palette in a local array: if we fade in it's ready to +; use, otherwise we'll overwrite it later +; + mov cx, [wCount] + mov ax, cx + shl ax, 1 + add cx, ax ; CX = wCount * 3 + mov ax, ss + mov es, ax + lea di, [bSPalette] ; ES:DI points to local palette + mov ax, [wStartIdx] + mov si, ax + shl ax, 1 + add ax, si + lds si, [vfpPalette] ; DS:SI points to user palette + add si, ax ; Skip unused entries + cld + shr cx, 1 + rep movsw + rcl cx, 1 + rep movsb +; +; Check direction +; + test [wCommand], MASK fpDIRECTION ; Are we fading in? + jz @@Main ; Yes, ok to continue + mov ax, [wSpeed] ; Get speed + mov [bLoopIndex], al ; Exchange first and last index + mov [bLoopStep], -1 ; Move backward + mov ax, ss ; Overwrite our copy of + mov ds, ax ; user palette with the + mov es, ax ; current active palette + lea di, [bSPalette] + mov ax, [wStartIdx] + mov cx, [wCount] + call ReadPalette ; Read current palette +; +; Prepare variables and registers for fading +; +@@Main: + mov bh, BYTE PTR [bRed] ; Destination red + and bh, 00111111b ; Be sure it's a valid VGA value + mov bl, BYTE PTR [bGreen] ; Destination green + and bl, 00111111b ; Be sure it's a valid VGA value + mov dh, BYTE PTR [bBlue] ; Destination blue + and dh, 00111111b ; Be sure it's a valid VGA value + mov dl, [bLoopIndex] ; Loop index + mov ax, ss ; All tables are stored + mov ds, ax ; in the stack segment, + mov es, ax ; set DS and ES +; +; Main loop +; +@@Loop: + mov ax, [wCount] ; Store count in AX + mov cx, [wSpeed] ; Set maximum speed in CX + lea si, [bSPalette] ; DS:SI points to source palette + lea di, [bDPalette] ; ES:DI points to dest. palette + call RecalcPalette ; Build a faded palette + + .push bx, dx ; Save registers we need + lea si, [bDPalette] ; DS:SI points to palette + mov ax, [wStartIdx] ; First index to write + mov bx, [wCount] ; Total entries to write + mov cx, [wDelay] ; Fade delay between updates + call WritePalette ; Write palette + .pop bx, dx ; Restore BX and DX + + add dl, [bLoopStep] ; Change fade intensity + dec [bLoopCount] ; Done? + jnz @@Loop ; No, loop again + +@@Exit: + .pop si, di, ds, es ; Restore registers + .leave ARG_SIZE +mxFadePalette ENDP + +;------- INTERNAL USE ONLY ------------------------------------------------ +; +; Calculates a partially faded palette. +; +; Input: +; AX = number of entries in palette +; CX = maximum fade intensity (same as fade speed) +; DS:SI = pointer to source palette +; ES:DI = pointer to destination palette +; BH = destination red +; BL = destination green +; DH = destination blue +; DL = relative intensity of destination palette +; Note: +; it's important that a new palette can be calculated in less +; than 1/70th of second. Fading to any RGB value requires use +; of "imul" instructions: "idiv" may be replaced with faster +; "sar", but only when the number of passes is a power of two, +; thus reducing the range of selectable speeds. +; In both cases an extimate of CPU cycles required by this +; procedure shows that it's too slow to run on a 4.77 Mhz 8086 +; CPU and a 256 color palette, so we keep "idiv" and hope +; the target machine to be at least a 6 Mhz 80286 (that's not +; asking too much...). +; +RecalcPalette PROC NEAR + cld + push bp ; Save BP + mov bp, ax ; Copy counter in BP +@@Loop: + lodsb ; Red: read value + sub al, bh ; Subtract destination value + imul dl ; Scale to desired weight + idiv cl ; Put value in AL + add al, bh ; Add destination value... + stosb ; ...and store it + lodsb ; Green: read value + sub al, bl ; Subtract destination value + imul dl ; Scale to desired weight + idiv cl ; Put value in AL + add al, bl ; Add destination value... + stosb ; ...and store it + lodsb ; Blue: read value + sub al, dh ; Subtract destination value + imul dl ; Scale to desired weight + idiv cl ; Put value in AL + add al, dh ; Add destination value... + stosb ; ...and store it + dec bp + jnz @@Loop + pop bp ; Restore BP + ret +RecalcPalette ENDP + +;------- INTERNAL USE ONLY ------------------------------------------------ +; +; Writes a 256 color palette. +; +; Input: +; AX = index of first color to write +; BX = number of colors to write (each color is an RGB triplet) +; CX = number of vertical retraces to wait before writing to DACs +; DS:SI = pointer to first entry of palette +; +WritePalette PROC NEAR + ASSUME ds:NOTHING + mov ah, al ; Save index + mov dx, 03DAh ; Input status register +@@Delay1: + in al, dx + test al, 08h + jnz @@Delay1 ; Wait for display mode +@@Delay2: + in al, dx + test al, 08h + jz @@Delay2 ; Wait for vertical retrace mode + loop @@Delay1 ; Repeat CX times +@@Write: + mov cx, bx ; Get number of colors + mov dx, 03C8h ; PEL write address register + mov al, ah ; Restore index + out dx, al ; Select index of first color + inc dx ; PEL data register + cld ; Move forward + cli ; Disable interrupts +@@Loop: + lodsb + out dx, al ; Red + lodsb + out dx, al ; Green + lodsb + out dx, al ; Blue + loop @@Loop ; Loop until done + sti ; Enable interrupts + ret +WritePalette ENDP + +;------- INTERNAL USE ONLY ------------------------------------------------ +; +; Reads the current palette. +; +; Input: +; AX = index of first color to read +; CX = number of colors +; ES:DI = pointer to destination buffer +; +ReadPalette PROC NEAR + mov dx, 03C7h + out dx, al + inc dx + inc dx + cld +@@Loop: + in al, dx + stosb + in al, dx + stosb + in al, dx + stosb + loop @@Loop + ret +ReadPalette ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxgc.asm b/16/x/mxgc.asm new file mode 100755 index 00000000..85edf7a6 --- /dev/null +++ b/16/x/mxgc.asm @@ -0,0 +1,54 @@ +;----------------------------------------------------------- +; +; MXGC.ASM - Get color function +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxGetColor + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Returns the current setting of the selected DAC register. +; +; Input: +; Index = color index (0-255) +; R, G, B = byte pointers to red, green and blue +; Output: +; none +; +mxGetColor PROC FAR + ARG B:DWORD, \ + G:DWORD, \ + R:DWORD, \ + Index:WORD = ARG_SIZE + .enter 0 + .push ds, si + + mov ax, [Index] + mov dx, 3C7h ; PEL read address register + out dx, al + inc dx + inc dx + + lds si, [R] + in al, dx + mov ds:[si], al + lds si, [G] + in al, dx + mov ds:[si], al + lds si, [B] + in al, dx + mov ds:[si], al + + .pop ds, si + .leave ARG_SIZE +mxGetColor ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxgi.asm b/16/x/mxgi.asm new file mode 100755 index 00000000..7037d411 --- /dev/null +++ b/16/x/mxgi.asm @@ -0,0 +1,132 @@ +;----------------------------------------------------------- +; +; MXGI.ASM - Get image +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxGetImage + +EXTRN subClipImage : NEAR + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_VideoSegment : WORD +EXTRN mx_BytesPerLine : WORD + +;----------------------------------------------------------- +; +; Copies an image from screen to memory. +; +; Input: +; Image = pointer to buffer for image +; X, Y = coordinates of image on screen +; Width = width of image in pixels +; Height = height of image in pixels +; Output: +; none +; +mxGetImage PROC FAR + ARG Height:WORD, \ + Width:WORD, \ + Y:WORD, \ + X:WORD, \ + Image:DWORD = ARG_SIZE + LOCAL PlaneWidth:WORD:4, \ + PixelOffset:WORD, \ + MoveFunction:WORD, \ + ReadPlane:BYTE, \ + Count:BYTE = AUTO_SIZE + ASSUME ds:NOTHING + .enter AUTO_SIZE + .push ds, si, es, di + +; Clip image + mov bx, [X] + mov ax, [Y] + mov cx, [Width] + mov dx, [Height] + call subClipImage + jc @@Exit ; Full clipped + mov [Height], dx + add WORD PTR Image[0], si ; Skip clipped pixels + +; Get pixel address + mul [mx_BytesPerLine] + mov si, bx + shr si, 1 + shr si, 1 + add si, ax + mov [PixelOffset], si + mov ds, [mx_VideoSegment] ; DS:SI points to pixel + and bl, 03h + mov [ReadPlane], bl + +; Compute extra bytes and width count for each plane + mov bx, cx + shr bx, 1 + shr bx, 1 ; Width for each plane + and cl, 03h + mov al, 00001000b + shr al, cl + mov di, 3 SHL 1 +@@PatchLoop: + mov PlaneWidth[di], bx + shr al, 1 + adc bx, 0 + dec di + dec di + jge @@PatchLoop + +; Get image + cld + mov [Count], 4 ; Four planes + lea bx, PlaneWidth ; SS:[BX] = width in bytes for plane + mov es, WORD PTR Image[2] ; ES:DI will point to image + mov ah, [ReadPlane] +@@PlaneLoop: + cmp WORD PTR ss:[bx], 0 ; Exit if nothing more to do + je @@Exit ; (also, never try to move zero bytes!) + mov di, WORD PTR Image[0] + mov al, 04h + mov dx, GDC + out dx, ax ; Select read plane + mov dx, [Height] + mov si, [PixelOffset] ; DS:SI points to video memory +@@Loop: + .push si, di + mov cx, WORD PTR ss:[bx] ; Number of bytes to move +@@MoveLoop: + movsb + add di, 3 + dec cx + jnz @@MoveLoop + .pop si, di + add di, [Width] ; Go to next image line + add si, [mx_BytesPerLine] ; Go to next screen row + dec dx + jnz @@Loop ; Repeat for all lines + inc bx + inc bx ; Select width for next plane + inc ah + test ah, 04h ; Plane wraparound? + jz @@PlaneOk ; No + inc [PixelOffset] ; Yes, bump video pointer + and ah, 03h +@@PlaneOk: + inc WORD PTR Image[0] + dec [Count] + jnz @@PlaneLoop ; Repeat for all planes + +@@Exit: + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE +mxGetImage ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxgm.asm b/16/x/mxgm.asm new file mode 100755 index 00000000..a67476a0 --- /dev/null +++ b/16/x/mxgm.asm @@ -0,0 +1,63 @@ +;----------------------------------------------------------- +; +; MXGM.ASM - Gamma correction +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxGammaCorrect + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +mx_tblGamma LABEL BYTE + DB 00, 10, 14, 17, 19, 21, 23, 24, 26, 27, 28, 29, 31, 32, 33, 34 + DB 35, 36, 37, 37, 38, 39, 40, 41, 41, 42, 43, 44, 44, 45, 46, 46 + DB 47, 48, 48, 49, 49, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55 + DB 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63 + +;----------------------------------------------------------- +; +; Correct palette colors (gamma is 2.3). +; +; Input: +; CPal = pointer to color palette +; GPal = pointer to destination (gamma corrected) palette +; Count = number of colors to convert +; Output: +; none +; +; Note: CPal and GPal may point to the same buffer. +; +mxGammaCorrect PROC FAR + ARG Count:WORD, \ + DPal:DWORD, \ + SPal:DWORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds, si, es, di + + mov cx, [Count] + jcxz @@Exit ; Exit now if nothing to do + lds si, [SPal] + les di, [DPal] + mov bx, OFFSET mx_tblGamma ; Setup BX for XLAT instruction + cld + mov ax, cx ; AX = Count + add cx, cx ; CX = Count*2 + add cx, ax ; CX = Count*3 +@@Loop: + lodsb + xlat mx_tblGamma + stosb + loop @@Loop + +@@Exit: + .pop ds, si, es, di + .leave ARG_SIZE +mxGammaCorrect ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxgp.asm b/16/x/mxgp.asm new file mode 100755 index 00000000..6c143173 --- /dev/null +++ b/16/x/mxgp.asm @@ -0,0 +1,56 @@ +;----------------------------------------------------------- +; +; MXGP.ASM - Get palette function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxGetPalette + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Returns the current setting of the VGA palette. +; +; Input: +; Buffer = pointer to palette data (R,G,B) +; Start = index of first color to get +; Count = number of color to get +; Output: +; none +; +mxGetPalette PROC FAR + ARG Count:WORD, \ + Start:WORD, \ + Buffer:DWORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push es, di + + les di, [Buffer] + mov cx, [Count] + mov ax, [Start] + mov dx, 3C7h ; PEL read address register + out dx, al + inc dx + inc dx + cld +@@Loop: + in al, dx + stosb + in al, dx + stosb + in al, dx + stosb + loop @@Loop ; Loop until done + + .pop es, di + .leave ARG_SIZE +mxGetPalette ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxgv.asm b/16/x/mxgv.asm new file mode 100755 index 00000000..2a54b1d0 --- /dev/null +++ b/16/x/mxgv.asm @@ -0,0 +1,25 @@ +;----------------------------------------------------------- +; +; MXGV.ASM - Get version function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxGetVersion + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Returns the library version. +; +mxGetVersion PROC FAR + mov ax, MXVERSION + ret +mxGetVersion ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxhl.asm b/16/x/mxhl.asm new file mode 100755 index 00000000..049a0566 --- /dev/null +++ b/16/x/mxhl.asm @@ -0,0 +1,76 @@ +;----------------------------------------------------------- +; +; MXHL.ASM - Horizontal line mask utility +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC subHorizontalLineInfo + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD + +tblLeftSize DW 00h, 03h, 02h, 01h +tblLeftMask DB 00h, 0Eh, 0Ch, 08h +tblRightMask DB 00h, 01h, 03h, 07h +tblPatchMask DB 02h, 06h + +;----------------------------------------------------------- +; +; Prepares register for fast horizontal line drawing. +; +; Input: +; BX, AX = X, Y address of left pixel +; CX = line width +; Output: +; DI = left pixel offset in video memory +; AL = left block write plane mask (0 = none) +; AH = right block write plane mask (0 = none) +; CX = center block width in 4-pixel blocks +; +subHorizontalLineInfo PROC NEAR + ASSUME ds:NOTHING + + mul [mx_BytesPerLine] + mov di, bx + shr di, 1 + shr di, 1 + add di, ax ; Offset of left pixel + + and bx, 03h + mov al, tblLeftMask[bx] + shl bx, 1 + sub cx, tblLeftSize[bx] + jge @@1 ; Ok to continue + +; Special case: start and end in the middle of a 4-pixel block. +; There are only three cases: +; Pixels Left mask CX CX+2 Patch mask Result +; 1) ..o. ..xx -1 1 .xx. ..x. +; 2) .oo. .xxx -1 1 .xx. .xx. +; 3) .o.. .xxx -2 0 .x.. .x.. +; All other cases are automatically handled with the standard masks. + mov bx, cx + inc bx + inc bx + and al, tblPatchMask[bx] ; Combine masks + xor ah, ah ; No right block + xor cx, cx ; No center block + jmp @@Exit + +@@1: + mov bx, cx + and bx, 03h + mov ah, tblRightMask[bx] + shr cx, 2 + +@@Exit: + ret +subHorizontalLineInfo ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxit.asm b/16/x/mxit.asm new file mode 100755 index 00000000..c0d9cedd --- /dev/null +++ b/16/x/mxit.asm @@ -0,0 +1,98 @@ +;----------------------------------------------------------- +; +; MXIT.ASM - Initialization/termination functions +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxInit +PUBLIC mxTerm + +PUBLIC mx_VideoSegment +PUBLIC mx_CodeSegment + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +DB 'MODEX library - Copyright (c) 1992-1994 Alessandro Scotti' + +mx_VideoSegment DW 0A000h +mx_CodeSegment DW SEG MX_TEXT + +;----------------------------------------------------------- +; +; Initialization. +; +; Input: +; none +; Output: +; AX = 0 on success +; +mxInit PROC FAR + LOCAL Result:WORD, \ + VideoSeg:WORD, \ + CStoDSalias:WORD = AUTO_SIZE + ASSUME ds:NOTHING + .enter AUTO_SIZE + .push ds, si, es, di + + mov [Result], -1 ; Assume an error + mov [VideoSeg], 0A000h ; Real mode video segment + mov [CStoDSalias], cs ; Real mode data alias for CS + +; Check if running in protected mode under DPMI + mov ax, 1686h + int 2Fh + or ax, ax + jnz @@1 ; DPMI not found, continue in real mode + +; Get a data alias for CS + mov ax, 000Ah ; DMPI: create data alias + mov bx, cs + int 31h + jc @@Exit ; Exit if service failed + mov [CStoDSalias], ax ; Save data alias for CS +; Get a protected-mode selector for the video segment + mov ax, 0002h + mov bx, 0A000h ; Real mode segment of video + int 31h ; DPMI: get segment selector + jc @@Exit ; Exit if service failed + mov [VideoSeg], ax ; Save protected mode video selector + +; Initialize variables +@@1: + mov ds, [CStoDSalias] + ASSUME ds:MX_TEXT + mov [mx_CodeSegment], ds + mov ax, [VideoSeg] + mov [mx_VideoSegment], ax + +; Don't bother with VGA check for now... + + mov [Result], 0 + +@@Exit: + mov ax, [Result] + .pop ds, si, es, di + .leave +mxInit ENDP + +;----------------------------------------------------------- +; +; Termination. +; +; Input: +; none +; Output: +; always 0. +; +mxTerm PROC FAR + ASSUME ds:NOTHING + xor ax, ax + ret +mxTerm ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxll.asm b/16/x/mxll.asm new file mode 100755 index 00000000..34fec043 --- /dev/null +++ b/16/x/mxll.asm @@ -0,0 +1,82 @@ +;----------------------------------------------------------- +; +; MXLL.ASM - Load latches +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxLoadLatches + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_VideoSegment : WORD + +;----------------------------------------------------------- +; +; Loads the specified value into the VGA latches. +; +; Input: +; BL = value to load into latches +; Output: +; none +; Changes: +; bit mask register to FFh; +; function select register to "move"; +; write mode to 00h. +; Note: +; this is for internal use only. +; +mxLoadLatches PROC NEAR + ASSUME ds:NOTHING + + .push ds, si + mov dx, GDC + mov ax, 0FF08h + out dx, ax ; Set bit mask to FFh + mov ax, 0003h + out dx, ax ; Set function to "move" + mov ax, 0005h + out dx, ax ; Set write mode + mov ax, [mx_VideoSegment] + mov ds, ax + mov si, 0FFFFh + mov bh, 8 ; BH = write plane mask + mov cx, 3 ; CX = count = read plane +; Saves old values and force BL into latches +@@SetLoop: + mov dx, GDC + mov al, 04h + mov ah, cl + out dx, ax ; Select read plane + mov dx, TS + mov al, 02h + mov ah, bh + out dx, ax ; Select write plane + mov al, ds:[si] + push ax + mov ds:[si], bl + mov al, ds:[di] ; Force value into latch + shr bh, 1 ; Next write plane + loop @@SetLoop +; Restore previous values + mov cx, 3 + mov bh, 8 + mov dx, TS +@@ResetLoop: + mov al, 02h + mov ah, bh + out dx, ax ; Select write plane + pop ax + mov ds:[si], al + shr bh, 1 ; Next write plane + loop @@ResetLoop +; Exit + .pop ds, si + ret +mxLoadLatches ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxln.asm b/16/x/mxln.asm new file mode 100755 index 00000000..fbc4ab94 --- /dev/null +++ b/16/x/mxln.asm @@ -0,0 +1,414 @@ +;----------------------------------------------------------- +; +; MXLN.ASM - Line function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxLine + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD +EXTRN mx_VideoSegment : WORD + +EXTRN mx_ClipX1 : WORD +EXTRN mx_ClipY1 : WORD +EXTRN mx_ClipX2 : WORD +EXTRN mx_ClipY2 : WORD + +tblDrawFunc LABEL WORD + DW subWidthMove + DW subHeightMove + DW subWidthOp + DW subHeightOp + +;----------------------------------------------------------- +; +; Draws a line from (X1,Y1) to (X2,Y2) using the Bresenham +; algorithm. +; +; Input: +; X1, Y1 = start point +; X2, Y2 = end point +; Color = line color +; Op = raster operator +; Output: +; none +; +; Note: the end point (X2,Y2) *IS* drawed. I don't like this very much +; but clipping is much simpler. +; +mxLine PROC FAR + ARG Op:WORD, \ + Color:WORD, \ + Y2:WORD, \ + X2:WORD, \ + Y1:WORD, \ + X1:WORD = ARG_SIZE + LOCAL Width:WORD, \ + Height:WORD, \ + ErrorAdd:WORD, \ + ErrorSub:WORD, \ + DeltaX:WORD, \ + DeltaY:WORD, \ + P1:BYTE, \ + P2:BYTE, \ + WritePlane:BYTE = AUTO_SIZE + .enter AUTO_SIZE + .push ds, si, di + ASSUME ds:NOTHING + + mov ax, [X1] + mov bx, [Y1] + mov cx, [X2] + mov dx, [Y2] + call subClipLine + jc @@Exit ; Line is full clipped + +; Get width + mov si, cx + xchg ax, si ; SI = X1, AX = X2 + sub ax, si + jge @@1 +; Swap points, we want X1 < X2 + xchg si, cx ; Swap X1 and X2 + xchg bx, dx ; Swap Y1 and Y2 + neg ax +@@1: + mov [Width], ax + +; Get height + mov cx, [mx_BytesPerLine] ; We don't need X2 anymore + mov ax, dx + sub ax, bx + jge @@2 + neg cx ; Move from bottom to top + neg ax ; Get absolute value of AX +@@2: + mov [Height], ax + mov [DeltaY], cx + +; Get pixel address and write plane + mov ax, bx + mul [mx_BytesPerLine] + mov cx, si ; CX = X1 + shr si, 1 + shr si, 1 + add si, ax ; SI = pixel offset + and cl, 03h + mov ax, 1102h + shl ah, cl + mov [WritePlane], ah + mov dx, TS + out dx, ax ; Set write plane + mov ax, [mx_VideoSegment] + mov ds, ax ; DS:SI points to (X1,Y1) + +; Select the function to handle the drawing loop + xor bx, bx + mov al, BYTE PTR [Op] + cmp al, OP_MOVE + je @@3 + and al, 03h + shl al, 1 + shl al, 1 + shl al, 1 + mov ah, al + mov al, 03h + mov dx, GDC + out dx, ax ; Set logical function + inc bx + inc bx +@@3: + mov ax, [Width] + mov cx, [Height] +; Horizontal, vertical and diagonal lines are not optimized yet + cmp ax, cx + jae @@4 + inc bx +@@4: + shl bx, 1 + call tblDrawFunc[bx] + +; Reset logical function if needed + cmp BYTE PTR [Op], OP_MOVE + je @@Exit + mov ax, 0003h + mov dx, GDC + out dx, ax + +@@Exit: + xor ax, ax + .pop ds, si, di + .leave ARG_SIZE + +;----------------------------------------------------------- +; +; Checks the coordinates of a line against the active +; clip region. +; Uses a variation of the Cohen-Sutherland algorithm developed +; by Victor Duvanenko. +; +; Input: +; AX, BX = X1, Y1 +; CX, DX = X2, Y2 +; Output: +; CF = set if line is full clipped +; AX, BX = clipped X1, Y1 +; CX, DX = clipped X2, Y2 +; Note: +; destroys SI, DI +; +subClipLine PROC NEAR + mov di, ax ; Copy X1 to DI and free AX + mov si, dx ; Copy Y2 to SI and free DX +; Compute clip codes for point (X2,Y2)=(CX,SI) + xor al, al +@@P2X1: cmp cx, [mx_ClipX1] + jge @@P2X2 + or al, 1 +@@P2X2: cmp cx, [mx_ClipX2] + jle @@P2Y1 + or al, 2 +@@P2Y1: cmp si, [mx_ClipY1] + jge @@P2Y2 + or al, 4 +@@P2Y2: cmp si, [mx_ClipY2] + jle @@P2XY + or al, 8 +@@P2XY: mov [P2], al +; Compute clip codes for point (X1,Y1)=(DI,BX) + xor al, al +@@P1X1: cmp di, [mx_ClipX1] + jge @@P1X2 + or al, 1 +@@P1X2: cmp di, [mx_ClipX2] + jle @@P1Y1 + or al, 2 +@@P1Y1: cmp bx, [mx_ClipY1] + jge @@P1Y2 + or al, 4 +@@P1Y2: cmp bx, [mx_ClipY2] + jle @@P1XY + or al, 8 +@@P1XY: mov [P1], al +; Check codes for trivial cases + mov ah, [P2] + test al, ah ; Is line invisible? + jnz @@FullClip ; Yes, exit + or ah, al ; Both points clipped? + jz @@Done ; Yes, exit +; Calculate deltas + mov ax, cx + sub ax, di + mov [DeltaX], ax + mov ax, si + sub ax, bx + mov [DeltaY], ax + mov al, [P1] ; Init clipping code +; Clipping loop +@@ClipLoop: + test al, al ; Is first point clipped? + jnz @@ClipX1 ; No, continue + xchg cx, di ; Swap points... + xchg bx, si + xchg al, [P2] ; ...and codes +; Clip left: Y1 = Y1 + DeltaY*(mx_ClipX1-X1)/DeltaX +@@ClipX1: + test al, 1 + jz @@ClipX2 + mov ax, [mx_ClipX1] + sub ax, di + mov di, [mx_ClipX1] + jmp @@ClipX1X2 +; Clip right: Y1 = Y1 + DeltaY*(mx_ClipX2-X1)/DeltaX +@@ClipX2: + test al, 2 + jz @@ClipY1 + mov ax, [mx_ClipX2] + sub ax, di + mov di, [mx_ClipX2] +@@ClipX1X2: + imul [DeltaY] + idiv [DeltaX] + add bx, ax + mov al, 8 + cmp bx, [mx_ClipY2] + jg @@CheckLoop + mov al, 4 + cmp bx, [mx_ClipY1] + jl @@CheckLoop + xor al, al + jmp @@CheckLoop +; Clip top: X1 = X1 + DeltaX*(mx_ClipY1-Y1)/DeltaY +@@ClipY1: + test al, 4 + jz @@ClipY2 + mov ax, [mx_ClipY1] + sub ax, bx + mov bx, [mx_ClipY1] + jmp @@ClipY1Y2 +; Clip bottom: X1 = X1 + DeltaX*(mx_ClipY2-Y1)/DeltaY +@@ClipY2: + mov ax, [mx_ClipY2] + sub ax, bx + mov bx, [mx_ClipY2] +@@ClipY1Y2: + imul [DeltaX] + idiv [DeltaY] + add di, ax + mov al, 1 + cmp di, [mx_ClipX1] + jl @@CheckLoop + mov al, 2 + cmp di, [mx_ClipX2] + jg @@CheckLoop + xor al, al +@@CheckLoop: + mov ah, [P2] + test al, ah + jnz @@FullClip + or ah, al + jnz @@ClipLoop + +@@Done: + mov ax, di + mov dx, si + clc + ret +@@FullClip: + stc + ret +subClipLine ENDP + +; Called when Width >= Height and Op = OP_MOVE +subWidthMove PROC NEAR + mov di, ax + neg di ; Initialize error term + shl cx, 1 + mov [ErrorAdd], cx + mov cx, ax + shl ax, 1 + mov [ErrorSub], ax + mov al, 02h + mov ah, [WritePlane] + mov bl, BYTE PTR [Color] + mov dx, TS + inc cx +@@Loop: + mov ds:[si], bl + dec cx + jz @@Exit + rol ah, 1 + adc si, 0 + out dx, ax + add di, [ErrorAdd] + jl @@Loop + add si, [DeltaY] + sub di, [ErrorSub] + jmp @@Loop +@@Exit: + ret +subWidthMove ENDP + +; Called when Width < Height and Op = OP_MOVE +subHeightMove PROC NEAR + mov di, cx + neg di ; Initialize error term + shl ax, 1 + mov [ErrorAdd], ax + mov ax, cx + shl ax, 1 + mov [ErrorSub], ax + mov bl, BYTE PTR [Color] + mov ah, [WritePlane] + mov al, 02h + mov dx, TS + inc cx +@@Loop: + mov ds:[si], bl + dec cx + jz @@Exit + add si, [DeltaY] + add di, [ErrorAdd] + jl @@Loop + rol ah, 1 ; Next write plane + adc si, 0 ; Bump video offset if plane overflows + out dx, ax + sub di, [ErrorSub] ; Adjust error down + jmp @@Loop +@@Exit: + ret +subHeightMove ENDP + +; Called when Width >= Height and Op <> OP_MOVE +subWidthOp PROC NEAR + mov di, ax + neg di ; Initialize error term + shl cx, 1 + mov [ErrorAdd], cx + mov cx, ax + shl ax, 1 + mov [ErrorSub], ax + mov al, 02h + mov ah, [WritePlane] + mov bl, BYTE PTR [Color] + mov dx, TS + inc cx +@@Loop: + mov bh, ds:[si] ; Latch data + mov ds:[si], bl + dec cx + jz @@Exit + rol ah, 1 + adc si, 0 + out dx, ax + add di, [ErrorAdd] + jl @@Loop + add si, [DeltaY] + sub di, [ErrorSub] + jmp @@Loop +@@Exit: + ret +subWidthOp ENDP + +; Called when Width < Height and Op <> OP_MOVE +subHeightOp PROC NEAR + mov di, cx + neg di ; Initialize error term + shl ax, 1 + mov [ErrorAdd], ax + mov ax, cx + shl ax, 1 + mov [ErrorSub], ax + mov bl, BYTE PTR [Color] + mov ah, [WritePlane] + mov al, 02h + mov dx, TS + inc cx +@@Loop: + mov bh, ds:[si] + mov ds:[si], bl + dec cx + jz @@Exit + add si, [DeltaY] + add di, [ErrorAdd] + jl @@Loop + rol ah, 1 ; Next write plane + adc si, 0 ; Bump video offset if plane overflows + out dx, ax + sub di, [ErrorSub] ; Adjust error down + jmp @@Loop +@@Exit: + ret +subHeightOp ENDP + +mxLine ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxot.asm b/16/x/mxot.asm new file mode 100755 index 00000000..62547665 --- /dev/null +++ b/16/x/mxot.asm @@ -0,0 +1,330 @@ +;----------------------------------------------------------- +; +; MXOT.ASM - Text functions +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES ; We use the reserved name 'WIDTH' +INCLUDE MODEX.DEF + +PUBLIC mxOutChar +PUBLIC mxOutText +PUBLIC mxSetFont +PUBLIC mxSetTextColor +PUBLIC mxGetTextStep +PUBLIC mxSetTextStep + +MAX_WIDTH EQU 16 ; Must be <= 16 +MAX_HEIGHT EQU 32 + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_CodeSegment : WORD +EXTRN mxPutImage : FAR + +; Default 8x8 font +fnt_Default LABEL + INCLUDE DEFAULT.FNT + +; Table of system fonts +tbl_SystemFont LABEL WORD + DW fnt_Default, 8, 8 + +MX_MAXSYSFONT EQU ($-OFFSET tbl_SystemFont) SHR 2 + +mx_FontPtr DW OFFSET fnt_Default, SEG MX_TEXT +mx_FontWidth DW 8 ; Font width in pixels +mx_FontHeight DW 8 ; Font height in pixels +mx_FontCharSize DW 8 ; Size in bytes of a font character +mx_FontColor DW 00FFh ; Color: foreground + background*256 +mx_FontOp DW OP_MOVE ; Raster op +mx_DeltaX DW 8 ; Horizontal step +mx_DeltaY DW 0 ; Vertical step + +;----------------------------------------------------------- +; +; Sets the current font. +; +; Input: +; Font = pointer to font data +; Width = width of font character in pixels +; Height = height of font character in pixels +; Output: +; AX = 0 on success, else invalid parameters +; +; Note: when the high word of Font (i.e. the segment) is zero, the low +; word is used to select one of the system fonts. +; +mxSetFont PROC FAR + ARG Height:WORD, \ + Width:WORD, \ + Font:DWORD = ARG_SIZE + .enter 0 + .push ds + + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov ax, WORD PTR Font[2] ; Get font segment + test ax, ax ; Null segment? + jnz @@UserFont ; No, install user font + +; Install system font + mov ax, WORD PTR Font[0] ; Get font number + cmp ax, MX_MAXSYSFONT ; Check range + jb @@SystemFont + xor ax, ax ; Out of range, use default font +@@SystemFont: + shl ax, 1 + shl ax, 1 + mov bx, ax + mov ax, tbl_SystemFont[bx] ; Get font offset + mov WORD PTR mx_FontPtr[0], ax + mov WORD PTR mx_FontPtr[2], cs + mov al, BYTE PTR tbl_SystemFont[bx+2] + xor ah, ah + mov [mx_FontWidth], ax + mov [mx_DeltaX], ax + mov dl, BYTE PTR tbl_SystemFont[bx+3] + xor dh, dh + mov [mx_FontHeight], dx + mul dx + mov [mx_FontCharSize], ax + mov [mx_DeltaX], ax + xor ax, ax + mov [mx_DeltaY], ax + jmp @@Exit + +; Install user font +@@UserFont: + mov ax, -1 ; Assume an error + mov bx, [Width] + cmp bx, MAX_WIDTH + ja @@Exit ; Invalid character width + mov dx, [Height] + cmp dx, MAX_HEIGHT + ja @@Exit ; Invalid character height + mov [mx_FontWidth], bx + mov [mx_FontHeight], dx + mov ax, bx + add ax, 7 + .shr ax, 3 + mul dx + mov [mx_FontCharSize], ax + mov ax, WORD PTR Font[0] + mov WORD PTR mx_FontPtr[0], ax + mov ax, WORD PTR Font[2] + mov WORD PTR mx_FontPtr[2], ax + xor ax, ax + +@@Exit: + .pop ds + ASSUME ds:NOTHING + .leave ARG_SIZE +mxSetFont ENDP + +;----------------------------------------------------------- +; +; Sets the text color and raster op. +; +; Input: +; Color = text color (foreground + background*256) +; Op = raster op +; Output: +; none +; +mxSetTextColor PROC FAR + ARG Op:WORD, \ + Color:WORD = ARG_SIZE + .enter 0 + .push ds + + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov ax, [Color] + mov [mx_FontColor], ax + mov ax, [Op] + mov [mx_FontOp], ax + + xor ax, ax + .pop ds + ASSUME ds:NOTHING + .leave ARG_SIZE +mxSetTextColor ENDP + +;----------------------------------------------------------- +; +; Writes a character using the current font and attributes. +; +; Input: +; X, Y = video coordinates +; C = character to print +; Output: +; none +; +mxOutChar PROC FAR + ARG C:BYTE:2, \ + Y:WORD, \ + X:WORD = ARG_SIZE + LOCAL Image:BYTE:MAX_WIDTH*MAX_HEIGHT, \ + Count:WORD = AUTO_SIZE + .enter AUTO_SIZE + .push ds, si, es, di + ASSUME ds:NOTHING + +; Gets the pointer to font data for the selected character + lds si, DWORD PTR [mx_FontPtr] + mov al, [C] + xor ah, ah + mul [mx_FontCharSize] ; Offset into font + add si, ax ; DS:SI -> font data for character + +; Converts font data into a 256-color linear image + mov ax, ss + mov es, ax + lea di, [Image] + mov dx, [mx_FontColor] + mov ax, [mx_FontHeight] + mov [Count], ax +@@HeightLoop: + mov cx, [mx_FontWidth] + mov bh, ds:[si] + inc si ; Get a byte from font data + cmp cx, 8 + jbe @@WidthLoop ; Ok for width <= 8 + mov bl, ds:[si] ; Get another byte + inc si +@@WidthLoop: + mov al, dl ; Assume foreground color + shl bx, 1 ; Is font bit set? + jc @@1 ; Yes, foreground is just great + mov al, dh ; Get background color +@@1: + mov es:[di], al ; Put pixel into image + inc di + dec cx + jnz @@WidthLoop + dec [Count] + jnz @@HeightLoop + +; Now pass image to mx_PutImage + lea ax, [Image] + push es + push ax ; Pointer to image + push [X] + push [Y] ; Image coordinates + push [mx_FontWidth] + push [mx_FontHeight] ; Image size + push [mx_FontOp] ; Raster op + call mxPutImage ; Write character + + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE +mxOutChar ENDP + +;----------------------------------------------------------- +; +; Writes a string at the coordinates specified. +; +; Input: +; X, Y = text coordinates +; S = pointer to ASCIIZ string +; Output: +; none +; +mxOutText PROC FAR + ARG S:DWORD, \ + Y:WORD, \ + X:WORD = ARG_SIZE + .enter 0 + .push ds, si + ASSUME ds:NOTHING + + lds si, [S] +@@Loop: + mov al, ds:[si] + test al, al ; End of string? + jz @@Exit ; Yes, exit + inc si + push [X] ; Display character + push [Y] + push ax + call mxOutChar + mov ax, [mx_DeltaX] + add [X], ax ; Bump X coordinate + mov ax, [mx_DeltaY] + add [Y], ax ; Bump Y coordinate + dec [Count] + jnz @@Loop + +@@Exit: + xor ax, ax + .pop ds, si + .leave ARG_SIZE + ret +mxOutText ENDP + +;----------------------------------------------------------- +; +; Sets the distance between characters. +; +; Input: +; DeltaX = horizontal distance in pixels +; DeltaY = vertical distance in pixels +; Output: +; none +; +; Note: this function may be used to set the text direction. +; +mxSetTextStep PROC FAR + ARG DeltaY:WORD, \ + DeltaX:WORD = ARG_SIZE + .enter 0 + .push ds + + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov ax, [DeltaX] + mov [mx_DeltaX], ax + mov ax, [DeltaY] + mov [mx_DeltaY], ax + + .pop ds + .leave ARG_SIZE +mxSetTextStep ENDP + +;----------------------------------------------------------- +; +; Gets the current distance between characters. +; +; Input: +; DeltaX = pointer to horizontal distance in pixels (integer) +; DeltaY = pointer to vertical distance in pixels (integer) +; Output: +; none +; +mxGetTextStep PROC FAR + ARG DeltaY:DWORD, \ + DeltaX:DWORD = ARG_SIZE + .enter 0 + .push ds, si + ASSUME ds:NOTHING + + mov ax, [mx_DeltaX] + lds si, [DeltaX] + mov ds:[si], ax + mov ax, [mx_DeltaY] + lds si, [DeltaY] + mov ds:[si], ax + + .pop ds, si + .leave ARG_SIZE +mxGetTextStep ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxpb.asm b/16/x/mxpb.asm new file mode 100755 index 00000000..8c6aa449 --- /dev/null +++ b/16/x/mxpb.asm @@ -0,0 +1,22 @@ +;----------------------------------------------------------- +; +; MXPB.ASM - Scan buffer for convex polygon fills +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mx_ScanBuffer + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +ALIGN 4 + +mx_ScanBuffer LABEL + DW POLYSCANBUFSIZE DUP(?) + +MX_TEXT ENDS +END diff --git a/16/x/mxpf.asm b/16/x/mxpf.asm new file mode 100755 index 00000000..db0da898 --- /dev/null +++ b/16/x/mxpf.asm @@ -0,0 +1,420 @@ +;----------------------------------------------------------- +; +; MXPG.ASM - Convex polygon fill +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxFillPoly + +;----------------------------------------------------------- +; +; "Local" definitions +; +TPOINT STRUC + X DW ? + Y DW ? +TPOINT ENDS + +; Do NOT change order! +TSCAN STRUC + Y1 DW ? + Y2 DW ? +TSCAN ENDS + +MAXSCANCOLUMNS EQU POLYSCANBUFSIZE / SIZE TSCAN + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_VideoSegment : WORD +EXTRN mx_CodeSegment : WORD +EXTRN mx_BytesPerLine : WORD +EXTRN mx_ClipX1 : WORD +EXTRN mx_ClipY1 : WORD +EXTRN mx_ClipX2 : WORD +EXTRN mx_ClipY2 : WORD +EXTRN mx_ScanBuffer : NEAR + +;----------------------------------------------------------- +; +; Scans an edge using the DDA (digital differential analyzer) algorithm. +; +; Input: +; DS:BX = pointer to start point (X1, Y1) +; DS:SI = pointer to end point (X2, Y2) +; ES:DI = pointer to edge buffer +; Output: +; ES:DI = updated pointer to edge buffer +; Notes: +; must preserve DS:SI. +; +subScan PROC NEAR + mov cx, ds:[si].X + sub cx, ds:[bx].X ; Get width + jg @@1 + ret +@@1: + push bp ; Save BP + + mov ax, ds:[si].Y + mov bx, ds:[bx].Y + sub ax, bx ; Get height + jg @@T2B ; Scan top to bottom + jl @@B2T ; Scan bottom to top + +; Special case: vertical line + mov ax, bx +@@V: + mov es:[di].Y1, ax + add di, SIZE TSCAN + dec cx + jnz @@V + jmp @@Exit + +; Scan top to bottom +@@T2B: + cwd + div cx + mov bp, ax + xor ax, ax + div cx + xchg ax, bx ; BP:BX = fixed 16:16 step + mov dx, 8000h +@@T2BLoop: + mov es:[di].Y1, ax + add di, SIZE TSCAN + add dx, bx + adc ax, bp + dec cx + jnz @@T2BLoop + jmp @@Exit + +; Scan bottom to top +@@B2T: + neg ax + cwd + div cx + mov bp, ax + xor ax, ax + div cx + xchg ax, bx + mov dx, 8000h +@@B2TLoop: + mov es:[di].Y1, ax + add di, SIZE TSCAN + sub dx, bx + sbb ax, bp + dec cx + jnz @@B2TLoop + +@@Exit: + pop bp ; Restore BP + ret +subScan ENDP + +;----------------------------------------------------------- +; +; Fills a convex polygon with the specified color. +; +; Input: +; Count = number of vertexes +; Map = indexes of points and colors (integer) +; Points = array of points (integer X, Y coordinates) +; Color = base color +; Output: +; none +; Notes: +; vertexes must be in counterclockwise order, arrays are 0-based. +; +mxFillPoly PROC FAR + ARG Color:WORD, \ + Points:DWORD, \ + Map:DWORD, \ + Count:WORD = ARG_SIZE + LOCAL WritePlane:BYTE:2, \ + ScanOffsetT:WORD, \ + ScanOffsetB:WORD, \ + ScanCount:WORD, \ + Holder:WORD, \ + Height:WORD, \ + MinIdxT:WORD, \ + MinIdxB:WORD, \ + MaxIdx:WORD, \ + Width:WORD, \ + BoxX1:WORD, \ + BoxY1:WORD, \ + BoxX2:WORD, \ + BoxY2::WORD = AUTO_SIZE + .enter AUTO_SIZE + .push ds, si, es, di + ASSUME ds:NOTHING + +; Check that at least three vertexes are specified + mov cx, [Count] + cmp cx, 3 + jb @@Exit + +;------------------------------ +; Find bounding box for polygon + les di, [Map] + lds si, [Points] ; Pointer to vertex array + mov [BoxX1], 32767 + mov [BoxX2], -32768 + mov [BoxY1], 32767 + mov [BoxY2], -32768 + + xor dx, dx +@@MinMaxLoop: + mov bx, es:[di] ; Get index of vertex + .shl bx, 2 ; Get offset in point array + add bx, si + +; Check X range +@@CheckMinX: + mov ax, ds:[bx].X ; Get X coordinate + cmp ax, [BoxX1] + jge @@CheckMaxX + mov [BoxX1], ax + mov [MinIdxT], dx + mov [MinIdxB], dx +@@CheckMaxX: + cmp ax, [BoxX2] + jle @@CheckMinY + mov [BoxX2], ax + mov [MaxIdx], dx + +; Check Y range +@@CheckMinY: + mov ax, ds:[bx].Y + cmp ax, [BoxY1] + jge @@CheckMaxY + mov [BoxY1], ax +@@CheckMaxY: + cmp ax, [BoxY2] + jle @@CheckDone + mov [BoxY2], ax + +; Repeat thru all points +@@CheckDone: + inc di ; Next map entry + inc dx + inc di + inc dx + dec cx + jnz @@MinMaxLoop + +;--------------------------------- +; Check if polygon is full clipped + mov ax, [BoxX2] + cmp ax, [mx_ClipX1] ; Is poly full clipped? + jl @@Exit + mov bx, [BoxX1] + cmp bx, [mx_ClipX2] ; Is poly full clipped? + jg @@Exit + sub ax, bx ; Get width + jle @@Exit ; Exit if not positive + mov ax, [BoxY2] + cmp ax, [mx_ClipY1] ; Is poly full clipped? + jl @@Exit + mov bx, [BoxY1] + cmp bx, [mx_ClipY2] ; Is poly full clipped? + jg @@Exit + sub ax, bx ; Get height + jle @@Exit ; Exit if not positive + + dec [Count] + shl [Count], 1 ; We'll work with word offsets + mov es, [mx_CodeSegment] + +;-------------- +; Scan top edge + mov ax, OFFSET mx_ScanBuffer + mov [ScanOffsetT], ax + mov si, [MinIdxT] ; Offset of bottom point index +@@STLoop: + lds bx, [Map] ; DS:BX -> map table + mov di, ds:[bx+si] ; Index of top point #1 + dec si ; Next point + dec si + test si, si + jnl @@ST1 + mov si, [Count] +@@ST1: + mov [MinIdxT], si ; Save new index of top point + mov si, ds:[bx+si] ; Get index of top point #2 + .shl di, 2 ; Convert indexes to offsets + .shl si, 2 + lds bx, [Points] ; DS:BX -> point array + add si, bx ; DS:SI -> top point #2 + add bx, di ; DS:BX -> top point #1 + mov di, [ScanOffsetT] + call subScan ; Scan edge + mov [ScanOffsetT], di + mov si, [MinIdxT] + cmp si, [MaxIdx] ; End of edge? + jne @@STLoop ; No, continue + +;----------------- +; Scan bottom edge + mov ax, OFFSET mx_ScanBuffer + OFFSET Y2 + mov [ScanOffsetB], ax + mov si, [MinIdxB] ; Offset of bottom point index +@@SBLoop: + lds bx, [Map] ; DS:BX -> map table + mov di, ds:[bx+si] ; Index of bottom point #1 + inc si ; Next bottom point + inc si + cmp si, [Count] + jbe @@SB1 + xor si, si +@@SB1: + mov [MinIdxB], si ; Save new index of bottom point + mov si, ds:[bx+si] ; Get index of bottom point #2 + .shl di, 2 ; Convert indexes to offsets + .shl si, 2 + lds bx, [Points] ; DS:BX -> point array + add si, bx ; DS:SI -> top point #2 + add bx, di ; DS:BX -> top point #1 + mov di, [ScanOffsetB] + call subScan ; Scan edge + mov [ScanOffsetB], di + mov si, [MinIdxB] + cmp si, [MaxIdx] ; End of edge? + jne @@SBLoop ; No, continue + +;-------------------- +; Clip left and right + mov si, OFFSET mx_ScanBuffer + mov ax, [BoxX1] + mov cx, [BoxX2] + sub cx, ax ; CX = bounding box width + mov bx, [mx_ClipX1] + sub bx, ax + jle @@ClipL1 ; No need to clip left + sub cx, bx ; Update width + add ax, bx ; BoxX1 = mx_ClipX1 + mov [BoxX1], ax + .shl bx, 2 ; Warning!!! This is an hand-coded + add si, bx ; multiply by the size of TSCAN +@@ClipL1: + mov bx, ax + add bx, cx ; Last scan column + sub bx, [mx_ClipX2] + jle @@ClipL2 ; No need to clip right + sub cx, bx ; Clip right +@@ClipL2: + test cx, cx ; Is clipped width positive? + jle @@Exit ; No, exit + mov [ScanCount], cx ; Save number of columns to draw + mov [ScanOffsetT], si ; Remember offset of (clipped) buffer + mov ds, [mx_CodeSegment] ; DS:SI -> scan buffer + +;------------------------------ +; Check if Y clipping is needed + mov ax, [BoxY1] + cmp ax, [mx_ClipY1] + jl @@ClipTB ; Need to clip top + mov ax, [BoxY2] + cmp ax, [mx_ClipY2] + jg @@ClipTB ; Need to clip bottom + jmp @@ClipYExit ; Skip Y clipping + +;-------------------- +; Clip top and bottom +@@ClipTB: + mov di, cx ; DI = scan count + inc di ; Increment count for pre-loop test + sub si, SIZE TSCAN +@@ClipYLoop: + dec di ; Any column left? + jz @@ClipYExit ; No, exit + add si, SIZE TSCAN + mov ax, ds:[si].Y1 ; Y1 + mov cx, ds:[si].Y2 ; Y2 + mov dx, [mx_ClipY2] + cmp ax, dx ; Full clipped? + jg @@ClipYClip ; Yes, skip this column + cmp cx, dx ; Need to clip bottom? + jle @@ClipY1 ; No, continue +; Clip bottom + mov ds:[si].Y2, dx + mov bx, cx + sub bx, dx ; Clip distance + sub cx, ax ; Height + jle @@ClipYClip + mov cx, ds:[si].Y2 +@@ClipY1: + mov dx, [mx_ClipY1] + cmp cx, dx ; Full top clipped? + jl @@ClipYClip ; Yes, skip + sub cx, ax ; Get height + jle @@ClipYClip ; Skip if not positive + cmp ax, dx ; Need to clip top? + jge @@ClipYLoop ; No, continue +; Clip top + mov ds:[si].Y1, dx ; Y1 = mx_ClipY1 + sub dx, ax ; DX = number of pixels clipped + cmp cx, dx + ja @@ClipYLoop ; Not clipped, continue +@@ClipYClip: + mov ds:[si].Y1, -1 ; Mark column as clipped + jmp @@ClipYLoop +@@ClipYExit: + +;------------- +; Draw columns + mov es, [mx_VideoSegment] + mov si, [ScanOffsetT] + mov cl, BYTE PTR [BoxX1] ; Init write plane + and cl, 03h + mov al, 11h + shl al, cl + mov [WritePlane], al + .shr [BoxX1], 2 +@@DrawLoop: + mov ax, ds:[si].Y1 + test ax, ax ; Was column clipped? + js @@DrawNext ; Yes, skip + mov cx, ds:[si].Y2 + sub cx, ax ; CX = height + jle @@DrawNext + mul [mx_BytesPerLine] ; Get pixel address + add ax, [BoxX1] + mov di, ax + mov ah, [WritePlane] + mov dx, TS + mov al, 02h + out dx, ax + mov ax, [Color] + mov dx, [mx_BytesPerLine] + shr cx, 1 + jnc @@FillScan + mov es:[di], al + add di, dx + jcxz @@DrawNext +@@FillScan: + mov es:[di], al + add di, dx + mov es:[di], al + add di, dx + dec cx + jnz @@FillScan +@@DrawNext: + rol [WritePlane], 1 + adc [BoxX1], 0 ; Bump pointer to video memory if needed + add si, SIZE TSCAN + dec [ScanCount] + jnz @@DrawLoop + +@@Exit: + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE +mxFillPoly ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxpg.asm b/16/x/mxpg.asm new file mode 100755 index 00000000..caa7cf1b --- /dev/null +++ b/16/x/mxpg.asm @@ -0,0 +1,589 @@ +;----------------------------------------------------------- +; +; MXPG.ASM - Convex polygon fill with Gouraud shading +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxGouraudPoly + +;----------------------------------------------------------- +; +; "Local" definitions +; +TPOINT STRUC + X DW ? + Y DW ? +TPOINT ENDS + +; Do NOT change order! +TSCAN STRUC + Y1 DW ? + E1 DB ? + C1 DB ? + Y2 DW ? + E2 DB ? + C2 DB ? +TSCAN ENDS + +MAXSCANCOLUMNS EQU POLYSCANBUFSIZE / SIZE TSCAN + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_VideoSegment : WORD +EXTRN mx_CodeSegment : WORD +EXTRN mx_BytesPerLine : WORD +EXTRN mx_ClipX1 : WORD +EXTRN mx_ClipY1 : WORD +EXTRN mx_ClipX2 : WORD +EXTRN mx_ClipY2 : WORD +EXTRN mx_ScanBuffer : NEAR + +;----------------------------------------------------------- +; +; Scans an edge using the DDA (digital differential analyzer) algorithm. +; Also interpolates color for shading. +; +; Input: +; DS:BX = pointer to start point (X1, Y1) +; DS:SI = pointer to end point (X2, Y2) +; ES:DI = pointer to edge buffer +; DX = start color +; AX = end color +; Output: +; ES:DI = updated pointer to edge buffer +; Notes: +; must preserve DS:SI. +; +subScan PROC NEAR + mov cx, ds:[si].X + sub cx, ds:[bx].X ; Get width + jg @@1 + ret +@@1: + push bp ; Save BP + push di ; Save scan info offset + push cx ; Save height + push ax ; Save colors + push dx + + mov ax, ds:[si].Y + mov bx, ds:[bx].Y + sub ax, bx ; Get height + jg @@T2B ; Scan top to bottom + jl @@B2T ; Scan bottom to top + +; Special case: vertical line + mov ax, bx +@@V: + mov es:[di].Y1, ax + add di, SIZE TSCAN + dec cx + jnz @@V + jmp @@GetColorInfo + +; Scan top to bottom +@@T2B: + cwd + div cx + mov bp, ax + xor ax, ax + div cx + xchg ax, bx ; BP:BX = fixed 16:16 step + mov dx, 8000h +@@T2BLoop: + mov es:[di].Y1, ax + add di, SIZE TSCAN + add dx, bx + adc ax, bp + dec cx + jnz @@T2BLoop + jmp @@GetColorInfo + +; Scan bottom to top +@@B2T: + neg ax + cwd + div cx + mov bp, ax + xor ax, ax + div cx + xchg ax, bx + mov dx, 8000h +@@B2TLoop: + mov es:[di].Y1, ax + add di, SIZE TSCAN + sub dx, bx + sbb ax, bp + dec cx + jnz @@B2TLoop + +; Now get the color info +@@GetColorInfo: + pop bx ; Restore colors + pop ax + pop cx ; Height + pop di ; ES:DI -> scan info + + sub ax, bx ; Get color range + jg @@CL2R + jl @@CR2L + +; Special case: same color + mov ah, bl + mov al, 80h +@@CV: + mov WORD PTR es:[di].E1, ax + add di, SIZE TSCAN + dec cx + jnz @@CV + jmp @@Exit + +; Scan left to right +@@CL2R: + cwd + div cx + mov bp, ax + xor ax, ax + div cx + xchg ax, bx ; BP:BX = fixed 16:16 step + mov dx, 8000h +@@CL2RLoop: + mov es:[di].C1, al + mov es:[di].E1, dh + add di, SIZE TSCAN + add dx, bx + adc ax, bp + dec cx + jnz @@CL2RLoop + jmp @@Exit + +; Scan right to left +@@CR2L: + neg ax + cwd + div cx + mov bp, ax + xor ax, ax + div cx + xchg ax, bx + mov dx, 8000h + +@@CR2LLoop: + mov es:[di].C1, al + mov es:[di].E1, dh + add di, SIZE TSCAN + sub dx, bx + sbb ax, bp + dec cx + jnz @@CR2LLoop + +@@Exit: + pop bp + ret +subScan ENDP + +;----------------------------------------------------------- +; +; Fills a scan column. +; +; Input: +; DS:SI = current TSCAN +; ES:DI = address of top pixel +; CX = number of pixels to write +; DX = base color +; Output: +; none +; +subFillScan PROC NEAR + mov ax, WORD PTR ds:[si].E2 + mov bx, WORD PTR ds:[si].E1 + cmp ah, bh + jg @@L2R ; Color increases + jl @@R2L ; Color decreases + +; Special case: color doesn't change + add ax, dx + mov dx, [mx_BytesPerLine] +@@V: + mov es:[di], ah + add di, dx + dec cx + jnz @@V + ret + +; Color increases +@@L2R: + .push bp, si + mov si, bx + add si, dx ; Relocate color + sub ax, bx + xor dx, dx + div cx + mov bp, ax ; BP = color step, integer part + xor ax, ax + div cx + mov bx, ax ; BX = color step, fractional part + mov dx, 8000h + mov ax, [mx_BytesPerLine] + xchg si, ax +@@L2RLoop: + mov es:[di], ah + add dx, bx + adc ax, bp + add di, si + dec cx + jnz @@L2RLoop + .pop bp, si + ret + +; Color decreases +@@R2L: + .push bp, si + mov si, bx + add si, dx ; Relocate color + sub ax, bx + neg ax + xor dx, dx + div cx + mov bp, ax ; BP = color step, integer part + xor ax, ax + div cx + mov bx, ax ; BX = color step, fractional part + mov dx, 8000h + mov ax, [mx_BytesPerLine] + xchg si, ax +@@R2LLoop: + mov es:[di], ah + sub dx, bx + sbb ax, bp + add di, si + dec cx + jnz @@R2LLoop + .pop bp, si + ret +subFillScan ENDP + +;----------------------------------------------------------- +; +; Fills a convex polygon with the specified color. +; Interpolates pixel colors using the Gouraud algorithm. +; +; Input: +; Count = number of vertexes +; Map = indexes of points and colors (integer) +; Points = array of points (integer X, Y coordinates) +; Colors = array of colors (integer) +; Color = base color +; Output: +; none +; Notes: +; vertexes must be in counterclockwise order, arrays are 0-based. +; +mxGouraudPoly PROC FAR + ARG Color:WORD, \ + Colors:DWORD, \ + Points:DWORD, \ + Map:DWORD, \ + Count:WORD = ARG_SIZE + LOCAL WritePlane:BYTE:2, \ + ScanOffsetT:WORD, \ + ScanOffsetB:WORD, \ + ScanCount:WORD, \ + Holder:WORD, \ + Height:WORD, \ + MinIdxT:WORD, \ + MinIdxB:WORD, \ + MaxIdx:WORD, \ + Width:WORD, \ + BoxX1:WORD, \ + BoxY1:WORD, \ + BoxX2:WORD, \ + BoxY2::WORD = AUTO_SIZE + .enter AUTO_SIZE + .push ds, si, es, di + ASSUME ds:NOTHING + +; Check that at least three vertexes are specified + mov cx, [Count] + cmp cx, 3 + jb @@Exit + +;------------------------------ +; Find bounding box for polygon + les di, [Map] + lds si, [Points] ; Pointer to vertex array + mov [BoxX1], 32767 + mov [BoxX2], -32768 + mov [BoxY1], 32767 + mov [BoxY2], -32768 + + xor dx, dx +@@MinMaxLoop: + mov bx, es:[di] ; Get index of vertex + .shl bx, 2 ; Get offset in point array + add bx, si + +; Check X range +@@CheckMinX: + mov ax, ds:[bx].X ; Get X coordinate + cmp ax, [BoxX1] + jge @@CheckMaxX + mov [BoxX1], ax + mov [MinIdxT], dx + mov [MinIdxB], dx +@@CheckMaxX: + cmp ax, [BoxX2] + jle @@CheckMinY + mov [BoxX2], ax + mov [MaxIdx], dx + +; Check Y range +@@CheckMinY: + mov ax, ds:[bx].Y + cmp ax, [BoxY1] + jge @@CheckMaxY + mov [BoxY1], ax +@@CheckMaxY: + cmp ax, [BoxY2] + jle @@CheckDone + mov [BoxY2], ax + +; Repeat thru all points +@@CheckDone: + inc di ; Next map entry + inc di + inc dx + inc dx + dec cx + jnz @@MinMaxLoop + +;--------------------------------- +; Check if polygon is full clipped + mov ax, [BoxX2] + cmp ax, [mx_ClipX1] ; Is poly full clipped? + jl @@Exit + mov bx, [BoxX1] + cmp bx, [mx_ClipX2] ; Is poly full clipped? + jg @@Exit + sub ax, bx ; Get width + jle @@Exit ; Exit if not positive + mov ax, [BoxY2] + cmp ax, [mx_ClipY1] ; Is poly full clipped? + jl @@Exit + mov bx, [BoxY1] + cmp bx, [mx_ClipY2] ; Is poly full clipped? + jg @@Exit + sub ax, bx ; Get height + jle @@Exit ; Exit if not positive + + dec [Count] + shl [Count], 1 ; We'll work with word offsets + mov es, [mx_CodeSegment] + +;-------------- +; Scan top edge + mov ax, OFFSET mx_ScanBuffer + mov [ScanOffsetT], ax + mov si, [MinIdxT] ; Offset of bottom point index +@@STLoop: + lds bx, [Map] ; DS:BX -> map table + mov di, ds:[bx+si] ; Index of top point #1 + dec si ; Next point + dec si + test si, si + jnl @@ST1 + mov si, [Count] +@@ST1: + mov [MinIdxT], si ; Save new index of top point + mov si, ds:[bx+si] ; Get index of top point #2 + lds bx, [Colors] ; Get pointer to color array + shl di, 1 ; Convert indexes to offsets + shl si, 1 + mov ax, ds:[bx+si] ; Get colors + mov dx, ds:[bx+di] + lds bx, [Points] ; DS:BX -> point array + shl si, 1 + shl di, 1 + add si, bx ; DS:SI -> top point #2 + add bx, di ; DS:BX -> top point #1 + mov di, [ScanOffsetT] + call subScan ; Scan edge + mov [ScanOffsetT], di + mov si, [MinIdxT] + cmp si, [MaxIdx] ; End of edge? + jne @@STLoop ; No, continue + +;----------------- +; Scan bottom edge + mov ax, OFFSET mx_ScanBuffer + OFFSET Y2 + mov [ScanOffsetB], ax + mov si, [MinIdxB] ; Offset of bottom point index +@@SBLoop: + lds bx, [Map] ; DS:BX -> map table + mov di, ds:[bx+si] ; Index of bottom point #1 + inc si ; Next bottom point + inc si + cmp si, [Count] + jbe @@SB1 + xor si, si +@@SB1: + mov [MinIdxB], si ; Save new index of bottom point + mov si, ds:[bx+si] ; Get index of bottom point #2 + lds bx, [Colors] ; Get pointer to color array + shl di, 1 ; Convert indexes to offsets + shl si, 1 + mov ax, ds:[bx+si] ; Get colors + mov dx, ds:[bx+di] + lds bx, [Points] ; DS:BX -> point array + shl si, 1 + shl di, 1 + add si, bx ; DS:SI -> top point #2 + add bx, di ; DS:BX -> top point #1 + mov di, [ScanOffsetB] + call subScan ; Scan edge + mov [ScanOffsetB], di + mov si, [MinIdxB] + cmp si, [MaxIdx] ; End of edge? + jne @@SBLoop ; No, continue + +;-------------------- +; Clip left and right + mov si, OFFSET mx_ScanBuffer + mov ax, [BoxX1] + mov cx, [BoxX2] + sub cx, ax ; CX = bounding box width + mov bx, [mx_ClipX1] + sub bx, ax + jle @@ClipL1 ; No need to clip left + sub cx, bx ; Update width + add ax, bx ; BoxX1 = mx_ClipX1 + mov [BoxX1], ax + .shl bx, 3 ; Warning!!! This is an hand-coded + add si, bx ; multiply by the size of TSCAN +@@ClipL1: + mov bx, ax + add bx, cx ; Last scan column + sub bx, [mx_ClipX2] + jle @@ClipL2 ; No need to clip right + sub cx, bx ; Clip right +@@ClipL2: + test cx, cx ; Is clipped width positive? + jle @@Exit ; No, exit + mov [ScanCount], cx ; Save number of columns to draw + mov [ScanOffsetT], si ; Remember offset of (clipped) buffer + mov ds, [mx_CodeSegment] ; DS:SI -> scan buffer + +;------------------------------ +; Check if Y clipping is needed + mov ax, [BoxY1] + cmp ax, [mx_ClipY1] + jl @@ClipTB ; Need to clip top + mov ax, [BoxY2] + cmp ax, [mx_ClipY2] + jg @@ClipTB ; Need to clip bottom + jmp @@ClipYExit ; Skip Y clipping + +;-------------------- +; Clip top and bottom +@@ClipTB: + mov di, cx ; DI = scan count + inc di ; Increment count for pre-loop test + sub si, SIZE TSCAN +@@ClipYLoop: + dec di ; Any column left? + jz @@ClipYExit ; No, exit + add si, SIZE TSCAN + mov ax, ds:[si].Y1 ; Y1 + mov cx, ds:[si].Y2 ; Y2 + mov dx, [mx_ClipY2] + cmp ax, dx ; Full clipped? + jg @@ClipYClip ; Yes, skip this column + cmp cx, dx ; Need to clip bottom? + jle @@ClipY1 ; No, continue +; Clip bottom, need to scale colors too + mov ds:[si].Y2, dx + mov bx, cx + sub bx, dx ; Clip distance + sub cx, ax ; Height + jle @@ClipYClip + mov ax, WORD PTR ds:[si].E1 + sub ax, WORD PTR ds:[si].E2 + imul bx + idiv cx + add WORD PTR ds:[si].E2, ax + mov ax, ds:[si].Y1 ; Restore AX and CX + mov cx, ds:[si].Y2 +@@ClipY1: + mov dx, [mx_ClipY1] + cmp cx, dx ; Full top clipped? + jl @@ClipYClip ; Yes, skip + sub cx, ax ; Get height + jle @@ClipYClip ; Skip if not positive + cmp ax, dx ; Need to clip top? + jge @@ClipYLoop ; No, continue +; Clip top, need to scale colors too + mov ds:[si].Y1, dx ; Y1 = mx_ClipY1 + sub dx, ax ; DX = number of pixels clipped + cmp cx, dx + jbe @@ClipYClip ; Full clipped, skip + mov ax, WORD PTR ds:[si].E2 + sub ax, WORD PTR ds:[si].E1 ; AX = color distance + imul dx + idiv cx + add WORD PTR ds:[si].E1, ax ; Update starting color + jmp @@ClipYLoop +@@ClipYClip: + mov ds:[si].Y1, -1 ; Mark column as clipped + jmp @@ClipYLoop +@@ClipYExit: + +;------------- +; Draw columns + mov es, [mx_VideoSegment] + mov si, [ScanOffsetT] + mov cl, BYTE PTR [BoxX1] ; Init write plane + and cl, 03h + mov al, 11h + shl al, cl + mov [WritePlane], al + .shr [BoxX1], 2 + mov ax, [Color] ; Make 8:8 fixed color + mov ah, al + xor al, al + mov [Color], ax +@@DrawLoop: + mov ax, ds:[si].Y1 + test ax, ax ; Was column clipped? + js @@DrawNext ; Yes, skip + mov cx, ds:[si].Y2 + sub cx, ax ; CX = height + jle @@DrawNext + mul [mx_BytesPerLine] ; Get pixel address + add ax, [BoxX1] + mov di, ax + mov ah, [WritePlane] + mov al, 02h + mov dx, TS + out dx, ax + mov dx, [Color] + call subFillScan +@@DrawNext: + rol [WritePlane], 1 + adc [BoxX1], 0 ; Bump pointer to video memory if needed + add si, SIZE TSCAN + dec [ScanCount] + jnz @@DrawLoop + +@@Exit: + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE +mxGouraudPoly ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxpi.asm b/16/x/mxpi.asm new file mode 100755 index 00000000..9e8525f5 --- /dev/null +++ b/16/x/mxpi.asm @@ -0,0 +1,267 @@ +;----------------------------------------------------------- +; +; MXPI.ASM - Put image +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxPutImage + +EXTRN subClipImage : NEAR + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_VideoSegment : WORD +EXTRN mx_BytesPerLine : WORD + +mxTable LABEL WORD ; Raster ops + DW subMove + DW subAnd + DW subOr + DW subXor + DW subTrans + DW subAdd + +;----------------------------------------------------------- +; +; Move functions. +; Note: loops unrolled and optimized for CX even, no check for CX = 0. +; +subMove PROC NEAR + shr cx, 1 ; Make CX even + jc @@Odd ; Special case if odd byte +@@Loop: movsb + add si, 3 + movsb + add si, 3 + dec cx + jnz @@Loop +@@Exit: ret +@@Odd: movsb + add si, 3 + jcxz @@Exit + jmp @@Loop +subMove ENDP +; +subAnd PROC NEAR + shr cx, 1 + jc @@Odd +@@Loop: mov al, ds:[si] + mov ah, ds:[si+4] + and es:[di], ax + inc di + inc di + add si, 8 + dec cx + jnz @@Loop +@@Exit: ret +@@Odd: lodsb + and es:[di], al + inc di + add si, 3 + jcxz @@Exit + jmp @@Loop +subAnd ENDP +; +subOr PROC NEAR + shr cx, 1 + jc @@Odd +@@Loop: mov al, ds:[si] + mov ah, ds:[si+4] + or es:[di], ax + inc di + inc di + add si, 8 + dec cx + jnz @@Loop +@@Exit: ret +@@Odd: lodsb + or es:[di], al + inc di + add si, 3 + jcxz @@Exit + jmp @@Loop +subOr ENDP +; +subXor PROC NEAR + shr cx, 1 + jc @@Odd +@@Loop: mov al, ds:[si] + mov ah, ds:[si+4] + xor es:[di], ax + inc di + inc di + add si, 8 + dec cx + jnz @@Loop +@@Exit: ret +@@Odd: lodsb + xor es:[di], al + inc di + add si, 3 + jcxz @@Exit + jmp @@Loop +subXor ENDP +; +subTrans PROC NEAR +@@Loop: mov al, ds:[si] + cmp al, ah + je @@Skip + mov es:[di], al +@@Skip: inc di + add si, 4 + dec cx + jnz @@Loop +@@Exit: ret +subTrans ENDP +; +subAdd PROC NEAR +@@Loop: mov al, ds:[si] + add es:[di], al + inc di + add si, 4 + dec cx + jnz @@Loop + ret +subAdd ENDP + +;----------------------------------------------------------- +; +; Copies a "raw" image from memory to screen. +; +; Input: +; Image = pointer to image +; X, Y = coordinates of destination +; Width = width of image in pixels +; Height = height of image in pixels +; Op = raster op (OP_xxx) +; Output: +; none +; +mxPutImage PROC FAR + ARG Op:WORD, \ + Height:WORD, \ + Width:WORD, \ + Y:WORD, \ + X:WORD, \ + Image:DWORD = ARG_SIZE + LOCAL PlaneWidth:WORD:4, \ + PixelOffset:WORD, \ + MoveFunction:WORD, \ + Count:BYTE, \ + ReadPlane:BYTE, \ + OpInfo:BYTE, \ + WritePlane:BYTE = AUTO_SIZE + ASSUME ds:NOTHING + .enter AUTO_SIZE + .push ds, si, es, di + +; Clip image + mov bx, [X] + mov ax, [Y] + mov cx, [Width] + mov dx, [Height] + call subClipImage + jc @@Exit ; Full clipped + mov [Height], dx + add WORD PTR Image[0], si ; Skip clipped pixels + +; Get pixel address + mul [mx_BytesPerLine] + mov di, bx + shr di, 1 + shr di, 1 + add di, ax + mov [PixelOffset], di + mov es, [mx_VideoSegment] ; ES:DI points to pixel + and bl, 03h + mov [ReadPlane], bl + +; Compute extra bytes and width count for each plane + mov bx, cx + shr bx, 1 + shr bx, 1 ; Width for each plane + and cl, 03h + mov al, 00001000b + shr al, cl + mov si, 3 SHL 1 +@@PatchLoop: + mov PlaneWidth[si], bx + shr al, 1 + adc bx, 0 + dec si + dec si + jge @@PatchLoop + +; Setup planes for output to VGA registers + mov cl, [ReadPlane] + mov al, 00010001b + shl al, cl + mov [WritePlane], al + +; Install move function + mov bx, [Op] + mov [OpInfo], bh ; Remember additional info if needed + xor bh, bh + cmp bl, OP_ADD + jbe @@SetMoveFunction + xor bl, bl +@@SetMoveFunction: + shl bx, 1 + mov ax, mxTable[bx] + mov [MoveFunction], ax + +; Put image + cld + mov [Count], 4 ; Four planes + lea bx, PlaneWidth ; SS:[BX] = width in bytes for plane + mov ds, WORD PTR Image[2] +@@PlaneLoop: + cmp WORD PTR ss:[bx], 0 ; Exit if nothing more to do + je @@Exit ; (also, never try to move zero bytes!) + mov si, WORD PTR Image[0] + mov ah, [WritePlane] + and ah, 0Fh + mov al, 02h + mov dx, TS + out dx, ax ; Select write plane + mov ah, [ReadPlane] + and ah, 03h + mov al, 04h + mov dx, GDC + out dx, ax ; Select read plane + mov dx, [Height] + mov di, [PixelOffset] +@@Loop: + push si + push di + mov cx, WORD PTR ss:[bx] ; Number of bytes to move + mov ah, [OpInfo] ; Transparent color for subTrans + call [MoveFunction] + pop di + pop si + add si, [Width] ; Go to next image line + add di, [mx_BytesPerLine] ; Go to next screen row + dec dx + jnz @@Loop ; Repeat for all lines + inc bx + inc bx ; Select width for next plane + inc [ReadPlane] + rol [WritePlane], 1 + adc [PixelOffset], 0 + inc WORD PTR Image[0] + dec [Count] + jnz @@PlaneLoop ; Repeat for all planes + +@@Exit: + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE +mxPutImage ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxpn.asm b/16/x/mxpn.asm new file mode 100755 index 00000000..eaaf61b4 --- /dev/null +++ b/16/x/mxpn.asm @@ -0,0 +1,60 @@ +;----------------------------------------------------------- +; +; MXPN.ASM - Panning function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxPan + +EXTRN mxWaitDisplay : FAR +EXTRN mxStartAddress : FAR + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD + +;----------------------------------------------------------- +; +; Moves the screen. +; +; Input: +; X, Y = new X, Y coordinates of view screen +; Output: +; none +; +mxPan PROC FAR + ARG Y:WORD, \ + X:WORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + + mov ax, [Y] + mul [mx_BytesPerLine] + mov dx, [X] + shr dx, 1 + shr dx, 1 + add ax, dx + push ax ; Push the start address + call mxWaitDisplay + call mxStartAddress + + mov dx, 03DAh ; Set the pixel pan register + in al, dx + mov dx, 03C0h + mov al, 33h + out dx, al + mov al, BYTE PTR [X] + and al, 3 + shl al, 1 + out dx, al + + xor ax, ax + .leave ARG_SIZE +mxPan ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxpp.asm b/16/x/mxpp.asm new file mode 100755 index 00000000..fc1755a3 --- /dev/null +++ b/16/x/mxpp.asm @@ -0,0 +1,121 @@ +;----------------------------------------------------------- +; +; MXPP.ASM - Get/put pixel functions +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxGetPixel +PUBLIC mxPutPixel + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD +EXTRN mx_VideoSegment : WORD +EXTRN mx_ClipX1 : WORD +EXTRN mx_ClipY1 : WORD +EXTRN mx_ClipX2 : WORD +EXTRN mx_ClipY2 : WORD + +;----------------------------------------------------------- +; +; Gets a pixel. +; +; Input: +; X, Y = pixel coordinates +; Output: +; pixel color +; +mxGetPixel PROC FAR + ARG Y:WORD, \ + X:WORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds, si + + xor ax, ax + mov si, [X] + cmp si, [mx_ClipX1] + jl @@Exit + cmp si, [mx_ClipX2] + jg @@Exit + mov bx, [Y] + cmp bx, [mx_ClipY1] + jl @@Exit + cmp bx, [mx_ClipY2] + jg @@Exit + + mov al, 04h ; Set read plane + mov ah, BYTE PTR [X] + and ah, 3 + mov dx, GDC + out dx, ax + + mov ds, [mx_VideoSegment] + mov ax, bx + mul [mx_BytesPerLine] + .shr si, 2 + add si, ax + + mov al, ds:[si] ; Get pixel value + xor ah, ah + +@@Exit: + .pop ds, si + .leave ARG_SIZE +mxGetPixel ENDP + +;----------------------------------------------------------- +; +; Puts a pixel of the specified color. +; +; Input: +; X, Y = pixel coordinates +; Color = pixel color +; Output: +; none +; +mxPutPixel PROC FAR + ARG Color:BYTE:2, \ + Y:WORD, \ + X:WORD = ARG_SIZE + .enter 0 + .push ds, si + + mov si, [X] + cmp si, [mx_ClipX1] + jl @@Exit + cmp si, [mx_ClipX2] + jg @@Exit + mov ax, [Y] + cmp ax, [mx_ClipY1] + jl @@Exit + cmp ax, [mx_ClipY2] + jg @@Exit + + mov ds, [mx_VideoSegment] + mul [mx_BytesPerLine] + .shr si, 2 + add si, ax + + mov cl, BYTE PTR [X] ; Set write plane + and cl, 3 + mov ax, 0102h + shl ah, cl + mov dx, TS + out dx, ax + + mov al, [Color] ; Write pixel + mov ds:[si], al + +@@Exit: + xor ax, ax + .pop ds, si + .leave ARG_SIZE +mxPutPixel ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxra.asm b/16/x/mxra.asm new file mode 100755 index 00000000..dd8e6839 --- /dev/null +++ b/16/x/mxra.asm @@ -0,0 +1,37 @@ +;----------------------------------------------------------- +; +; MXRA.ASM - Row address +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxRowAddress + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Sets the row address register. +; +; Input: +; RowAddress = row size in words +; Output: +; none +; +mxRowAddress PROC FAR + ARG RowAddress:BYTE:2 = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + mov dx, CRTC + mov al, 13h + mov ah, [RowAddress] + out dx, ax + xor ax, ax + .leave ARG_SIZE +mxRowAddress ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxrp.asm b/16/x/mxrp.asm new file mode 100755 index 00000000..de820c16 --- /dev/null +++ b/16/x/mxrp.asm @@ -0,0 +1,101 @@ +;----------------------------------------------------------- +; +; MXRP.ASM - Rotate palette function +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxRotatePalette + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Rotates the palette of the specified number of colors. +; +; Input: +; Palette = pointer to palette +; Count = number of colors to rotate +; Step = step size +; Output: +; none +; +; Note: if Step is positive palette is rotated left to right, otherwise +; right to left. +; +mxRotatePalette PROC FAR + ARG Step:WORD, \ + Count:WORD, \ + Palette:DWORD = ARG_SIZE + LOCAL Holder:BYTE:768 = AUTO_SIZE + ASSUME ds:NOTHING + .enter AUTO_SIZE + .push ds, si, es, di + + mov bx, [Count] + add bx, bx + add bx, [Count] ; BX = Count*3 + + lds si, [Palette] ; DS:SI -> palette + push ss + pop es + lea di, Holder ; ES:DI -> local space + cld + + mov ax, [Step] + mov dx, ax + test ax, ax + jz @@Exit ; Nothing to do, exit + jl @@RightToLeft + +@@LeftToRight: + add ax, ax + add dx, ax ; DX = Step*3 + sub bx, dx ; BX = (Count-Step)*3 + add si, bx + push si + mov cx, dx + rep movsb + mov es, WORD PTR Palette[2] + mov di, si + dec di ; ES:DI -> last byte of palette + pop si + dec si + mov cx, bx + std + rep movsb + push ss + pop ds + lea si, Holder + les di, [Palette] + mov cx, dx + cld + rep movsb + jmp @@Exit + +@@RightToLeft: + add ax, ax + add dx, ax + neg dx ; DX = Step*3 + sub bx, dx ; BX = (Count-Step)*3 + mov cx, dx + rep movsb + les di, [Palette] + mov cx, bx + rep movsb + push ss + pop ds + lea si, Holder + mov cx, dx + rep movsb + +@@Exit: + .pop ds, si, es, di + .leave ARG_SIZE +mxRotatePalette ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxsa.asm b/16/x/mxsa.asm new file mode 100755 index 00000000..3ebae67d --- /dev/null +++ b/16/x/mxsa.asm @@ -0,0 +1,44 @@ +;----------------------------------------------------------- +; +; MXSA.ASM - Start address function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxStartAddress + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Modifies the starting address of video memory. +; +; Input: +; StartAddr = new start address of video memory +; Output: +; none +; +mxStartAddress PROC FAR + ARG StartAddr:WORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + + mov bx, [StartAddr] + mov dx, CRTC + mov al, 0Ch ; Linear Starting Address high + mov ah, bh + cli + out dx, ax + mov al, 0Dh ; Linear Starting Address low + mov ah, bl + out dx, ax + sti + + .leave ARG_SIZE +mxStartAddress ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxsc.asm b/16/x/mxsc.asm new file mode 100755 index 00000000..bcae45e6 --- /dev/null +++ b/16/x/mxsc.asm @@ -0,0 +1,50 @@ +;----------------------------------------------------------- +; +; MXSC.ASM - Set color function +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxSetColor + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Updates the selected DAC register. +; +; Input: +; Index = index of color to set +; R, G, B = color components +; Output: +; none +; +mxSetColor PROC FAR + ARG B:BYTE:2, \ + G:BYTE:2, \ + R:BYTE:2, \ + Index:WORD = ARG_SIZE + .enter 0 + .push ds, si + + mov ax, [Index] + mov dx, 3C8h ; PEL write address register + out dx, al + inc dx + + mov al, [R] + out dx, al + mov al, [G] + out dx, al + mov al, [B] + out dx, al + + .pop ds, si + .leave ARG_SIZE +mxSetColor ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxsi.asm b/16/x/mxsi.asm new file mode 100755 index 00000000..b88d3b11 --- /dev/null +++ b/16/x/mxsi.asm @@ -0,0 +1,317 @@ +;----------------------------------------------------------- +; +; MXPI.ASM - Stretch image +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxStretchImage + +EXTRN subClipBox : NEAR + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_VideoSegment : WORD +EXTRN mx_BytesPerLine : WORD + +mxTable LABEL WORD ; Raster ops + DW subMove + DW subAnd + DW subOr + DW subXor + DW subTrans + DW subAdd + +;----------------------------------------------------------- +; +; Stretches and copies a "raw" image from memory to screen. +; +; Input: +; Image = pointer to image +; X, Y = coordinates of destination +; Width = width of image in pixels +; Height = height of image in pixels +; NewWidth = new width of image in pixels +; NewHeight = new height of image in pixels +; Op = raster op (OP_xxx) +; Output: +; none +; +mxStretchImage PROC FAR + ARG Op:WORD, \ + NewHeight:WORD, \ + NewWidth:WORD, \ + Height:WORD, \ + Width:WORD, \ + Y:WORD, \ + X:WORD, \ + Image:DWORD = ARG_SIZE + LOCAL PixelOffset:WORD, \ + MoveFunction:WORD, \ + ReadPlane:BYTE, \ + OpInfo:BYTE, \ + WidthStep:DWORD, \ + HeightStep:DWORD, \ + ImageLo:WORD, \ + WritePlane:BYTE = AUTO_SIZE + ASSUME ds:NOTHING + .enter AUTO_SIZE + .push ds, si, es, di + +; Get width stretch factor + IF USE386 EQ TRUE + movzx edx, [Width] + xor eax, eax + movzx ebx, [NewWidth] + shl ebx, 16 + idiv ebx + mov [WidthStep], eax + ELSE + xor dx, dx ; Width stretch factor + mov ax, [Width] + mov bx, [NewWidth] + div bx + mov WORD PTR WidthStep[2], ax + xor ax, ax + div bx + mov WORD PTR WidthStep[0], ax + ENDIF +; Get height stretch factor + IF USE386 EQ TRUE + movzx edx, [Height] + xor eax, eax + movzx ebx, [NewHeight] + shl ebx, 16 + idiv ebx + mov [HeightStep], eax + ELSE + xor dx, dx + mov ax, [Height] + mov bx, [NewHeight] + div bx + mov WORD PTR HeightStep[2], ax + xor ax, ax + div bx + mov WORD PTR HeightStep[0], ax + ENDIF + +; Clip image + mov bx, [X] + mov ax, [Y] + mov cx, [NewWidth] + mov dx, [NewHeight] + call subClipBox + jc @@Exit ; Full clipped + mov [NewWidth], cx + mov [NewHeight], dx + sub [X], bx + sub [Y], ax + +; Get pixel address + mul [mx_BytesPerLine] + mov di, bx + shr di, 1 + shr di, 1 + add di, ax + mov [PixelOffset], di + mov es, [mx_VideoSegment] ; ES:DI points to pixel + and bl, 03h + mov [ReadPlane], bl ; Set read plane + mov cl, bl + mov al, 00010001b + shl al, cl + mov [WritePlane], al ; Set write plane + +; Relocate image origin if previously clipped + mov ax, [Y] + test ax, ax + jz @@OriginYDone + IF USE386 EQ TRUE + shl eax, 16 + imul [HeightStep] + mov ax, [Width] + mul dx + ELSE + mov bx, ax + mul WORD PTR HeightStep[0] + mov cx, dx + mov ax, bx + mul WORD PTR HeightStep[2] + add ax, cx + mul [Width] + ENDIF + add WORD PTR [Image], ax +@@OriginYDone: + mov ax, [X] + test ax, ax + jz @@OriginXDone + IF USE386 EQ TRUE + shl eax, 16 + imul [WidthStep] + add WORD PTR [Image], dx + ELSE + mov bx, ax + mul WORD PTR WidthStep[0] + mov cx, dx + mov ax, bx + mul WORD PTR WidthStep[2] + add ax, cx + add WORD PTR [Image], ax + ENDIF +@@OriginXDone: + mov ax, WORD PTR HeightStep[2] + mul [Width] + mov WORD PTR HeightStep[2], ax + +; Install move function + mov bx, [Op] + mov [OpInfo], bh ; Remember additional info if needed + xor bh, bh + cmp bl, OP_ADD + jbe @@SetMoveFunction + xor bl, bl +@@SetMoveFunction: + shl bx, 1 + mov ax, mxTable[bx] + mov [MoveFunction], ax + +; Put image + mov ds, WORD PTR Image[2] + xor ax, ax + mov [ImageLo], ax +@@Loop: + mov si, WORD PTR Image[0] ; Get pointer to image + mov ah, [WritePlane] + and ah, 0Fh + mov al, 02h + mov dx, TS + out dx, ax ; Select write plane + mov ah, [ReadPlane] + and ah, 03h + mov al, 04h + mov dx, GDC + out dx, ax ; Select read plane + mov cx, [NewHeight] + mov di, [PixelOffset] ; ES:DI points to video memory + mov ah, [OpInfo] ; Additional raster op info + xor bx, bx + mov dx, [mx_BytesPerLine] + call [MoveFunction] ; Draw column + inc [ReadPlane] ; Next read plane + rol [WritePlane], 1 ; Next write plane + adc [PixelOffset], 0 ; Update video offset if needed + mov dx, WORD PTR WidthStep[0] + mov ax, WORD PTR WidthStep[2] + add [ImageLo], dx + adc WORD PTR Image[0], ax ; Next image column + dec [NewWidth] + jnz @@Loop ; Repeat for all columns + +@@Exit: + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE + +;----------------------------------------------------------- +; +; Move functions, on entry: +; AH = additional raster op info (e.g. transparent color) +; BX = 0, +; CX = pixel count, +; DX = mx_BytesPerLine. +; +subMove PROC NEAR +@@Loop: mov al, ds:[si] + mov es:[di], al + add di, dx + dec cx + jz @@Exit + add si, WORD PTR HeightStep[2] + add bx, WORD PTR HeightStep[0] + jnc @@Loop + add si, [Width] + jmp @@Loop +@@Exit: ret +subMove ENDP +; +subAnd PROC NEAR +@@Loop: mov al, ds:[si] + and es:[di], al + add di, dx + dec cx + jz @@Exit + add si, WORD PTR HeightStep[2] + add bx, WORD PTR HeightStep[0] + jnc @@Loop + add si, [Width] + jmp @@Loop +@@Exit: ret +subAnd ENDP +; +subOr PROC NEAR +@@Loop: mov al, ds:[si] + or es:[di], al + add di, dx + dec cx + jz @@Exit + add si, WORD PTR HeightStep[2] + add bx, WORD PTR HeightStep[0] + jnc @@Loop + add si, [Width] + jmp @@Loop +@@Exit: ret +subOr ENDP +; +subXor PROC NEAR +@@Loop: mov al, ds:[si] + xor es:[di], al + add di, dx + dec cx + jz @@Exit + add si, WORD PTR HeightStep[2] + add bx, WORD PTR HeightStep[0] + jnc @@Loop + add si, [Width] + jmp @@Loop +@@Exit: ret +subXor ENDP +; +subTrans PROC NEAR +@@Loop: mov al, ds:[si] + cmp al, ah + je @@Skip + mov es:[di], al +@@Skip: + add di, dx + dec cx + jz @@Exit + add si, WORD PTR HeightStep[2] + add bx, WORD PTR HeightStep[0] + jnc @@Loop + add si, [Width] + jmp @@Loop +@@Exit: ret +subTrans ENDP +; +subAdd PROC NEAR +@@Loop: mov al, ds:[si] + add es:[di], al + add di, dx + dec cx + jz @@Exit + add si, WORD PTR HeightStep[2] + add bx, WORD PTR HeightStep[0] + jnc @@Loop + add si, [Width] + jmp @@Loop +@@Exit: ret +subAdd ENDP + +mxStretchImage ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxsl.asm b/16/x/mxsl.asm new file mode 100755 index 00000000..d7908855 --- /dev/null +++ b/16/x/mxsl.asm @@ -0,0 +1,62 @@ +;----------------------------------------------------------- +; +; MXLN.ASM - Start line function +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxStartLine + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD + +;----------------------------------------------------------- +; +; Changes the video start address to the specified line. +; +; Input: +; Line = new start line +; Output: +; none +; +mxStartLine PROC FAR + ARG Line:WORD = ARG_SIZE + .enter 0 + ASSUME ds:NOTHING + + mov ax, [Line] ; Get video offset + mul [mx_BytesPerLine] + xchg ax, bx ; Copy it into BX + +; Wait display + mov dx, STATUS +@@1: in al, dx + test al, 08h + jnz @@1 + +; Set starting address + mov dx, CRTC + mov al, 0Ch ; Linear Starting Address high + mov ah, bh + cli + out dx, ax + mov al, 0Dh ; Linear Starting Address low + mov ah, bl + out dx, ax + sti + +; Wait retrace + mov dx, STATUS +@@2: in al,dx + test al, 08h + jz @@2 + + xor ax, ax + .leave ARG_SIZE +MX_TEXT ENDS +END diff --git a/16/x/mxsm.asm b/16/x/mxsm.asm new file mode 100755 index 00000000..183fba1e --- /dev/null +++ b/16/x/mxsm.asm @@ -0,0 +1,508 @@ +;----------------------------------------------------------- +; +; MXSM.ASM - Set/change mode functions +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxChangeMode +PUBLIC mxGetAspect +PUBLIC mxGetScreenSize +PUBLIC mxSetMode + +PUBLIC mx_ScreenWidth +PUBLIC mx_ScreenHeight +PUBLIC mx_BytesPerLine + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mxSetSysClipRegion : FAR + +EXTRN mx_VideoSegment : WORD +EXTRN mx_CodeSegment : WORD + +mx_ScreenWidth DW ? ; Current screen width +mx_ScreenHeight DW ? +mx_AspectX DW ? ; Aspect ratio for current mode +mx_AspectY DW ? +mx_BytesPerLine DW 0 ; Bytes per line + +; +; Tables for setting video modes, sources: +; - MODEX.ASM, Matt Pritchard +; - Dr. Dobb's Journal, Michael Abrash +; - Fractint VIDEO.ASM module +; +TBL_SingleLine LABEL WORD ; CRTC + DW 04009h ; Cell height: 1 scan line + DW 00014h ; Double word mode off + DW 0E317h ; Byte mode on + DW 0 +TBL_DoubleLine LABEL WORD ; CRTC + DW 04109h ; Cell height: 2 scan lines + DW 00014h + DW 0E317h + DW 0 +TBL_Width320 LABEL WORD ; CRTC + DW 05F00h ; Horizontal total + DW 04F01h ; Horizontal displayed + DW 05002h ; Start horizontal blanking + DW 08203h ; End horizontal blanking + DW 05404h ; Start horizontal sync + DW 08005h ; End horizontal sync + DW 02813h ; Row address + DW 0 +TBL_Width360 LABEL WORD ; CRTC + DW 06B00h ; Horizontal total + DW 05901h ; Horizontal displayed + DW 05A02h ; Start horizontal blanking + DW 08E03h ; End horizontal blanking + DW 05E04h ; Start horizontal sync + DW 08A05h ; End horizontal sync + DW 02D13h ; Row address + DW 0 +TBL_Height175 LABEL WORD ; CRTC + DW 0BF06h ; Vertical total + DW 01F07h ; Overflow + DW 08310h ; Start vertical sync + DW 08511h ; End vertical sync + DW 05D12h ; Vertical displayed + DW 06315h ; Start vertical blanking + DW 0BA16h ; End vertical blanking + DW 0 +TBL_Height200 LABEL WORD ; CRTC + DW 0BF06h ; Vertical total + DW 01F07h ; Overflow + DW 09C10h ; Start vertical sync + DW 08E11h ; End vertical sync + DW 08F12h ; Vertical displayed + DW 09615h ; Start vertical blanking + DW 0B916h ; End vertical blanking + DW 0 +TBL_Height240 LABEL WORD ; CRTC + DW 00D06h ; Vertical total + DW 03E07h ; Overflow + DW 0EA10h ; Start vertical sync + DW 08C11h ; End vertical sync + DW 0DF12h ; Vertical displayed + DW 0E715h ; Start vertical blanking + DW 00616h ; End vertical blanking + DW 0 +TBL_Tweak400x600: + DW 07400h + DW 06301h + DW 06402h + DW 09703h + DW 06804h + DW 09505h + DW 08606h + DW 0F007h + DW 06009h + DW 0310Fh + DW 05B10h + DW 08D11h + DW 05712h + DW 03213h + DW 00014h + DW 06015h + DW 08016h + DW 0E317h + DW 0 + +TBL_320x200: + DB 63h ; 400 scan lines, 25 MHz clock + DW 6, 5 ; Aspect: 6/5 = 1.2:1 + DW 320, 200 ; Size + DW TBL_Width320, TBL_Height200, TBL_DoubleLine, 0 + DW 819 ; Max height +TBL_320x240: + DB 0E3h ; 400 scan lines, 25 MHz clock + DW 1, 1 ; Aspect: 1/1 = 1:1 + DW 320, 240 ; Size + DW TBL_Width320, TBL_Height240, TBL_DoubleLine, 0 + DW 819 ; Max height +TBL_320x400: + DB 63h ; 480 scan lines, 25 MHz clock + DW 6, 10 ; Aspect: 6/10 = 0.6:1 + DW 320, 400 ; Size + DW TBL_Width320, TBL_Height200, TBL_SingleLine, 0 + DW 819 ; Max height +TBL_320x480: + DB 0E3h ; 480 scan lines, 25 MHz clock + DW 1, 2 ; Aspect: 1/2 = 0.5:1 + DW 320, 480 ; Size + DW TBL_Width320, TBL_Height240, TBL_SingleLine, 0 + DW 819 ; Max height +TBL_360x200: + DB 067h ; 400 scan lines, 28 MHz clock + DW 27, 20 ; Aspect: 27/20 = 1.35:1 + DW 360, 200 ; Size + DW TBL_Width360, TBL_Height200, TBL_DoubleLine, 0 + DW 728 ; Max height +TBL_360x240: + DB 0E7h ; 480 scan lines, 28 MHz clock + DW 9, 8 ; Aspect: 9/8 = 1.125:1 + DW 360, 240 ; Size + DW TBL_Width360, TBL_Height240, TBL_DoubleLine, 0 + DW 728 ; Max height +TBL_360x400: + DB 067h ; 400 scan lines, 28 MHz clock + DW 27, 40 ; Aspect: 27/40 = 0.675:1 + DW 360, 400 ; Size + DW TBL_Width360, TBL_Height200, TBL_SingleLine, 0 + DW 728 ; Max height +TBL_360x480: + DB 0E7h ; 480 scan lines, 28 MHz clock + DW 9, 16 ; Aspect: 9/16 = 0.5625:1 + DW 360, 480 ; Size + DW TBL_Width360, TBL_Height240, TBL_SingleLine, 0 + DW 728 ; Max height +TBL_320x175: + DB 0A3h + DW 0, 0 ; Aspect: + DW 320, 175 + DW TBL_Width320, TBL_Height175, TBL_DoubleLine, 0 + DW 819 +TBL_320x350: + DB 0A3h + DW 0, 0 ; Aspect: + DW 320, 175 + DW TBL_Width320, TBL_Height175, TBL_SingleLine, 0 + DW 819 +TBL_360x175: + DB 0A7h + DW 0, 0 ; Aspect: + DW 360, 480 ; Size + DW TBL_Width360, TBL_Height175, TBL_DoubleLine, 0 + DW 728 ; Max height +TBL_360x350: + DB 0A7h + DW 0, 0 ; Aspect: + DW 360, 480 ; Size + DW TBL_Width360, TBL_Height175, TBL_SingleLine, 0 + DW 728 ; Max height +TBL_400x600: + DB 0E7h ; 28 MHz clock + DW 1, 2 ; Aspect: 1/2 = 0.5:1 + DW 400, 600 ; Size + DW TBL_Tweak400x600, 0 + DW 655 ; Max height + +TBL_Mode LABEL WORD + DW TBL_320x175 + DW TBL_320x200 + DW TBL_320x240 + DW TBL_320x350 + DW TBL_320x400 + DW TBL_320x480 + DW TBL_360x175 + DW TBL_360x200 + DW TBL_360x240 + DW TBL_360x350 + DW TBL_360x400 + DW TBL_360x480 + DW TBL_400x600 + +MAXVMODE EQU ($-OFFSET TBL_Mode) / 2 + +;----------------------------------------------------------- +; +; Enables 80x25 color text mode +; +subText PROC NEAR + ASSUME ds:MX_TEXT + mov ax, 0003h + int 10h ; Call BIOS set mode + + mov [mx_ScreenHeight], 0 + mov [mx_BytesPerLine], 0 + ret +subText ENDP + +;----------------------------------------------------------- +; +; Enables the selected graphics mode. +; +; Input: +; Mode = mode to select (MX_???x???) +; Output: +; none +; +mxSetMode PROC FAR + ARG Mode:WORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds, si, es, di + +; Set DS to code segment alias + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov si, [Mode] + cmp si, MAXVMODE ; Is it a valid mode? + ja @@Exit ; No, exit + test si, si ; Text mode? + jnz @@Set ; No, handle it + + call subText ; Back to text mode + jmp @@Exit ; Exit now + +; Set video mode +@@Set: + dec si ; Skip text mode + shl si, 1 + mov si, TBL_Mode[si] + cld + +; Use BIOS to set 320x200x256 linear mode + push si ; Save SI + mov ax, 0013h + int 10h ; Use BIOS to set 320x200 linear mode + pop si ; Restore SI + + mov dx, TS + mov ax, 0604h + out dx, ax ; Disable chain-4 mode + mov ax, 0100h + out dx, ax ; Reset + mov dx, MISC + lodsb + out dx, al ; New timing/size + mov dx, TS + mov ax, 0300h + out dx, ax ; Restart sequencer + +; Unlock CRTC registers 0-7 + mov dx, CRTC + mov al, 11h + out dx, al ; Vertical sync end register + inc dx + in al, dx + and al, 7Fh ; Clear write protect bit + out dx, al + + lodsw ; Get X aspect + mov [mx_AspectX], ax + lodsw ; Get Y aspect + mov [mx_AspectY], ax + lodsw ; Get screen width + mov [mx_ScreenWidth], ax + shr ax, 1 + shr ax, 1 ; Divide by four to get bytes per line + mov [mx_BytesPerLine], ax + lodsw ; Get screen height + mov [mx_ScreenHeight], ax + +; Set CRTC registers + mov bx, si + mov dx, CRTC +@@TableLoop: + mov si, ds:[bx] ; DS:SI -> table of CRTC registers + inc bx + inc bx ; DS:BX -> offset of next table + test si, si ; Last table? + jz @@EndLoop ; Yes, exit loop +@@Loop: + lodsw ; Get CRTC register index and value + test ax, ax ; End of table? + jz @@TableLoop ; Yes, go to next table + out dx, ax ; Set register AL to value AH + jmp @@Loop ; Get next register/value +@@EndLoop: + +; Set virtual screen and system clip region + push [mx_ScreenWidth] + push WORD PTR ds:[bx] + call mxSetSysClipRegion + +; Clear video memory + mov dx, TS + mov ax, 0F02h + out dx, ax ; Enable all planes + mov es, [mx_VideoSegment] + xor di, di + mov cx, 8000h + xor ax, ax + rep stosw + +@@Done: +; Lock CRTC registers 0-7 (some cards need this) + mov dx, CRTC + mov al, 11h + out dx, al ; Vertical sync end register + inc dx + in al, dx + or al, 80h ; Set write protect bit + out dx, al + +@@Exit: + xor ax, ax + mov ax, [mx_ScreenWidth] + .pop ds, si, es, di + .leave ARG_SIZE +mxSetMode ENDP + +;----------------------------------------------------------- +; +; Changes from the current mode the selected graphics mode. +; +; Input: +; Mode = mode to select (MX_???x???) +; Output: +; none +; Notes: +; this function assumes that mxSetMode and mxSetVirtualScreen +; have been called first. View size is rearranged to match the +; specified mode, but video memory is not cleared. +; Differences from mxSetMode: +; - video BIOS is not called to initialize graphics; +; - row address register is not modified; +; - video memory is not cleared; +; - mx_BytesPerLine is not modified; +; - system clip region is not modified. +; +mxChangeMode PROC FAR + ARG Mode:WORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds, si, es, di + +; Set DS to code segment alias + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov si, [Mode] + cmp si, MAXVMODE ; Is it a valid mode? + ja @@Exit ; No, exit + test si, si ; Text mode? + jz @@Exit ; Yes, exit + + dec si ; Skip text mode + shl si, 1 + mov si, TBL_Mode[si] + cld + + mov dx, TS + mov ax, 0604h + out dx, ax ; Disable chain-4 mode + mov ax, 0100h + out dx, ax ; Reset + mov dx, MISC + lodsb + out dx, al ; New timing/size + mov dx, TS + mov ax, 0300h + out dx, ax ; Restart sequencer + +; Unlock CRTC registers 0-7 + mov dx, CRTC + mov al, 11h + out dx, al ; Vertical sync end register + inc dx + in al, dx + and al, 7Fh ; Clear write protect bit + out dx, al + + lodsw ; Get X aspect + mov [mx_AspectX], ax + lodsw ; Get Y aspect + mov [mx_AspectY], ax + lodsw ; Get screen width + mov [mx_ScreenWidth], ax + lodsw ; Get screen height + mov [mx_ScreenHeight], ax + +; Set CRTC registers + mov bx, si + mov dx, CRTC +@@TableLoop: + mov si, ds:[bx] ; DS:SI -> table of CRTC registers + inc bx + inc bx ; DS:BX -> offset of next table + test si, si ; Last table? + jz @@EndLoop ; Yes, exit loop +@@Loop: + lodsw ; Get CRTC register index and value + test ax, ax ; End of table? + jz @@TableLoop ; Yes, go to next table + cmp al, 13h ; Row address register? + je @@Loop ; Yes, ignore it + out dx, ax ; Set register AL to value AH + jmp @@Loop ; Get next register/value +@@EndLoop: + +; Lock CRTC registers 0-7 (some cards need this) + mov dx, CRTC + mov al, 11h + out dx, al ; Vertical sync end register + inc dx + in al, dx + or al, 80h ; Set write protect bit + out dx, al + +@@Exit: + xor ax, ax + mov ax, [mx_ScreenWidth] + .pop ds, si, es, di + .leave ARG_SIZE +mxChangeMode ENDP + +;----------------------------------------------------------- +; +; Returns the aspect ratio for the current mode. +; +; Input: +; AspectX = pointer to aspect X +; AspectY = pointer to aspect Y +; +; A rectangle of width AspectX and height AspectY looks like a square. +; +mxGetAspect PROC FAR + ARG AspectY:DWORD, \ + AspectX:DWORD = ARG_SIZE + .enter 0 + .push ds, si + ASSUME ds:NOTHING + + lds si, [AspectX] + mov ax, [mx_AspectX] + mov ds:[si], ax + lds si, [AspectY] + mov ax, [mx_AspectY] + mov ds:[si], ax + + .pop ds, si + .leave ARG_SIZE +mxGetAspect ENDP + +;----------------------------------------------------------- +; +; Returns the current screen size. +; +; Input: +; Width = pointer to screen width +; Height = pointer to screen height +; +mxGetScreenSize PROC FAR + ARG SizeY:DWORD, \ + SizeX:DWORD = ARG_SIZE + .enter 0 + .push ds, si + ASSUME ds:NOTHING + + lds si, [SizeX] + mov ax, [mx_ScreenWidth] + mov ds:[si], ax + lds si, [SizeY] + mov ax, [mx_ScreenHeight] + mov ds:[si], ax + + .pop ds, si + .leave ARG_SIZE +mxGetScreenSize ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxsp.asm b/16/x/mxsp.asm new file mode 100755 index 00000000..1d08e711 --- /dev/null +++ b/16/x/mxsp.asm @@ -0,0 +1,57 @@ +;----------------------------------------------------------- +; +; MXSP.ASM - Set palette function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxSetPalette + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Updates the VGA palette. +; +; Input: +; Buffer = pointer to palette data (R,G,B) +; Start = index of first color to set +; Count = number of color to set +; Output: +; none +; +mxSetPalette PROC FAR + ARG Count:WORD, \ + Start:WORD, \ + Buffer:DWORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds, si + + lds si, [Buffer] + mov cx, [Count] + mov ax, [Start] + mov dx, 3C8h ; PEL write address register + out dx, al + inc dx + cld + cli ; Disable interrupts +@@Loop: + lodsb + out dx, al ; Red + lodsb + out dx, al ; Green + lodsb + out dx, al ; Blue + loop @@Loop ; Loop until done + sti ; Enable interrupts + + .pop ds, si + .leave ARG_SIZE +mxSetPalette ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxss.asm b/16/x/mxss.asm new file mode 100755 index 00000000..97df7366 --- /dev/null +++ b/16/x/mxss.asm @@ -0,0 +1,72 @@ +;----------------------------------------------------------- +; +; MXSS.ASM - Split screen function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxSplitScreen + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Splits the screen. +; +; Input: +; Line = scan line at which screen has to be splitted +; Output: +; none +; +mxSplitScreen PROC FAR + ARG Line:WORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + +; Modify the line compare value: bits 0-7 are in the Line Compare +; register (CRTC #18), bit 8 is in the Overflow Low register (CRTC #7) +; and bit 9 is in the Maximum Row Address register (CRTC #9) + mov ax, [Line] + shl ax, 1 ; Adjust line for mode "X" + mov bh, ah + mov bl, ah + and bx, 0201h + mov cl, 4 + shl bx, cl + shl bh, 1 + mov dx, CRTC +; Write bits 0-7 to line compare register + mov ah, al + mov al, 18h + out dx, ax +; Write bit 8 to overflow register + mov al, 07h + out dx, al + inc dx + in al, dx + dec dx + mov ah, al + and ah, 11101111b + or ah, bl + mov al, 07h + out dx, ax +; Write bit 9 to maximum row address register + mov al, 09h + out dx, al + inc dx + in al, dx + dec dx + mov ah, al + and ah, 10111111b + or ah, bh + mov al, 09h + out dx, ax + + .leave ARG_SIZE +mxSplitScreen ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxtl.asm b/16/x/mxtl.asm new file mode 100755 index 00000000..69900c88 --- /dev/null +++ b/16/x/mxtl.asm @@ -0,0 +1,169 @@ +;----------------------------------------------------------- +; +; MXTL.ASM - Put tile +; Copyright (c) 1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxPutTile +PUBLIC mxTransPutTile + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_VideoSegment : WORD +EXTRN mx_BytesPerLine : WORD + +;----------------------------------------------------------- +; +; Copies a "mode-x" tile from memory to screen. +; +; Input: +; Image = pointer to tile +; X, Y = coordinates of destination +; Width = width of image in pixels (Width and 3 = 0) +; Height = height of image in pixels +; Output: +; none +; Note: +; no clipping is performed on tiles! +; +mxPutTile PROC FAR + ARG Height:WORD, \ + Width:WORD, \ + Y:WORD, \ + X:WORD, \ + Image:DWORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds, si, es, di + + mov ax, [Y] ; Get pixel address + mul [mx_BytesPerLine] + mov di, [X] + .shr di, 2 + add di, ax + mov es, [mx_VideoSegment] + + lds si, [Image] ; Get tile address + .shr [Width], 2 ; Number of bytes per plane + mov cl, BYTE PTR [X] + and cl, 3 + mov ah, 11h ; AH = plane mask + shl ah, cl ; Align mask to first plane + + mov [Y], 4 ; Number of planes + mov bx, [mx_BytesPerLine] + sub bx, [Width] ; Extra bytes per line +@@Loop: + mov al, 02h + mov dx, TS + out dx, ax ; Set write plane + mov [X], di ; Save video offset + mov dx, [Height] +@@Loop2: + mov cx, [Width] ; Number of bytes to move + + shr cx, 1 ; Move line + rep movsw + rcl cx, 1 + rep movsb + + add di, bx ; Move video offset to next line + dec dx ; Done all lines? + jnz @@Loop2 ; No, continue + mov di, [X] ; Restore video offset + rol ah, 1 ; Next plane + adc di, 0 ; Bump video offset if needed + dec [Y] ; Any plane left? + jnz @@Loop ; Yes, keep looping + + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE +mxPutTile ENDP + +;----------------------------------------------------------- +; +; Copies a "mode-x" tile from memory to screen. +; Skips over color 0. +; +; Input: +; Image = pointer to tile +; X, Y = coordinates of destination +; Width = width of image in pixels (Width and 3 = 0) +; Height = height of image in pixels +; Output: +; none +; Note: +; no clipping is performed on tiles! +; +mxTransPutTile PROC FAR + ARG Height:WORD, \ + Width:WORD, \ + Y:WORD, \ + X:WORD, \ + Image:DWORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds, si, es, di + + mov ax, [Y] ; Get pixel address + mul [mx_BytesPerLine] + mov di, [X] + .shr di, 2 + add di, ax + mov es, [mx_VideoSegment] + + lds si, [Image] ; Get tile address + .shr [Width], 2 ; Number of bytes per plane + mov cl, BYTE PTR [X] + and cl, 3 + mov ah, 11h ; AH = plane mask + shl ah, cl ; Align mask to first plane + + mov [Y], 4 ; Number of planes + mov bx, [mx_BytesPerLine] + sub bx, [Width] ; Extra bytes per line +@@Loop: + mov al, 02h + mov dx, TS + out dx, ax ; Set write plane + mov [X], di ; Save video offset + mov dx, [Height] +@@Loop2: + mov cx, [Width] ; Number of bytes to move + +; Move one line + jcxz @@MoveLineDone +@@MoveLineLoop: + mov al, ds:[si] + test al, al + jz @@MoveLineNext + mov es:[di], al +@@MoveLineNext: + inc si + inc di + dec cx + jnz @@MoveLineLoop +@@MoveLineDone: + + add di, bx ; Move video offset to next line + dec dx ; Done all lines? + jnz @@Loop2 ; No, continue + mov di, [X] ; Restore video offset + rol ah, 1 ; Next plane + adc di, 0 ; Bump video offset if needed + dec [Y] ; Any plane left? + jnz @@Loop ; Yes, keep looping + + xor ax, ax + .pop ds, si, es, di + .leave ARG_SIZE +mxTransPutTile ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxvs.asm b/16/x/mxvs.asm new file mode 100755 index 00000000..992eabab --- /dev/null +++ b/16/x/mxvs.asm @@ -0,0 +1,110 @@ +;----------------------------------------------------------- +; +; MXVS.ASM - Set/get virtual screen +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +NOWARN RES +INCLUDE MODEX.DEF + +PUBLIC mxSetVirtualScreen +PUBLIC mxGetVirtualScreen + +EXTRN mxRowAddress : FAR +EXTRN mxSetSysClipRegion : FAR + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +EXTRN mx_BytesPerLine : WORD +EXTRN mx_CodeSegment : WORD + +mx_VirtualWidth DW ? ; Virtual screen size +mx_VirtualHeight DW ? + +;----------------------------------------------------------- +; +; Sets the virtual screen. +; +; Input: +; Width = virtual screen width +; Height = virtual screen height +; Output: +; 0 on success, else invalid parameters +; +mxSetVirtualScreen PROC FAR + ARG Height:WORD, \ + Width:WORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds + +; Set DS to code segment + mov ds, [mx_CodeSegment] + ASSUME ds:MX_TEXT + + mov ax, 1 ; Assume an error + cmp [Width], 320 ; Check width + jb @@Exit + push ax ; Save return code + mov dx, 0004h + xor ax, ax ; DX:AX = 256K + div [Width] ; Max height in AX + cmp [Height], ax + pop ax ; Restore return code + ja @@Exit ; Exit if bad heigth + + mov ax, [Width] + and ax, 0FFF8h ; Align to byte + mov [mx_VirtualWidth], ax + shr ax, 1 + shr ax, 1 + mov [mx_BytesPerLine], ax + shr ax, 1 + push ax + call mxRowAddress ; Set row address + mov ax, [Height] + mov [mx_VirtualHeight], ax + + push [Width] + push [Height] + call mxSetSysClipRegion + xor ax, ax + +@@Exit: + .pop ds + .leave ARG_SIZE +mxSetVirtualScreen ENDP + +;----------------------------------------------------------- +; +; Returns the current virtual screen size. +; +; Input: +; Width = pointer to virtual screen width +; Height = pointer to virtual screen height +; Output: +; none +; +mxGetVirtualScreen PROC FAR + ARG Height:DWORD, \ + Width:DWORD = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + .push ds, si + + mov ax, [mx_VirtualWidth] + lds si, [Width] + mov ds:[si], ax + mov ax, [mx_VirtualHeight] + lds si, [Height] + mov ds:[si], ax + + xor ax, ax + .pop ds, si + .leave ARG_SIZE +mxGetVirtualScreen ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxwd.asm b/16/x/mxwd.asm new file mode 100755 index 00000000..de55208f --- /dev/null +++ b/16/x/mxwd.asm @@ -0,0 +1,28 @@ +;----------------------------------------------------------- +; +; MXWD.ASM - Wait display function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxWaitDisplay + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Waits for display start. +; +mxWaitDisplay PROC FAR + mov dx, STATUS +@@1: in al, dx + test al, 08h + jnz @@1 + ret +mxWaitDisplay ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxwm.asm b/16/x/mxwm.asm new file mode 100755 index 00000000..06158859 --- /dev/null +++ b/16/x/mxwm.asm @@ -0,0 +1,39 @@ +;----------------------------------------------------------- +; +; MXWM.ASM - Set write mode function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxWriteMode + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Sets the write mode. +; +; Input: +; Mode = write mode (0,1,2,3) +; Output: +; none +; +mxWriteMode PROC FAR + ARG Mode:BYTE:2 = ARG_SIZE + .enter 0 + + mov dx, GDC + mov ah, [Mode] + and ah, 00000011b + or ah, 01000000b + mov al, 05h + out dx, ax + + .leave ARG_SIZE +mxWriteMode ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxwp.asm b/16/x/mxwp.asm new file mode 100755 index 00000000..19ca99d0 --- /dev/null +++ b/16/x/mxwp.asm @@ -0,0 +1,62 @@ +;----------------------------------------------------------- +; +; MXWP.ASM - Set write/read plane functions +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxWritePlane +PUBLIC mxReadPlane + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Sets the write plane(s). +; +; Input: +; Plane = write plane(s) to set (bit 0 enables plane 0, +; bit 1 enables plane 1 and so on, different planes +; may be selected at the same time) +; Output: +; none +; +mxWritePlane PROC FAR + ARG Plane:BYTE:2 = ARG_SIZE + .enter 0 + + mov ah, [Plane] + and ah, 00001111b ; Mask off unused bits + mov al, 02h + mov dx, TS + out dx, ax + + .leave ARG_SIZE +mxWritePlane ENDP + +;----------------------------------------------------------- +; +; Sets the read plane. +; +; Input: +; Plane = read plane to set (0,1,2,3) +; Output: +; none +; +mxReadPlane PROC FAR + ARG Plane:BYTE:2 = ARG_SIZE + ASSUME ds:NOTHING + .enter 0 + mov al, 04h + mov ah, [Plane] + and ah, 0000011b ; Mask off unused bits + mov dx, GDC + out dx, ax + .leave ARG_SIZE +mxReadPlane ENDP + +MX_TEXT ENDS +END diff --git a/16/x/mxwr.asm b/16/x/mxwr.asm new file mode 100755 index 00000000..bd29fe59 --- /dev/null +++ b/16/x/mxwr.asm @@ -0,0 +1,28 @@ +;----------------------------------------------------------- +; +; MXWR.ASM - Wait vertical retrace function +; Copyright (c) 1993,1994 by Alessandro Scotti +; +;----------------------------------------------------------- +WARN PRO +INCLUDE MODEX.DEF + +PUBLIC mxWaitRetrace + +MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE' + ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING + +;----------------------------------------------------------- +; +; Waits for vertical retrace start. +; +mxWaitRetrace PROC FAR + mov dx, STATUS +@@1: in al,dx + test al, 08h + jz @@1 + ret +mxWaitRetrace ENDP + +MX_TEXT ENDS +END diff --git a/bakapi.exe b/bakapi.exe index 2665e03ae26a989d9956a65a8b71cfa87ade36bf..f4b011b43d71e6d2eda284cc3a6d4e54f32e3c35 100755 GIT binary patch delta 58024 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 diff --git a/exmmtest.exe b/exmmtest.exe index 68cd10b2302442802250ea089c899a2000346f3c..4a5e0d202950e76bde8a4d25e190a0a175d1cdb4 100755 GIT binary patch delta 36538 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 Qx&i% zOKU^ACc0WCTKd4DdrDGlL>Os~$3QwFftf%$Pde0yNRQBv_7YTmaUDJrOXg)(N((dR zV%p-b(~dI?aFD$>^_zQhGGxWI)R0;3=K=Zn=Bx!+HCr_T++TyKQ`C159SLX;^cCEj z?Ev_luY$d0AT&d>gVV(G84wwr&m<$3mDl0aIYFp2=xb@gosN?A(ULJGs9CSPIRxFh z4{>o>EbRtxH8;pV9+DDjlC{iz+k}+EQ(0S{rFYaD(Yt{`ET+O4f47^?ix8}junPld zJ|Mpw=pJv9Sz|b~lEoH}s~i&g^eM}318o9=&7XqMY+;Qlwlp1g)8=vThg}`=BD3-7$>ur{nHw6IS)L~yO^8PV!AFmXhE~twLSf*J z49<22U&hq+uYI{$O#()HgTS-cw=~kQKR9h)L9>b!7I4_pq{R(1`9ZQ>!Dv; z^sPCYK)@e3`4cz+G#~f@zJOC=V}y@?1F0rbkqI1^2b$bY0xn4(0B1mq*C{avaG139 zYj{-iGJY1Y{tyoC1D1d(kaF_WWO7_XY)wpbTvQ~*IzF`NiYBnB0jL8Vm8yU&Aovg9 z2Y3N)L#tqz8w7VpoI`q{vLQB3v<160&&nb1bG|u#Wq~>QA9yyQR|_&qSMWDmbYPGY zTp1yaR7F)Jm)ph**s^I_NlNhx56DE=y1E}1>h}V@{o^H9+1%YhFn0~}uQlWlSW{VS zB?5+GdquN^Lk=p`iOb$7>fb0%;xU^i%?Fr$3G!)vficabV{2d)V*VX9XJ}Wu`_Lyf zZeq%&4lD0tX!v^=Isuu#H%8*fwfH`ZU56z3LM5lT|IOjk;%cR9T3Lr1)HOdpw3H!u zDbRo4|Kth3VQGmzwi>OYQ>(ATQvuE&J15Ri`*J|4&+e0KlGdy|cvGukQ6%Z-==aeV zqxja}a{9hS8QKgg+7XXoRyi#n#zM>Su;wSd&PX@TGc$D59Llnxi}R*1f8*cNrse~R z#aR!F&>NX_PS~f}FQ;i|Zt^Qm7a_sa8Cw1TB@U7?OhLml<~KV?2F>$a#mt~RF0Fm2 zxDbH7$o!X`^)KsH7}PnHhcl1Q2{!(hvFrfJXYQGh@iUj{aR2)=HDbZnt!7uU^S%NPCxhh*O!BTO5Eb;)zF8O0B+CY(Kii`1#MtO zuAKG6xsd}i+lKy~@K60uSp*dD=g-)n`1vT2Q#hs!-#|B|3EM0xvTT~Im&M1%R(1NLW4`&@K+-!{IdUhayhZZ=S8AF%;abG)i(I!_BA-6*k>)9Q59c5_FmX#NFDWYQeO z)O$K(nm2Nwp3VeKwt}P6>M?9veQ9Q}X*ygCOmXqgt3f-}ZW)_vQVR37Ei+XiScB zu8aPEr%C0)L@(4ugQY1Z>9jb0Y|E&dWaTP!+Oh7-vqP_Iiwlnqn?x|X6DfXrWKpkM zx?%zOn*$`?mNt#?B?S#1J;b#!QIPFQRg0m=>bf6Hk7uU3D&-e!VC{)byit$A+*cZo z`hJ@_vh=vgypPTKUiX3VFVY|5IhEkcYPAH`V1c;6zGgGl_F-_cjh0XXoh`SjETn4k ziO}X6TXRBLi<_rATnZ{<(q~Xr59k;^D!%oRgu@8`@c7ZXZYK(3N$`&oXmFh_#J09u zjF#Ul8iF(RXp*LBG%h1V*t64j4GdG+D6^-^!ERmH>i6{E`?xr1OtJ4}POXM+w2RRG zIC*nHm#6mMKc@P_*QfqDFT-6ruVZ?aOVSx~iTsAC$iO|#)N*IWmnE6h7G&lJsW{Bz zHXvJ7d`2@pop5(s{EH#@-_lNsQ=10=u~PFZpOxlP=$Nx*UF#z8M~14U4rUZ-+%?)B zL#o`=^MguE`Sc8d5HEG}smc_u0Ji-lnziRhtJjQm;*qqJeXlN0Q$;WJc9HjKbUsG) zqDvW*br|<5fHa z&dXDOz|+KXCoxpcnm11S)L-H)0>8}dJ~9NQYJ9fHu>!2CG?6y$=BjRLlf4jKY+tp> zRcws9+rRUBbXjmfIZTxP?$b@y5rY)i`1-q`-AerrxBZVtJ@iT75qgPKUPJh>Zf?5W)(M+gG0dBeWKtgJl6(+D{Bc#?xnF=g>TSzL*qAS1$(QJY_zSO6q(*Pe#)gRm|C{H3H968et8mO|WTBgGu!6df51Q zi#LKj%?r+-QSWFDa~+|pYcY=AHgrhTGqsp?O{r6h+sEDhNk=Sg?%S9V3m2-i9CT%r z{9k2&`AG_Vhh5aGIY;k&9R=0W4>N8RYNv|kb~jc1_~nvBbCnEnm@CSK;3?Jb3{kD` zVE|)4IBEG)8Z=$7A=1~4s|fQ>=$! zFSgZ4z#GLD+>AP%SX+*7b@ctMK0xGlrt|ALSNwLN^Y-h?h&h0Ug6{MoH9$g+T4H!w zY*0_@<u<*-f12^NZ_}6D%%-7Eg zVmm_>$ z;qmHU`{I2K)O))&{`eNpcc}h;2J#R59)B8~ZWnwdgIR`E-TV?OX97pRdNH@p>V}cE zkOcB4gTB3hJ#lN!A{fICQ$~x6cSFLo&enIq*#ZpucxhtMJ%hOUCF^*t%+1wT(lxWv z4N0_E-8m8l{xZAAE)G)FK1$HInB3R!F6H(1&BoIXX`iONN93NjxZ!0$H1z=*lT3EX z)r98(O%mO4CJ#RRx%haSy{Vry|1gfnC0XBLvw3<`Ea)19k1Rc3-Xru||4C`I_|^8` z&>m%r=DKu~i#AgV9HsW*K{&%~pdvH4NRLm+PNx66I{=bY<1`_0j*YM495 z-}^W=+^G`l8%yUb*J)ZH9yTZ{dGbHWWM0uii_!_tm^;SG?t(I$IE}!6^YQS>SDzUx zLo1ezBXifMZYfI8SrhM1j{NtpC6=xhwKJF(dzXwhr*o#UW34*UG@!@Lf`O=pD)Ekx84P2sxySE77n5d8ZP{;>U%gC{x zqdp&6@?+08j;(x7#R^XoNmk$haVR7gr^Az8dOG5>FH44uc+TN9;Wi0Tu1 z20;-ijbg@j3YMTGe~j&w&9%>Qh?w$025^x;#t$%6>HptB%Q?rpvhp@2?V6yGMgEVo6Vl`QD5kmidI z;o;ydQmnMh=_j#>HzyR7;9#Z7i_QJRB+V7B<_#9YUG;-Ugz6RUh|j}1NSl@jl_5U$ zbtp|mpja}_U&A_pm&cfKMP(HVe~k0_q_r6OR#?JkcK%Da6_FAQSvWeA`#Zv6;Ntc0 z>)%7RGN5oj%|H7XvSdOypJB@u*LT}j4%d^(9XaGFO>^Wl`^V(e9FDbLVdlV}!LXda z>D$p(um3y@EBt%2Jj`MRf^gMnFbrb}TRahVeIxN}+=xS%{QEBrdoV<;dNM?JIsT?{$$!Ku|~9 z_ofuHEhc$$XY@E|h6yH8qh#(GZC^Ow5608pK1}w}tF7#sQhzIym<3l3v-C())OW7~-p%S8@WFCX`VzmeudUCGqy?%^UI4+!* zc1Kv3ENfEo6U7aMB%k5cKesWs-qR8C&Lvi^H)?W<5gKm1LbmZ%2p?l?hj(o*(L&H2 z%v=ppgT8b#H{TlP^LABsOgxzdKLWQD-25>`YQR80evo%o!7r=TTy9bidMKNeQ=~E; zp_`iiT9xMm{c+!#VC=m}WVRsVpZvo`=O8T%T5>&j(CYew_anB*Tu%0|q9C1GPE(fQ z!v>(VXS05*Z`H;qhevFGb-rfw~wf-gTMfAaBP5jvwVQ@TBh3F;nv zjVwAJ^?izTOJ;fXvYaVapdJxeEhlSN{W_U)gvq&K1re6`^I1M8IKDnTkSzXp2`6+O z983E`-ZCDXN@4QGM8QTn0u&dje+x{AK*DC&87K%;yDRP%By`Y)94AaW@I6S=E3Mtm zbJ5{&g$0?7^9P}{au}I?9CV@OKn$_T+5~xyWYtVKhF6tPg8YeTDz8@3C`NWFRy_LZ zP+(zxMpyz=qxZL>`|Y{F$*0Bbq7R%NI|o{wU$qS^XUEN(!)k+XYcsNOhw%}KQKV>W z5@?s2L{4FbMX;xIN{5RT#mpoU5!fKnl!&MUwutn0(TMO==|PPU;R9lPd{S7AiWth^ zWJJuYSVT&mlSMQ!F`Q`uXx-K$#VO)%$|Xz@lbt@L@*HZ}xmXW!uctD z;!h98LV$})upK!e`J7!-s)=-yZ9+U4zMiN=vS>_JlAaT_^LBBc*U&b2XxBtej);uQ zx_MKXw38AON={B7omPMVKNru0hy-&~hOKjrOJ0LL?+YhnTvtM10g$RC9iKcYk(M&~ zkSIiVlh!`x(rQKdQ86A!d>4K$ygeip&SIYOx2q*5UJ+;fdI5azO)AiDi~>1NF9{?h z*d@m7+k}Nh*8sAOQG&!NditzID6s}t)s(`arAOxUY!WsZYC@CTIdr2MBZh5$X2wY; zCZXcI>6IpwaQ_l7eq)dlsl)4-eDa4p~VyK>$T%{)~Iw{S?Mtvd@J(=@KoxLF3U@DCK zPG-A{-ycVa<{>IE>yp#=i2R+hGfW4+d~8&lXHuGmhGrlsJszaErU3f`>Ry$}Pr7&; z3(`gqAC*aQGpTPR!z1txF(W>mSdJvp5AmS4koCg-BWj_iRu_+bJ9oA-{3t@VM7XHP zcw>Xem&O$H*D6flY9$D|kI*iEDYOxp2~)ZF(u^Zo;`@WV=1Ses2Atgh=3{_~SWHAX zJFV@+O|v*q&k!`#HB2~*(SN1?B`N;Vt)sG$%Cd6Ys1W|=vPRl|l{O*&+B)K6!ezFZ z_9&%jkseu9{};AV@nO+o__iHlLIgi4Js~xh=I2x*hNnA3kTxaV$fUPjp$O*2i9a5< zyCc%OqZ<>YO|FOupKcz2K6G7?NooEbk{Wd(@{J?3pFLl^}8ZIuSqn=(D78!bVEdDv+`&o3a>W1I-G9uh(Ox}ubdxunQ662_rHSdTyyJM=?ebq$_inyuScZKmDo@4 zsgv{K_q4~qMI>NTN7fS6E$Tf45fP3)3EJ3<3*Fm9N_l-~$uq2na|q?kag!A3F5cQ) z7MV}bQw1KtACs4OA}+oYRWz)9mHjNS4Q>-uBx6?LI}(nGlV2P#K= z5&&o1(tu#65j6`1>0zw%`S|Qm>8mnuQc_9*qg+kfS0vFpk(C=x(Yk$!D6{f_JrEb3 zGTz&-R^k4D{9!fXD?8o*|J`7=%o!(B{$$c!wA+-b@N+GynSyYjGwenzszyLJ1H{?~Sw02`VoT)X-G!sA$yNWEgF`YYM`%;= z7`xBXIbX9mpZpYUM&my4W7{5c*IUf7v-cHjLrD4v8-V!(05ZF=)`3;;zSW8xcjP?G zS*r!yJ=hEHZJ>>wu1!{=2A7tQOW%c#ZPr6pLs8g8a&Ube0S)<53$`FLofL4*t=^jZ zj05$~Ro!}NOp;k{Q@fH?$}FcTSJo^y4Ylm^@n7yfG7BN}CE?DR zZiVe-bVv0vCs6c=$%5)PGTNHJ+^h{4*?+I3zkNdWYG%pEUTM1{R91TH4^puRmA1fJ zY{!D-_QG*Yd$zu8_@`>{doX|QVaXV^yR=|VWocIm&n&%y_VCF6F{jq^@Ay%@d0D6T zmb3x_MBBS!2hq76K=a2Roc=8E=zcp|n*MTlt@?Pm=;DgJTxDs9{?wAFi@=zEs>E8J zX!bsbuRhy$m#8-@!(3lDh>F%?4A!tW(an~K=iEAbvXSm>bY+l^?=VGpYI&@8u}r&I zywg~-jC%Vho0Elcy(Bit1eyHpK*6?9M|XEda%2o-_cbUd6Md zmae*&m#^*S1-cb%1tU59ISIiJw9XEXa9nq& zP#HPe0rPUd%5W1XJ86|V zb3i_xSLr74V{^-$R<^0LMc}#ci{#V^N+fM+aZ7B1^7&`k#kqWTm3tvK9x-$+s(W=? zD%?eR(H&TH|IHA0azFjn75L86Gkr|Pr9^Z=w9qWW6*xy~c&s_6X_nnZVmnOihKi!9@wa3C3WY`J~uJO~~f+1Dg9Zo6p`E?%*yG$MFDWtETrewi zJu6A*7`8i~g`ru}b~ou}R{J4@UBwE0=-AB--b_pCA@!N$_BquiF>wS02EdKGQ~9Vn z1trRR0XUi$7pkA*@@nT-#H{bkkuF&`k&EkUI!RZ_;j|_@g#fNNZl^SRTzn!mkb|?Q z=TiVC#?p&!WUuZkbmKhg-ntvSEN@1Us?S6m3rI9P*HDr*oO>OWL81*0EbrwV z&VCo@J>nD>;&*J)dSYty=nk_74CIK*OkhFC``>~aWXk4>Sq^MZvT=W(AjqmGZ%v6i z1f3kG_KAuu$j+?KeG)TM*?n?U%iuQkSEUk;=xbufx&B`XhFHQgHSo}png+898+4A$ zm)(XjED8>I4M52yU4{_8sZmJG%7N#Nm~zXIFaerzlE)0q-!McEb^UNkFKRNQdSkCh zPrWgp@z|Q(=lO?M+ANtNC>s)SwXbd94{Ih<@x+uCC(E2e2yylybJsb0{PFxp_m7C} zPb8Y_&SZ;IKEk2asvykfE?e4v5?UYKyN0w8JO;PKK*WC)A>p7iY$aKJSHu4&(e4 zLLz*eHgn#Yo88_h%lZl*)WF{uyP=za$=_6NM8ds{9lP_LZs*gd03Ox!=Ri6C6ffwy zzdZHN=OHJTo4wtMhI1{a33N_Sq^u&>vSdMCHd1f_wh7r2B^r`;xU(Pn;Uw+}wiJk| zgfKOUOBc2{wJ=d)H(qa}XGM4TA4YL_Jm2j*uLF?nZKL{xO-7AAAEmy_9W!!^KDHb( zB03WC<4otNS|tTyu6-nz&=b;$Fg7kG&_p9bl?Ebrd z{1nZQAl4H+FZiV-teRW~+DQw_qPqw9*3{!J`?D8y_DnsNqF(=t^P4n9Jy4YQ{G|Q((^ddlK$PW_C?i9|g_o!}MviU}cG*r2=dDd&HHL zvH$WPi{216Q`Yy}RFo_Y!hdj>4ff?4`oU4~^{eyDAb;hqlww&Rc<0q%Cl*Mxq2&)f zEQ^Z+Nhs4qUXrhxzS2coVJGTD=#tyKHy8ZTh70D{cpplE%uNG_bSyTqzSE@n2Air} zzw?hZ?yRh(5|#oVnl}0Pb{em3lG}WQt%hNywvHZ{P8dVU_Qpl)qaUcgg)8rRFhF6o zz~=7q>w~c9hrhtXWyWF1&HI;LaL^IxO=PUp=JJKZuZqQX$#aCX89=yc!;IQV*{xlI z7oBX&!96GoX6+fjBgq_=9U4!O|H58+-pw>e0GV-aok!w-uL(=3vvUj(nip}r_pl(| zxQomYud=AF^Zj{{zQBw6n2}@%#n_*C7$%1+OVtQJwYhr(sUm#W5W`JCqK#hc zbHoSoHsu{PtV^9ePdrqiutCvS7^fNC`uMrLK~<-}eUfc43zmP4G3L~F7-y4w>kBf; zYdtB2=3sX5M8y%bC*tG_qMSf_==MdEc761*+S&C$4C7byH=m|yk{)LPjkCs;BxE=4 zBdgX5`v=%@Jej2Uul^@stP^9T5Wi5O;j!8_#kK1+AiA!^DCGL_ zfv~Y|f5*e#b<_&Uu_|=ohS>-A6xW+JB@XA{JfLaQ&itwcm(X!7;>nj7U5MlD8qRok zZZ89t>+-M{$F29sYUrT*WQpQ+Nu+2_#JmJ|1&#kR)?m&~XwR&yjG;qX@SZ;D6yxED z^V@Eh6?igyT8UaVvg@q1-AiVi+}tA5n-|Y3Wd2gL63(gGdvL=4FUxUR%?4b(pqL%O z2Gahm9jviCuw^UPPK)rWq*Pm4FaED@7|eEbk#Ui&8UE1NGri^Wf$^C^nmuJ%p8Y}E zeVg&XVP*B|TpfB6O#Lu@{P~S3b*H#=V{@Fp1ed#2nOY^EhU*9qHrRPK7s$H*_kUUW zU8L(izQuxLgl&5>p480X>J;E}aLaag05v*DUY$B{#Od=E+A1FgJU`NaN8Jb+SZ*an z_M9k#(lp1gS7qiRoJp?E2udBx^LFp^zXhD}kcFS8tUdgz@OLOmtE1Fm<{C#A!Av(ZQ#hMJ(@*YZB zTrR76dRSG4T;AsWNtH}8Ts{tcUe5n0^n8WXlIGO^Db8bs-KISET}X~$FgImWwFTIe zfQ`Un?-*<)uJTFVb$51psPRBb{oMX9?(AM}74ftQ{IPRBy=wI;s_kml9PuL|s>yHX z^+gtFEpfXt3O!O4zGCuPyD82#iw zNAE5$Df%hoB2>;%xThwDG^Yyw6p*EumkH(Fy&}LxzkyWvb=geulU!s_?`Kn~Ls{hmcgbunV?zqmq>_{MHG5Lt(&oah4UHmWbTs#YmJJ#}P znG$}|zJ{HOr~v8iz|QZ!gdJe?t=q5pv1GV@*UYeiHDQ=#NC45}Wa6d7w1DJ+D0K=X z{>8V&EUOmSdf~>*czXH)$1Ii%Z3M4&t*W>0*B%)|^e(HouGqjLxOF6hx38(Yw==>N zJ7JxEW}l&y!eSN!EDic}%9_=#sH`P=-K6|T$iwNkC8L!Bn2b`&r`1{+yWAI3?6t4L zxOG)!@>L^3F;Sl)KA{_jqgrgG4~bxK~MzUPI`n{>zeUp_w> za7XE>zP)qLa>%bbw%W2jWRHaE2@7T&BBi4nA!FO7(enG zCE@4`TrGk=qb+^0|0;JtTuo%&JDU&776WIE^8&l2v#Nzj0vtJWMd)$7u5%+mY{C-T~MGUVxWH6z$WSbP4wPcj*U}4Dht1k|#=EdnD<$Hxa{PL3u zhf_>aqqWR;kswZ#jE76k+C4E-XM8?$;4GF0t;*!+-*Z7mvnqE zFvSH?NT39imrA44=eVVI9q=VTLg7MX>cu8(fqu}{|;_$5^Spd=oSyF8s};F z+y|bacVlxdkR$p2&fdc{npBOG%CqZ35=ZsnfoyYlvi$0g{aW?aEA@!b+j$9X$8~KA zMR}}AfAvCN()31aWwdKoeV+z@M7QW2dOf>-8@yb14Uzh7!v0-H4R(S7Ypvkzs}FWK zrK;0Jvs0O!UYiiCT#K_#`tWtU`#^gpXJHd+Mp36;Wg6x#4(XJUU24u|iwUyeDn~80 zta5|S>5g)J(7+D3rf0$WczsxmE5aWi`h;IGd~3^jDNg+oujcq(&X1H!%+B3Q>W*g*mtC$$A%%CzX`E@XW$pF!btyCjxXV!4 z?7GVD^xS@{N|-({Y*tj_`lv*Qy6)r_3oLri{?61bzbKtwp$=pzoz)$Z_I}=CeNs|r zgrv^>BQ#P(F2131QSPSXBbcwa<+_cNDoEe;*~{BmG6{RqI)mJI6SOywuZx-bt)zG_ zLxE38f=1Yj`>6vP7VhRG5mo!kb#dX}by~U~Y%Ok^HOSvwSZh^fyXupfDA(wDpNbO7 zY`<0{a~2hHz<)VuK@Fd%o~_e~uNcaHXObE}t6DaVa7VH7gMW)g{ggo<`2(K7!O2Rr z8ZyySeaJ%5BJ{*l+uy$b?L!9t8`vqrSefA|ak=G*o8@F?RLq-Si>E^*hExVVmz?NC=@Z}EpVE&JFfMQKp zznSWY{B}9jnt-fgF4rhHW5inQ6BghQC)=_iTf31` zh>_3V^sB}RJfCy?z|Rl3NUC8>=zNGiX{0SzRdYHw7|BjbkD zr*_`JW#E)Fk+Kw%R!U2`n9ePEqAh|)jNc?49^PICZ-2?tl*6P%#^U_txPpKLv=}{q_bMuxSo{hLbV9%8A%zG2k;VCy=}^ zT+MbuFy~hq3PAsY-!8UMX6p`KXJ?lNS^#+4HFn_N)hcF{(ytzs)+XT*_WFKjtB}qr zScgS9tdn;7It%EXFQSf)&R17jKC!4%{-Dit zz6Iw%fLoRB7Ml)M?)|WTDl}Krs?z{EqV#}s*UH^Pc21^@ z&`hoToO3dXyXUJyOn=*z-fLZQe zq+n7!7p#5X)R&gkYMC83kY=rL)$jatJLZf9h?mi3oZ;?oe`PvRGp=BumBmqq{o6mF zg>3XQ4zJ*g)lTnX12{8E`n^@oEcYJP{uMV@I9K)X()~b=lGu%Sy<#c5G+$QX^-`d) z(LiwN=Gy8l za7uHdYAGAPF)`;Vi`f-fQ6R)C#LZvrTPlm=G?FStmCW#BDHfw{^J0X?uiM!)xG*h0 zyoDuKGpCRsv!`CM`}GLBa7HiT*Tf4M_3U2FW7(Ud0x!P}Jhc+YK^h3kS^n@?SPR-) zG!V^NVz(?Gb~Yi<_rlVls4v>t19ej13==w7vz*a@r$2k|x8kx@hy@~mgYbw@aul#V zLEsy?->OAC7tAC{hZ48rh{+K?2lw$dk>5pRRn!LCp2^8Bz!UqMt^7IWo`Kw%%`!0e z2~Mti3sPThTP4qN;rw@Q1dnPzSNLtThhuVPg8s#B@}*+vBRu#I>q~96CqN?RnRlJK z9N#pF?b&1NE9OOo;>Du*#>M_OAbI8X7KU`UZIYNI?ar?)h*nnrKmTt)Wq1C!ZMGa* zl95W~47j&z=(#Mo4wx2*)snb&{1v*TYb@YV80MZu2F|<4*JlP> zI?y~?!AEPZz$|a1%yPdk3+jEmJDMjJNz0Z%k%^BQPCpO!206=GZd))O*~q!z#~-sJ z@=?+HmDhy();&??&2_1fm_<282?x~WoNdt2TP@l|LyCu_$WeD2b2iwEb#q|Cr;0D5 zqXjG<#>pP1zo8>7*&yiyO<&nv|D3Fwm(Skjjj*nD%#)m+(ME;Pv&WZDNFUcAI;fi} z5#<-1&97YpGri|zWR3^1OB1fSHOR;;#+hH5g%rXyI^aNnLaK%a5O#By81JrO6@L23 z!4MYUEe#3iz_=dsbhkeAas-Z9yE^>U2*@veCcayETPk~`xpQLS0^-0b*d1RQKjh)S z;cgDsZ+wZ%7W=t};;sG3J2J?LziUKYv#S#fd$9y|3d)>V_#bOExTyovhopFNnLODr z{(oO`EiUDP-`QBWJpML!B_&2F5j z0>S;&&gSSq@oF<D4H+ zibh@-{5u{c^qbMv4gg<(tT zew4Lrqv@y39c#zrUbH$MS?eH9ZszUxo7cY28);EZWin4*%RVgmIEgRDL!czj)lD$eeMY6kbHYw#}LWGQivZsLnLOkroqgQq4WJ) zx&C8d%NwsQ{Np?}F@OCG>$6y7#z_!ml3}>o&7MT$x_icVb-rF3Wc1r_NWW&pi51?) z!j$K8?nZCe8%bNWZzmX$a8>`HS3ai{Qtf3jB{2|eMfyQ~4K z0aK_7pRr7U9_kYXvfP}d)t}7Ng;#CdkDkFK%O(r)G(3%nhe!I0n;&guaIjn>#6SkX zCptr51FkoF4?E%a?L9o)JP4QX*&@EgCOv)x6Ym{zEfD|12_}XU6TA`(!tV*o9M?`e z2Y7qV+uH#$QAS?CcV0kL*1oU^z(h6(a%8MwTc*52j+nhT?KzPY>G(S_(5V%96#4o=|M2Hk3F)$7T0sH?nbmHwS zXL9+~|7R&NMa?s@HbTA29GzI7lmTezx|*bp{Cg_>QY_2>aOyiFfq(u|&(vpqw~YfCW|CQ>uxV<4HSF4vdMPL79QaOxT=}(jG@#WW zL=g7`)$X?xBUw)PI)~etk{KD(?)v)nUwF&nc|jiQ`^_J^RKncTGk>`$yHlm;@KkZ* z7repshNlUY{?ZBS-fvfziso{Ms}Xqtax=r-NBV9~tk$)Nc<3*z{+{Jk{x-7VdC{n8AiFr*-z|`yW8h{aDCaLUW`pI`oG<$J3bV>#q-Wm<3Nc5fpE$t|yxM+z zhP{`I*?T2mPDCmg{c}I1Dx$DMo^i|&EDPGQG^0ugN{6T`tuX}3O>WMl*GvlFv=#d1 zyI1?GCNu*Dq`zo0wBJe&!TnxsoiN#0l+4^frYesUB)mkVI6-o=SBBLWGy#_65`tgN zo44KWv%^o{7s9|?i#FS@voC3)V7#3r`W$*E(Q=Bb%~v{A{8inPSAQ<~$F3T}ez{}w z_kU1L?Vj++{ZV?!&qqhJV?#z>%Kg!{ty}fidtkJGF5Yp;OJ!8-LN*YVkif@h5T!gn zy5z7zvIxjl0*8N&!8Y~KBcT#{E*;a>+Ds9?SkkDLeOIR7g}LB)z0pJ#rg5f=@@TG6 zyJ;mm{FLoi1BQM{8;ZuO-TFdr6+f^6hi>~q%cPKJ#xHddgHI%0byGKQ8%p%9PCWQ` zb+#jq@3si;KI^0&dvoQxZK~@f+pmABf)_{>l5acLcNYAEiC2^rJ!V4o$bb(MBfF z0^bZyMAb~s)0Lyo_Z^golbHw#-E*>;$K(F}QWTp@&!$fgMuov2fBA$=g?4!#n~u#1 zrxa(N_kYCRoq-~bnJs-6Q}3MGIySCiEyD~&iX2q){Ni%dpa}Sza|t##1V`s|h}Z7h zO}&4JCW>6nkh#!64Y`>6)3jb1=^1BA8wt?SpM7*gL$J37(dsVS8P71iqG zs3k;pp;6V%BucFqBwAa3HDjubVWynXE*Txk$rcSWd>dMdIkLed7)%gft^ov6ZODxrjRgl__QU`pJ2rH8#(Vspo36EK4A9*|9&QH@T z8LcQi_#?J#cGyDqTh2o5tlls)G}>5gzmI$5u(sO%!U}Kc<4HZ=t!Axu4XgLPJA{O+ zuBhTBsUk8R#7L!_lZ3Im+AF>Yu#6<&Z#pAJ8bR)QzSdIJVvV6HeUpmWMPS*Lwzkr) zEutCy@Q`<~q>pue-z#ZO6vARJZ@irWQC2>R z+kEpGW6_^S3#WenxP_ik(O#ZVM}*&!JQY=rKpZ1pf36c07o{EkH27d=2QL%lapBkb z&?sq-ZzVjl$xCcIZHNSXc}}rsVR>|Q(Q*R$i(p8mU88jLA9cj@DO+#$3F#|R4}ZW(-d0&l7c&h+Dx78%<+D9d|+(C7!=2R#%p2phqR)%V}yVph$IasT=+Ur!1(lBXC z`z2LmirwN^GzJugM9<2cWjdWj>EAnx^t~m4fY0R_g|ka+W$;G&&*}sgV+PFPe(5M#64mQ{&(x zx57MyLXQCPw}+&%zXE{Hbc!+DrI#n`>Vk0T?Wcf!p%tktB#s12;-BXSuYuNY6< z#_R4Q)WT{73hNk2vWk_pRmiJe1e%3n8QUu^--diuEB)n8MhBuR15F)tW6^6JbYjFJ zbA)b#fqNqN4CjUEm2!H$>hLwW ze)i66y*UNI?9&6m@Y4Bpcon+@%?pSaxL-)jo324~!n`n7KVeLyt~bE}ql1FqyFz8t zs%ZGhNP0u$u1Fx}(Out*Sg+POEyCW-xkRvQ`{p@e)f^={fXSrrc;do33r+n!6X#sl zRgq$sGDX;bdoE3^_$ARjmu_y(25sK7dAKfAt_E=FPxBCtv;Pol+j0Yh{^r4w%+a*s zW^7ysx=}hF06I$W^~nEY=sf(P@c%e|`_3Kbj&t_joLN>Vn-b36t0_C~P{ti1=MdGm zq55SsjFdf#v#V=R$joZoIfR6ayI=pq=ka;GAMf|`^?dP|rhV~Jntd`QM2fM`_PFUT z><1(fG4>JOB1Hn_%kHgF{94^8U|ns^AqDq@vvMv9Mv!xn+cAmqfIn@;wFOedIlbAC z8i4r^9xrhR3I-@~U7bF{wgB9En2J0A52S{t{t|!V@ z@L=tbgb2Ffi5&I+g~hj)+s)>Vr46+T0U}Kl4D7kX@$S9KiIi=nLjF_Z{iZ*c+eunR zz&K+B%U~G{c(qTrM|$rE?Rw3&_9yJp|BxV@$NUihqTbdyCaNW}8PZZN!zozf7_hS~ zU%&PrRX!WmbM(C(ASE+Q#rh`8k7sgFfK7(?XE)+HZN|j8iwMEm^lxpAfWikq=q3L` z$g!Lo`2WRGnwyRBUtw%z-dH_@hg8HNt zFJpKv$n~1-5@fIm2KExk0`P#$M#Ou0-ESd8gE7fyv8nW3b<(`J-jw;Wyg{fbqnV7h zM=Jlf1ux`mTn;_b1Mc1jn-t>;=LroGu-vPh(RKiSWyl5WPw@^VosOYI z$?aI{SZiul1be%YqqWvOE<~O6c=%3Rjws?|Fcc5Ez7~5a4qy}}r)IsbF6Vy9cD9Eg zcRc!ZjG~^2G0#{_UsqROTO$S_=j^$1@}!(pbG&A>+QYyzXCoa>6BBUGF=PCgl^C)$ zj!!xlc61FOfZXHdbaz}9$Xx3cq%Kml2{f78$5rz7Wac2?Y3z}LTcwLjBCM|^pNE&; z1EGYRZ;7a5badhYL-X~f>2RFDbY!b{hLoL}|Dr4|mOdHL2t52MxP#04Wbt)v5KVmquNKB$cv-drm5gG0q>&z-w_n1u}pb!L3(-bf9IbfSjE9?7UEV3dopi zL{_DyK+Mzk(%u6(Qs!#SdJ=$U9RCkF;XX`r7KCrnEc#ta`gb1J@fy@pa_rd?#{bj4`5IL3D=dbT(wGnt-A#lx)`i$R?t3>U-KGb6dGU;O`ecBvUoRqemniUheJ-xD(y-KB5BJr!HhrB+VoKicw_!=o|ab zpgPfe^bZS~Z;z|QCCEf&fV`ig#(i9~?zge|OI|@5mHY8Coe(jimDNJKV7kD8 zl27Bw5{#uWqnBCh>n6vaCHp0fUj*6u@8#r7zWebV3t>Hhwo&)9r=3D3g-wu0%~2YEAJ7@ia>b-q-$<1B8;~uXIWe;WbYA{f(Se`ya!Rd800719wCI5 z^K^*p{~_~gyxL2^r0=V0&6nzMX{7B{k;q}FAowe z!`wb3BRb#hR7y{NmYa^ZxkK>Df4VExQV0P~;C zL&fuD)e{^7N|Y(O1D!!f)bcu(le1n2C@C-me|u zEvF>8;gyNuslx~2Z~w%tfu{xehuI~w1mWR$%KBH%EPT?L-g0Z;(C(+8Kqj-IJD{f2 z<1y5DQE9ENHn!(849g**@5+);t$+oL$q-TRvWCb(*hTzn$GX^vBK|8@Nn7LTdve@_ z8P2%+P?0{+aTOnP!a{ee@AI56-fzgMKxbE_5ICe&`l8MWz_0vRe1ubbs9P6nme50S zS=2g>&d)ztau9$sVUlnKXu4>wNLh(P;Ce8m#EKu#x6}49=un44+(ih5LOO0vUrIS+ zBfj4nXEiW9C80;~5ZgDj9PmFDd#2AbO2I2;Jx)J;ouo*fS=D z?GBulvF;;Xm7F){>&j!$oK8-|QC~{_N#6u_lfSq;KnteFX`x5K(KjkP}_|WVsOjE0?40D4&oK@=saiP%POJ-xe3mIhE>$Ax0wkjdC9wTIoxP9V{(q{8M z)0{c`1yf15Uq84yY`ASyGzvC!ZMPck(3snY>Mvyc zxdCmuSU_Yt(|QWCFcjr@QD@8YJGlp_7~QNPLl1{Slv*X<(dhJzZBT+{ zmvZ9&xCddCzla7g`O@*JmhtnpQR)gS;sfM(gwz&?Qb~s|b3Uti{>v&qWZqCry;jI= zqqD7feRGF2^Fx{99##igZM5Ev9q~{78bsmBtEGn0iz6U8k=4eS*$N{rNGKm`ahw;~tJmDuW& zqeME@T0|k%N^ff=G+L2%hCdCzmGe7%u3*QzEt$Jzx2I|WSdb4=qW++u?)gQnB3b9S zKcwajr4@E|El4i3HB0x*)n&X4max90b&1!baQ^L&9<2u&Cm-oo|M#e=98%l66bM!r z=Pcr-V6Q&2&v}qC2eIRW=C#mTVEf|@O5y*mf~a4cbV2dcoh1O0r3K1Ub779&SL4z? z@cawdzYqQgl&>}%@8LjLrw45oKu`bXd%Soo>r@OX`zBs5$?12|;Q9bufM+{azhk_< zPY&0=-}Dd{jypfXVutoK(E3_U6cnx1n|Vr`7V~BT^X93EWZ^Uz9(w5AAQozTbDb0KDlQ6f~GA0T#2D*$T^f_}k8(P2HpL0$o7 zp@V!G9HG(B`87U3$h&@K$+>J%9!ZxS1TZ6!Um$3cBxUs{of%59x(=MBP%}->^!$5f zW47Slm0e)a0-R%VbzDSA?Jp~Hy%6h`%|4p-BkhRU>G)E$sk;n{J2p(oKl{_Mb_>qn z+?%o3!I36Y|0Thwl8!5wPpXxSD!L#G8-3zvvq6ED7G&|r>(+m>u%!klGxL9LW9erg z{NiHzKp#o;pS3(0JaK2A51xzsrzJTo&8LPBX^IHsy8RoyKuGNKL`1elb@VLtU5Sr? zyM#1x#M+LS3!}WE?p{+KGUJyP$t>^Fn6kbX;#+<;<9pI30HJTRmbwNF3Cw-ojD4La zQFH#Shy`xS)^*LBVIPOEtV)eC&C~2r7%)lBmZ<7v%dRI6okzI!*Gh^bmch4!4Ah^_ zj8UZtpjNDZC{;AkyDO;mA=uKSoxZBqV_E zXran}=k~P9Z_j_@XGF8KKXI02(Q~r$I#!cC4gc{YWNwUme>EnZkhrNX;Y;t3ko6Pk z4r@kU@$F`mA(xf2<=oGLdu)y?XD(RvKX2;ZC6+E9(wpn{uJ;r8p=P@qdy`%UU z%>?}9o=PbZi4I=GL2E2gSQL^y6v}h>&iHiaJreKlQ7HRaDjZ3NSQ&a>DY6(U-p{>R zSrD@Ku0ZJqHMBbh!+OFM9=mc~%m{EOit%)%Ror9%vy!sUyxc z;G33mWlJ|}c<;l)szpM8KlNqv;esybpIiq{WIyN_Z zk1w^4F0`3BVwb$!!SA5w|9P2WlNor^QI!wq4XT$s^T1C0073HZfZa&GI2Z{jZp5kP#AC~j zYWn^&%J^(fPGFsk5L=;)8`9;DjQ7wRj3sy55%0)D0!y-{aPoGYe_Bt6(U|Eh&;M27 zTE{{+?I{)fCmFb|K3If{!Igf3cpaIGQyyxK`8foMqe>4Hj65ES6Yv5__5f`T@M93{ zhT_fi7MK_ypd%flLV?b6M%`6gS+{t>Dw;4m7%UxD&v4 zx!UU%n)ycYp}P1GgEL8$qze9kf=I~c@xRywJ&EX#_X_TsEPP49C@Qz_#`Bf^WV)^O zcEG5-KK3b34A-u~_%{1cxzC{PNupZ28b=xC7)tpW-RAfwv9SYrWBWoOyRRDT+mK<{~`>*|+q!jaXcI?2#q$IXC3)rR6lfGsGy5GPb&7v}+? zdq_62j-OW4>yZ}3(FV}vFv%+)*^*tVwq}$KH*GCRct?0O%X|W`coP%>yHY(tL04$Z zR3L$VyV9>Q1h~5PZ}Bg426Xc-=@^z(4rq_^G?1oeI~N~fjyq&?aoMJ#--|cSs)%tw zTkqXgH88w^@Ii3u)ElrONbhkGq%99fqDiMj83fwY44?2w!ubE{LN^1T)k?wIG9bV7%5aX;M0fD$8rmqPpP zda51l|7w?Y>0pSUYncT8QDfKpS1v))d95mqH6vAc86j*l?#3%CEe$#N)~EfAWBG&z z%1n5q+7V3amaSPvo}PsVEsKAqgiNZx_Mb!hkoW+ z7^<1alaLkj|9%t}D03FIG2Xc~W|eMw7xIRsc2L4>Lq)rpwk(F&pq!*IEPDzT$5y2R z18cyfk~tAyvakuPrcRZr>-Q7##ZSsrE~gCsxmnVW`$RG$k7Y5=Uqm4e9seZxoxcQl ztCY8*9uL^oCu7r9%zTiZRw+5pHGIR!bUE+|sCrDR6yK^apetMBosALOX#b}A_h zYRo+KEf|WQ(n1tdfWTzXvl~YY5ZH>?FOC~fzP50vV=m~N1NBzC)GC}~%@NJ-ZG3rj zEhLPI(&k5Y3yY;A12s7!*TvAwlGegj_XfcGV#?*A4tty?jv9(zC}etU)kJoFz4m{b z%D-G>$!mRVSsvsvq#;G%^cgA-r4!Lzfn^Z*QJE6j<~7;mls)mpE_JeU^}J?8%9&_^MG zl=&VpP-;5}0KID3LOR3sxt8Bo^0%R5uw3Y==_2QY)qlXt0I6rFTX{$tBw|6n!)mbU!A=Z&5)cNx#^W7-BTI5U3gHdZ$45 z?z-ioib2Z^CmLRtp}B4ExlFb?BnC7(!}6JxDx7$W8{1izra`VBJF4D8Zs=BS^lg*; zJ#hY*6G>}WdxMkPExFz$X>Q(pjV6HBkpfVT|3oQqayJ;NkA;r+@19Za!!(}#U{mwr zA1j_xbRk;cH#S53JKT&?0VJKSupp<0+BWHZIBeT*bRlT9G4EK7>xusibHbKYjP(fb z64a#ptV{z&<9t;_Gq6JdKN~2ob;0Ry$&P`vdL>skc3o~R=GKkpb4-`loCP6{5@w3h z`s2!o&KPG(l(R9+DERtJC%t`O$*H3pd;xPPvN?fK>X9$iFfa5$E?xSMnMC-b(ms-k zJ+!?0`U3?V&F(t^B>&p_)=~G zC$fg1FT)vry#a5>AZI0f{`Xa;K_S#XhmSo@g4>cYiM6FDA&wKX77Mhks}^W}mtdEf zo%n+1VzG!Ulh|y-odC4nnpzkkw|X`@I34c3-&(~Gs04(T4Q;w_&!x^OO%GGxQ5t7$ zVZ{8nB}6<-)TZ~d#9US`b-VhkyvXziM4XTdDZMosX>+K}_VNIyC;$1Gz~LP)p23{> zW*8U9w&2Y;Hy*FN`Se!3qHe8BvlVLW`x~mGn;pC~t?Vl($v0XYE%}t6zjH8QV|)8hO1?WkrUBU#_Ltiz z10B=pldZ-j{ebx8j7Rat3mFjQK1eNHI=Q_x`x2F>x-cK)3zZYjt7z{&syPJW$qT=K)oZ}9tPR}3yTN0=_r|WCmx)jdm`w8jv~Wz39d9{K2XFA z9OrbC=HJE}q1f`1>AtpXeWu4-#N!)Vg0vKnWn;Leg^;B?@)Q|#Q&!5O)g%5mxp()9 z)08(Zu%TkXWGI1R5)3i<%^;T~h3RyYQR(Q{oY(_W$@G5qrcBA>;?7 zfNkCDtaG0--TWeCbiQg|n7Rl!1e#8K_=AJKqkr!b8Z?51%Q7Cu1rBAvt{KL)veJR1ccsI9&sOY|-$!P+EXzDd@@6WA>N?Z|Ee>E?+S7 z=p<^E9QMSJzEj)O?fXm7_QLWmtv zs2r3|!&FQLD>1N$!IS>dg0SK$k%D#^00t51y#LuzW{{E2LniKF3tUU~U^hOAPi?NG z)XTXZ6Zrg-UK4Px+AO{{XbpeK_~Xi<-0iz!%9+v2V+IPy(61Q}+7kfTxIpQ>jNx(ifgh8Ctu8ETTmi zRUs+cBtsw;-L{Q>0Y4*((_I;^t-Ps13yHIvCniMUT|kf1rRy#F z?eS9UGpFgY&(Ctg;*Jn^gCnFVLyL(>;Av|6<26j<`Gx8g3LFpOVp470E(j+|& znRfkd+nH^{ALL7*A3>JbJ_~BkDH>W}aV7`?X#V|}FB2Hw-&CJrRA%SotCCkCLY6@d z6TODvn3id(>fA@Ae;2)-%;RhSO^8pRGbc(4e;W%d4e$vc%%P+Ts~jl}{;D7cx&Q3_ zHv~jlj_;z4(x@)g6kxB#bWm&86Di<-Z>oBe{C4FZVf=NZUANZu8^#q~_)-6(t!>!} zwOd10G%@_?%!QxhSO!%tQ}}xKI8RcFnRCyX501<5loNb1&)KwfZFF}H**pkC($V3P zJCTFPLANM?T;i&juc3MW*?B=rcX#(jd+$dcFrKl0uMCeO+AM43-iNnVSI{~I6pY~$ zkc4`RwaBaRUdk$j^rh$i3uyOGby;P>%TO1&TRE@O_mFGxc&dp0x!F7zXYB||Gfpz= zYfCPS^J^-dD@pn!nvcqn^hB_DRNept#2L)nnq(F5hy${Ro!wn~eR(mud|;JeCUA zH&ZBoTml@&%9x6vp)F7p4>DgGjWmhX1rQZKxZ!H^JZjuD59oM9Wckq+P$b6j$l+L6 zV0gK4DTw6htEce95hmS}5JVNh0kw0S*J>#BJuLhadh}&y1kvw3aix<5hD60J^$3O> zv5hijwO$}>j!XVElF#h^1cIKN8=fCSfR}*X2Hl-$mR8jHbm@}UIR~b1W}Jd|EZ?qO z$WE);v

    ce3;=W7wO;OX&24e*H@&A&a<7KtTg!RQ;C}ryWq1IddP;N2xGp zmJQK%GA;dc#zNLGy=1a~*PFQhVl%h0n-BTRjQVXs&{W=-H!Z;}uY1gl0IX|IDX92fv`XiPH%oL!Kj}yW!z}VkuFC;`z##4q3WLwymEMVJ85d3s>q;Nh~RXS4T#1P)b_FbpY z#kBh~B-yV$ySY;GPg3mmX*-y!Pgt!{Cc?B@Cn?_%MN@Wn1{bj$OLL01jI8ce+bEgR znK%`7jJouI9SW`rr9kVRBMYux3mzxarlhb1Y|@y``==$*t@1ocEPM4SR|lio>v1yh zW|+mvlG4v5e(Hsj*b#5RUTnmKR@{V zjMjb(*C8u32zp?e`B@BH$+&;@=N2SyNS6O}0qt0=@h|sFlmNuRlPSHb){tud;{w*{ zQG5mYrL#qIzn-ZPU!NyN!CZ%|-bQnJEk#7CZu&S&-5SOlZtWi3+xQFFVmO_$L1o&& z)K@roDCm1Rx|pJ49!AE;)8ry*I=l|+v~rr<`IK5OhZ7C|_70P*^cXI4EfA7ueZ=LTRA zl;{ULoV$7qCINRR|JL^$17pxwMlr?^Disa#1R0*dT1pwu7a4(fAN5$3pG#I;>^v6on!TA&c94poI1B&xHS%z^Z9VYAw^A_ zc-eSM=qmA8=ADunuhFoT2M$pIab1+dP|h%QcSktk9p`mMhb(74$E|&^NWr7HS+7;S z-HNHu%dpteg41bPB9>PtN?BOOXD022vFjygJUWzO~-$KBxI@2ZP@_*BoTRYu!BR;_kpETCy+KW)RQI$<$T8yRq{|| zS^(&}gBTgV7p;yYj7U*LeWwsn^3(k?x(L1dFymH5qJ-~EM8Q1#E#0;l6WP z!^$^To=NBs`e_{c0r;?kHr9r=h_){nK*A-kRK9uI#%;LK2a1IpKF9SNdKp>txmDH@ zVN-QY%2og2BWxsG$J(PmZM(SjzW1?ti@g9N(1@X5S5sQ1=msurlXi4MtlUD(F4>=n zzZrWYM2XZpW%dqFfR$J18Cs57zCV69yL^TOqHe^#D78X4R?XzT#%?1Q(Yg!Y zgzJGDifRWi9vYRvso2_myNN5KK1M^G^87t>-(AFrZVrl`_Zb-z_kePZ71%A~feJU<}* z$ftCQ<+~eo*D9F+)fI129bE3=wC^2&chN?I9NFnw?&ISzk)QegeO;1)4-%rfhAZ?9 z)wVN6R$zZG%kMt@)hYi}3XnJOiH8c7oJ_^H5G2pQ&T0X?L03vG#Eq84nFS->!Zn1Z zZ#36PKT&`bzHB5wsH}`2fARNQkeyiUVGjnSR!R402O7|SawnAemT%^8rw5bOliF=^XrT;p*FXKH@d--d`UMNYf)ap4?<0nul@)_d*@Kh|LrZ zvbwQ7x4TjC#YNdTNj~^WadGo3BhWXz?u-aB3zRLfApT}+C|)C61q8ijveW7Vdq{A& z)@XLtE>iJ{ztu&~Bp=BbMl9@3>&SuSP4HJ>!Wz^DMR3ZWbiG|z zq3tkIAAA|SbNCkR4I(Lq7HlY$?+v6DG-u<0iZ&!yrbxP4&8Gu^S0}d33zwsxE1`oL zHOdK8UpLDdw8}~vfS>$8IbGx>qOdXkN#$9O>)0HO|3ElbRCgyvIHTYZf-c*U#fYe(l`kD_0I{H_Jh*ek)ay6*r;>oRBA`s62~Ih38k2Ujv{{Gz)0#Tdsv zn?5etlAhRVLH@WW?}D)4f1y)J>zdp9T`;b#!&{c!YRa+eX z_hhTc$auZgQ-|{Ssx7nm6LH9-YqG%HdoX({NbkurKC%bJ`-$2S_(<<%Tr;n4Tp@gQ zwK^$Vo^IRG(pQL+Sgy`LGF`s6T&ljZf&1T&xxec977*5Z`I#a=2mscDOsg0wk?0=h zn=W1~K)WGP1s?&Rn�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 Q0ssI2000Dlvu=*0U#6L1V*mgE diff --git a/makefile b/makefile index dd3c816e..2b458453 100755 --- a/makefile +++ b/makefile @@ -91,8 +91,8 @@ all: $(EXEC) comp 16.exe: 16.$(OBJ) mapread.$(OBJ) jsmn.$(OBJ) $(16LIBOBJS) gfx.lib wcl $(FLAGS) $(16FLAGS) 16.$(OBJ) mapread.$(OBJ) jsmn.$(OBJ) $(16LIBOBJS) gfx.lib -fm=16.map -bakapi.exe: bakapi.$(OBJ) $(16LIBOBJS) gfx.lib c_utils.$(OBJ) modex.$(OBJ) - wcl $(FLAGS) $(BAKAPIFLAGS) bakapi.$(OBJ) $(16LIBOBJS) gfx.lib c_utils.$(OBJ) modex.$(OBJ) -fm=bakapi.map +bakapi.exe: bakapi.$(OBJ) $(16LIBOBJS) gfx.lib modex.lib + wcl $(FLAGS) $(BAKAPIFLAGS) bakapi.$(OBJ) $(16LIBOBJS) gfx.lib modex.lib -fm=bakapi.map # #Test Executables! # @@ -387,7 +387,10 @@ modex.$(OBJ): $(MODEXLIB_)modex.asm clean: .symbolic @$(REMOVECOMMAND) $(EXEC) @$(REMOVECOMMAND) *.$(OBJ) - @$(REMOVECOMMAND) *.lib + @$(REMOVECOMMAND) 16.lib + @$(REMOVECOMMAND) gfx.lib + @$(REMOVECOMMAND) doslib.lib + @$(REMOVECOMMAND) vgmsnd.lib @wlib -n 16.lib @wlib -n gfx.lib @wlib -n doslib.lib diff --git a/planrpcx.exe b/planrpcx.exe index 7babadd306380a41794eba75548f2c5aacd5f443..865a95c40880f1a6c9615d99acbe1896d181891d 100755 GIT binary patch delta 32218 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 delta 32218 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 z z0&7?<#H7-WKqeH(s>HpC`jSa?O3oq6++7LF>fI_PXpO<)*u1)reVRH6b^Urp?zm=M zejm{qG(PP^Pl)^{O--Cx7~%(H|85r_BE0PJHJb=WPEy))zqKxYBSUOD*%9Hpowf`* zn0_FKq$fjNum>j6f{F z&Iy!(vI_xiP@r%%khu78d_GFGbz6pR|0Q9~=TzQp1H%(Cs9qKRhhA;|+?mXqy=(ZS zP+zUw+`@;PdQ3;Sz`NhYYVU0sRzErWturLa
      E`T>e_ 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 Kmo=%coc;&s%Tlrc diff --git a/scroll.exe b/scroll.exe index 95ddffb4b8d08e1ad01b190fc0df4bc6ae65eeea..11bedbfa60b9cb6a303fff11c539df164df843a2 100755 GIT binary patch delta 44104 zcmW)mWmwaV_r|~Lv5hghVWf0PhxBNehy!U5kOpBJ7%*DK05Ki|3&d9Zfg((%NT)$4 zP9_o}GRlcO1F8L=>wjLH>%2YZ#kubLbKQ-zu;;Td4WD2|5Cs4MV8B2@AW%~LZ}|UG z_^-o(v)Gpbayr{PwwEPn|83G2J8`BSg zXy2+OKeoJ3LFf9WQSm0G-@r!3W>aU7e*WqaunbeMW2XGiE9ZY0Lh2ddwIgx_>kPB7fS0)|L&I~l?a6bKg&Q2sLe>`;Vph;t@1oNq+_qH*odaYYJ#Q44L0YiVVjm;|Y@+nI! zi-iMTggKP2Ow`G#PRL-}$05$oZ)_8u(n(FV!FN9!$g&Y36Mg(&W_X~2+K{J_##GJp z#B+=qUeNLN2WeOL%D>b;6=5h%iPaT|Ft;}Wx>DX@>ilOzmPKX9Zuv0w4N>@&CQ}`3 zKqB7l0Alu9dq{u*Wdwj}VgtJfMj)7@zPN5&?Wow=W?Io4 zD(F*rDHfkd8kpx)bIz|;hyS>=O*qfUt?mq0`JADj`sc1$RE(ahpb&v)$pMj488Qmc zn~d?OX5747qtg^ix@)}mAPj4ZHn1AVio{0&xM0ak^76s}u1 zca&IFPkh+a2GPxf&=B

      c~Y!gor$onkYW5eVdee9i~3&f~LIP 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%0A#psw0}2ESlH|K~LLBs0S`fOZb6w@EI^I~W3S^KK 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 MqazO=2s5(&A8Pyb*8l(j delta 44102 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�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 JYF={M{{U^!xx, pee->yy, pee->xx+TILEWH, pee->yy+TILEWH, pee->coor); + //mxFillBox(pee->xx, pee->yy, TILEWH, TILEWH, pee->coor, OP_SET); modexClearRegion(page, pee->xx, pee->yy, TILEWH, TILEWH, pee->coor); #else modexputPixel(page, pee->xx, pee->yy, pee->coor); diff --git a/src/lib/bakapee.h b/src/lib/bakapee.h index d1596109..5f46f256 100755 --- a/src/lib/bakapee.h +++ b/src/lib/bakapee.h @@ -25,7 +25,8 @@ #include "src/lib/16_head.h" #include "src/lib/modex16.h" -#include "src/lib/modex/modex.h" +//#include "src/lib/modex/modex.h" +#include "16/x/modex.h" #define TILEWH 16 #define QUADWH TILEWH/2 diff --git a/test.exe b/test.exe index 61d44b650b7bf754d799119249232a29de6fe978..5f1f4b9bce9446051d37824ea0b059e36fd5324c 100755 GIT binary patch delta 29347 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 R6I=BE@slh~M)7y;{|D~0nMD8q delta 29348 zcmW)n`#aN*`^R_Q*vy>f%$##3Ifa}_A~_{z=^*FWMk*U4*3hbV=cA;Pl*)ORNo=E|~9!MebP1Ug=);KkwJHRJMO$-VZ+0em!{Bat8EK1`I-8NsgeH0VaD*%t4?C zFmMRs1I>o{!vQKn47pFl5eLjkypkN3+9fRn$^6D6WT!jS9^Am!CG7_5K!m%X1eiWN z+0EIpLfTp07<5imN={Ady0iTO=vOEjfH}Zi1L(hefZBWzmRqXB1cH16kI?3cbYPGL z1JS!oI|1xIE~Q_G-crOFX1r$r$lOjMl$QZPSnhmV%`iN1J&P&k62}3YGbzE4W-s{Rp~IbI8ZgMxsi4k%a@T3k+FC|zE$%VKtAIW9?le>NE46?gs3?5chXLQJBY+GE=+coo7~udM5aCG3IhQ!@DOT#Z>S?-1Zt%|A2&(@q(KGvb;_Y zpYNXG8ZK6wO~5&G(o^w}*>|hmOUsm0bF=ha1ZL6*ftD$lgkMl7+Q+3zjT^7qK|#%F zPFSFK+6Z`t0T=Q@IV{cG^@OF{wPsyf2|D!NYR#Ga(b;PyOIj=xsOZRTEma2qxkD2Y z&ier6F4uEvSIEt(#}|l@_v5utvC7?nzK23H^5zYvII4bHQk2XhCNGQvC@?u9MCFS% zLSD{}8~9+h=XOj=0+`GxdH*PpOCd&uQP3}vsZ5z((E+BGV9A@yJ! zj+2zOJ8>c@At_K>do&FMTJ(=PhTDlvI-3gGUoI;hr=J+MD_|=bBQudLs@b1(E=<#X&hA9VUGacO?4< z7{5|M_+ZAV5ZsxlQ)6jHE6K03HnBTE@sS#&8K@7FsnIxU4 z%@oOO5Cz+hZ>VXs7a|W-)=HzLi+55)82Drn%OY5AUltLSysxJ`Lv$EWk!)3YC;oXS zEv|x4pY&{zKL0l;2&vk5HY_A0_~>BJH^M?Y!o(~1ebn(M;!D@m^i{H`ji~kKRHDhK zCWUg>q;f_ctsqR1NCXdrU18DnR`vP+1#xy^I00W>%Fj*{@# zSs~K}uZDp|!b`z0br0AQ8xA^4v!adOBia_k3UA3Qj>pSg4^CckHo2G%uR_K!;GShmeb`-B)Z-BQiFNGThoCLWfH zq50hYTKORdFc^taF!;&S|8{PLzCkCqtFDL(0m}pppYE-PRjaU}w`qjz_kSmMwoe^W z3cDYWWEkXkSn)0vuhYCJUwWS5ryJ(UDA#<)-#!}h_SP=8v`}1MH7M}6PD&Ws@&g^% z-SqJ$tZ3*Fg7X1s94$N*PiZ;wY5n$&O2xAflV(K6@RAn%MCBqE(`d0Vzo*tjqw=#- z%=o(ClD9xm0q&a+X4c=k)8NcFnZ`k~c(Nlu&f;6BK_>cZ3IE#UPkU?wmFb^}1b z$9$=IFCrj$X;6Ixx^jutjU0snTaa$jT-c?e1p&}+#3@>b|CylBtLMj<4U51H$bIpb zaTlM3WwkDaBj`xAtL#FZ1#$zEvgWR)`v7 z-ud<_*qx^FFPcCKwtxXBWh>HiXK&0W|a@v+Hm<3TZ%JU@VAVbM)Yr$#d z9Hr#~$^K=|a6_9u&$K$xzcI!m zNjwpQn;1<;LAerB-HTi}ymZrn`~I@B*zL`D1y=mBu1)BXCut_kqkD-YwV`E;V*|ihDg2)0q8&w?H@xrcTdOkRN&gwEr^2=xRA#PX zkQfQ!|I7>#T86HWsQYNt&($&t+ylMUr+~OoQfKMQUkC#4!41FgQ~V3=oPX{VZ`Eos zKE=S$zpm1IxX)_r+7X_QT6V1e68}-G$MqtrNEL2^?u$y&TgJ7b&ZXkXPA0MmECj8j zD6(YWx$NJ0L~UYe9cWJNn!Y5Jy#)3@yFZEbL9Pv5Xtq<^31dz|NX;;y5n!<{hLquX`k?~k)Kf+ zWJ$hI$&=rI9J`Yw&l1h?&utu(XZp)>vzX9V_!ruyu77=z*Bn~patVpa+%Ix_a`)!q z^?ao-Ytny9%7cr`>0tJ6xy)DG@gCDPm!C2s&ELOH#WqOaZ2c)u5w9xo+NQV3vbGlV zy%mLh^p3TaULL&jKs16y?Fu@hn~(zT=X8ayn>&ApuFcDpCIsTDWMMnIpn-xc&CA8j zr{q)>wO=nqU}9CH4#`E~I~KoTx$mtROoaTR(K_eYB15fy^CV)M0m$Cl{Ie^PVXS#5 zjWa0A)KojVBTM0G@9dV9TT&S4{ZFfI`i$%}?ontEta@Lz*-b|f#R-X!mK8$>u)I`vTS(Cyf;Ugeo@dK5&gQFvH!kaXeDXt1;g9IaEC z2kwWnb4Eq{A!AZ5GIroqZzDq!_U{9hA?|x@YW8`jyq(~tZ=Jf&%7Aj0wxn#u^GXy< ztjwfHkyUuh%ky;6n}`GFrYPy$Nul6g-m%{bw7eSk-_v<`Z@fyAdt*KgfTVQ!TB5&_ zz#uARt1*d}RtF4W7R}l(Vy?8q@$C$`=x^_jWLv7C!Hcv_2y%l9q6wkzK;Qw`gB*4F z%<>T&7fzCI(k(`;*+TJo4GGE!j>Rt!0f8;}nLI7?b3>d%$cuQ#Rl{3R@I4s$7~8x<47 zN7(*O)2XOqYSMA0ER9E;iQfrbDFa$UHI-WI6;{1e@sXx49b(`)W9gayiXlh9^>9yl zADckDTB0FXTFc_RVRO>rkxLUH`YStSQk^R=Ble_6c$`ZpY82JKA_duN0?ByyXI#(% zCRLii5=a)`+Cz&s9oZxKU>6Ds#h59TT7iL)mF#9nbZC2wM73gT0j7a_P6~QKoc|6| zE=CxrQk8w}d!C3AeWOOVIiznP%D6VtZrBz2{^MQ4v+gx%g8>#A`Yned)iUTvcNED3 zWo!ijIo9;=NIoh5=kd&B^N{iPR0~&Q<$>cL0|C)vTs{`)KgpAG$JYk(+IQjzN$Gr--Vq98isfDMaln{0EghWxXrcN6i^?#ArKY0y5yxE92(b zBZ#-}alb!fA-O>L8qE4^DK6Q@GFT(Sht!ng?8MHbiFowzpX1?`Rgi=pRIY+1#sEB(ef5P^CmN%q5CrV?zt;&Ug0*VsyrB8ansaYJ=MCd%3XV4pJviRAXlrGhrN1#z!R4p+cRiz znDh;M_s5AyWYpc{A(;oSUwf8nYK*umU{xtFO-QDh+c5u-lG)5%#bNh9f^nj%rr~at zuOs;C!KAZZSJX>$D+ua8K0CW2!^g<)ogHqz2M?|i!TWEAew9|%(WqVbfz@9@dn660 zVioO%i-w~lrZus5(Zf4p2BUsWjD>HXeUDbR>pgp!*Rjw%DHe^A<-5?DGv`h>`yQnr zhnZrwRbnSKe#a|%K5Igqs6NYnb0X27-Ys&<#31i$pj{JMC#HqR+k#esr<25(2)!My zhZs{0mR0|HCTYM@%q9Fhh#6p~ET)A_nNeDe^5U&wkUINV?_hSz;}}p%oi{NSr)FD= z$r`(+B?alB=&irr5?UJ1Vb^MBDKH=X3-)5PPl$KoW53nmBgSHSvyz4aAWcvD3zl1@ zxYi_LjSHoGI zNK4Pq*DX7iQ)X4N(2}I%jo8y{J8fr=W@0KDsUK-41%HL!KsUqC?~#=8SE3uXKSZ;Z z<^Uk_g;kxXgT44QQO)kfDRNwvXx3Mqs!bGF<&KiV7v@*s9#M6%~_NHO8hEgT`A9 z?^PAcb2p7S0`dF}X?roeng-O{=mfn zRC0!ddG=yAW#Q7suTpc3HnV}jiDSF1NhBvdt#^HqtGk=eaa)nO0Rw$BqXnWlAyHg% z9{MUtU*s-|Bmhx$FUts)eiN%u_P>9V*7$Rie60JSC#|F8r8C5wB3bRzpF?(C4h+LA z`~r(KwZRB7Cfg#V)>{Y+1c}snhjf^IlG@{(MG&J5isXL|e9)l@F>FuR)oxjX51KF-P5ZP-i>)LnQwn;mUu5(jsN7j z24zuHy6-()qf}k;eQ7dBmm}uD0^Fo>iv>qR&@c0MGA?cVV8Sl<0cn$@W$W$~PL#xx zQ^+K^!=33TD}M6+K%}ic5CgAxm`sO9?7&3&72QutGIjbYELOd6ovv0k@TLBP;dm1^ z@`4IFtMS%}(vqdsy)febT2%AF*5k^Q`8TjMt-v{Nvehq_{WwG^Pyx$btAZu)fjt|? z-#dxXU%tB3VD91JoeRt2t6YFFr7%r);HU^2Q#J;?ARnA54iBpPEcs;TH$Mli@7Hd^+%Fn$pOy#kW9M)04RRWP;Y*#wTnacTDN|C~fz;!n)_ z-1gXvcJQ${7-%@!=2n}sP&Aa(bfm5kUjbTveaKVdrSfO=&LtNxtqn3RN?MF4=$LG% z&}2APpZ=ibcu^dYTSZa)Md@28B!4(nJgA>m&=YQMc_nyXPhsYV!pCGaGj_yUuLrGn z1D3Rn1vdnu*BF`g_U7lC)9}yxy3SRvj-fI}flx7OhH6Ix>%@-`t*6zInX;nM8)Hn2 zNPJM;XLXtbZ5ELO5*yy#74U%9CNw!5rNVy~1}0*>l8UI|c%?ZqVG_ln6-3f6F@{P%eiAJ9l0dK^}k@{tbmtiIWahK5yXr35~<^ z9R5AyMR2)>NRX;IWpZ+=Qz*Y*GSyv^KcGan29Qesh!E8VSa9v~F3RurBNQc!A2BLA?i1lqNXJPa zJ}FHNv^KN`aA-pyXbY`(3&a>wsdH`|x`e$CQw92`q5a+0e6Dt**=r+HR}i3ZEoev3 z0<5vZZNy%rkQ&=|$y8vfhg5TL=QK>s83c-AJG)Ixb{pw6f(YIL2M<;g zlu|kRiS7xBMx5g(_D9DI9^b*|bF}Yz zf7`Z&rUVtKI5gM^K7znvpJ-x_6YVAe$*l7bD@&426ZL%K07;GZ1q|?&?BY+76c~#x z5DXzf3YV}4)+l0|NJ3`ue*waMDRAoQE7B(AeElo8dN<^gUW%Bd%wM|2fi@2H<7vtW zqxJDq*cL(iAcB6oxXysmxP;LEwtI@b@-nF8S&WFB>S6v=vHgz%(}!O;tXaD6aLjV?Q`g2h@XDJY;<^oEur?@Z z|A#UKzmWQZ9m=<&@%lWyYDK$^8adVAe~jhrSH>BnEym7Q{VtD6hu6|7lMKDOya;sA zvBUU#`QulKVm^=XjLk}|R{YQXa*jT%sCw~pLTSaI%7fo=wCa}9?w?P5{c-iGnV7*R z!g~_9m$z=dn>BsZ`RTh8(7!Dn+${c|nBg5{^f1>&aEf9lD}?}kej*&_~hvB>Yht0#a4PeoCW+5SlWt_lGjpLV8EHY<@ zm9eH(UR`i#z*NZ=({+Ix;P&8c6;YOPb4~}Lk*d`>-+}53Nm)t}-R&G%q$&N*eBBnS z2?lX0+$h^>Giuh`3#*UnH{0mRN4)FaN81KhcE#+>rRoaA zxP{THpVhgO(UqbQ;chdShH2Apxlx6CsT}vb8`;RYmea)_9xLbj}ogOKWanT|!puzS3o;JHp~I@N$#32~3gTb`iIT z9xPat(F-7QUF$5oyXHtRtqEerfA*lQDM7hOI<-2}$&wM^#8c5-gAwAE zzwH&akISs(GwyqfS0F(t3qGe9cTkk)AX=s#92q;)& z=d-qUftI~2!yQr-v!x;R@Qll;=iHeW0;c8uPEo3?vw;4t<(d;}jnBe(4xW?AJrXY? zst%x+&&V@Z63k;rCKKq(U%McnsO~v|e4Kh|RaT>5G8eco3O;44Ae0vY@q2i*HX^3! zW34iSl5(qLx0Pra75&p!TkIWEi!d8gG^u8x9kybXSNEB(-ts^unk^z4p- zi9~weY`I&@27#>Tz4Y?fjdSuFFHy}0vJ8VB|K;xN;Q#dOuP%4g=vzOie#2UBCL;9I z)90emKah!H^8G;MuxEhPig3gx{HTZ*S?PPWePTHXu$u+a*5Oc4mZsvPB{9eRR8Hy= z!lh#Gyt8CrA7HwIP*uO}CH=Ur7qZ*G6sTJ{y(_CETO9Fe2S$!#STu9CDa2G6YL5*^ z)L-WI7fI*#e0f%wFxBr9ee++|!`F8){e!I?i}Uq{)0TAdaLMAqdwXQe3=2g~_W#rj zESn;=k{^|f;Q6JAmrVO$(R+MRTnqMqyo!)t#5d<%G;oh>Jn_3`pzWxmTjs|H%A)7V z!GKHkl!S!MW#x-_=^qW|loet2G)HP?z%?;~wR~kEwm@S;iGNM*y5T9&ZHoo`7=ot- z47_8v9%)HG5!J0r=7Q2VvJzaVFpzFP!9!YzF1FTp-ZZb~Z6!9byB5t1O6n`l11fDW z*CLNW9Mm&AowoJZH|M~h(t8yCP9I&kp!d%XRbh&md@O!?Re^GMz0u{%+gx(0n_&HG z=i(U-QDS>9Tif$dAVlhiZ+Nif{ZYP0KB!E`_oNbC^Yn_y5N9dq! zl*qqqzAu$LY08e0>#lk(Q?@&TV!{gt*%E_g9@-MMVs-CuH32!&ety(hB(eSYFw@Y)K6{=6 zzx{kUV=7^v;E@d{RQypq3#X$a?Bl;|HsGEg%-R=}@D%c9V=tytE+I&l$k6+J;{x`* z?7`1+yZx!D+@DKL`;&aOMUam!)zuBkP`3}`Il9tdiZDT-Pze$B)vQN3+}5Zar+(J@ z@zk%!leZZQw|-Co+q7TeuB#~hFf?X=5-se$kbSi1GQ>G!6$HL)9I+%rsH(+T(dmDE zK1a(uMVvPKAIM2>HF-Inpd78=jB0!RD@q}|!4bTEuDP%pEkH&pnxQ6s{b^|~Y%gg5 z4N$Ep2CmH)>&1N9S?AZKHA?(adr=o5HqEGwk6<1Y7&iqI6>8N_?ZvlXaPpHxNqjYn zs=EG5SgRJgHiI!_bBB%i^Ev&iF)B^v!%^?ABTz`U_#3` z`+pLm0{kxcU_-AVNC&GmoE|Gh-3mFjnMLt==$sQ}@|$+WNKIVWs_{rRB65)56u4k2 z2(;o~0m5etvGID}9!tv071S+`-+sJFj9?YR#Ee@P3B`7Za5-es4<-@8X;pf|cX|7C z6Dspq0?5#}ISVD_i`flC7G@0$iq}}z!g84yg?Cy$)$%amj|(OB&Bfc7Kkg}tpg`{C zXq+Q#GP9u&V1ALAUHTzzbAzaFzAvF*dxT%-oKxy6(IT9*{!tFsKDbayP8!xOmQH}u zm!_qI<9g9)A9zs!F8aSd@9){0@BN)s4=UYPPq(>i8NQ9W(!Yv>{TEVD@N{c0>YBne zjb`rCq!-!QSH&#lBy8ymOwT`?6mhA*8iv=AHWo6Lda4EN@HW)vz3hwCOWCT52LWzX zWX$2OZXV72=a0P*sK5Dd+qhi2g#-6jbrm;!xrB>T~xJ%Lu z5)3+D3ZvPim=@e1XX?o!HBNaj%8-#-a{GAP1LY*%a^>dvsJrR^_@7FQaWLXRq@Hy` zOPQVH)a+rmM~Y9sH&V9kzVO9Z+tH6V+Zf2ya~D<9U`Xg*jTeE0efGRSU`rl*1$l)Z z{em%X$A5HA`|P=9c6M1-^G6)d3K&HY+Trk8vLSFrAWKxgzNn-q=I8!a)0TZx%lc#z z;uuf7XxzWm;~Q6vf9CBj>5E=R%7!F#sJ8psVqqyOO8D-4q4>0bKp?Az*7sPI%zYhDXT zXbQa?OWE7?|Nm&Y422Ry!<7@L2BRCc2eyi*oZ02I!uvia z%*%a+d|Waa*#YiMko9;mm<6Rn#3zJZ5B_msF=u@CMJih8(9}bRy@iq zpu}G`L~QSuBK&GDs(SYOiDd8FU)#tcjgjvK{Pq+#ler~+y+~&|{hQe1_&ki9n$@Y_ zj&Gg(IZ}7lew_STkfA6Sd^#M8+-peDALReqr`w9u`Hhfv=FZ6cW@5$p-e@zEkQMm~ z=7oE_SJpprwAtLQv6h&z-K-XQ#P3i_JZ=ErS#KmNtE4;a}@EGPHN0HTj^{3x)fJzKOT&iqu>x zdyXI|-K9^eBQO|TU1-z)Kn-cqAg1vHOI>}T3ygd#I*0C|mLKwslx{(q!i|QA;&QZ( zmRC{#gwtXQH^u%@e-FIoG`W14l5gXKOlAKuXRI-Ar)N$ay-4}=$!(x0-K~ed=g+)d z%!fiCSqrtpC<+f`>iu{dX87Iw2gmjP%*Ww5Fe7;Pu7w%}=IiIix%1I9lh09rbBxWX zIjJR=(Rupdky|Ad|AkBrL;WY+gm*>S%xB&wNUc$igEwUps0V+id3GUrV@g6v{MX^1 z52OuOzr%t3?iVRFYhtxuVF+J@%gf_ZQe9CA-t8Ca+8m3Y%MNPwXwkM;rg2C@bn&zkxr!~Nl|AV$qQ<#A{GkPmL8r1rS0l0sp1Y>T08 zFMacr{#nN!8)5VljmSeOmu=`vZo`rj&ZAMg5KL+}FJUSRIxhqOMZ{rm#>h_*q?~8$ zn-GL2g?g9hci1C$N=0QHhb71tm#H7jKm;R9e>SPt4<7l$RAa39`Rea+KXeBH+KrJt zpaO7YRh|5f;V-uwxI74zO_utp2v@gJ(*_z;)eo1v#3emf;qKe{)!2t%y>4_8=67Um zC5fiusnV8;v=+o9e`&9NY|8MivAf~?Kfkgl!oFVF!k12WM^IcL6=;J&`0Y0}xJ6PB ze^m|YQCi5f*!a=>FWjjaL4I%JOxU+RuEETe&a{-7X_dVLX{qodgI`YB!MSoZVT;E@ zbP>N#9_L249MnqR3a{~(_Gv?gx;X8dwy0ZnfLP`3<$Q#pYnEWen(~j#`~lx=Q#{2e z4lgHj_=Udog+S?&@EV9ZjvOpq>{5v^I$aXfgL{d^lXv4t*~@Xu57oX~rzFp!JK zm-PS5`>bD^Z7xn}X>Jx=qFEK}J~G-t!ppElJ5fkzzZozxU2LcvXl?4(Rb zCn{r7lG~y4rw58Q`GzAxd2)RJciP*F#OlV*$<_n$*Ec-zZVrQR zS4iWYkK+`+^O#|r$Acr!loB(w`%xx8>#o=EYf3(nk*va&>3(bHM5V_WjlX=`T z<{(t(je~LqIUzDOipIA2>eWZdy{A1F$km(hZP}mdq-xLEMNscQd7TWq@zynH?1+km z1@vd9G6@Sd1JvyJ?*V^)9q$<^#o)$MNe!-Vbh+1u*Vsd;uik+Io8o~nB>(TKDMzim z+T%fK%_K33p%*NnP7%n+neL$@g?%CeW;gJm4u^Dwtj|)3bam=G3k{95S@No%ql|ZiC|z74eP|zAz`JiNi?(y(0xlORz%1EbP%H!#sI} zi5H18Jt~tbr7Z-hq9V>9w=rlA|dEcrr;j4BDVji zG)&uXWxA6SjmI>(_Uw{zyr=y$?sbyuqX+&&hDF+{54kQK%$dPg4WS9EC`obB8%oie z7p;@Bo;e#*??f%zzv04vWPzURx_-qx*HU)tD%yHNS|(F{|}17+1= zP}7$`+j`9Eiywm~`L(r%4u&_n4_}U;?(>d$ei--s=l?FS&j25BB+$df^-vY1b_4dd zJ_JFG!6|#!e$8>nM;8{z|Vas_vx#TjKQd5XX>M zmpI4`zpEOdhj;zFzVTKrobuC0NGdznq`rUnh;$8u|9rx_hb*hah}eW#uaF+8Dg=m9 zboc`R-3yhL1_?F~sy%QX)?=iL$pnt{5LEEo+OaCoO&nAP+$c@49w6C4FT9bzQ)M?9a0W>+|ERnR0WNI3Mn{8gSZP(Kh@W@9JK zZ(IK7njHiVjR}B|pO*gPDFD|VNxRToY3=(ig<3xSNiSHhGe4@O;TktjQ9k=qexTeQ zU%N)0r`H(SI4o7Eyj^QooPsDGXlw!ijeo^%eFANYbvv$9Z=wAyOgT&Z*#E2mT|pxV zCsu_2(a&WmWdWEZvP6B+;Vr`atUL!De7@=(!N0sTP1ygN5h_Xl-xvRYkl-G&G2l~x zoMV@-z0Q1-FRXsLHBzY!1rPqF@xvtti5{Xo3Qn~j>+V@LWwE`Di0ehvKsu&}k`4;K zPk}x4QRtwFO$Mktpy&OQ(tiRjXlvN0?z)WOfnU9HZ?#+&V6gbGRsG7)(74Szt7YBm z5d%yIg%hj6Xjx<<*vS$5QdkI`R7QY~pnrpk%3$mMlK66uYE<!GN5!|^i01Z*be;|Z`*4f%qwDFcRbaR#EAsB20 zfsa6mU@~D?a2!tLkEC3KG)%5Xyu1%_Qvp7k3*d_Ie-on_sy|Qg%~N9fDi?GPoq6{o z-a*V{%uRnD0Ad5KYQ3JLuTXFQjZ>wLc6!*&Rd8JpOw#u1VW++GK1zs~WXkqOkUxU# zDQ3a;MJUD?lC~XCtG!k`P3v0B?@n>i%HM`e*>U>QclYxbYUmbw6Rdnf(mKaY*~pS4 zEWd&Oe&5m3gY{{C)*C6=68JsMLa*_#&TZak^EL<;scbeD>7#bW=8L33-XLKe~*)ryM{ zg}3xuIiBJjgZ26tT`m3T!K|&FhEe{YZjUL(O9r2Gz`;Z?&_D5QSX_F*>nx|}FSxbG z&{C#KXd#vsIDz6IGn70-BN;gjEUW*NRvdpi z^LnGkD&AzqcS@61fW$YgqcK4ojc0rugr+y~sJ-fek-LRzZa6a~Xul{w#pB3H%sMr=p9>TE{pnXN!!+!XZOM2xULDkj7F+@||<}g@0Nq_btJ7%F&89 zj4+~2QgE#{4pL4=^AX>%lR@M|QS)}qFi_rp{(KdG7utm7e12e&s^9vzrNVxd`|pb; z^V1Yh75JnH%eRV+K0bCP0`R+b&OzT7^0M&zQ?Vb&QXkcPpA%3owy4x=3pnZ*8X-<$ z?7ynboezUO#wbpBUy_t50Ns5&8-ies>l~Ro7qYno_wgdK}g$;Bz;L1F{B1s2jBE;lmw}h2`9QNdRom1 z-;!RBu!(0-E7;y1@RZyp_zdQPaz5pe*5I2paPp%@qAUY@rw{@4{BWVRCh#EUHp*EI;`ukY*Aau zCOhyDl%BJEQ|Zb#e_F@7-`1lU$8_!u;9HroNy@syt7W}a>N&s|x8$E0)>ccrXD?mB z-9k2k%o|b|*Uf0M%aB2cy3kKErcv!e?X(>|v|)Fp(OB<11Ny zMetF3X7Kvd`^6LAbAglcuU8Y(N#YNl+gdXYixbPVEiv1V{SQ5eAm0%go(}dfUBexy4QGc-yzkr(VvPtSFFgEYYHAS!q z6&p>R!~0w$TT_%z{7`fAzOC^z_+$G&;t+UZVDRwIViBbM7p2cH8qi+A7pI#4q z&iuBjj>s3-er#*AoQfTH?Q_7yQIp;WF-1c+Sg2jyq7n(MpWTi)e|-75Q(yX+=&t7X z@%K&7weSS}Y zmQ$5Q`E|%n0Hn9Cx2wkpG?5v}Tk&21H*%T}l6^e4~Hmo!%#` zGWDN=i1UnoSDt*AW~x86!qRr76Mm`b!e#saY3|^;p-xH1`>mZtzU~l)E+0GgLevvE zx0Ov{a#dig-=f59=(9eyjAl9pyT5nr^R7yG6m@~zfCkqkU#$8xwrFa|3VC#jV*xQ=l_Zv z(<=q?I*DF+3ayqvX7`)azjJ*IW?f>(|Le5aY5~0m<4|^lo;(~SJ4`eC zde8OZm}~!C^rnGdg*hHMr@+ivxF|8LA}Md1(?#F;eYZWjwGEU%6rV_U$#6#7+g@mQ zz4}lt9#?n}m!}+|&6jIaJ;TCWlXpLM%??_2edpfptx;3MoG=q!-puEpwfo8W*DXK( z;28j@2^N>9CK&_8aNa`Q`>E5EfqBIVaLeTCIKImf}Aj{() z=OVE9mdbXC{4#rbRhu}YE&4y(&}dZq$A@jW$Wt%Z_dFk8f;~qO^YG$CRUqiJ5HZ$D zUgyJ)ztF9_9^RZIHf9(kupvIgybxheVZC8uv;r5ud>Yicspf9Lh z$r??w@o7XX+TnJDHE&4*;47G4n0g@bR(wvXAAIdD1Ofh^f7kZoZ|6Md$3sTSL;2R% z=r7s6(sv#9j9xT+it5nZ*FV42z1VdZKC%FH8-v`Km^wOhY&PkIuG@ehrYva2alf-g)FoxB7IR3X&D)?Z;4tMA6Y!>v6vYDkAJj}9fz%amGEni!r+6bq z*3eRQfS)~wpy&uPaV!%V=-93#3)@tZPjVvX2tobC#ABm#cH0Rvs=;sC3?{S+CIK?; z#noX80lEnb`L%EdVRmC`Pjg_*6r4ZrN9^-DKA|74I`d8e_ibkOcm;X(Xr7$dbne@o zUsu;mY4un*H%+J0W%qZD`i!lDrg4y~B7qC)aTV2|ShcsiqQ1DbvDfs7u2Omt0VXN& zwyV}@G4;A}?T&B&Lfctx#(U(y__zf1R zG-R%@?2~U~KYm0w>F-&Eg0DtpBW^>x$C{b<1*$o{qDFsgjl@nJSN$O6XMMC(t4itJ zLq8?T{=U={QJI;z=GUTO+H22C#}&L_C|+SoSA}7@k*JZ?%W#J@l4^7GC?r+lv|k$J zaD}<6$eX*GGJCtTZb*;n?@4zgWQ}?4K3U_-aprGZA<`?4%FHJ6_ zXyUpGe^$yFFmtS!RD0w>5HNNijxL3(AkC~g+L=8}9phDNVuyDgycpe3EgKB;DYz%G z3QdJK-p=I{$d#aYcy)?VfUdajmcER-u}oEhgt6>Z-`8@dVPKgSE$GHTXQ}cmb4FO# z_Y5lf0ApH%J8~>8SS}J$ExTUSm;MOMG($36iB_ilhyfj3eqhI6=FGcM4yfuDCBu1 z=#bB&cBNpmTQ3#}^H_86oY!Dp)ClE${5ivDgk z(Edh_6eX$s@MUTuc$)a5o#vlejmN3k7&8}lq8qZj>L-ztM>*^jv7Rth$M%gkrBeD8 z%|+~nnN`E#ExK+e;x$1PvSwB{@pW713QXo zeZOh*IEMAc-{{S;`u+e2f4!N2j_lvJb$RZ64u_Y{9DhrArT7~5mc*4fOLw~}yL+cg zZGvDkv~564z~@Rf^vC;te`zU71uZ*;#2z6|jI$E+1ffRHid?H>f1aOaI<39J$pajqF9bAVT)@__kSSw}q_I8iM6k!ySAOb({g z$;ina@4Of+|D@w!Z{rnbwxT8y6n*!(pUO8Aeb!{f03;m|bpV#GTO^@)zlvWPJr%-b zSt%SizvX@jMPWP@gxh7m62 zfL1Gl*tOn+uzIqpu_y|DVI9LV4o$`xJ0`PKjIENDjV%ZjO7u^bH@V)o$&ecIk$rsT zg-k}r`BV=E_lu(hJBA*7lp)aZHi3|1Oq57SH;-VY684Ne34h`ph%U5CrKdQ?7!958 zici{8=3>=gj`O`g#ua^b5gGGG3-k?GuvQ#9lDw(?7t^U8sganDqWFSZgKt_uS1Rc(-kd5b5(P9x;8xZn;&5B| zv*zonJ1P!q1Y?hC6@hX{E5`*fGrx@WVAMlo<0eX=!}%A(_~O z>6e*BOpcwWb9vo4bF~X%N4cD0I$D?m0k$KG%#ztXEMw+xs7lT0Cu1tFDgGangwCii zn!f!_36N^YN!K-i^>dX01=#9-Tvi4gD!5Dk@v;@T8EGP^@h3$_0;s>zCngmjfV(i|#k_dftJ@ z{q`Pw**Dh8UZl_M5}wr>KSgeC(mM~F3Y~I-kty7#*`^T;-2~v+7MSsA8C;7HEck4XV~r%G=H!4l9d^0sl{jZSqDdO zH%X%XwrK~i+VofVTpRaH))q^$3c;X>&Odf1>;3giW;b>jH+ubbeQKYtUd?MEgeZT| z$_EAkNB`l8@eSr0)RTo|?G!}7WPvgKe%nnlB;eyA>GGDb4WT62%{)#$??dT+xzYI} zBMxwTX6}?w!-XS%dk&*i#X zP&~Wo(q_(yT11^s55a%gX;w%@L=Fs>@w*R92%pykqwdj-nkx&1fADUXu<#Ra4`=$b z80}fRZ0);VjYpmmqTS+nAJz-DN*{SyCd2PY0p=L}yi?h7jP(LyliO9h?%B0k4J#iB z?B^&YpY^=5LSLe@m%f7h3C}f3PY+A1+Yc7dt<2<_{*V`C} z#P(gXB~_!WICgJOUb2bGJ)M1K%?Bt*Y5xImqT^7I|F{)5pHJc6xJmiZ5XX}GCMkTA zxq(wiiXsI^p;8tp3FC<}j{~};Xv3hjo?$R#8`ATx6g~xmz;OsFl7?c#u~Ru{oLo3= zDi00Ki{qp6(=Y-!L8=f{XqNp3HO;gPWv)}`%0apO--`$5Mss4Fz)DsGLsPTSbT{iOb){oca;p>ET5c5!>uecHhxfcr~5qOp#x zB}4BBx80GH?_tBgeJLJ~p8vP(bv*wSYeD}|nP>e+F#liEbL?>=Z@2rm+7tLMG~HEr zfWJ1!JpE?_Z^*nca~f6zGt*xaEN=hrt7v$aYP7!09Pp}?pgmFWn^%>mOBf}n9y8!5 zMsdNAR*CkNUEFZ?q23mt@UX>!a%SeE4p4ya6M& za2S<4)iTuFZZ(B;VWGJ&syqV}dBgh3moe{!ywwl!8Z7jM2V_9=bIP2-K+>J0dnZQcY~V6Iog|Pkx85Y3#nDSWpiR1?V2n8ck#6U{;rH zp{2pqs)C!$wSryp@Ojy1S-d(4%0rBAkV~DN&YIkng;P?3&`9s=+B6sROkR5##~KoB1c0j&6wj7bI46qUs5#^nTpsoP8DuWFR={{-CJCX`q#h;dA@^q#<~}Cx}n8)fo+5CWVpzrm($!@8_QsHED7f> zvHi6`NW4oDvHf+~ZNnRJEJjo9t{CX^mrBk5{IryQb~8V?-2Uz;E!0M4Qza%4j)?5M zShhmZh9l+cGh`M)eAO~z=cru;Dk&Fl1U+>V``jB&x>AXd^;#IRPc+$$9q$(7B~89j zs-IB?ifvv!m`I_5O46;5(1C6tUvshnxJ;WZcYxNPZDeu!(N3`uop>fEcMyM^SwIhg z;?54h%@6e^&@x=J`7o#Jm=3HZgk{4iA$FsEVT9q7!1_&M4?iaQyc}%?7;GlrV=^QX z#bI%yDwnPFt<|smrh^zq1p_lk3OwZw6S(PQMa=nHwdk4`UnqGwTW_-KIofVp%H5CL zVtva$H~Vw1pBEBj<^;VH2(pCNcMolQtrL)0yb*VIM_U!SeFkl}pBr1dzm*O3QD9E` zVNhm-45(H9Z&`t^noMGJ{=`GcoGEAT2X-v-iCZvel8Ldq8w*C|W+IGbSV>9%mA|zF zk^kVMWb#E7D-R3&6U4TfY1NGv@1l$9Zvan?u}KNqaOT(%d7q#3jyYIS&SEZ{J_af0 zD;WLkP4nWY67}(Ks8|%#c_vniaXNF5pACBwlj85S_j!Atm2WI-xA~|JPkAjX{?Cjp z=0;scx`bJc!JD5H6cy2^VPLHn*w^P5nW(z-`Hb<&D#?s)5GIy7=W`HrLCwZZwEeReU| zbUu&!U%H-k>LCvGnKVVulDSLQ3&F#>=r~rb-rZ5=N04WOBKSU!D2@dL8H=RAU}pKX zNPIwIPHl8J$HWEHTJE$PwUJ~J-(0Fqa^VdJeP*fck-t6IKOJrw#MrHcS}a|3c5qGb z@3(%M3v%myR+Lx-nyBG?dgwTQiyJewx%33VGxfOnp+L+!Z)z=NKektmq8{I)HMON{ zgh~1b!tQrxBxzsy2nEVcUl+{8?8;E)ZjUh3K=zda+mw%#F3kOEG^Hbe@SQmNU3X6>yuvp3V+*dWCX%69Y?C#7zX1>hvIi~76i?!)VbhV5Y z%771Vc4cJ(yRBGaL>|m-IKU2~q{T!V-5J(@g&}?|Jz^#Ri-Gie%Uvc$f z{?-&QU){dRIS=woF1cRMtO?fy@pNsCA(^+N6@g7h6L_OOTj;lf(#0OP01~Vw^;R#`^rOXR!v9MU=W4z-E;;i>06M1Vk^AJ>CgRYlMLP*E%Fe zt83dro*;Pp)36aiJu$qdVYVhm2`~%5 zq7JF^T_xo|YrO5UeXb)Mg6~()-swf~YaQf(B(-A98c88mlc;2f>%eR*gt8+g`gDJR z9mR!&3q7*IaC)`Cckor!hp->`%m-~FUew_eWHGVdSp5^Y}ADz&j5un#f!keWARmKK+8te1#b8<;!9pCM#h+k6OEsguDoat#(1YqD*@jt1x6YE4SMknfOoUnCsa=` z(2PX(^Z9#DM||LQp0(_LB=JRq^~ z*bpxRQI|*VVu>XFzg!Z@)XIeHRCMs^5Nvy=hhi=erGqQPgRj@bBI4dV%z@gf$| zKom{|D)mt*{)c*1zBj>h87^{>3HBB#Mqop}at)BFm`c(T7<)Wu>{vcVAvVZOdfZ%^K zezD={vYbV6d7HZev`=}F$jS;gXWriQmB9s_6c6TxCI{5K_ORiv{uju^v0{a+TtOZ? z#;>?j<2)-O7@gnjm^sAab{CjH<~}{n=~2>Ou$5VAKlL+3ahW_c4`#lhTtHiPZ$FrA zn-u#;Iyy@fic~KAj&Z+Yr~~2#p14M;W7e$_Oau+L6zaF z153P8rETpX5E~ooSg1lWHY6dIoS^bnQd*jg0m4cJ`5e*VrRTU zGs)aX$%LRJLS|?BBng-k3JD^F1(D~~*x9=o?4#};IykFQ)*YC_j=03mh{QddrO#LT zE*{ixJ;(Oh@>I9#6<+1H&AhXUg4!+s)O=64{y#tI(DoS9NBE|%H?b~k$j{QP7y5tZ1>o@XA3Yp~HnhRSLUB~g_ zGYZYHF3O|GU*iz|m6WKgR+IE1M}h;|GB9CY={Cx)_vZi-4|b7Y^56E7Z2JVA;M<&= z?@^;%bl-Ul2tC@!VI9a2f3-q*+ID-P8yZtteR!8@Hw&rYoKO8QpEKl%q_u!EL*ri-LV>!2urF_YrSV6$Kn~6fu3~z1a_9y!v$#ih@>b9(z4J)y{ z9gCKyu}8M-S1XTlxP-*&P+WtL)17D_$tC39JQ)DgV6AP>DxVu$&$aF@(Ce~$2;QX2 zmX}^YY@~vUcyX+9ImB?qAs6y8)|uVJ>3T><>8)3I@ZCqZPL>Xa;@FqU59ozO{8j*Vz)F{xc1{!1{Ir(DoVLU}E@>`Omshdi-&uo}6}z zStJ0v=&YFiVEMFhwkc{_^HHaztGHm{!2;Kq0Q3i*0^cQCFXnye-MQhcfK4>f5=2^Kvf-h#7D1QA0NGh5S zPwdRJj0S1jqQx4=$tC{s1J>i1<7kQIPm;ZbrB}oZ=kAM{;M~oQ-wTY|sXrM8y7~=F z0=fUX;ew92-adm z`nZ|sqk6WAP6UUW#Hop7FaDq{=~C|pk{nB2dl!~De0z`Hy~DpeSbjhH<9#~q9r@gu z>wZHT`ZZs_ju@T0UN7{R;0AB^~|{7*B5qdz`8`rg==L}$er+YkWE-On7iUyiTjd~$y<-hQZqV@ z(5KM$4Y2j*i;Dd60FBN8PEOv0!f>`luC_^S7a04^rw&T&?Q*(+(0Hn}56x>n_b6QZ@o|uYM}^L?{T`(01FK zP^|2$myv{mU-;}=1J+#+>)oo$l}4yD4|VpP^Lra0;p=xN`|cm69C^zn%*e^|1}684 zBDA%B!IHO(u3m008Dagp*$6;BE{b)3__$lEi{OT?^tNLl1@`c}WkO@O7~2!Dol)`D z7^t3oXVA;}&CKnhPAH;pr3dPR>*tE$d2d;-F-O zRXD-s+F`g}*i(BlMwK(AfrmZecdbC#E*VUDChjXHeDvRR&ijV(6czFF_lyp%z>0sfk8ZCtL)KxB3@uMZZ`r#0o&R#> z(Wyo8F=m~r4{T@S8=yHPRRrrWYRPrw&Q@iKS79tPQWDMXp0?)x!?CFgyY0UG=@)pM zh2-&FQV1t=1y0XYX2WNDDldfN5fjaoc@E)=f^O3hm_#UvyC`&CgJ|Zqxyhn5Pk6nD z&O1h$`vy`*PXtRA-RQuDELYlX-ak3v^ZUL{+Z+ z=)nL}60{#_x@etsugS{dDiJ(zDbT7YSAK^N$-&q~| zy`ohnn+A?GY*YSkYH0l$v2BQ6r&fcHkZ|V@&j;LDmAZvOJJ$Kgb1UiNvN3ERXK9TY zjMlQaADiLpJ0^VRiJY9RRi#S%t!ssd`mT<$Q#YWot_a!HyQNr8ut?eY;?nG{5&!KM zC)?&qzE*;@eO}bQ1O-^Bj%C7B*EZvR6j^@4v_BqwstoOlyi)n5?8}O*M0=x%`x=Y1 zo(7a9mRq1&ZyljLj6d%CR2HDmb*yPUK&vEZl?sPs zKVY?$T5Y{S@2@Hm#_>69%~_AqIq}M#FApF*osSWz4GZz2C%@KRTIfXG4%?b{AAH-- zZT6``)@dJQsjUoec>nUT545|RQSl%z61Z9zZSq*A_oG{U*rU>(*eMTpy6$nEp(oer zf=auRcbKp3YUZ^rxv1q6>>V@A@m+|*MEVI{LX@}kM-rQo;MHSAN|+0egkfUsB@r}9 zu*F)=J!76rA}V>$>-4hw##SegE7HFP!ex(DF2gFh?SsdwUrJO#RIvz~%Yp5X10Y~g z_>N}Qwka8$#J~0fB>tHG`5^+)@@ulaku&H;JyBS!3xOyeD5#IM-qiYhDt%fznFi;) zJ!(97FdNs_rUE<2G%PYXwICX!l$Ve82h zKetcz)Ycr=uhBnhcKclX4x5U4GgqK$FBszfYEDx^N@1f!Q|MC-bA}^J4{2HBg{*g} z&U8cKZ*omJ5w3)ovXG2-9Y+LW5cVP*&ZVF-?Z2q=?j9%K)Wo``!mT5_Tm*vJcA;as zq@)`|{yE<^m}$v4^%p2P+w-CQKX@kl`DF}WpPpF6O4399_`nZMbKv(P@13n9>wby=(cH5)~8MXV?!yu?T3PDkII_< zk*wG!9R*v9xomkjdHA?CFCP|};>hRtDWHu&ZxlO-EI33#vjZlIhcAWx7A)u1!bDEi zso;d!8%(xfpqzg=_?7&^i&x?0bm7k&tU{6GeAVD)g_v>3ou99f6GdZY(P`3LcfL7C zvu$1j4S!~j9dOhNGJNW2=H@3EbqF@foJ~={XB&xTET6WVfJzsF`uSNx_BPB1Uk0mC z%?~9!Jm}(fVEQNj+?7sGRI=WbCJ0dd!zVChp?#1Tn8TUz1(kI$ z9*7n(VBHsT!2fo==EiYJtj4Y!{y6YdyITGPJd5~Qev_3S;f0P~Hx%5-*1XfNxr6SX zR?HUoM}aUe(CS9Vk;kAlUdc96+*WTm#rfoiVm^z9Vi1UE>9jZ_5nrw;&WF}IDxym3 zXcGvj67VIvRZQpVRdLh#`5=?pKdbuiW(%6HG*o0+q4-RQVvPcC{5Ex)pawi$M_+GbrQzzpGX{IR$37tROO=g`G26GJM zvjzB;<@_nVh-gipx_D>!3Fp}q+C>9sgaq=Q^z#KYNQv#r_U&x}U}!k66yzYtCqHHK z@uaxhD#OC(Ou)3{-bOb|li|w+TXmp^gQ|dZU zQhn%-8Vg??L;I#7T;sSM#JuQD$JAk~Nn;4;5~t-@HSz}5LsHDsQ9MrQ0#vIthXg;9Ph1g7_R@WK3>Hb|VmQ5G0VMstRFrNu zeB#Qf%25EGGXT@vj$K3@|5LFx`^$0mNx_~YSh>w=D=W(8Q}nu#Z$Z+a2q89YSz~A> z=ab+exRs3I<(}dNKSy458R$YFwP$XYaV9bh@sWSzAgs|GXK=8n4&-r{S?^d*_=ShZ z(I_GAmpKs5`tsEX1gAA{Z`kHc1gEQAsx_IL%ZBf6fwVkl+oL6punWp(ZmE#&g}W~f z6!~{VhvmFWfH&uIdS!dk$$Bm9#Dd@_r6!}u^7fa%oO6(>k$Ps|S7mcbuW46w*3AWT zLW7)awRDkM&v_uH^|;H1ZUq+{KKI|=;@j+@FTX0Hyjd3X%h3UVlDrj`@)CUR1f^t^ zwIkNQ$={M$0JpX|NrVVGp|6o<3wN*1-!$tUUoeD)w0Ix!Ftb}8nm(EV+dQ)F32JUI z%RVa4TE)O5ZqE)EU!xy9)CKXw=S`s5C;wYZeAvo$nxXfB2~R{gc9>zyC%w%&ckwuj zY-a?D-N{$rQWZd#%5EsdEUeg)k%8t0j{H`^3DD|vaNhiZwCuTWSsbMU8|)=cYUxDQ zz%@o32hSTtFX@&0^qcF_g7uG$)JZYxjZjK-=f`=0sqKH(aCx6v3>Oc4SO0TUtNFN$ z`;)o_9)CKLo5N=n^HbzJ;RGcT;^24n+R`+7EPnIM4hx7@gk;+1Eg$@ca#Jh+z^vH6 z_ICXa%Eo9WCaD4mR~9^{pjOXdXLepu?<2$W;xOq}sf?RiRfEuQ($*V9_L!SDhaqim zCoIUDg)UtF5~>*&|MRHyYv|O6l%HF~ccGVJ&aH<9z;C^ypU08-O!plAE}fwIpZF zNdkfR*yUPozXW(~L$&k4e>U7+8SoaqNf;SM7uh|Z>GLa4lP$Qb^h}DWaw44S z;~w-q8v_s2n?vy_uVy7ZC}mtuwoenKLTpzeExlD|r*fysi0mIP{wW_3ia>3o_iWuy zCk_inrwQw#FE{UGT-Q+v>L-fPd~~url_#CZaGU4YjMzk@5~Bkf6Qg+>KWV08(;LO^ z>mgUg1V{xxc|K@1@9w*3PPO&8{2hP!SJ2Te0)e~Ro~GqQk@-(}H5KspseAAAydCDr zqd$CY zT0wH2zWY5_%CXsKnkQF-L$Mnl@M02ebNq9O_wSMqZWR;QaU?8vZ(#`pdMmc96#YwL zRpQb-2$H5xve$X<^jd~k;{Ss38HK(CoV_1-(5Zq8A`Gt-)o*8Oc*$~c0JJ_+k(imr(~Z-ne>=$>oTkyAkt*xXqk z&ilz^#*{PSv;4r__UF44xnS086gl+n!*;~Uj-j*XIbqvA0@%@FdI$U*s*_{WvFs0d z_0ErT3LWC0S{cA0f4dsP34X@1x9D+|(tf*Dh#D{}_{Gz=R(q~1$|lJIY+Sto=2g^& z1D2}!NYl^r1rrgKFKf?n+MrXK{SnX@5#^6fcy?|=-L2qtY+_d7j?L4>$8e8Fmd`-L z%^EKjbL+twm=Nb>`{x*b3+hGJaJk0Et=x&cvRPKaQou@q3ZlJs)jJS&iQTo(_obu7 zGDX~~B5$I5rLAHqjAOlIf01=RhtcxBA3C|XBd%IM1>J?OD(cRc%*YWJSX!g=ayBhp6b1DFw+VKIGq<>n_y=tFt)(t6{2Bw;p^+VTZl98LA2p@;;Da!5yFVo(r*HEaE4&D6h+7xxM;9XOi;#tFK1( z;&)v44Ti2}=I#;*!cYCqYH*FN=Q)0NA(VwliDgNpVnNK=3ky82&xRC$FX-LUNAU!*#59j< zY3u0fvGffzR83H9XIUv>NrZC%F)9JC&d&u3VkL)$M?^-)#IlSO0ztm#Q$tv!;P^P4 znmQ;p1B-ZwV4hI5da81IRRaKluq-iYysX@@BY$~iMWq0hIl#%o%9-Wr<#zInV_Jr~ znTsXM+Q#;j-DyJ^cWzd?x2J`>xx==-@d;A^#sR{{atX^$sDnUoz!c2QBcXg?U}$7) z@)^LJnOj(TEO=Rq7gySVqnxBNt!y3b?7P*!g3KqRHBOH11_g(NhDCNn#dgNUtB;*c zN@fv=q?FWi=Rq*Uq6>DEkRU=-IZANJg8 z?27vOaQGIjKC14?T|F@d^kLtvZ*x&I52tQ@`5g7};ZLAJAVvr}{H#U$`^OIZA0ygh zUwBpgxS$-NS~zIMs)U`;&Vmp^NM8&OjTMPO2|^vk^FN;Vci=G;n`c7BIiBi3ZIFCV0Ds}Hb!N*KFq*SO7{<{zm zWRN!v3WCZiJ%LGqas?MCZFSg3xZR0YJFA4VSSMeK4JG4)(robNEq-3DThF9 zgIQ&nf~#eju9DbJMIO<)9UG3Oc6GS^Z606;J9jM*{<0%eqR=jrV=QR3jY8pTx2m89kjtt7m%35rrJ)L|tP!bzKtxa1(~5hW=FsRzjhs!~wyTwPA34 zN(&qn=4j8+* z5BL?!LR88}>_0B?pPa>DIcdub$uf&eNI5+d>j;*(n}WQUq902TDlTZo;jY3`(ns^i z$YTY%K?)`;j0XDYAMU{eu8?wo_13mc1`H z3OrS5U#*RQY6#qYe(zeMc>8`{705f2*GXMYp -- 2.39.2