From 9c5abcbc84383ac5669a685ec370b2e7647dc508 Mon Sep 17 00:00:00 2001 From: sparky4 Date: Fri, 30 May 2014 14:50:46 -0500 Subject: [PATCH] modified: 16/DOS_GFX.EXE modified: 16/DOS_GFX.OBJ deleted: 16/M13ORG.ASC deleted: 16/M13ORG.GIF deleted: 16/MXORG.ASC deleted: 16/MXORG.GIF modified: 16/PCX_LIB/PCX_EXAM.OBJ modified: 16/PCX_LIB/RD_DEMO.OBJ modified: 16/PCX_LIB/WR_DEMO.OBJ modified: 16/Project 16.bfproject deleted: 16/XINTRO.TXT modified: 16/dos_gfx.cpp --- 16/DOS_GFX.EXE | Bin 30934 -> 35146 bytes 16/DOS_GFX.OBJ | Bin 4716 -> 5248 bytes 16/M13ORG.ASC | 55 ---- 16/M13ORG.GIF | Bin 8860 -> 0 bytes 16/MXORG.ASC | 49 ---- 16/MXORG.GIF | Bin 10178 -> 0 bytes 16/PCX_LIB/PCX_EXAM.OBJ | Bin 3259 -> 3259 bytes 16/PCX_LIB/RD_DEMO.OBJ | Bin 2017 -> 2017 bytes 16/PCX_LIB/WR_DEMO.OBJ | Bin 2373 -> 2373 bytes 16/Project 16.bfproject | 34 +-- 16/XINTRO.TXT | 569 ---------------------------------------- 16/dos_gfx.cpp | 45 ++-- 12 files changed, 44 insertions(+), 708 deletions(-) delete mode 100644 16/M13ORG.ASC delete mode 100644 16/M13ORG.GIF delete mode 100644 16/MXORG.ASC delete mode 100644 16/MXORG.GIF delete mode 100644 16/XINTRO.TXT diff --git a/16/DOS_GFX.EXE b/16/DOS_GFX.EXE index e835c57b6eab14fddb2072881a329fcc3066e68e..634b6bc4dddcb1f39209b809a3be02fbc341d135 100644 GIT binary patch delta 18383 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

39py} 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 delta 14037 zcmZvD4P2DP_W$fIEU>_Wh{#*8Dk1_QZ}Q?QfdYc^7H=Y&3&JAEtFWM{xte-wgX_f} z{b&FBcjeMGQ!8#-p>&HBwX0TGrljVNylAVCqN0%){J&?O1@rT3@BMma&YU@O=FH5Q z^E?lodR2Pb{QDklE^E@$i`;5cwVIwboLxP`Kh z1!FUSdB7@Q6VMjU*f&;;T?5>q<8vU{nz3Vms|{mOKt9j_jC+Q$R_Tyl_8Am*0^4mF z>j%c!F?QI2vF`!r@r*qU)B!I7Zvin*jD@>1HWL;e1Jb52*6qdE0Ps6tKb0{TAOSj) zfK-&<295)rfV($i!N6kRYi~Vc7f|ScpfHWGi-5lmV->(g;7#B-@WFJ(?0gwp3b{OB zAIhKlG3MpZ*eTR)XJBB!AD9bl2DSm$0f#`w)Ibfe8F&>q1Y86j>hX_V5IO=`z=UAN zjKBaO3xS(~89)|L0UQVHLSYC{54;0(0lx!p!;r$67zlU?_y_Pla0++;*o84R9f$!^ z01dEgE&ka78~{EBz6E-L5Ul0suhonxql`bwl}1mC#-R4FW}^c2@fK9PsW_e1>QC+e zmgi(Vo1SI3wzv76xIQ!RScU$e5 z()fu*<16t!fjwc(-3p~q9p2a~V`)$}FS0dIn%25olBP7CnT0_?7pof$eb3!^&n&G~ zK?BZ|3;j}8+Xf48b5FNgLY=KJQKpujH5W2vq0%?Zg;!*g#$T7Eg^h&WQiSd9R|NJz z&#u|RXR-k43+BQt*+hp18BODs;>KoKTC1a|!z_8Fxq0L3Z8G-jP?*7~2d3ROYkZwo zt}8YVTh>}AjUB@`WU|e}idsuUztY$@+^gC=Y)%bT!#8e9HxFCa+9{2HA8sv#&LQ*0 z8|T53*ZRZocg+k(|7G{xV9?R&M*|-Son|hQVd18kyUqIH&BIo;)}(Kh;9y=WVZzJi z9r{YPVOH3P+^D#rWnuMBM#bE)CZi%@^RRubPuS+D9tEqF)1vfRY%qtpMnzcDbp@8d zB5Xu?Q_&l=VMgzha<;seB2Zc<7rv3Z=*Q8Jl70+- zQz5yVmfov?Q!&y=*v&D|Mj4YLHxEl|RhZ)<>FaILl3$0?QC^60rxazrj6RW#WVuRd z43WaeqL6VKmB)mlj8f91gC%A!mAeE(ybEVh=phPTMr?U zV1|iX)yLme8lQR8d+TKUBgRJR9%1BGJM1iDRYW7It+$z}o);n5Te|D#Ml`lQBS{;n z8y3ZaAr?QpX~Xbt$@&XW+b=sAKNu|;sT&;C6lGLKpxXL(iKr>cI2=9_Ke%bbV4!sU zg_H3Q`x!(>>K<~1QO54@))~@2)H@;laMOl|d;m9Nqbv-==wz@ym|I^ul)VTXvj|~> zl}oAl<`KyYr+!^F(0e?nU1>D@*4mF5L}To`*tUp*N@J$1adU^I5@s}tTxa4&5m(No zLa81=b+e#$I!SfIbix~){=rU1cGtL1@AgP*MI5wOI7=La=?c%MhGfTZq``w#wyke7 z5P490?&2kG{Vv`hya7cErS&<|~Bogk}I1;h2ok=9hwu#73wh7XIDg-~} zT&h(nbwsWyReHguxt%pAkFw?tkQ1!=OOR76=obW()>mzs&!GA>YaPL1njk4jHy@$%WUOCyi$;VGs?&VmA(_(n)NhTwubzw_9+LIe!^PQ)c-%Dmm&|bNyZ=g#1^wsjf615aPEF*? zg9R=F=A?SD=U)B!rwmj4RK1>lD#Mf~|EHNu^^`Gw_gLw%+|Eh1Q=%u0_K%+QxaG}B zkNb=KZk5R{*ZMk3L;NE{_VBhJgpDel^e6X&4^$ey%!{TpkcHQ#)N@O#y|+o!Q~Z`uIV$JV#nrT(8WQZvBt0f*LcYPo-Y#rq@_w1-g0<_IeZhx9LZS{gH1R zkw?C1L{j{s10m$Nt*hyQqTXpxvF!(g1*8p&q}#d-9uE`-<)8w`M6(S0oz|!goj&uM zMty(wGZH!Lzl=!G)31XZJoB_Y-xXH^il`bt<7a93kPI5PT?!hh_eha$y`-~^yi#oi z_5V|^G3&ieZC!@-Qo~ZSts}a*hFY_&muh3k;=17OjL;^L#Z7yp2B$p;GwF0>FUsWaBN|9qF0GDf7pa|E zS#^TpyMLK&K4$k_FWf0>WA@x98>0>}R%=i8c1G|~`XYQ`=(daXVZk zw8U8y;9A~?mVM$Nb^ie0a8GG`@IZ8`0d}aNv&O1ER-u+-$2%^|U24(UN{PD`KsQ zRUl^yuo@*K5lbS^N8E_0hoTg&&hw(IWQ z?j0NnQ$>t~BPo;|>5#Qb?QUWwFqO)rHt4^ zzdE{OgM!x|Q2j2|j(&rF7d9-YKUx3q*PrV9>n{W} zT~(v;IvVvM^Zg$B4Za|iT>z(Bt^S`EZ2gA(zS*$UP4;U*y+=0*_JFOoo)7+S5d3EF z*l)*1bt|~;s6T29`d=EYxki`A>Vy-~zMU(0U8rH8}oj|Ked?Gqt*#i+c|akkiTCL9=`mZPH|2s(OkVNrBtjQ3=5 zRp4CCs?WAOd-Lo~*-=U&8Rb^XnDAm!iqMi0q@=jJQ8}!To~ENIJeRs%xRdI6&@OG7 z)a4=`w+Vmz$?;??7gE#X{Dx!*Jkiu9QFY7lueCj%`6a6N@L(^AaK*!}L^Tu7&k~j5 z;OFTU5~uzE#(xqvFIyrO*=4zKIm6qP`p1GLtI?HG%czK#h2Wm)D%}_^L}YsCw_D(t zqt&9MLboO`0#C7zB~>{5(K5y?lXEhX1M+LisS&?XO?hfO@uQCR?2JEY??!t!tU~*| z^gn6Ov1D#+A{1B@m21muv^o^Wl()|j`ZGPGm6n2imaFt@DWQ4PLO(%v5>#4hqhYF)X=O?tytXjtSSaTNA1@{}lr(~JCO+1W9Mw=>K_TcOid z7cNI}Z0u09J&(1M7gl1n)zmcB_MU?fnByV+%XlFz#}yh&bKGY2I5PGIWGqT5^UKOA z3;rmtpMaMtO2*8ps!e`-tm~aALVHe>^rF|Rivy%nrwW0KU8N7E3Q3DyXPHfd=dk?p zqJpx@8ZBuYGr=7%h(1MKUR15s7F9jb*5xDYUhE+anl7|M+0yC4<;AYKTk$q&6U59) zbd~vB{IN1RKjXo(tfXrE)?0d>CS0RyNjov@Oq1NXvDVzUU{E{e{c9uHF}L;LM@Uyr|~+3htQ4sxPC>j1MhzE^%_{Ms=DLn+5wB z+%XF*goR5yC9Xm#{`C~17XtMKk?Ed=z5qC_?(AydAN}F zoQKn83Sqn_W3xf&$D@-g;@obb>A4^DuftpK0tbOM-~@0UxCHb7413rda0I3R!N7bV z30MZK2L1-@0lol!1g-+tfm^^m;6Csx@CY!&YFPm`fYOZV*?1J3fJuNi5C8-NVSpN# z2P6PVKnjozfxiK70nNa>Knw68a0oaB+y)%6ouYv_bG%DUK_MN; z0ZM@?pc>EtYk?PlO~5O_c0d4j0q+2x0ABznfbW58z-?dv_zkec0yqPcfoVV(5D%mQ zS-`UC_(uzr0hK^Cun}kk{txgz&;gv23ki8GA^X^V_8xnmeZX4ShwLCb#6D)N>HNfkU`dE%rX)-fE{TxLmduevNunilB{D3o zIqeVpM(`u5!hMI$f!|%(D6bJUkvBBPi$=UsFdG()gRjFK_O{TQ|DFDtoVuE8G#Qx- zmFVMV!Ryue6@?lH)W=6qU7nni8JC`nk}G&^;lxuW=V<1o#>QpD%}jkDH&Enj#L`!v{cT4YlM1lOb21;4Ka!g~fRJ2q$D@ z%_X_HsW~R2e;bv>;M79>b1b<*8q-Cq*N}pCQ30PxT4GLIl1ahWRwOJhU0z(G!=xE` zvMP#r=D1s9QmAhWuiNmx*>UL^WIYYEmkunm(r7B{%8JVJR}gO>=UH-Iowk5^uymQk z+?o`Q*Q8YHG;tM`wJVA>$=dSD>gO?{2Ren@P`jf>Q&_3du7M$|OLWDW@|qPI4I=|~ z@OFh}dC3Y*0b-dDRqY=+84a)V1}BZCC|{Rfrm3#2(3O;HHQMUx%4(Vob^e%Jq@aBg zGjCy1>LTIxs)>5C^)ucg*Jvs#Bj|NL&Ao;5u&b(Ss>rksULUW~RBLN=mDO6BtENVm zUw}wS+BwMLUvHLtudsiZ(H18BROKR^s&bFIVM{)>&}il* z=a*E7#-=KX2V>(CD@t_fx{4Z+zi*5mUs6#*d?BxD@=Q80c6QW7slmD-?^u+b7#o*L zo~8MO@-|CNY-M6fX1cgkcpFjWtZ}4H@}jC*UBRfZeuBv!N-V%61uARWKyZjg6H~pS zjyp6~N<1uAe);mU(wY*wnaD4fyr{o9-yXtSmCnxO{k@~Y8M^#xohFCwJE5Y|*_O0V zok~5dG!;U4<+LdeOtqqNp7Zb!k;%K$_(jFq{3_vo#Uwc``X|$b%N4G|kqUPY8s#+~ zQUsH#YO7ZugBjgfeLg~Cg_GWXIyKvBG{|Z-afvC}F-cr|5a(kH6cm^0bkA#O7F#*b zycW3$U)@}80s3m<;^%9`Y?W+x@ggGJGHx6hFC5QRg^=KnM zG|UinYm)M7bn(bg&hUTfEhTDCG^UNu!(2&Rd zLZ~l}8IpZOff}6Pib_ot&VV>{pp9u)jJBCfsvA9ini%1iGTVUVWByE@I}ec}Eq{fU z{8<%B`mIPc@}xlSs_#RE-DOVpYj_tdlO`p;q)b~QRFpaEX}bP1sgDiyLDVTPrvOR( zJQJU`jJ6^lUKZ!Hiu27Wi{k6w%j*^zo;sQ4aXpN5Dm2u0MRnzBu({5kIp11SAvOrV zms12DF<|aNQA{uNEib_>ak-VBS6?`6*uy}M# z58;{8iGp{jqn=jaA@>kgAVaH5OihOG5Ee})QXp8(+wH|&E-nu_hFf3C+xQ6ZZa&?f ze1kReRfTKImm{v|xL1NX&!VIzpUwoA6Lzi~C#NxxP zrgNjIC>MS!v9({z>yTNsy1GQC)d)vQRC-??uV||z*2K=8mq9Lnk)KL=EkA*#c@Oi` zD<3_)+|Xrwo7tF7dQCxoMG-#5xOL^U5b%Cz3d^rpzzf9#kJH6<9aXa96 zh#nZ`(P=dNq{pPpkK^0Bi}Nucg(Y#p_@cOTJ|;nj55bHkadsMc#6o;{GwC(sJVd?1 zO4Gp=-Yj-?AaOC4T9_iKkXP*MM?Os9Q^bZ9xAAiA3UM2J%lQZZaY)S;Ckm5_CkWDF zFTD*9$#U_^$N01jFY++&02PRR8r*`xA!F?{wAT|?MggDEJ5$Jd=r1a(ttl3_WRD~9 zV7=)X7n9REjRAy=#?$~_o1QqQ}F*8F{crtCn zj+dGVl4l(GvBuk#K&?{>>3@Y!2l|mv$7YDz!+Dg)b%?wGg}9^zNVRaW^C`VMY8!S% zMWxVQ=rL#5io`6$dlM@{L-cT-oWC`qMIv6MCCSMPwPpDfbNGRD67)3_rKz)pT{Rwy z6L^k}JREk7=F!(jb8DWPFXp*<_Y=IFAo9V+(fr<&gOBF-4AdpTfD?vuXA}@pmrJ$*jc&hWB^83?00ki`T|($(?rM!YG!dgkK~x?sq;g*$ra)m+iSypcTUS+LGm zeF!vWO2!@^7yh!d_9u93yNG;Ui|Pf`ftDMwskKI_~z+bm+^;h?AExb zdwBQ7viEs^znhj$tytH92~}sY1zXVnLeFWdVoa!Jr{2x%916jEvcLWkGYhm_61N^R zs&$?9VHc>ye96H^D86IdZY~Aw};$}wlAz>K_|y8+p-?*PlYcmrxO$06y2kO zzAanY|8)Q~bBo*kLKr&xilhG)(1q)KOP69P2AVGIzYOZ2U#zrm#|)~s9|=4MOZ&U7 zR-Pf3P0rZU0+&gy%}*Er&2+u*=#D*+^~zSaVyxZTxam<;znJf?H>~?$*beM1OBkeA>_64nhne1K&5E>;G>ko@k@ z?X5u#7%=P7&e$#R%-SmhRfUkhlr`Pv5$O5TYMYl~u-U5b+FC$kZQpS0ABXer(eN;^ zSae}gClpPLO&(G~(K?Og%Li!lxs^`c1&d!uTvwU|MF+O}$UcRktJbc2;Ds4ChK{#N zg8coad24$>w{{$PJ`BdFn)zi%2mmgZO%GKd-1oE?erLjTOt6TjFv;QXKa z>Wdz{HDPVuE>qqXXI^#)iUaSpCw>Xn55DpFAx9_(UF-ExCT9L_S@ER3pcC@9c~jIY zJeu_ty}c{`_FuJT7*Lg;eQQ1T0()wPQ#aaQav5rKgr2P(A3h(5_L&n_E6!jk{(bwK z{Tub%vciy7(EFdQ^-6$iV%Ev`gu)=NhDon2h2U0~zkBY2CwAr~xjlj>bZg}M0x^@L z`oUX`n90DW&$p}4Z=fm2q65_4cGEd`7_j}W`^7_`E`2}BdO-j3<(Qu1!{IT(IF56&bj~I&UVnqiC?s&VPG7)xEu_4a>C_M zcbxNc=Wg7>JlQ$-VU+l-8IGw0;PlMqD zl1n?i;6WIqzgUKX9Rg4iEZmWGswxcwmhb6osX~Xs6`S_=VZhfmeYV;NkBrZ)+hmU! zAd;P=OXvPS&1dcfy|yu=_Y6F^&E?wh*%)y9hIP(wqW?Izb3fT*&+Jc1m~{Yj;K(OC zBQTzG-;eVKpy%KW{S8|mSia-@oy;mw+YA2IyFm~9Ju7fGX3*DT{Q3|Som=wK8<#Ot zuLV7^eKh0qmRXjNyVJTeb}81jWy-Q=dmw)xYHmsyCa^kPliQ8~i@%sKH55y7|5M4O zGw65!vzc+BFu3U1qd)C}!5j1=hp(W{e>qS{s5jN)LCMXYrusWXQ9nz3fRZNi%3M&2 zb`&`&4Ci1o(qPwM80{l-ED0I!2TJ!wIVj&Bpn3|Qez2U5628zeI-8ZCv{Al>g>)0r zcQ`t`^i7R6DE;*_oe*=lnr7!r9zs1Fls4ikpcLPCfYS02C3h30*}o1--owW>J)_{m zzq*0Zi3SS0^qGyqum?5^1)m$Bv@EIMQBWaDL1!N*#RQ@hoRk=hu4ejFMmHUO7Ne_{ zKB!VmkvZa4MO^_((b3Tn=bvse`W{9>guZ>z#q!P+3Wbn~qR z-H5uLK6laCrcYZG6zH249ie?s!$Q;>W}q|bR)H`Ob^0nzxqv4qh1YSxa5?tFUQmi5 z^l^)FhAW_S@erjL;uQj*?gvW2EEp75v7R-eKu3l?WYHa61xhhsH7FfH`iMor=piVj zX&(30mINv-^VFP(VxoDl}&#vLwVjek(fQ|FVDiJMcp3X z!6}&u2BqLu2ufL28z@CR`c6*a_$p|p9)%thC=0qy6vyN@P|DX5X2X@Bsh||KHiA+- z{{oaQBI`L~Mq3O@cYix5#eXM!Xr}CmK9TD{TRB{W{r91o_D8=NJHXf92%mtwRHuwk!N*Q;W6zflUUpg3+p=N^8#gPq4sW?6D(4C$O zN_pZkP`cTcgHk%R29)x`wV-sT|AQzt*B(&HeD{J<7Ig@eGT$@Q4n9#zzrNL@kO%9# zK`DdnhO#xNUj?Pa6MwnR8c@FuN{OZs^lj8{f>PGh2TJa|1xiT_9YspX?}E~W_5hT! zs)wL-6MA40c`$${sW2ee3k-UA@CKzc%a`haKS1eM0K5^4nFWH%nK3a8{1kth z75jRy*;q4C#*-}_E34Rgltr0IeCOL^1Ecd~zFWnHDXe2m$crBfQPEWFq|wga%zdmp zjYW)=eOTsLc{*P|QKv7z1;yF>u{R;($c^@AE%-B5lSNOnGh+<_{MlRVJcB(NlL=(b zSbUKm#6ri)!7Pn71y>rvze$TSq5Sp}%QM;DG5IjoVUpLYB;ou@6on%A1GiX?WbW8l zVtE#eKv}d}&5}?S2b;~mMT_M*tYJ((itQaMKf}LCi!#xy2YhkuW7s1({4X}l<=3HD zp2ue6%!&iYvK*8}ejHmfR*q-8#$@KRLu2Ix);U&AWPM}h1aHx{ALq7q_MqY{AXFmSUH__qbwSl!Czfad74DRR5*6Dcb>+7ex|~i rjYicMvV_W)0pbzzL%9oO=whKLcboVra|0toan=5R4x+sH diff --git a/16/DOS_GFX.OBJ b/16/DOS_GFX.OBJ index 56298e2a462e71f14776bf532c535aef44d0274d..7b489c259263f5c41cbc1d1b0e5a86c059e85f60 100644 GIT binary patch delta 2086 zcmZuy4^&iD8vot*?tPB|90mo&;y=<+6N0UV{2L@ttRfQ*w~0*LEHW*Z2(Z>*q5%>m z7kt_up`12XOHa!NYO|&56mM7dG@Vmtw>_Q8vR$|2U`J1e$-|zmu zJKy)+?|w6!o%Pt9?x&KgcONUBzI4H=>Q(v9@xQx&{ZP%lwGZd6t*dM58Ms~>&~=41 z^?Vuhjv>y$vixtt1}v>Cs=hsgo=Ge{y(T^VlEYg5OuOX0#D2Erav$47Pqfh(|4Y_B zILKTq;RJUDqOlwFcq*$p|KmHWqz=wdZ($tVb<|kP-?#5m^MlS8fsyA_SKtbxRJhsZ z!CukLSc)-EPs-)0Z!D%U&VB|6+&vL$ za#j7M?^c*X+Rb=E8X-q=vp^=Ai^vv}T_%NDC8wL!WbY!|KzcLr4zkBLE88$MUMpr}tmSGQxj`dehH-MCKe zL7BP(D^vq()SY-l-Gv_YDZHdUjUn|}e5&roX|)$;)IOY7pT{@q9$ZlU_+H(MG4=P* z_&&t&{jl?w;NUOkAdw$L5`P6L{13?H{g})Dh+IB^Yxy7+@loc z7C(fR`OdILmvbL{V~)mL=L`qNK1EE7+3#llwZDJ@&R{H6*I4*35JR>3Jrl+%|BI7VX@Gqh+T5`Kwk`qklqPLrrmUr(H5sm$7-!1(huL}Ow&`TPa#cG0wDq*h8luruXV?i? zuYdzCSHzhYG@4_suIe4137u+BAk3utGpY7#2n%RkOeiD1lCX;STCyADw9tbx!Tb%a zy|ms!>mGS!s8_0?{e&Yj;j}R$HYe&Rm`zaWMn}vnqdK<7Thg}}A&s_7C1l8i(DhO^ zZ<2|j60#MP+D#*Q2jN%J9(q73ZQU|CWXO~@zf27sk_jhv4$<+Bpo|BwjQmaS>a^59ktO*e=4@DZri<4%RE;*^`#?p;&6>T*3lEnM@1aN%jH4HbO69K&F2&F^d&dRx&h?=h>tM3Mteu0TZw$#uDF+ zh|!TemiWQA=%rV}Wc5^JYgR^KiV1qic728U`vVP+xCo7m7;s42sCW}@w3cYNy zNV&XJ?AE?}Fl=+%%qebLC|+g^rxMR3eiiX+i5C!GNcPmws_qd8yK(DL6Z(~Dk4ZN}Co|{YDvZQil zS;Yz@`#ZsMbXTA{Qm4GlI=kBRt=jT+>)1JX>07{>)eEb?Z4LLs8|4eLN7a$K@P*Z1 zkE{>p2d&1AxUzKk8vOa0N{K>GMUQvVL)NyjIm R1h!)^j>i|V27^uA@IPyEiCO>v delta 1508 zcmY*Y3s6*582-;a4<6z!vI}kT^pS$kpj?$wLBdBVZU_f51tviSnpk=1;K1VSYN8a2 z7cmW$@=1jnXfZM-*3Hb>rm@r>>XfFWLE-pfN?rPQn{mdS{m%FO-+y<{Io~A zLe-l-rqDkXyL(WXUUwa!BlrKmx^W&oQ8re+%!Ac<-#N6$r&o3OMvt~igH|T>T7}d* zs%4;7Cv}eP(&X4LOJCTvy<1|@{q zakljc6=&IoybG}pXFDXhTkZCXv~5)!(4wq`c4ZxODsRC_Wj&l%YT$yh5w0q=0Q7C( z^c^tLIv7r!5J&4_7TpAMsR~)N0ant@P)8eKFWmws=vKHyx4{+q9(2H6erz8Eu>GK8EsMdxK7I-;hh~6h zuBrtAV{D#iqr7)+Yi9!Kzn|*WuQjEE#xcAA49DsyggOy16SW2LD(W2M zLS!p)sWiAMq|xP&)a69%MBRdXMADyYV<0eNdP!bsd46tQ(TJt$zX9R=b0D0naf3fl zAL>lD+f7rzH3)wbDXBJA2D>I8PrIOWT>lBhB-FKaMuoe{(v+V zG<=Dh{uJi24oG1~L9$L*$c{lSI}Z8m3s}K4C}-cmYUYA!_AS)0Gq8i5gce%H*)BAql(DWR!>@W-*$~6k~`*j3wzJ zj%0~vNuHQU-VkO|Bqot!F_~107l>0#C5>VlIUo{M)j$~<`XsWJk>%MR- z&vb3yc&_h!@BhG{a7Zi~kI1BQ$!t2G(5Q4uty-_xtai)odcWYXcuX#v&maI`qDHqv zZ}xf>|ETYh`&>`a&slY8e|~asgM4|2iFg@=a*Pj-7?OT}k&uBunI@YSl4wM{yi87rVqlK5H7n!KAuBxkXt$nx^o4Z!8vxlUim5aoym%3|=wHk_T&WM!Jsnpom zkB7p;$d=x*;?KagsCCul;=b4At+cqJ$*||+((}sIjo=>7%f!>BZQI5#9JFi2s7Q-N z?pQ-`{=(Ix$FHF>Tf8pji`Q%4#)FvuI1U8K$D%!rlOQrf>8aqWkpFU7f?2YeKy<&_ zRV>KCy{-*8-PFb~?YbuY z4Vm%cxbf=!&2ywa;jaI23z-)#b>)+46zyJRL1}NbFfCLt3;DHDxsNjMOHt67k5Jo5=5=xyW!hCb7;8+(J zz82ee=^Zy;hZB|v3Qj%pF)QXDD z2pw@6aVlJ(op~3go^A&A33fXk_RW!vekNy3H$1wgI@`%O9*)2)hH6Sdh9@3xrHZ&H ztp2d47NR4C%BO6!iR$71Vw$$P8dWMvYpsAkIa_C*Il^ddv)*1SZh_X#B}{Oq8T;+4 z>L!Gtlp}0NLa|WJYuUIq)Pzx&I$0X-o2e!0u9gC)AaA^!^{FAj_!>-a!I|D^+Px4T z81TO*z;#@=Otmv)vOpU7v90YAq?5vuUCOCpzM=f2$JxQ$aclpzEZvl9_R8X@)#hjO zvMmI;rO<#yqr9i*THQ72{~IBCc@{?{OCSVo;Z1 z(Qy`k%)uO8FbFmnay=Alf}{f34@Snyj&7U@=3wTVD6#E1yMoe7&Ne$sl1^tQBa4sx z7{@_6@vY5^6WgkgY#!i8hN%AYlGNy(wn)b9J1TBvi zc2?E?WreVftpye9*=l+lND&feA+D@Ct*u?f`n%EuGejqd;|l3w>h z_nqr~0e$V@iShdP0Oh6XdC%$GW`ftg-ui`nuWMjZy%AoX@Ghaw6yE=eH^4!yEk>h5 z;C=Gs9SJQM02XXr4|6!b=L9hyLmV3b{I3GwlK=oGutE&~RKrkMQiN?fQ55gE#|ZYt zZ!1t@ng;pEheYyygJ$F;Pa?K54qud~TtV>JxTiSgD#;?%I4*CwC-RlRZ(*0qQt4w9@McK-nwHLH1#$tqN_qn9~oZars;{*5E!LtbS62nL^qZGQ(JN+^Lk`LXF zAHG@2Go~?l<6MGQjg-+k5UqX(oU$`_y2;1{vvns>UR2dfwn1afGgf1j zzjx&edGc2FOx4Rc_D?eNwXXmL+hAPl=?#LquuJx_j!(TLL67;^%LcNOTkYcqOPkus z?gOmdJZo;xmeTeD>u~4F*33zaxR@3K~?{~)MJ!0Py`PmZ=`Nl;q zVFD-0#THI(t?TN|kZX!xgeWIl=}gzEQ7xufCaa>0EzkN+8`(RL1c^cauH>Nam%Tp+ zM9`U?a+QPI&MhBp$_zD_m|dsKR3}d~Z^dp-aGJZ4r1`VH`=X8y9k^sKQ+8)wT(PSL z554F|Px{h-jRtkU;?Bs$>BhQs?kU1*Xls?M+)PPhU=#M_ zagh2Y^xpMIpXv}KM=0X+EOhEd)9_o*NLYuJ~4ib6IO$7JTUf39+V zcxG^Xlzyk@FvG_#!@_>8gLpSpffND~duMVir+QG;gG3N<>9$DKhGqh0g3ZTTEQo=& zr(a1pfb9`=&n1Kj=u<`LGr%`8#KL{ibUrj#Q#QC%SNM9@SB1?LhQ1enHOPEsI8tcn zg=)Bl%QuD@_J(knO2T(zbXbR)(1tVhg-D@?V5oT|XoY~thH{99Mp%e@c!*e*hl-eK zd?-_XXo!z!hb1?MiCBp)6^Si1i9e``mbhYrScae&M4ZU~Ql1!xrKo>`NQTC?imZrw z%=L<}xQUENcaB(#qS%U!zjk3s$iN|}DA%Vw~fvEP|KC`ZUra}5Xw>L`xO*p5gw zNygNIE_ZD6$Zx!eh_Rwe;lyYB)sJ_0i2#`|dSy&fhaQ}RjaR6RotTUU>2>tzhM8EA z8WN2s1(C6+ktFz!jhK-jDUIydiwbFaD!Gy@*^({^dK)H^xJZson1o++lQ;=Nj(3FA zXL+p9KR_9j`m>X)re!kOjKGM3xuukJk&{k|lO2fvcT6c2frm$YB$QYgluSjgerMd?^4&_g>1T zmw(A~tp%5cX#j%>ZFGr{BRO{vR&9^j2YqRlBNr`|Sz!2vnO7-66u?6f)S26JnJ2fH zyNHrUsc-ufZ~Ii174VezwvVsbVXAp;K_iqBU_BFnoB4B_aXFibW|Uspm=~FtL-=z` zGMN(Kl+l)SMMs>?xpY%lX}0;9yIGx~shH_#fx&5)7de3==$(7nm&uuvzUB^Q#*gPl zn}7h6xhX|b#GAcoYU-&35{ZgQnS%4VkG{bFmlNQc1o@ljh;4NSo$&;nkuaU^xj(vj zoimr6H`txq$b0AMpdv_?teHemIidMk8Wakin*kn0=?e(DpbA=|*HfNe2Ap+?loHBp z=xLm;aG`v;oFho1Kxd;inrsC+3ls#J`@@?)dZO65p@F!aEE<2Eux}~0nonr~%ITW| zDlkg=T~oTAhxwMVNp>Fjom6O=+ZmZj2c~&2nPn-OnvUR5*b{r;` zmFkv+s+E-L7jasj!kCnVXO*EkrjVNdp;Ji@RVhrPDyN)~sY1Dx5`n1x=%wyhldM&$ zP-%I(nuM6@szd3MImVG9D6RHM zt^7v^{wJ?0xT~`Pg9%4V?9r*h8dAgx7D_mva<+l}mxE{;dr$~oi=?pp`laK~(Y9G5W_qc%qON_H~t>|$&w4kzGs;J!hYwfYCwmP$w z_OK_Svl}^zr}?avX0*^sr!A}hv?ghHNsEyS3$*|$wMN>l8*8;M`k+&bj2+9hOB=0# zm8@oawrD%D@+h_%#k6d@wr@MODjK&$d0UWkySGE-w|uK}fE%@g+o60($ zr;ED!TDYsrx|J)ruls~>l2&nAwRAhXa(260Lp!8My1MIu*$PfpXR=GkYt&>jHj5f& z!+=B^2E031!OL<62#>haG{jpru&ST@^t+%tz0tRI_Gf%2w^zBbOkrbd54di$2)u49 zpD?0U-8fDaT1!-lqL(!PI#3l5)cCjVi?;+wd*ud7vxiT^l}|VmT{DO*&wHNcs%m$O zy5Jj-YU_K^>%ah&PYoKl-}}B9_KvZXV1snQb~V968&^(9Z10l2L#u;3XbyX&k0cAZ zn`^=?d<819!hl9yn+mQ`SAQ-{!>a4S#~V<()_yOeg$h@^BU4Pb=6)6G#976|@8^Kc zJ4YnkRyK^mX1?EQGHJWX zoZQKr{8@Wku@I8~$+gN_9(2m6d_WaU$^}e*W%SChY(kY6v>GS{YK)1i3IM6R%c#7) zyLGC12h8IT%ft-JZI{cb%Bp{;$R{i%EO^5{JZH3dd$V_;8QhYpu-2xUw_%p-lj`I)4t zY0IH3$_GgQPse0v3`kcsofG-!(wqSgi#Mc`kj)dY(^`Gf22G*)90@}GM6q1dfJ&re z&AYb@vE&xWF+;t#chzQ`eAU~%J`J~@1`RoVM7)f@nCqb$ItgVx0mY2g=_$naTe?Mx zwF2nIlq_`<4Z>t1FBLr}Fc&b9-L@ON)m-h@yPR%;jj#VX3n485L`}mb9i4_&+JLc zZ&m95-Hz>z4Qj4`+#hfH3mN^~AC28&`e4513n4AeXkFm{jotYD;EUYDQtUENEIXnh zGoMt!`Hh#p5a8*}-FI5h{4C=BoZ#|3tDZaJ1D)0>o!kK&Y=%6>`CCskO|b{fl<45$ ze;wYFiq7Y3&NE@+CvMG-8g@V~;-8z}H(bry7sn0V$LOnj4{V6JtmC1b%)U&O!h8xs ze%6C$O@g=OR=L!+c&jpfQ(H?HK(9Nw7B zh5h7Dp+kGt3I?8h=!l-^#k%JZE+JFCh_I{FEw06hOy-c7X)ncjNiux^LOU8R%r~3= z=Mr14HdyF@E`x}{)|L)+Fw4%MZhhld%Q8FbNZ9K1c{N|Gu5!%ivHjTIq$Dt$;nlI( z`AU*M;p!lp>;p^73wW^)hcv1_=}`ADzwRD=bilx|+qCTwbB@lNPOkuK?=0r_Bb>> z$yv;-pCRu2?(j_g!nXc_{{HNi$?Nn9u;!SBqh#TdJlB50%|*LfwJx&E9_}K0X;+8D zq0aFihVig%AFK@P|GVm8OIQoPRnb21l+L<4uiUPe^HTNm>R!T?F71cgSVBMli$GuW zJuks9@8XEH^hn$Ejs90u@3b+$^+xaWQQzG-fAl=R%*!qIR-f+83@KZb^<-c3NH6gC z{_rRtA#BgHS1Dms>>m>eZxcrYVyllSz*HEp!C0kDl zpZdh@zshg(5b)%r)m}V7<`?`=>p~9Pw6l}U^&}rNRc9JzTZ`0PzTEDbCpaV)jYnis zxnwq#GG{a=rBa|(Y*veTp->>4tp)UeyT1*H_N3WEnEvrQc}kYG3Nnkqp0H(M?>{c_a^`UBr}TAp z>+HODxp=;taZloA^KfYTbMAX@L1GLfSkT}>gb5WcWZ2N*Lx>UoB~GOHupJC+yykfU z1mqvbkLU)CIHs@Lw;B}>G6^<^pDX|bWX_~n)8ps5AZRBke=-vs9dG->6N!`-k?GMZY+9Rnc}NC`Vi9YbuG!U<-zKU zTTnt^ba>uTwmmyJV8TCh*UlX_c;sBZr*Hn4=rw6hJ<2ctX+t0SVf2~WcjlBoIqRe{ z=n>_NGf)%+4dg?(3C2pWKnR<7khAvGi?A2g-owSHtNz)3Ab)^LvBed! zQ;ZcXu>{PH&mbex2y`!+%Gz8hJ}*wfp~P2c8}Y=gNW>F4g<^b@ zNg9EBk;3!>9Slq`!xFSdLhZZl(F#orB*#ge6H>bM_OZtp|JVc2Nu@vmsJ^G-?6b~4 zEo^jE3|BN0NFQSo?1C`WY*j&w$b5CzTVutw*Gq^0#B`OHG~%?fOhb&6F-FNl&jaxi z#mQMueO%;OWq<9?JWJUe_S;0<+-*?^11&SRG&P9!0UXig(b`a|l{eRHu?5y!e8IJs z$yTV7(9Z1K{B>E=#=P}1&%_g~U^MTQX5a%MF7Uayg4K6WcOij`#xew6t}o6w&bF|& z)K$1$jIpJdWW6vHnJ87y4ehIQ|1xHmXQXz#*=Gh z^h#H$Q2NZNp{6&(d@l|WRI4MoGfJ>Ug6g_*q7s)#fYnNyD_NVK_GOY*hPyVjgUnj% zo;U3}Ej`0N^1pYRob7DF3pf05#1l{4?&$FU{#tB~>4cnA$?MHnaCjZpeDlm{srfk0 z`7;}6pOAqisk}@ldu^dfbvSg`H~)N#*`28U;HA*4^UgFQ@)?=uOFKY2hXbGO`R$&3 zn!yjBS=;F+#6{v;{+BNI?QI+S3s~xYCn^D*Yfa6Qo$Eqyqz4XTIT8#TBM?Nif8`G? zXzO3^!lfVfP0(MR%bxwfr8oF};c*?>Q~J(Rzz{ACP8%Fx4J`;lk)`lsuY(T*9rrg! z?Jy}y!AJy&7(Ybp&V{HNUI3AYJ`NK9uw%|R$`h3bIEih@gx?yM&*~+oBxOuWL%ClW z@g_yvZIO#d^w~J}13xHPj*MocBNrK0lsan6i51IZA18xG38~SK;REC#4OzbL-R*gE z+anze>+iAt6jQ<`?srLaP0 zI#K?hm!h-cHuGop@mfCKv)P{%S@WP1{YgSgLD0FBEk8Y5;hvO9QIJ;Z zpYD9+Hd~jcV|i4fA!X_E66s2!W$9A|qSOY8FN2swrB$hlDX$u=r-U3Ko8%JKul~`Zq(JKc z5lEFDtZsD2!r3V=m^^=`m7;AeC{M51LSuB)a?LEAMmdCuvW`;~_w-=kcB0j4fbldV z_3ICXsZ!A$uZpt7nBMX_L;TS&UD6}!W1T~stEO|T`Xa27o+i+t7B-t{Y@c1T zmUZ30s}LER*&OZmKBi>6c>U?NP`b48-Uf##%5b566UsTk5^0QFD=QaDHAy5^ zcqRtkbdk&3jUqQq#v7UOs6wd;v&@v54VZ2J>!;XaSETK%Y#-B?Poz4x!9B*Pl3iNl zSL*D=9*tv+!P|-@@3q8^aPn3m{ACXNR~uPAXqU5S!DY4=%s+}Fm&sh_Eu%ShYu@ZL z+w0~x_tVTIOk$e<+04d41XadumUEuvxo1{g)X+>_^g0o}(?T~o(vlA6qag|9zq0L` zly-ESS24}fu9VZ#w6rEgZCT3Ehm;+B>8MHV>0D-da&|UaT}th0c)Ue%Z94Jx;2IEC zw;I>DEcLCU`)4FdRA z$!&9U65Q#APPExQ$aTNFe(sjHJ?kw=bl)4^`aWd7`EBoi`_bP4FE_yfPFaI5GU0U` z_`;Xz@PZ>8;+%{3#Gxv2i~lg=3a9tRW9soaj~nD7A9=^2Tk>I59OX}5@XF8Va*dlD z=C+>s$7NpsbByDhsjBrqL<$FPlNsHPZ#^7%U;i~pS{^?=X%rGKF7Cvo$7I4JKg0@WV`n{?<^Mf z-r??dz0V!+d>nk>@m_dhBL44ESA4D;Uw6Sjo}H41cH}8P&&wy?@|mYC=Lvs!&lffH z`%L@jlWBU3Kio-)}ef!B;Txcj0^E zFDv=6AO7+a?fi!I9r}}VMCl)nL-xdMd01BAIJd?w{qeC*YL%YMn zCDX&W<3qjjL$(9NuM)(wBSfh(M6pA}rBcMMV??KFL!^5{NZdK>o5bs@L`wuc0n9}I zO*BAGls^A+M646VmLkQeGsTcXMW<6mE&Igsdq7r9x>$rWR~$MMtVLVIL|oLmP~1hb zYrk0}x?t2ZU*yI88^)hQ#zQMc`inqjEV^EN#{RQFWz;@Mtj7DhMroWz4BW;Glt64G zKyCEK_iMv&M8I(*M=onXc5Fv?d`Ebk2z8uCdaOr#yhnV@M}6E!e(Xno{6~NcNP!$k zf-FdbJV=C0Na*u1HBq)4S}b+AlHHP_kWolOn}mz&gkE5n_IRY)Imd+L$ca(D!9g*t z+LqBV3zOM)j$~<`XsWJk>%MR- z&vb3yc&_h!@BhG{a7Zi~kI1BQ$!t2G(5Q4uty-_xtai)odcWYXcuX#v&maI`qDHqv zZ}xf>ztuH&_#C6|%lmr|fGB=Fc_)V?afua-8H;m{I+A)FfPr9sg=iv_Q=TcHZ-<~B zr7x!(sT-P}tB`V;l(1r#qnosY5^aUIthj5vx|e^s#Dc@ekjt)-x{uDg&&a~Sz|x!4 zfyb)O*QUv|+OgRd#&z7&+*luD+t1VN$c>ob(#7Pr!u;~`U6|!<46l2>w6)qt z4Ie{$_Zr5ENFiaui4G|;v>5HzMu8LmIX(=TPh>=s1O@tIcJZUjlg)^s?AX#HL{Y&I z(%dE7vgSab{Z>VR6%V1#mlZqSlnPZDPmBS3&g^*juvnQi^cN2E3bBZKs`M@fp)=({0}{On>$Zn-v=4vS1^(HA#}N zTgHCbW{%65Xxp=Bsd}y)Iqlb{rA32=_!wzo!ZXxV!%DIaxv5xjx z`*!hvsp%;P{*55!sK{B0jV?7^J;Bw`l{=bU_BXm8wcGU;yBK-C#pOYl?ih1<^IDYy zluUf}J5Da{E4q%qzyJT>0Vv@AfCLt3;DHDxsNjMOHt67k5Jo8BgcMe2;e{AxsNsej zcIe@UAcm+yQ?~8*7b@-C^@)n@3HO(Zfmy<$h%_Ro9T2@0X4Vxs-jSn=_RU!1kQ9n1 zj(%q$*_e6{F+!p`+ttM$T;#0>pJCl$DVLQ2Lb;xEOA;xjfH$U=hH6t;=7^7-wdi6t zxS_dQZt+>x9!KAS_v4s+a#1F8&CHjknZdZ0Vt7$<`5BwxP^TlElL40KX7cS;7=L|c zO2(h6fobVloGBUUbC)f8=xX$xmg;b3evlTMt}2$GJI5LM(|Pmk*&(fh+Q2EIEN)rq zTuq`!nW(fP_vMw4j^phAFUMl4n{`s^DJ_8KsESpLpK5w1W!{D>Zg@bFlAf@ijXN5+ z>b5&3mFYoO7ipC0`XQXP3TehEo}P)Szj%2$LW%B9vd~Ct;(BVcnu-G?w))!3+K&3H z`Ya*(7Ca(z55FmEO9Xejp~DpCS7?<>Qpse>f-1F~u(gSEJa`U*r`8&m?FFNb zM!H|fW;2m747SznvFprM2RqHf=FKFa{nCv2 zv}@OT>3KdsYj?*5o;*kZ$R{7b0|GSfyZ{djApP_MJV3zp*c0$T0o-?Azyk(^FTMc} z9AN(W2Po8r^2sy*eDl#$FTM5IUynuo_Iuww_~VCPKKkYpgl|@ty0cwtLB{g~`;h0p z_r*_s^sC?Y^!L5~`44~r4BP`2xV-nlPk!^mpZ2aG!U^h+fBpL(00mgU7Sbqz>sw$0 zpZ7rOMKF6N^d1Vwr$Y3pZw(xrq4R1uy&Gche)!Ab{wzp745p8OE{tM>UHzSV0T__V9c^+@KXbNW>5(k%UR);ts|4#SBXEjU1w)7}+Pp4}#E$`J><(FNnb~ z2Jwnz)Z!VfuthyGv5ilJqaraR$3K!Wi+I$Y8V~72KaSCXkSrk@B{)ehRuYPf4CQ|s zc}W^(GL44xWFIx?NKD>QlY~U&2`RZsQQA^yxAXxhbIHqE^l}Hg{G~9r5X@o1!I;SG zPcf5e31&L849k4xBcw^qFGRDNjliZhvvAFAve290TuL}YG0t)}p_|)8r#aWj0(D~3 zo$QRK3E)Xhddl;jX~1Vb^~ujk^s|}&3@8ok`AmWeG@u4$Wp$xqzM29)i zh_bW)qQAtbMa!vCUUt+8RVPYLy<|T@X=egRCS?Z&&zbQ(kHxBls8oZ zwaAuIdDT=3IbCE>kq|P-5UpZAwdqfXdIW+^trAI9YE7AHgrWvUrrc3lRBJ$0DRyYuLsT7O{$r?DQDx*vg(yq>|0-04QtO$~ttdEd*`kG%H!ocDAvQC2e3$ zd)mULR<(<5t!HKMTG$F!wvPQQUlC~A)#4Vly#*|5e~Z4_23LB+C9e4}d)(V9*NM9S zHR}|c>)hu8(74AGn0e)bs9dx!YUy;+DO(b+2r}i(dJ* zHo7YnEshdffzpomy66?}e=i$gDOLW?BNbS*1-dVjK~6nh#8eaVp?s1 zet!U87f-meHU_R@NjyIh%g?(=zpS>3|_M66r=dus4S|&gre}pr?FlJj>a{h#a(? zMcm(4hxvoS7d(XdXpuFZkyvJOPi8HVHohimLdo0+RLB zX%p#NR;5a_2A?V;RyDg-E4N)I5>8zTbGzGcj$eyy{b)(&y0|%S^10Ffed{svdE=~8 zxW~QhWXke+#>YlBzLkCQFnuf2uL1bJuio$G_|9hs2k3bVY~Rz`nY3l^?AbM&cFWQ? zyltOtvL8HMvNM>{3XXej^M3cY*SzmICh3rM$#({?J+pdOa)1+GXD-(l@N@SQ2k5A1i#Lw@RAkR0XTn%B~s{`9C%z3Nxr6wni)chH*M#fVchoit5&2LvWc z*(%P+3qdmzgZbQ&_B7x}Zuh*Gs_TCbI&Fom>+!PGldj6t!5e~eT2&gUW0mO~N3-=+ zWm@dFZfM^}uKBF$>C2^$^3WZBioe^KJKLQ7?jseXnG1^TO3wWM&S7af33D_z1ACsM zd+=8~*VJarHctuoZx~~LI6`p2B7v+BcpGJXJb)gv$ACf>WDwYL3utMgg*G5)I_0-~ z7l?e&FgjGXF&y`O;1>#@g*6%&eC%d^7KMQZxPqqxFfvG6>O_BQ1#Ky(EjNgQIjDjw zsC^$eelXaCu_Av8NCzr`byYYE7MO$wn0zILgAt{J{=|h{h=gCLgkqQk{HKL|b%v^w zg=M&fY)DjY$WUOI19f;-Y50a~7>8&$hX-|se#nPJ7KjLChJrW*c}Rzbc!=*uhKdM> zjQD$m_)mc7g^_rDmiUK@c!`+kh?)qAoTy8a*iV({iJ^%91Bv*Fdw7b2n27>aiUY-p zI5LV2wTZGwi-fRS3IdB!m5Q%ui??WsZf0Hx6pWo1i^RB##+ZS)h))w0Qa}iWyqHwJ zScs^Ye?YiT%V>wqC{cD8Q?)l!MW_nf7>2?~iQkwf)Rq#*RF0_Fjq>!2C}&i-LQ@Fm zj_{}mx;RiD<27rhkND_{!$@~_Fptz{f>OdS0V$Alu#Yyfkmooe4tXHcIFYDek;Ma% z$QY5e2#OjhWchee>BxE{S&}Ask|Zk}&B(0Kh~vS(6q705O@9FgcSp z*^@MhlR6oc&%={GS(M@6L8xK3nOQ;{%s*={$2um*InycPW#4`I9TT zk!od!ed(8fd6R`Hmxqa%iHVns**|>Qm`nMXbs3m5P?7IKn36e}l)0Ci$(fyLmwlO+ zdKsCGNt$$tmJCUXnhBE?K$Sj80Y)jBWYj>fX_z)C0V$-LOhlVQWSbKZlX+PIY$Th2 z$#I{Fnr^9@Ea{A`sgn{Al*-AQP3fDz=|0g3KXo*n)JZ-Q@RKnaoX~@vb>x^m*`5Bg zM|(MzwJDz3=|I`pJVZ&H#aW!_S((0(mgcnomO&Yx!kL@ud6oT1p4z#cv57*ud7qvc zo&-9cZ3&=W6riRFNaQ&~6fl&B#6REZo#}a;$|snD_nfZjpZ{5t^y!oX`koi6nCGdX zE()FudY$EIo;10k_Suyucv44b4mla0KFU1)IhWMQn?x$1mPuO}i3-p;qc4e?MLL@) zI-b!vPo(j62`MH`MX$M+5 zl}`GiD7vHt`kpKbp}PsABdVudDxWpFM{SCqJIV&_#-lL`s20$r_1U3o+NR72qA4hq z47#Fa3800_n3r0iT*{s3DXE=WpiEl-r94ER7T}>ux~L8cpBVb3k!q(md88bdr1_DY zow=ZrshnnMon*#k;ynv>dzJkPlJ9z%DH*X6JFyfyu?;(rgZYjhS*vf_oZhIh z8|$tg`mGO(q~q644G4u=Vlq#tvIV&|PFORC+J#_#pemt}Pe?lvfMBA*Fk$X|dvmMxgJ$NEIl_G(%EO-#L$r9dW(krIFA3Kqa$mw1Syc)2M$ZS zw%9R$Ejxo(ScBL>jvYID!o3)g5M|{XKPdK=O384 zx-^?(i@|)^$i6OzAMgABx#0^{wkK*5Un3I+$-)RZ92+cr9qf;FqB$X~x;G5C`+L6sHYG27F70=a(-wQ; zSS zgA|FzOl-bayKj&ZYT>wqU#E3o8-qsJ6$LDTR?C3Zz>nFh#=Z;0rSrFT;&M-AE?0{; zB@-=9Ln`tY$z@Fc$NEQYdQ6X2%*mdXE^dr{lj6x-1&$_YwY`zQA&R^uY{YD9eCy}5 zntXpeW;3$mH0nsiA-J`PD#^IazYVO#wb#R!rgejyz^zQk+cL(%EX`z*d$r8Rh`P+K zOo@GK%)mUp-b~6{WmRcIJN5Cr=RC>K0!%rzzHnbZP@IC z*oocLj9t@?{n!QI)RB$TlwH)HfY---QJ0O`ncdT$-PoZm+M}I3ll|D1ecDl7+KRo| z;0#ua{n@FV*t31vwO!Y@9oe}J*Q@d$h|PIY2D|P~F=WVAfAf0d%d?60koMz}_{D z-V9X#0f((d^DWCJpnpoLhIeru$|A=tk8`@KsyC}UpIZ!A%F%g zdoz8RKRp5Iz0~oI-AHZU_AS}){oyC1M2cPCBd$Cv4%$2Y;RbHj{(aLT-s1O7;CeJc zF@EA)G~5gx8p6!B)&j~zSj8G0$QTUDc5vQvbkyp--#lI2EG|Yip42an;@^Yikgeh} z)Z`pg+a_+}Y>mTl3($PPVo>;wP@$?WWWEo=yA{?ym~>E0vdjDG0)ed}y()0htEUykT(9_3`N5|8le z%fsvTjo4w{>55+2p>EQ5yv3c?gZi<^V0$rC95PEt*kS$W9bVS5zUb}E>!^L@xL(w{ zF5u$s;s;*tW6p8JUggJL?#V9W-TmXAydT)ivLs#DmtN(z&eIiO*WvE(zHLmHc&FRU0@bu2v%qWJmj@H{P@Xa0a^v&8N5A5zf@~%DW z&7Q-|Y#jAWd)N?-D$6LD(A*cl@|BJAC!gyouk*~F@+J@TLC^6!$hDn~%t4<2^dcDE z<^2gfPxK!z);*u_Ll5-XP1{o6@}t}I)pjy{zJZj?Gz4sqWG~PvT?JF$?K;2qurBpc zkM$9+-CJMpqTX@=OgT>@^IW~>d0oXUr}iT~_=I2hCCT+?jPE84z+Y0qm?jjPHqHtS z)B8@c?`-$Z9?u68$1xB1x}43K-0Fx=zHy%UIO~Ad?7)~z=Xwzxwmey;z}eSG(F=<)F{ ze>$b_{NnAmill+G@BNOPwdB3CUHiDfJW|`=^+XlXzVv_e{DXO`wjRj;xMU;b+CTci zFTV+`V}jf?5CFiF^Ie?v=G}iV6i2e`EU&sG^JCi+g~NA_?NrA1TYGB`a3dV@j4j+Z*KaC6o2bMN5&Oh_y!`)Q{QwTcC(xfXg9H__TG-GbLvGmr9!{)B(c;B~?Id30 z$R%S(kg&vU3|X>?NtEbkzGnoSMl7uB0(I7xa zDCOC-1k*1qm!V*R6q40OSi?ZI&&IvmQz_$ zT)*!15jGmMs$^|pF`D#>ty+Qz4@S%?$zsKg6Zg`~*K%b{Vt@TP)S0vAJh<-WVjS6Y z8&7W67M={&^6N;Lkw|@7)%NMFf_k(*4H@*=PmXm@?zG95Y}ieaKcy{vC}P!}cLRT0 zmo#qPM9W6MWgYJFYstmO^V>7!cJP$PuP;@;S$g(Y7E$;7`$-N*U8`i$%r(& zua*6VaVsIbe)(^~%$j>a?bD^42aGW^ITKKJ##p5 zHawTKF$FsV-DXfj=RveT^B~m9j7L3OG*NXX?F+{oud=kEO(~rz%sa~vI?OegFu%e59*P>+K!#SwkPExH&}UXDA4mSUHug*oPE0mhf+n$c~t(PuuM>Smm|1v==NiQafRQ@~bgleaH^6sT&ox^vZD zvdgAB-dD4odfKe3h4rk}`o{W!X9FidagUGxZk6P^&yrT`#1S8x@wCBNo9XE`MzI~a zH5^>JSJs(ony2M$9z@TuUX$VaMxdcx_avY$Nly1Q=fiCyTNW<@za6Ny$JS~o@MvCAGgBy zv27P#ZE+~pzwKo^XIRgM83};@dsyKNhY7 zHt&JK!=U|SRxmKN?|l?}%WCLnKkSA7PiaXcp5}UFDj5>#bNx%u0N*6N8X9nj*UO>y z=qAPEp>5X-DMsWv_&~tSj~$O(}w812g?sz=gX=1O7y85qJ2-2XXO?>&jtu*_g&%(eXlYte(0mrK%kTs&EP1V|f0UzAALDXS-3L zOc}YxNcN+Wo5sv5!WFzJTW@2@$6N0(FG*9TvOlf7(uLaenO`q}>P z3svfFafdzADm$L85qn)(4?XcTgb&$ky?AFsUL~!5s;z<1WKEe^@;(+hiF1g$VyA0Ct?|<> z=1V~J6Dx=-h6VJ$Y;!82a=SSAIl=h51lhDJk-JIAz)HzKgsPy?c{4Pjz!M=sNdi6h zK|!7Rzb}y=4`e})13{&VIMpJ*xv@bU9J$#NLZyN_pxZblq`|`?!eUdw4$(5@0z1H~ zy8}ePE`vKL)Hb5)LfZqwfb%>tJhd`JycH|4hm*L^8Z7cS!!Hy#B$K+Si<_)~!#G5= zdVYOiI6yH(GrU0##6A;zw3nM9M@&Bd zOLRI(oJ2(AsqMSKqwBgXWI3-BwNEs?P!vT^qr28vnOH0+c>5@QE5uaBMo#XQ_UCzP#Z)WcTX!_>pX$`TAn9E*B8M*e$7`zyv)dK{8s zsAI9Ji%P|lN;Ph*ybV+@Z?neh_&G)7yV@{E@0zJ}gvKbW#Kd?TaTL2()V&|1#|F8_ z@bgAb5kixRmw$sd)VRj2!bO542PwR;Ei}l8{IDXtNS4q@{aZ(AJiCXiM|IQ2(Goq5 zl*o*n6TzcE!t+Cj!N`+DNsrV=?IWs&Qj0bG9EB9YX8gUFyu*|f6w%nncLXl~qPz{T z;*3W`#-9YrnRG?=vq^?D3)|?xBMCu!B1t-HN(>B2FG;S_087i7HY+5!XLClb?8>Kf zn(bOYE9|%Q)5&W5!>NSGv|NLU^hMCyClqwNyX3;Z#7nP~6nVlr0}D*GJUn&;!t+AR z7E{b`l*QxgE*oMyP@AZVa7?Cz%*d=sc`P5CLPfiKOwFv1!JNXk$}*^OM?O={J$u8_ z+{m?LOV4D?vb3t|t3Z>CO$9tn)NHzOo5t4c!-R7i-jq$wJWjM!PQV;P=G?~Tw994m zkA!r?f^&t!G|lL2&RsN=59GC;EJwpc$L&-61MO}D+v8j=seHPBrRnLPTb_a;@m2|Lk}NC(kfL_ww%D&(li*F zkpEP|v-C+TP0}ER$_q3_5yicmx61SOvaWUDR3~y;~jAT$Q|CRmq#1$MKB2Uu`?` zMAcr+!C@WE3l*qrpuuBJyk`|k5`9moVLP|8(!(R{Z_*KQVmVb&+O0aTUHzGQ+p*$Lfw1?f!h%K{;T|s933$jAjbmgaDG?QiPrlH!{QeD?9b4zoZOUb+ecB448 zTiL2~ERp3{k|nsD{GvyF(*ChN{)DcWtytp9#0*8bYh^?K6`d@G{EQP-S66+;r9?Vx zrNgrlRQ&u{#pqe4E!l)^S!-?3xO73e8BT)r*&Y+yPtDPVwbhvA)K2BbBE3#!eXxxs z+xTc(f2~7eG}fzy9xgq_TU;3)0m+dxR6ZqDxn+-)qs%jf#OuRXv&6P^E!_1uTo(G8 z-15hTVbjW`)=?!~wxv^dDWu%ATb7gBc~x4@?cDavH&_f@aCt5;)%Q``-);e8El1*8!jOE!DU3hhPUO~x%_E7{pxb}d)$9e(+O#^!1zjkOzqm!+^o`R0tXsV?O(gqKnUjsh4@@-m5tyF>x-4x}b ze}vltcHqEkGe9)CG{v(3eq6H!;M3Jz0%ceio=_N$;Xj>W8qQz=-CwTMVF=^lpY-7b z1LBhuVgVy!jWpu@LgI*2;`w6YdvxMNyy0R4RVuDxE52eZZb2#DVlM7tFaBaM4r4JM zV=^vdGd^Q9PGdD*V>WJMH-2L{j$=9QOYQ z$KWy9un9m8WSBJFk);EWv8(?y%;fzU`RxyPeq&Nbj^aU<*-Wn5ku6a}R@(NJS%Jc2 zMu>t@{^L!au(MTO-gE#zEUKU2PC*@NU-4i8$clPhTD7n5WQ?PIES$pqitPg-ezv@W^evxa1Lj29%pi9(FgzlJC9*}3jhEB diff --git a/16/PCX_LIB/PCX_EXAM.OBJ b/16/PCX_LIB/PCX_EXAM.OBJ index 1ea897c734ffc1ba03d15c4328db98e5f3488876..8022d0cdf1a1c1f139280dcf429896e0aaf90dfe 100644 GIT binary patch delta 17 Ycmdljxm$9AC8Op16=05z@!rT_o{ delta 17 Ycmdljxm$9AC8Oa)D+R`R8>16=05#SHrT_o{ diff --git a/16/PCX_LIB/RD_DEMO.OBJ b/16/PCX_LIB/RD_DEMO.OBJ index 6947a7011daa77bb22090810f25574760a10aae5..0393aa6c448758d41bee06d919cff65cf594f907 100644 GIT binary patch delta 21 dcmaFJ|B!!z1(Rm;#6;1F{+x`TH%4}_0{~dg2h;!n delta 21 dcmaFJ|B!!z1(RX(#6;1F{+x`jH%4}_0{~eT2h;!n diff --git a/16/PCX_LIB/WR_DEMO.OBJ b/16/PCX_LIB/WR_DEMO.OBJ index 9df70a07a1110ade50aa8b60703b17aa67b91679..ee1111f80511c5188415e47fffc790239a45bbd0 100644 GIT binary patch delta 21 dcmX>qbW~`91(Rm;#6;1F{+x`@Hb%bT0032J2l@a2 delta 21 dcmX>qbW~`91(RX(#6;1F{+x{WHb%bT003362l@a2 diff --git a/16/Project 16.bfproject b/16/Project 16.bfproject index f743508d..7f1e4040 100644 --- a/16/Project 16.bfproject +++ b/16/Project 16.bfproject @@ -1,15 +1,15 @@ c2e.convert_special: 0 e2c.convert_num: 0 -openfiles: /dos/z/16/16/dos_gfx.cpp:8331:7953:1: +openfiles: /dos/z/16/16/dos_gfx.cpp:7011:6876:1: openfiles: /dos/z/16/16/dos_gfx.h:477:0:0: openfiles: /dos/z/16/16/dos_kb.c:892:395:0: openfiles: /dos/z/16/16/dos_kb.h:60:0:0: openfiles: /dos/z/16/16/lib/lib_com.cpp:0:0:0: openfiles: /dos/z/16/16/lib/lib_com.h:2553:1416:0: openfiles: /dos/z/16/16/scroll.txt:5307:5080:0: -openfiles: /dos/z/16/16/project16.txt:8161:7174:0: +openfiles: /dos/z/16/16/project16.txt:8161:7087:0: openfiles: /dos/z/16/16/16.txt:0:0:0: -openfiles: /dos/z/16/16/lib/x/MODEX.H:3331:2278:0: +openfiles: /dos/z/16/16/lib/x/MODEX.H:4215:3474:0: openfiles: /dos/z/16/16/lib/x/MODEX.DEF:4471:3131:0: openfiles: /dos/z/16/16/lib/x/MAKEFILE:1186:782:0: openfiles: /dos/z/4x4_16/modex/DEMO07.PAS:985:490:0: @@ -30,7 +30,7 @@ c2e.convert_iso: 0 opendir: file:///dos/z/16/src/lib wrap_text_default: 0 bookmarks_filename_mode: 1 -ssearch_text: put +ssearch_text: text snr_casesens: 0 view_blocks: 1 name: project 16 @@ -78,22 +78,22 @@ recent_files: file:///dos/z/16/16/x.bat recent_files: file:///dos/z/16/16/xx.bat recent_files: file:///dos/z/16/16/lib/x/MXVS.ASM recent_files: file:///dos/z/16/16/lib/x/MXPN.ASM +recent_files: file:///dos/z/16/16/dos_gfx.cpp +recent_files: file:///dos/z/16/16/lib/lib_com.h recent_files: file:///dos/z/16/16/dos_gfx.h recent_files: file:///dos/z/16/16/dos_kb.c recent_files: file:///dos/z/16/16/dos_kb.h recent_files: file:///dos/z/16/16/lib/lib_com.cpp -recent_files: file:///dos/z/16/16/lib/lib_com.h recent_files: file:///dos/z/16/16/scroll.txt recent_files: file:///dos/z/16/16/project16.txt -recent_files: file:///dos/z/16/16/dos_gfx.cpp -recent_files: file:///dos/z/16/16/lib/x/MODEX.H -recent_files: file:///dos/z/16/16/lib/x/MODEX.DEF recent_files: file:///dos/z/16/16/16.txt -recent_files: file:///dos/z/16/16/lib/x/MAKEFILE +recent_files: file:///dos/z/16/src/lib/dos_gfx.h +recent_files: file:///dos/z/16/src/lib/dos_gfx.cpp recent_files: file:///dos/z/4x4_16/modex/DEMO07.PAS +recent_files: file:///dos/z/16/16/lib/x/MAKEFILE +recent_files: file:///dos/z/16/16/lib/x/MODEX.H +recent_files: file:///dos/z/16/16/lib/x/MODEX.DEF recent_files: file:///dos/z/16/16/lib/intro/lib.c -recent_files: file:///dos/z/16/src/lib/dos_gfx.cpp -recent_files: file:///dos/z/16/src/lib/dos_gfx.h snr_replacetype: 0 savedir: file:///dos/z/16/16 spell_check_default: 1 @@ -105,12 +105,6 @@ snr_escape_chars: 0 htmlbar_view: 0 spell_lang: en ssearch_dotmatchall: 0 -searchlist: mxpan -searchlist: gets -searchlist: mxset -searchlist: getr -searchlist: getvers -searchlist: GetVers searchlist: setvir searchlist: virtual searchlist: STEPS @@ -120,6 +114,12 @@ searchlist: mxPutPixel searchlist: setactive searchlist: vga searchlist: put +searchlist: mxOutStr +searchlist: Str +searchlist: mxSetTextColor +searchlist: OP_TRANS +searchlist: texyt +searchlist: text autocomplete: 1 outputb_show_all_output: 0 bookmarks_show_mode: 0 diff --git a/16/XINTRO.TXT b/16/XINTRO.TXT deleted file mode 100644 index 0ac05850..00000000 --- a/16/XINTRO.TXT +++ /dev/null @@ -1,569 +0,0 @@ -Title: INTRODUCTION TO MODE X (XINTRO.TXT) - -Version: 1.8 - -Author: Robert Schmidt - -Copyright: (C) 1993 of Ztiff Zox Softwear - refer to Status below. - -Last revision: 25-Nov-93 - -Figures: 1. M13ORG - memory organization in mode 13h - 2. MXORG - memory organization in unchained modes - - The figures are available both as 640x480x16 bitmaps - (in GIF format), and as 7-bit ASCII text (ASC) files. - -C sources: 1. LIB.C v1.2 - simple graphics library for planar, - 256-color modes - optionally self-testing. - - Excerpts from the source(s) appear in this article. - Whenever there are conflicts, the external source file(s) - are correct (or, at least, newest), _not_ the excerpts - provided here. - -Status: This article, its associated figures and source listings - named above, are all donated to the public domain. - Do with it whatever you like, but give credit where - credit is due. I would prefer it if this archive was - distributed in its entirety, including the files - mentioned above. - - The standard disclaimer applies. - -Index: 0. ABSTRACT - 1. INTRODUCTION TO THE VGA AND ITS 256-COLOR MODE - 2. GETTING MORE PAGES AND PUTTING YOUR FIRST PIXEL - 3. THE ROAD FROM HERE - 4. BOOKS ON THE SUBJECT - 5. BYE - FOR NOW - - -0. ABSTRACT - -This text gives a fairly basic, yet technical, explanation to what, why -and how Mode X is. It first tries to explain the layout of the VGA -memory and the shortcomings of the standard 320x200 256-color mode, -then gives instructions on how one can progress from mode 13h to a -multipage, planar 320x200 256-color mode, and from there to the -quasi-standard 320x240 mode, known as Mode X. - -A little experience in programming the standard VGA mode 13h -(320x200 in 256 colors) is assumed. Likewise a good understanding of -hexadecimal notation and the concepts of segments and I/O ports is -assumed. Keep a VGA reference handy, which at least should have -definitions of the VGA registers at bit level. - -Throughout the article, a simple graphics library for unchained (planar) -256-color modes is developed. The library supports the 320x200 and -320x240 modes, active and visible pages, and writing and reading -individual pixels. - - -1. INTRODUCTION TO THE VGA AND ITS 256-COLOR MODE - -Since its first appearance on the motherboards of the IBM PS/2 50, 60 -and 80 models in 1987, the Video Graphics Array has been the de facto -standard piece of graphics hardware for IBM and compatible personal -computers. The abbreviation, VGA, was to most people synonymous with -acceptable resolution (640x480 pixels), and a stunning rainbow of colors -(256 from a palette of 262,144), at least compared to the rather gory -CGA and EGA cards. - -Sadly, to use 256 colors, the VGA BIOS limited the users to 320x200 -pixels, i.e. the well-known mode 13h. This mode has one good and one -bad asset. The good one is that each one of the 64,000 pixels is easily -addressable in the 64 Kb video memory segment at 0A000h. Simply calculate -the offset using this formula: - -offset = (y * 320) + x; - -Set the byte at this address (0A000h:offset) to the color you want, and -the pixel is there. Reading a pixel is just as simple: just read the -corresponding byte. This was heaven, compared to the havoc of planes and -masking registers needed in 16-color modes. Suddenly, the distance from a -graphics algorithm on paper to an implemented graphics routine in assembly -was cut down to a fraction. The results were impressively fast, too! - -The bad asset is that mode 13h is also limited to only one page, i.e. -the VGA can hold only one screenful at any one time (plus 1536 pixels, or -about four lines). Most 16-color modes let the VGA hold more than one page, -and this enables you to show one of the pages to the user, while drawing on -another page in the meantime. Page flipping is an important concept in making -flicker free animations. Nice looking and smooth scrolling is also almost -impossible in mode 13h using plain VGA hardware. - -Now, the alert reader might say: "Hold on a minute! If mode 13h enables -only one page, this means that there is memory for only one page. But I -know for a fact that all VGAs have at least 256 Kb RAM, and one 320x200 -256-color page should consume only 320*200=64000 bytes, which is less -than 64 Kb. A standard VGA should room a little more than four 320x200 -pages!" Quite correct, and to see how the BIOS puts this limitation on -mode 13h, I'll elaborate a little on the memory organization of the VGA. - -The memory is separated into four bit planes. The reason for this stems -from the EGA, where graphics modes were 16-color. Using bit planes, the -designers chose to let each pixel on screen be addressable by a single -bit in a single byte in the video segment. Assuming the palette has -not been modified from the default, each plane represent one of the EGA -primary colors: red, green, blue and intensity. When modifying the bit -representing a pixel, the Write Plane Enable register is set to the -wanted color. Reading is more complex and slower, since you can -only read from a single plane at a time, by setting the Read Plane -Select register. Now, since each address in the video segment can -access 8 pixels, and there are 64 Kb addresses, 8 * 65,536 = 524,288 -16-color pixels can be accessed. In a 320x200 16-color mode, this makes -for about 8 (524,288/(320*200)) pages, in 640x480 you get nearly 2 -(524,288/(640*480)) pages. - -In a 256-color mode, the picture changes subtly. The designers decided -to fix the number of bit planes to 4, so extending the logic above to 8 -planes and 256 colors does not work. Instead, one of their goals was to -make the 256-color mode as easily accessible as possible. Comparing the -8 pixels/address in 16-color modes to the 1-to-1 correspondence of -pixels and addresses of mode 13h, one can say that they have -succeeded, but at a certain cost. For reasons I am not aware of, the -designers came up with the following effective, but memory-wasting -scheme: - -The address space of mode 13h is divided evenly across the four bit -planes. When an 8-bit color value is written to a 16-bit address in the -VGA segment, a bit plane is automatically selected by the 2 least -significant bits of the address. Then all 8 bits of the data is written -to the byte at the 16-bit address in the selected bitplane (have a look at -figure 1). Reading works exactly the same way. Since the bit planes are so -closely tied to the address, only every fourth byte in the video memory is -accessible, and 192 Kb of a 256 Kb VGA go to waste. Eliminating the -need to bother about planes sure is convenient and beneficial, but to -most people the loss of 3/4 of the total VGA memory sounds just hilarious. - -To accomodate this new method of accessing video memory, the VGA -designers introduced a new configuration bit called Chain-4, which -resides as bit number 3 in index 4 of the Sequencer. In 16-color modes, -the default state for this bit is off (zero), and the VGA operates as -described earlier. In the VGA's standard 256-color mode, mode 13h, this -bit is turned on (set to one), and this turns the tieing of bit -planes and memory address on. - -In this state, the bit planes are said to be chained together, thus mode -13h is often called a _chained mode_. - -Note that Chain-4 in itself is not enough to set a 256-color mode - -there are other registers which deals with the other subtle changes in -nature from 16 to 256 colors. But, as we now will base our work with -mode X on mode 13h, which already is 256-color, we won't bother about -these for now. - - - -2. GETTING MORE PAGES AND PUTTING YOUR FIRST PIXEL - -The observant reader might at this time suggest that clearing the -Chain-4 bit after setting mode 13h will give us access to all 256 Kb of -video memory, as the two least significant bits of the byte address -won't be `wasted' on selecting a bit plane. This is correct. You might -also start feeling a little uneasy, because something tells you that -you'll instantly loose the simple addressing scheme of mode 13h. Sadly, -that is also correct. - -At the moment Chain-4 is cleared, each byte offset addresses *four* -sequential pixels, corresponding to the four planes addressed in 16-color -modes. Every fourth pixel belong in the same plane. Before writing to a byte -offset in the video segment, you should make sure that the 4-bit mask in the -Write Plane Enable register is set correctly, according to which of the four -addressable pixels you want to modify. In essence, it works like a 16-color -mode with a twist. See figure 2. - -So, is this mode X? Not quite. We need to elaborate to the VGA how to -fetch data for refreshing the monitor image. Explaining the logic -behind this is beyond the scope of this getting-you-started text, and it -wouldn't be very interesting anyway. Also, mode 13h has only 200 lines, -while I promised 240 lines. I'll fix that later below. Here is the minimum -snippet of code to initiate the 4 page variant of mode 13h (320x200), written -in plain C, using some DOS specific features (see header for a note about the -sources included): - -----8<-------cut begin------ - -/* width and height should specify the mode dimensions. widthBytes - specify the width of a line in addressable bytes. */ - -int width, height, widthBytes; - -/* actStart specifies the start of the page being accessed by - drawing operations. visStart specifies the contents of the Screen - Start register, i.e. the start of the visible page */ - -unsigned actStart, visStart; - -/* - * set320x200x256_X() - * sets mode 13h, then turns it into an unchained (planar), 4-page - * 320x200x256 mode. - */ - -set320x200x256_X() - { - - union REGS r; - - /* Set VGA BIOS mode 13h: */ - - r.x.ax = 0x0013; - int86(0x10, &r, &r); - - /* Turn off the Chain-4 bit (bit 3 at index 4, port 0x3c4): */ - - outport(SEQU_ADDR, 0x0604); - - /* Turn off word mode, by setting the Mode Control register - of the CRT Controller (index 0x17, port 0x3d4): */ - - outport(CRTC_ADDR, 0xE317); - - /* Turn off doubleword mode, by setting the Underline Location - register (index 0x14, port 0x3d4): */ - - outport(CRTC_ADDR, 0x0014); - - /* Clear entire video memory, by selecting all four planes, then - writing 0 to the entire segment. */ - - outport(SEQU_ADDR, 0x0F02); - memset(vga+1, 0, 0xffff); /* stupid size_t exactly 1 too small */ - vga[0] = 0; - - /* Update the global variables to reflect the dimensions of this - mode. This is needed by most future drawing operations. */ - - width = 320; - height = 200; - - /* Each byte addresses four pixels, so the width of a scan line - in *bytes* is one fourth of the number of pixels on a line. */ - - widthBytes = width / 4; - - /* By default we want screen refreshing and drawing operations - to be based at offset 0 in the video segment. */ - - actStart = visStart = 0; - - } - -----8<-------cut end------ - -As you can see, I've already provided some of the mechanics needed to -support multiple pages, by providing the actStart and visStart variables. -Selecting pages can be done in one of two contexts: - - 1) selecting the visible page, i.e. which page is visible on - screen, and - - 2) selecting the active page, i.e. which page is accessed by - drawing operations - -Selecting the active page is just a matter of offsetting our graphics -operations by the address of the start of the page, as demonstrated in -the put pixel routine below. Selecting the visual page must be passed -in to the VGA, by setting the Screen Start register. Sadly enough, the -resolution of this register is limited to one addressable byte, which -means four pixels in unchained 256-color modes. Some further trickery is -needed for 1-pixel smooth, horizontal scrolling, but I'll make that a subject -for later. The setXXXStart() functions provided here accept byte -offsets as parameters, so they'll work in any mode. If widthBytes and -height are set correctly, so will the setXXXPage() functions. - -----8<-------cut begin------ - -/* - * setActiveStart() tells our graphics operations which address in video - * memory should be considered the top left corner. - */ - -setActiveStart(unsigned offset) - { - actStart = offset; - } - -/* - * setVisibleStart() tells the VGA from which byte to fetch the first - * pixel when starting refresh at the top of the screen. This version - * won't look very well in time critical situations (games for - * instance) as the register outputs are not synchronized with the - * screen refresh. This refresh might start when the high byte is - * set, but before the low byte is set, which produces a bad flicker. - * I won't bother with this now. - */ - -setVisibleStart(unsigned offset) - { - visStart = offset; - outport(CRTC_ADDR, 0x0C); /* set high byte */ - outport(CRTC_ADDR+1, visStart >> 8); - outport(CRTC_ADDR, 0x0D); /* set low byte */ - outport(CRTC_ADDR+1, visStart & 0xff); - } - -/* - * setXXXPage() sets the specified page by multiplying the page number - * with the size of one page at the current resolution, then handing the - * resulting offset value over to the corresponding setXXXStart() - * function. The first page number is 0. - */ - -setActivePage(int page) - { - setActiveStart(page * widthBytes * height); - } - -setVisiblePage(int page) - { - setVisibleStart(page * widthBytes * height); - } - -----8<-------cut end------ - -Due to the use of bit planes, the graphics routines tend to get more -complex than in mode 13h, and your first versions will generally tend to -be a little slower than mode 13h algorithms. Here's a put pixel routine -for any unchained 256-color mode (it assumes that the 'width' variable -from the above code is set correctly). Optimizing is left as an exercise -to you, the reader. This will be the only drawing operation I'll cover -in this article, but all general primitives like lines and circles can be -based on this routine. (You'll probably not want to do that though, due -to the inefficiency.) - -----8<-------cut begin------ - -putPixel_X(int x, int y, char color) - { - - /* Each address accesses four neighboring pixels, so set - Write Plane Enable according to which pixel we want - to modify. The plane is determined by the two least - significant bits of the x-coordinate: */ - - outportb(0x3c4, 0x02); - outportb(0x3c5, 0x01 << (x & 3)); - - /* The offset of the pixel into the video segment is - offset = (width * y + x) / 4, and write the given - color to the plane we selected above. Heed the active - page start selection. */ - - vga[(unsigned)(widthBytes * y) + (x / 4) + actStart] = color; - - } - -char getPixel_X(int x, int y) - { - - /* Select the plane from which we must read the pixel color: */ - - outport(GRAC_ADDR, 0x04); - outport(GRAC_ADDR+1, x & 3); - - return vga[(unsigned)(widthBytes * y) + (x / 4) + actStart]; - - } - -----8<-------cut end------ - - -However, by now you should be aware of that the Write Plane Enable -register isn't limited to selecting just one bit plane, like the -Read Plane Select register is. You can enable any combination of all -four to be written. This ability to access 4 pixels with one -instruction helps quadrupling the speed in certain respects, especially when -drawing horizontal lines and filling polygons of a constant color. Also, most -block algorithms can be optimized in various ways so that they need only -a constant number of OUTs (typically four) to the Write Plane Enable -register. OUT is a relatively slow instruction. - -The gained ability to access the full 256 Kb of memory on a standard -VGA enables you to do paging and all the goodies following from that: -smooth scrolling over large maps, page flipping for flicker free -animation... and I'll leave something for your own imagination. - -In short, the stuff gained from unchaining mode 13h more than -upweighs the additional complexity of using a planar mode. - -Now, the resolution of the mode is of little interest in this -context. Nearly any 256-color resolution from (about) 80x8 to 400x300 -is available for most VGAs. I'll dwell particularly by 320x240, as this -is the mode that Michael Abrash introduced as 'Mode X' in his DDJ -articles. It is also the resolution that most people refer to when -using that phrase. - -The good thing about the 320x240 mode is that the aspect ratio is -1:1, which means that each pixel is 'perfectly' square, i.e. not -rectangular like in 320x200. An ellipse drawn with the same number of -pixels along both main axes will look like a perfect circle in 320x240, -but like a subtly tall ellipse in 320x200. - -Here's a function which sets the 320x240 mode. You'll notice that -it depends on the first piece of code above: - -----8<-------cut begin------ - -set320x240x256_X() - { - - /* Set the unchained version of mode 13h: */ - - set320x200x256_X(); - - /* Modify the vertical sync polarity bits in the Misc. Output - Register to achieve square aspect ratio: */ - - outportb(0x3C2, 0xE3); - - /* Modify the vertical timing registers to reflect the increased - vertical resolution, and to center the image as good as - possible: */ - - outport(0x3D4, 0x2C11); /* turn off write protect */ - outport(0x3D4, 0x0D06); /* vertical total */ - outport(0x3D4, 0x3E07); /* overflow register */ - outport(0x3D4, 0xEA10); /* vertical retrace start */ - outport(0x3D4, 0xAC11); /* vertical retrace end AND wr.prot */ - outport(0x3D4, 0xDF12); /* vertical display enable end */ - outport(0x3D4, 0xE715); /* start vertical blanking */ - outport(0x3D4, 0x0616); /* end vertical blanking */ - - /* Update mode info, so future operations are aware of the - resolution: */ - - height = 240; - - } - -----8<-------cut end------ - - -As you've figured out, this mode will be completely compatible with the -utility functions presented earlier, thanks to the global variable -'height'. Boy, am I foreseeing or what! - -Other resolutions are achieved through giving other values to the sync -timing registers of the VGA, but this is quite a large and complex -subject, so I'll postpone this to later, if ever. - -Anyway, I hope I've helped getting you started using mode X. As far as -I know, the two modes I've used above should work on *any* VGA and Super -VGA available, so this is pretty stable stuff. Let me know of any -trouble, and - - good luck! - - - -3. THE ROAD FROM HERE - -I'm providing information on various libraries and archives which relate -to what this article deals with. If you want me to add anything to this -list (for future articles), let me know, although I can't promise anything. -I am assuming you have ftp access. - - -wuarchive.wustl.edu:/pub/MSDOS_UPLOADS/programming/xlib06.zip - -This is the current de facto C/assembler library for programming -unchained modes (do not confuse with a X Windows library). All sources -are included, and the library is totally free. It has functions for -pixels, lines, circles, bezier curves, mouse handling, sprites (bitmaps), -compiled bitmaps, and supports a number of resolutions. The version number -('06') is current as of November 1993. - - -graphprg.zip - -Michael Abrash' articles in Doctor Dobbs Journal is always mentioned -with awe. In this 350 Kb archive, most of his interesting stuff has -been gathered. Read about Mode X development and techniques from month -to month. Included is also all the individual source code snippets from -each article, and also the full XSHARP library providing linedrawing, -polygons, bitmaps, solid 3D projection and speedy rendering, and even an -implementation of 2D texture mapping (can be used for quasi-3D texture -mapping), plus an article on assembly optimization on the i86 processor -family. Definitely recommended. - - -oak.oakland.edu:/pub/msdos/vga/vgadoc2.zip - -This is a bare bones VGA register reference. It also contains register -references for the CGA, EGA and Hercules cards, in addition to dozens of -SuperVGAs. Check out the BOOKS section for some decent VGA references -though - you don't want to start tweaking without a real one. - - -wuarchive.wustl.edu:/pub/MSDOS_UPLOADS/programming/tweak15b.zip - -TWEAK might be of interest to the more adventurous reader. TWEAK lets you -play around with the registers of the VGA in an interactive manner. -Various testing screens for viewing your newmade modes are applied at -the press of a key. Version 1.5 adds a test screen which autodetects your -graphics mode and displays various information about resolutions etc. -Keep a VGA reference handy. Don't try it if this is the first time you've -heard of 'registers' or 'mode X' or 'tweaking'. I was planning a version -based on the Turbo Vision interface, but time has been short. Maybe later! - - - - -4. BOOKS ON THE SUBJECT - -Extremely little has been published in written form about using -'Mode X'-style modes. Below are some books which cover VGA programming -at varying degrees of technical level, but the only one to mention -unchained modes and Mode X, is Michael Abrash'. I'd get one of the VGA -references first, though. - - o George Sutty & Steve Blair : "Advanced Pogrammer's Guide to the - EGA/VGA" from Brady. A bit old perhaps, but covers all *standard* - EGA/VGA registers, and discusses most BIOS functions and other - operations. Contains disk with C/Pascal/assembler source code. - There's a sequel out for SuperVGAs, which I haven't seen. - - o Michael Abrash : "Power Graphics Programming" from QUE/Programmer's - Journal. Collections of (old) articles from Programmer's Journal on - EGA/VGA, read modes and write modes, animation, tweaking (320x400 - and 360x480). His newer ravings in DDJ covers fast 256-color - bitmaps, compiled bitmaps, polygons, 3D graphics, texture mapping - among other stuff. - - o Richard F. Ferraro : "Programmer's Guide to the EGA and VGA video - cards including Super VGA". I don't have this one, but heard it's - nice. Detailed coverage of all EGA/VGA registers. The Super VGA - reference makes it attractive. - - o Richard Wilton : "Programmer's Guide to PC & PS/2 Video Systems" - Less technical, more application/algorithm oriented. Nice enough, - even though it is a bit outdated, in that he discusses CGA and - Hercules cards just as much as EGA/VGA. - - - - -5. BYE - FOR NOW - -I am considering writing a text describing in more detail the process of -using TWEAK to achieve the VGA resolution you want or need. However, I -thought I'd let this document go first, and see if I get any reactions. -If I don't, I'll stop. Feel free to forward any suggestions, -criticisms, bombs and beers. - -I can be reached via: - - o e-mail: robert@stud.unit.no - - o land mail: - - Robert Schmidt - Stud.post 170 - NTH - N-7034 Trondheim - NORWAY - -Nothing would encourage or please me more than a postcard from where you -live! diff --git a/16/dos_gfx.cpp b/16/dos_gfx.cpp index e14c5c49..195624d0 100644 --- a/16/dos_gfx.cpp +++ b/16/dos_gfx.cpp @@ -1,5 +1,5 @@ -//DOS Graphics thingy by sparky4 licence GPL v2 -//a special thanks to everyone to release source code for mode X +//DOS Graphics thingy by sparky4 licence GPL v2 +//a special thanks to everyone to release source code for mode X /*src\lib\*/ #include "dos_gfx.h" @@ -10,8 +10,8 @@ int gq = LGQ; int q = 0; int bakax = 0, bakay = 0; cord xx = rand()&0%320, yy = rand()&0%240, sx = 0, sy = 0; -byte coor; - +byte coor; + byte *vga = (byte *) MK_FP(0xA000, 0); /* @@ -182,18 +182,18 @@ int ding(int q){ } }else{ if(!bakax){ -// xx-=TILEWH; - xx--; + xx-=TILEWH; +// xx--; }else if(bakax>1){ -// xx+=TILEWH; - xx++; + xx+=TILEWH; +// xx++; } if(!bakay){ -// yy-=TILEWH; - yy--; + yy-=TILEWH; +// yy--; }else if(bakay>1){ -// yy+=TILEWH; - yy++; + yy+=TILEWH; +// yy++; } } } @@ -216,8 +216,8 @@ int ding(int q){ // plot the pixel }else{ -// mxFillBox(xx, yy, TILEWH, TILEWH, coor, 0); - mxPutPixel(xx, yy, coor); + mxFillBox(xx, yy, TILEWH, TILEWH, coor, 0); +// mxPutPixel(xx, yy, coor); } if(q==2) mxPutPixel(rand()%SW, rand()%(SH*3), 0); @@ -250,7 +250,7 @@ int main(void) d=1; // switch variable key=4; // default screensaver number xpos=0; - ypos=0; + ypos=0; xdir=1; ydir=1; setvideo(1); @@ -283,9 +283,9 @@ int main(void) { mxPutPixel(0, y, 15); mxPutPixel(SW-1, y, 15); - } + } - getch(); + getch(); for (int x = 320; x < VW; ++x) { mxPutPixel(x, 0, 15); @@ -295,7 +295,12 @@ int main(void) { mxPutPixel(0, y, 15); mxPutPixel(VW-1, y, 15); - } + } + mxSetTextColor(16, OP_TRANS); + mxOutText(64, SH-40, "CRAZY!!!!"); + mxOutText(64, SH-32, "CRAZY!!!!"); + mxOutText(64, SH-24, " _ CRAZY!!!!"); + mxOutText(64, SH-16, " _ _ CRAZY!!!!"); getch(); while(!kbhit()){ // hScroll(1); @@ -304,6 +309,10 @@ int main(void) // delay(100); //for(int i=0;i