From f1c9c170d9fc5f657ef887201410021017fd9a46 Mon Sep 17 00:00:00 2001 From: sparky4 Date: Tue, 9 Dec 2014 11:52:47 -0600 Subject: [PATCH] modified: scroll.exe modified: src/lib/lib_head.h new file: src/lib/xms.c new file: src/lib/xms.h modified: src/scroll.c --- SCROLL.SMP | Bin 1483 -> 0 bytes scroll.exe | Bin 49437 -> 52156 bytes src/lib/lib_head.h | 25 +++--- src/lib/xms.c | 185 +++++++++++++++++++++++++++++++++++++++++++++ src/lib/xms.h | 28 +++++++ src/scroll.c | 23 +++--- 6 files changed, 240 insertions(+), 21 deletions(-) delete mode 100644 SCROLL.SMP create mode 100644 src/lib/xms.c create mode 100644 src/lib/xms.h diff --git a/SCROLL.SMP b/SCROLL.SMP deleted file mode 100644 index 398f578638e34fff6799de4470f7cb8d1970ad1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1483 zcmZvc%}bPF6vZEHN|EV9lLTL(x5#$An2LQ+Lpnp4FxWy2WF)^P4F|-rg_|}lf);JU zO|I9g6`*O%_yuT|^m z-1LL#)Mz^1oAn-T=?v>3gt_>6xf#Kpd;{-@#&&aiUk?zgx5tmYyZ^r9>%UKTI1+~E zSH>t7uT~~17Y8aUv-PD~Evv3prMHK}t~tr<%WkeA4)}2>ge1Egmr1h4#BfA7F6F_93B7J1}d@&0=$M@cVtPx7plR`ddKXNlgJCE9a9G_92Zb z3i~u2vo1Di5eI)M0Y6)jfS;{iIL|VhYvS+tzu;dc3I2vZ$is>F&0!*2ZL7+O@Gy~T zMN{z4h=*32MdnW_oSFpANG3l)PRdp}^`aMapErcu?ZcCn48J9PRZ3ADe_l6MmV!Pa n-X-TvaWaR*ab6QA6aR!ZVHU|#eKtMBr#Uo*FI$a`XCwau$}8WX diff --git a/scroll.exe b/scroll.exe index 96f972a0b9c356657fe6231c503037de4792f1c4..e240c28d68fd74cc4a5b470f9ecb7ba4af131bd9 100644 GIT binary patch delta 20865 zcma)k34D`9`v1H~(lovA7TVI5UX%g_qyjB%xxx(L}gh(3=|Oo3qo!G-xbImg|&&>Pc z^N&dHKP_cWnR{CpOw>dsKaj4j_tZo~NPRjXaYXrxPa>o)nGm5LA?xrl^(W*+|Back z;()Y`g)=Ro#PLm^84pY^oHf(>(~8S#a!A)nHh-k@Q6E&T+Ha1wlhL0KSp8^cS94Qm zv)Ruch^jUAplYr9BULw<*J0glfwZacLx@dx+p6oZ={l^JAJiAkoindB-=07mHGO8! zc)%$poLF_2t%X+(TXeSw;k^#)Zm?22A&x~|tM;4x4(qNm;2I$pGX z>DbA$x2>(#qxaAR3x}aOX=&<|A5OLDI`^o_%}dr++lJRvwin+}4Lm+@|FBlGde||u z*rq{ym#(wzc#8$(W=~O{5nJKq<_nTdcV*yyZwP6GZI=|=E-~9KJ!?H={pwzQ4p@&0 zzXhGN9<)yF*yU||s-vq5PO?6FtIPV-?XH%lTg2?!ZBX07UA{KpU9lD?(F->~*sc(U z@6sxb2jNeb588%6=e@A04K~5Sk8M|Z0ynIW!A@Pf^|3ebbHl2;$||~RHWUi4@qysu z5KbHyQ@Y1NYr#O=vKHR9O}%9+y6tq57n~$re2h5G{|P5c7aztjxLjNBA(e@I8uE&6 z*{0rh{4>Qo#j|m{%BpMM!h9gGCF}bPQlxYgowXQ`+)&5oIK9ckR+Br4G2dvkOklw~sC+`EXRe zV}44@M{4MST1UQpo)gsp)wrYBev~-gOzswLCyr6QxR0+nevO5j?J{vZALE!Fx92Hh zKSI{MyS&SBW8;~~*$?`z(_OOaUgqD=@$VCeB&+VW-3l^Om*bD#Ymctqzpm*leoivv zfAD7)h~x2i$Kg;%TQ8f=;TRTYD|9d+7o*p`Ti)f^O7n$u;Ya$gknh_NF!1|<$66>C?zq#SIqE6d5(GecT#D5ltML^xs^bA2nY|+@K5XWvnCarxEoI!7hD|+mbT5@(t za+CV7dY2@Sb-J@~;*2oV?ZrIeBG@`f&P+Iyv1d%-IweL zry-X#P6=^=v`7<4&v@njZzCT4?<4WKYc$scfX@W+!B846Ca0@Hob3GrTm~rmV?5T| zq4wK7xB)O_8@;3XuLd+|od#5@od%Ssof2aG;k_t&&N~Njcvmd8=pOBG620p8Ux(u$ z)oUk-bA#z?+9V$-$l1}?kN%)d6t+;oCpqx@XxpO`yISz+YP;ZA5JT_xNwJKHge7r% zBgw$y){~Cq*Q{S*hxm@Kr3cLNuoEV+O>8@Janeoa>^&Xqpka;?J_GkV(jx3nkbFmA zOv^{2t*E1GiERG|>I8L}*VXnNs9%j{b<6?#Zq&}Q8lRFOm>VjK1{3-a@J|`u=FjGf z{Y%vMD!o?c+fSqRx>8${Z~q0g7nR!De0v9K8sM)|Z>%LmY{Q&vPZ8U&5w`ag zS+dYRRAj5KeH@5??+IRx(op9*x-iJS?&jOE?6>s5vajSQNFEwHv36Pukz^p%xWZBm z-Brh`s~88EfBUAf!*QsmRd=Z^QmJ8JEUg%uPp-1W0h@HuC1tt2#+Td1OKi2ZHFd5% zxqiQbT;qtYlPSSB&RF6Qml1}$a=<9fn(FWUz=s4X2d~JHs*30VE z7QL5a^zM&Sif2>c|BV^${y0o{DH`YL}Me+ltzco$KHA%J_(#XG3xXvF>M@ z5H?(Rls*_16Z)=%eRH!N-?tP;oc(YQT^|-RcV_q=BG^BY9FxQMoFn#wl4A-Gi6O(o z_XH99*ODVEe2<0LzmXh+!d>}ZmaelQ+}3#e*ah44vy8?s9G>se-EKR(M+{)SJE$tW z%8SXpw%NXOX}C_9RT#QWz}&cDE4;&W!VWzmb>=9nqoo zQ<5Vtbeje#+>JehiG9E1@Cs$FnI*TJm5!ZdKsybKoFDjXh|=|+O4l`XMWiL<3rIh| z`6#|GY(9?fGn>EO84~q}6mo($oa7Csc*74nd&RsX3_8S;o92CoRF+09N{1dhq#|v> zPAs<(ODM;3@!O@l)wbJyh^l*KhJ1k#M<%kOsgp<#huc4v9Ea$%UKu@hYpl9XWT?a( zXfHy{TQzLbbagpa(Pw)NpS9H2v9SxRtX_Nm!X}2pF93;jOH&6ihw^#Sgg$ZTBilQ> z9MQfYwRwRfR*Lp<>OgZK+Zjg$V&Ot^yV|SmXI9S%qG@png)ef3FZ#O_P#A6j!?(Sh z4BzmvP3_!Eq&))m&07v_5X&ac2D-8@Bn^(i>h2jJlHG^smbgB`A^KTdW-pD8%jRa` zVZ`fgsi<>}SH^kkL1zCY8Xuo39H0~9Q~kDRw`th8v(bEtTH+Hef_nW)`vT&q(5}{X z*o%o{0ScYXQ#&6~MzNUi0Lare8#^s`LH)G$gRtQ~H5}Ql>u5FwtSRbfK4;13I`o*% zo3urs%F2f{!Ww+>+G@1yi6d-Px#DfTJbN}xNJtxdTC&BSk?zWXw~)<1{m)2yya}6X zj@H1#>eCYPO!XOjUwj0ojoSheH(hv**6NeurOc{{2@9o~iQ6I=B zZR}}j>lq0vU<8uZTY2Q8qW0wGlntA@(6F13y?#m7lP;-)0;$w{P>{}B3zqPU%OtAn zJuK&tx8vi0&0l!;Reu6G?Ri*zHXlXpGiOb1&iU9|V+yx_1UFU5a1)LPjvan1f=V>> zgWiK8bQtIk#{yrlc2wQ5HMU#FsGD;RQ*~mBnCeRhBn}r&&_#*;l72| z8$2j)<=d};@j}TNL#1By{lu72dNzq#n$8e&xII|PcML!~7i{un;hx0Ki!3|4;h64& zAz!2GNZg;j-yG0v?8s$kwh!%@R3-e2u1=cD#dbKtys_lN-&`zmbS5@cbc#(>(>qCd zfqx2C-C3LN{7vJHo5ov?D|AxwSm?end9dZI)SC5CLrC9`Zl26iV|~=DJ({IHE185= z|GD;sX?wAbPY;-3DlV;zo7QNkH&)dyi6^9R)&sU{wm;VR|1N!X>8oGcziU1a_|*mJ zP|I;rgx}LG-;%6v&0Xu%72TK;L5ovEwGclwfODZQrwr)nkQztWGA~H0+D&~|wVShX zf+wb8>n+F2f%Ixh>dJso| z_$+^iv_xey$!&kLqS*F3+Qx@qgL(=V2Es*Cm-T4dCPJH2H%!KCKCpM5PfKe+^SP_Z z*4TC_d2Q@fN%}!S)*rK-1A0rceTBn3|1Y^Y=Y~YgBW(U6S-ZdQk*s6&J{S@EPw8}C zpD6DulI@gqGI{e=`f#7vzF>ba*_H#Y)|@~&d96BFHc2C|zm&Fr`&(rDv|SmW$0u*O zCMB;J-!I=H*SELi;P%8EY5%eR zRwA$U7v-%oe$?_-4Suxp;9u-N^xx`>vcHVOlVee^BRDvJ57ao-u`Y*@^#^g3vJ1lX zH)or&Y$xqU(${|S{`WpJ@~5x;a{a&dh&R*eYiThtchYx@WLMtj@w4;ogzO2xY8O0v z*W}OR^X-C~UPv1+{w0`Z^nE}a9!y*M_8)vn+S5hYn!6^bEBunw6@FQ=p1k;8=XC2q zcm3$aS2|}*FT^O!v}NkF^nBmp-fX_P4DL`gD4-n5m-s(npEkVX^5~BW9>*L%(=&Wgva3UoUY;FnzCIt{4?e zZ}rO-Nifaq-&afwrltMUy(el{eQyrlH(5)c=|4DdqShLVPj1^qc1{%n==c5W#7~3h zlmUr7z7MhMMRP(WXHu;{OEDR|ee@ z`}@<)gL?+VYMnhVqvtbzJ3k#fTu58%-*UUloWzWY!+OS*YIO|o!$5qy>bUvxs*fLb zu*Lp$4IMBfTv$SNL+%$t{i$WhG~rMB<&ZE7zX!uA!0(bQa?8UqF-;!W)jrNkHcvu& zJMiN*a>jY^^Ru4PImQwu>KE&QRb8f#=7nB=G*9!ASAA^uVp)+d;E&BJ>u-Ihc3O|P z9E9B}%BSshM!ZiTpcmV=vFkV71$<>&LRXDS6TjBd9r)SkLw_6<->=38(js7uz6c2~ z8@aO8K<)5FJRg=qPX-#*4mHu*J|dEMseaPwp@VfSyt zk@jA--gb=fvmWFF$qB4i(JDJywX`TJnw}k!D-Tk&5}KHK;_dtUi^6$2VA#AkEJ^#V zOT@N)Gd7=>pi?L=y!62~FX5z0Bw6Y!bo;O&;&2uH_po^HY}`?ryjyavP@myF1FuL~ zu~(!9X>Vs295XnSW)6=9)0x9ZiI4nBpB^8&q;)l+zZsq)wABlS=3_<0ML@i65qiUFdbVM@Y)~+36XX@wJ6Glr%RESH$=ocdr zhc~Hi9*;jd@c6c7Gt0Nu6}97v<|)QtlZ!zqzcnmJ)$wI$Vz%`lEBzKq({sj(SHfsR zPI_Q=C^|@3d@pu(uE@cheKTi{5JJ6kds-%HZPBZ~H}%Z2h$h*3y6v~-DQd}Ntl zk-fwVK{R3Huf1LjW|QJ+Y@cmUDEG?Bd@Ag;{>yP7kY7);O3m6DyknHX~9xDt2sGKzV%_G-0Ytv%eFCUI9LOlpgkr9 zlz;CWkddtP`Z?=in31{}_L)Vi%DP-WJXR*engic2mk*8A68y9r@;^LQjoZwfY(vYD z)}C^he{1^`>(*iCPJis&4#|4ztF!xtM9O_m;g$<)m+&pduCMKWocY#_^Mbb9^2{=_ zW-a1+#^sUL>uvuUcBlTj&=vwpGJT3iUYKz}cujb{Ev(308z3ljzR!w_QxIjOd)-UaliiNjyG4jvDV*-&A zhx~~RYIC;A8lJ71+bXHANHEiSFiU-lZWtY*W81vX+M|8dS0$l!^Hpj6{#_G4kMFr3 zPW9P*MY4upkys2mdS17-V)Z%fh4a=GGBb91{-7?~r^n7o->qofm+wp?}WjL>THLOip%S1)pq?wK*%=N}hW+#y24u;!d=v};BW^&-_Xj!743uY$sP z<*GcDDaPhsuEO4N#G%7c5sUXwyNWnYI+Sp=h3CMMLak%RaqD502$_Dg`RAxU%u^lv z_bhf>aO~ps{|Wi{`b+w@k8C-h{VrpFUl7ov1>t?bH#SGr_R{8Z)rdTmS!i`spV(Z8 zwTB7bnxjG-7Ft_3gF0Ylcz-Mz3D)n9{d?7MQ!k9NjO46bC4ABRMV>X(dXlZl1NXNb z-^=zrw9pwdCkpH73p1AnRk4^F`Y)C`T3gq=i1A7(d>U>03J>6W#VoThpWd9+D|{Lr zTJZY}#tYj+`j^;2htu@gQ8Dn}S>dbpaYCMn<*m)rggi(29awt}zNICzhlz8w^!eEl zUURiuXKS~vqq;*u&uTuD`JX(eln zs~i=Vs{EL0O~qAxv^x*XJ0a|R=E1ds@1_Bp1~`@QrJMDsG_P3RS)>mX#I7z{v*5nG zJQeX41Ru4mQmI6#%ik+etr5EL6m70)E;`2LrLpht$KhK#p2f;fa(v5pltZV_p=TG= zi@!{ug~bUf>m)*^(1(kAt4~ZNWU3#18DQdkLjFoWFYc|{T}(&={T-!r10gaUs1KnT zC4s68)B<^JHfnjO)w7!a;vhmqNWr(-6hzmT9JhEk)>f1eFA^x70h|^CmkR1k0bUzl zTvJwMAYw+s2DES}zqX>rWT+?Npacgn;?qqxrMQk<0Td}S7GDX1q!qA)6<5KjXaheY zN!wK!o{a!QM%UJu>T9decu@5s`mYu~qot+U!l(4_r7@P(!U*UqtVTnyq$Pxn@zUxB zR0S{+H~KCjNAdf3{BhKU{`CfvxxR)7m8^piStnUe4inbK!T={Vleq!Cn#Qu`EHvB5 zE5tY)h38OUf2)O1oYDnmU5JDyT?Epqxe){cxJ>O)GE-zSj|dG2Ht?%bS5mQtij2iw zia2q`%@_i{=g1V1Yg0K2-Ig=I{x9X0dY~5fAZ%Rb0nc!c!$uS1&3V)?!?@iVNXioy z2*enSQil)>`(W7Lm|)Z8k#$|=ACo=ZKAcn&zhBh`b&Dh^+;R^OUu1Ba-k9tF0ZN15@iEps_f^Nd(vBUv}fkHX-#*mxp4aJsfIHpmkYyf2Z z1z*Y1V{V(Bi_KKN)_`sqQ_tlP=c+S`Ej4JnD+CJIS_80&4Ylzy*yc*(AR0cy)v)3- zJ`1WX#TAHh*Bp3U+8e+|&bS9uTco!Ge1wvROa{W77bwK2m>o-M>&pnUDb0eqpve@< zicQ6Aa;Ku6DJ-cdGnF%6_UF}dL&d^!`1U?$y{@>*0M9UYGI|R*mQ9YtTK`a|zge>ks0*}CF|2B>-(T)0jRrHK6+B5i!z(pOF6 z4I#6cK#!)uFk~Xb0tIGH+Sg1UZMQyV)H4NBMU`Q^(^W3lF>IFNP3Aqi*3c*YFPstM zk(TcDf4QG^!pbx#;jEhe+mM#$04di7E`}zHSg$}q`DR+B?PP4=AKspkFdo%RZY5(f z)r;mVjJA|5Ehw)yG+gp?iG`W%L;szGDn(x2i~Nlh-h^CLeePvUK%rfA zM@5WzC{0!$P#cG!FkStoniz9Y+5reXi%|ScJ=fzkuoLt5iS6lQ660lMyu zJ?ULw=n;&scI|v0qZbMt+KE2I7=+SfpZPv$jYhG^=bx;&1jU;^U;7y|Q25hF^d-ir zD9!Nw*w;83g*m?O0-A!79S}NHp?J$z?`JGVq0@J=A2C*Y?EHEcOE z&O)c2!Rvy#zF5RIE@N@cYgolLE@w4kA&Bxo#KoL+iWyoNTk_Xn?+~X6|5?np=(H_Z z2>Fjl22C)q)zq%Un0HI@+QO`yfoQ ziH$n=o>enWZ21FQHo8Zgt21Lfl?Mrvxm2iD8ktCq^hAQlBS8h$v%=m9ngIG2NlgHE-FPUDu#BH_ugRlkR9{%P=)3BNp3m3H&4891P8}4>; zwA7&g(En#fQO zCm2V9-QsXDg8p0+W648hXZYoCV=fB2!~g9R*??KtEfU#7b+O5iuWSTvshWs4BNeF) z^`-EZdz{N~;6oil!se-u(7@B8YFKkbz!t;C=5dHamPcD^jTW}a8|xu4D&mz$?x3=Y zdY14nXH*lBZzSZN)7in+-+ z5lQCF$hV?saD&O;5Y-R`V*ouKwJnN1*^m;nJL;4|xB}>>QOBa_XAO@gor)USgLP+q za38(I4dhD@8Al*{ZHpS#gDx=*mq+&aq6dA)lpz=NIMjn)G-bzs(c}4^$_TN{3>sop zu4c(}A>#UMk0*Olow-GRzUQ%?^mFqN`OTi6^rY&>^n_zQy`!D|s)}noP4k9_e(Fi0 zX+dMU>>V8xLsvGI$UUOHW9X&Ey>e^x;b{7gC4J2ZD8Y!f zR{_-nqV1NxS6-ZnCI)lIu=hsfR7}cNTBnZQ{|r% z(t6X?&CxM`B*gdTgi1Qs#5pvARMR`MH$BkYPfqLoR&RQ(Ia40dds}aszT&&cNxf(E zCdMO}8r8j5pmZFiCwl+AH;s9upZr#D-$Xj~kwJ26Z#j{!d?Zo+zW1-a>1&Uq1^Fgs zCNiaso3L%hCiY9DKR?nZC^K<^f}Q|6K5*m`zyCuONwR7S7|xeFUmBJcKr#Hx*a)@ngibRb`bWfKJn)s}h6! zl3q;`nPqR_)*&frQxdISl_$TNv?iJESQU}9FKI<`w+(B-*oa3R8q>nlTRg& zPT6^Gb*>=)lAM)7_uAs=xHZ{wQVJ@Mt?4U|PPvmp-$kJ?<$4PJX-!J}<0+q|82^Fk z`%213DNy7?6u&^D@dFgTOKD4?{cL^ZJ1Loc=zQD#vVUs-KJ;nZ;vvbY!&8azWlZ^! z)TJnWfzrdN|4udTMqxwhCP1wyy^y*MrO#11oO(Q!j#&GGoY^Ngjs9zGp**h7urxYs zoz7zD^H3io(FoQb`ux!c?!a=3k4V@`CW{TGN+OL-!{))ZNxgnX!6YKhzpFm2aO`y5 zTNps%JZS37riT8dM0&|Z!~i|63Os0x zI3d-TjEw9P7nu_Sj3eYh_(%AzHtrq+p(M30``BA(%tAXFeo zc*29OM!DuQy3iF_W8<+pr#y}qU&La469u#m_XJm4vC-*_}kuf8??E45-^=TaBAlLH->0{r1`l&pRWUACh{XOaf-+8}4W{CH6U2|}N7FV$ht~IZ zwdf5?F)}!C^rv$-#LWG=yJ6hef-$&k`~e722Agr#>+;9y>rFWG|9DSBZDSR0AQ(V* zyp*z?6PxYn{`A;}FcCkF4RIDFmM~;XGlpg|Pn~v&1vWHuDfB5B;M9;K@Nt3%*IKiw zZVBtx?4sfbsN(LSVnk~^i9i#3zXwr8O&z0o(nW(hNM7)uU=Cs=n+DJiACI)KTWe?V zbALd;L4#dheBRaQ^y*$$-AN!{at$2@ySpcmFMHt3!^$mNJ@1BtcDFi1#2R+r$Q1h2 z&74DUnj2vx2rV6gR0)(d8>5|GH`dk}YFPKR8E!)uq-Xbhm{?NXKuA*tysVbD5Gj3- zi`LlSgciFX&Jg_`0>Jx~R@F8b^hR9806pd=qe)K$xO7-(FqJYL;s(3;GWse#?h=iL zdUUg+!Knlq00aBRMQmi)Rtg$~g!Q5nf4ep(5YcdBC`GtEiO#8cH*0qg)?Ft#Ab05E#iqD%# z!<~V}sMu6TFXsgFl|^jr%4YxD6VHTN2%i1%NY(3k1E|?a)RnP7!HSY<7OhWr6IL|n zflnAU1(C|19kTU~=P0!`Y}D&bW^4m^L&ohe{Zvj*sMANt#E8nrcIJjlsa@^ef$TE*J&@bQ=U>X3bkpLi)~AK@*paaC4tx zsMfIuQe>G&pM~|cOKJ?o^{nH!cyG?Rv?4w$XVy(MESbWx3;1GmE)9G-G}@5sCK*|_ z$lPEWS&h7jr3u?}Y2MS3Jv@`I(rP?Kaqi{29T2$N<%$h7kXF5Xl^i68QC@{ z-{&#L3W{R_ly$`q7VZY*W74LPH2v8qw`nHs%jaEku$RN0yF{RuYoUJAMdrjn3B)a; zw6@yBc3(C+hh3z4wq5Aa#AYgDF_Y_=%BP(ZWzSu^xq#eIUtd$pxO_2^4%`xgrwu>c z&2H?NX)NR&_n^~9P8~NE_ziS>E?ksG(FxDRI!!gz;&ogDx7K%*)7ef8W+0N?X0XJ7 z3GV?iXMnkqg?*!)J)OzJX;PvOLGg6S&lF zN(F>DGrO@mGu~1#veYisqdR{ft@MAWo7RcW2Qix}u0SwWnH$Q{#!S?Xb?fDVAur2? zc4MTs2Zx2G(sG_afN7MYqw6O9nR$Kk`{=)X2ai7Up@+nb^->|u$r|8N2#=eq$trkMiXwQabqSmlz)5r~WP5N9$d zqwdV;1DD896>GfmTdl<6{CyW_84RdU$%B7%QKWmIWpXEe& zG){1ib2GwnVq&{JW5ixQafT;bl33Qrj;5YzSVgVt{4g}#+jC4*by|(1LZuF zY*YcajHdxF#wI9kckOoDU6gt~gV6WmiFDeF5tbm9n=!_Q#^Neh8n1VOY)!?}_9~?K zL~8OxYfa@yw%u*#+-=pS`^pXM6qY^3$yryi)KJFXX3*v36(#^|X^qlL^cnC2Sl zYx9fC08enjgy+k8JW@6=85K1wEqvb9XapA*O4vPvYnl~TmsC~ag#!3j#*3oPfYG~P zTb1`86)Qxi0 z^?D9?$d7ibh*xWHOrJeL zNvM>$f*38k7gFfvfDZqLd%Vj>j1U+Z>mjC$y=sJqyESf0#?(%jS}+~P?EvJA#|jgX zzAB)?=76y*pS&Amm4zDROO-9dl zX`*1oEON)+17-l5HXFNQl=ve1iLjtIRvd)LA}9bqAfH`YRcyLDH8Znk?U+@NBR6>{ z>ca01N4yPDY;wBoAD#;6c?(q7>qhC>En(voQyNU&ZvDbdpl3-N_5o%8m!{8gS*dR* z$84(XZmOI^bGL>qDn!63b|~(3`TZrgeM-JQ49WCeS$D%jH9YHn-zCDx5G-V#ThEeG zQ*E`fe9oaCZgnSlrrKgQ2tT;`ngPJjc)W|p!=r-N?@5rWv9!1d^!f?+O}VQ+6ZN}f zW1%qD@f4)M)vLk6F(_H=5$!d#2IE3wH4h8^mLR{!sHxRAnCsZfQTnRd;xYqPDY@BW zFvse~VMWC}F%tQad+>(R;u_=KSwnS6MMGK1#8NgpWW25G4(bUFV@8dhfhSBJ8ZqK3 z=XrglOL=`oLv;z(C%#@jIhRKNPfyES4@OhKW zF7~*lQwE`Eo^ueKz+G#etJ@Av#4bMZ^q-HNJm1w#89UFE3DJ#NgM+EWUY~R>04@-t z;dxT2!E|8nEwcE?a8tWb1c@80H)L~4Fks1}Ygy*O&vHR9c)`s;Kf1iKpkR)B$vHZo zE`B-EnXa;}**OD$boT(@JgXDw;@v3nYj*#6*LkeCs;<1agfA}gdZ~MSM>_HUHNsfT z`m3Ph&H2>tl}JnAgRp@`UMYsSUSC#H+MqWn`;pWaZBDNtG}tOgV1?Clli5LRX{o>UiG>SmPUoz|-9{3SZ}!U&$rE6`*EE^VPs1Hf5jkKWlcd3ttRq-YM>*|F`K zAZn86)$RSn=Tc~|R|i{^WSbc-ilBt~2}Dq5i}=5As710}C8(oWBmNXhGoHhVA|9uc zBHtoWP?wT-L77Spfs(*E-ISUnMv2E|Z)sPUfMTOoelxJs5q_8bOR zlN?Fs2z%%P6F8F35%zoq**8a)afCfdA><8??Boc0K*DGizaC=wo+Iq32maw5K5XU6 zRx{b%e`8P-$zmuhGsW=dg%5jrK}eMo5!7+4ia&{K&q~Vwafy|bKjw0gY(iou<4FU< zws5UZaD+W8AVkZN4vw$~11=;Ej*&(77yys_nC9W5IHJ6y&fwwrWUFc2>!IQ2c@w*B zC*%M=FC(Dmsp*-wLJNoEl3Eto-8vypI(27dyy=6FNRIG!cJB>eIERy!U4haQ4w6N7 zhfT;Xe73n+Yu587%@7**Mx^FlUfG#R^H5MkSk9iigs_ zqw+MbygQ8UeP46BbUmZO}l?g2$H*I2mV8}o?F<)!UR zIr_k^Fu!(A%`W!{S;AcG6^&?<#YyzHH>12p@$zpdhomTBY2gUFkyA3LM<787%U~d` zu)NBt*i{;410T3}NRUN#Nk)h_L;6kQ2)hjGF z<^!+baU=ovfU?N$G6>nok*OSE_Z4`3fg_J|B#$Fu9C?o;?D7HgjU(qc!Y&z@i{f{L z`XW$d@mmfIpeb73uSVTrtQ zi^G1EKSi0I2q0PH**ghD!(={?2`C+97O~|fx0%!6AId^G(b?OR$7{Tu<=cdW;S-6E zvUuTtV1y-W^Sfc1M1+wnK0B9w_->?TKCkSUM^B@&kyjGu(@s=A;FXN|H1@qn&7ZvT z!hD*8%4kH7EdDs37QGkg_ZY9#a9xwx2!+4Hk(=|G4l*?V+C3hA{cuQ^MV7X)$c9t= z$~nR^G5jwA*$UM25JyEH zUIUUOZEmw9Wl2(PT%05iPL-tGa(srZ4DFXVQWGO-XC#i0d`cy$x8yxolC$!wvn6S? zB-a*1rA7@~@qiRCZ?YjQU6T4%#Kpz;NtC1z$*;1&t4tQ8r!52MM*Ci27oD;@C3LpA zK$8C=$qVCVOH$?R<#~DKE9uJJT}XR&uG;g0fTV^dy}uR-3*Gtti*(Be@$~I|_}`Fy z5K4#aOQp*`i0N@eP!UNZYFCcbP6)v|5F!X6gM1{7PXK*vU+&J{AGV9~K?5QG4*~8D Ah5!Hn delta 18541 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 JdF;J}{6GAS*jNAn diff --git a/src/lib/lib_head.h b/src/lib/lib_head.h index 86b55b89..19b59f18 100644 --- a/src/lib/lib_head.h +++ b/src/lib/lib_head.h @@ -8,6 +8,7 @@ /* Control codes for all keys on the keyboard */ //here temperarly +/* #define KEY_A (0x1E) #define KEY_B (0x30) #define KEY_C (0x2E) @@ -44,17 +45,17 @@ #define KEY_8 (0x09) #define KEY_9 (0x0A) #define KEY_0 (0x0B) -#define KEY_DASH (0x0C) /* -_ */ -#define KEY_EQUAL (0x0D) /* =+ */ -#define KEY_LBRACKET (0x1A) /* [{ */ -#define KEY_RBRACKET (0x1B) /* ]} */ -#define KEY_SEMICOLON (0x27) /* ;: */ -#define KEY_RQUOTE (0x28) /* '" */ -#define KEY_LQUOTE (0x29) /* `~ */ -#define KEY_PERIOD (0x33) /* .> */ -#define KEY_COMMA (0x34) /* ,< */ -#define KEY_SLASH (0x35) /* /? */ -#define KEY_BACKSLASH (0x2B) /* \| */ +#define KEY_DASH (0x0C) // -_ +#define KEY_EQUAL (0x0D) // =+ +#define KEY_LBRACKET (0x1A) // [{ +#define KEY_RBRACKET (0x1B) // ]} +#define KEY_SEMICOLON (0x27) // ;: +#define KEY_RQUOTE (0x28) // '" +#define KEY_LQUOTE (0x29) // `~ +#define KEY_PERIOD (0x33) // .> +#define KEY_COMMA (0x34) // ,< +#define KEY_SLASH (0x35) // /? +#define KEY_BACKSLASH (0x2B) // \| #define KEY_F1 (0x3B) #define KEY_F2 (0x3C) #define KEY_F3 (0x3D) @@ -95,7 +96,7 @@ #define KEY_LWIN (0x73) #define KEY_RWIN (0x74) #define KEY_MENU (0x75) - +*/ //typedef unsigned char byte; //typedef unsigned int word; diff --git a/src/lib/xms.c b/src/lib/xms.c new file mode 100644 index 00000000..fb428a54 --- /dev/null +++ b/src/lib/xms.c @@ -0,0 +1,185 @@ +/* This file implements rudimentary XMS memory handling. + * Documentation on the XMS API was found on http://www.qzx.com/pc-gpe/xms30.txt + */ + +#include "src\lib\xms.h" + +/* Set up the XMS driver, returns 0 on success and non-zero on failure */ +static int initxms(void) +{ + char XMSStatus = 0; + + if ( XMSControl == 0 ) + { + __asm { + ; Is an XMS driver installed? + mov ax,4300h + int 2Fh + mov [XMSStatus], al + } + + if ( XMSStatus == 0x80 ) + { + __asm { + ; Get the address of the driver control function + mov ax,4310h + int 2Fh + mov word ptr [XMSControl] ,bx + mov word ptr [XMSControl+2],es + } + } + } + + return ( XMSControl == 0 ); +} + +/* Allocate a slab of memory from XMS */ +void huge * xmsmalloc(long unsigned int size) +{ + unsigned int kB; + unsigned int XMSStatus = 0; + unsigned int XMSHandle = 0; + void huge * XMSPointer = NULL; + int n; + + /* If we can not initialize XMS, the allocation fails */ + if ( initxms() ) + return NULL; + + /* It is not possible to allocate more kilobytes than a 16-bit register can hold :-) */ + if ( size / 1024 > UINT_MAX ) + return NULL; + + /* Get the next free entry in the handle <-> pointer mapping */ + for ( n = 0; n < MAX_XMS_ALLOCATIONS; n++ ) + { + if ( allocMapXMS[n].XMSPointer == NULL ) + break; + } + + if ( n == MAX_XMS_ALLOCATIONS ) + return NULL; + + kB = size / 1024 + (size % 1024 > 0); + + __asm { + ; Allocate [kB] kilobytes of XMS memory + mov ah, 09h + mov dx, [kB] + call [XMSControl] + mov [XMSStatus], ax + mov [XMSHandle], dx + } + + /* Check if XMS allocation failed */ + if ( XMSStatus == 0) + return NULL; + + __asm { + ; Convert XMS handle to normal pointer + mov ah, 0Ch + mov dx, [XMSHandle] + call [XMSControl] + mov [XMSStatus], ax + + mov word ptr [XMSPointer], bx + mov word ptr [XMSPointer+2],dx + } + + if ( XMSStatus == 0 ) + { + /* Lock failed, deallocate the handle */ + __asm { + ; Free XMS handle + mov ah, 0Ah + mov dx, [XMSHandle] + call [XMSControl] + + ; Return value is not really interesting + ; mov [XMSStatus], ax + } + return NULL; + } + + /* Create an entry in the handle <-> pointer mapping */ + allocMapXMS[n].XMSHandle = XMSHandle; + allocMapXMS[n].XMSPointer = XMSPointer; + + return XMSPointer; +} + +/* Free a pointer allocated with xmsalloc */ +void xmsfree(void huge * XMSPointer) +{ + int n; + + if ( XMSPointer == NULL ) + return; + + if ( initxms() ) + return; + + for ( n = 0; n < MAX_XMS_ALLOCATIONS; n++ ) + { + if ( allocMapXMS[n].XMSPointer == XMSPointer ) + { + int XMSHandle = allocMapXMS[n].XMSHandle; + + __asm { + ; Unlock handle so we can free the memory block + mov ah, 0Dh + mov dx, [XMSHandle] + call [XMSControl] + + ; Free XMS memory + mov ah, 0Ah + mov dx, [XMSHandle] + call [XMSControl] + + ; Return value ignored + } + + /* Clear handle <-> pointer map entry so it can be reused */ + allocMapXMS[n].XMSHandle = 0; + allocMapXMS[n].XMSPointer = NULL; + + return; + } + } +} + +/* Write a memory report for debugging purposes */ +void xmsreport(FILE * stream) +{ + int XMSVersionNumber = 0; + unsigned int XMSLargestBlock = 0; + unsigned int XMSTotal = 0; + + if ( initxms() ) + { + puts("Could not initialize XMS Driver!"); + return; + } + + __asm { + ; Get the driver version number + mov ah,00h + call [XMSControl] ; Get XMS Version Number + mov [XMSVersionNumber], ax + + ; Get the amount of free XMS memory + mov ah, 08h + call [XMSControl] + mov [XMSLargestBlock], ax + mov [XMSTotal], dx + } + + fprintf(stream, "XMS Version number: %d\n", XMSVersionNumber); + fprintf(stream, "Largest available block: %d kB (%d kB total)\n", XMSLargestBlock, XMSTotal); +} + +/*int main() +{ + xmsreport(fopen("xms.log", "w")); + return 0; +}*/ diff --git a/src/lib/xms.h b/src/lib/xms.h new file mode 100644 index 00000000..100db362 --- /dev/null +++ b/src/lib/xms.h @@ -0,0 +1,28 @@ +#ifndef _XMS_H_ +#define _XMS_H_ +#include /* Definition of NULL */ +#include /* Definition of UINT_MAX */ +#include /* fprintf and (FILE *) */ + +/* Allow external configuration of maximum concurrent XMS allocations */ +#ifndef MAX_XMS_ALLOCATIONS +#define MAX_XMS_ALLOCATIONS 4 +#endif + +/* Address of the XMS driver */ +static long XMSControl; + +/* Mapping of XMS handle <-> normal pointer */ +typedef struct { + unsigned int XMSHandle; + void huge * XMSPointer; +} XMSHandleMap; + +static XMSHandleMap allocMapXMS[MAX_XMS_ALLOCATIONS]; + +static int initxms(void); +void huge * xmsmalloc(long unsigned int size); +void xmsfree(void huge * XMSPointer); +void xmsreport(FILE * stream); + +#endif/*_XMS_H_*/ diff --git a/src/scroll.c b/src/scroll.c index cdf1011e..c214348e 100644 --- a/src/scroll.c +++ b/src/scroll.c @@ -2,7 +2,8 @@ #include #include #include "src\lib\dos_kb.h" -#include "src\lib\wtest\wtest.c" +#include "src\lib\wtest\wtest.c" +#include "src\lib\xms.c" //word far *clock= (word far*) 0x046C; /* 18.2hz clock */ @@ -441,7 +442,7 @@ void main() { } //modexClearRegion(mask->page, 66, 66, 2, 40, 0); - if(((player.triggerx == TRIGGX && player.triggery == TRIGGY) && keyp(KEY_ENTER))||(player.tx == 5 && player.ty == 5)) + if(((player.triggerx == TRIGGX && player.triggery == TRIGGY) && keyp(0x1C))||(player.tx == 5 && player.ty == 5)) { short i; for(i=800; i>=400; i--) @@ -451,7 +452,7 @@ void main() { nosound(); } if(player.q == (TILEWH/SPEED)+1 && player.d > 0 && (player.triggerx == 5 && player.triggery == 5)){ player.hp--; } - if(keyp(0x0E)) while(1){ if(malloc(24)) break; } + if(keyp(0x0E)) while(1){ if(xmsmalloc(24)) break; } } /* fade back to text mode */ @@ -494,7 +495,8 @@ allocMap(int w, int h) { result.width =w; result.height=h; - result.data = malloc(sizeof(byte) * w * h); + if(initxms()) result.data = malloc(sizeof(byte) * w * h); + else result.data = xmsmalloc(sizeof(byte) * w * h); return result; } @@ -505,14 +507,17 @@ initMap(map_t *map) { /* just a place holder to fill out an alternating pattern */ int x, y; int i; - int tile = 1; - map->tiles = malloc(sizeof(tiles_t)); + int tile = 1; + if(initxms()) map->tiles = malloc(sizeof(tiles_t)); + else map->tiles = xmsmalloc(sizeof(tiles_t)); /* create the tile set */ - map->tiles->data = malloc(sizeof(bitmap_t)); + if(initxms()) map->tiles = malloc(sizeof(tiles_t)); + else map->tiles->data = xmsmalloc(sizeof(bitmap_t)); map->tiles->data->width = (TILEWH*2); - map->tiles->data->height= TILEWH; - map->tiles->data->data = malloc((TILEWH*2)*TILEWH); + map->tiles->data->height= TILEWH; + if(initxms()) map->tiles->data->data = malloc((TILEWH*2)*TILEWH); + else map->tiles->data->data = xmsmalloc((TILEWH*2)*TILEWH); map->tiles->tileHeight = TILEWH; map->tiles->tileWidth =TILEWH; map->tiles->rows = 1; -- 2.39.5