From 8312ba839e1da822f447ba4df56d0a1c8c989ee2 Mon Sep 17 00:00:00 2001 From: WindowsNT351 <96978173+WindowsNT351@users.noreply.github.com> Date: Tue, 9 Jul 2024 16:58:42 +0800 Subject: [PATCH] 201B02 --- DOS/LOADCEPC/LOADCEPC.EXE | Bin 0 -> 101368 bytes DOS/LOADCEPC/LOADCEPC.bsc | Bin 0 -> 43631 bytes DOS/LOADCEPC/MAIN.SBR | 0 DOS/LOADCEPC/PPFS.SBR | 0 DOS/LOADCEPC/TRANSFER.OBJ | Bin 0 -> 358 bytes DOS/LOADCEPC/VIDEO.SBR | 0 DOS/LOADCEPC/XMSAPI.SBR | 0 DOS/LOADCEPC/bld.bat | 4 + DOS/LOADCEPC/bootarg.h | 123 + DOS/LOADCEPC/debug.c | 166 + DOS/LOADCEPC/debug.cod | 394 ++ DOS/LOADCEPC/debug.obj | Bin 0 -> 2235 bytes DOS/LOADCEPC/debug.sbr | Bin 0 -> 2283 bytes DOS/LOADCEPC/ethernet.h | 57 + DOS/LOADCEPC/ethmain.c | 277 + DOS/LOADCEPC/ethmain.cod | 894 ++++ DOS/LOADCEPC/ethmain.obj | Bin 0 -> 4173 bytes DOS/LOADCEPC/ethmain.sbr | Bin 0 -> 4254 bytes DOS/LOADCEPC/halether.h | 56 + DOS/LOADCEPC/kernel.h | 30 + DOS/LOADCEPC/loadcepc.h | 33 + DOS/LOADCEPC/loadcepc.mak | 151 + DOS/LOADCEPC/loadnkpc.h | 23 + DOS/LOADCEPC/main.c | 1537 ++++++ DOS/LOADCEPC/main.cod | 4574 +++++++++++++++++ DOS/LOADCEPC/main.obj | Bin 0 -> 19864 bytes DOS/LOADCEPC/mdppfs.c | 500 ++ DOS/LOADCEPC/mdppfs.cod | 1138 ++++ DOS/LOADCEPC/mdppfs.obj | Bin 0 -> 2286 bytes DOS/LOADCEPC/mdppfs.sbr | Bin 0 -> 2720 bytes DOS/LOADCEPC/pc.h | 12 + DOS/LOADCEPC/ppfs.c | 471 ++ DOS/LOADCEPC/ppfs.cod | 2143 ++++++++ DOS/LOADCEPC/ppfs.h | 26 + DOS/LOADCEPC/ppfs.obj | Bin 0 -> 9234 bytes DOS/LOADCEPC/ppfstool.c | 556 ++ DOS/LOADCEPC/ppfstool.cod | 2118 ++++++++ DOS/LOADCEPC/ppfstool.obj | Bin 0 -> 8945 bytes DOS/LOADCEPC/ppfstool.sbr | Bin 0 -> 8660 bytes DOS/LOADCEPC/readme.txt | 48 + DOS/LOADCEPC/setupen2.bat | 59 + DOS/LOADCEPC/setupenv.bat | 19 + DOS/LOADCEPC/smchw.h | 193 + DOS/LOADCEPC/transfer.asm | 217 + DOS/LOADCEPC/video.c | 565 ++ DOS/LOADCEPC/video.cod | 1524 ++++++ DOS/LOADCEPC/video.h | 73 + DOS/LOADCEPC/video.obj | Bin 0 -> 7831 bytes DOS/LOADCEPC/wdm.h | 19 + DOS/LOADCEPC/windows.h | 42 + DOS/LOADCEPC/xmsapi.c | 419 ++ DOS/LOADCEPC/xmsapi.cod | 1083 ++++ DOS/LOADCEPC/xmsapi.h | 74 + DOS/LOADCEPC/xmsapi.obj | Bin 0 -> 5594 bytes WNT/menu2.exe/Release/DigHelp.obj | Bin 63021 -> 63021 bytes WNT/menu2.exe/Release/about.obj | Bin 61921 -> 64002 bytes WNT/menu2.exe/Release/menu2.log | 2 +- WNT/menu2.exe/Release/menu2.obj | Bin 55586 -> 55586 bytes WNT/menu2.exe/Release/menu2.res | Bin 2851744 -> 2851860 bytes .../Release/menu2.tlog/CL.read.1.tlog | Bin 102282 -> 102942 bytes .../Release/menu2.tlog/CL.write.1.tlog | Bin 3330 -> 5094 bytes .../Release/menu2.tlog/link.read.1.tlog | Bin 8870 -> 8634 bytes .../Release/menu2.tlog/menu2.write.1u.tlog | Bin 2798 -> 19108 bytes WNT/menu2.exe/Release/menu2Dlg.obj | Bin 77234 -> 77688 bytes WNT/menu2.exe/Release/vc141.pdb | Bin 6295552 -> 6320128 bytes WNT/menu2.exe/about.cpp | 12 +- WNT/menu2.exe/about.h | 1 + WNT/menu2.exe/menu2.aps | Bin 1511780 -> 1529548 bytes WNT/menu2.exe/menu2.rc | Bin 14158 -> 14616 bytes WNT/menu2.exe/menu2.vcxproj | 1 + WNT/menu2.exe/menu2.vcxproj.filters | 3 + WNT/menu2.exe/menu2Dlg.cpp | 12 + WNT/menu2.exe/menu2Dlg.h | 1 + WNT/menu2.exe/res/about.bmp | Bin 42574 -> 42576 bytes WNT/menu2.exe/res/about_ori.bmp | Bin 0 -> 42574 bytes WNT/menu2.exe/res/background.bmp | Bin 1440054 -> 1440056 bytes WNT/menu2.exe/resource.h | 3 +- 77 files changed, 19650 insertions(+), 3 deletions(-) create mode 100644 DOS/LOADCEPC/LOADCEPC.EXE create mode 100644 DOS/LOADCEPC/LOADCEPC.bsc create mode 100644 DOS/LOADCEPC/MAIN.SBR create mode 100644 DOS/LOADCEPC/PPFS.SBR create mode 100644 DOS/LOADCEPC/TRANSFER.OBJ create mode 100644 DOS/LOADCEPC/VIDEO.SBR create mode 100644 DOS/LOADCEPC/XMSAPI.SBR create mode 100644 DOS/LOADCEPC/bld.bat create mode 100644 DOS/LOADCEPC/bootarg.h create mode 100644 DOS/LOADCEPC/debug.c create mode 100644 DOS/LOADCEPC/debug.cod create mode 100644 DOS/LOADCEPC/debug.obj create mode 100644 DOS/LOADCEPC/debug.sbr create mode 100644 DOS/LOADCEPC/ethernet.h create mode 100644 DOS/LOADCEPC/ethmain.c create mode 100644 DOS/LOADCEPC/ethmain.cod create mode 100644 DOS/LOADCEPC/ethmain.obj create mode 100644 DOS/LOADCEPC/ethmain.sbr create mode 100644 DOS/LOADCEPC/halether.h create mode 100644 DOS/LOADCEPC/kernel.h create mode 100644 DOS/LOADCEPC/loadcepc.h create mode 100644 DOS/LOADCEPC/loadcepc.mak create mode 100644 DOS/LOADCEPC/loadnkpc.h create mode 100644 DOS/LOADCEPC/main.c create mode 100644 DOS/LOADCEPC/main.cod create mode 100644 DOS/LOADCEPC/main.obj create mode 100644 DOS/LOADCEPC/mdppfs.c create mode 100644 DOS/LOADCEPC/mdppfs.cod create mode 100644 DOS/LOADCEPC/mdppfs.obj create mode 100644 DOS/LOADCEPC/mdppfs.sbr create mode 100644 DOS/LOADCEPC/pc.h create mode 100644 DOS/LOADCEPC/ppfs.c create mode 100644 DOS/LOADCEPC/ppfs.cod create mode 100644 DOS/LOADCEPC/ppfs.h create mode 100644 DOS/LOADCEPC/ppfs.obj create mode 100644 DOS/LOADCEPC/ppfstool.c create mode 100644 DOS/LOADCEPC/ppfstool.cod create mode 100644 DOS/LOADCEPC/ppfstool.obj create mode 100644 DOS/LOADCEPC/ppfstool.sbr create mode 100644 DOS/LOADCEPC/readme.txt create mode 100644 DOS/LOADCEPC/setupen2.bat create mode 100644 DOS/LOADCEPC/setupenv.bat create mode 100644 DOS/LOADCEPC/smchw.h create mode 100644 DOS/LOADCEPC/transfer.asm create mode 100644 DOS/LOADCEPC/video.c create mode 100644 DOS/LOADCEPC/video.cod create mode 100644 DOS/LOADCEPC/video.h create mode 100644 DOS/LOADCEPC/video.obj create mode 100644 DOS/LOADCEPC/wdm.h create mode 100644 DOS/LOADCEPC/windows.h create mode 100644 DOS/LOADCEPC/xmsapi.c create mode 100644 DOS/LOADCEPC/xmsapi.cod create mode 100644 DOS/LOADCEPC/xmsapi.h create mode 100644 DOS/LOADCEPC/xmsapi.obj create mode 100644 WNT/menu2.exe/res/about_ori.bmp diff --git a/DOS/LOADCEPC/LOADCEPC.EXE b/DOS/LOADCEPC/LOADCEPC.EXE new file mode 100644 index 0000000000000000000000000000000000000000..087ee279be98e1e8ad745c56f33542027feba653 GIT binary patch literal 101368 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
Qxc){npFc)@;YWTj$($ z*<9jv%8NhFPoX{}4_aQ^hWz=UsOZdU!cA-Y*wsV0pZ4*dA7^ksy+y^4g{o)cc4TMM z9*Q#Cw$T2UzL$K`x{XbL`&-s4{ii3j%2fLAYPq<#HIo*1BffR(XKm+BTm{`1{u6=d8gz>(lYc3n_L`c^q>)KA3OM1@PRJUq5@xA5a%xf1B--=kjf!pzC@O!a$R#U&LzS-L;3-`0n z8)KH@{)$c8K3zsVoqguSk-6komwD?t=}^%dzvz-Tm2@PZe%I5z$*;Q}JL%+V%x9-h zcqyIuCXcwP`E!JG*ISPzui^QtezCkp?^M=3Ic`TsnJYegY(3$x3Z}1~gTH;}eSh&m z%rzZv4`vacx}yAXt8IIYuIsOQ_Uw|n(bl}Nt{ve=@0@-k=kS<)8EZq!@NeIW*{_6n ze&2noOLSgd@zZDD^BU<{F>}lxp5wW*dcXT%7Ws3@*1Oiu$E=z7`g6$i#g zdGwSImTaY5?`!|NCEEXW(nH7z_?vcONuT*PKW`j8pLEtmo;aqVz?Hvq$x^BOOjg#JAaKa?a3Ga{i((*_; z{9S3<_=%KL^0!UiS%%r-(%vsmCcK9(OI>*e`KI3n;_;ftW=yda6plXfto~N=(*G^` z6V~yV%Dv}^8bxb=iDr&xPcw_(cU}F@{!1|(_or;sef51*BO{q$8-J*e)4P)DYxVx4 z%3AL8E!M)izUkR&7ZArep(+w;BsH-m1^iyK|}oJuuZL>&y(vb~+P7bzf&& zNEXsL6l!}q%Rw^2cEZjk9G#1#x}|f9)Mj-?k@|R@J0zJ$=Lc#G(D{IBgE|*bvXRaK zRNdCue`+&2>rZ37&i0cmrStqY;J?oCQ{B}0d>X5C_MT)_ou{Y1Pv_)G#?{$(8uN6v z-4>qH*>>vNbzYrh+}AVcFL7Vho;pC=)wysQTXgQ5#%!J2CK+g6NA@5Q51l`+K3?a` zONP{W@sd5#Gx3k-bnd$HROg(lZ`Su_)Q0uF81>Ei{)_rleal6CioW%vK1APYl8n+J zi~PgXH<>gR>zhlGQS_}P$wnKZJl_~EucXY#^R1YY*+0jWEFG!BZ`?JJ*N7Usu=SE{L?q#B#XTzlXPyuluRLWIqvjLI?1B?ew}0!ed|uLuD*+> zzGMKVWc?YKl1cULJ&k!QF*O$c3R5!CdQ6S!doU%_=o^3PJM>iV{@=7#zPvE~B$R(;tKH>zEoV-@(*eV>hPeYJnA`kMu@Yl2?SI?^J6J ztZ!Ott|?P8oxX*w&Q;&d)|l@+L>_Rh?`&%f)AzU~o5+-G!eJ{$vdD5w$v84K*Vuq5 z89(C@t|{LEn36H|&2i0<^^+{FpXRg!F*O&|Ey?Ven3`*M#gwdcfG{+Ndz3uZ9A^#v zpytfaVM+$y*n#ILN1airIqVKh%?&@p)LeNdrsg&rd1WMf9>SDNua96#HVt4(_K09= zPTUexW5X$!A^gw4+(v$Oz|@?sqwIOEGp1w&nVMU6!PJ~S6H{}ju9%veoQ}CuX~ERo zL8fH&?z$#ES(uW=vN1JB8jLBKW(cO{6vJeX`%##hTU?AOS$GVl<{o1)HD{WDDOq$P zrsgo0VrtGl33C$eYB41f&&HHY+_od-On$A!lq}w@6Y(HEG9`m|$JE><3o|`PJHV7o z)e}=P<3LQw;MthcMGVH2F5*H=&0U9JN>-LBUC6M`mPX{1{V}q7@ZFvSk6LWOV(uC%L9%Y_h^wT@I#n9lE8twd^%V)lYL){Un3wr#UG} zBVn$4ytZvyI*X_HTXQk}H22U?`*JgQrW+6KAkKP+OKYNfYuR5C<$G6lPeBJKHE~M; zYcnR)aqcza_TX26^~;`WojqaH7&gFiu^EsnVW0~Q(-8N zwa1}lL|+<>Z*j2kJS7sSF1OFvJRCi4(2xORJU_xcuYa;SAWZzOT6;O0y5lXq*tmal&X5f|cz!Y{zTw+m89$M~ zl@^tk_Hp%!*b}Y`W1gE9&m=99oZ-izW68C3l3)Gn-s97f*5lSqmwVQolkhD=h4bY2 zi^B^^yZ_9u$0x72KcNo3{pymxZVA+v`Ie-`JM_I-<)fZApC>=Ql>7ek=9}@C@ACXp zytQV{$>9EyHP7f&nfmY8xn&r(RYLwv`(P3$;<|Cxb@jPxpLq`d-SG4cyyThM&Y{Yn z``6vr?nRYLF|;K-?IY)#XbrcKTequ|SA_c~#5IuF@|BG|r#zNljfb3d{bcI5pO#2w z=f;vx6t?QO_UduMLgH3E``n@V@ualt(J6zOiAQ~JQg!@MrP+^=Z(l2F>1^u_%}XB@%;2>e|UQc z;Z4Rb)z?!a`hs>vk(ONCe6e|~MQPh+^i1zzi`y$~)diJ72b1J(jN@8q(>n?}?I-aS z1=n2)%kQpF^5?6r`KN5=8Kpt@=|l3^eCvf{zfs6~SY`aW8TX5dXT-00mw2@8wCwZr zzw1KdH1|@TEAM(m*k{JB@1cVR49^>zGbnfHsF7+zTF>qg(aD$)*WKzB;b``#=Baf@id56u&O- z@W5i~xvo_|9Ks~HaU*g@<|<6JOYN`aOjr9Zh_=_d^|q;-hY1x|;Vo~H>O^^NGT6M2 zG|KZcO!rM?*7q8Z{qW6~1t%`Wt=o=NN0QkcR5)FQrT8=`vIg2p>UCr+ewHg-Z_%83HDly<%#L++8zmbSE#8=`vQpoyZ}zA^)tp-W=p32!pQ|x*r_5`4 z5OeW_x9^Zl+w=83<9cE)UEAZ)WtgFpuB+2rUG1kofvV0<#w?oj&@GFIWY1qbHd!*0 z@)2K6qdm!&b|fC3J~bhnLOjly*Rtbs%zeeq67}!l!M%ERBRq`yolR zXW;KE7q!lkF5}I#b!HEy>Rgoj>if13j><=KJIN3&@lWIJ8cdCAJ25p@ZQwc8?cTV* z;EDM!AHYV{(>as?XJU)%%Xa2g=B=x<|8$wqWK?@APSu@KtyFV&r7) z>o^hfmC=(IZ^e|XwTkd1pKRxO^|=dqZeLrfB+vbvHkLx+tB$qAeXFdOOEhjh^L5UQ z^~6Wx*e*KnFW zs?A3Tx5dYUpP9;YbsL`QI3KekGUifU=jWX8ny!%u{%nkRXt(%LfKH&i2N=DmAc#?0_#s-x1xoSA3 ze? zRKKlysh|3VV=Yn;jwH4`&ZJT9|s5T?LaevA}dSkUU z>5$ZBr8ia^l-_s`_od@h8&C2dSlf= z>5V7iemiq))g|eT)fY%_thOq>vHCjcjn%fKH=fJ2^v3Gzr8ky-S9;@a_$R&b98Bqr z)i+6RT*kHZ#;RM=8~4UudSkU^>5bLrNN-%rwe-g7>!dgCjlJ~7>hq;HR$n2#vHFtN zGhF?z^u}rv(i^KUklt8*uk^-4xR%~nZCZNcme{}C3IB<|^v0Wrm(?4SZ_*o2;#zuR zwF&8s)uyF4Uc+>&0-dJr#dSmqw(i>}RlipZuQhHbs@?(O4jTiN-MLG1Ny$Z=t?HdW$IW z(r*j*@zRdxvg*n6t1&eeK7}d$f#L5p{JjHHazt+QgzCvWSAty=qWjl4>M6nWR1$2Llv7IUGE~j{`0y{C;Z8te~}3v zE{Mk6n^2pFK5X?|JbotBec1JfG7|j1;!@K*BmTSz6|F5gX*l`fhHpYYz5G{K)+Ic@ z`J>CunNRq-k2m&55g3ZgjE1Q&7jR-Bsqw%0)Bcoa%lS)j+k+`TBbds&4A0z-sj%g* z@~l6m@@f&L(zqE@ah;5*JcxScT+bYhsk~f`sWflER9gLhx;NLyLeKptm`J$CgW@>m zPkH>G_)(pY`=iO&pU#R|&R?~d+c7o1?!h!9MrES&G?dRe6Js-`&b8=|sox?{-O7Rt z`ppfP`X`DZ`^la;*E2IP)jlJhX;Nclr3Hn>-T61YvaCoOxMRBDzT&jY=W(@1NMOWg8ncZmXg>tAelgG#{OEdWD@PSI|v(y@K!hoOyTWXi^h>Q zv{9`g_k~rUHH0moHJhDK2O;z|5%ABD$>Q(6Fa&a8GL(VN8JG(TVL5DsO|TVo{=gnM z2s$Sw0_`9ZdP08~4iiE8{wU0W`LGC3fo~99E21mJX#y*2wE%X3qv3m zCPP^|e!((Wt@4JgAien>H~=9EFC7-b8dwjnfz~dz!!9@ghVeWd+Ce7t1daV#JD3AY z;eL=VI-RjyYt20&8%D!qD1$kmb;-rB99F>^SP!qk7B~oP822wlgPat~Fluj{78n02 ziEGDh;+jI#$9i@4tG%vW0PRSj^tIWgGfHEXRla@jh%?=E9A8@#)^MPd@e8p-I6nK{ zn`9h%-mmtiGJ|y6dVt~!nhY|5YkS`@?a>dr_Z<_C=otqW^>)cT;{*a|q^lDA;=Nq# zQff zbkY%@wG)3g&fMHPEc8E@mq{VTIb_26TH+MNS=TAL=Dcpd4ANCLI$W~2%ASko+c%bd z4qvM&D?7rziO%%PVWf9!lfuhl0r?$(>5l>^}VRd=Bw;Fa-64)$&kuewdaTIvrJlc!4%)peZH?rA5RZPB7-G^dA{Iy3D?f7C*EwX+=;6ggFPHaS74P=gPc)4bk9gW;cPV>+N~_CqtMV&i zQLlc>k4YwtwCG(%Id}7Ua@uC}-u=XD1BoFCgpjNqj8kHqknmX=uy<`I2FKob zZEzr9uh*N{iq~s)*Er!bLbOU%Dx@N{sOm!$(I}-+g#@blz(a&msg-!>L#Wgjg!+Pn zDpjUDx6-dZ6L2$;QLXdB`2c@w#mGco-t|dqWZ_Tqqs}(Y$aRdQ&!q zco;f4e~dz8-0<39n;6QWW4R=KHK{2Do5M+Z)Bt5>|U&JmVs=CQ&tXP<0xW6p;dbNt&4wGu#XFa|@?cZp4~3 z%+lNp!qDBK?o-~K&^XFSq$!RQ0(hceoP4Eja)cdMxM7mASnzeRRk7kKY`bE4hi!$N zHprb$PCIeBj4O-ZuE0()<~7O|dR0!jU45Y}CA;^H}`fN>Hkv0mo0p? zh~v9?gr^&_fx9@j;M|B0?%C23#s&Jr8YcbmLe|`n3*DuVAE)}^K8rKX<`22Rz3llR z7y5fQuAzl{u7X1p$X6@!yk72hdBz*yYH?*$^NKsgQPwz3imLo9uklG3^;9?gF@H=> zV{Bx5T-3Za;=pZA=M%cu!Jmi7zFnbQ8)cW5ja%W>`EC(&DW3aR7FNl)iqmD&Ud9_J z;7JT;Ftly;&@6`K@_E=zF${C5^67yt7ZxVS*(fy6ZRo4Fi{3j8H|q-)s9m1!2%@V! zHJxCK_60m0JKdliYZ5g*BL*vSc$UTC)kWNeQ}bj0h|3;?X@D*c1*?ZT2>TiP5_OEl zVDBc2hrBWA()huRc-p*9(jeU~-Li!I>~AsbxPtzIU)Wwn8q{;}G5vv?C_rOP0BzQ_ zxw*cjV(~26aU(+MBP3X2v_4R`DulXJy{J|DJk&byKjQMxiaXAtWq-`&If*L@jGt|$ zK^}MG25cjvAG3Uc90G5sdyx)e4Oju-A91GBAUz&mM2s~&rC}{E7MAjBb@f0zCjH=X zvPN4nS?_l7wS)VJkE1~b6^|ijM_e6P98X91v8%!7>!>SFyU$YqD}k){M#O=750dzX z{Ec$VwF$Nd`k2g^MqIKk?KX_3(fS_;ZuJNq*Xw~_Mra6er6pjUK8tpY5xepVCM~nZ zY;$~En#1W#+j|l+h7~H-;%@@iq7dQtTXPE=&kVv!-E3zDu8}XLuIoE$B zc9WG#FURZb4-J$Z%Y^e;%SSQ$^y(n9R4riqpso+a}W33sBS3 zwh=qN8oL9w$n&OMjGWBO=N1YTYjcR>PS`cir*Ly3@{^f6QnN%xjwg{|>eR@-Ztej=SadS{!P4Jwu~eKJA^%YuIicuyl7Z{?VHD8OEQK zR>cSA3iC6ecIeV+V_v0b@AQ9_Crl{RWQq62g8h3UiRv- z3v(~S5Wh*7PT8`Q?}Kfld^KH~FO?}c-jT_&vCZtEeo5V(&sNxW(jNdLuHQ`+J~NPSmln zUcLGbDwppj;H&PS0&dUGH@kx>ocC{b2i3hOTcZ?Q*9+6XnE&C95WZb_G0=|88cW|)CywO~(w!|s=hEn~R(g`ZRe%gHHq&+Mu3&C5%232w&8G#K_}+$et; z7+yzu>@7U+egX`yr9Jj@`GtH2jGr*9<@iGWA=m2i_oe)E4feHsvj+RO{AUez1NS%8#}~t$n)TQ%u;*NlZNq(= z^;lcbxd!VB9$14t96Y`T>%l!x_3=FwWY%Eg!SiddTu@M~IZ|(PxGU;&$m;JA?4@8S zxcGzBGCdo-5qtm)!38`kyM$HAZ0V4ntm4tkL8A0z4h6?cu|DpXql)t-8>UHpd(19NxqOW(XR|a}VCzTi;9~zQW|6z3)q~yfl zv9u`Fm$DxQOV`MW!GV-9fbv9tNO`{y2z@f4PsaIVLZ5W#;}V`odmo=vdLTVI<^ra} zWYYs71&(O81AvWGb5#ekVp! z?$`bFyITcX)JUJcD&uw({@uhtK=^)&;W$X1VY2 zhcj;Uk40hawBn2H8F;I27N8%(?-Tg0n}PM4Q{DOXh3c$b;nG6Wo7GZjzB{kmx4ZMr z#TjDV`S5aZe@SI{>kAi;61exT_DKeTrpq@b$smR&4x9m28gC=`t8`qZ@Qb+{JdIE` zLb^#VfM$M^!8*C>>1O%L)9ZDB+zodU8Yb67JCxp_>!OAyROiFC6Yy*l?kh9;7TrH- z`MFiD18-NJO}hUksq|*GabkIE)$?l>=WTKV6QJeoc6kl7#kob#Tv^zy@+okmx9R;b zM&BX-_563rj)stDyPk(+9VLUiBmxjV|0g{2W{!zi+y$>-6>Z=Te^F6AC2*2 zGJ+CidA?8g(_lLi(%mavz%8vV;odvr#|_Dz?v{5vy-)WDB{l4RJ%?)a1M)BMSh@!! z0d>ykgVN>c2W1Gf@js+z@vOZ)tmo9QY>NCmqGxF>Z;#3q@EiS@-tEHuI?3RNx;}1l zeq7hdE&o4~9T*M_KO{Y#enMtIw`3uK8Gb-18*sOd9+S=8ao;T~z_{Vh}{~o2E(RF;IpVf7I zqbKAF*6OY7$8{aw=;w4D-{|Khf%SUhKcQ>+`!&uNbRFNy`=Y!J9-}AaGHA>Hl>7yB zQu%Xw#@TqLB>_d-%97W!fR@&b3<0;W1>GZH_(^%k@plB1as_l8{k9YIM^MghApVYE zO3$KY6rYkCXn5SC))C}%f8H6i-A>SNpPn5yp!3o;bwXJnl(-`>vxvfo0pm`y4h@>2h9$` z|HJTqH2#mp|2YU^9R6mNS5`E|#*|mrSGLR^Gseot78g%0&n_KbW>#KRQ{NP$pQ^g% zv==MSDb1gppOalsUY3_LIls8b%4b#2D{safdAVc9muKhZmeM_aa$ZqxUT%3|USVK#Idun)tgJ=}R5Z@1 z66b-<^)+UdHnyT=*5r!HnwV9Nt*APwr6IqzVh+l+GOv#6EV`QK#u{_$=hxNLBYLaM zuWM?qsL{2ou{ABR!iuJoO6r@co2%>V#-!^A6=tdHW!0ykU{m$SYn4Uyh4r&yWig}- z7Yb168~jUpFE7kKy0|oyTUyI6>Y|}!%TVRzW%=V3X4F`8&xE|}+`Lj;Iwmi=HaR;V zt)$cE86|m4$z-%J1u?e1zB#*bP80mYH35YmYYgrZ6qV8qeR4%LOOmdI4J^5mibfVs zO{&PUDjOQgsv2Xl4T`6-v?w>fEalBA%VLey73urX>J9%#BFw3=#!9vKu`?zk{Z&d< zR#jzLRYhGvbzQ7Lt#pGD&dP~3&7Dx+)SNwQ7TQs==*n37Rdda9CS;=}=FE*%omAFR zOAW53;0k|pCQK=ss3NMWon`20R#n`iHgs#=g+-PBN1v9P<+!_|_x3!AE|Dr&mBjJp^9 z+q)P3`@3^1=X76mxp`x!j4v!h3!4?IsjdwykJZhx+`NMP!t#Q=qDVvUrK`DOy8Jd* z%;4Xq>c-eCwtUOVosd&f5W^TZxw>|P?hz$DC$G2+b>GAyw@AxH09DQPjSCT)hPGK4 zH*huTp`{!oEVr>@eo3scDuz1Cnl(SCqM@R)x(0nT)-h*xG+&KZj=bkoM7tGThtmN~~Djq5i-T+OeY({00z8bag)qfXbr!?iLLLw7MF z=(<_41ANow?JBOLKXJ?S(ll;h?ZQLZ+9uB&I&@zd$=t%L(&ER$kNGSWQj$&DuDFVU7loo(UCovuZfnbvseoxa@+mJewWO!L!lc zX2fa0AtiROqe;Gq??*qSZeXqQXgz~T}5roW^1mS-B91e`EzzdV|86K zg2KPqO|jTXHoK*!MgxV7k2R0OjLg4Bx70Q$_r^~pIr%yDb+fDI6vnFNR@7BD)mqkg zj<*}1n$p+1PEA>1sNbN%<}&d%H<};kPK=@dRa-Si;?UNrb31iy%c{<8sjXc&ri(p- zsz*3zo5-eBmo&_7YOcprT-`J^)>Ki}(!i#IX}22HSi#D}?9-{?Sk^?;`$lRoYhrbC zO}f3U*DfYbsjIHSpfkBXyQ!+W+CmpFiwqMh$SoaLzyZB%Lit#<(J3Wn7@FqAy0j%2 zL{_6xP-R4JmLl#zUkwFRP+xUY2`q^wtEsPVKs*hVxv-wBpd`#-1tp%62sxj(i6;_;B-xzh3^&7htW=}8A&6`?YlwFv|ahIRj`uJG`vDLSw-1Jxg1El>7C(POH)xxZDnkODOuObYU-Q2yJ$uAB_-n!N70l5SV~1x z3QDZ$qsNvza`@FQ*fQ zOQDHAr(tx7r6jALJ=;=-t0gU?1{guLXuF8237+RwSH+6h+x1x%WnHW}*b+%!92imx z`+q}4GkQUtHK^q@pnrudG;l0YMP$iYP~C(jfJWrb#xQzXaxiIVI)!&v*QrY(D zc$Ff!ODbUDXVKAEKdYsxnR@pDcJ@^oo7cUk5YQYHfMPBz6CS0!kUVr zjx}yPLZ*s->XUQMhB=%ZL-THEslmYCxUi(2qe{t?f?^nA*1#bpDyMm9jm_hbjM&(g z*|WQ}y@qKRl*SVt6t)bHPM^at0--UQ6S!0<=X%NH zqInctb8!I^i`01)SU#|(yZ@I}3PWk5i;LvdZpQD%SZz9qS^AVpAYyK6sliAP{*J`o zW^0^{?9Z-lY@$v#)^kv6Gyz$oW~fFc*~F%~=uq%k8k?gTPOiKuAEOQK4tU=A3SSC%ao)y!Q30JD; z7#2C%V@oIVZ+_8aX>}D?iQx0(ywXDW;fPFfUTtC&m{yybQTmwIv54eA9{ruhzjaj& z3;DOPYHp)tvBxBPZ7D{x4MyIkQ`C9r59R{;RZHVWx=a=qNE^(hlVMhvHKXNX8CpLd z?O}51l)MdFK~_uE*owN7LIrnein`h|E4O-HbrX9>XDf);s+*f&0GCuRh}CpsuF(e? z-?-{n&8+m|wM!%x`C~KONIDRZdKBiCma3e&TuN<_Tk7?-9E7{1GT8DtD1^r3pw>-d z8FH`#D;h8&a+d5860hf%PU@=5=Id@QYN?Wq^q-0Vai?sljTC`R(NYpVX#m6;yN|6f zR*OXov)NsRY*_jDjPSx-SUj8UAh~c^e>_V2k>Memqnje^6jn)1MO|tY)HyKtDUQ{0 zvgv+YZ>fTzIkpA!m0W3)lPOKvpj~T67b62k#!R?Bsn8%{2pH}Di@J!$#EsR2!fA>% z&Wp_&(M>Ugc*6CO|KWP~g`g0c=KaT{CjI@}o|76nx~YBDe`?I@(yqgVm7U$(+*n=N z0@Gw8xe5Np{zre)bLLhw{+m*r@$as;(D+Z97h&y${C5?x6zyi?k@ILvbubE|n|XI< zVWT&;RLcOcmKxX=EwxzgH^I$az0wNKIxRKY-_fp4OHHR#7SG1=3VQ?Hh#QRzp>;Ad z@F_WGA(Y_U=&kU8ZK{e!E@fj)O%_a)mYPybsxpu$B1C?kT#x-lw1}4E0ycS5T1jOp zNBg7{$*-K7n$46!bVd&1$&*z^-D_=mNC}SlwDijQrFD%A!SWt=^?7DDPJ-zGOCyX%e9G)v6K61|bT=-O)Ow64`mvE@n+Kq>YYu^QXf$t*>d>$TA>n{)~TnU902r?2!kAHL``zML505FDxm@E6gjJ zoR=G^Q?Um=5v%ygIIn@&=^yXP$1%p#?1KE<@+pO5ai%k#_v+64@}gpjW#!pZv6G)Y z7Mo7tjpei$MA4b{+#HdJvARa%f;vOx%C#ZyXi@{$QyKlJEY6m__!Oy(3% zDVki)0LK*+Pm4m-m2oJqsQk-VisMT2xPiakkyzwEc{SvrEK*CdamqF$s@$MW$;rV+ zh}_du^C-81f^uxdpkhK@Pb;5Ln2nk)%1@SkQ1Xk)r(ip=%RlBN_+ZOHofhX{yCWGE zQikAAezi^6H5iRC-Q_K4=5l&g=!r}VY_#S^o^&m!ZHf*V;9ssn%sAShVhB>oU`o{C z@DZOmE^ioGZBsr5_|(}Kd|{Id$2HYWJSjtC*PYVB;Tfgi>!hw>6=E}~t2(JA*0?ab zPws9K!Z5=GwZZ+z6c^>8cyT;ocI1@0lj?9HFj^;5n2z?FYdMD>SKBnN>bUB#FO!(P!hJr=}ZSp1XvCwJ6q|@ZR-G^Q>;e#~QSzy0ZH_SOdJme=#0BVw;Gc z=T_9{Bi$!aRg655tco>MQRQyoemLK3z?Lfi&f{_!j_`M`&DRb`6TB{{ZK`Ofrk}`# zyC3yktksXT$MAotA8*U>f4R@JHm|o8eyXj+|Hu6-d&1ANRep)B_UkO}KU%^M_I97> z9e#$d@hg0-FY$H$oM%{H8)%!`*0!w;vK?{KI@`{$v+X>)*e_VStC*iEU*6QqJYqS=dZwu`dJKe6fYwT{j#~!f9?FmcRQ}(nyV_(=`?5{S&clNz} zAK%ya^O1hI=lOi!!nU+cd{f`t%`&Zz^|wuIQ`^SQwe#%~d(Qg#mcF&ucuyN(o7q-Y zW%t{!>`VK~{$_u-)4Z28*aADl&+g=!ZnxUK_NZ0(`c4TuCi-wv0ZOB+D&$|-DY>#opzT!WDnaTw!~U(r9E%2+1vIT`<=aKzqj}8 zL;J`+womOd`*>Y>M z6}HOS?MZvp-m#csC_TVt==oAz7#llArfKENBj$p_mIJYCUj@7N#g z1N+4OXn(fteYo%9yZUavx9{%<_9+Vm(t#EPUr+RPO z#m+)4t+jP_GF#(-|WBeTl`kP&2RTR{7%2i@AiBAUcb-pM?d1f476Id?CrrG zNP}5Vv@)|^s4KJHXjg_-e+<|cEg4U$AeDw*a49$dHD~D4_k)|D_6$8^6}TDlVCd;D zfLow-8T!z>;8rMKL;wF8+y*sj7zqr?7=-?9HrTcShuBbXJ39#6-g3bmtOVTArh+@! zao|v^1c%uyaJbchJENx=Qhz?Ut1Sk1vpd1vZ5_CWy$9}TpM!fLR>#P(6}S(sIQrLU za6hz5M?X6TJOHDIqsKLaBavT6&$}2r2tCQs1MdV!p$9p}o)zF>7zZ3Z@_q0K6k7t$M~lkDIQkyA5G^MYV|fqHL|@t-JPoZS6Jz_);2CHwnHc%%z_Y9wTx92h zXWLESId(gEuH6rwXAgttV{XgD81XoGp|yh-*=yj%D9=oc@SlK}+85wu_C0tx(%%Df zRWI;LwDcYrVF!U%qs8^W+;Sv%ElRWp#Dl!Z^kUt1D}_G zw_w)mfjQxA@HXVJ2kPbn@D9vNJ>dHX@NVmaQRE)9q8_NT1Hk*N0K6aVrw3-US>S_K z13qMDfe)h>^uQQ@6S&0g1s_FDd!VM{;A8d-xYS+(m)Wnu<@PSvW*>no>`QQ^{T+N9 z`R$3BvKP3@hJ&loCwd~qxnKfwPfv{3lfe$uXHSf=^T4$z*Pf`eE5Rp`DuL zyC>$`*T82nOZG(18GyO-dE~1n#)~1~i?$c|l8pv`iC*6mcEE|?E9eV7F)v&T{t7wj ziBKK{Ux!uF6D>6kzF|*+Zz4xMF@JmxzK!(v!tB-u{4GYQUKr^If$t(Oy)fsE1>ZwI z>xEW+4EP7M=w2xOI`Bi(S})9okAoj02fZ+Uy$SvietTht?14G`Gus9H9BJ-_dF4>> z3-s$=m_?2TzeLJ=!4|j{{MzmYzd>qyVOEQS-=P+IVRm~J{0qvz7i^Uck|=G-Tho}Prn!3%Ui*{{W)+Se;?e} z`*|OXN_&C(W1jAV-f{vs0+vA^8;NH{Fn~W0fXHzim_d`Fq9h`>T^|R^7S3jHK?}Eqp2jH>(Ey%gEza0;ow!fW#{PwqU zKM0(O^z?@{S_)SBDPWbK56<#S!5B)QKW3);!8s`H{x;Vi2dhyU{p}=w6|C`h!CLTO%y^{?>$6)F0#W0bmPk?EW?ndFgNSk(d6q02Wk#TL^2W zKjy!?!Bdf={+Qig1yA=k!880l@J!@o07km4z(sy2c($Jap5wE?bA17L9@@zO*aVk@ z7x*v03z3Tfc9FjXUW{@cV3+u2J^=IULEvSuW(U~iu;B*S6|kNLV8&eqUga-~mxD|FR&bdw1(*9%U>n--Ca@m923I0gn_&JM9T-;9_C5{%yiACacu@Z#MI0nX3@?UT{x-={g z{yP-^gP37H6Gp(mNDP-Vd3%qPn8{o48MpV8co;qgu_wh|5|2oUy(spPI3^`xnB?fd zi1JcmA4b$KCHBAtdP0)=D;Mb}nZ8r#MaSMuD z+3u0p7k}vq;?}lDB=(cI6(iin_FPZgnt9*W_Kw8<^0^JOIVdF#khm><4z_(GpDb6} z{}6}3;0{UJMB-qkcRPv4LI~mzirY&(Jtc03DGsZIkq{`d9nll2dPg-Gid^JyDFJaO z%%Z_3Yk-~*`%s$+Cw;O8=m}vCgVh_vEhP@M9%EoO%#OsZBo3p`oniY1pIb{DPH`7Z z(Lvls;?5Lzg*6;RtbOor7mB;VI1b_;_lWX1C_y*857S{ z9M?OjqrGA525|?8d$Kn7f$bYawkfWLAnprOIEZXhyc6Pnu;79?lp5|tnES&l4&pG0 z`_ktDS_?Avoh9x^afA$Iin~hOpW;Z^&Ea;oKHdrOKp2TZWJBYfDCC1+R|SzRg?A#G z2g9fe;sFv5WYLX+EfqvIAAECyJ`a&0#n`!&HQWiGhr)6SJ`a{SijCoL7&<{bBog8C z2-rG7IE)`#2aS z!DpVtBk6NIERP_Li$wUG0J9^A<0T%&>NpyfL=X!lj%Jt>VL$}2NMaTfj~${&ES5Ni zVqr=wk(kZfC&7jYw{sPVXZsmZDU6BEVh(+l$(~>#Pm#}DCVmPGi{Nvb#5{_}!eR*G z@sWtz=U}lFM4av6-#9jgx%Olvvg@!caCC>Edpi=FB~GN+WWR~T7KsJSd$av^J+Y8s&a)39alU*OQJildN8$pB z#Vq6nDRH615{e5`;wcg*Q9LCjo+`1F;;AX|G>K&tPfLj`eZ%Uj7mMPvDE2cYPGOSH zus=uQSrVsGJk!34#6=RPG4E&Dw~=_Z#Od_8$o?6L=SZAE@of7c5;>L_R!tDkv7aLG zJc-A$j?T4=j8I4COFWK=KQAR-An|zf42(7CwOBnH*5Lei0>|VFtXCvnB(a>;fi=#0 z;!MVVk@bs2j!*b155v6JHidW_K3*!Zl3`wATSnq#604Y`OH(3O_xKJ0#miD62Q6&9 zQ@lJSa?rx_*c7iwiC0OSL-ER#c(ug26t7B&*GR0Ucy&s=R^o{iuStp5Nj!<=d97_7 zC4RBQ8v0zE60et7OY!=Yc!R_`iZ`Uh8zt7WJa4j5QJA+&Y@pAZQ{o*GPp0^blz6Aa zMvAwj#JeOmQM@%J-Yv125#4S_L=oL1v4uYGNQw7KoJaA_lz5-S`E1^I*|_NTr4q5X z;@A|)kHlpX7xMOdQsQ!nr?B4dwTY3>Hi@UQh1_Sw5Shjm5>I0~@3)djTq*H%_73c< zL}EhX84U9wtBb^TiD$Bomf5^Wd`99~O#E`2ABoROT*TYk?6gRHPU6{&eTCf|ICV>k==}hGFEs0lBd?qEnE%7Rr{B!nPBxthe&*1A~x(CDf~VXKazMI#n)|n_-Eojmbln@j6vpxM&chOUe9#C zkrF?Zcmr>L%XW!;elGDwHn6v?BohB6@h1BGjg>_rEf+(#^fB1PnhcSJ@uNg+DLVGF zrbOaT5^rG@ziU$?@#jeFW7zSc_#uQK-pX{omlDJJ>NbkMPl?!4#=qOylHa%K(e0TM z?_jzd-5ZJ9OMH;Ge`^m%;!YADVq^H; zmPFz(i4QYJf3X#jxU0lRDE`$}ttWD~8e4bmk+{2jK1%T)wk8tykl0G`pSCs<_mudU z`55f;QEY?|#HFl`A5!98^0|!V`J=6ieC{oAImMssnMh>*4Fe78=x2K=5)Y7wbBmc+ zO}`q6BPFh6M4l24l=wK)ndz@ZKDk|H*bsKCwf)zTI7;FwmS->jdn6tzaW%!>{$nK4 zw&m!9boTL|BJpsE2}ab{v1C`?kC52TB=t*)M@sCV*gqxGG&Wm95u2CM?V}~GwH`BJ z;%^p-1rpaW_Dy_nBufj>KP69F`KRCBDIm8=ewRl=vo-w6k9y-QFbeE#AJ1 z-xP_>65nQ$cJuoqab6_C=kES+B+i%k8{WQ$FO9?n5`W9s_e_ZkCB8#(uatO-#CLi7 z-u^^%`>7It$JqDr)sc9bL>%GZT+!D=B8$&3o+8ZsQsNmB->0~LO60DlVLZj{2l!Lb z?Pp2+fDw)Grz3HZ#1GjRM*1%!@ob47@%DpL;&~E3W<;Y>;`tIkp?FA2yg=d~DIS^< zFO>Kx#luqKMG`+VAA=2Y#(pt`Abw8q2!9RYl@KqN&p%N-(tii>MhN_G7|kIb<)1>l z8N%HX|4ebT{}tk05FV5GC1cM@iAyDZMR80@Tqf~rirFb~xx{ZMj!lVe62E0B75k3p z^^9np#P29h^4%iwDT&`xEcJsU@o9;FVLHnsCLjdyuM{Usd^siljp7uEze|aKr#MyO zcPa576sJk#!YPFLPm0rh6k^{D;xq7Vm?0p}khnui{DI;z5)Vv?KT2ogenK-hT5Q(oy>_?w-JwFm(mDrz&ul9+N_$!G#0K@s+8S9Ay8Rkj8C=y?j&rKL+ zjb9pxuS?vNK5PBzNaQ92s*pbG{MtzTjl|9Av)-?d#CIfaL9xMajKp^(Zs};rC#OWV zC+yp@l$!k3$mj1RZcU%fDe--Y+fZytiGPr|Et53Q?~HE$P~spK$O6AR5>l=zLrohY7_ z62Fx=)Uk1}$k#@(vo9G=5>X&$`%{tly~JU>{hXBe7m33uo|_W?Dsg9u=cUBIN!*3v z`6==55_hF|K}!6G#N8-fm=d{zf(KD3UX&95C2ac z*Je?Y21*=3@fzPe5;u`JlDA)*61f3`9bWppE+ujl!^SMd#VK)fi3juc>r>(u5=T+I zAtiGE23xWeZ%m0>Nj#L|O(~I^C3uYv#hX*&HWCk~_=}Xdt;8cJ-jWgrNj#Db>{j0< z%I08+N73hPDRGFz(G+h_iQ7rcqIgG2++N}sig%_&j^Kt#3*ucVaYu<`*^=+}ZKK$C zl9)rE_oT$35_9SEULO?s940Z3KJQD3!zGSm$=~loBcD4<98d89-#HR@kvM_kgT8Ad z?kX{#;zPb$B`(r*L^0|-15_XxTJ~0yampF+&mw8bn9w4!l;&Pu9i6bPIQEc<+kvLM~ zWQr?%MkI1V#qKu6m0lT%2T7bt@o}$<#DgVHV~(Ei`bgv+8=i$`j#j0_LnO|?V;^{S z_T5Du4kEF((z!bs$Hnqe02F$O#7=SSjbiN~`*I{fBH%#nBk zZ(rkgL}ISQa*AvH{z%M|IFsT!e=riqNvxpwq_2p?@sWsZKIN+;ae~B3`h42kBavHl zc#{s3^o*}tPn^Y4de)ze#G~ai#@nCsrz4U3cAVNFKJU*)B25{*6^miM;4efXH}g2P zLwwO+io{70t9kp&{<}z=Eb&B&zw$pu;xvgTaXNd=KaIrc68U&9jut+P#2FH6DgN3& zkHljn*0GA;NQuWvtf$X6{m+rl<0Ljve9OOFPdu5oznv0koN+M>pTF_1BcDNRVm5#4 ze_u~*=I!sK#1nLT3&r21#Bz!AD882xXG)w;@%JgQLgE5O^uBKivMJ7$xR5?SNQu=F z@xbC3`_Ko$=T#86IZDd_;zzzS#2X;ch=kck@nhc);>{4wm3TVEPdppqT@VI`Oz~$wHWHUfyq=6v&=D`P<#wju}rt`~bqI5+9!;*BD=Z{q$N z@mp~qLSN>U3T+CM1it){2~Gi5_zKH_aS+qhvla3=BDa#`{zggX;93a`e!Q1_B6@ZeSk{Le}0%kZEV z{TzII6@pFjui{VVv#$7aeQ@zyiB}83~ANH*>~gN@_S zO0rdaOk6516Q2-Qi9B{=Q!*<^T zcg6j4g)>WSgWJ<_pDTAixq0>&M|&fm7M~HH6`vD>ABLHXt8?t33`46ZQ(5&?8Ez+X z#S`~oA{Qlb=PD%byNJ7ryNSDtdy4yswC>|hb3X1PL>laIr-dGOn&fe(5gm8h!f~hZ zi+&^)iD#(vSPt#}4{@++ZHTy?xRCJ}5pUJ}f>WE)gFUTgAu3rQ&Mw1@Rs6UGaA!zi`p+zZX9cKNSBcek%S| z{8{9q8SPklkQrj8xRtmym~1&;bZS4BspWhs9X`eVBe|!`XSG-(E)cI0ZxA0BxiKC0x5aP7 z{z^%cT4`UkkRwGN)5U$9$ldz5bHx_-{T1WJ((`*=4XOHG?w*Q;$1ri9E_O~~=d^8@ zsstWH=NL6loG_03>hyOVK$P<8qU7)JO6z8t|6hVVm}Vet`h ziO93!1ZD(ssklshUHrB9hWMuVmiUes+5?ZI68M57$uCJI@I^_IyXgshIfCpj4ikrq zJBz!ByNY{?dx=@%7?GP&349HK%oFp)i6ZxM68KUmd7OB>c!F3da^0W6S4GJdah^C| zTp%tKPZ!S+FA*;lFB2~puNJQnX*(zIHAnJp@gDI$af$et$gh1R@Fit(jks1^Cq5;< zD84Md0>*u&+Q5_I^WqC?1FxzLgf>&F@^2ACEqAWpcIo^&Tf(0dpBF=&ek%7D;-AIu zKv-gG&mU;E{Upr4>Y+S5i963#;`ovR+aaI0OoklBgb;oh8A6y}rb15OYZ~mE|I|D< zQvGohn824r8BVMCr1(pf!1GGU3*vj?XW}2kZ^Ur*MY%)D-;w)WG29jWhkL(}{%4UP zwELb)3BOv{jxXVo!F`$1d4sr2>;U6_i^`-zb-~B|;`qud?Y$+sN_!htpZHHP*kED4 z2y;Z37Z&O2B?{pZh4!A<7kUC;WmnmPkNd9h(~7Upa8w*69w8nn=85^@(c(n0NQ{ZI z#W~`MVB9;$I~y@};Oog5;J#um_ypo*X}lr6DTcBN7E35A+AW<|F$sJTn<+nE*gz3)U?_3b`Xw$MJBv(83ov^k$^i~HZyLc;hTM)lD9!iXJu zTo08@7$-RfhLs?{jKdH@ANd&J#QhVI{eo*x#`22zs>r7>+MF{2V<$Nmv|*J;@_~pp z|Bd)tkzbo_^WTf_iyw#|iL@Wu{4 z|4`-jx=JbJF{JY&>HqiD`Zo$Etf2phSQ7Yx9#g_m8tYSCz#y$ z8I$wi#&;^h8oyZWkoymDpCN|PsaEcVVi>7zl=}%Wj9R~u`&)4!(i!#yU^l9)!i*W_ z#4xId`HrJ{9OFOzcU}306*r&Mh-2I%!1{gycRDa zAa7B>4!aQl|JZF8 zP7w3Oqs0PovN%ONLF6cr@RP)5k$VCOKSSgf>Jxr}c$s*)c)$37__+9lxJu+WlknF> zju;8_IFjQ=!v7`yAP!bb8zP3?vjgSk9$Esgupq-6)F5}5i7t>k%tyD#%~=Vn8xXUh z%I!gs&lvXFnvtK#cm+`rcRW$Hl# z!G!Y_2MG_hdKd!_lX9dOEc0x+IVvW6f_StT=9&t*t3=K_3B34(47PW$x^I_qr+Byc zi1?@&Y~~l_eo3TN9Cwbr*j*Guy@XjTjG3M1GLD~d50)P1%D9KIZl-ej3)LOho3P1M zBb<-WcT^g?feC!Ym1!;(r-@;O7}Cb{B(Da&b6-f$xo8RU8CqIslc5E6)oOW=#W^usp!C|WIdbVsT+HY%r=Dev6w zTU`7^qgdwo*QliCs`}5!z?mC#fDg@3GTjN#N`G zyerJ7VfT2RQuqg@@D#b(l9MBRp;A>Ro(aaWi_7p|7f%(rdzRd9IYvI`ixeBcDwkqxTWfM zf*2Do7I~zJc}HwiX`d!?9*;ZslhIDZv&2Q>h2quXec}`1>*8O;zlpt+(>~$|vGX2X z=k^vx%ai1%Sq!$;e7VmRuNRkyYsI(3uf-{< z!^UyE3WE$MM7PMzeE`&s>TZ#Ej(CB1kH~}0xPK=GpW$jaU0R|LTE#Xoe4m*&o3W4jykIpMC&*{mdAnTh`^2Zja@|!aE)s7O!!Bjmf$S%r zVdpUH3RX(tT$w=akYNseQSLCCPwEufJ)OdAlRK=VpOZVJ{B60pwoTwnll;9HR@q#i zCigivQ!F7p`^z12I!^9jDTQ=$1)9K%V#snaSWO}QCrJtEzd`O$GJKI#0xxAFLn%Ei zcd(Q~9)soZYw2s1wx`9AqnG98iaX(7i6Q-ehdYkdH(REu)omjV6Gw_UVu@HI^4a0I ze=2?@@}bnY_gCBATC4|?X9O(UcE3#)#XaIfVw<=c#0iT=1KMxxICs#TqEv;oOxVd; zBZWIT%l(LyyYsG2a3`?W!JM+Sx8bEjBy-y4VV7WQlv0~k`YW6%S>ca}Pl!*7&xaOgq2<* zh3$5w(-vKcrxD2G#aZHPajsY+){0HyJaM6Ts(89cOJJp+C34la5@*CD`)?aw(z4-< z{D0l$cogk};WMX6`zp-ZVT};h1>39jQV)4g+PbuISNdetI7iOp%A)g{BCICD+|m6E zlJGE|T#PiVh@Ld~Kw*Y+_HYIlPUymkd^nE_XH`3?eRAiv9l2ona8EUP7Jr~-u5%DF zo_5e^{7W(Ht^}Jr%%NRJ>8rXOtK<4|OWZ%xRa$g7eHQs7Myv0G*ju${+v@wty}x*f zc&K=oc(^!KoF+~eXNbp$$BJBK#JyZ)5-h_-a)-U9#d3$!_9041NYzZaE5s^smKYO5 zIdq=ILXP%UdG0IjC+;sEAWjm)lLK?)4(GY2%YB9zcF}27cK9|(c?V7m$sI(#maxNj z5{HVz#N9=n%Xjz)k?W=oKTzaOdk3DMAxDWU&knr$iDY?p;1yvc_u)I7`|urpl*nD~ z4$l(Dh}`k+aPD|_;KYQjLCWJf&&QUFgcCuj$S&LVqa?Qe(3!aLR&&|ax#4W{e zmL2Td?WAlkc77&-yB5i3Y{FjLGw`$4xdMuNuycZ4N}p@-1OoLtRgb}{d_ZA7B({m4 zgROWe7F*54bUds^<7 z#piT2oYuY6>8`)Y9dgn2-e92xi>_$9*@1_PFm3wqo?)xHMDkp-!=c z9c;c~0#DG1gB8Md;*KJ}f*$wD;;|yX!i^M)p@c(uo`(8*0x|NGihUWQqVmPHTinBn zhU?ShGa=*Tu2VQ?i5H0>U!g`ix92dbgq3WlsSx|~x+~;5w7_bG+#-gw@q9KpZig}t ztuE{@?W+*N7=Do49LeJz(sriYOj{dXGt60-dvU=^X~XU==gsM=>u_ol)+}M~i|%%f zMeSJEbDSyH3?BAy!Y&F&s^ryo<^G-cp7?w5Tk$6`>==h|W-GKg;#{#>JVQ+HD!2RX zx|gqeZO2mwWH>)vE;sEuJoBTw!t+kti*Cou_tO45hj5$xr!B_h9>rjl#z=652dnG@ z_*~(gZL`m${7DS98LhHbA187KZ^bSjSt3pnOT{vAvN#1yp1i~~RxA{`gVBLqbdK#q z#O=iGMYhil-&5R6+*{Q&-x4cO4p_OUUxz)|vC3(%bAp9KJ1yal ziad`?K6epXNUr=JFNP-^E|dEnahBBJW5uv@dx_k4iX9?t z&IF#-A!$t|(67lG#IU3Iu-uP`;dJs1xqB#t;o=zaIB}lX`4nl5l(iscC@fAe?uloL zH;T)}Uy0v{TWYQxB_1!HB_5%xQ^d()nOGzii}~Ww;y7`lSRjrUCx|8DBr#Xa6AQuQ zGn|`iL~T&NzEZqf+&Rjv#h6S#JRM7>jo&Pcdq`o}j|!tuNNw1C;=OSXDZfVUFbjlS zguSMhq=y{6E_c`$3VT8P(sjrwP8^iqE0mH4M7-eusrp##qa5ujP7+(ht3~e0c0S!( z=d7u?hg^izh7^WWbxjFlUk96wcZHcQ%x;{~*7@Gjzd)I+#rY27x?Wr=;=Kh>z7p{z zTDT7qj}^}V*P$nQG_tXL-NuvbszFNkp+tWCOE{_C)^pu0jX zhqLg;o{(vS?aFfjjw)PR{rq#AR+?*kGw3Tk2m0f_3ufCVzzn2$7lhmfD>s}M{QPrx za-$6?p?})C$#C|A(uP;F@`P(bq-WxrZ`(szidS$_r-hvKzke#spmg}wxZ0s-NbuCI zM$3nA7oMgDgP#P-nQNsA>ESu#@O(0#Ltcv&t|ND0Rl*fYcxqxbo>$Mnx68K1y{*b! zYxIQ7&bX@;PX=Onoa4TOSS<4C=vEISe|S2YPl>F5 z?s-4bkiaWy$zO@#>~gi-eA*%IAv8W)vf8&)%D08yjy)XCJ7IodO<_k)cTE+!iVsf` zuEDy7;c&eZp1#J@HM%-M4Ck}mpUlR6Hu93dt63RZID36f?jOV<8eI<*r-}{Y1>!AY zI3Z=}CG>pAe^UZ+|5cbDaaSDeiaZ2dqi-A}{0YU*6JDH5A@9lgH_W_Y77p_-*G;Qb z*KvPNVTLEZo{{@`F!_Yi8}QkVC+!&;*I9U~99Kh2TcH_0?yu-B)^f6y4wnC;#qbOj z*L1D2qgu7PZ}r(yVqkcdDLj!Co{wrptgVg<3$oVSV&C z>;d*iS_R2xqG*k*!PD~T(%_mgq%iIoNbOpUPOI@+UiusYpUEC{8Qckc*MRKW4*w;c zHd6SGNgG~Ooy>dqhDbZk+*xiX$m-ZmK6$Db!f(@aw!xi@FM(dNh(c3qV6 zN~C-h#sv0}$8oh?tMa(Ns#KjQR)MWijnL{_h5dnK9#=#)*sPHER5;a2;l_GL=YGNS zIGocdwe0DuR6B9!iY9>>N+mC*^SDOOU4(YB{uy!b!;|7LP9|4UT;nA0^DoIXhmsE~ ztOTA8Vl1?W@f4iOByIDDC*0Oz)xa}N`sw_9b*r8|3!$}XM==g1*+PQ8F@|_oXg?(G zr=lF%{YlhCXa7M7Z2(VAsI0gzlssAHsw7y>;Vzuqp?xODO!nV6RuJSx&^z#YcKY85 zL};2HPZRIc)v)Ko{hzqUQZ=#~qX%Q`y!PRWrWO0E42@4bu29=pf%;-Ohh7uT^iNaS zhS8PdZ7cR*dGA!+#c^f@_H20&2o%I++80AhI(19 zb$xg~rwvbvCfi{fzAupUv&MH$>EW*A6AK{?Y};XvE_?%Mjrw5nsUbcu6z*D$*Lri5 z+YU+xW(}4$TXlz?fKBeLjfRqZMmo&e+#w8mp<%bJRV}ksJ9Vwm-d)(EV@n8gajU{l z?()%|N$&C;DEBbMlHQYS)p`vl#cG+{u}tm(hW)^>H^^4e;X_4^;Q?*@0==cqk*-bv&BSklj)^26P>q_V3N?y#}_v#i1% z+VKh}?74N`ZR7r1^4{HX?<$o)o)b|23i~kJ$yu#$4kq_x!d?w`W8xlmY(ia>A+$F1 zR<=FbCvksSe#j0Vt}@}Q*R@x+`&rV{YvB&xRQ@^lb-?mud*GVABeDY-OIS^>!N@>6 zHq;u|>0wtY>=boqzo-KiENg#TFzi-^9i)UeE49J03QxE(%RWF zKD~-x2iu#gfK9|rMb^$b)#*CaJKe*@oy8r*9mOHyPU28;J8^rF*84ixx+Gp?4h|NF zi37xK#I3|F#jV9Hz_obJR_#h$tXcI@)M?yHRr~+D73io`XlwB-F2g@g%C#b1i3(-9 z^w72+mGY8!D)d#biZk)Lu}$&jd3?kRXn>swKA(d(B@e`pxWYHy;SDqrTn6K%GQd8> zz65_q2|oe^EHKpkLb|w&!w(VxTqfJy#7trlekKENL5AxdqMDdXoJ_Ek@GB7jcL(sI zX@I*0_+=D;>uckZ9WP`A{z62Bj9m#jVCT4@Y_-ucmV-$F`>+0dn1ECK$U^_3jvoC6Nr2QTR0iE3xVZ! z2Hx)j3?~jIvWU?H4ksqu#u2~pGN`45_=QPjBN~E{Ou#WE*zM__HrD4 zRRQmpMn7PG$6KONE)S!$_zp$90vwf~-+8iGyyFgfDIoY;U3MH)mY8(2htIC0IuE0uu} zeE)OzL2ViZ)#Z*&GVD&K;5Ga&tvV|d#PVm3dH;Bb@A?C;KDE|*Q17dd2+Lp? zwGvi$A+;MZfZ@G_oAH(FxOy0`()PqF?|@C2RX*B)7pKC-DG4uu1xDB|{Ba57O*6^f z)HpTcrzrsbsu|uL4cARjZ76Sh7dhsScHm7GybV9f!Meo9n;ASe9Bdd%_f2~FHK8J* zEokpEzm?QJX10FEd#~WfBBGe6WKgX{8^MQLQNM6q#j8t*rTjR6xRM_qAnqg5L&58K zeTa==XCGl(uxsEWY9RwfjXpDslfza7#vu&hyl^3Lj$vcrR?aRHtam0}8H`iEQ~41U zpNY4S_rTBAIb7!x=MvxX!uQ0t1olZX@e>dLR@9lCyfO{H){x18EYo1!MH+0fC?Y&5 z99>l?=){>wA26P`eV+>IR^EYuF-p}2Aur`^*U>ZH(aPW1gDc8MU*3T|-G>aWRlILZ%{4|GWc|3P{N}Yfi3G> znfgfv*X4Anas87Yk4)9aqbyV9$XVhK@?!;EorA)?8&vHUj(DTm!qp9Ou8LCjZ|GEh z$>!Z%w$cG?kfR%z(t6@C2DO~7&S^oQD#;j!w!y)x6_3a(+s@16s~zh zGtr;G$e&@{k+Bas0S)G;EbH)HYDci%(!(Jp&1eu*ay9hfe2zmT3R_n-vSRNj8vo8` zE2$+kp6WIYg3)cr`BDa;d-2*1$Ap0-VE%BtTNBVnxvt{JD+s(z$?>j6;2z>W;%?%0 z;tm4mYR=zyb-a)gxSqIyxQW1dq2mRTz;(o8;#T4|0zVMTH**3wqvN|8k*XW52bQLW zk9bzqF|&6~DGsCfwnupB?&^Q56)aipcNl1(ZNyp6@- z0bT?c1Q{?o&|+88w$QzuK|6w;?;{EMXj7 zG$foSBDersRB4VvR>E;1$||mY!!~{n$Cuu0-n|Iq03O3fTtLIlL{PANSJJ|BhAe|X zokRiPxs+(U#}A`sgo03%cxg7x6yO`W&SjuivJj&?@G%MsF1&V|Lxw!#<2m%K4E{u$ zp|=B0e9eLOXTu=)126nYS5F5r92a`fOD3^|$;FFy7vfW2<1>s9**wSYX&WrCkT$=WU}*~ejt7% zL0y#n}|of8}Qk(VW0V5wHsp5cRCSE))OU1}3T`Bky^UGos>Gl+D4`McEc2hUMggR3XIP!D#sOu8yq z*lN3qEggr}oKf}_C?Zl%k!h+TNjIrH==KT*w~)!>=v#eZy#u%5*wpxuW4vEfH0b&VuR#kG}j@JwQ!B>qeDE1sj|)xH62z z_^61K{j_@YXw<6SWqFTi;EY}aLo-5hkme9)u>=0T;s_(DlI=PY! zY>8oy;wq+!zsDW=hbF4@7^Zfm=~KN-U03sHZ-v|81}MU*7f|+lxBq|1yAdYf9%$?fxhB{od?Ry$E+c z(?r+TybyIiXg_jc9Q8cZWhVPpdIDO>-4u<*YM29P7pvQA08kS+lPxT27AV-rI8hNJ zB2}`+#PrCZAzUS%*3vGuVr5H%LJ#(H)wBl7bbCq9;!)(XMi8$?BsGC(yhm?T5vM00 zxzbpIU0U=H3^(bSDeXC3#OXVncPQSdr(nXpiY@!DFr^}>!FVYv<~;0ntE|$EFdd3q z%G*^eL_z-4Q-lpXr|(E#P?O(i@YvGBj~}55xw#j)B7+KvjHV7mp1!J%nEtqgwy1)S zW>fTO4b2fWDIow20Geyl_ohcPm6d{0@Mnf0169^5m^cU^DoMnq8kFZHob#gb1+#c8 zn4CzsRz;D;gNCi@PWSk<>-J!NU@!bay!sYZfl5hFkgAz9luNvOA+lA}7-ZO_i`{8j z>4FkDn5oB40(ag)(;b>&(~Uaa4>Q;qJgOX+ zSQ*2CEKey0W){Y869gF;n7BOi0(|pRQvLGF85kHQPvB!aS;~-BT(J}D9a$Upbkg^nGo>*Kaievo&iixI?o^ulK|4cHvE64m}Y#t=XBb^ z$1G`j3mF*Fm=CAvEe6uY2f*Be4}jv#Y(N2!Xhd36T3nhQKcg5>U?<3=H0IO%3I})? z`IQc&y#fhvFyzhAXE-7i0Cd9%xe%r!rU8sn4o7Ukq)Py!oWl{n07eCeBf$ZTB@Rd8 z0~jS7Zp`Inc%l%(^duRii-AF9fgA%91H%phpm}{a`VRCx=zGz3q5EObu0Q|f89I#) J7j*%pO91&5V*vmF literal 0 HcmV?d00001 diff --git a/DOS/LOADCEPC/VIDEO.SBR b/DOS/LOADCEPC/VIDEO.SBR new file mode 100644 index 0000000..e69de29 diff --git a/DOS/LOADCEPC/XMSAPI.SBR b/DOS/LOADCEPC/XMSAPI.SBR new file mode 100644 index 0000000..e69de29 diff --git a/DOS/LOADCEPC/bld.bat b/DOS/LOADCEPC/bld.bat new file mode 100644 index 0000000..c0809dc --- /dev/null +++ b/DOS/LOADCEPC/bld.bat @@ -0,0 +1,4 @@ +del *.obj +del *.sbr +del *.cod +nmake /f loadcepc.mak \ No newline at end of file diff --git a/DOS/LOADCEPC/bootarg.h b/DOS/LOADCEPC/bootarg.h new file mode 100644 index 0000000..af826ae --- /dev/null +++ b/DOS/LOADCEPC/bootarg.h @@ -0,0 +1,123 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// +// Use of this sample source code is subject to the terms of the Microsoft +// license agreement under which you licensed this sample source code. If +// you did not accept the terms of the license agreement, you are not +// authorized to use this sample source code. For the terms of the license, +// please see the license agreement between you and Microsoft or, if applicable, +// see the LICENSE.RTF on your install media or the root of your tools installation. +// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +// +/*++ +THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +PARTICULAR PURPOSE. + +Module Name: + bootarg.h + +Abstract: + Definitions for arguments passed by loadcepc at boot time. + +Notes: + +--*/ +#ifndef _BOOTARG_H + #define _BOOTARG_H + + #include + +// Contains a pointer to the actual boot args structure + #define BOOT_ARG_PTR_LOCATION 0x801FFFFC + + #define BOOT_ARG_VERSION_SIG 0x12345678 + #define BOOT_ARG_MAJOR_VER 1 + #define BOOT_ARG_MINOR_VER 0 + + #define MAX_DEV_NAMELEN 16 // Should match EDBG_MAX_DEV_NAMELEN. + // NAND controller boot flags + #define NAND_PCI_PRESENT (1 << 0) + +typedef struct _BOOT_ARGS { + UCHAR ucVideoMode; + UCHAR ucComPort; + UCHAR ucBaudDivisor; + UCHAR ucPCIConfigType; + + // The following args are not set by older versions of loadcepc, + // so include a sig to verify that the remaining params are valid. + // Also, include a length to allow expansion in the future. + DWORD dwSig; + #define BOOTARG_SIG 0x544F4F42 // "BOOT" + DWORD dwLen; // Total length of boot args struct + UCHAR ucLoaderFlags; // Flags set by loader + UCHAR ucEshellFlags; // Flags from eshell + UCHAR ucEdbgAdapterType; // Type of debug Ether adapter + UCHAR ucEdbgIRQ; // IRQ line to use for debug Ether adapter + DWORD dwEdbgBaseAddr; // Base I/O address for debug Ether adapter + DWORD dwEdbgDebugZone; // Allow EDBG debug zones to be turned on from loadcepc + // The following is only valid if LDRFL_ADDR_VALID is set + EDBG_ADDR EdbgAddr; // IP/ether addr to use for debug Ethernet + // The following addresses are only valid if LDRFL_JUMPIMG is set, and corresponding bit in + // ucEshellFlags is set (configured by eshell, bit definitions in ethdbg.h). + EDBG_ADDR EshellHostAddr; // IP/ether addr and UDP port of host running eshell + EDBG_ADDR DbgHostAddr; // IP/ether addr and UDP port of host receiving dbg msgs + EDBG_ADDR CeshHostAddr; // IP/ether addr and UDP port of host running ether text shell + EDBG_ADDR KdbgHostAddr; // IP/ether addr and UDP port of host running kernel debugger + DWORD DHCPLeaseTime; // Length of DHCP IP lease in seconds + WORD EdbgFlags; // Information about the ethernet system + WORD KitlTransport; // Transport for Kitl communication + + DWORD dwEBootFlag; // Eboot flags indicating whether EBoot supports warm reset (older version may not) + DWORD dwEBootAddr; // Eboot entry point set by eboot and used during warm reset + DWORD dwLaunchAddr; // Old image launch address saved by EBoot when it receives jmpimage + + // The following args added to support passing info to flat framebuffer display driver + DWORD pvFlatFrameBuffer; // pointer to flat frame buffer + WORD vesaMode; // VESA mode being used + WORD cxDisplayScreen; // displayable X size + WORD cyDisplayScreen; // displayable Y size + WORD cxPhysicalScreen; // physical X size + WORD cyPhysicalScreen; // physical Y size + WORD cbScanLineLength; // scan line byte count + WORD bppScreen; // color depth + UCHAR RedMaskSize; // size of red color mask + UCHAR RedMaskPosition; // position for red color mask + UCHAR GreenMaskSize; // size of green color mask + UCHAR GreenMaskPosition; // position for green color mask + UCHAR BlueMaskSize; // size of blue color mask + UCHAR BlueMaskPosition; // position for blue color mask + + // Version information for bootargs structure. + ULONG dwVersionSig; + USHORT MajorVersion; + USHORT MinorVersion; + + // Version 1.0 additions + UCHAR szDeviceNameRoot[MAX_DEV_NAMELEN]; // EDBG device name root. + + DWORD dwImgStoreAddr; // Flash storage address. + DWORD dwImgLoadAddr; // RAM load address. + DWORD dwImgLength; // Image length. + BYTE NANDBootFlags; // Boot flags related to NAND support. + BYTE NANDBusNumber; // NAND controller PCI bus number. + DWORD NANDSlotNumber;// NAND controller PCI slot number. + +} BOOT_ARGS, *PBOOT_ARGS; + +// Defs for loader flags + #define LDRFL_USE_EDBG 0x0001 // Set to attempt to use debug Ethernet +// The following two flags are only looked at if LDRFL_USE_EDBG is set + #define LDRFL_ADDR_VALID 0x0002 // Set if EdbgAddr field is valid + #define LDRFL_JUMPIMG 0x0004 // If set, don't communicate with eshell to get +// The following flag is only used for backup FLASH operation + #define LDRFL_FLASH_BACKUP 0x80 +// configuration, use ucEshellFlags field. + +// Use this constant in EdbgIRQ to specify that EDBG should run without an interrupt. + #define EDBG_IRQ_NONE 0xFF + +#endif // _BOOTARG_H diff --git a/DOS/LOADCEPC/debug.c b/DOS/LOADCEPC/debug.c new file mode 100644 index 0000000..de18688 --- /dev/null +++ b/DOS/LOADCEPC/debug.c @@ -0,0 +1,166 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// +// Use of this sample source code is subject to the terms of the Microsoft +// license agreement under which you licensed this sample source code. If +// you did not accept the terms of the license agreement, you are not +// authorized to use this sample source code. For the terms of the license, +// please see the license agreement between you and Microsoft or, if applicable, +// see the LICENSE.RTF on your install media or the root of your tools installation. +// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +// +/*++ +THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +PARTICULAR PURPOSE. + +Module Name: + +Abstract: + +Functions: + + +Notes: + +--*/ + +#include + +unsigned char __inline READ_PORT_UCHAR(unsigned char *port) +{ + return _inp((unsigned short)port); +} + +void __inline WRITE_PORT_UCHAR(unsigned char * port, unsigned char value) +{ + _outp((unsigned short)port, (value)); +} + +#define LS_TSR_EMPTY 0x40 +#define LS_THR_EMPTY 0x20 +#define LS_RX_BREAK 0x10 +#define LS_RX_FRAMING_ERR 0x08 +#define LS_RX_PARITY_ERR 0x04 +#define LS_RX_OVERRUN 0x02 +#define LS_RX_DATA_READY 0x01 + +#define LS_RX_ERRORS ( LS_RX_FRAMING_ERR | LS_RX_PARITY_ERR | LS_RX_OVERRUN ) + +#define COM1_BASE 0x03F8 +#define COM2_BASE 0x02F8 + +#define comTxBuffer 0x00 +#define comRxBuffer 0x00 +#define comDivisorLow 0x00 +#define comDivisorHigh 0x01 +#define comIntEnable 0x01 +#define comIntId 0x02 +#define comFIFOControl 0x02 +#define comLineControl 0x03 +#define comModemControl 0x04 +#define comLineStatus 0x05 +#define comModemStatus 0x06 + +#define IoPortBase ( (unsigned char *) COM1_BASE ) + +extern struct _ARGUMENTS +{ + unsigned char ucVideoMode; + unsigned char ucComPort; + unsigned char ucBaudDivisor; + unsigned char ucPCIConfigType; +} BootArgs; + +// 14400 = 8 +// 16457 = 7 +/- +// 19200 = 6 +// 23040 = 5 +// 28800 = 4 +// 38400 = 3 +// 57600 = 2 +// 115200 = 1 + + +void OEMInitDebugSerial(void) +{ + unsigned char ucArgs[3]; + unsigned int dwSize; + + dwSize = sizeof(ucArgs); + + WRITE_PORT_UCHAR(IoPortBase+comLineControl, 0x80); // Access Baud Divisor + WRITE_PORT_UCHAR(IoPortBase+comDivisorLow, BootArgs.ucBaudDivisor&0x7f); // 19200 + WRITE_PORT_UCHAR(IoPortBase+comDivisorHigh, 0x00); + WRITE_PORT_UCHAR(IoPortBase+comFIFOControl, 0x01); // Enable FIFO if present + WRITE_PORT_UCHAR(IoPortBase+comLineControl, 0x03); // 8 bit, no parity + + WRITE_PORT_UCHAR(IoPortBase+comIntEnable, 0x00); // No interrupts, polled + + WRITE_PORT_UCHAR(IoPortBase+comModemControl, 0x03); // Assert DTR, RTS +} + +void OEMWriteDebugString(unsigned short *str) +{ + while (*str) + { + while (!(READ_PORT_UCHAR(IoPortBase+comLineStatus) & LS_THR_EMPTY)) + { + ; + } + + WRITE_PORT_UCHAR(IoPortBase+comTxBuffer, (unsigned char)*str++); + } +} + +void OEMWriteDebugByte(BYTE ucChar) +{ + while (!(READ_PORT_UCHAR(IoPortBase+comLineStatus) & LS_THR_EMPTY)) + { + ; + } + + WRITE_PORT_UCHAR(IoPortBase+comTxBuffer, ucChar); +} + +int iComTotal=0; +void OEMReadDebugBytes(unsigned char * ucBuffer, int usReadSize) { + int i=0; + unsigned char uStat; + + while (usReadSize--) { + do { + uStat=READ_PORT_UCHAR(IoPortBase+comLineStatus); + if (uStat & LS_RX_ERRORS) { + while (1) + printf("port status error=%xh i=%u\r",uStat,iComTotal); + } + } while (!(uStat&LS_RX_DATA_READY)); + ucBuffer[i++]=READ_PORT_UCHAR(IoPortBase+comRxBuffer); + iComTotal++; + } +} + +int OEMReadDebugByte(void) +{ + int i; + OEMReadDebugBytes((unsigned char *)&i,1); + return i; +} + + +/***************************************************************************** +* +* +* @func void | OEMClearDebugComError | Clear a debug communications er +or +* +*/ +void +OEMClearDebugCommError( + void + ) +{ +} diff --git a/DOS/LOADCEPC/debug.cod b/DOS/LOADCEPC/debug.cod new file mode 100644 index 0000000..2cc72ff --- /dev/null +++ b/DOS/LOADCEPC/debug.cod @@ -0,0 +1,394 @@ +; Static Name Aliases +; + TITLE debug.c + .286p + .287 +INCLUDELIB SLIBCE +INCLUDELIB OLDNAMES.LIB +_TEXT SEGMENT WORD PUBLIC 'CODE' +_TEXT ENDS +_DATA SEGMENT WORD PUBLIC 'DATA' +_DATA ENDS +CONST SEGMENT WORD PUBLIC 'CONST' +CONST ENDS +_BSS SEGMENT WORD PUBLIC 'BSS' +_BSS ENDS +$$SYMBOLS SEGMENT BYTE PUBLIC 'DEBSYM' +$$SYMBOLS ENDS +$$TYPES SEGMENT BYTE PUBLIC 'DEBTYP' +$$TYPES ENDS +DGROUP GROUP CONST, _BSS, _DATA + ASSUME DS: DGROUP, SS: DGROUP +PUBLIC _iComTotal +EXTRN _printf:NEAR +EXTRN _BootArgs:DWORD +_DATA SEGMENT +_iComTotal DW 00H +$SG370 DB 'port status error=%xh i=%u', 0dH, 00H +_DATA ENDS +_TEXT SEGMENT + ASSUME CS: _TEXT + PUBLIC _OEMInitDebugSerial +_OEMInitDebugSerial PROC NEAR +;|*** // +;|*** // Copyright (c) Microsoft Corporation. All rights reserved. +;|*** // +;|*** // +;|*** // Use of this sample source code is subject to the terms of the Microsoft +;|*** // license agreement under which you licensed this sample source code. If +;|*** // you did not accept the terms of the license agreement, you are not +;|*** // authorized to use this sample source code. For the terms of the license, +;|*** // please see the license agreement between you and Microsoft or, if applicable, +;|*** // see the LICENSE.RTF on your install media or the root of your tools installation. +;|*** // THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +;|*** // +;|*** /*++ +;|*** THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +;|*** ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +;|*** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +;|*** PARTICULAR PURPOSE. +;|*** +;|*** Module Name: +;|*** +;|*** Abstract: +;|*** +;|*** Functions: +;|*** +;|*** +;|*** Notes: +;|*** +;|*** --*/ +;|*** +;|*** #include +;|*** +;|*** unsigned char __inline READ_PORT_UCHAR(unsigned char *port) +;|*** { +;|*** return _inp((unsigned short)port); +;|*** } +;|*** +;|*** void __inline WRITE_PORT_UCHAR(unsigned char * port, unsigned char value) +;|*** { +;|*** _outp((unsigned short)port, (value)); +;|*** } +;|*** +;|*** #define LS_TSR_EMPTY 0x40 +;|*** #define LS_THR_EMPTY 0x20 +;|*** #define LS_RX_BREAK 0x10 +;|*** #define LS_RX_FRAMING_ERR 0x08 +;|*** #define LS_RX_PARITY_ERR 0x04 +;|*** #define LS_RX_OVERRUN 0x02 +;|*** #define LS_RX_DATA_READY 0x01 +;|*** +;|*** #define LS_RX_ERRORS ( LS_RX_FRAMING_ERR | LS_RX_PARITY_ERR | LS_RX_OVERRUN ) +;|*** +;|*** #define COM1_BASE 0x03F8 +;|*** #define COM2_BASE 0x02F8 +;|*** +;|*** #define comTxBuffer 0x00 +;|*** #define comRxBuffer 0x00 +;|*** #define comDivisorLow 0x00 +;|*** #define comDivisorHigh 0x01 +;|*** #define comIntEnable 0x01 +;|*** #define comIntId 0x02 +;|*** #define comFIFOControl 0x02 +;|*** #define comLineControl 0x03 +;|*** #define comModemControl 0x04 +;|*** #define comLineStatus 0x05 +;|*** #define comModemStatus 0x06 +;|*** +;|*** #define IoPortBase ( (unsigned char *) COM1_BASE ) +;|*** +;|*** extern struct _ARGUMENTS +;|*** { +;|*** unsigned char ucVideoMode; +;|*** unsigned char ucComPort; +;|*** unsigned char ucBaudDivisor; +;|*** unsigned char ucPCIConfigType; +;|*** } BootArgs; +;|*** +;|*** // 14400 = 8 +;|*** // 16457 = 7 +/- +;|*** // 19200 = 6 +;|*** // 23040 = 5 +;|*** // 28800 = 4 +;|*** // 38400 = 3 +;|*** // 57600 = 2 +;|*** // 115200 = 1 +;|*** +;|*** +;|*** void OEMInitDebugSerial(void) +;|*** { +; Line 88 +; ucArgs = -4 +; dwSize = -6 +;|*** unsigned char ucArgs[3]; +;|*** unsigned int dwSize; +;|*** +;|*** dwSize = sizeof(ucArgs); +;|*** +;|*** WRITE_PORT_UCHAR(IoPortBase+comLineControl, 0x80); // Access Baud Divisor +; Line 94 + *** 000000 b8 80 00 mov ax,128 ;0080H + *** 000003 ba fb 03 mov dx,1019 ;03fbH + *** 000006 ee out dx, al + +;|*** WRITE_PORT_UCHAR(IoPortBase+comDivisorLow, BootArgs.ucBaudDivisor&0x7f); // 19200 +; Line 95 + *** 000007 a0 02 00 mov al,BYTE PTR _BootArgs+2 + *** 00000a 25 7f 00 and ax,127 ;007fH + *** 00000d ba f8 03 mov dx,1016 ;03f8H + *** 000010 ee out dx, al + +;|*** WRITE_PORT_UCHAR(IoPortBase+comDivisorHigh, 0x00); +; Line 96 + *** 000011 33 c0 xor ax,ax + *** 000013 ba f9 03 mov dx,1017 ;03f9H + *** 000016 ee out dx, al + +;|*** WRITE_PORT_UCHAR(IoPortBase+comFIFOControl, 0x01); // Enable FIFO if present +; Line 97 + *** 000017 b8 01 00 mov ax,1 + *** 00001a ba fa 03 mov dx,1018 ;03faH + *** 00001d ee out dx, al + +;|*** WRITE_PORT_UCHAR(IoPortBase+comLineControl, 0x03); // 8 bit, no parity +; Line 98 + *** 00001e b8 03 00 mov ax,3 + *** 000021 ba fb 03 mov dx,1019 ;03fbH + *** 000024 ee out dx, al + +;|*** +;|*** WRITE_PORT_UCHAR(IoPortBase+comIntEnable, 0x00); // No interrupts, polled +; Line 100 + *** 000025 33 c0 xor ax,ax + *** 000027 ba f9 03 mov dx,1017 ;03f9H + *** 00002a ee out dx, al + +;|*** +;|*** WRITE_PORT_UCHAR(IoPortBase+comModemControl, 0x03); // Assert DTR, RTS +; Line 102 + *** 00002b b8 03 00 mov ax,3 + *** 00002e ba fc 03 mov dx,1020 ;03fcH + *** 000031 ee out dx, al + +;|*** } +; Line 103 + *** 000032 c3 ret + *** 000033 90 nop + +_OEMInitDebugSerial ENDP + PUBLIC _OEMWriteDebugString +_OEMWriteDebugString PROC NEAR +;|*** +;|*** void OEMWriteDebugString(unsigned short *str) +;|*** { +; Line 106 + *** 000034 55 push bp + *** 000035 8b ec mov bp,sp + *** 000037 57 push di +; str = 4 + *** 000038 8b 5e 04 mov bx,WORD PTR [bp+4] ;str +;|*** while (*str) +; Line 107 + *** 00003b 83 3f 00 cmp WORD PTR [bx],0 + *** 00003e 74 1d je $EX337 + $FC339: + *** 000040 89 5e 04 mov WORD PTR [bp+4],bx ;str +;|*** { +;|*** while (!(READ_PORT_UCHAR(IoPortBase+comLineStatus) & LS_THR_EMPTY)) +; Line 109 + $L398: + *** 000043 ba fd 03 mov dx,1021 ;03fdH + *** 000046 ec in al,dx + *** 000047 a8 20 test al,32 ;0020H + *** 000049 74 f8 je $L398 +;|*** { +;|*** ; +;|*** } +;|*** +;|*** WRITE_PORT_UCHAR(IoPortBase+comTxBuffer, (unsigned char)*str++); +; Line 114 + *** 00004b 8b fb mov di,bx + *** 00004d 2a e4 sub ah,ah + *** 00004f 8a 05 mov al,BYTE PTR [di] + *** 000051 ba f8 03 mov dx,1016 ;03f8H + *** 000054 ee out dx, al + +;|*** } +; Line 115 + *** 000055 83 c3 02 add bx,2 + *** 000058 83 3f 00 cmp WORD PTR [bx],0 + *** 00005b 75 e3 jne $FC339 +;|*** } +; Line 116 + $EX337: + *** 00005d 5f pop di + *** 00005e c9 leave + *** 00005f c3 ret + +_OEMWriteDebugString ENDP + PUBLIC _OEMWriteDebugByte +_OEMWriteDebugByte PROC NEAR +;|*** +;|*** void OEMWriteDebugByte(BYTE ucChar) +;|*** { +; Line 119 + *** 000060 55 push bp + *** 000061 8b ec mov bp,sp +; ucChar = 4 +;|*** while (!(READ_PORT_UCHAR(IoPortBase+comLineStatus) & LS_THR_EMPTY)) +; Line 120 + $L408: + *** 000063 ba fd 03 mov dx,1021 ;03fdH + *** 000066 ec in al,dx + *** 000067 a8 20 test al,32 ;0020H + *** 000069 74 f8 je $L408 +;|*** { +;|*** ; +;|*** } +;|*** +;|*** WRITE_PORT_UCHAR(IoPortBase+comTxBuffer, ucChar); +; Line 125 + *** 00006b 8a 46 04 mov al,BYTE PTR [bp+4] ;ucChar + *** 00006e 2a e4 sub ah,ah + *** 000070 ba f8 03 mov dx,1016 ;03f8H + *** 000073 ee out dx, al + +;|*** } +; Line 126 + *** 000074 c9 leave + *** 000075 c3 ret + +_OEMWriteDebugByte ENDP + PUBLIC _OEMReadDebugBytes +_OEMReadDebugBytes PROC NEAR +;|*** +;|*** int iComTotal=0; +;|*** void OEMReadDebugBytes(unsigned char * ucBuffer, int usReadSize) { +; Line 129 + *** 000076 c8 04 00 00 enter 4,0 + *** 00007a 57 push di +; ucBuffer = 4 +; usReadSize = 6 +; i = -4 +; uStat = -1 +;|*** int i=0; +; Line 130 + *** 00007b 33 db xor bx,bx + *** 00007d 8b 4e 06 mov cx,WORD PTR [bp+6] ;usReadSize + *** 000080 8b 7e 04 mov di,WORD PTR [bp+4] ;ucBuffer +;|*** unsigned char uStat; +;|*** +;|*** while (usReadSize--) { +; Line 133 + $FC361: + *** 000083 8b c1 mov ax,cx + *** 000085 49 dec cx + *** 000086 0b c0 or ax,ax + *** 000088 74 38 je $EX357 + *** 00008a 89 4e 06 mov WORD PTR [bp+6],cx ;usReadSize +;|*** do { +;|*** uStat=READ_PORT_UCHAR(IoPortBase+comLineStatus); +; Line 135 + $L414: +;|*** if (uStat & LS_RX_ERRORS) { +; Line 136 + *** 00008d ba fd 03 mov dx,1021 ;03fdH + *** 000090 ec in al,dx + *** 000091 88 46 ff mov BYTE PTR [bp-1],al ;uStat + *** 000094 a8 0e test al,14 ;000eH + *** 000096 75 14 jne $L420 +;|*** while (1) +;|*** printf("port status error=%xh i=%u\r",uStat,iComTotal); +;|*** } +;|*** } while (!(uStat&LS_RX_DATA_READY)); +; Line 140 + *** 000098 f6 46 ff 01 test BYTE PTR [bp-1],1 ;uStat + *** 00009c 74 ef je $L414 +;|*** ucBuffer[i++]=READ_PORT_UCHAR(IoPortBase+comRxBuffer); +; Line 141 + *** 00009e ba f8 03 mov dx,1016 ;03f8H + *** 0000a1 ec in al,dx + *** 0000a2 88 01 mov BYTE PTR [bx][di],al + *** 0000a4 43 inc bx +;|*** iComTotal++; +; Line 142 + *** 0000a5 ff 06 00 00 inc WORD PTR _iComTotal +;|*** } +; Line 143 + *** 0000a9 eb d8 jmp SHORT $FC361 + *** 0000ab 90 nop + $L420: +;|*** printf("port status error=%xh i=%u\r",uStat,iComTotal); +; Line 138 + *** 0000ac ff 36 00 00 push WORD PTR _iComTotal + *** 0000b0 8a 46 ff mov al,BYTE PTR [bp-1] ;uStat + *** 0000b3 2a e4 sub ah,ah + *** 0000b5 50 push ax + *** 0000b6 68 00 00 push OFFSET DGROUP:$SG370 + *** 0000b9 e8 00 00 call _printf + *** 0000bc 83 c4 06 add sp,6 + *** 0000bf eb eb jmp SHORT $L420 + *** 0000c1 90 nop +;|*** } +;|*** } while (!(uStat&LS_RX_DATA_READY)); +;|*** ucBuffer[i++]=READ_PORT_UCHAR(IoPortBase+comRxBuffer); +;|*** iComTotal++; +;|*** } +;|*** } +; Line 144 + $EX357: + *** 0000c2 5f pop di + *** 0000c3 c9 leave + *** 0000c4 c3 ret + *** 0000c5 90 nop + +_OEMReadDebugBytes ENDP + PUBLIC _OEMReadDebugByte +_OEMReadDebugByte PROC NEAR +;|*** +;|*** int OEMReadDebugByte(void) +;|*** { +; Line 147 + *** 0000c6 c8 02 00 00 enter 2,0 +; i = -2 +;|*** int i; +;|*** OEMReadDebugBytes((unsigned char *)&i,1); +; Line 149 + *** 0000ca 6a 01 push 1 + *** 0000cc 8d 46 fe lea ax,WORD PTR [bp-2] ;i + *** 0000cf 50 push ax + *** 0000d0 e8 a3 ff call _OEMReadDebugBytes +;|*** return i; +; Line 150 + *** 0000d3 8b 46 fe mov ax,WORD PTR [bp-2] ;i +;|*** } +; Line 151 + *** 0000d6 c9 leave + *** 0000d7 c3 ret + +_OEMReadDebugByte ENDP + PUBLIC _OEMClearDebugCommError +_OEMClearDebugCommError PROC NEAR +;|*** +;|*** +;|*** /***************************************************************************** +;|*** * +;|*** * +;|*** * @func void | OEMClearDebugComError | Clear a debug communications er +;|*** or +;|*** * +;|*** */ +;|*** void +;|*** OEMClearDebugCommError( +;|*** void +;|*** ) +;|*** { +;|*** } +; Line 166 + *** 0000d8 c3 ret + *** 0000d9 90 nop + +_OEMClearDebugCommError ENDP +_TEXT ENDS +END diff --git a/DOS/LOADCEPC/debug.obj b/DOS/LOADCEPC/debug.obj new file mode 100644 index 0000000000000000000000000000000000000000..bbaaddc5c65b3a56e9ba9201071b4062e5721a8c GIT binary patch literal 2235 zcmZ`)ZETZO6n^ge)sJoLU75@fghI9$#vHg!m>I5H9q0#eUyH^RoeN!xRud+t5Y zea^Y3yDcyULz`mlrGe472|&Ha?(B?PfR88^IkzUnG(mBhbfr@O)9m3$75N2HIXu+X!i z-r=tEDAg_pnWn-*?}kQKdP>IP!zR3R8KT5iaBDtfh27*9U@|dl#xh%&>4*gj*9w3& zi(Te+J_E9I*sP;w2q`forG)1G96)4(z(naq=3-~}_rcS1_@_@4dLn7z@*p3pVJ#h&*&b~KVAye6agog^M8yc2ix}qYRw&X&>EY<3( zTDPXD-qqmsWDyXB5)Ho*^6A+$>0+jCzi(?es`Diql(w!&)Tdi$Vu$3|;B|E+C4TxV zMj_-LI-T;#?xmnAu>emYpWaE)nZa!yI<+iW$-U3)#^7CXEGeMqEezfk$I8zR{v(c^ zVHmtaKVo`y0;9=2acn5@Rlkg3b2D4n_avR!LZN&xp%r=XqX3&QA3+qM4NK6DGFmOi z)5dbh8_6t%%msKbD#+q4^ej}^9xbst3N3bMyD)U6 zZvk!If(pEb=g|QtG^{1@o1o)WI@*U5#tO)%$y_>(ehI0+m~gZ<7JvmXNxP>;D!$5DUl_X6S3s`YNbT(i z;7y{ui)aEdc#LNt|4HUk(@4&Nhhrlc6Xt;uMz<7fx|r(gN0v^HjU* zzcd_>TWBGVA}b`0H5TPBgI5vtJkFb$V*y93tu3UP3AmTiz{1&NrBZgtF^}%o4<+4T zJ5l~~Z-dgiOX~f)HtVcjxvxRtcZ}DhPR@$u|6P+}`c1m$jW~0rsApauO{A6sJvFJ~ ztBsq1Yrx)N<@)smWi9bVzlwKOH%r4Sj|dnp9~dqf*x9#~g6=^#-o{S6i@k{B0QTcB zeILU?e1i9I3OzWD1im3XzC|GyZ7JPtx@e8`TB#4v$j*p1wHKVqh^8#$q8*(O?K57N z=Ww3-?01F=d4zDT$NjV(A0=&I7qNvMsJY*G?L?}#=Kh5tTRNTZ;~YM~MI6Ep_z;&U z=#RK*R6ssPCzMP}r;Tb(O*6|;p;9`hFe}awGub(@OB2LiPby%e7)q4(Wf7lGF-rS? zg2i|N@@4WVn-+pDFfr&=&Y=)9bYfm52Q$IU3k;IaM!WJL&~czvW}f`#uuVW3EDyTu z@qRN#3I;}`X7+h<5fvPbu85}Fqf{xes6E76{i>qvo9*FMMX?+V8gr@eXz;_WRL*va zBm(1fEedF7R?^v?UT3P6Fo7^TZjE!C{3wE`a$h`z0dg8+)HNpk7)%qGo#JHnGFTp* zsXeq`Ko;RRhTA3Avfnko8bAAKwT`P$YYrOI9q<91eye^^ssGgHZ%}_K}W8 zlHk^O1{07&Ps$$)R)@R8(TFyQi^z=y8lAPyNM~EP-MgbJG;TZ&`B}P}O7aLq$WmFl OY+1lg?+{(CQjCn#H-lO zwiQ$@2!Rmr3&$^@s)u^+Znx@RLJ^4T2S5mZ;1Htx1pHv;%_bo$Dn%c8zVFSO@$<|C zIB-yRR}bn_sD71vrBQn}vC> z{U}_Z=N8yr2Ol>8+=%T`MYRuTCa}6Y7d6Lgz{abKUZ?Ia2IKRE5I16e4e?aj`^jE{o@2MX0EH(Yp#UsnNPjMBfU?d?Ed$>Q ziA`w$uouEE@QHy{>!91gy_O3}z8%CegA(du{1i&7);CDk%_+}6-5PMiMsqjb0C(jOIHrhI; zJUOXrPSRgvJ*O49c)+6|=0T`TXm|#HjJo?;T&&nu!L+qf*_sCaIH^~qY96xlW~QW1 z?X@-21U^nntNo>N218G;tzZM=pt#asF>q9v`=_XFQC{iGxr~*u z!>mxVqPi5TMrp#%W-53=J80vjxaPO5!`Z0OaB%?aB=MpY&7ru9#0yf)c|9-iyG4Hy z_->NVkH`hDiKFRh($7g%nZxU&5( zE%lOLciY2-G%cJOI8;I>i~`^)$tPpoFXK1O(!|PBWfhp6G578-X;W5Zt)$i|sRHAB z`?VC+4tRCfmjQtnhN9}X<)Og!p_Fx^djB$jPY&g>s$-%JuW21wkVA1FB*ZM}EbIGW zrrQj#R1Q&nO)^6(=^Zc3$+=%~yPng6)Fe~*G`cV-vZzK5e1_~2t1nh?$^);0C^1oF z9D6g*#K~AJ#o|oN?Gf`rEOf?aN0jq1cSg*!F`pYT(Y-!mo{Q!19v*%=mVNOey)EWj0@LxpXFM%-dO>ju02ML~v#kE*T^6tpFmtx$O#D3|4*opfW zDZ}rUSm-pH`4tp{8joO4dwxVjUJmUl2r)&br3bCC>-Zpla0PR zf0LBuSX_<8YAmkA3V#a({tMzhTju#TJ+8$39S{x^jS=^YF@G0m7k-8JDEHuhxkDR literal 0 HcmV?d00001 diff --git a/DOS/LOADCEPC/ethernet.h b/DOS/LOADCEPC/ethernet.h new file mode 100644 index 0000000..5c66aac --- /dev/null +++ b/DOS/LOADCEPC/ethernet.h @@ -0,0 +1,57 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// +// Use of this sample source code is subject to the terms of the Microsoft +// license agreement under which you licensed this sample source code. If +// you did not accept the terms of the license agreement, you are not +// authorized to use this sample source code. For the terms of the license, +// please see the license agreement between you and Microsoft or, if applicable, +// see the LICENSE.RTF on your install media or the root of your tools installation. +// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +// +/*++ +THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +PARTICULAR PURPOSE. + +Module Name: + +Abstract: + +Functions: + + +Notes: + +--*/ +#ifndef _ETHERNET_H +#define _ETHERNET_H 1 + + +/* + * Addressing info struct. We don't ARP for unknown ethernet addresses, so + * even the ethernet address must be configured. + */ +typedef struct _EDBG_ADDR { + DWORD dwIP; + USHORT wMAC[3]; + USHORT wPort; + +} EDBG_ADDR; + + +#define EDBG_SYSINTR_NOINTR 0xFFFFFFFF + +// The following defs can be used for platforms which support multiple adapter types. +// Identifiers are provided here for drivers which are built in common\oak\drivers\ethdbg. +// Any platform specific adapter types can be identified based off of EDBG_ADAPTER_OEM. +#define EDBG_ADAPTER_SMC9000 0 +#define EDBG_ADAPTER_NE2000 1 +#define EDBG_ADAPTER_DEFAULT 2 + +#define EDBG_ADAPTER_OEM 16 + + +#endif // _ETHERNET_H diff --git a/DOS/LOADCEPC/ethmain.c b/DOS/LOADCEPC/ethmain.c new file mode 100644 index 0000000..f3b20e5 --- /dev/null +++ b/DOS/LOADCEPC/ethmain.c @@ -0,0 +1,277 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// +// Use of this sample source code is subject to the terms of the Microsoft +// license agreement under which you licensed this sample source code. If +// you did not accept the terms of the license agreement, you are not +// authorized to use this sample source code. For the terms of the license, +// please see the license agreement between you and Microsoft or, if applicable, +// see the LICENSE.RTF on your install media or the root of your tools installation. +// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +// +/*++ +THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +PARTICULAR PURPOSE. + +Module Name: + +Abstract: + Loadcepc Ethernet routines. + +Functions: + + +Notes: + +--*/ + + +#include +#include +#include +#include +#include +#include + + +#include "loadcepc.h" +#include "smchw.h" +#include "wdm.h" + +#include "ethernet.h" +#include "bootarg.h" + +BOOT_ARGS BootArgs; + +// The base address for the card +static BYTE volatile *pbEthernetBase; +#define ReadWord( wOffset ) _inpw((USHORT)(pbEthernetBase + wOffset)) +#define WriteWord( wOffset, Value ) _outpw((USHORT)(pbEthernetBase + wOffset), (USHORT)Value) + + +WORD +hex_atoi(char * hexstr) +{ + WORD wRet = 0; + while (*hexstr) { + wRet <<= 4; + switch (*hexstr) { + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + wRet += (WORD)(*hexstr - '0'); + break; + + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + wRet += (WORD)(*hexstr - 'a'); + wRet += 10; + break; + + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + wRet += (WORD)(*hexstr - 'A'); + wRet += 10; + break; + } + hexstr++; + } + return wRet; +} // hex_atoi + + +// This routine will take a dotted decimal IP address as represent here and return a binary version of it +DWORD inet_addr( char *pszDottedD ) { + + DWORD dwIP = 0; + DWORD cBytes; + char *pszLastNum; + + // Replace the dots with NULL terminators + pszLastNum = pszDottedD; + for( cBytes = 0; cBytes < 4; cBytes++ ) { + while(*pszDottedD != '.' && *pszDottedD != '\0') + pszDottedD++; + if (*pszDottedD == '\0' && cBytes != 3) + return 0; + *pszDottedD = '\0'; + dwIP |= (atol(pszLastNum) & 0xFF) << (8*cBytes); + pszLastNum = ++pszDottedD; + } + + return dwIP; + +} // inet_ntoa() + + +// +// Function to extract the device name from the command line. +// +// Expect argstr = "/N:name +// +// Return FALSE for failure +// +BOOL +ParseDeviceName(char * argstr) +{ + UCHAR *pStart = NULL; + UCHAR *pEnd = NULL; + + if (argstr == NULL) + return(FALSE); + + pStart = (argstr + 2); + while ((*pStart == ':') || (*pStart == '"')) + { + if (*pStart == '\0') + return(FALSE); + + ++pStart; + } + + pEnd = pStart; + while ((*pEnd != '"') && (*pEnd != '\0')) + { + ++pEnd; + } + *pEnd = '\0'; + + if (pStart == pEnd) + return(FALSE); + + // Leave enough room for two character Ethernet controller type and + // a numeric value derived from the MAC address, hence the 7. + // + strncpy(BootArgs.szDeviceNameRoot, pStart, (MAX_DEV_NAMELEN - 7)); + + return(TRUE); +} + + +// +// Function to extract the debug ethernet adapter options from the command line +// +// Expect argstr = "/E:::" +// +// Return FALSE for failure +// +BOOL +ParseEthernetOptions(char * argstr) +{ + BOOL bRet; + char * begin; + char * end; + char endch; + BYTE *pBase = NULL; + UCHAR ucIRQ = 0; + int a; // argument counter 0 = I/O Base Address, 1 = IRQ, etc. + + bRet = FALSE; + + if (strlen(argstr) < 6) { // "/E:0:1" or "/K:0:1" at minimum. + goto peo_exit; + } + + // If the user wishes to use an RNDIS adapter, check for that here. + // otherwise, just set it to default and let xBoot.bin change it if necessary. + if (tolower(*(argstr + 1)) == 'k') + BootArgs.ucEdbgAdapterType = 'R'; + else + BootArgs.ucEdbgAdapterType = EDBG_ADAPTER_DEFAULT; + + end = argstr + 2; + + // + // Extract the I/O Base address and IRQ from the command line + // (and super secret EDBG debug zone mask) + // + for (a = 0; a < 4; a++) { + begin = end; + // + // Colon delimited list + // + if (*begin != ':') { + break; + } + begin++; // skip colon + end = begin; + while ((*end) && (*end != ':') && (*end != ' ')) { + end++; + } + + if (begin == end) { + break; + } + + endch = *end; + *end = 0; // temporarily zero terminate the option string + + switch (a) { + case 0: // I/O base address + pBase = (BYTE *)hex_atoi(begin); + break; + + case 1: // IRQ + ucIRQ = (UCHAR)hex_atoi(begin); + if (ucIRQ >= 0x10) // check for decimal value instead of hex value + { + ucIRQ -= 6; + } + break; + + case 2: // IP address + if ((BootArgs.EdbgAddr.dwIP = inet_addr(begin)) != 0) { + printf("Using IP address %u.%u.%u.%u\n", + (BYTE)(BootArgs.EdbgAddr.dwIP), + (BYTE)(BootArgs.EdbgAddr.dwIP >> 8), + (BYTE)(BootArgs.EdbgAddr.dwIP >> 16), + (BYTE)(BootArgs.EdbgAddr.dwIP >> 24)); + } + else + printf("Invalid IP address %s\n",begin); + break; + + case 3: // EDBG Debug zone mask (defined in oak\inc\ethdbg.h) + BootArgs.dwEdbgDebugZone = (DWORD)hex_atoi(begin); + BootArgs.dwEdbgDebugZone |= 0x10000; // Add DHCP zones + printf("Using debug zone mask 0x%X\n",BootArgs.dwEdbgDebugZone); + break; + + default: // error! + goto peo_exit; + } + + *end = endch; // un-zero-terminate if need be. + } + + if (a < 2) { + goto peo_exit; + } + + BootArgs.ucEdbgIRQ = ucIRQ; + // WARNING - must mask off high bits + BootArgs.dwEdbgBaseAddr = (DWORD)pBase & 0xFFFF; + BootArgs.ucLoaderFlags |= LDRFL_USE_EDBG; + printf("Debug network card at I/O port 0x%x, IRQ 0x%x\n", pBase, ucIRQ); + bRet = TRUE; + +peo_exit: + return bRet; +} // ParseEthernetOptions diff --git a/DOS/LOADCEPC/ethmain.cod b/DOS/LOADCEPC/ethmain.cod new file mode 100644 index 0000000..ec468aa --- /dev/null +++ b/DOS/LOADCEPC/ethmain.cod @@ -0,0 +1,894 @@ +; Static Name Aliases +; +; $S477_pbEthernetBase EQU pbEthernetBase + TITLE ethmain.c + .286p + .287 +INCLUDELIB SLIBCE +INCLUDELIB OLDNAMES.LIB +_TEXT SEGMENT WORD PUBLIC 'CODE' +_TEXT ENDS +_DATA SEGMENT WORD PUBLIC 'DATA' +_DATA ENDS +CONST SEGMENT WORD PUBLIC 'CONST' +CONST ENDS +_BSS SEGMENT WORD PUBLIC 'BSS' +_BSS ENDS +$$SYMBOLS SEGMENT BYTE PUBLIC 'DEBSYM' +$$SYMBOLS ENDS +$$TYPES SEGMENT BYTE PUBLIC 'DEBTYP' +$$TYPES ENDS +DGROUP GROUP CONST, _BSS, _DATA + ASSUME DS: DGROUP, SS: DGROUP +EXTRN _atol:NEAR +EXTRN _printf:NEAR +EXTRN _strncpy:NEAR +EXTRN _tolower:NEAR +_BSS SEGMENT +COMM NEAR _BootArgs: BYTE: 170 +_BSS ENDS +_DATA SEGMENT +$SG555 DB 'Using IP address %u.%u.%u.%u', 0aH, 00H +$SG557 DB 'Invalid IP address %s', 0aH, 00H +$SG559 DB 'Using debug zone mask 0x%X', 0aH, 00H +$SG562 DB 'Debug network card at I/O port 0x%x, IRQ 0x%x', 0aH, 00H +_DATA ENDS +_BSS SEGMENT +$S477_pbEthernetBase DW 01H DUP (?) +_BSS ENDS +_TEXT SEGMENT + ASSUME CS: _TEXT + PUBLIC _hex_atoi +_hex_atoi PROC NEAR +;|*** // +;|*** // Copyright (c) Microsoft Corporation. All rights reserved. +;|*** // +;|*** // +;|*** // Use of this sample source code is subject to the terms of the Microsoft +;|*** // license agreement under which you licensed this sample source code. If +;|*** // you did not accept the terms of the license agreement, you are not +;|*** // authorized to use this sample source code. For the terms of the license, +;|*** // please see the license agreement between you and Microsoft or, if applicable, +;|*** // see the LICENSE.RTF on your install media or the root of your tools installation. +;|*** // THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +;|*** // +;|*** /*++ +;|*** THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +;|*** ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +;|*** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +;|*** PARTICULAR PURPOSE. +;|*** +;|*** Module Name: +;|*** +;|*** Abstract: +;|*** Loadcepc Ethernet routines. +;|*** +;|*** Functions: +;|*** +;|*** +;|*** Notes: +;|*** +;|*** --*/ +;|*** +;|*** +;|*** #include +;|*** #include +;|*** #include +;|*** #include +;|*** #include +;|*** #include +;|*** +;|*** +;|*** #include "loadcepc.h" +;|*** #include "smchw.h" +;|*** #include "wdm.h" +;|*** +;|*** #include "ethernet.h" +;|*** #include "bootarg.h" +;|*** +;|*** BOOT_ARGS BootArgs; +;|*** +;|*** // The base address for the card +;|*** static BYTE volatile *pbEthernetBase; +;|*** #define ReadWord( wOffset ) _inpw((USHORT)(pbEthernetBase + wOffset)) +;|*** #define WriteWord( wOffset, Value ) _outpw((USHORT)(pbEthernetBase + wOffset), (USHORT)Value) +;|*** +;|*** +;|*** WORD +;|*** hex_atoi(char * hexstr) +;|*** { +; Line 57 + *** 000000 c8 02 00 00 enter 2,0 + *** 000004 57 push di + *** 000005 56 push si +; hexstr = 4 +; register di = wRet + *** 000006 8b 76 04 mov si,WORD PTR [bp+4] ;hexstr +;|*** WORD wRet = 0; +; Line 58 + *** 000009 33 ff xor di,di +;|*** while (*hexstr) { +; Line 59 + *** 00000b 80 3c 00 cmp BYTE PTR [si],0 + *** 00000e 74 4a je $FB485 + $FC484: +;|*** wRet <<= 4; +; Line 60 + *** 000010 c1 e7 04 shl di,4 +;|*** switch (*hexstr) { +; Line 61 + *** 000013 8a 04 mov al,BYTE PTR [si] + *** 000015 98 cbw + *** 000016 89 46 fe mov WORD PTR [bp-2],ax +;|*** case '1': +;|*** case '2': +;|*** case '3': +;|*** case '4': +;|*** case '5': +;|*** case '6': +;|*** case '7': +;|*** case '8': +;|*** case '9': +;|*** wRet += (WORD)(*hexstr - '0'); +;|*** break; +;|*** +;|*** case 'a': +;|*** case 'b': +;|*** case 'c': +;|*** case 'd': +;|*** case 'e': +;|*** case 'f': +;|*** wRet += (WORD)(*hexstr - 'a'); +;|*** wRet += 10; +;|*** break; +;|*** +;|*** case 'A': +;|*** case 'B': +;|*** case 'C': +;|*** case 'D': +;|*** case 'E': +;|*** case 'F': +;|*** wRet += (WORD)(*hexstr - 'A'); +;|*** wRet += 10; +;|*** break; +;|*** } +; Line 93 + *** 000019 2d 31 00 sub ax,49 ;0031H + *** 00001c 7c 36 jl $SB487 + *** 00001e 70 34 jo $SB487 + *** 000020 2d 08 00 sub ax,8 + *** 000023 7e 17 jle $SC490 + *** 000025 2d 08 00 sub ax,8 + *** 000028 7c 2a jl $SB487 + *** 00002a 2d 05 00 sub ax,5 + *** 00002d 7e 15 jle $SC492 + *** 00002f 2d 1b 00 sub ax,27 ;001bH + *** 000032 7c 20 jl $SB487 + *** 000034 2d 05 00 sub ax,5 + *** 000037 7e 13 jle $SC491 + *** 000039 eb 19 jmp SHORT $SB487 + *** 00003b 90 nop +;|*** case '1': +; Line 62 + $SC490: +;|*** case '2': +;|*** case '3': +;|*** case '4': +;|*** case '5': +;|*** case '6': +;|*** case '7': +;|*** case '8': +;|*** case '9': +;|*** wRet += (WORD)(*hexstr - '0'); +; Line 71 + *** 00003c 8b 46 fe mov ax,WORD PTR [bp-2] + *** 00003f 2d 30 00 sub ax,48 ;0030H + *** 000042 eb 0e jmp SHORT $L586 +;|*** break; +;|*** +;|*** case 'a': +;|*** case 'b': +;|*** case 'c': +;|*** case 'd': +;|*** case 'e': +;|*** case 'f': +;|*** wRet += (WORD)(*hexstr - 'a'); +;|*** wRet += 10; +;|*** break; +;|*** +;|*** case 'A': +; Line 84 + $SC492: +;|*** case 'B': +;|*** case 'C': +;|*** case 'D': +;|*** case 'E': +;|*** case 'F': +;|*** wRet += (WORD)(*hexstr - 'A'); +;|*** wRet += 10; +; Line 91 + *** 000044 8b 46 fe mov ax,WORD PTR [bp-2] + *** 000047 2d 37 00 sub ax,55 ;0037H + *** 00004a eb 06 jmp SHORT $L586 +;|*** case 'a': +; Line 74 + $SC491: +;|*** case 'b': +;|*** case 'c': +;|*** case 'd': +;|*** case 'e': +;|*** case 'f': +;|*** wRet += (WORD)(*hexstr - 'a'); +;|*** wRet += 10; +; Line 81 + *** 00004c 8b 46 fe mov ax,WORD PTR [bp-2] + *** 00004f 2d 57 00 sub ax,87 ;0057H + $L586: + *** 000052 03 f8 add di,ax +;|*** break; +;|*** +;|*** case 'A': +;|*** case 'B': +;|*** case 'C': +;|*** case 'D': +;|*** case 'E': +;|*** case 'F': +;|*** wRet += (WORD)(*hexstr - 'A'); +;|*** wRet += 10; +;|*** break; +;|*** } +; Line 93 + $SB487: +;|*** hexstr++; +;|*** } +; Line 95 + *** 000054 46 inc si + *** 000055 80 3c 00 cmp BYTE PTR [si],0 + *** 000058 75 b6 jne $FC484 + $FB485: +;|*** return wRet; +; Line 96 + *** 00005a 8b c7 mov ax,di +;|*** } // hex_atoi +; Line 97 + *** 00005c 5e pop si + *** 00005d 5f pop di + *** 00005e c9 leave + *** 00005f c3 ret + +_hex_atoi ENDP + PUBLIC _inet_addr +_inet_addr PROC NEAR +;|*** +;|*** +;|*** // This routine will take a dotted decimal IP address as represent here and return a binary version of it +;|*** DWORD inet_addr( char *pszDottedD ) { +; Line 101 + *** 000060 c8 0a 00 00 enter 10,0 + *** 000064 57 push di + *** 000065 56 push si +; pszDottedD = 4 +; dwIP = -8 +; cBytes = -4 +; pszLastNum = -10 + *** 000066 8b 76 04 mov si,WORD PTR [bp+4] ;pszDottedD +;|*** +;|*** DWORD dwIP = 0; +; Line 103 + *** 000069 2b c0 sub ax,ax + *** 00006b 89 46 fa mov WORD PTR [bp-6],ax + *** 00006e 89 46 f8 mov WORD PTR [bp-8],ax ;dwIP +;|*** DWORD cBytes; +;|*** char *pszLastNum; +;|*** +;|*** // Replace the dots with NULL terminators +;|*** pszLastNum = pszDottedD; +; Line 108 + *** 000071 8b fe mov di,si +;|*** for( cBytes = 0; cBytes < 4; cBytes++ ) { +; Line 109 + *** 000073 89 46 fe mov WORD PTR [bp-2],ax + *** 000076 89 46 fc mov WORD PTR [bp-4],ax ;cBytes + $F500: + *** 000079 83 7e fe 00 cmp WORD PTR [bp-2],0 + *** 00007d 75 5b jne $L567 + *** 00007f 83 7e fc 04 cmp WORD PTR [bp-4],4 ;cBytes + *** 000083 73 55 jae $L567 +;|*** while(*pszDottedD != '.' && *pszDottedD != '\0') +; Line 110 + *** 000085 80 3c 2e cmp BYTE PTR [si],46 ;002eH + *** 000088 74 0b je $FB505 + $FC504: + *** 00008a 80 3c 00 cmp BYTE PTR [si],0 + *** 00008d 74 06 je $FB505 +;|*** pszDottedD++; +; Line 111 + *** 00008f 46 inc si + *** 000090 80 3c 2e cmp BYTE PTR [si],46 ;002eH + *** 000093 75 f5 jne $FC504 + $FB505: +;|*** if (*pszDottedD == '\0' && cBytes != 3) +; Line 112 + *** 000095 80 3c 00 cmp BYTE PTR [si],0 + *** 000098 75 0c jne $I506 + *** 00009a 83 7e fc 03 cmp WORD PTR [bp-4],3 ;cBytes + *** 00009e 75 44 jne $L568 + *** 0000a0 83 7e fe 00 cmp WORD PTR [bp-2],0 + *** 0000a4 75 3e jne $L568 +;|*** return 0; +;|*** *pszDottedD = '\0'; +; Line 114 + $I506: + *** 0000a6 c6 04 00 mov BYTE PTR [si],0 +;|*** dwIP |= (atol(pszLastNum) & 0xFF) << (8*cBytes); +; Line 115 + *** 0000a9 57 push di + *** 0000aa e8 00 00 call _atol + *** 0000ad 83 c4 02 add sp,2 + *** 0000b0 2a e4 sub ah,ah + *** 0000b2 2b d2 sub dx,dx + *** 0000b4 8a 4e fc mov cl,BYTE PTR [bp-4] ;cBytes + *** 0000b7 c0 e1 03 shl cl,3 + *** 0000ba 0a c9 or cl,cl + *** 0000bc 74 08 je $L573 + $L572: + *** 0000be 03 c0 add ax,ax + *** 0000c0 13 d2 adc dx,dx + *** 0000c2 fe c9 dec cl + *** 0000c4 75 f8 jne $L572 + $L573: + *** 0000c6 09 46 f8 or WORD PTR [bp-8],ax ;dwIP + *** 0000c9 09 56 fa or WORD PTR [bp-6],dx +;|*** pszLastNum = ++pszDottedD; +; Line 116 + *** 0000cc 46 inc si + *** 0000cd 8b fe mov di,si +;|*** for( cBytes = 0; cBytes < 4; cBytes++ ) { +; Line 109 + *** 0000cf 83 46 fc 01 add WORD PTR [bp-4],1 ;cBytes + *** 0000d3 83 56 fe 00 adc WORD PTR [bp-2],0 + *** 0000d7 eb a0 jmp SHORT $F500 + *** 0000d9 90 nop + $L567: +;|*** while(*pszDottedD != '.' && *pszDottedD != '\0') +;|*** pszDottedD++; +;|*** if (*pszDottedD == '\0' && cBytes != 3) +;|*** return 0; +;|*** *pszDottedD = '\0'; +;|*** dwIP |= (atol(pszLastNum) & 0xFF) << (8*cBytes); +;|*** pszLastNum = ++pszDottedD; +;|*** } +;|*** +;|*** return dwIP; +; Line 119 + *** 0000da 8b 46 f8 mov ax,WORD PTR [bp-8] ;dwIP + *** 0000dd 8b 56 fa mov dx,WORD PTR [bp-6] + *** 0000e0 5e pop si + *** 0000e1 5f pop di + *** 0000e2 c9 leave + *** 0000e3 c3 ret + $L568: +;|*** return 0; +; Line 113 + *** 0000e4 33 c0 xor ax,ax + *** 0000e6 99 cwd +;|*** *pszDottedD = '\0'; +;|*** dwIP |= (atol(pszLastNum) & 0xFF) << (8*cBytes); +;|*** pszLastNum = ++pszDottedD; +;|*** } +;|*** +;|*** return dwIP; +;|*** +;|*** } // inet_ntoa() +; Line 121 + *** 0000e7 5e pop si + *** 0000e8 5f pop di + *** 0000e9 c9 leave + *** 0000ea c3 ret + *** 0000eb 90 nop + +_inet_addr ENDP + PUBLIC _ParseDeviceName +_ParseDeviceName PROC NEAR +;|*** +;|*** +;|*** // +;|*** // Function to extract the device name from the command line. +;|*** // +;|*** // Expect argstr = "/N:name +;|*** // +;|*** // Return FALSE for failure +;|*** // +;|*** BOOL +;|*** ParseDeviceName(char * argstr) +;|*** { +; Line 133 + *** 0000ec c8 02 00 00 enter 2,0 + *** 0000f0 56 push si +; register bx = pEnd +; argstr = 4 +; pStart = -2 + *** 0000f1 8b 56 04 mov dx,WORD PTR [bp+4] ;argstr +;|*** UCHAR *pStart = NULL; +;|*** UCHAR *pEnd = NULL; +;|*** +;|*** if (argstr == NULL) +; Line 137 + *** 0000f4 0b d2 or dx,dx + *** 0000f6 74 44 je $L577 +;|*** return(FALSE); +;|*** +;|*** pStart = (argstr + 2); +; Line 140 + *** 0000f8 8b f2 mov si,dx + *** 0000fa 83 c6 02 add si,2 +;|*** while ((*pStart == ':') || (*pStart == '"')) +; Line 141 + $FC515: + *** 0000fd 80 3c 3a cmp BYTE PTR [si],58 ;003aH + *** 000100 74 05 je $FB517 + *** 000102 80 3c 22 cmp BYTE PTR [si],34 ;0022H + *** 000105 75 09 jne $L576 + $FB517: +;|*** { +;|*** if (*pStart == '\0') +; Line 143 + *** 000107 80 3c 00 cmp BYTE PTR [si],0 + *** 00010a 74 30 je $L577 +;|*** return(FALSE); +;|*** +;|*** ++pStart; +; Line 146 + *** 00010c 46 inc si +;|*** } +; Line 147 + *** 00010d eb ee jmp SHORT $FC515 + *** 00010f 90 nop + $L576: +;|*** +;|*** pEnd = pStart; +;|*** while ((*pEnd != '"') && (*pEnd != '\0')) +; Line 150 + *** 000110 8b de mov bx,si + *** 000112 80 3f 22 cmp BYTE PTR [bx],34 ;0022H + *** 000115 74 0b je $FB521 + $FC520: + *** 000117 80 3f 00 cmp BYTE PTR [bx],0 + *** 00011a 74 06 je $FB521 +;|*** { +;|*** ++pEnd; +;|*** } +; Line 153 + *** 00011c 43 inc bx + *** 00011d 80 3f 22 cmp BYTE PTR [bx],34 ;0022H + *** 000120 75 f5 jne $FC520 + $FB521: +;|*** *pEnd = '\0'; +; Line 154 + *** 000122 c6 07 00 mov BYTE PTR [bx],0 +;|*** +;|*** if (pStart == pEnd) +; Line 156 + *** 000125 3b de cmp bx,si + *** 000127 74 13 je $L577 +;|*** return(FALSE); +;|*** +;|*** // Leave enough room for two character Ethernet controller type and +;|*** // a numeric value derived from the MAC address, hence the 7. +;|*** // +;|*** strncpy(BootArgs.szDeviceNameRoot, pStart, (MAX_DEV_NAMELEN - 7)); +; Line 162 + *** 000129 6a 09 push 9 + *** 00012b 56 push si + *** 00012c 68 88 00 push OFFSET DGROUP:_BootArgs+136 + *** 00012f e8 00 00 call _strncpy + *** 000132 83 c4 06 add sp,6 +;|*** +;|*** return(TRUE); +; Line 164 + *** 000135 b8 01 00 mov ax,1 + *** 000138 5e pop si + *** 000139 c9 leave + *** 00013a c3 ret + *** 00013b 90 nop + $L577: +;|*** return(FALSE); +; Line 144 + *** 00013c 33 c0 xor ax,ax +;|*** +;|*** ++pStart; +;|*** } +;|*** +;|*** pEnd = pStart; +;|*** while ((*pEnd != '"') && (*pEnd != '\0')) +;|*** { +;|*** ++pEnd; +;|*** } +;|*** *pEnd = '\0'; +;|*** +;|*** if (pStart == pEnd) +;|*** return(FALSE); +;|*** +;|*** // Leave enough room for two character Ethernet controller type and +;|*** // a numeric value derived from the MAC address, hence the 7. +;|*** // +;|*** strncpy(BootArgs.szDeviceNameRoot, pStart, (MAX_DEV_NAMELEN - 7)); +;|*** +;|*** return(TRUE); +;|*** } +; Line 165 + *** 00013e 5e pop si + *** 00013f c9 leave + *** 000140 c3 ret + *** 000141 90 nop + +_ParseDeviceName ENDP + PUBLIC _ParseEthernetOptions +_ParseEthernetOptions PROC NEAR +;|*** +;|*** +;|*** // +;|*** // Function to extract the debug ethernet adapter options from the command line +;|*** // +;|*** // Expect argstr = "/E:::" +;|*** // +;|*** // Return FALSE for failure +;|*** // +;|*** BOOL +;|*** ParseEthernetOptions(char * argstr) +;|*** { +; Line 177 + *** 000142 c8 0c 00 00 enter 12,0 + *** 000146 57 push di + *** 000147 56 push si +; argstr = 4 +; bRet = -10 +; begin = -6 +; end = -2 +; endch = -3 +; pBase = -12 +; ucIRQ = -4 +; a = -8 + *** 000148 8b 76 04 mov si,WORD PTR [bp+4] ;argstr +;|*** BOOL bRet; +;|*** char * begin; +;|*** char * end; +;|*** char endch; +;|*** BYTE *pBase = NULL; +; Line 182 + *** 00014b c7 46 f4 00 00 mov WORD PTR [bp-12],0 ;pBase +;|*** UCHAR ucIRQ = 0; +; Line 183 + *** 000150 c6 46 fc 00 mov BYTE PTR [bp-4],0 ;ucIRQ +;|*** int a; // argument counter 0 = I/O Base Address, 1 = IRQ, etc. +;|*** +;|*** bRet = FALSE; +; Line 186 + *** 000154 c7 46 f6 00 00 mov WORD PTR [bp-10],0 ;bRet +;|*** +;|*** if (strlen(argstr) < 6) { // "/E:0:1" or "/K:0:1" at minimum. +; Line 188 + *** 000159 8b fe mov di,si + *** 00015b 8c d8 mov ax,ds + *** 00015d 8e c0 mov es,ax + *** 00015f b9 ff ff mov cx,-1 ;ffffH + *** 000162 33 c0 xor ax,ax + *** 000164 f2 repnz + *** 000165 ae scasb + *** 000166 f7 d1 not cx + *** 000168 49 dec cx + *** 000169 83 f9 06 cmp cx,6 + *** 00016c 73 03 jae $JCC364 + *** 00016e e9 3f 01 jmp $peo_exit535 + $JCC364: +;|*** goto peo_exit; +;|*** } +;|*** +;|*** // If the user wishes to use an RNDIS adapter, check for that here. +;|*** // otherwise, just set it to default and let xBoot.bin change it if necessary. +;|*** if (tolower(*(argstr + 1)) == 'k') +; Line 194 + *** 000171 8a 44 01 mov al,BYTE PTR [si+1] + *** 000174 98 cbw + *** 000175 50 push ax + *** 000176 e8 00 00 call _tolower + *** 000179 83 c4 02 add sp,2 + *** 00017c 3d 6b 00 cmp ax,107 ;006bH + *** 00017f 75 05 jne $I536 + *** 000181 b0 52 mov al,82 ;0052H + *** 000183 eb 03 jmp SHORT $I537 + *** 000185 90 nop + $I536: + *** 000186 b0 02 mov al,2 + $I537: + *** 000188 a2 0e 00 mov BYTE PTR _BootArgs+14,al +;|*** BootArgs.ucEdbgAdapterType = 'R'; +;|*** else +;|*** BootArgs.ucEdbgAdapterType = EDBG_ADAPTER_DEFAULT; +;|*** +;|*** end = argstr + 2; +; Line 199 + *** 00018b 8d 44 02 lea ax,WORD PTR [si+2] +;|*** +;|*** // +;|*** // Extract the I/O Base address and IRQ from the command line +;|*** // (and super secret EDBG debug zone mask) +;|*** // +;|*** for (a = 0; a < 4; a++) { +; Line 205 + *** 00018e c7 46 f8 00 00 mov WORD PTR [bp-8],0 ;a + *** 000193 8b f0 mov si,ax + $F538: +;|*** begin = end; +;|*** // +;|*** // Colon delimited list +;|*** // +;|*** if (*begin != ':') { +; Line 210 + *** 000195 8b fe mov di,si + *** 000197 80 3d 3a cmp BYTE PTR [di],58 ;003aH + *** 00019a 74 03 je $JCC410 + *** 00019c e9 e1 00 jmp $FB540 + $JCC410: +;|*** break; +;|*** } +;|*** begin++; // skip colon +;|*** end = begin; +; Line 214 + *** 00019f 47 inc di + *** 0001a0 8b f7 mov si,di + *** 0001a2 89 7e fa mov WORD PTR [bp-6],di ;begin +;|*** while ((*end) && (*end != ':') && (*end != ' ')) { +; Line 215 + *** 0001a5 80 3c 00 cmp BYTE PTR [si],0 + *** 0001a8 74 10 je $FB544 + $FC543: + *** 0001aa 80 3c 3a cmp BYTE PTR [si],58 ;003aH + *** 0001ad 74 0b je $FB544 + *** 0001af 80 3c 20 cmp BYTE PTR [si],32 ;0020H + *** 0001b2 74 06 je $FB544 +;|*** end++; +;|*** } +; Line 217 + *** 0001b4 46 inc si + *** 0001b5 80 3c 00 cmp BYTE PTR [si],0 + *** 0001b8 75 f0 jne $FC543 + $FB544: +;|*** +;|*** if (begin == end) { +; Line 219 + *** 0001ba 39 76 fa cmp WORD PTR [bp-6],si ;begin + *** 0001bd 75 03 jne $JCC445 + *** 0001bf e9 be 00 jmp $FB540 + $JCC445: +;|*** break; +;|*** } +;|*** +;|*** endch = *end; +; Line 223 + *** 0001c2 8a 04 mov al,BYTE PTR [si] + *** 0001c4 88 46 fd mov BYTE PTR [bp-3],al ;endch +;|*** *end = 0; // temporarily zero terminate the option string +; Line 224 + *** 0001c7 c6 04 00 mov BYTE PTR [si],0 +;|*** +;|*** switch (a) { +; Line 226 + *** 0001ca 8b 46 f8 mov ax,WORD PTR [bp-8] ;a +;|*** case 0: // I/O base address +;|*** pBase = (BYTE *)hex_atoi(begin); +;|*** break; +;|*** +;|*** case 1: // IRQ +;|*** ucIRQ = (UCHAR)hex_atoi(begin); +;|*** if (ucIRQ >= 0x10) // check for decimal value instead of hex value +;|*** { +;|*** ucIRQ -= 6; +;|*** } +;|*** break; +;|*** +;|*** case 2: // IP address +;|*** if ((BootArgs.EdbgAddr.dwIP = inet_addr(begin)) != 0) { +;|*** printf("Using IP address %u.%u.%u.%u\n", +;|*** (BYTE)(BootArgs.EdbgAddr.dwIP), +;|*** (BYTE)(BootArgs.EdbgAddr.dwIP >> 8), +;|*** (BYTE)(BootArgs.EdbgAddr.dwIP >> 16), +;|*** (BYTE)(BootArgs.EdbgAddr.dwIP >> 24)); +;|*** } +;|*** else +;|*** printf("Invalid IP address %s\n",begin); +;|*** break; +;|*** +;|*** case 3: // EDBG Debug zone mask (defined in oak\inc\ethdbg.h) +;|*** BootArgs.dwEdbgDebugZone = (DWORD)hex_atoi(begin); +;|*** BootArgs.dwEdbgDebugZone |= 0x10000; // Add DHCP zones +;|*** printf("Using debug zone mask 0x%X\n",BootArgs.dwEdbgDebugZone); +;|*** break; +;|*** +;|*** default: // error! +;|*** goto peo_exit; +;|*** } +; Line 259 + *** 0001cd 0b c0 or ax,ax + *** 0001cf 74 0d je $SC550 + *** 0001d1 48 dec ax + *** 0001d2 74 1a je $SC551 + *** 0001d4 48 dec ax + *** 0001d5 74 2d je $SC553 + *** 0001d7 48 dec ax + *** 0001d8 74 70 je $SC558 + *** 0001da e9 d3 00 jmp $peo_exit535 + *** 0001dd 90 nop +;|*** case 0: // I/O base address +; Line 227 + $SC550: +;|*** pBase = (BYTE *)hex_atoi(begin); +; Line 228 + *** 0001de ff 76 fa push WORD PTR [bp-6] ;begin + *** 0001e1 e8 1c fe call _hex_atoi + *** 0001e4 83 c4 02 add sp,2 + *** 0001e7 89 46 f4 mov WORD PTR [bp-12],ax ;pBase +;|*** break; +; Line 229 + *** 0001ea e9 82 00 jmp $SB547 + *** 0001ed 90 nop +;|*** +;|*** case 1: // IRQ +; Line 231 + $SC551: +;|*** ucIRQ = (UCHAR)hex_atoi(begin); +;|*** if (ucIRQ >= 0x10) // check for decimal value instead of hex value +; Line 233 + *** 0001ee ff 76 fa push WORD PTR [bp-6] ;begin + *** 0001f1 e8 0c fe call _hex_atoi + *** 0001f4 83 c4 02 add sp,2 + *** 0001f7 88 46 fc mov BYTE PTR [bp-4],al ;ucIRQ + *** 0001fa 3c 10 cmp al,16 ;0010H + *** 0001fc 72 71 jb $SB547 +;|*** { +;|*** ucIRQ -= 6; +; Line 235 + *** 0001fe 80 6e fc 06 sub BYTE PTR [bp-4],6 ;ucIRQ +;|*** } +;|*** break; +; Line 237 + *** 000202 eb 6b jmp SHORT $SB547 +;|*** +;|*** case 2: // IP address +; Line 239 + $SC553: + *** 000204 8b 7e fa mov di,WORD PTR [bp-6] ;begin +;|*** if ((BootArgs.EdbgAddr.dwIP = inet_addr(begin)) != 0) { +; Line 240 + *** 000207 57 push di + *** 000208 e8 55 fe call _inet_addr + *** 00020b 83 c4 02 add sp,2 + *** 00020e a3 18 00 mov WORD PTR _BootArgs+24,ax + *** 000211 89 16 1a 00 mov WORD PTR _BootArgs+26,dx + *** 000215 8b c2 mov ax,dx + *** 000217 0b 06 18 00 or ax,WORD PTR _BootArgs+24 + *** 00021b 74 21 je $I554 +;|*** printf("Using IP address %u.%u.%u.%u\n", +;|*** (BYTE)(BootArgs.EdbgAddr.dwIP), +;|*** (BYTE)(BootArgs.EdbgAddr.dwIP >> 8), +;|*** (BYTE)(BootArgs.EdbgAddr.dwIP >> 16), +;|*** (BYTE)(BootArgs.EdbgAddr.dwIP >> 24)); +; Line 245 + *** 00021d a0 1b 00 mov al,BYTE PTR _BootArgs+27 + *** 000220 2a e4 sub ah,ah + *** 000222 50 push ax + *** 000223 a0 1a 00 mov al,BYTE PTR _BootArgs+26 + *** 000226 50 push ax + *** 000227 a1 18 00 mov ax,WORD PTR _BootArgs+24 + *** 00022a 8a c4 mov al,ah + *** 00022c 2a e4 sub ah,ah + *** 00022e 50 push ax + *** 00022f a0 18 00 mov al,BYTE PTR _BootArgs+24 + *** 000232 50 push ax + *** 000233 68 00 00 push OFFSET DGROUP:$SG555 + *** 000236 e8 00 00 call _printf + *** 000239 83 c4 0a add sp,10 ;000aH +;|*** } +;|*** else +; Line 247 + *** 00023c eb 31 jmp SHORT $SB547 + $I554: +;|*** printf("Invalid IP address %s\n",begin); +; Line 248 + *** 00023e 57 push di + *** 00023f 68 00 00 push OFFSET DGROUP:$SG557 + *** 000242 e8 00 00 call _printf + *** 000245 83 c4 04 add sp,4 +;|*** break; +; Line 249 + *** 000248 eb 25 jmp SHORT $SB547 +;|*** +;|*** case 3: // EDBG Debug zone mask (defined in oak\inc\ethdbg.h) +; Line 251 + $SC558: +;|*** BootArgs.dwEdbgDebugZone = (DWORD)hex_atoi(begin); +; Line 252 + *** 00024a ff 76 fa push WORD PTR [bp-6] ;begin + *** 00024d e8 b0 fd call _hex_atoi + *** 000250 83 c4 02 add sp,2 + *** 000253 a3 14 00 mov WORD PTR _BootArgs+20,ax + *** 000256 c7 06 16 00 00 00 mov WORD PTR _BootArgs+22,0 +;|*** BootArgs.dwEdbgDebugZone |= 0x10000; // Add DHCP zones +;|*** printf("Using debug zone mask 0x%X\n",BootArgs.dwEdbgDebugZone); +; Line 254 + *** 00025c 80 0e 16 00 01 or BYTE PTR _BootArgs+22,1 + *** 000261 ff 36 16 00 push WORD PTR _BootArgs+22 + *** 000265 50 push ax + *** 000266 68 00 00 push OFFSET DGROUP:$SG559 + *** 000269 e8 00 00 call _printf + *** 00026c 83 c4 06 add sp,6 +;|*** break; +;|*** +;|*** default: // error! +;|*** goto peo_exit; +;|*** } +; Line 259 + $SB547: +;|*** +;|*** *end = endch; // un-zero-terminate if need be. +; Line 261 + *** 00026f 8a 46 fd mov al,BYTE PTR [bp-3] ;endch + *** 000272 88 04 mov BYTE PTR [si],al + *** 000274 ff 46 f8 inc WORD PTR [bp-8] ;a + *** 000277 83 7e f8 04 cmp WORD PTR [bp-8],4 ;a + *** 00027b 7d 03 jge $JCC635 + *** 00027d e9 15 ff jmp $F538 + $JCC635: +;|*** } +; Line 262 + $FB540: +;|*** +;|*** if (a < 2) { +; Line 264 + *** 000280 83 7e f8 02 cmp WORD PTR [bp-8],2 ;a + *** 000284 7c 2a jl $peo_exit535 +;|*** goto peo_exit; +;|*** } +;|*** +;|*** BootArgs.ucEdbgIRQ = ucIRQ; +; Line 268 + *** 000286 8a 46 fc mov al,BYTE PTR [bp-4] ;ucIRQ + *** 000289 a2 0f 00 mov BYTE PTR _BootArgs+15,al +;|*** // WARNING - must mask off high bits +;|*** BootArgs.dwEdbgBaseAddr = (DWORD)pBase & 0xFFFF; +; Line 270 + *** 00028c 8b 4e f4 mov cx,WORD PTR [bp-12] ;pBase + *** 00028f 89 0e 10 00 mov WORD PTR _BootArgs+16,cx + *** 000293 c7 06 12 00 00 00 mov WORD PTR _BootArgs+18,0 +;|*** BootArgs.ucLoaderFlags |= LDRFL_USE_EDBG; +; Line 271 + *** 000299 80 0e 0c 00 01 or BYTE PTR _BootArgs+12,1 +;|*** printf("Debug network card at I/O port 0x%x, IRQ 0x%x\n", pBase, ucIRQ); +; Line 272 + *** 00029e 2a e4 sub ah,ah + *** 0002a0 50 push ax + *** 0002a1 51 push cx + *** 0002a2 68 00 00 push OFFSET DGROUP:$SG562 + *** 0002a5 e8 00 00 call _printf + *** 0002a8 83 c4 06 add sp,6 +;|*** bRet = TRUE; +; Line 273 + *** 0002ab c7 46 f6 01 00 mov WORD PTR [bp-10],1 ;bRet +;|*** +;|*** peo_exit: +; Line 275 + $peo_exit535: +;|*** return bRet; +; Line 276 + *** 0002b0 8b 46 f6 mov ax,WORD PTR [bp-10] ;bRet +;|*** } // ParseEthernetOptions +; Line 277 + *** 0002b3 5e pop si + *** 0002b4 5f pop di + *** 0002b5 c9 leave + *** 0002b6 c3 ret + *** 0002b7 90 nop + +_ParseEthernetOptions ENDP +_TEXT ENDS +END diff --git a/DOS/LOADCEPC/ethmain.obj b/DOS/LOADCEPC/ethmain.obj new file mode 100644 index 0000000000000000000000000000000000000000..7c5d3679d3bcdb1a97d6e1d171959d9c5d0529ce GIT binary patch literal 4173 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�)<>k5?TJMUt&WxYy7_#NyG?w= z?PUj_uh>yj?$-M%=_&a-a_gVW`^-UcE~dWin<*D$Q6k^@Fz03#N$UO_TZE$ADk|fu zrjMVqT@IV4so4N?SQ+eYMQt&_e2hxi@1zx6hV!{MpwLt4_Ejsiw1#M#&ci~&?}CNT zBhMShHly&)sMgw$48>HQlLkNcz(#A~HN?$xd$cu=@d-rM zVwkdjU@UdHAZdcS0Pb}S@V=)wmcY2~~qBYd%4<{8RCW{nsdm<(n#0&e{}7nYx0Lfv1+;yQQkFcEqTA4urwtSxnM>P z?SiddiPTVO`{^@4673Fw88z~C6xS=yWS(I1bCfu`kuR=B`S)0^ICi6O9bby!ZUns# zC3)QNFmzq8yINC<;i6BD7vwkKFmS^~*KxAD`6dLEq)H=GZRt2q);+M-gzk+eXHCF3$ubp@w+! zkYA4L94}9zu(rI`V`Q0Xto`r|o>J+$-jquizP_hW#O?j9aej{{#W+7Cfpc_tndySe tpCX6Mk8%|2hb3K)@)$#jql~{%-zL3-6!i5C%Pq^6FAqEE+22pF_Fo-AoIL;l literal 0 HcmV?d00001 diff --git a/DOS/LOADCEPC/ethmain.sbr b/DOS/LOADCEPC/ethmain.sbr new file mode 100644 index 0000000000000000000000000000000000000000..82cbb47cf09d1cfce5dd4e4f0845067ed04a952e GIT binary patch literal 4254 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 + +#define LOCKFLAG_WRITE 1 + +#define int long + +#define ZONE_DEBUG 1 + +#define DEBUGMSG(a, b) printf b + +int OEMParallelPortGetByte(void); +VOID OEMParallelPortSendByte(BYTE chData); + +#define LockPages(a, b, c, d) +#define UnlockPages(a, b) + +#define KUnicodeToAscii(a, b, c) strncpy(a, b, c) diff --git a/DOS/LOADCEPC/loadcepc.h b/DOS/LOADCEPC/loadcepc.h new file mode 100644 index 0000000..39ab54d --- /dev/null +++ b/DOS/LOADCEPC/loadcepc.h @@ -0,0 +1,33 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// +// Use of this sample source code is subject to the terms of the Microsoft +// license agreement under which you licensed this sample source code. If +// you did not accept the terms of the license agreement, you are not +// authorized to use this sample source code. For the terms of the license, +// please see the license agreement between you and Microsoft or, if applicable, +// see the LICENSE.RTF on your install media or the root of your tools installation. +// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +// +#define TRUE 1 +#define FALSE 0 + +#define _MOREINFO 1 + +typedef int BOOL; + +typedef unsigned char BYTE, *LPBYTE, UCHAR, *PUCHAR; +typedef unsigned int USHORT, *PUSHORT; +typedef unsigned long ULONG, *PULONG; + +typedef unsigned short WORD, *PWORD; +typedef unsigned long DWORD, *PDWORD; + +typedef signed char INT8; +typedef unsigned char UINT8; +typedef signed short INT16; +typedef unsigned short UINT16; +typedef signed int INT32; +typedef unsigned int UINT32; + diff --git a/DOS/LOADCEPC/loadcepc.mak b/DOS/LOADCEPC/loadcepc.mak new file mode 100644 index 0000000..8b11069 --- /dev/null +++ b/DOS/LOADCEPC/loadcepc.mak @@ -0,0 +1,151 @@ +!if 0 +Copyright (c) Microsoft Corporation. All rights reserved. +!endif +!if 0 +Use of this sample source code is subject to the terms of the Microsoft +license agreement under which you licensed this sample source code. If +you did not accept the terms of the license agreement, you are not +authorized to use this sample source code. For the terms of the license, +please see the license agreement between you and Microsoft or, if applicable, +see the LICENSE.RTF on your install media or the root of your tools installation. +THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +!endif + +# +# +# Microsoft Visual C++ generated build script - Do not modify + +PROJ = LOADCEPC +DEBUG = 0 +PROGTYPE = 6 +CALLER = +ARGS = +DLLS = +D_RCDEFINES = -d_DEBUG +R_RCDEFINES = -dNDEBUG +ORIGIN = MSVC +ORIGIN_VER = 1.00 +USEMFC = 0 +CC = cl +CPP = cl +CXX = cl +CCREATEPCHFLAG = +CPPCREATEPCHFLAG = +CUSEPCHFLAG = +CPPUSEPCHFLAG = +FIRSTC = MAIN.C +FIRSTCPP = +RC = rc +CFLAGS_D_DEXE = /I . /nologo /G2 /W4 /Z7 /Od /D "_DEBUG" /D "_DOS" /D "CEDDK_USEDDKMACRO" /Fc /FR +CFLAGS_R_DEXE = /I . /nologo /Gs /G2 /W4 /Z7 /Ox /D "NDEBUG" /D "_DOS" /D "CEDDK_USEDDKMACRO" /Fc /FR +LFLAGS_D_DEXE = /NOLOGO /NOI /STACK:5120 /ONERROR:NOEXE /CO /MAP /LINE +LFLAGS_R_DEXE = /NOLOGO /NOI /STACK:5120 /ONERROR:NOEXE /CO /MAP /LINE +LIBS_D_DEXE = slibce oldnames +LIBS_R_DEXE = slibce oldnames +RCFLAGS = /nologo +RESFLAGS = /nologo +RUNFLAGS = +LIBS_EXT = +!if "$(DEBUG)" == "1" +CFLAGS = $(CFLAGS_D_DEXE) +LFLAGS = $(LFLAGS_D_DEXE) +LIBS = $(LIBS_D_DEXE) +MAPFILE = nul +RCDEFINES = $(D_RCDEFINES) +!else +CFLAGS = $(CFLAGS_R_DEXE) +LFLAGS = $(LFLAGS_R_DEXE) +LIBS = $(LIBS_R_DEXE) +MAPFILE = nul +RCDEFINES = $(R_RCDEFINES) +!endif +CFLAGS = $(CFLAGS) /I ..\..\INC +!if [if exist MSVC.BND del MSVC.BND] +!endif +SBRS = MAIN.SBR \ + XMSAPI.SBR \ + VIDEO.SBR \ + PPFS.SBR + + +TRANSFER_DEP = + +MAIN_DEP = loadcepc.h \ + xmsapi.h + +XMSAPI_DEP = xmsapi.h + + +VIDEO_DEP = loadcepc.h \ + video.h + +MDPPFS_DEP = wdm.h \ + pc.h + + +PPFS_DEP = kernel.h + + +PPFSTOOL_DEP = ppfs.h + +ETHMAIN_DEP = loadcepc.h \ + smchw.h + +all: $(PROJ).EXE $(PROJ).BSC + +clean: + del /f /q $(PROJ).exe *.obj *.cod *.sbr + +MAIN.OBJ: MAIN.C $(MAIN_DEP) + $(CC) $(CFLAGS) $(CCREATEPCHFLAG) /c MAIN.C + +XMSAPI.OBJ: XMSAPI.C $(XMSAPI_DEP) + $(CC) $(CFLAGS) $(CUSEPCHFLAG) /c XMSAPI.C + +VIDEO.OBJ: VIDEO.C $(VIDEO_DEP) + $(CC) $(CFLAGS) $(CUSEPCHFLAG) /c VIDEO.C + +MDPPFS.OBJ: MDPPFS.C $(MDPPFS_DEP) + $(CC) $(CFLAGS) $(CCREATEPCHFLAG) /c MDPPFS.C + +PPFS.OBJ: PPFS.C $(PPFS_DEP) + $(CC) $(CFLAGS) $(CUSEPCHFLAG) /c PPFS.C + +DEBUG.OBJ: DEBUG.C $(PPFS_DEP) + $(CC) $(CFLAGS) $(CUSEPCHFLAG) /c DEBUG.C + +PPFSTOOL.OBJ: PPFSTOOL.C $(PPFSTOOL_DEP) + $(CC) $(CFLAGS) $(CUSEPCHFLAG) /c PPFSTOOL.C + +ETHMAIN.OBJ: ETHMAIN.C $(ETHMAIN_DEP) + $(CC) $(CFLAGS) $(CUSEPCHFLAG) /c ETHMAIN.C + +TRANSFER.OBJ: TRANSFER.ASM + ml /c TRANSFER.ASM + +$(PROJ).EXE:: MAIN.OBJ XMSAPI.OBJ VIDEO.OBJ MDPPFS.OBJ DEBUG.OBJ PPFS.OBJ PPFSTOOL.OBJ ETHMAIN.OBJ TRANSFER.OBJ $(DEFFILE) + echo >NUL @<<$(PROJ).CRF +MAIN.OBJ + +XMSAPI.OBJ + +VIDEO.OBJ + +MDPPFS.OBJ + +PPFS.OBJ + +PPFSTOOL.OBJ + +ETHMAIN.OBJ + +DEBUG.OBJ + +TRANSFER.OBJ +$(PROJ).EXE +$(MAPFILE) +$(LIBS) +$(DEFFILE); +<< + link $(LFLAGS) @$(PROJ).CRF + +run: $(PROJ).EXE + $(PROJ) $(RUNFLAGS) + + +$(PROJ).BSc: $(SBRS) + bscmake @<< +/o$@ $(SBRS) +<< diff --git a/DOS/LOADCEPC/loadnkpc.h b/DOS/LOADCEPC/loadnkpc.h new file mode 100644 index 0000000..34aea3b --- /dev/null +++ b/DOS/LOADCEPC/loadnkpc.h @@ -0,0 +1,23 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// +// Use of this sample source code is subject to the terms of the Microsoft +// license agreement under which you licensed this sample source code. If +// you did not accept the terms of the license agreement, you are not +// authorized to use this sample source code. For the terms of the license, +// please see the license agreement between you and Microsoft or, if applicable, +// see the LICENSE.RTF on your install media or the root of your tools installation. +// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +// +#define TRUE 1 +#define FALSE 0 + +typedef int BOOL; + +typedef unsigned char UCHAR, *PUCHAR; +typedef unsigned int USHORT, *PUSHORT; +typedef unsigned long ULONG, *PULONG; + +typedef unsigned short WORD, *PWORD; +typedef unsigned long DWORD, *PDWORD; diff --git a/DOS/LOADCEPC/main.c b/DOS/LOADCEPC/main.c new file mode 100644 index 0000000..b227d50 --- /dev/null +++ b/DOS/LOADCEPC/main.c @@ -0,0 +1,1537 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// +// Use of this source code is subject to the terms of the Microsoft end-user +// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT. +// If you did not accept the terms of the EULA, you are not authorized to use +// this source code. For a copy of the EULA, please see the LICENSE.RTF on your +// install media. +// + +/*++ +THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +PARTICULAR PURPOSE. + +Module Name: main.c + +Abstract: This program, loadcepc.exe, is responsible for loading + a binary image into memory and booting the image. It + processes the boot arguments, loads the image file, and + then executes it. + +Functions: + + +Notes: none + +--*/ + +// Include Files + +#include +#include +#include +#include +#include +#include +#include +#include "loadcepc.h" +#include "xmsapi.h" +#include "ethernet.h" +#include + + +// Externs + +extern int NoPPFS; // parallel port not present flag + + +// Defines + +#define CHUNKSIZE (32768) +#define COPY_FLAG_UPDATE_EXISTING (0x0001) +#define COPY_FLAG_UPDATE_OR_ADD (0x0002) + + +// Variables + +// Boot Header + +static const unsigned char BootHeader[] = +{ + 0xAA, // header = 4 bytes + 0x55, + 0x55, + 0xAA, + 0x00, // opcode = 2 bytes (0 = BOOT) + 0x00, +}; + +#define BOOT_HEADER_SIZE (sizeof(BootHeader) / sizeof(BootHeader[0])) + + +// Boot Trailer + +static const unsigned char BootTail[] = +{ + 0x5A, // trail = 4 bytes + 0xA5, + 0x0A, + 0x1A +}; + +#define BOOT_TAIL_SIZE (sizeof(BootTail) / sizeof(BootTail[0])) + +#define BOOT_TYPE (-4) // boot type for x86 + + +// Baud Rate + +struct +{ + ULONG ulRate; + UCHAR ucDivisor; +} +BaudTable[] = +{ + { 9600, 12}, + { 19200, 6}, + { 38400, 3}, + { 57600, 2}, + { 115200, 1} +}; + +#define NUM_BAUD_RATES (sizeof(BaudTable) / sizeof(BaudTable[0])) + + +BOOT_ARGS BootArgs; +USHORT usBlockHandle; // XMS memory handle +BOOL bSerialDownload=FALSE; + + +// Function Prototypes + +// External Functions + +void OEMInitDebugSerial(void); +int OEMReadDebugByte(void); +void OEMReadDebugBytes(unsigned char * ucBuffer, int usReadSize); +void OEMWriteDebugByte(unsigned char ch); +int OEMParallelPortGetByte(void); +void OEMParallelPortSendByte(UCHAR chData); +void OEMParallelPortInit(void); +void Launch( ULONG ulEntryPoint, ULONG ulArguments ); + +// in video.c + +UCHAR SetVideoMode( int iDesiredMode); +BOOL ParseVESAOptions( char * params); + +// in ethmain.c + +BOOL ParseEthernetOptions( char * argstr); +BOOL ParseDeviceName( char * argstr); + +// in ppfstool.c + +void DrawPercent( DWORD CurValue, DWORD MaxValue); +void DisplayDirectory( char *pszPath); +void GetFile( char *pszSource, char *pszDestination, USHORT usCopyFlags); + +// Local Functions + +static void usage( char *pszProgramNameArg ); +static void ExitSigHandler( int sig ); +static WORD GetJumpFlags( void ); +static UCHAR GetPCIConfigMechanism(); +static USHORT DownloadRead( int hImage, + UCHAR *ucBuffer, + USHORT usReadSize, + BOOL bParallelDownload ); +static int LoadImage ( BOOL bVerbose, + BOOL bParallelDownload, + char *pszFileName, + PULONG pulEntryAddress); +static void DisplayCEOSVersion( char *pszFileName); + + +//------------------------------------------------------------------------------ +// +// Function Name: main( int argc, char **argv ) +// Description..: Main entry point. +// Inputs.......: argc, argv +// Outputs......: int exit status +// +//------------------------------------------------------------------------------ + +int iDesiredMode = 0; +int main( int argc, char **argv ) +{ + char * pszFileName = "300STD.bin"; + ULONG ulEntryPoint; + ULONG ulArguments; + int xmsError; + BOOL bEnabled; + BOOL bVerbose = FALSE; + BOOL bParallelDownload=FALSE; + BOOL bBackupImage=FALSE; + ULONG ulBaudRate; + char cOption; + int i = 0; + int ret = 0; + int iPpfstool=0; + BOOL bRNDISDownload=FALSE; + BOOL bEtherDownload=FALSE; + + // Setup signal handler for Ctrl+C/Ctrl+Break + + signal( SIGINT, ExitSigHandler ); + signal( SIGTERM, ExitSigHandler ); + signal( SIGABRT, ExitSigHandler ); + + // Initialize the boot args block + + memset( &BootArgs, 0, sizeof(BOOT_ARGS)); + BootArgs.ucVideoMode = 0; + BootArgs.ucComPort = 1; + BootArgs.ucBaudDivisor = 3; // Default 38400 + BootArgs.ucPCIConfigType = 0; + BootArgs.dwSig = BOOTARG_SIG; + BootArgs.dwLen = sizeof(BOOT_ARGS); + BootArgs.dwVersionSig = BOOT_ARG_VERSION_SIG; + BootArgs.MajorVersion = BOOT_ARG_MAJOR_VER; + BootArgs.MinorVersion = BOOT_ARG_MINOR_VER; + + usBlockHandle = 0; + + // Initialize parallel port + + OEMParallelPortInit(); + + // Process arguments + + if( argc > 1 ) + { + int iArgIndex; + + for( iArgIndex = 1; iArgIndex < argc; iArgIndex++ ) + { + if( argv[iArgIndex][0] != '/' && argv[iArgIndex][0] != '-' ) + { + break; + } + + cOption = (char)tolower(argv[iArgIndex][1]); + + // Process according to option character + + switch( cOption ) + { + case 'b': /* Baud rate */ + + if( argv[iArgIndex][2] != ':' || + argv[iArgIndex][3] < '0' || argv[iArgIndex][3] > '9' ) + { + printf("Invalid option - %s\n", argv[iArgIndex]); + ret = 1; + goto main_error; + } + + ulBaudRate = atol(&argv[iArgIndex][3]); + + for( i=0; i < NUM_BAUD_RATES; i++ ) + { + if( BaudTable[i].ulRate == ulBaudRate ) + { + BootArgs.ucBaudDivisor = BaudTable[i].ucDivisor; + break; + } + } + + if( i >= NUM_BAUD_RATES ) + { + printf( "Unsupported baud rate - %s\n", argv[iArgIndex] ); + ret = 1; + goto main_error; + } + break; + + case 'c': + + // COM Port Parameter + // + // Allowable values for the COM ports 1-4. Zero (0) is + // allowed as a way to disable use of the COM port and is + // allowed by ...\csp\i486\oal\debug.c. + + if( (argv[iArgIndex][2] == ':') && + (argv[iArgIndex][3] >= '0') && + (argv[iArgIndex][3] <= '4') ) + { + BootArgs.ucComPort = (UCHAR)(argv[iArgIndex][3] - '0'); + } + else + { + printf( "Invalid option - %s\n", argv[iArgIndex] ); + ret = 1; + goto main_error; + } + break; + + case 'd': /* Display mode */ + + if( argv[iArgIndex][2] != ':' || + argv[iArgIndex][3] < '0' || argv[iArgIndex][3] > '6' ) + { + printf( "Invalid option - %s\n", argv[iArgIndex] ); + ret = 1; + goto main_error; + } + iDesiredMode = (int)(argv[iArgIndex][3] - '0'); + break; + + case 'e': + if( bRNDISDownload ) + { + printf( "The /E and /K options are mutually exclusive" + " - please choose one of them.\r\n" ); + + goto main_error; + } + if( !ParseEthernetOptions(argv[iArgIndex]) ) + { + printf("Invalid option - %s\n", argv[iArgIndex]); + ret = 1; + goto main_error; + } + bEtherDownload = TRUE; + break; + + case 'k': /* RNDIS flags */ + + if( bEtherDownload ) + { + printf( "The /E and /K options are mutually exclusive" + "- please choose one of them.\r\n"); + goto main_error; + } + if( !ParseEthernetOptions(argv[iArgIndex]) ) + { + printf("Invalid option - %s\n", argv[iArgIndex]); + ret = 1; + goto main_error; + } + bRNDISDownload = TRUE; + break; + + case 'l': + + // VESA VBE Linear/Flat Framebuffer display mode + + if( !ParseVESAOptions( argv[iArgIndex] ) ) + { + printf( "Invalid option - %s\n", argv[iArgIndex] ); + ret = 1; + goto main_error; + } + iDesiredMode = BootArgs.vesaMode; +#if 0 + + // Video Mode Debug - display and hang + + printf( "VESA Boot Options\n" ); + printf( "vesaMode........: 0x%x\n", BootArgs.vesaMode ); + printf( "xDisplayScreen..: %d\n", BootArgs.cxDisplayScreen ); + printf( "YDisplayScreen..: %d\n", BootArgs.cyDisplayScreen ); + printf( "bppScreen.......: %d\n", BootArgs.bppScreen ); + printf( "xPhysScreen.....: %d\n", BootArgs.cxPhysicalScreen ); + printf( "yPhysScreen.....: %d\n", BootArgs.cyPhysicalScreen ); + + while( 1 ) + { + ; + } +#endif + break; + + case 'n': /* Device name specified */ + + if( !ParseDeviceName(argv[iArgIndex]) ) + { + printf("Invalid option - %s\n", argv[iArgIndex]); + ret = 1; + goto main_error; + } + break; + + case 'p': /* Parallel port boot download */ + + bParallelDownload=TRUE; + pszFileName= NULL; + break; + + case 'a': /* Use permanent storage to store image */ + + bBackupImage=TRUE; + break; + + case 'q': /* Serial port boot download */ + + bSerialDownload=TRUE; + pszFileName= NULL; + break; + + case 'v': + + bVerbose = TRUE; + break; + + case 's': + { + char *pszPath; + + iPpfstool=1; + + if( argv[iArgIndex][2] != '\0' ) + { + pszPath = &argv[iArgIndex][2]; + if( *pszPath == ':' ) + { + pszPath++; + } + } + else if( (argc > (i+1) && argv[iArgIndex+1][0] != '-') && + (argv[iArgIndex+1][0] != '/') ) + { + pszPath = argv[iArgIndex+1]; + i++; + } + else + { + pszPath = "*.*"; + } + DisplayDirectory(pszPath); + } + break; + + case 'g': + case 'r': + case 'u': + { + char *pszSource; + char *pszDestination; + + iPpfstool=1; + if( argv[iArgIndex][2] != '\0' ) + { + pszSource = &argv[iArgIndex][2]; + if( *pszSource == ':' ) + { + pszSource++; + } + } + else if( argc > (iArgIndex+1) && argv[iArgIndex+1][0] != '-' && argv[iArgIndex+1][0] != '/' ) + { + pszSource = argv[iArgIndex+1]; + iArgIndex++; + } + else + { + printf("Error source path missing\n"); + break; + } + + if( argc > (iArgIndex+1) && argv[iArgIndex+1][0] != '-' && argv[iArgIndex+1][0] != '/' ) + { + pszDestination = argv[iArgIndex+1]; + i++; + } + else + { + pszDestination = NULL; + } + + GetFile( pszSource, pszDestination, + cOption == 'r' ? COPY_FLAG_UPDATE_EXISTING : + cOption == 'u' ? COPY_FLAG_UPDATE_OR_ADD : + 0 ); + } + break; + + default: + + printf("Unrecognized option - %s\n", argv[iArgIndex]); + + // Fall through to display usage + + case '?': + case 'h': + + // Display usage data + + usage( argv[0] ); + ret = 1; + goto main_error; + } + } + + if( iArgIndex == (argc - 1) ) + { + pszFileName = argv[iArgIndex]; + } + } + + if( iPpfstool ) + { + ret = 0; + goto main_error; + } + + if( !XmsIsInstalled() ) + { + printf( "HIMEM.SYS must be loaded\n" ); + ret = 2; + goto main_error; + } + + if( bVerbose ) + { + if( (xmsError = XmsQueryA20(&bEnabled)) != XMS_SUCCESS ) + { + printf( "Error querying A20 status - %s\n", + XmsErrorString(xmsError) ); + ret = 3; + goto main_error; + } + + if( bEnabled ) + { + printf( "Warning A20 line already enabled\n" ); + } + } + + // Check if PCI Bios is available, if so find out config mechanism + + BootArgs.ucPCIConfigType = GetPCIConfigMechanism(); + + // Load the boot image + + if( !LoadImage( bVerbose, bParallelDownload, pszFileName, &ulEntryPoint) ) + { + ret = 4; + goto main_error; + } + + // Enable A20 line + + if( (xmsError = XmsLocalEnableA20()) != XMS_SUCCESS ) + { + printf("Can't enable A20 line, error = 0x%4.4X\n", xmsError); + + ret = 5; + goto main_error; + } + + // Set the video mode + + BootArgs.ucVideoMode = SetVideoMode( iDesiredMode ); + + if( BootArgs.ucVideoMode == 0 ) + { + // if using default mode set params for flat framebuffer driver. + + BootArgs.cxDisplayScreen = 320; + BootArgs.cyDisplayScreen = 200; + BootArgs.cxPhysicalScreen = 320; + BootArgs.cyPhysicalScreen = 200; + BootArgs.bppScreen = 8; + BootArgs.cbScanLineLength = 320; + BootArgs.pvFlatFrameBuffer = 0x800A0000; + } + else if( BootArgs.ucVideoMode != 0xFF ) + { + // if not using VESA mode clear these so flat + // framebuffer driver sees all zeroes and faults. + + BootArgs.cxDisplayScreen = 0; + BootArgs.cyDisplayScreen = 0; + BootArgs.cxPhysicalScreen = 0; + BootArgs.cyPhysicalScreen = 0; + BootArgs.bppScreen = 0; + BootArgs.cbScanLineLength = 0; + BootArgs.pvFlatFrameBuffer = 0; + } + + if( bSerialDownload ) + { + BootArgs.ucBaudDivisor|=0x80; + } + + if( bParallelDownload ) + { + BootArgs.KitlTransport = GetJumpFlags(); + } + + if( bBackupImage ) + { + BootArgs.ucLoaderFlags |= LDRFL_FLASH_BACKUP; + } + + if( bVerbose ) + { + printf( "Jumping to 0x%8.8lX\n", ulEntryPoint ); + } + + // Convert arguments to linear addres + + ulArguments = (((ULONG)(void far *)&BootArgs) >> 16) << 4; + ulArguments += ((ULONG)(void far *)&BootArgs) & 0xFFFF; + + // Execute the image + + Launch( ulEntryPoint, ulArguments ); + + // Launch should not return + + return( 0 ); + + + // Main Error Handler + +main_error: + + // Make sure we unlock and free extended memory + + if( usBlockHandle ) + { + XmsUnlockExtendedMemory(usBlockHandle); + XmsFreeExtendedMemory(usBlockHandle); + } + + printf("\n\n Press any key to cancel.\n"); + __asm + { + push dx + xor ax,ax + int 0x16 + pop dx + } + // Indicate status + + return( ret ); +} + +//------------------------------------------------------------------------------ +// +// Function Name: usage( char *pszProgramNameArg ) +// Description..: This function displays program usage information. +// Inputs.......: char * ProgramName +// Outputs......: none +// +//------------------------------------------------------------------------------ + +static void usage( char *pszProgramNameArg ) +{ + char *pszProgram; + + pszProgram = strrchr(pszProgramNameArg, '\\'); + + if( pszProgram != NULL ) + { + pszProgram++; + } + else + { + pszProgram = pszProgramNameArg; + } + + printf( + "\n" + "%s: Loads a BIN image into memory and boots it.\n" + "\n" + "Usage:%s /B:baud /C:Port /D:display /P /H /V /N:name\n" + " (/E|/K):IO:IRQ[:] /L:VXxVYxBPP[:PXxPY] \n" + "\n" + " /B Baud Rate [9600|19200|38400(default)|57600|115200]" + "\n" + " /C Communications Port [0=disable|1|2|3|4]" + "\n" + " /D Display Resolution (for VESA modes, use the /L option instead).\n" + " 0 = 320x200x256 (default), 1 = 480x240x256,\n" + " 2 = 640x480x256, 3 = 800x600x256, 4 = 1024x768x256\n" + " 5 = 240x320x256, 6 = 208x240x256\n" + "\n" + " /P Parallel port boot download.\n" + "\n" + " /A Use permanent storage device to store NK image.\n" + "\n" + " /H Help - displays this message.\n" + "\n" + " Default is NK.BIN except for /P option which uses\n" + " default on host unless specified.\n" + "\n" + "Press any key for more options...", + + pszProgram, pszProgram ); + + __asm + { + push dx + xor ax,ax + int 0x16 + pop dx + } + + printf( + "\n" + "\n" + "\n" + "Usage:%s /B:baud /C:Port /D:display /P /H /V /N:name\n" + " (/E|/K):IO:IRQ[:] /L:VXxVYxBPP[:PXxPY] \n" + "\n" + " /V Verbose - displays extra status information during boot.\n" + "\n" + " /E:IO:IRQ[:] (Debug Ethernet Card parameters)\n" + " IO - IO Base Address (specified in hexadecimal)\n" + " IRQ - Interrupt (specified in decimal or hexadecimal)\n" + " Dotted IP - (optional) static IP address (No DHCP)\n" + " NOTE: The /E and /K options are mutually exclusive.\n" + "\n" + " /K:IO:IRQ[:] (RNDIS Card parameters)\n" + " IO - IO Base Address (specified in hexadecimal)\n" + " IRQ - Interrupt (specified in decimal or hexadecimal)\n" + " Dotted IP - (optional) static IP address (No DHCP)\n" + " NOTE: The /E and /K options are mutually exclusive.\n" + "\n" + " /L:DXxDYxBPP[:PXxPY] (Use VESA VBE Linear/Flat Framebuffer video mode)\n" + " DX, DY - Display X and Y Sizes\n" + " BPP - Bits Per Pixel Color Depth (8, 16, 24, or 32)\n" + " PX, PY - (optional) Physical Screen X and Y Sizes to simulate a\n" + " small device display (PX & PY should be greater than DX & DY)." + "\n" + " /N:name Optionally specify a device name to be used when creating\n" + " the Ethernet debug name (for host-side connectivity).\n" + "\n" + "Press any key for more options...", + + pszProgram ); + + __asm + { + push dx + xor ax,ax + int 0x16 + pop dx + } + + printf( + "\n" + "Usage: %s -s[:] -(g|r|u)[[:] []\n" + "-s Show a directory of files matching .\n" + "\n" + "-g Get files matching and copy them to the\n" + " optionally specified . Any existing file with\n" + " the same name will be overwritten.\n" + "\n" + "-r Refresh files matching which already exist in \n" + " and have a timestamp newer than the one in .\n" + "\n" + "-u Update files matching which don't already exist in\n" + " or those that have a timestamp newer than those\n" + " in .\n" + "\n" + " Windows filename path with optional wildcard characters.\n" + "\n" + " If not specified then the current directory is the default.\n" + " If specified and it doesn't exist and the last character is \\,\n" + " then the directory is created. Otherwise is\n" + " treated as the name of the file.\n" + " It is an error for to match multiple files\n" + " when specifies a file.\n" + "For CE Collections - Last built with ver.2.01-Beta1-02", + + pszProgram ); +} + +//------------------------------------------------------------------------------ +// +// Function Name: ExitSigHandler( int sig ) +// Description..: This function handles Ctrl_c/Ctrl+Break while downloading. +// XMS must be freed or unlocked or we can't execute loadcepc +// again without rebooting. +// Inputs.......: int sig exit signal number +// Outputs......: none +// +//------------------------------------------------------------------------------ + +static void ExitSigHandler( int sig ) +{ + if( usBlockHandle ) + { + XmsUnlockExtendedMemory(usBlockHandle); + XmsFreeExtendedMemory(usBlockHandle); + } + + exit (sig); +} + +//------------------------------------------------------------------------------ +// +// Function Name: DownloadRead( ... ) +// Description..: This function is used to read download data. It +// encapsulates the device we are reading from. +// Inputs.......: int hImage handle to image, may be zero. +// UCHAR *ucBuffer pntr to dst buffer +// USHORT usReadSize number of bytes to read +// BOOL parallel port switch +// Outputs......: +// +//------------------------------------------------------------------------------ + +static USHORT DownloadRead( int hImage, + UCHAR *ucBuffer, + USHORT usReadSize, + BOOL bParallelDownload ) +{ + USHORT loop; + + if( bParallelDownload ) + { + // Parallel download + + for( loop = 0; loop < usReadSize; loop++ ) + { + ucBuffer[loop]= (UCHAR)OEMParallelPortGetByte(); + + if( NoPPFS ) + { + return 0; + } + } + return usReadSize; + } + else if( bSerialDownload ) + { + // Serial download + + OEMReadDebugBytes( ucBuffer,usReadSize ); + return usReadSize; + } + else + { + // Ethernet? + + return _read( hImage, ucBuffer, usReadSize ); + } +} + +//------------------------------------------------------------------------------ +// +// Function Name: LoadImage +// Description..: This function is responsible for getting and loading +// the image into memory. +// Inputs.......: BOOL Verbose set verbose tracing flag +// BOOL ParallelDownLoad use parallel port flag +// char * FileName image file name +// PULONG EntryPoint memory entry point +// Outputs......: TRUE on success, FALSE on failure. +// +//------------------------------------------------------------------------------ + +static int LoadImage( BOOL bVerbose, + BOOL bParallelDownload, + char *pszFileName, + PULONG pulEntryPoint ) +{ + int hImage; + long lImageSize; + int xmsError; + USHORT usTotalFree; + USHORT usLargestBlock; + ULONG ulLinearAddress; + ULONG ulSectionAddress; + ULONG ulSectionSize; + ULONG ulSectionChecksum; + ULONG ulSectionOffset; + ULONG ulChecksum; + USHORT usReadSize; + USHORT usAmountRead; + ULONG ulReadTotal=0; + ULONG ulReadProgress=0; + USHORT usIndex; + static UCHAR ucBuffer[ CHUNKSIZE ]; + static UCHAR ucSignature[] = { 'B', '0', '0', '0', 'F', 'F', '\n'}; + int i; + UCHAR BootPacket[256]; + UCHAR *pDestByte; + UCHAR *pTemp; + unsigned int chksum; + long int uiTemp; + long int bootType; + unsigned len; + + + // Find the largest Extended Memory block and allocate it + + xmsError = XmsQueryFreeExtendedMemory(&usLargestBlock, &usTotalFree); + + if( xmsError != XMS_SUCCESS ) + { + printf("Error querying free extended memory - %s\n", XmsErrorString(xmsError)); + + if( !bParallelDownload && !bSerialDownload ) + { + _close(hImage); + } + + return FALSE; + } + + printf(" ImageName:......: %s\n",pszFileName ); + printf(" FLATMode........: %d\n",iDesiredMode); + printf(" VESAMode........: 0x%x\n", BootArgs.vesaMode ); + printf(" FreeEMSMem......: %u\n",usTotalFree); + printf(" LagestBlock.....: %u\n",usLargestBlock); + printf(" ==========Booting - Press CTRL+C to cancel=========\n "); + fprintf(stderr, " "); + fprintf(stderr, " "); + if( bVerbose ) + { + // Print info about memory available + + printf( "Total free extended memory = %u, largest block = %u\n", + usTotalFree, usLargestBlock); + } + + // Allocate the extended block + + xmsError = XmsAllocateExtendedMemory(usLargestBlock, &usBlockHandle); + + if( xmsError != XMS_SUCCESS ) + { + printf( "Error allocating extended memory - %s\n", + XmsErrorString(xmsError)); + + if( !bParallelDownload && !bSerialDownload ) + { + _close(hImage); + } + + return FALSE; + } + + //printf("XMS usBlockHandle = 0x%x\n", usBlockHandle); + + // Lock the block and obtain its linear address. + // Then ensure that the image fits into it. + + xmsError = XmsLockExtendedMemory(usBlockHandle, &ulLinearAddress); + + if( xmsError != XMS_SUCCESS ) + { + fprintf(stderr, "\r \r"); + printf("Error locking extended memory - %s\n", XmsErrorString(xmsError)); + + XmsFreeExtendedMemory(usBlockHandle); + usBlockHandle = 0; + + if( !bParallelDownload && !bSerialDownload ) + { + _close(hImage); + } + + return FALSE; + } + + // Print info about block allocated + + if( bVerbose ) + { + fprintf(stderr, "\r \r"); + printf("Block allocated at 0x%lX\n", ulLinearAddress); + } + + // Zero upper memory in CHUNKSIZE chunks + + memset(ucBuffer, 0, sizeof(ucBuffer)); + ulSectionSize = (ULONG)usLargestBlock * 1024; + + for( ulSectionOffset = 0; ulSectionOffset < ulSectionSize; ulSectionOffset += usReadSize ) + { + if( (ulSectionSize - ulSectionOffset) < CHUNKSIZE ) + { + usReadSize = (USHORT)(ulSectionSize - ulSectionOffset); + } + else + { + usReadSize = CHUNKSIZE; + } + + xmsError = XmsMoveExtendedMemory( + 0, (ULONG)(UCHAR far *)ucBuffer, + usBlockHandle, ulSectionOffset, usReadSize); + + if( xmsError != XMS_SUCCESS ) + { + fprintf(stderr, "\r \r"); + printf("Error zeroing extended memory - %s\n", XmsErrorString(xmsError)); + if( !bParallelDownload && !bSerialDownload ) + _close(hImage); + + return FALSE; + } + } + + // Open image file + + // If this is a serial download, initialize the serial port + + if( bSerialDownload ) + { + OEMInitDebugSerial(); + } + + if( bParallelDownload || bSerialDownload ) + { + // Prepare boot packet + + pDestByte = BootPacket; + + for( i = 0; i < BOOT_HEADER_SIZE; i++ ) + { + *pDestByte++ = BootHeader[i]; + } + + chksum = 0; + len = 9; + + if( pszFileName ) + { + if( bSerialDownload ) + printf("Loading image %s via serial port.\r\n",pszFileName); + else + printf("Loading image %s via parallel port.\r\n",pszFileName); + + bootType = 1; // The NULL byte + + for( pTemp = (UCHAR*)pszFileName; *pTemp; pTemp++ ) + { + bootType++; + } + + len += (unsigned)bootType; + + } + else + { + if( bSerialDownload ) + printf("Loading host default image via serial port.\r\n"); + else + printf("Loading host default image via parallel port.\r\n"); + + bootType = BOOT_TYPE; + } + + uiTemp = len; + + for( i = 0; i < 2; i++ ) + { + *pDestByte++ = (unsigned char)(uiTemp & 0xFF); + chksum += (unsigned int)(uiTemp & 0xFF); + uiTemp >>= 8; + } + + uiTemp = bootType; + + for( i = 0; i < 4; i++ ) + { + *pDestByte++ = (unsigned char)(uiTemp & 0xFF); + chksum += (unsigned int)(uiTemp & 0xFF); + uiTemp >>= 8; + } + + if( bootType > 0 ) + { + for( pTemp = (UCHAR*)pszFileName; *pTemp; pTemp++ ) + { + *pDestByte++ = *pTemp; + chksum += *pTemp; + } + *pDestByte++ = 0; + } + + *pDestByte++ = (unsigned char)((~chksum) & 0xFF); + + for( i = 0; i < BOOT_TAIL_SIZE; i++ ) + { + *pDestByte++ = BootTail[i]; + } + + + if( bVerbose ) printf("Sending boot packet: "); + + usIndex=0; + + while( &BootPacket[usIndex] < pDestByte ) + { + if( NoPPFS ) + { + return FALSE; + } + + if( bVerbose ) printf("%x ",BootPacket[usIndex]); + + if( bSerialDownload ) + { + OEMWriteDebugByte(BootPacket[usIndex]); + } + else + { + OEMParallelPortSendByte(BootPacket[usIndex]); + } + usIndex++; + } + + if( bVerbose ) printf("Sent.\r\n"); + } + else + { + hImage = _open(pszFileName, _O_BINARY | _O_RDONLY); + + if( hImage == -1 ) + { + printf("%s: Error opening file - %s\n", pszFileName, _strerror(NULL)); + return FALSE; + } + + if( (lImageSize = _filelength(hImage)) == -1 ) + { + printf("%s: Error obtaining file size - %s\n", pszFileName, _strerror(NULL)); + if( !bParallelDownload && !bSerialDownload ) + _close(hImage); + + return FALSE; + } + + if( bVerbose ) + { + printf("Loading %s, size = %ld\n", pszFileName, lImageSize); + DisplayCEOSVersion( pszFileName ); // Extract Version Number from image if available + } + } + + // Read initial signature and physical start and size + + usReadSize = sizeof(ucSignature) + 2 * sizeof(ULONG); + + if( DownloadRead( hImage, ucBuffer, usReadSize, bParallelDownload) != usReadSize ) + { + printf("Error reading signature - %s\n", _strerror(NULL)); + if( !bParallelDownload && !bSerialDownload ) + _close(hImage); + + return FALSE; + } + + if( memcmp(ucBuffer, ucSignature, sizeof(ucSignature)) != 0 ) + { + printf("Error invalid signature\nData: "); + for( i = 0; i < (int)usReadSize; i++ ) + printf("%x ",ucBuffer[i]); + printf("\r\n"); + if( !bParallelDownload && !bSerialDownload ) + _close(hImage); + + return FALSE; + } + + ulReadTotal=*(PULONG)&ucBuffer[sizeof(ucSignature) + sizeof(ULONG)]; + + // Print Physical start and size + + if( bVerbose ) + { + printf( "Image physical start = 0x%8.8lX, size = %ld\n", + *(PULONG)&ucBuffer[sizeof(ucSignature)], + *(PULONG)&ucBuffer[sizeof(ucSignature) + sizeof(ULONG)]); + } + + // Initialize the percent thingie. + + DrawPercent( (DWORD)-1, (DWORD)""); + + // Copy file to upper memory in CHUNKSIZE chunks + + for(;;) + { + usAmountRead = DownloadRead(hImage, ucBuffer, 3 * sizeof(ULONG), bParallelDownload); + ulReadProgress+=12; + + if( usAmountRead != 3 * sizeof(ULONG) ) + { + fprintf(stderr, "\r \r"); + printf("Error reading header - %s\n", XmsErrorString(xmsError)); + if( !bParallelDownload && !bSerialDownload ) + _close(hImage); + + return FALSE; + } + + ulSectionAddress = *(PULONG)&ucBuffer[0]; + ulSectionSize = *(PULONG)&ucBuffer[4]; + ulSectionChecksum = *(PULONG)&ucBuffer[8]; + + if( ulSectionAddress == 0 ) + { + *pulEntryPoint = ulSectionSize; + + break; + } + + if( ulSectionAddress < ulLinearAddress || + (ulSectionAddress + ulSectionSize) > + (ulLinearAddress + (ULONG)usLargestBlock * 1024) ) + { + fprintf(stderr, "\r \r"); + printf( + "Error image section doesn't fit in allocated block\n" + "Block allocated at 0x%lX, size = %ld\n" + "Section physical start = 0x%8.8lX, size = %ld\n" + "Memory too low in your VM might cause this.\n" + "\n" + ">> Increase memory may fix this.\n", + ulLinearAddress, (ULONG)usLargestBlock * 1024, + ulSectionAddress, ulSectionSize); + + if( !bParallelDownload && !bSerialDownload ) + _close(hImage); + + return FALSE; + } + + if( bVerbose ) + { + fprintf(stderr, "\r \r"); + printf( + "Section physical start = 0x%8.8lX, size = %ld\n", + ulSectionAddress, ulSectionSize); + } + + ulChecksum = 0; + + for( ulSectionOffset = 0; ulSectionOffset < ulSectionSize; ) + { + if( (ulSectionSize - ulSectionOffset) < CHUNKSIZE ) + { + usReadSize = (USHORT)(ulSectionSize - ulSectionOffset); + } + else + { + usReadSize = CHUNKSIZE; + } + usAmountRead = DownloadRead(hImage, ucBuffer, usReadSize,bParallelDownload); + + if( usAmountRead != usReadSize ) + { + fprintf(stderr, "\r \r"); + printf("Error reading section - %s\n", XmsErrorString(xmsError)); + if( !bParallelDownload && !bSerialDownload ) + _close(hImage); + + return FALSE; + } + ulReadProgress+= usReadSize; + DrawPercent(ulReadProgress, ulReadTotal); + +#if 0 + for( usIndex = 0; usIndex < usAmountRead; usIndex++ ) + { + ulChecksum += ucBuffer[usIndex]; + } +#endif + +#if 1 + xmsError = XmsMoveExtendedMemory( + 0, (ULONG)(UCHAR far *)ucBuffer, + usBlockHandle, ulSectionAddress - ulLinearAddress + ulSectionOffset, + (usAmountRead + 1) & ~1U); + + if( xmsError != XMS_SUCCESS ) + { + fprintf(stderr, "\r \r"); + printf("Error moving extended memory - %s\n", XmsErrorString(xmsError)); + if( !bParallelDownload && !bSerialDownload ) + _close(hImage); + + return FALSE; + } +#endif + ulSectionOffset += usAmountRead; + } +#if 0 + if( ulChecksum != ulSectionChecksum ) + { + fprintf(stderr, "\r \r"); + printf( + "Bad checksum 0x%8.8lX, expected 0x%8.8lX\n", + ulChecksum, ulSectionChecksum); + + if( !bParallelDownload && !bSerialDownload ) + _close(hImage); + + return FALSE; + } +#endif + } + + DrawPercent(ulReadTotal, ulReadTotal); + + if( !bParallelDownload && !bSerialDownload ) + { + _close(hImage); + } + + // Stop the floppy motor in case it contained the image file + + __asm + { + push dx + mov dx, 03F2h ; Floppy motor and DMA control + in al, dx + and al, 00Fh ; Clear motor on bits + out dx, al + pop dx + } + fprintf(stderr, "\r \r"); + + // Indicate success + + return( TRUE ); +} + +//------------------------------------------------------------------------------ +// +// Function Name: GetPCIConfigMechanism() +// Description..: Execute trap to obtain PCI configuration Mechanism. +// Inputs.......: none +// Outputs......: UCHAR 0 indicates no PCI bus, else PCI configuration mech. +// +//------------------------------------------------------------------------------ + +static UCHAR GetPCIConfigMechanism() +{ + UCHAR ucPCIVersionMajor; + UCHAR ucPCIVersionMinor; + UCHAR ucPCIBus; + UCHAR ucPCIConfigMech; + + __asm + { + mov ax, 0xB101 + int 0x1A + + jc noPCI + + cmp dx, 0x4350 ; 'CP' + + jne noPCI + + or ah, ah + jnz noPCI + + mov ucPCIVersionMajor, bh + mov ucPCIVersionMinor, bl + mov ucPCIBus, cl + + and al, 0x03 + mov ucPCIConfigMech, al + } + + // Indicate PCI bus info + + /*printf( "%d PCI bus%s (Version %X.%2.2X) using Configuration Mechanism # %d\n", + ucPCIBus + 1, ucPCIBus == 0 ? "" : "ses", + ucPCIVersionMajor, ucPCIVersionMinor, ucPCIConfigMech);*/ + + + // Indicate Configuration mechanism + + return( UCHAR)((ucPCIBus << 2) | ucPCIConfigMech ); + + // Indicate no PCI bus + + noPCI: printf( "PCI bus not detected\n" ); + return( 0 ); +} + +//------------------------------------------------------------------------------ +// +// Type Name..: JUMP_PACKET +// Description: Defines the JUMP_PACKET type. Type is byte aligned. +// +//------------------------------------------------------------------------------ + +#pragma pack(1) + +typedef struct JUMP_PACKET +{ + UCHAR Header[BOOT_HEADER_SIZE]; + WORD wLen; + DWORD dwTransport; + UCHAR ucChkSum; + UCHAR Tail[BOOT_TAIL_SIZE]; +} +JUMP_PACKET, *PJUMP_PACKET; + +#pragma pack() + + +//------------------------------------------------------------------------------ +// +// Function Name: GetJumpFlags(void) +// Description..: This function validates the JUMP_PACKET and if valid +// indicates the transport parameter. +// Inputs.......: none +// Outputs......: 0 indicates JUMP_PACKET failure, else Transport parameter +// +//------------------------------------------------------------------------------ + +static WORD GetJumpFlags(void) +{ + JUMP_PACKET Packet; + USHORT usRead; + UCHAR *pData; + UCHAR CheckSum; + int i; + + usRead = DownloadRead( 0, (UCHAR *)&Packet, sizeof(Packet), TRUE ); + + // check read size + + if( usRead != sizeof(Packet) ) + { + printf( "Read Packet Failed\n" ); + return 0; // KTS_DEFAULT + } + + // check header/tail valid + + if( (memcmp(Packet.Header, BootHeader, 4) != 0) || + (memcmp(Packet.Tail, BootTail, 4) != 0) ) + { + printf( "Read Header/Tail failed\n"); + return 0; + } + + // check command + + if( Packet.Header[4] != 0x00 || Packet.Header[5] != 0x00 ) + { + printf("Invalid Command\n"); + return 0; + } + + // check wlen + + if( Packet.wLen != 9 ) + { + printf("Invalid Length\n"); + return 0; + } + + // check checksum + + CheckSum = 0; + + for( i=0, pData = (UCHAR *)&Packet.dwTransport; i < sizeof(Packet.dwTransport); i++, pData++ ) + { + CheckSum += *pData; + } + + if( CheckSum != Packet.ucChkSum ) + { + printf("Invalid checksum\n"); + return 0; + } + + // Packet is valid - indicate Transport + + return( (WORD)Packet.dwTransport ); +} + + +//------------------------------------------------------------------------------ +// +// Function Name: DisplayCEOSVersion(void) +// Description..: This function searches through the Image binary (e.g. eboot.bin) looking for +// a Windows CE Version number, delimited by a unique string--> "$@( VER $@(" +// Inputs.......: char *pszFileName, denotes the image being loaded by LoadImage +// Outputs......: none, simply prints debug info to the user +// +//------------------------------------------------------------------------------ + +static void DisplayCEOSVersion(char *pszFileName) +{ + +#define DELIM_LEN 3 + + char delim[] = "$@("; // To change delimiter, modify delim & DELIM_LEN! + char *delim_ptr = delim; + char *delim_end = delim + DELIM_LEN; + int align32bit = 4 - ( DELIM_LEN % 4 ); + + FILE *lImageFile = NULL; + int ver_lo,ver_hi; + int done = 0; // Loop exit condition, done = 1 denotes version found + int iterations = 0; // Used to limit search length + int cnt; + + lImageFile = fopen( pszFileName, "rb" ); + + // Algorithm to search through image for 'delim' (version) 'delim' + // If successful, sets done = 1. + if( lImageFile ) { + + while( !feof(lImageFile) && !done && (iterations++ < 512) ) { + + if( fgetc(lImageFile) == *delim_ptr ) { + delim_ptr++; + } else { + delim_ptr = delim; + } + + if( delim_ptr == delim_end ) { + + // Initial delimiter string found, collect data: + fseek(lImageFile, align32bit, SEEK_CUR); // next 32-bit boundary + ver_lo = fgetc(lImageFile); // Get two bytes (in a DWORD) + ver_hi = fgetc(lImageFile); + fseek(lImageFile, 2, SEEK_CUR); // Skip two bytes to next 32-bit boundary + + delim_ptr = delim; + + for( cnt=0; cnt < DELIM_LEN; cnt++) { + if( fgetc(lImageFile) == *delim_ptr ) { + delim_ptr++; + } + } + + if( delim_ptr == delim_end ) { + done = 1; + } + } + } + + fclose( lImageFile ); + } + + if (done) { + printf("Booting %s compiled with Windows CE Version %d\n", pszFileName, (ver_lo | (ver_hi << 8)) ); + } else { + printf("%s: Unknown or old version of bootloader\n", pszFileName); + } + +} \ No newline at end of file diff --git a/DOS/LOADCEPC/main.cod b/DOS/LOADCEPC/main.cod new file mode 100644 index 0000000..0c4ba6e --- /dev/null +++ b/DOS/LOADCEPC/main.cod @@ -0,0 +1,4574 @@ +; Static Name Aliases +; +; $S775_?ucBuffer@?1??LoadImage@@9@9 EQU ?ucBuffer@?1??LoadImage@@9@9 +; $S519_BootHeader EQU BootHeader +; $S520_BootTail EQU BootTail +; $S777_?ucSignature@?1??LoadImage@@9@9 EQU ?ucSignature@?1??LoadImage@@9@9 + TITLE main.c + .286p + .287 +INCLUDELIB SLIBCE +INCLUDELIB OLDNAMES.LIB +_TEXT SEGMENT WORD PUBLIC 'CODE' +_TEXT ENDS +_DATA SEGMENT WORD PUBLIC 'DATA' +_DATA ENDS +CONST SEGMENT WORD PUBLIC 'CONST' +CONST ENDS +_BSS SEGMENT WORD PUBLIC 'BSS' +_BSS ENDS +$$SYMBOLS SEGMENT BYTE PUBLIC 'DEBSYM' +$$SYMBOLS ENDS +$$TYPES SEGMENT BYTE PUBLIC 'DEBTYP' +$$TYPES ENDS +DGROUP GROUP CONST, _BSS, _DATA + ASSUME DS: DGROUP, SS: DGROUP +PUBLIC _BaudTable +PUBLIC _bSerialDownload +PUBLIC _iDesiredMode +EXTRN __acrtused:ABS +EXTRN _fprintf:NEAR +EXTRN _XmsErrorString:NEAR +EXTRN _signal:NEAR +EXTRN __filelength:NEAR +EXTRN _fseek:NEAR +EXTRN __open:NEAR +EXTRN __read:NEAR +EXTRN _OEMInitDebugSerial:NEAR +EXTRN _atol:NEAR +EXTRN _printf:NEAR +EXTRN __strerror:NEAR +EXTRN _OEMReadDebugBytes:NEAR +EXTRN _exit:NEAR +EXTRN _OEMWriteDebugByte:NEAR +EXTRN _OEMParallelPortGetByte:NEAR +EXTRN _XmsIsInstalled:NEAR +EXTRN _XmsLocalEnableA20:NEAR +EXTRN _OEMParallelPortSendByte:NEAR +EXTRN _strrchr:NEAR +EXTRN _OEMParallelPortInit:NEAR +EXTRN _XmsQueryA20:NEAR +EXTRN _Launch:NEAR +EXTRN _XmsQueryFreeExtendedMemory:NEAR +EXTRN _SetVideoMode:NEAR +EXTRN _ParseVESAOptions:NEAR +EXTRN _XmsAllocateExtendedMemory:NEAR +EXTRN _ParseEthernetOptions:NEAR +EXTRN _XmsFreeExtendedMemory:NEAR +EXTRN _ParseDeviceName:NEAR +EXTRN _DrawPercent:NEAR +EXTRN _fclose:NEAR +EXTRN _DisplayDirectory:NEAR +EXTRN _XmsMoveExtendedMemory:NEAR +EXTRN _fgetc:NEAR +EXTRN _tolower:NEAR +EXTRN _XmsLockExtendedMemory:NEAR +EXTRN _GetFile:NEAR +EXTRN _fopen:NEAR +EXTRN _XmsUnlockExtendedMemory:NEAR +EXTRN __close:NEAR +EXTRN _NoPPFS:WORD +_BSS SEGMENT +COMM NEAR _BootArgs: BYTE: 170 +COMM NEAR _usBlockHandle: BYTE: 2 +_BSS ENDS +EXTRN __iob:BYTE +_DATA SEGMENT +$S519_BootHeader DB 0aaH + DB 055H + DB 055H + DB 0aaH + DB 00H + DB 00H +$S520_BootTail DB 05aH + DB 0a5H + DB 0aH + DB 01aH +_BaudTable DD 02580H + DB 0cH + DB 1 DUP(0) + + DD 04b00H + DB 06H + DB 1 DUP(0) + + DD 09600H + DB 03H + DB 1 DUP(0) + + DD 0e100H + DB 02H + DB 1 DUP(0) + + DD 01c200H + DB 01H + DB 1 DUP(0) + +_bSerialDownload DW 00H +_iDesiredMode DW 00H +$SG610 DB '300STD.bin', 00H +$SG638 DB 'Invalid option - %s', 0aH, 00H +$SG645 DB 'Unsupported baud rate - %s', 0aH, 00H +$SG649 DB 'Invalid option - %s', 0aH, 00H +$SG653 DB 'Invalid option - %s', 0aH, 00H +$SG656 DB 'The /E and /K options are mutually exclusive - please choose' + DB ' one of them.', 0dH, 0aH, 00H +$SG658 DB 'Invalid option - %s', 0aH, 00H +$SG661 DB 'The /E and /K options are mutually exclusive- please choose ' + DB 'one of them.', 0dH, 0aH, 00H +$SG663 DB 'Invalid option - %s', 0aH, 00H +$SG666 DB 'Invalid option - %s', 0aH, 00H +$SG669 DB 'Invalid option - %s', 0aH, 00H +$SG681 DB '*.*', 00H +$SG690 DB 'Error source path missing', 0aH, 00H +$SG694 DB 'Unrecognized option - %s', 0aH, 00H +$SG699 DB 'HIMEM.SYS must be loaded', 0aH, 00H +$SG702 DB 'Error querying A20 status - %s', 0aH, 00H +$SG704 DB 'Warning A20 line already enabled', 0aH, 00H +$SG707 DB 'Can''t enable A20 line, error = 0x%4.4X', 0aH, 00H +$SG715 DB 'Jumping to 0x%8.8lX', 0aH, 00H +$SG717 DB 0aH, 0aH, ' Press any key to cancel.', 0aH, 00H +$SG724 DB 0aH, '%s: Loads a BIN image into memory and boots it.', 0aH + DB 0aH, 'Usage:%s /B:baud /C:Port /D:display /P /H /V /N:name', 0aH + DB ' (/E|/K):IO:IRQ[:] /L:VXxVYxBPP[:PXxPY] ', 0aH, 0aH, ' /B Baud Rate [9600|19200|38400(default' + DB ')|57600|115200]', 0aH, ' /C Communications Port [0=disabl' + DB 'e|1|2|3|4]', 0aH, ' /D Display Resolution (for VESA modes' + DB ', use the /L option instead).', 0aH, ' 0 = 320x200x256' + DB ' (default), 1 = 480x240x256,', 0aH, ' 2 = 640x480x256,' + DB ' 3 = 800x600x256, 4 = 1024x768x256', 0aH, ' 5 = 240x32' + DB '0x256, 6 = 208x240x256', 0aH, 0aH, ' /P Parallel port bo' + DB 'ot download.', 0aH, 0aH, ' /A Use permanent storage devi' + DB 'ce to store NK image.', 0aH, 0aH, ' /H Help - displays t' + DB 'his message.', 0aH, 0aH, ' Default is NK.BIN ' + DB 'except for /P option which uses', 0aH, ' default on host u' + DB 'nless specified.', 0aH, 0aH, 'Press any key fo' + DB 'r more options...', 00H +$SG725 DB 0aH, 0aH, 0aH, 'Usage:%s /B:baud /C:Port /D:display /P /H ' + DB '/V /N:name', 0aH, ' (/E|/K):IO:IRQ[:] /L:VXxVYx' + DB 'BPP[:PXxPY] ', 0aH, 0aH, ' /V Verbose - displ' + DB 'ays extra status information during boot.', 0aH, 0aH, ' /' + DB 'E:IO:IRQ[:] (Debug Ethernet Card parameters)', 0aH + DB ' IO - IO Base Address (specified in hexadecimal)', 0aH + DB ' IRQ - Interrupt (specified in decimal or hexadecimal)', 0aH + DB ' Dotted IP - (optional) static IP address (No DHCP)', 0aH + DB ' NOTE: The /E and /K options are mutually exclusive.', 0aH + DB 0aH, ' /K:IO:IRQ[:] (RNDIS Card parameters)', 0aH + DB ' IO - IO Base Address (specified in hexadecimal)', 0aH + DB ' IRQ - Interrupt (specified in decimal or hexadecimal)', 0aH + DB ' Dotted IP - (optional) static IP address (No DHCP)', 0aH + DB ' NOTE: The /E and /K options are mutually exclusive.', 0aH + DB 0aH, ' /L:DXxDYxBPP[:PXxPY] (Use VESA VBE Linear/Flat Frame' + DB 'buffer video mode)', 0aH, ' DX, DY - Display X and Y ' + DB 'Sizes', 0aH, ' BPP - Bits Per Pixel Color Depth (8, 16' + DB ', 24, or 32)', 0aH, ' PX, PY - (optional) Physical Sc' + DB 'reen X and Y Sizes to simulate a', 0aH, ' sm' + DB 'all device display (PX & PY should be greater than DX & DY).' + DB 0aH, ' /N:name Optionally specify a device name to be used ' + DB 'when creating', 0aH, ' the Ethernet debug name (fo' + DB 'r host-side connectivity).', 0aH, 0aH, 'Press any key for ' + DB 'more options...', 00H +$SG726 DB 0aH, 'Usage: %s -s[:] -(g|r|u)[[:] []', 0aH, '-s Show a directory of files matching <' + DB 'pattern>.', 0aH, 0aH, '-g Get files matching ' + DB 'and copy them to the', 0aH, ' optionally specified . Any existing file with', 0aH, ' the same ' + DB 'name will be overwritten.', 0aH, 0aH, '-r Refresh files' + DB ' matching which already exist in ', 0aH + DB ' and have a timestamp newer than the one in .', 0aH, 0aH, '-u Update files matching whi' + DB 'ch don''t already exist in', 0aH, ' or t' + DB 'hose that have a timestamp newer than those', 0aH, ' i' + DB 'n .', 0aH, 0aH, ' Windows filename p' + DB 'ath with optional wildcard characters.', 0aH, 0aH, ' If not specified then the current directory is the d' + DB 'efault.', 0aH, ' If specified and it doesn''t exist an' + DB 'd the last character is \,', 0aH, ' then the directory' + DB ' is created. Otherwise is', 0aH, ' trea' + DB 'ted as the name of the file.', 0aH, ' It is an error f' + DB 'or to match multiple files', 0aH, ' when specifies a file.', 0aH, 'For CE Collections - L' + DB 'ast built with ver.2.01-Beta1-02', 00H + ORG $+1 +$S777_?ucSignature@?1??LoadImage@@9@9 DB 042H + DB 030H + DB 030H + DB 030H + DB 046H + DB 046H + DB 0aH +$SG787 DB 'Error querying free extended memory - %s', 0aH, 00H +$SG789 DB ' ImageName:......: %s', 0aH, 00H +$SG790 DB ' FLATMode........: %d', 0aH, 00H +$SG791 DB ' VESAMode........: 0x%x', 0aH, 00H +$SG792 DB ' FreeEMSMem......: %u', 0aH, 00H +$SG793 DB ' LagestBlock.....: %u', 0aH, 00H +$SG794 DB ' ==========Booting - Press CTRL+C to cancel=====' + DB '====', 0aH, ' ', 00H +$SG795 DB ' ', 00H +$SG796 DB ' ', 00H +$SG798 DB 'Total free extended memory = %u, largest block = %u', 0aH, 00H +$SG800 DB 'Error allocating extended memory - %s', 0aH, 00H +$SG803 DB 0dH, ' ' + DB ' ', 0dH, 00H +$SG804 DB 'Error locking extended memory - %s', 0aH, 00H +$SG807 DB 0dH, ' ' + DB ' ', 0dH, 00H +$SG808 DB 'Block allocated at 0x%lX', 0aH, 00H +$SG815 DB 0dH, ' ' + DB ' ', 0dH, 00H +$SG816 DB 'Error zeroing extended memory - %s', 0aH, 00H +$SG826 DB 'Loading image %s via serial port.', 0dH, 0aH, 00H +$SG828 DB 'Loading image %s via parallel port.', 0dH, 0aH, 00H +$SG834 DB 'Loading host default image via serial port.', 0dH, 0aH, 00H +$SG836 DB 'Loading host default image via parallel port.', 0dH, 0aH, 00H +$SG851 DB 'Sending boot packet: ', 00H +$SG857 DB '%x ', 00H +$SG861 DB 'Sent.', 0dH, 0aH, 00H +$SG864 DB '%s: Error opening file - %s', 0aH, 00H +$SG866 DB '%s: Error obtaining file size - %s', 0aH, 00H +$SG869 DB 'Loading %s, size = %ld', 0aH, 00H +$SG871 DB 'Error reading signature - %s', 0aH, 00H +$SG874 DB 'Error invalid signature', 0aH, 'Data: ', 00H +$SG878 DB '%x ', 00H +$SG879 DB 0dH, 0aH, 00H +$SG882 DB 'Image physical start = 0x%8.8lX, size = %ld', 0aH, 00H +$SG883 DB 00H +$SG888 DB 0dH, ' ' + DB ' ', 0dH, 00H +$SG889 DB 'Error reading header - %s', 0aH, 00H +$SG894 DB 0dH, ' ' + DB ' ', 0dH, 00H +$SG895 DB 'Error image section doesn''t fit in allocated block', 0aH, 'B' + DB 'lock allocated at 0x%lX, size = %ld', 0aH, 'Section physica' + DB 'l start = 0x%8.8lX, size = %ld', 0aH, 'Memory too low in yo' + DB 'ur VM might cause this.', 0aH, 0aH, '>> Increase memory ma' + DB 'y fix this.', 0aH, 00H +$SG898 DB 0dH, ' ' + DB ' ', 0dH, 00H +$SG899 DB 'Section physical start = 0x%8.8lX, size = %ld', 0aH, 00H +$SG906 DB 0dH, ' ' + DB ' ', 0dH, 00H +$SG907 DB 'Error reading section - %s', 0aH, 00H +$SG910 DB 0dH, ' ' + DB ' ', 0dH, 00H +$SG911 DB 'Error moving extended memory - %s', 0aH, 00H +$SG914 DB 0dH, ' ' + DB ' ', 0dH, 00H +$SG921 DB 'PCI bus not detected', 0aH, 00H +$SG932 DB 'Read Packet Failed', 0aH, 00H +$SG935 DB 'Read Header/Tail failed', 0aH, 00H +$SG938 DB 'Invalid Command', 0aH, 00H +$SG940 DB 'Invalid Length', 0aH, 00H +$SG945 DB 'Invalid checksum', 0aH, 00H +$SG950 DB '$@(', 00H +$SG960 DB 'rb', 00H +$SG974 DB 'Booting %s compiled with Windows CE Version %d', 0aH, 00H +$SG976 DB '%s: Unknown or old version of bootloader', 0aH, 00H +_DATA ENDS +_BSS SEGMENT +$S775_?ucBuffer@?1??LoadImage@@9@9 DW 04000H DUP (?) +_BSS ENDS +_TEXT SEGMENT + ASSUME CS: _TEXT + PUBLIC _main +_main PROC NEAR +;|*** // +;|*** // Copyright (c) Microsoft Corporation. All rights reserved. +;|*** // +;|*** // +;|*** // Use of this source code is subject to the terms of the Microsoft end-user +;|*** // license agreement (EULA) under which you licensed this SOFTWARE PRODUCT. +;|*** // If you did not accept the terms of the EULA, you are not authorized to use +;|*** // this source code. For a copy of the EULA, please see the LICENSE.RTF on your +;|*** // install media. +;|*** // +;|*** +;|*** /*++ +;|*** THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +;|*** ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +;|*** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +;|*** PARTICULAR PURPOSE. +;|*** +;|*** Module Name: main.c +;|*** +;|*** Abstract: This program, loadcepc.exe, is responsible for loading +;|*** a binary image into memory and booting the image. It +;|*** processes the boot arguments, loads the image file, and +;|*** then executes it. +;|*** +;|*** Functions: +;|*** +;|*** +;|*** Notes: none +;|*** +;|*** --*/ +;|*** +;|*** // Include Files +;|*** +;|*** #include +;|*** #include +;|*** #include +;|*** #include +;|*** #include +;|*** #include +;|*** #include +;|*** #include "loadcepc.h" +;|*** #include "xmsapi.h" +;|*** #include "ethernet.h" +;|*** #include +;|*** +;|*** +;|*** // Externs +;|*** +;|*** extern int NoPPFS; // parallel port not present flag +;|*** +;|*** +;|*** // Defines +;|*** +;|*** #define CHUNKSIZE (32768) +;|*** #define COPY_FLAG_UPDATE_EXISTING (0x0001) +;|*** #define COPY_FLAG_UPDATE_OR_ADD (0x0002) +;|*** +;|*** +;|*** // Variables +;|*** +;|*** // Boot Header +;|*** +;|*** static const unsigned char BootHeader[] = +;|*** { +;|*** 0xAA, // header = 4 bytes +;|*** 0x55, +;|*** 0x55, +;|*** 0xAA, +;|*** 0x00, // opcode = 2 bytes (0 = BOOT) +;|*** 0x00, +;|*** }; +;|*** +;|*** #define BOOT_HEADER_SIZE (sizeof(BootHeader) / sizeof(BootHeader[0])) +;|*** +;|*** +;|*** // Boot Trailer +;|*** +;|*** static const unsigned char BootTail[] = +;|*** { +;|*** 0x5A, // trail = 4 bytes +;|*** 0xA5, +;|*** 0x0A, +;|*** 0x1A +;|*** }; +;|*** +;|*** #define BOOT_TAIL_SIZE (sizeof(BootTail) / sizeof(BootTail[0])) +;|*** +;|*** #define BOOT_TYPE (-4) // boot type for x86 +;|*** +;|*** +;|*** // Baud Rate +;|*** +;|*** struct +;|*** { +;|*** ULONG ulRate; +;|*** UCHAR ucDivisor; +;|*** } +;|*** BaudTable[] = +;|*** { +;|*** { 9600, 12}, +;|*** { 19200, 6}, +;|*** { 38400, 3}, +;|*** { 57600, 2}, +;|*** { 115200, 1} +;|*** }; +;|*** +;|*** #define NUM_BAUD_RATES (sizeof(BaudTable) / sizeof(BaudTable[0])) +;|*** +;|*** +;|*** BOOT_ARGS BootArgs; +;|*** USHORT usBlockHandle; // XMS memory handle +;|*** BOOL bSerialDownload=FALSE; +;|*** +;|*** +;|*** // Function Prototypes +;|*** +;|*** // External Functions +;|*** +;|*** void OEMInitDebugSerial(void); +;|*** int OEMReadDebugByte(void); +;|*** void OEMReadDebugBytes(unsigned char * ucBuffer, int usReadSize); +;|*** void OEMWriteDebugByte(unsigned char ch); +;|*** int OEMParallelPortGetByte(void); +;|*** void OEMParallelPortSendByte(UCHAR chData); +;|*** void OEMParallelPortInit(void); +;|*** void Launch( ULONG ulEntryPoint, ULONG ulArguments ); +;|*** +;|*** // in video.c +;|*** +;|*** UCHAR SetVideoMode( int iDesiredMode); +;|*** BOOL ParseVESAOptions( char * params); +;|*** +;|*** // in ethmain.c +;|*** +;|*** BOOL ParseEthernetOptions( char * argstr); +;|*** BOOL ParseDeviceName( char * argstr); +;|*** +;|*** // in ppfstool.c +;|*** +;|*** void DrawPercent( DWORD CurValue, DWORD MaxValue); +;|*** void DisplayDirectory( char *pszPath); +;|*** void GetFile( char *pszSource, char *pszDestination, USHORT usCopyFlags); +;|*** +;|*** // Local Functions +;|*** +;|*** static void usage( char *pszProgramNameArg ); +;|*** static void ExitSigHandler( int sig ); +;|*** static WORD GetJumpFlags( void ); +;|*** static UCHAR GetPCIConfigMechanism(); +;|*** static USHORT DownloadRead( int hImage, +;|*** UCHAR *ucBuffer, +;|*** USHORT usReadSize, +;|*** BOOL bParallelDownload ); +;|*** static int LoadImage ( BOOL bVerbose, +;|*** BOOL bParallelDownload, +;|*** char *pszFileName, +;|*** PULONG pulEntryAddress); +;|*** static void DisplayCEOSVersion( char *pszFileName); +;|*** +;|*** +;|*** //------------------------------------------------------------------------------ +;|*** // +;|*** // Function Name: main( int argc, char **argv ) +;|*** // Description..: Main entry point. +;|*** // Inputs.......: argc, argv +;|*** // Outputs......: int exit status +;|*** // +;|*** //------------------------------------------------------------------------------ +;|*** +;|*** int iDesiredMode = 0; +;|*** int main( int argc, char **argv ) +;|*** { +; Line 172 + *** 000000 c8 2c 00 00 enter 44,0 + *** 000004 57 push di + *** 000005 56 push si +; pszFileName = -2 +; ulEntryPoint = -6 +; ulArguments = -10 +; xmsError = -12 +; bEnabled = -14 +; bVerbose = -16 +; bParallelDownload = -18 +; bBackupImage = -20 +; ulBaudRate = -24 +; cOption = -26 +; i = -28 +; ret = -30 +; iPpfstool = -32 +; bRNDISDownload = -34 +; bEtherDownload = -36 +; argv = 6 +; argc = 4 +;|*** char * pszFileName = "300STD.bin"; +; Line 173 + *** 000006 c7 46 fe 00 00 mov WORD PTR [bp-2],OFFSET DGROUP:$SG610 ;pszFileName +;|*** ULONG ulEntryPoint; +;|*** ULONG ulArguments; +;|*** int xmsError; +;|*** BOOL bEnabled; +;|*** BOOL bVerbose = FALSE; +;|*** BOOL bParallelDownload=FALSE; +;|*** BOOL bBackupImage=FALSE; +;|*** ULONG ulBaudRate; +;|*** char cOption; +;|*** int i = 0; +;|*** int ret = 0; +;|*** int iPpfstool=0; +;|*** BOOL bRNDISDownload=FALSE; +;|*** BOOL bEtherDownload=FALSE; +; Line 187 + *** 00000b 33 c0 xor ax,ax + *** 00000d 89 46 f0 mov WORD PTR [bp-16],ax ;bVerbose + *** 000010 89 46 ee mov WORD PTR [bp-18],ax ;bParallelDownload + *** 000013 89 46 ec mov WORD PTR [bp-20],ax ;bBackupImage + *** 000016 89 46 e4 mov WORD PTR [bp-28],ax ;i + *** 000019 89 46 e2 mov WORD PTR [bp-30],ax ;ret + *** 00001c 89 46 e0 mov WORD PTR [bp-32],ax ;iPpfstool + *** 00001f 89 46 de mov WORD PTR [bp-34],ax ;bRNDISDownload + *** 000022 89 46 dc mov WORD PTR [bp-36],ax ;bEtherDownload +;|*** +;|*** // Setup signal handler for Ctrl+C/Ctrl+Break +;|*** +;|*** signal( SIGINT, ExitSigHandler ); +; Line 191 + *** 000025 68 00 00 push OFFSET ExitSigHandler + *** 000028 6a 02 push 2 + *** 00002a e8 00 00 call _signal + *** 00002d 83 c4 04 add sp,4 +;|*** signal( SIGTERM, ExitSigHandler ); +; Line 192 + *** 000030 68 00 00 push OFFSET ExitSigHandler + *** 000033 6a 0f push 15 ;000fH + *** 000035 e8 00 00 call _signal + *** 000038 83 c4 04 add sp,4 +;|*** signal( SIGABRT, ExitSigHandler ); +; Line 193 + *** 00003b 68 00 00 push OFFSET ExitSigHandler + *** 00003e 6a 16 push 22 ;0016H + *** 000040 e8 00 00 call _signal + *** 000043 83 c4 04 add sp,4 +;|*** +;|*** // Initialize the boot args block +;|*** +;|*** memset( &BootArgs, 0, sizeof(BOOT_ARGS)); +; Line 197 + *** 000046 33 c0 xor ax,ax + *** 000048 bb 00 00 mov bx,OFFSET DGROUP:_BootArgs + *** 00004b b9 55 00 mov cx,85 ;0055H + *** 00004e 8b fb mov di,bx + *** 000050 1e push ds + *** 000051 07 pop es + *** 000052 f3 rep + *** 000053 ab stosw +;|*** BootArgs.ucVideoMode = 0; +;|*** BootArgs.ucComPort = 1; +; Line 199 + *** 000054 c6 06 01 00 01 mov BYTE PTR _BootArgs+1,1 +;|*** BootArgs.ucBaudDivisor = 3; // Default 38400 +; Line 200 + *** 000059 c6 06 02 00 03 mov BYTE PTR _BootArgs+2,3 +;|*** BootArgs.ucPCIConfigType = 0; +; Line 201 + *** 00005e a2 00 00 mov BYTE PTR _BootArgs,al + *** 000061 a2 03 00 mov BYTE PTR _BootArgs+3,al +;|*** BootArgs.dwSig = BOOTARG_SIG; +; Line 202 + *** 000064 c7 06 04 00 42 4f mov WORD PTR _BootArgs+4,20290 ;4f42H + *** 00006a c7 06 06 00 4f 54 mov WORD PTR _BootArgs+6,21583 ;544fH +;|*** BootArgs.dwLen = sizeof(BOOT_ARGS); +; Line 203 + *** 000070 c7 06 08 00 aa 00 mov WORD PTR _BootArgs+8,170 ;00aaH + *** 000076 a3 0a 00 mov WORD PTR _BootArgs+10,ax +;|*** BootArgs.dwVersionSig = BOOT_ARG_VERSION_SIG; +; Line 204 + *** 000079 c7 06 80 00 78 56 mov WORD PTR _BootArgs+128,22136 ;5678H + *** 00007f c7 06 82 00 34 12 mov WORD PTR _BootArgs+130,4660 ;1234H +;|*** BootArgs.MajorVersion = BOOT_ARG_MAJOR_VER; +; Line 205 + *** 000085 c7 06 84 00 01 00 mov WORD PTR _BootArgs+132,1 +;|*** BootArgs.MinorVersion = BOOT_ARG_MINOR_VER; +;|*** +;|*** usBlockHandle = 0; +; Line 208 + *** 00008b a3 86 00 mov WORD PTR _BootArgs+134,ax + *** 00008e a3 00 00 mov WORD PTR _usBlockHandle,ax +;|*** +;|*** // Initialize parallel port +;|*** +;|*** OEMParallelPortInit(); +; Line 212 + *** 000091 e8 00 00 call _OEMParallelPortInit +;|*** +;|*** // Process arguments +;|*** +;|*** if( argc > 1 ) +; Line 216 + *** 000094 83 7e 04 01 cmp WORD PTR [bp+4],1 ;argc + *** 000098 7f 03 jg $JCC152 + *** 00009a e9 dd 03 jmp $I696 + $JCC152: +;|*** { +; Line 217 +; iArgIndex = -38 +;|*** int iArgIndex; +;|*** +;|*** for( iArgIndex = 1; iArgIndex < argc; iArgIndex++ ) +; Line 220 + *** 00009d c7 46 da 01 00 mov WORD PTR [bp-38],1 ;iArgIndex + *** 0000a2 e9 a0 03 jmp $F627 + *** 0000a5 90 nop +;|*** { +;|*** if( argv[iArgIndex][0] != '/' && argv[iArgIndex][0] != '-' ) +;|*** { +;|*** break; +;|*** } +;|*** +;|*** cOption = (char)tolower(argv[iArgIndex][1]); +; Line 227 + $I630: +;|*** +;|*** // Process according to option character +;|*** +;|*** switch( cOption ) +; Line 231 + *** 0000a6 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 0000a9 03 db add bx,bx + *** 0000ab 8b 18 mov bx,WORD PTR [bx][si] + *** 0000ad 8a 47 01 mov al,BYTE PTR [bx+1] + *** 0000b0 98 cbw + *** 0000b1 50 push ax + *** 0000b2 e8 00 00 call _tolower + *** 0000b5 83 c4 02 add sp,2 + *** 0000b8 88 46 e6 mov BYTE PTR [bp-26],al ;cOption + *** 0000bb 98 cbw + *** 0000bc 3d 76 00 cmp ax,118 ;0076H + *** 0000bf 75 03 jne $JCC191 + *** 0000c1 e9 10 02 jmp $SC673 + $JCC191: + *** 0000c4 76 03 jbe $JCC196 + *** 0000c6 e9 32 03 jmp $SD693 + $JCC196: + *** 0000c9 3c 68 cmp al,104 ;0068H + *** 0000cb 75 03 jne $JCC203 + *** 0000cd e9 3e 03 jmp $SC695 + $JCC203: + *** 0000d0 7e 03 jle $JCC208 + *** 0000d2 e9 47 03 jmp $L981 + $JCC208: + *** 0000d5 3c 63 cmp al,99 ;0063H + *** 0000d7 75 03 jne $JCC215 + *** 0000d9 e9 ac 00 jmp $SC646 + $JCC215: + *** 0000dc 7e 03 jle $JCC220 + *** 0000de e9 05 03 jmp $L982 + $JCC220: + *** 0000e1 2c 3f sub al,63 ;003fH + *** 0000e3 75 03 jne $JCC227 + *** 0000e5 e9 26 03 jmp $SC695 + $JCC227: + *** 0000e8 2c 22 sub al,34 ;0022H + *** 0000ea 75 03 jne $JCC234 + *** 0000ec e9 cf 01 jmp $SC671 + $JCC234: + *** 0000ef fe c8 dec al + *** 0000f1 74 03 je $JCC241 + *** 0000f3 e9 05 03 jmp $SD693 + $JCC241: +;|*** { +;|*** case 'b': /* Baud rate */ +;|*** +;|*** if( argv[iArgIndex][2] != ':' || +;|*** argv[iArgIndex][3] < '0' || argv[iArgIndex][3] > '9' ) +; Line 236 + *** 0000f6 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 0000f9 03 db add bx,bx + *** 0000fb 8b 76 06 mov si,WORD PTR [bp+6] ;argv + *** 0000fe 8b 18 mov bx,WORD PTR [bx][si] + *** 000100 80 7f 02 3a cmp BYTE PTR [bx+2],58 ;003aH + *** 000104 75 0c jne $I637 + *** 000106 80 7f 03 30 cmp BYTE PTR [bx+3],48 ;0030H + *** 00010a 7c 06 jl $I637 + *** 00010c 80 7f 03 39 cmp BYTE PTR [bx+3],57 ;0039H + *** 000110 7e 18 jle $I636 + $I637: +;|*** { +;|*** printf("Invalid option - %s\n", argv[iArgIndex]); +; Line 238 + *** 000112 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 000115 03 db add bx,bx + *** 000117 ff 30 push WORD PTR [bx][si] + *** 000119 68 00 00 push OFFSET DGROUP:$SG638 + $L1005: + *** 00011c e8 00 00 call _printf + *** 00011f 83 c4 04 add sp,4 +;|*** ret = 1; +; Line 239 + $L1004: + *** 000122 c7 46 e2 01 00 mov WORD PTR [bp-30],1 ;ret +;|*** goto main_error; +; Line 240 + *** 000127 e9 be 04 jmp $main_error639 +;|*** } +;|*** +;|*** ulBaudRate = atol(&argv[iArgIndex][3]); +; Line 243 + $I636: + *** 00012a 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 00012d 03 db add bx,bx + *** 00012f 8b 00 mov ax,WORD PTR [bx][si] + *** 000131 05 03 00 add ax,3 + *** 000134 50 push ax + *** 000135 e8 00 00 call _atol + *** 000138 83 c4 02 add sp,2 + *** 00013b 89 46 e8 mov WORD PTR [bp-24],ax ;ulBaudRate + *** 00013e 89 56 ea mov WORD PTR [bp-22],dx +;|*** +;|*** for( i=0; i < NUM_BAUD_RATES; i++ ) +; Line 245 + *** 000141 c7 46 e4 00 00 mov WORD PTR [bp-28],0 ;i + *** 000146 eb 03 jmp SHORT $F640 +;|*** { +;|*** if( BaudTable[i].ulRate == ulBaudRate ) +;|*** { +;|*** BootArgs.ucBaudDivisor = BaudTable[i].ucDivisor; +;|*** break; +;|*** } +;|*** } +; Line 252 + $FC641: + *** 000148 ff 46 e4 inc WORD PTR [bp-28] ;i + $F640: + *** 00014b 83 7e e4 05 cmp WORD PTR [bp-28],5 ;i + *** 00014f 73 1e jae $FB642 +;|*** if( BaudTable[i].ulRate == ulBaudRate ) +; Line 247 + *** 000151 8b 5e e4 mov bx,WORD PTR [bp-28] ;i + *** 000154 8b cb mov cx,bx + *** 000156 03 db add bx,bx + *** 000158 03 d9 add bx,cx + *** 00015a 03 db add bx,bx + *** 00015c 39 87 00 00 cmp WORD PTR _BaudTable[bx],ax + *** 000160 75 e6 jne $FC641 + *** 000162 39 97 02 00 cmp WORD PTR _BaudTable[bx+2],dx + *** 000166 75 e0 jne $FC641 +;|*** { +;|*** BootArgs.ucBaudDivisor = BaudTable[i].ucDivisor; +; Line 249 + *** 000168 8a 87 04 00 mov al,BYTE PTR _BaudTable[bx+4] + *** 00016c a2 02 00 mov BYTE PTR _BootArgs+2,al +;|*** break; +; Line 250 + $FB642: +;|*** } +;|*** } +;|*** +;|*** if( i >= NUM_BAUD_RATES ) +; Line 254 + *** 00016f 83 7e e4 05 cmp WORD PTR [bp-28],5 ;i + *** 000173 73 03 jae $JCC371 + *** 000175 e9 ca 02 jmp $SB632 + $JCC371: +;|*** { +;|*** printf( "Unsupported baud rate - %s\n", argv[iArgIndex] ); +; Line 256 + *** 000178 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 00017b 03 db add bx,bx + *** 00017d 8b 76 06 mov si,WORD PTR [bp+6] ;argv + *** 000180 ff 30 push WORD PTR [bx][si] + *** 000182 68 00 00 push OFFSET DGROUP:$SG645 + *** 000185 eb 95 jmp SHORT $L1005 + *** 000187 90 nop + $SC646: +;|*** ret = 1; +;|*** goto main_error; +;|*** } +;|*** break; +;|*** +;|*** case 'c': +;|*** +;|*** // COM Port Parameter +;|*** // +;|*** // Allowable values for the COM ports 1-4. Zero (0) is +;|*** // allowed as a way to disable use of the COM port and is +;|*** // allowed by ...\csp\i486\oal\debug.c. +;|*** +;|*** if( (argv[iArgIndex][2] == ':') && +;|*** (argv[iArgIndex][3] >= '0') && +;|*** (argv[iArgIndex][3] <= '4') ) +; Line 272 + *** 000188 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 00018b 03 db add bx,bx + *** 00018d 8b 76 06 mov si,WORD PTR [bp+6] ;argv + *** 000190 8b 18 mov bx,WORD PTR [bx][si] + *** 000192 80 7f 02 3a cmp BYTE PTR [bx+2],58 ;003aH + *** 000196 75 18 jne $I647 + *** 000198 80 7f 03 30 cmp BYTE PTR [bx+3],48 ;0030H + *** 00019c 7c 12 jl $I647 + *** 00019e 80 7f 03 34 cmp BYTE PTR [bx+3],52 ;0034H + *** 0001a2 7f 0c jg $I647 +;|*** { +;|*** BootArgs.ucComPort = (UCHAR)(argv[iArgIndex][3] - '0'); +; Line 274 + *** 0001a4 8a 47 03 mov al,BYTE PTR [bx+3] + *** 0001a7 2c 30 sub al,48 ;0030H + *** 0001a9 a2 01 00 mov BYTE PTR _BootArgs+1,al +;|*** } +;|*** else +;|*** { +;|*** printf( "Invalid option - %s\n", argv[iArgIndex] ); +;|*** ret = 1; +;|*** goto main_error; +;|*** } +;|*** break; +; Line 282 + *** 0001ac e9 93 02 jmp $SB632 + *** 0001af 90 nop + $I647: +;|*** printf( "Invalid option - %s\n", argv[iArgIndex] ); +; Line 278 + *** 0001b0 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 0001b3 03 db add bx,bx + *** 0001b5 ff 30 push WORD PTR [bx][si] + *** 0001b7 68 00 00 push OFFSET DGROUP:$SG649 + *** 0001ba e9 5f ff jmp $L1005 + *** 0001bd 90 nop +;|*** ret = 1; +;|*** goto main_error; +;|*** } +;|*** break; +;|*** +;|*** case 'd': /* Display mode */ +; Line 284 + $SC650: +;|*** +;|*** if( argv[iArgIndex][2] != ':' || +;|*** argv[iArgIndex][3] < '0' || argv[iArgIndex][3] > '6' ) +; Line 287 + *** 0001be 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 0001c1 03 db add bx,bx + *** 0001c3 8b 76 06 mov si,WORD PTR [bp+6] ;argv + *** 0001c6 8b 18 mov bx,WORD PTR [bx][si] + *** 0001c8 80 7f 02 3a cmp BYTE PTR [bx+2],58 ;003aH + *** 0001cc 75 0c jne $I652 + *** 0001ce 80 7f 03 30 cmp BYTE PTR [bx+3],48 ;0030H + *** 0001d2 7c 06 jl $I652 + *** 0001d4 80 7f 03 36 cmp BYTE PTR [bx+3],54 ;0036H + *** 0001d8 7e 0e jle $I651 + $I652: +;|*** { +;|*** printf( "Invalid option - %s\n", argv[iArgIndex] ); +; Line 289 + *** 0001da 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 0001dd 03 db add bx,bx + *** 0001df ff 30 push WORD PTR [bx][si] + *** 0001e1 68 00 00 push OFFSET DGROUP:$SG653 + *** 0001e4 e9 35 ff jmp $L1005 + *** 0001e7 90 nop +;|*** ret = 1; +;|*** goto main_error; +;|*** } +;|*** iDesiredMode = (int)(argv[iArgIndex][3] - '0'); +; Line 293 + $I651: + *** 0001e8 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 0001eb 03 db add bx,bx + *** 0001ed 8b 18 mov bx,WORD PTR [bx][si] + *** 0001ef 8a 47 03 mov al,BYTE PTR [bx+3] + *** 0001f2 98 cbw + *** 0001f3 2d 30 00 sub ax,48 ;0030H + *** 0001f6 e9 92 00 jmp $L1007 + *** 0001f9 90 nop +;|*** break; +;|*** +;|*** case 'e': +; Line 296 + $SC654: +;|*** if( bRNDISDownload ) +; Line 297 + *** 0001fa 83 7e de 00 cmp WORD PTR [bp-34],0 ;bRNDISDownload + *** 0001fe 74 0c je $I655 +;|*** { +;|*** printf( "The /E and /K options are mutually exclusive" +;|*** " - please choose one of them.\r\n" ); +; Line 300 + *** 000200 68 00 00 push OFFSET DGROUP:$SG656 + $L1006: + *** 000203 e8 00 00 call _printf + *** 000206 83 c4 02 add sp,2 +;|*** +;|*** goto main_error; +; Line 302 + *** 000209 e9 dc 03 jmp $main_error639 +;|*** } +;|*** if( !ParseEthernetOptions(argv[iArgIndex]) ) +; Line 304 + $I655: + *** 00020c 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 00020f 03 db add bx,bx + *** 000211 8b 76 06 mov si,WORD PTR [bp+6] ;argv + *** 000214 ff 30 push WORD PTR [bx][si] + *** 000216 8b fb mov di,bx + *** 000218 e8 00 00 call _ParseEthernetOptions + *** 00021b 83 c4 02 add sp,2 + *** 00021e 0b c0 or ax,ax + *** 000220 75 0a jne $I657 +;|*** { +;|*** printf("Invalid option - %s\n", argv[iArgIndex]); +; Line 306 + *** 000222 03 fe add di,si + *** 000224 ff 35 push WORD PTR [di] + *** 000226 68 00 00 push OFFSET DGROUP:$SG658 + *** 000229 e9 f0 fe jmp $L1005 +;|*** ret = 1; +;|*** goto main_error; +;|*** } +;|*** bEtherDownload = TRUE; +; Line 310 + $I657: + *** 00022c c7 46 dc 01 00 mov WORD PTR [bp-36],1 ;bEtherDownload +;|*** break; +; Line 311 + *** 000231 e9 0e 02 jmp $SB632 +;|*** +;|*** case 'k': /* RNDIS flags */ +; Line 313 + $SC659: +;|*** +;|*** if( bEtherDownload ) +; Line 315 + *** 000234 83 7e dc 00 cmp WORD PTR [bp-36],0 ;bEtherDownload + *** 000238 74 06 je $I660 +;|*** { +;|*** printf( "The /E and /K options are mutually exclusive" +;|*** "- please choose one of them.\r\n"); +; Line 318 + *** 00023a 68 00 00 push OFFSET DGROUP:$SG661 + *** 00023d eb c4 jmp SHORT $L1006 + *** 00023f 90 nop +;|*** goto main_error; +;|*** } +;|*** if( !ParseEthernetOptions(argv[iArgIndex]) ) +; Line 321 + $I660: + *** 000240 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 000243 03 db add bx,bx + *** 000245 8b 76 06 mov si,WORD PTR [bp+6] ;argv + *** 000248 ff 30 push WORD PTR [bx][si] + *** 00024a 8b fb mov di,bx + *** 00024c e8 00 00 call _ParseEthernetOptions + *** 00024f 83 c4 02 add sp,2 + *** 000252 0b c0 or ax,ax + *** 000254 75 0a jne $I662 +;|*** { +;|*** printf("Invalid option - %s\n", argv[iArgIndex]); +; Line 323 + *** 000256 03 fe add di,si + *** 000258 ff 35 push WORD PTR [di] + *** 00025a 68 00 00 push OFFSET DGROUP:$SG663 + *** 00025d e9 bc fe jmp $L1005 +;|*** ret = 1; +;|*** goto main_error; +;|*** } +;|*** bRNDISDownload = TRUE; +; Line 327 + $I662: + *** 000260 c7 46 de 01 00 mov WORD PTR [bp-34],1 ;bRNDISDownload +;|*** break; +; Line 328 + *** 000265 e9 da 01 jmp $SB632 +;|*** +;|*** case 'l': +; Line 330 + $SC664: +;|*** +;|*** // VESA VBE Linear/Flat Framebuffer display mode +;|*** +;|*** if( !ParseVESAOptions( argv[iArgIndex] ) ) +; Line 334 + *** 000268 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 00026b 03 db add bx,bx + *** 00026d 8b 76 06 mov si,WORD PTR [bp+6] ;argv + *** 000270 ff 30 push WORD PTR [bx][si] + *** 000272 8b fb mov di,bx + *** 000274 e8 00 00 call _ParseVESAOptions + *** 000277 83 c4 02 add sp,2 + *** 00027a 0b c0 or ax,ax + *** 00027c 75 0a jne $I665 +;|*** { +;|*** printf( "Invalid option - %s\n", argv[iArgIndex] ); +; Line 336 + *** 00027e 03 fe add di,si + *** 000280 ff 35 push WORD PTR [di] + *** 000282 68 00 00 push OFFSET DGROUP:$SG666 + *** 000285 e9 94 fe jmp $L1005 +;|*** ret = 1; +;|*** goto main_error; +;|*** } +;|*** iDesiredMode = BootArgs.vesaMode; +; Line 340 + $I665: + *** 000288 a1 6c 00 mov ax,WORD PTR _BootArgs+108 + $L1007: + *** 00028b a3 00 00 mov WORD PTR _iDesiredMode,ax +;|*** #if 0 +;|*** +;|*** // Video Mode Debug - display and hang +;|*** +;|*** printf( "VESA Boot Options\n" ); +;|*** printf( "vesaMode........: 0x%x\n", BootArgs.vesaMode ); +;|*** printf( "xDisplayScreen..: %d\n", BootArgs.cxDisplayScreen ); +;|*** printf( "YDisplayScreen..: %d\n", BootArgs.cyDisplayScreen ); +;|*** printf( "bppScreen.......: %d\n", BootArgs.bppScreen ); +;|*** printf( "xPhysScreen.....: %d\n", BootArgs.cxPhysicalScreen ); +;|*** printf( "yPhysScreen.....: %d\n", BootArgs.cyPhysicalScreen ); +;|*** +;|*** while( 1 ) +;|*** { +;|*** ; +;|*** } +;|*** #endif +;|*** break; +; Line 358 + *** 00028e e9 b1 01 jmp $SB632 + *** 000291 90 nop +;|*** +;|*** case 'n': /* Device name specified */ +; Line 360 + $SC667: +;|*** +;|*** if( !ParseDeviceName(argv[iArgIndex]) ) +; Line 362 + *** 000292 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 000295 03 db add bx,bx + *** 000297 8b 76 06 mov si,WORD PTR [bp+6] ;argv + *** 00029a ff 30 push WORD PTR [bx][si] + *** 00029c 8b fb mov di,bx + *** 00029e e8 00 00 call _ParseDeviceName + *** 0002a1 83 c4 02 add sp,2 + *** 0002a4 0b c0 or ax,ax + *** 0002a6 74 03 je $JCC678 + *** 0002a8 e9 97 01 jmp $SB632 + $JCC678: +;|*** { +;|*** printf("Invalid option - %s\n", argv[iArgIndex]); +; Line 364 + *** 0002ab 03 fe add di,si + *** 0002ad ff 35 push WORD PTR [di] + *** 0002af 68 00 00 push OFFSET DGROUP:$SG669 + *** 0002b2 e9 67 fe jmp $L1005 + *** 0002b5 90 nop + $SC670: +;|*** ret = 1; +;|*** goto main_error; +;|*** } +;|*** break; +;|*** +;|*** case 'p': /* Parallel port boot download */ +;|*** +;|*** bParallelDownload=TRUE; +; Line 372 + *** 0002b6 c7 46 ee 01 00 mov WORD PTR [bp-18],1 ;bParallelDownload + *** 0002bb eb 0f jmp SHORT $L1008 + *** 0002bd 90 nop +;|*** pszFileName= NULL; +;|*** break; +;|*** +;|*** case 'a': /* Use permanent storage to store image */ +; Line 376 + $SC671: +;|*** +;|*** bBackupImage=TRUE; +; Line 378 + *** 0002be c7 46 ec 01 00 mov WORD PTR [bp-20],1 ;bBackupImage +;|*** break; +; Line 379 + *** 0002c3 e9 7c 01 jmp $SB632 +;|*** +;|*** case 'q': /* Serial port boot download */ +; Line 381 + $SC672: +;|*** +;|*** bSerialDownload=TRUE; +; Line 383 + *** 0002c6 c7 06 00 00 01 00 mov WORD PTR _bSerialDownload,1 +;|*** pszFileName= NULL; +; Line 384 + $L1008: + *** 0002cc c7 46 fe 00 00 mov WORD PTR [bp-2],0 ;pszFileName +;|*** break; +; Line 385 + *** 0002d1 e9 6e 01 jmp $SB632 +;|*** +;|*** case 'v': +; Line 387 + $SC673: +;|*** +;|*** bVerbose = TRUE; +; Line 389 + *** 0002d4 c7 46 f0 01 00 mov WORD PTR [bp-16],1 ;bVerbose +;|*** break; +; Line 390 + *** 0002d9 e9 66 01 jmp $SB632 +;|*** +;|*** case 's': +; Line 392 + $SC674: +;|*** { +; Line 393 +; pszPath = -40 +;|*** char *pszPath; +;|*** +;|*** iPpfstool=1; +; Line 396 + *** 0002dc c7 46 e0 01 00 mov WORD PTR [bp-32],1 ;iPpfstool +;|*** +;|*** if( argv[iArgIndex][2] != '\0' ) +; Line 398 + *** 0002e1 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 0002e4 03 db add bx,bx + *** 0002e6 8b 76 06 mov si,WORD PTR [bp+6] ;argv + *** 0002e9 8b 18 mov bx,WORD PTR [bx][si] + *** 0002eb 80 7f 02 00 cmp BYTE PTR [bx+2],0 + *** 0002ef 74 13 je $I676 +;|*** { +;|*** pszPath = &argv[iArgIndex][2]; +; Line 400 + *** 0002f1 8d 47 02 lea ax,WORD PTR [bx+2] + *** 0002f4 89 46 d8 mov WORD PTR [bp-40],ax ;pszPath +;|*** if( *pszPath == ':' ) +; Line 401 + *** 0002f7 8b d8 mov bx,ax + *** 0002f9 80 3f 3a cmp BYTE PTR [bx],58 ;003aH + *** 0002fc 75 31 jne $I680 +;|*** { +;|*** pszPath++; +; Line 403 + *** 0002fe 40 inc ax + *** 0002ff 89 46 d8 mov WORD PTR [bp-40],ax ;pszPath +;|*** } +;|*** } +;|*** else if( (argc > (i+1) && argv[iArgIndex+1][0] != '-') && +; Line 406 + *** 000302 eb 2b jmp SHORT $I680 + $I676: +;|*** (argv[iArgIndex+1][0] != '/') ) +; Line 407 + *** 000304 8b 46 e4 mov ax,WORD PTR [bp-28] ;i + *** 000307 40 inc ax + *** 000308 3b 46 04 cmp ax,WORD PTR [bp+4] ;argc + *** 00030b 7d 1d jge $I679 + *** 00030d 8b 76 da mov si,WORD PTR [bp-38] ;iArgIndex + *** 000310 8b 5e 06 mov bx,WORD PTR [bp+6] ;argv + *** 000313 03 f6 add si,si + *** 000315 8b 58 02 mov bx,WORD PTR [bx+2][si] + *** 000318 80 3f 2d cmp BYTE PTR [bx],45 ;002dH + *** 00031b 74 0d je $I679 + *** 00031d 80 3f 2f cmp BYTE PTR [bx],47 ;002fH + *** 000320 74 08 je $I679 +;|*** { +;|*** pszPath = argv[iArgIndex+1]; +; Line 409 + *** 000322 89 5e d8 mov WORD PTR [bp-40],bx ;pszPath +;|*** i++; +; Line 410 + *** 000325 89 46 e4 mov WORD PTR [bp-28],ax ;i +;|*** } +;|*** else +; Line 412 + *** 000328 eb 05 jmp SHORT $I680 + $I679: +;|*** { +;|*** pszPath = "*.*"; +; Line 414 + *** 00032a c7 46 d8 00 00 mov WORD PTR [bp-40],OFFSET DGROUP:$SG681 ;pszPath +;|*** } +; Line 415 + $I680: +;|*** DisplayDirectory(pszPath); +; Line 416 + *** 00032f ff 76 d8 push WORD PTR [bp-40] ;pszPath + *** 000332 e8 00 00 call _DisplayDirectory + *** 000335 eb 79 jmp SHORT $L1009 + *** 000337 90 nop +;|*** } +;|*** break; +;|*** +;|*** case 'g': +; Line 420 + $SC682: +;|*** case 'r': +;|*** case 'u': +;|*** { +; Line 423 +; pszSource = -40 +; pszDestination = -42 +;|*** char *pszSource; +;|*** char *pszDestination; +;|*** +;|*** iPpfstool=1; +; Line 427 + *** 000338 c7 46 e0 01 00 mov WORD PTR [bp-32],1 ;iPpfstool +;|*** if( argv[iArgIndex][2] != '\0' ) +; Line 428 + *** 00033d 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 000340 03 db add bx,bx + *** 000342 8b 76 06 mov si,WORD PTR [bp+6] ;argv + *** 000345 8b 18 mov bx,WORD PTR [bx][si] + *** 000347 80 7f 02 00 cmp BYTE PTR [bx+2],0 + *** 00034b 74 13 je $I685 +;|*** { +;|*** pszSource = &argv[iArgIndex][2]; +; Line 430 + *** 00034d 8d 47 02 lea ax,WORD PTR [bx+2] + *** 000350 89 46 d8 mov WORD PTR [bp-40],ax ;pszPath +;|*** if( *pszSource == ':' ) +; Line 431 + *** 000353 8b d8 mov bx,ax + *** 000355 80 3f 3a cmp BYTE PTR [bx],58 ;003aH + *** 000358 75 2a jne $I687 +;|*** { +;|*** pszSource++; +; Line 433 + *** 00035a 40 inc ax + *** 00035b 89 46 d8 mov WORD PTR [bp-40],ax ;pszPath +;|*** } +;|*** } +;|*** else if( argc > (iArgIndex+1) && argv[iArgIndex+1][0] != '-' && argv[iArgIndex+1][0] != '/' ) +; Line 436 + *** 00035e eb 24 jmp SHORT $I687 + $I685: + *** 000360 8b 46 da mov ax,WORD PTR [bp-38] ;iArgIndex + *** 000363 40 inc ax + *** 000364 3b 46 04 cmp ax,WORD PTR [bp+4] ;argc + *** 000367 7d 41 jge $I688 + *** 000369 8b 76 da mov si,WORD PTR [bp-38] ;iArgIndex + *** 00036c 8b 5e 06 mov bx,WORD PTR [bp+6] ;argv + *** 00036f 03 f6 add si,si + *** 000371 8b 58 02 mov bx,WORD PTR [bx+2][si] + *** 000374 80 3f 2d cmp BYTE PTR [bx],45 ;002dH + *** 000377 74 31 je $I688 + *** 000379 80 3f 2f cmp BYTE PTR [bx],47 ;002fH + *** 00037c 74 2c je $I688 +;|*** { +;|*** pszSource = argv[iArgIndex+1]; +; Line 438 + *** 00037e 89 5e d8 mov WORD PTR [bp-40],bx ;pszPath +;|*** iArgIndex++; +; Line 439 + *** 000381 89 46 da mov WORD PTR [bp-38],ax ;iArgIndex +;|*** } +;|*** else +; Line 441 + $I687: +;|*** { +;|*** printf("Error source path missing\n"); +;|*** break; +;|*** } +;|*** +;|*** if( argc > (iArgIndex+1) && argv[iArgIndex+1][0] != '-' && argv[iArgIndex+1][0] != '/' ) +; Line 447 + *** 000384 8b 46 da mov ax,WORD PTR [bp-38] ;iArgIndex + *** 000387 40 inc ax + *** 000388 3b 46 04 cmp ax,WORD PTR [bp+4] ;argc + *** 00038b 7d 29 jge $I691 + *** 00038d 8b 76 da mov si,WORD PTR [bp-38] ;iArgIndex + *** 000390 8b 5e 06 mov bx,WORD PTR [bp+6] ;argv + *** 000393 03 f6 add si,si + *** 000395 8b 58 02 mov bx,WORD PTR [bx+2][si] + *** 000398 80 3f 2d cmp BYTE PTR [bx],45 ;002dH + *** 00039b 74 19 je $I691 + *** 00039d 80 3f 2f cmp BYTE PTR [bx],47 ;002fH + *** 0003a0 74 14 je $I691 +;|*** { +;|*** pszDestination = argv[iArgIndex+1]; +; Line 449 + *** 0003a2 89 5e d6 mov WORD PTR [bp-42],bx ;pszDestination +;|*** i++; +; Line 450 + *** 0003a5 ff 46 e4 inc WORD PTR [bp-28] ;i +;|*** } +;|*** else +; Line 452 + *** 0003a8 eb 11 jmp SHORT $I692 + $I688: +;|*** printf("Error source path missing\n"); +; Line 443 + *** 0003aa 68 00 00 push OFFSET DGROUP:$SG690 + *** 0003ad e8 00 00 call _printf + $L1009: + *** 0003b0 83 c4 02 add sp,2 +;|*** break; +; Line 444 + *** 0003b3 e9 8c 00 jmp $SB632 +;|*** } +; Line 445 + $I691: +;|*** +;|*** if( argc > (iArgIndex+1) && argv[iArgIndex+1][0] != '-' && argv[iArgIndex+1][0] != '/' ) +;|*** { +;|*** pszDestination = argv[iArgIndex+1]; +;|*** i++; +;|*** } +;|*** else +;|*** { +;|*** pszDestination = NULL; +; Line 454 + *** 0003b6 c7 46 d6 00 00 mov WORD PTR [bp-42],0 ;pszDestination +;|*** } +; Line 455 + $I692: +;|*** +;|*** GetFile( pszSource, pszDestination, +;|*** cOption == 'r' ? COPY_FLAG_UPDATE_EXISTING : +;|*** cOption == 'u' ? COPY_FLAG_UPDATE_OR_ADD : +;|*** 0 ); +; Line 460 + *** 0003bb 80 7e e6 72 cmp BYTE PTR [bp-26],114 ;0072H ;cOption + *** 0003bf 75 05 jne $L977 + *** 0003c1 b8 01 00 mov ax,1 + *** 0003c4 eb 0e jmp SHORT $L980 + $L977: + *** 0003c6 80 7e e6 75 cmp BYTE PTR [bp-26],117 ;0075H ;cOption + *** 0003ca 75 06 jne $L979 + *** 0003cc b8 02 00 mov ax,2 + *** 0003cf eb 03 jmp SHORT $L980 + *** 0003d1 90 nop + $L979: + *** 0003d2 33 c0 xor ax,ax + $L980: + *** 0003d4 89 46 d4 mov WORD PTR [bp-44],ax + *** 0003d7 50 push ax + *** 0003d8 ff 76 d6 push WORD PTR [bp-42] ;pszDestination + *** 0003db ff 76 d8 push WORD PTR [bp-40] ;pszPath + *** 0003de e8 00 00 call _GetFile + *** 0003e1 83 c4 06 add sp,6 +;|*** } +;|*** break; +; Line 462 + *** 0003e4 eb 5c jmp SHORT $SB632 +;|*** +;|*** default: +; Line 464 + $L982: + *** 0003e6 2c 64 sub al,100 ;0064H + *** 0003e8 75 03 jne $JCC1000 + *** 0003ea e9 d1 fd jmp $SC650 + $JCC1000: + *** 0003ed fe c8 dec al + *** 0003ef 75 03 jne $JCC1007 + *** 0003f1 e9 06 fe jmp $SC654 + $JCC1007: + *** 0003f4 2c 02 sub al,2 + *** 0003f6 75 03 jne $JCC1014 + *** 0003f8 e9 3d ff jmp $SC682 + $JCC1014: + $SD693: +;|*** +;|*** printf("Unrecognized option - %s\n", argv[iArgIndex]); +; Line 466 + *** 0003fb 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 0003fe 03 db add bx,bx + *** 000400 8b 76 06 mov si,WORD PTR [bp+6] ;argv + *** 000403 ff 30 push WORD PTR [bx][si] + *** 000405 68 00 00 push OFFSET DGROUP:$SG694 + *** 000408 e8 00 00 call _printf + *** 00040b 83 c4 04 add sp,4 +;|*** +;|*** // Fall through to display usage +;|*** +;|*** case '?': +; Line 470 + $SC695: +;|*** case 'h': +;|*** +;|*** // Display usage data +;|*** +;|*** usage( argv[0] ); +; Line 475 + *** 00040e 8b 5e 06 mov bx,WORD PTR [bp+6] ;argv + *** 000411 ff 37 push WORD PTR [bx] + *** 000413 e8 00 00 call usage + *** 000416 83 c4 02 add sp,2 + *** 000419 e9 06 fd jmp $L1004 + $L981: + *** 00041c 2c 6b sub al,107 ;006bH + *** 00041e 3d 0a 00 cmp ax,10 ;000aH + *** 000421 77 d8 ja $SD693 + *** 000423 03 c0 add ax,ax + *** 000425 93 xchg ax,bx + *** 000426 2e ff a7 00 00 jmp WORD PTR cs:$L983[bx] + *** 00042b 90 nop + $L983: + *** 00042c 00 00 DW $SC659 + *** 00042e 00 00 DW $SC664 + *** 000430 00 00 DW $SD693 + *** 000432 00 00 DW $SC667 + *** 000434 00 00 DW $SD693 + *** 000436 00 00 DW $SC670 + *** 000438 00 00 DW $SC672 + *** 00043a 00 00 DW $SC682 + *** 00043c 00 00 DW $SC674 + *** 00043e 00 00 DW $SD693 + *** 000440 00 00 DW $SC682 + $SB632: +;|*** ret = 1; +;|*** goto main_error; +;|*** } +;|*** } +; Line 479 + *** 000442 ff 46 da inc WORD PTR [bp-38] ;iArgIndex + $F627: + *** 000445 8b 46 04 mov ax,WORD PTR [bp+4] ;argc + *** 000448 39 46 da cmp WORD PTR [bp-38],ax ;iArgIndex + *** 00044b 7d 1a jge $FB629 +;|*** if( argv[iArgIndex][0] != '/' && argv[iArgIndex][0] != '-' ) +; Line 222 + *** 00044d 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 000450 03 db add bx,bx + *** 000452 8b 76 06 mov si,WORD PTR [bp+6] ;argv + *** 000455 8b 18 mov bx,WORD PTR [bx][si] + *** 000457 80 3f 2f cmp BYTE PTR [bx],47 ;002fH + *** 00045a 75 03 jne $JCC1114 + *** 00045c e9 47 fc jmp $I630 + $JCC1114: + *** 00045f 80 3f 2d cmp BYTE PTR [bx],45 ;002dH + *** 000462 75 03 jne $JCC1122 + *** 000464 e9 3f fc jmp $I630 + $JCC1122: +;|*** { +;|*** break; +; Line 224 + $FB629: +;|*** } +;|*** +;|*** cOption = (char)tolower(argv[iArgIndex][1]); +;|*** +;|*** // Process according to option character +;|*** +;|*** switch( cOption ) +;|*** { +;|*** case 'b': /* Baud rate */ +;|*** +;|*** if( argv[iArgIndex][2] != ':' || +;|*** argv[iArgIndex][3] < '0' || argv[iArgIndex][3] > '9' ) +;|*** { +;|*** printf("Invalid option - %s\n", argv[iArgIndex]); +;|*** ret = 1; +;|*** goto main_error; +;|*** } +;|*** +;|*** ulBaudRate = atol(&argv[iArgIndex][3]); +;|*** +;|*** for( i=0; i < NUM_BAUD_RATES; i++ ) +;|*** { +;|*** if( BaudTable[i].ulRate == ulBaudRate ) +;|*** { +;|*** BootArgs.ucBaudDivisor = BaudTable[i].ucDivisor; +;|*** break; +;|*** } +;|*** } +;|*** +;|*** if( i >= NUM_BAUD_RATES ) +;|*** { +;|*** printf( "Unsupported baud rate - %s\n", argv[iArgIndex] ); +;|*** ret = 1; +;|*** goto main_error; +;|*** } +;|*** break; +;|*** +;|*** case 'c': +;|*** +;|*** // COM Port Parameter +;|*** // +;|*** // Allowable values for the COM ports 1-4. Zero (0) is +;|*** // allowed as a way to disable use of the COM port and is +;|*** // allowed by ...\csp\i486\oal\debug.c. +;|*** +;|*** if( (argv[iArgIndex][2] == ':') && +;|*** (argv[iArgIndex][3] >= '0') && +;|*** (argv[iArgIndex][3] <= '4') ) +;|*** { +;|*** BootArgs.ucComPort = (UCHAR)(argv[iArgIndex][3] - '0'); +;|*** } +;|*** else +;|*** { +;|*** printf( "Invalid option - %s\n", argv[iArgIndex] ); +;|*** ret = 1; +;|*** goto main_error; +;|*** } +;|*** break; +;|*** +;|*** case 'd': /* Display mode */ +;|*** +;|*** if( argv[iArgIndex][2] != ':' || +;|*** argv[iArgIndex][3] < '0' || argv[iArgIndex][3] > '6' ) +;|*** { +;|*** printf( "Invalid option - %s\n", argv[iArgIndex] ); +;|*** ret = 1; +;|*** goto main_error; +;|*** } +;|*** iDesiredMode = (int)(argv[iArgIndex][3] - '0'); +;|*** break; +;|*** +;|*** case 'e': +;|*** if( bRNDISDownload ) +;|*** { +;|*** printf( "The /E and /K options are mutually exclusive" +;|*** " - please choose one of them.\r\n" ); +;|*** +;|*** goto main_error; +;|*** } +;|*** if( !ParseEthernetOptions(argv[iArgIndex]) ) +;|*** { +;|*** printf("Invalid option - %s\n", argv[iArgIndex]); +;|*** ret = 1; +;|*** goto main_error; +;|*** } +;|*** bEtherDownload = TRUE; +;|*** break; +;|*** +;|*** case 'k': /* RNDIS flags */ +;|*** +;|*** if( bEtherDownload ) +;|*** { +;|*** printf( "The /E and /K options are mutually exclusive" +;|*** "- please choose one of them.\r\n"); +;|*** goto main_error; +;|*** } +;|*** if( !ParseEthernetOptions(argv[iArgIndex]) ) +;|*** { +;|*** printf("Invalid option - %s\n", argv[iArgIndex]); +;|*** ret = 1; +;|*** goto main_error; +;|*** } +;|*** bRNDISDownload = TRUE; +;|*** break; +;|*** +;|*** case 'l': +;|*** +;|*** // VESA VBE Linear/Flat Framebuffer display mode +;|*** +;|*** if( !ParseVESAOptions( argv[iArgIndex] ) ) +;|*** { +;|*** printf( "Invalid option - %s\n", argv[iArgIndex] ); +;|*** ret = 1; +;|*** goto main_error; +;|*** } +;|*** iDesiredMode = BootArgs.vesaMode; +;|*** #if 0 +;|*** +;|*** // Video Mode Debug - display and hang +;|*** +;|*** printf( "VESA Boot Options\n" ); +;|*** printf( "vesaMode........: 0x%x\n", BootArgs.vesaMode ); +;|*** printf( "xDisplayScreen..: %d\n", BootArgs.cxDisplayScreen ); +;|*** printf( "YDisplayScreen..: %d\n", BootArgs.cyDisplayScreen ); +;|*** printf( "bppScreen.......: %d\n", BootArgs.bppScreen ); +;|*** printf( "xPhysScreen.....: %d\n", BootArgs.cxPhysicalScreen ); +;|*** printf( "yPhysScreen.....: %d\n", BootArgs.cyPhysicalScreen ); +;|*** +;|*** while( 1 ) +;|*** { +;|*** ; +;|*** } +;|*** #endif +;|*** break; +;|*** +;|*** case 'n': /* Device name specified */ +;|*** +;|*** if( !ParseDeviceName(argv[iArgIndex]) ) +;|*** { +;|*** printf("Invalid option - %s\n", argv[iArgIndex]); +;|*** ret = 1; +;|*** goto main_error; +;|*** } +;|*** break; +;|*** +;|*** case 'p': /* Parallel port boot download */ +;|*** +;|*** bParallelDownload=TRUE; +;|*** pszFileName= NULL; +;|*** break; +;|*** +;|*** case 'a': /* Use permanent storage to store image */ +;|*** +;|*** bBackupImage=TRUE; +;|*** break; +;|*** +;|*** case 'q': /* Serial port boot download */ +;|*** +;|*** bSerialDownload=TRUE; +;|*** pszFileName= NULL; +;|*** break; +;|*** +;|*** case 'v': +;|*** +;|*** bVerbose = TRUE; +;|*** break; +;|*** +;|*** case 's': +;|*** { +;|*** char *pszPath; +;|*** +;|*** iPpfstool=1; +;|*** +;|*** if( argv[iArgIndex][2] != '\0' ) +;|*** { +;|*** pszPath = &argv[iArgIndex][2]; +;|*** if( *pszPath == ':' ) +;|*** { +;|*** pszPath++; +;|*** } +;|*** } +;|*** else if( (argc > (i+1) && argv[iArgIndex+1][0] != '-') && +;|*** (argv[iArgIndex+1][0] != '/') ) +;|*** { +;|*** pszPath = argv[iArgIndex+1]; +;|*** i++; +;|*** } +;|*** else +;|*** { +;|*** pszPath = "*.*"; +;|*** } +;|*** DisplayDirectory(pszPath); +;|*** } +;|*** break; +;|*** +;|*** case 'g': +;|*** case 'r': +;|*** case 'u': +;|*** { +;|*** char *pszSource; +;|*** char *pszDestination; +;|*** +;|*** iPpfstool=1; +;|*** if( argv[iArgIndex][2] != '\0' ) +;|*** { +;|*** pszSource = &argv[iArgIndex][2]; +;|*** if( *pszSource == ':' ) +;|*** { +;|*** pszSource++; +;|*** } +;|*** } +;|*** else if( argc > (iArgIndex+1) && argv[iArgIndex+1][0] != '-' && argv[iArgIndex+1][0] != '/' ) +;|*** { +;|*** pszSource = argv[iArgIndex+1]; +;|*** iArgIndex++; +;|*** } +;|*** else +;|*** { +;|*** printf("Error source path missing\n"); +;|*** break; +;|*** } +;|*** +;|*** if( argc > (iArgIndex+1) && argv[iArgIndex+1][0] != '-' && argv[iArgIndex+1][0] != '/' ) +;|*** { +;|*** pszDestination = argv[iArgIndex+1]; +;|*** i++; +;|*** } +;|*** else +;|*** { +;|*** pszDestination = NULL; +;|*** } +;|*** +;|*** GetFile( pszSource, pszDestination, +;|*** cOption == 'r' ? COPY_FLAG_UPDATE_EXISTING : +;|*** cOption == 'u' ? COPY_FLAG_UPDATE_OR_ADD : +;|*** 0 ); +;|*** } +;|*** break; +;|*** +;|*** default: +;|*** +;|*** printf("Unrecognized option - %s\n", argv[iArgIndex]); +;|*** +;|*** // Fall through to display usage +;|*** +;|*** case '?': +;|*** case 'h': +;|*** +;|*** // Display usage data +;|*** +;|*** usage( argv[0] ); +;|*** ret = 1; +;|*** goto main_error; +;|*** } +;|*** } +;|*** +;|*** if( iArgIndex == (argc - 1) ) +; Line 481 + *** 000467 2b 46 da sub ax,WORD PTR [bp-38] ;iArgIndex + *** 00046a 48 dec ax + *** 00046b 75 0d jne $I696 +;|*** { +;|*** pszFileName = argv[iArgIndex]; +; Line 483 + *** 00046d 8b 5e da mov bx,WORD PTR [bp-38] ;iArgIndex + *** 000470 03 db add bx,bx + *** 000472 8b 76 06 mov si,WORD PTR [bp+6] ;argv + *** 000475 8b 00 mov ax,WORD PTR [bx][si] + *** 000477 89 46 fe mov WORD PTR [bp-2],ax ;pszFileName +;|*** } +;|*** } +; Line 485 + $I696: +;|*** +;|*** if( iPpfstool ) +; Line 487 + *** 00047a 83 7e e0 00 cmp WORD PTR [bp-32],0 ;iPpfstool + *** 00047e 74 08 je $I697 +;|*** { +;|*** ret = 0; +; Line 489 + *** 000480 c7 46 e2 00 00 mov WORD PTR [bp-30],0 ;ret +;|*** goto main_error; +; Line 490 + *** 000485 e9 60 01 jmp $main_error639 +;|*** } +;|*** +;|*** if( !XmsIsInstalled() ) +; Line 493 + $I697: + *** 000488 e8 00 00 call _XmsIsInstalled + *** 00048b 0b c0 or ax,ax + *** 00048d 75 11 jne $I698 +;|*** { +;|*** printf( "HIMEM.SYS must be loaded\n" ); +; Line 495 + *** 00048f 68 00 00 push OFFSET DGROUP:$SG699 + *** 000492 e8 00 00 call _printf + *** 000495 83 c4 02 add sp,2 +;|*** ret = 2; +; Line 496 + *** 000498 c7 46 e2 02 00 mov WORD PTR [bp-30],2 ;ret +;|*** goto main_error; +; Line 497 + *** 00049d e9 48 01 jmp $main_error639 +;|*** } +;|*** +;|*** if( bVerbose ) +; Line 500 + $I698: + *** 0004a0 83 7e f0 00 cmp WORD PTR [bp-16],0 ;bVerbose + *** 0004a4 74 39 je $I703 +;|*** { +;|*** if( (xmsError = XmsQueryA20(&bEnabled)) != XMS_SUCCESS ) +; Line 502 + *** 0004a6 8d 46 f2 lea ax,WORD PTR [bp-14] ;bEnabled + *** 0004a9 50 push ax + *** 0004aa e8 00 00 call _XmsQueryA20 + *** 0004ad 83 c4 02 add sp,2 + *** 0004b0 89 46 f4 mov WORD PTR [bp-12],ax ;xmsError + *** 0004b3 0b c0 or ax,ax + *** 0004b5 74 19 je $I701 +;|*** { +;|*** printf( "Error querying A20 status - %s\n", +;|*** XmsErrorString(xmsError) ); +; Line 505 + *** 0004b7 50 push ax + *** 0004b8 e8 00 00 call _XmsErrorString + *** 0004bb 83 c4 02 add sp,2 + *** 0004be 50 push ax + *** 0004bf 68 00 00 push OFFSET DGROUP:$SG702 + *** 0004c2 e8 00 00 call _printf + *** 0004c5 83 c4 04 add sp,4 +;|*** ret = 3; +; Line 506 + *** 0004c8 c7 46 e2 03 00 mov WORD PTR [bp-30],3 ;ret +;|*** goto main_error; +; Line 507 + *** 0004cd e9 18 01 jmp $main_error639 +;|*** } +;|*** +;|*** if( bEnabled ) +; Line 510 + $I701: + *** 0004d0 83 7e f2 00 cmp WORD PTR [bp-14],0 ;bEnabled + *** 0004d4 74 09 je $I703 +;|*** { +;|*** printf( "Warning A20 line already enabled\n" ); +; Line 512 + *** 0004d6 68 00 00 push OFFSET DGROUP:$SG704 + *** 0004d9 e8 00 00 call _printf + *** 0004dc 83 c4 02 add sp,2 +;|*** } +;|*** } +; Line 514 + $I703: +;|*** +;|*** // Check if PCI Bios is available, if so find out config mechanism +;|*** +;|*** BootArgs.ucPCIConfigType = GetPCIConfigMechanism(); +; Line 518 + *** 0004df e8 00 00 call GetPCIConfigMechanism + *** 0004e2 a2 03 00 mov BYTE PTR _BootArgs+3,al +;|*** +;|*** // Load the boot image +;|*** +;|*** if( !LoadImage( bVerbose, bParallelDownload, pszFileName, &ulEntryPoint) ) +; Line 522 + *** 0004e5 8d 46 fa lea ax,WORD PTR [bp-6] ;ulEntryPoint + *** 0004e8 50 push ax + *** 0004e9 ff 76 fe push WORD PTR [bp-2] ;pszFileName + *** 0004ec ff 76 ee push WORD PTR [bp-18] ;bParallelDownload + *** 0004ef ff 76 f0 push WORD PTR [bp-16] ;bVerbose + *** 0004f2 e8 00 00 call LoadImage + *** 0004f5 83 c4 08 add sp,8 + *** 0004f8 0b c0 or ax,ax + *** 0004fa 75 08 jne $I705 +;|*** { +;|*** ret = 4; +; Line 524 + *** 0004fc c7 46 e2 04 00 mov WORD PTR [bp-30],4 ;ret +;|*** goto main_error; +; Line 525 + *** 000501 e9 e4 00 jmp $main_error639 +;|*** } +;|*** +;|*** // Enable A20 line +;|*** +;|*** if( (xmsError = XmsLocalEnableA20()) != XMS_SUCCESS ) +; Line 530 + $I705: + *** 000504 e8 00 00 call _XmsLocalEnableA20 + *** 000507 89 46 f4 mov WORD PTR [bp-12],ax ;xmsError + *** 00050a 0b c0 or ax,ax + *** 00050c 74 12 je $I706 +;|*** { +;|*** printf("Can't enable A20 line, error = 0x%4.4X\n", xmsError); +; Line 532 + *** 00050e 50 push ax + *** 00050f 68 00 00 push OFFSET DGROUP:$SG707 + *** 000512 e8 00 00 call _printf + *** 000515 83 c4 04 add sp,4 +;|*** +;|*** ret = 5; +; Line 534 + *** 000518 c7 46 e2 05 00 mov WORD PTR [bp-30],5 ;ret +;|*** goto main_error; +; Line 535 + *** 00051d e9 c8 00 jmp $main_error639 +;|*** } +;|*** +;|*** // Set the video mode +;|*** +;|*** BootArgs.ucVideoMode = SetVideoMode( iDesiredMode ); +; Line 540 + $I706: + *** 000520 ff 36 00 00 push WORD PTR _iDesiredMode + *** 000524 e8 00 00 call _SetVideoMode + *** 000527 83 c4 02 add sp,2 + *** 00052a a2 00 00 mov BYTE PTR _BootArgs,al +;|*** +;|*** if( BootArgs.ucVideoMode == 0 ) +; Line 542 + *** 00052d 0a c0 or al,al + *** 00052f 75 29 jne $I708 +;|*** { +;|*** // if using default mode set params for flat framebuffer driver. +;|*** +;|*** BootArgs.cxDisplayScreen = 320; +;|*** BootArgs.cyDisplayScreen = 200; +;|*** BootArgs.cxPhysicalScreen = 320; +;|*** BootArgs.cyPhysicalScreen = 200; +; Line 549 + *** 000531 b8 c8 00 mov ax,200 ;00c8H + *** 000534 a3 70 00 mov WORD PTR _BootArgs+112,ax + *** 000537 a3 74 00 mov WORD PTR _BootArgs+116,ax +;|*** BootArgs.bppScreen = 8; +; Line 550 + *** 00053a c7 06 78 00 08 00 mov WORD PTR _BootArgs+120,8 +;|*** BootArgs.cbScanLineLength = 320; +; Line 551 + *** 000540 b8 40 01 mov ax,320 ;0140H + *** 000543 a3 6e 00 mov WORD PTR _BootArgs+110,ax + *** 000546 a3 72 00 mov WORD PTR _BootArgs+114,ax + *** 000549 a3 76 00 mov WORD PTR _BootArgs+118,ax +;|*** BootArgs.pvFlatFrameBuffer = 0x800A0000; +; Line 552 + *** 00054c c7 06 68 00 00 00 mov WORD PTR _BootArgs+104,0 + *** 000552 c7 06 6a 00 0a 80 mov WORD PTR _BootArgs+106,-32758 ;800aH +;|*** } +;|*** else if( BootArgs.ucVideoMode != 0xFF ) +; Line 554 + *** 000558 eb 21 jmp SHORT $I710 + $I708: + *** 00055a 80 3e 00 00 ff cmp BYTE PTR _BootArgs,255 ;00ffH + *** 00055f 74 1a je $I710 +;|*** { +;|*** // if not using VESA mode clear these so flat +;|*** // framebuffer driver sees all zeroes and faults. +;|*** +;|*** BootArgs.cxDisplayScreen = 0; +;|*** BootArgs.cyDisplayScreen = 0; +;|*** BootArgs.cxPhysicalScreen = 0; +;|*** BootArgs.cyPhysicalScreen = 0; +;|*** BootArgs.bppScreen = 0; +;|*** BootArgs.cbScanLineLength = 0; +; Line 564 + *** 000561 33 c0 xor ax,ax + *** 000563 a3 6e 00 mov WORD PTR _BootArgs+110,ax + *** 000566 a3 70 00 mov WORD PTR _BootArgs+112,ax + *** 000569 a3 72 00 mov WORD PTR _BootArgs+114,ax + *** 00056c a3 74 00 mov WORD PTR _BootArgs+116,ax + *** 00056f a3 78 00 mov WORD PTR _BootArgs+120,ax + *** 000572 a3 76 00 mov WORD PTR _BootArgs+118,ax +;|*** BootArgs.pvFlatFrameBuffer = 0; +; Line 565 + *** 000575 a3 6a 00 mov WORD PTR _BootArgs+106,ax + *** 000578 a3 68 00 mov WORD PTR _BootArgs+104,ax +;|*** } +;|*** +;|*** if( bSerialDownload ) +; Line 568 + $I710: + *** 00057b 83 3e 00 00 00 cmp WORD PTR _bSerialDownload,0 + *** 000580 74 05 je $I711 +;|*** { +;|*** BootArgs.ucBaudDivisor|=0x80; +; Line 570 + *** 000582 80 0e 02 00 80 or BYTE PTR _BootArgs+2,128 ;0080H +;|*** } +;|*** +;|*** if( bParallelDownload ) +; Line 573 + $I711: + *** 000587 83 7e ee 00 cmp WORD PTR [bp-18],0 ;bParallelDownload + *** 00058b 74 06 je $I712 +;|*** { +;|*** BootArgs.KitlTransport = GetJumpFlags(); +; Line 575 + *** 00058d e8 00 00 call GetJumpFlags + *** 000590 a3 5a 00 mov WORD PTR _BootArgs+90,ax +;|*** } +;|*** +;|*** if( bBackupImage ) +; Line 578 + $I712: + *** 000593 83 7e ec 00 cmp WORD PTR [bp-20],0 ;bBackupImage + *** 000597 74 05 je $I713 +;|*** { +;|*** BootArgs.ucLoaderFlags |= LDRFL_FLASH_BACKUP; +; Line 580 + *** 000599 80 0e 0c 00 80 or BYTE PTR _BootArgs+12,128 ;0080H +;|*** } +;|*** +;|*** if( bVerbose ) +; Line 583 + $I713: + *** 00059e 83 7e f0 00 cmp WORD PTR [bp-16],0 ;bVerbose + *** 0005a2 74 0f je $I714 +;|*** { +;|*** printf( "Jumping to 0x%8.8lX\n", ulEntryPoint ); +; Line 585 + *** 0005a4 ff 76 fc push WORD PTR [bp-4] + *** 0005a7 ff 76 fa push WORD PTR [bp-6] ;ulEntryPoint + *** 0005aa 68 00 00 push OFFSET DGROUP:$SG715 + *** 0005ad e8 00 00 call _printf + *** 0005b0 83 c4 06 add sp,6 +;|*** } +;|*** +;|*** // Convert arguments to linear addres +;|*** +;|*** ulArguments = (((ULONG)(void far *)&BootArgs) >> 16) << 4; +; Line 590 + $I714: +;|*** ulArguments += ((ULONG)(void far *)&BootArgs) & 0xFFFF; +;|*** +;|*** // Execute the image +;|*** +;|*** Launch( ulEntryPoint, ulArguments ); +; Line 595 + *** 0005b3 8c d8 mov ax,ds + *** 0005b5 2b d2 sub dx,dx + *** 0005b7 03 c0 add ax,ax + *** 0005b9 13 d2 adc dx,dx + *** 0005bb 03 c0 add ax,ax + *** 0005bd 13 d2 adc dx,dx + *** 0005bf 03 c0 add ax,ax + *** 0005c1 13 d2 adc dx,dx + *** 0005c3 03 c0 add ax,ax + *** 0005c5 13 d2 adc dx,dx + *** 0005c7 05 00 00 add ax,OFFSET DGROUP:_BootArgs + *** 0005ca 83 d2 00 adc dx,0 + *** 0005cd 89 46 f6 mov WORD PTR [bp-10],ax ;ulArguments + *** 0005d0 89 56 f8 mov WORD PTR [bp-8],dx + *** 0005d3 52 push dx + *** 0005d4 50 push ax + *** 0005d5 ff 76 fc push WORD PTR [bp-4] + *** 0005d8 ff 76 fa push WORD PTR [bp-6] ;ulEntryPoint + *** 0005db e8 00 00 call _Launch + *** 0005de 83 c4 08 add sp,8 +;|*** +;|*** // Launch should not return +;|*** +;|*** return( 0 ); +; Line 599 + *** 0005e1 33 c0 xor ax,ax + *** 0005e3 5e pop si + *** 0005e4 5f pop di + *** 0005e5 c9 leave + *** 0005e6 c3 ret + *** 0005e7 90 nop +;|*** +;|*** +;|*** // Main Error Handler +;|*** +;|*** main_error: +; Line 604 + $main_error639: +;|*** +;|*** // Make sure we unlock and free extended memory +;|*** +;|*** if( usBlockHandle ) +; Line 608 + *** 0005e8 83 3e 00 00 00 cmp WORD PTR _usBlockHandle,0 + *** 0005ed 74 14 je $I716 +;|*** { +;|*** XmsUnlockExtendedMemory(usBlockHandle); +; Line 610 + *** 0005ef ff 36 00 00 push WORD PTR _usBlockHandle + *** 0005f3 e8 00 00 call _XmsUnlockExtendedMemory + *** 0005f6 83 c4 02 add sp,2 +;|*** XmsFreeExtendedMemory(usBlockHandle); +; Line 611 + *** 0005f9 ff 36 00 00 push WORD PTR _usBlockHandle + *** 0005fd e8 00 00 call _XmsFreeExtendedMemory + *** 000600 83 c4 02 add sp,2 +;|*** } +;|*** +;|*** printf("\n\n Press any key to cancel.\n"); +; Line 614 + $I716: + *** 000603 68 00 00 push OFFSET DGROUP:$SG717 + *** 000606 e8 00 00 call _printf + *** 000609 83 c4 02 add sp,2 +;|*** __asm +;|*** { +;|*** push dx +; Line 617 + *** 00060c 52 push dx +;|*** xor ax,ax +; Line 618 + *** 00060d 33 c0 xor ax,ax +;|*** int 0x16 +; Line 619 + *** 00060f cd 16 int 22 ;0016H +;|*** pop dx +; Line 620 + *** 000611 5a pop dx +;|*** } +; Line 621 +;|*** // Indicate status +;|*** +;|*** return( ret ); +; Line 624 + *** 000612 8b 46 e2 mov ax,WORD PTR [bp-30] ;ret +;|*** } +; Line 625 + *** 000615 5e pop si + *** 000616 5f pop di + *** 000617 c9 leave + *** 000618 c3 ret + *** 000619 90 nop + +_main ENDP + +usage PROC NEAR +;|*** +;|*** //------------------------------------------------------------------------------ +;|*** // +;|*** // Function Name: usage( char *pszProgramNameArg ) +;|*** // Description..: This function displays program usage information. +;|*** // Inputs.......: char * ProgramName +;|*** // Outputs......: none +;|*** // +;|*** //------------------------------------------------------------------------------ +;|*** +;|*** static void usage( char *pszProgramNameArg ) +;|*** { +; Line 637 + *** 00061a c8 02 00 00 enter 2,0 +; pszProgram = -2 +; pszProgramNameArg = 4 +;|*** char *pszProgram; +;|*** +;|*** pszProgram = strrchr(pszProgramNameArg, '\\'); +;|*** +;|*** if( pszProgram != NULL ) +; Line 642 + *** 00061e 6a 5c push 92 ;005cH + *** 000620 ff 76 04 push WORD PTR [bp+4] ;pszProgramNameArg + *** 000623 e8 00 00 call _strrchr + *** 000626 83 c4 04 add sp,4 + *** 000629 89 46 fe mov WORD PTR [bp-2],ax ;pszProgram + *** 00062c 0b c0 or ax,ax + *** 00062e 74 04 je $I722 +;|*** { +;|*** pszProgram++; +; Line 644 + *** 000630 40 inc ax + *** 000631 eb 04 jmp SHORT $L1010 + *** 000633 90 nop + $I722: +;|*** } +;|*** else +;|*** { +;|*** pszProgram = pszProgramNameArg; +; Line 648 + *** 000634 8b 46 04 mov ax,WORD PTR [bp+4] ;pszProgramNameArg + $L1010: + *** 000637 89 46 fe mov WORD PTR [bp-2],ax ;pszProgram +;|*** } +;|*** +;|*** printf( +;|*** "\n" +;|*** "%s: Loads a BIN image into memory and boots it.\n" +;|*** "\n" +;|*** "Usage:%s /B:baud /C:Port /D:display /P /H /V /N:name\n" +;|*** " (/E|/K):IO:IRQ[:] /L:VXxVYxBPP[:PXxPY] \n" +;|*** "\n" +;|*** " /B Baud Rate [9600|19200|38400(default)|57600|115200]" +;|*** "\n" +;|*** " /C Communications Port [0=disable|1|2|3|4]" +;|*** "\n" +;|*** " /D Display Resolution (for VESA modes, use the /L option instead).\n" +;|*** " 0 = 320x200x256 (default), 1 = 480x240x256,\n" +;|*** " 2 = 640x480x256, 3 = 800x600x256, 4 = 1024x768x256\n" +;|*** " 5 = 240x320x256, 6 = 208x240x256\n" +;|*** "\n" +;|*** " /P Parallel port boot download.\n" +;|*** "\n" +;|*** " /A Use permanent storage device to store NK image.\n" +;|*** "\n" +;|*** " /H Help - displays this message.\n" +;|*** "\n" +;|*** " Default is NK.BIN except for /P option which uses\n" +;|*** " default on host unless specified.\n" +;|*** "\n" +;|*** "Press any key for more options...", +;|*** +;|*** pszProgram, pszProgram ); +; Line 678 + *** 00063a 50 push ax + *** 00063b 50 push ax + *** 00063c 68 00 00 push OFFSET DGROUP:$SG724 + *** 00063f e8 00 00 call _printf + *** 000642 83 c4 06 add sp,6 +;|*** +;|*** __asm +;|*** { +;|*** push dx +; Line 682 + *** 000645 52 push dx +;|*** xor ax,ax +; Line 683 + *** 000646 33 c0 xor ax,ax +;|*** int 0x16 +; Line 684 + *** 000648 cd 16 int 22 ;0016H +;|*** pop dx +; Line 685 + *** 00064a 5a pop dx +;|*** } +; Line 686 +;|*** +;|*** printf( +;|*** "\n" +;|*** "\n" +;|*** "\n" +;|*** "Usage:%s /B:baud /C:Port /D:display /P /H /V /N:name\n" +;|*** " (/E|/K):IO:IRQ[:] /L:VXxVYxBPP[:PXxPY] \n" +;|*** "\n" +;|*** " /V Verbose - displays extra status information during boot.\n" +;|*** "\n" +;|*** " /E:IO:IRQ[:] (Debug Ethernet Card parameters)\n" +;|*** " IO - IO Base Address (specified in hexadecimal)\n" +;|*** " IRQ - Interrupt (specified in decimal or hexadecimal)\n" +;|*** " Dotted IP - (optional) static IP address (No DHCP)\n" +;|*** " NOTE: The /E and /K options are mutually exclusive.\n" +;|*** "\n" +;|*** " /K:IO:IRQ[:] (RNDIS Card parameters)\n" +;|*** " IO - IO Base Address (specified in hexadecimal)\n" +;|*** " IRQ - Interrupt (specified in decimal or hexadecimal)\n" +;|*** " Dotted IP - (optional) static IP address (No DHCP)\n" +;|*** " NOTE: The /E and /K options are mutually exclusive.\n" +;|*** "\n" +;|*** " /L:DXxDYxBPP[:PXxPY] (Use VESA VBE Linear/Flat Framebuffer video mode)\n" +;|*** " DX, DY - Display X and Y Sizes\n" +;|*** " BPP - Bits Per Pixel Color Depth (8, 16, 24, or 32)\n" +;|*** " PX, PY - (optional) Physical Screen X and Y Sizes to simulate a\n" +;|*** " small device display (PX & PY should be greater than DX & DY)." +;|*** "\n" +;|*** " /N:name Optionally specify a device name to be used when creating\n" +;|*** " the Ethernet debug name (for host-side connectivity).\n" +;|*** "\n" +;|*** "Press any key for more options...", +;|*** +;|*** pszProgram ); +; Line 720 + *** 00064b ff 76 fe push WORD PTR [bp-2] ;pszProgram + *** 00064e 68 00 00 push OFFSET DGROUP:$SG725 + *** 000651 e8 00 00 call _printf + *** 000654 83 c4 04 add sp,4 +;|*** +;|*** __asm +;|*** { +;|*** push dx +; Line 724 + *** 000657 52 push dx +;|*** xor ax,ax +; Line 725 + *** 000658 33 c0 xor ax,ax +;|*** int 0x16 +; Line 726 + *** 00065a cd 16 int 22 ;0016H +;|*** pop dx +; Line 727 + *** 00065c 5a pop dx +;|*** } +; Line 728 +;|*** +;|*** printf( +;|*** "\n" +;|*** "Usage: %s -s[:] -(g|r|u)[[:] []\n" +;|*** "-s Show a directory of files matching .\n" +;|*** "\n" +;|*** "-g Get files matching and copy them to the\n" +;|*** " optionally specified . Any existing file with\n" +;|*** " the same name will be overwritten.\n" +;|*** "\n" +;|*** "-r Refresh files matching which already exist in \n" +;|*** " and have a timestamp newer than the one in .\n" +;|*** "\n" +;|*** "-u Update files matching which don't already exist in\n" +;|*** " or those that have a timestamp newer than those\n" +;|*** " in .\n" +;|*** "\n" +;|*** " Windows filename path with optional wildcard characters.\n" +;|*** "\n" +;|*** " If not specified then the current directory is the default.\n" +;|*** " If specified and it doesn't exist and the last character is \\,\n" +;|*** " then the directory is created. Otherwise is\n" +;|*** " treated as the name of the file.\n" +;|*** " It is an error for to match multiple files\n" +;|*** " when specifies a file.\n" +;|*** "For CE Collections - Last built with ver.2.01-Beta1-02", +;|*** +;|*** pszProgram ); +; Line 756 + *** 00065d ff 76 fe push WORD PTR [bp-2] ;pszProgram + *** 000660 68 00 00 push OFFSET DGROUP:$SG726 + *** 000663 e8 00 00 call _printf +;|*** } +; Line 757 + *** 000666 c9 leave + *** 000667 c3 ret + +usage ENDP + +ExitSigHandler PROC NEAR +;|*** +;|*** //------------------------------------------------------------------------------ +;|*** // +;|*** // Function Name: ExitSigHandler( int sig ) +;|*** // Description..: This function handles Ctrl_c/Ctrl+Break while downloading. +;|*** // XMS must be freed or unlocked or we can't execute loadcepc +;|*** // again without rebooting. +;|*** // Inputs.......: int sig exit signal number +;|*** // Outputs......: none +;|*** // +;|*** //------------------------------------------------------------------------------ +;|*** +;|*** static void ExitSigHandler( int sig ) +;|*** { +; Line 771 + *** 000668 55 push bp + *** 000669 8b ec mov bp,sp +; sig = 4 +;|*** if( usBlockHandle ) +; Line 772 + *** 00066b 83 3e 00 00 00 cmp WORD PTR _usBlockHandle,0 + *** 000670 74 12 je $I730 +;|*** { +;|*** XmsUnlockExtendedMemory(usBlockHandle); +; Line 774 + *** 000672 ff 36 00 00 push WORD PTR _usBlockHandle + *** 000676 e8 00 00 call _XmsUnlockExtendedMemory + *** 000679 8b e5 mov sp,bp +;|*** XmsFreeExtendedMemory(usBlockHandle); +; Line 775 + *** 00067b ff 36 00 00 push WORD PTR _usBlockHandle + *** 00067f e8 00 00 call _XmsFreeExtendedMemory + *** 000682 8b e5 mov sp,bp +;|*** } +;|*** +;|*** exit (sig); +; Line 778 + $I730: + *** 000684 ff 76 04 push WORD PTR [bp+4] ;sig + *** 000687 e8 00 00 call _exit +;|*** } +; Line 779 + *** 00068a c9 leave + *** 00068b c3 ret + +ExitSigHandler ENDP + +DownloadRead PROC NEAR +;|*** +;|*** //------------------------------------------------------------------------------ +;|*** // +;|*** // Function Name: DownloadRead( ... ) +;|*** // Description..: This function is used to read download data. It +;|*** // encapsulates the device we are reading from. +;|*** // Inputs.......: int hImage handle to image, may be zero. +;|*** // UCHAR *ucBuffer pntr to dst buffer +;|*** // USHORT usReadSize number of bytes to read +;|*** // BOOL parallel port switch +;|*** // Outputs......: +;|*** // +;|*** //------------------------------------------------------------------------------ +;|*** +;|*** static USHORT DownloadRead( int hImage, +;|*** UCHAR *ucBuffer, +;|*** USHORT usReadSize, +;|*** BOOL bParallelDownload ) +;|*** { +; Line 798 + *** 00068c 55 push bp + *** 00068d 8b ec mov bp,sp + *** 00068f 57 push di + *** 000690 56 push si +; hImage = 4 +; ucBuffer = 6 +; usReadSize = 8 +; bParallelDownload = 10 +; register si = loop +;|*** USHORT loop; +;|*** +;|*** if( bParallelDownload ) +; Line 801 + *** 000691 83 7e 0a 00 cmp WORD PTR [bp+10],0 ;bParallelDownload + *** 000695 74 2b je $I741 +;|*** { +;|*** // Parallel download +;|*** +;|*** for( loop = 0; loop < usReadSize; loop++ ) +; Line 805 + *** 000697 33 f6 xor si,si + *** 000699 39 76 08 cmp WORD PTR [bp+8],si ;usReadSize + *** 00069c 74 16 je $FB744 + *** 00069e 8b 7e 06 mov di,WORD PTR [bp+6] ;ucBuffer + $F742: +;|*** { +;|*** ucBuffer[loop]= (UCHAR)OEMParallelPortGetByte(); +; Line 807 + *** 0006a1 e8 00 00 call _OEMParallelPortGetByte + *** 0006a4 88 05 mov BYTE PTR [di],al +;|*** +;|*** if( NoPPFS ) +; Line 809 + *** 0006a6 83 3e 00 00 00 cmp WORD PTR _NoPPFS,0 + *** 0006ab 75 0f jne $L985 +;|*** for( loop = 0; loop < usReadSize; loop++ ) +; Line 805 + *** 0006ad 47 inc di + *** 0006ae 46 inc si + *** 0006af 3b 76 08 cmp si,WORD PTR [bp+8] ;usReadSize + *** 0006b2 72 ed jb $F742 + $FB744: +;|*** { +;|*** ucBuffer[loop]= (UCHAR)OEMParallelPortGetByte(); +;|*** +;|*** if( NoPPFS ) +;|*** { +;|*** return 0; +;|*** } +;|*** } +;|*** return usReadSize; +; Line 814 + *** 0006b4 8b 46 08 mov ax,WORD PTR [bp+8] ;usReadSize + *** 0006b7 5e pop si + *** 0006b8 5f pop di + *** 0006b9 c9 leave + *** 0006ba c3 ret + *** 0006bb 90 nop + $L985: +;|*** return 0; +; Line 811 + *** 0006bc 33 c0 xor ax,ax + *** 0006be 5e pop si + *** 0006bf 5f pop di + *** 0006c0 c9 leave + *** 0006c1 c3 ret +;|*** } +;|*** } +;|*** return usReadSize; +;|*** } +;|*** else if( bSerialDownload ) +; Line 816 + $I741: + *** 0006c2 83 3e 00 00 00 cmp WORD PTR _bSerialDownload,0 + *** 0006c7 74 13 je $I747 + *** 0006c9 8b 76 08 mov si,WORD PTR [bp+8] ;usReadSize +;|*** { +;|*** // Serial download +;|*** +;|*** OEMReadDebugBytes( ucBuffer,usReadSize ); +; Line 820 + *** 0006cc 56 push si + *** 0006cd ff 76 06 push WORD PTR [bp+6] ;ucBuffer + *** 0006d0 e8 00 00 call _OEMReadDebugBytes + *** 0006d3 83 c4 04 add sp,4 +;|*** return usReadSize; +; Line 821 + *** 0006d6 8b c6 mov ax,si + *** 0006d8 5e pop si + *** 0006d9 5f pop di + *** 0006da c9 leave + *** 0006db c3 ret +;|*** } +;|*** else +; Line 823 + $I747: +;|*** { +;|*** // Ethernet? +;|*** +;|*** return _read( hImage, ucBuffer, usReadSize ); +; Line 827 + *** 0006dc ff 76 08 push WORD PTR [bp+8] ;usReadSize + *** 0006df ff 76 06 push WORD PTR [bp+6] ;ucBuffer + *** 0006e2 ff 76 04 push WORD PTR [bp+4] ;hImage + *** 0006e5 e8 00 00 call __read + *** 0006e8 83 c4 06 add sp,6 +;|*** } +;|*** } +; Line 829 + *** 0006eb 5e pop si + *** 0006ec 5f pop di + *** 0006ed c9 leave + *** 0006ee c3 ret + *** 0006ef 90 nop + +DownloadRead ENDP + +LoadImage PROC NEAR +;|*** +;|*** //------------------------------------------------------------------------------ +;|*** // +;|*** // Function Name: LoadImage +;|*** // Description..: This function is responsible for getting and loading +;|*** // the image into memory. +;|*** // Inputs.......: BOOL Verbose set verbose tracing flag +;|*** // BOOL ParallelDownLoad use parallel port flag +;|*** // char * FileName image file name +;|*** // PULONG EntryPoint memory entry point +;|*** // Outputs......: TRUE on success, FALSE on failure. +;|*** // +;|*** //------------------------------------------------------------------------------ +;|*** +;|*** static int LoadImage( BOOL bVerbose, +;|*** BOOL bParallelDownload, +;|*** char *pszFileName, +;|*** PULONG pulEntryPoint ) +;|*** { +; Line 848 + *** 0006f0 c8 44 01 00 enter 324,0 + *** 0006f4 57 push di + *** 0006f5 56 push si +; ulChecksum = -36 +; usReadSize = -38 +; usAmountRead = -40 +; ulReadTotal = -44 +; ulReadProgress = -48 +; usIndex = -50 +; i = -52 +; BootPacket = -308 +; pDestByte = -310 +; pTemp = -312 +; chksum = -314 +; uiTemp = -318 +; bootType = -322 +; len = -324 +; hImage = -2 +; lImageSize = -6 +; xmsError = -8 +; usTotalFree = -10 +; usLargestBlock = -12 +; ulLinearAddress = -16 +; ulSectionAddress = -20 +; ulSectionSize = -24 +; ulSectionChecksum = -28 +; ulSectionOffset = -32 +; pulEntryPoint = 10 +; pszFileName = 8 +; bParallelDownload = 6 +; bVerbose = 4 +;|*** int hImage; +;|*** long lImageSize; +;|*** int xmsError; +;|*** USHORT usTotalFree; +;|*** USHORT usLargestBlock; +;|*** ULONG ulLinearAddress; +;|*** ULONG ulSectionAddress; +;|*** ULONG ulSectionSize; +;|*** ULONG ulSectionChecksum; +;|*** ULONG ulSectionOffset; +;|*** ULONG ulChecksum; +;|*** USHORT usReadSize; +;|*** USHORT usAmountRead; +;|*** ULONG ulReadTotal=0; +; Line 862 + *** 0006f6 2b c0 sub ax,ax + *** 0006f8 89 46 d6 mov WORD PTR [bp-42],ax + *** 0006fb 89 46 d4 mov WORD PTR [bp-44],ax ;ulReadTotal +;|*** ULONG ulReadProgress=0; +; Line 863 + *** 0006fe 89 46 d2 mov WORD PTR [bp-46],ax + *** 000701 89 46 d0 mov WORD PTR [bp-48],ax ;ulReadProgress +;|*** USHORT usIndex; +;|*** static UCHAR ucBuffer[ CHUNKSIZE ]; +;|*** static UCHAR ucSignature[] = { 'B', '0', '0', '0', 'F', 'F', '\n'}; +;|*** int i; +;|*** UCHAR BootPacket[256]; +;|*** UCHAR *pDestByte; +;|*** UCHAR *pTemp; +;|*** unsigned int chksum; +;|*** long int uiTemp; +;|*** long int bootType; +;|*** unsigned len; +;|*** +;|*** +;|*** // Find the largest Extended Memory block and allocate it +;|*** +;|*** xmsError = XmsQueryFreeExtendedMemory(&usLargestBlock, &usTotalFree); +;|*** +;|*** if( xmsError != XMS_SUCCESS ) +; Line 881 + *** 000704 8d 46 f6 lea ax,WORD PTR [bp-10] ;usTotalFree + *** 000707 50 push ax + *** 000708 8d 46 f4 lea ax,WORD PTR [bp-12] ;usLargestBlock + *** 00070b 50 push ax + *** 00070c e8 00 00 call _XmsQueryFreeExtendedMemory + *** 00070f 83 c4 04 add sp,4 + *** 000712 89 46 f8 mov WORD PTR [bp-8],ax ;xmsError + *** 000715 0b c0 or ax,ax + *** 000717 74 2d je $I786 +;|*** { +;|*** printf("Error querying free extended memory - %s\n", XmsErrorString(xmsError)); +; Line 883 + *** 000719 50 push ax + *** 00071a e8 00 00 call _XmsErrorString + *** 00071d 83 c4 02 add sp,2 + *** 000720 50 push ax + *** 000721 68 00 00 push OFFSET DGROUP:$SG787 + $L1022: + *** 000724 e8 00 00 call _printf + *** 000727 83 c4 04 add sp,4 +;|*** +;|*** if( !bParallelDownload && !bSerialDownload ) +; Line 885 + $L1023: + *** 00072a 83 7e 06 00 cmp WORD PTR [bp+6],0 ;bParallelDownload + *** 00072e 75 10 jne $I788 + *** 000730 83 3e 00 00 00 cmp WORD PTR _bSerialDownload,0 + *** 000735 75 09 jne $I788 +;|*** { +;|*** _close(hImage); +; Line 887 + *** 000737 ff 76 fe push WORD PTR [bp-2] ;hImage + *** 00073a e8 00 00 call __close + *** 00073d 83 c4 02 add sp,2 +;|*** } +;|*** +;|*** return FALSE; +; Line 890 + $I788: + *** 000740 33 c0 xor ax,ax + *** 000742 5e pop si + *** 000743 5f pop di + *** 000744 c9 leave + *** 000745 c3 ret +;|*** } +;|*** +;|*** printf(" ImageName:......: %s\n",pszFileName ); +; Line 893 + $I786: + *** 000746 ff 76 08 push WORD PTR [bp+8] ;pszFileName + *** 000749 68 00 00 push OFFSET DGROUP:$SG789 + *** 00074c e8 00 00 call _printf + *** 00074f 83 c4 04 add sp,4 +;|*** printf(" FLATMode........: %d\n",iDesiredMode); +; Line 894 + *** 000752 ff 36 00 00 push WORD PTR _iDesiredMode + *** 000756 68 00 00 push OFFSET DGROUP:$SG790 + *** 000759 e8 00 00 call _printf + *** 00075c 83 c4 04 add sp,4 +;|*** printf(" VESAMode........: 0x%x\n", BootArgs.vesaMode ); +; Line 895 + *** 00075f ff 36 6c 00 push WORD PTR _BootArgs+108 + *** 000763 68 00 00 push OFFSET DGROUP:$SG791 + *** 000766 e8 00 00 call _printf + *** 000769 83 c4 04 add sp,4 +;|*** printf(" FreeEMSMem......: %u\n",usTotalFree); +; Line 896 + *** 00076c ff 76 f6 push WORD PTR [bp-10] ;usTotalFree + *** 00076f 68 00 00 push OFFSET DGROUP:$SG792 + *** 000772 e8 00 00 call _printf + *** 000775 83 c4 04 add sp,4 +;|*** printf(" LagestBlock.....: %u\n",usLargestBlock); +; Line 897 + *** 000778 ff 76 f4 push WORD PTR [bp-12] ;usLargestBlock + *** 00077b 68 00 00 push OFFSET DGROUP:$SG793 + *** 00077e e8 00 00 call _printf + *** 000781 83 c4 04 add sp,4 +;|*** printf(" ==========Booting - Press CTRL+C to cancel=========\n "); +; Line 898 + *** 000784 68 00 00 push OFFSET DGROUP:$SG794 + *** 000787 e8 00 00 call _printf + *** 00078a 83 c4 02 add sp,2 +;|*** fprintf(stderr, " "); +; Line 899 + *** 00078d 68 00 00 push OFFSET DGROUP:$SG795 + *** 000790 68 10 00 push OFFSET __iob+16 + *** 000793 e8 00 00 call _fprintf + *** 000796 83 c4 04 add sp,4 +;|*** fprintf(stderr, " "); +; Line 900 + *** 000799 68 00 00 push OFFSET DGROUP:$SG796 + *** 00079c 68 10 00 push OFFSET __iob+16 + *** 00079f e8 00 00 call _fprintf + *** 0007a2 83 c4 04 add sp,4 +;|*** if( bVerbose ) +; Line 901 + *** 0007a5 83 7e 04 00 cmp WORD PTR [bp+4],0 ;bVerbose + *** 0007a9 74 0f je $I797 +;|*** { +;|*** // Print info about memory available +;|*** +;|*** printf( "Total free extended memory = %u, largest block = %u\n", +;|*** usTotalFree, usLargestBlock); +; Line 906 + *** 0007ab ff 76 f4 push WORD PTR [bp-12] ;usLargestBlock + *** 0007ae ff 76 f6 push WORD PTR [bp-10] ;usTotalFree + *** 0007b1 68 00 00 push OFFSET DGROUP:$SG798 + *** 0007b4 e8 00 00 call _printf + *** 0007b7 83 c4 06 add sp,6 +;|*** } +;|*** +;|*** // Allocate the extended block +;|*** +;|*** xmsError = XmsAllocateExtendedMemory(usLargestBlock, &usBlockHandle); +; Line 911 + $I797: +;|*** +;|*** if( xmsError != XMS_SUCCESS ) +; Line 913 + *** 0007ba 68 00 00 push OFFSET DGROUP:_usBlockHandle + *** 0007bd ff 76 f4 push WORD PTR [bp-12] ;usLargestBlock + *** 0007c0 e8 00 00 call _XmsAllocateExtendedMemory + *** 0007c3 83 c4 04 add sp,4 + *** 0007c6 89 46 f8 mov WORD PTR [bp-8],ax ;xmsError + *** 0007c9 0b c0 or ax,ax + *** 0007cb 74 0f je $I799 +;|*** { +;|*** printf( "Error allocating extended memory - %s\n", +;|*** XmsErrorString(xmsError)); +; Line 916 + *** 0007cd 50 push ax + *** 0007ce e8 00 00 call _XmsErrorString + *** 0007d1 83 c4 02 add sp,2 + *** 0007d4 50 push ax + *** 0007d5 68 00 00 push OFFSET DGROUP:$SG800 + *** 0007d8 e9 49 ff jmp $L1022 + *** 0007db 90 nop +;|*** +;|*** if( !bParallelDownload && !bSerialDownload ) +;|*** { +;|*** _close(hImage); +;|*** } +;|*** +;|*** return FALSE; +;|*** } +;|*** +;|*** //printf("XMS usBlockHandle = 0x%x\n", usBlockHandle); +;|*** +;|*** // Lock the block and obtain its linear address. +;|*** // Then ensure that the image fits into it. +;|*** +;|*** xmsError = XmsLockExtendedMemory(usBlockHandle, &ulLinearAddress); +; Line 931 + $I799: +;|*** +;|*** if( xmsError != XMS_SUCCESS ) +; Line 933 + *** 0007dc 8d 46 f0 lea ax,WORD PTR [bp-16] ;ulLinearAddress + *** 0007df 50 push ax + *** 0007e0 ff 36 00 00 push WORD PTR _usBlockHandle + *** 0007e4 e8 00 00 call _XmsLockExtendedMemory + *** 0007e7 83 c4 04 add sp,4 + *** 0007ea 89 46 f8 mov WORD PTR [bp-8],ax ;xmsError + *** 0007ed 0b c0 or ax,ax + *** 0007ef 74 33 je $I802 +;|*** { +;|*** fprintf(stderr, "\r \r"); +; Line 935 + *** 0007f1 68 00 00 push OFFSET DGROUP:$SG803 + *** 0007f4 68 10 00 push OFFSET __iob+16 + *** 0007f7 e8 00 00 call _fprintf + *** 0007fa 83 c4 04 add sp,4 +;|*** printf("Error locking extended memory - %s\n", XmsErrorString(xmsError)); +; Line 936 + *** 0007fd ff 76 f8 push WORD PTR [bp-8] ;xmsError + *** 000800 e8 00 00 call _XmsErrorString + *** 000803 83 c4 02 add sp,2 + *** 000806 50 push ax + *** 000807 68 00 00 push OFFSET DGROUP:$SG804 + *** 00080a e8 00 00 call _printf + *** 00080d 83 c4 04 add sp,4 +;|*** +;|*** XmsFreeExtendedMemory(usBlockHandle); +; Line 938 + *** 000810 ff 36 00 00 push WORD PTR _usBlockHandle + *** 000814 e8 00 00 call _XmsFreeExtendedMemory + *** 000817 83 c4 02 add sp,2 +;|*** usBlockHandle = 0; +; Line 939 + *** 00081a c7 06 00 00 00 00 mov WORD PTR _usBlockHandle,0 + *** 000820 e9 07 ff jmp $L1023 + *** 000823 90 nop +;|*** +;|*** if( !bParallelDownload && !bSerialDownload ) +;|*** { +;|*** _close(hImage); +;|*** } +;|*** +;|*** return FALSE; +;|*** } +;|*** +;|*** // Print info about block allocated +;|*** +;|*** if( bVerbose ) +; Line 951 + $I802: + *** 000824 83 7e 04 00 cmp WORD PTR [bp+4],0 ;bVerbose + *** 000828 74 1b je $I806 +;|*** { +;|*** fprintf(stderr, "\r \r"); +; Line 953 + *** 00082a 68 00 00 push OFFSET DGROUP:$SG807 + *** 00082d 68 10 00 push OFFSET __iob+16 + *** 000830 e8 00 00 call _fprintf + *** 000833 83 c4 04 add sp,4 +;|*** printf("Block allocated at 0x%lX\n", ulLinearAddress); +; Line 954 + *** 000836 ff 76 f2 push WORD PTR [bp-14] + *** 000839 ff 76 f0 push WORD PTR [bp-16] ;ulLinearAddress + *** 00083c 68 00 00 push OFFSET DGROUP:$SG808 + *** 00083f e8 00 00 call _printf + *** 000842 83 c4 06 add sp,6 +;|*** } +;|*** +;|*** // Zero upper memory in CHUNKSIZE chunks +;|*** +;|*** memset(ucBuffer, 0, sizeof(ucBuffer)); +; Line 959 + $I806: + *** 000845 33 c0 xor ax,ax + *** 000847 bb 00 00 mov bx,OFFSET DGROUP:$S775_?ucBuffer@?1??LoadImage@@9@9 + *** 00084a b9 00 40 mov cx,16384 ;4000H + *** 00084d 8b fb mov di,bx + *** 00084f 1e push ds + *** 000850 07 pop es + *** 000851 f3 rep + *** 000852 ab stosw +;|*** ulSectionSize = (ULONG)usLargestBlock * 1024; +; Line 960 + *** 000853 8b 46 f4 mov ax,WORD PTR [bp-12] ;usLargestBlock + *** 000856 2b d2 sub dx,dx + *** 000858 8a d4 mov dl,ah + *** 00085a 8a e0 mov ah,al + *** 00085c 2a c0 sub al,al + *** 00085e 03 c0 add ax,ax + *** 000860 13 d2 adc dx,dx + *** 000862 03 c0 add ax,ax + *** 000864 13 d2 adc dx,dx + *** 000866 89 46 e8 mov WORD PTR [bp-24],ax ;ulSectionSize + *** 000869 89 56 ea mov WORD PTR [bp-22],dx +;|*** +;|*** for( ulSectionOffset = 0; ulSectionOffset < ulSectionSize; ulSectionOffset += usReadSize ) +; Line 962 + *** 00086c 2b c0 sub ax,ax + *** 00086e 89 46 e2 mov WORD PTR [bp-30],ax + *** 000871 89 46 e0 mov WORD PTR [bp-32],ax ;ulSectionOffset + *** 000874 eb 4f jmp SHORT $F809 + $I812: +;|*** { +;|*** if( (ulSectionSize - ulSectionOffset) < CHUNKSIZE ) +;|*** { +;|*** usReadSize = (USHORT)(ulSectionSize - ulSectionOffset); +;|*** } +;|*** else +;|*** { +;|*** usReadSize = CHUNKSIZE; +; Line 970 + *** 000876 c7 46 da 00 80 mov WORD PTR [bp-38],-32768 ;8000H ;usReadSize +;|*** } +; Line 971 + $I813: +;|*** +;|*** xmsError = XmsMoveExtendedMemory( +;|*** 0, (ULONG)(UCHAR far *)ucBuffer, +;|*** usBlockHandle, ulSectionOffset, usReadSize); +;|*** +;|*** if( xmsError != XMS_SUCCESS ) +; Line 977 + *** 00087b 6a 00 push 0 + *** 00087d ff 76 da push WORD PTR [bp-38] ;usReadSize + *** 000880 ff 76 e2 push WORD PTR [bp-30] + *** 000883 ff 76 e0 push WORD PTR [bp-32] ;ulSectionOffset + *** 000886 ff 36 00 00 push WORD PTR _usBlockHandle + *** 00088a 1e push ds + *** 00088b 68 00 00 push OFFSET DGROUP:$S775_?ucBuffer@?1??LoadImage@@9@9 + *** 00088e 6a 00 push 0 + *** 000890 e8 00 00 call _XmsMoveExtendedMemory + *** 000893 83 c4 10 add sp,16 ;0010H + *** 000896 89 46 f8 mov WORD PTR [bp-8],ax ;xmsError + *** 000899 0b c0 or ax,ax + *** 00089b 74 1d je $FC810 +;|*** { +;|*** fprintf(stderr, "\r \r"); +; Line 979 + *** 00089d 68 00 00 push OFFSET DGROUP:$SG815 + *** 0008a0 68 10 00 push OFFSET __iob+16 + *** 0008a3 e8 00 00 call _fprintf + *** 0008a6 83 c4 04 add sp,4 +;|*** printf("Error zeroing extended memory - %s\n", XmsErrorString(xmsError)); +; Line 980 + *** 0008a9 ff 76 f8 push WORD PTR [bp-8] ;xmsError + *** 0008ac e8 00 00 call _XmsErrorString + *** 0008af 83 c4 02 add sp,2 + *** 0008b2 50 push ax + *** 0008b3 68 00 00 push OFFSET DGROUP:$SG816 + *** 0008b6 e9 6b fe jmp $L1022 +;|*** if( !bParallelDownload && !bSerialDownload ) +;|*** _close(hImage); +;|*** +;|*** return FALSE; +;|*** } +;|*** } +; Line 986 + *** 0008b9 90 nop + $FC810: + *** 0008ba 8b 46 da mov ax,WORD PTR [bp-38] ;usReadSize + *** 0008bd 2b d2 sub dx,dx + *** 0008bf 01 46 e0 add WORD PTR [bp-32],ax ;ulSectionOffset + *** 0008c2 11 56 e2 adc WORD PTR [bp-30],dx + $F809: + *** 0008c5 8b 46 e8 mov ax,WORD PTR [bp-24] ;ulSectionSize + *** 0008c8 8b 56 ea mov dx,WORD PTR [bp-22] + *** 0008cb 39 56 e2 cmp WORD PTR [bp-30],dx + *** 0008ce 77 22 ja $FB811 + *** 0008d0 72 05 jb $L987 + *** 0008d2 39 46 e0 cmp WORD PTR [bp-32],ax ;ulSectionOffset + *** 0008d5 73 1b jae $FB811 + $L987: +;|*** if( (ulSectionSize - ulSectionOffset) < CHUNKSIZE ) +; Line 964 + *** 0008d7 2b 46 e0 sub ax,WORD PTR [bp-32] ;ulSectionOffset + *** 0008da 1b 56 e2 sbb dx,WORD PTR [bp-30] + *** 0008dd 0b d2 or dx,dx + *** 0008df 75 95 jne $I812 + *** 0008e1 3d 00 80 cmp ax,-32768 ;8000H + *** 0008e4 73 90 jae $I812 +;|*** { +;|*** usReadSize = (USHORT)(ulSectionSize - ulSectionOffset); +; Line 966 + *** 0008e6 8b 46 e8 mov ax,WORD PTR [bp-24] ;ulSectionSize + *** 0008e9 2b 46 e0 sub ax,WORD PTR [bp-32] ;ulSectionOffset + *** 0008ec 89 46 da mov WORD PTR [bp-38],ax ;usReadSize +;|*** } +;|*** else +; Line 968 + *** 0008ef eb 8a jmp SHORT $I813 + *** 0008f1 90 nop + $FB811: +;|*** { +;|*** usReadSize = CHUNKSIZE; +;|*** } +;|*** +;|*** xmsError = XmsMoveExtendedMemory( +;|*** 0, (ULONG)(UCHAR far *)ucBuffer, +;|*** usBlockHandle, ulSectionOffset, usReadSize); +;|*** +;|*** if( xmsError != XMS_SUCCESS ) +;|*** { +;|*** fprintf(stderr, "\r \r"); +;|*** printf("Error zeroing extended memory - %s\n", XmsErrorString(xmsError)); +;|*** if( !bParallelDownload && !bSerialDownload ) +;|*** _close(hImage); +;|*** +;|*** return FALSE; +;|*** } +;|*** } +;|*** +;|*** // Open image file +;|*** +;|*** // If this is a serial download, initialize the serial port +;|*** +;|*** if( bSerialDownload ) +; Line 992 + *** 0008f2 83 3e 00 00 00 cmp WORD PTR _bSerialDownload,0 + *** 0008f7 74 03 je $I818 +;|*** { +;|*** OEMInitDebugSerial(); +; Line 994 + *** 0008f9 e8 00 00 call _OEMInitDebugSerial +;|*** } +;|*** +;|*** if( bParallelDownload || bSerialDownload ) +; Line 997 + $I818: + *** 0008fc 83 7e 06 00 cmp WORD PTR [bp+6],0 ;bParallelDownload + *** 000900 75 0a jne $I820 + *** 000902 83 3e 00 00 00 cmp WORD PTR _bSerialDownload,0 + *** 000907 75 03 jne $JCC2311 + *** 000909 e9 2e 02 jmp $I819 + $JCC2311: + $I820: +;|*** { +;|*** // Prepare boot packet +;|*** +;|*** pDestByte = BootPacket; +; Line 1001 + *** 00090c 8d 86 cc fe lea ax,WORD PTR [bp-308] ;BootPacket + *** 000910 89 86 ca fe mov WORD PTR [bp-310],ax ;pDestByte +;|*** +;|*** for( i = 0; i < BOOT_HEADER_SIZE; i++ ) +; Line 1003 + *** 000914 c7 46 cc 00 00 mov WORD PTR [bp-52],0 ;i + $FC822: +;|*** { +;|*** *pDestByte++ = BootHeader[i]; +; Line 1005 + *** 000919 8b 5e cc mov bx,WORD PTR [bp-52] ;i + *** 00091c 8a 87 00 00 mov al,BYTE PTR $S519_BootHeader[bx] + *** 000920 8b 9e ca fe mov bx,WORD PTR [bp-310] ;pDestByte + *** 000924 ff 86 ca fe inc WORD PTR [bp-310] ;pDestByte + *** 000928 88 07 mov BYTE PTR [bx],al +;|*** } +; Line 1006 + *** 00092a ff 46 cc inc WORD PTR [bp-52] ;i + *** 00092d 83 7e cc 06 cmp WORD PTR [bp-52],6 ;i + *** 000931 72 e6 jb $FC822 +;|*** +;|*** chksum = 0; +; Line 1008 + *** 000933 c7 86 c6 fe 00 00 mov WORD PTR [bp-314],0 ;chksum +;|*** len = 9; +; Line 1009 + *** 000939 c7 86 bc fe 09 00 mov WORD PTR [bp-324],9 ;len +;|*** +;|*** if( pszFileName ) +; Line 1011 + *** 00093f 83 7e 08 00 cmp WORD PTR [bp+8],0 ;pszFileName + *** 000943 74 53 je $I824 +;|*** { +;|*** if( bSerialDownload ) +; Line 1013 + *** 000945 83 3e 00 00 00 cmp WORD PTR _bSerialDownload,0 + *** 00094a 74 08 je $I825 +;|*** printf("Loading image %s via serial port.\r\n",pszFileName); +; Line 1014 + *** 00094c ff 76 08 push WORD PTR [bp+8] ;pszFileName + *** 00094f 68 00 00 push OFFSET DGROUP:$SG826 + *** 000952 eb 06 jmp SHORT $L1012 + $I825: +;|*** else +;|*** printf("Loading image %s via parallel port.\r\n",pszFileName); +; Line 1016 + *** 000954 ff 76 08 push WORD PTR [bp+8] ;pszFileName + *** 000957 68 00 00 push OFFSET DGROUP:$SG828 + $L1012: + *** 00095a e8 00 00 call _printf + *** 00095d 83 c4 04 add sp,4 +;|*** +;|*** bootType = 1; // The NULL byte +; Line 1018 + *** 000960 c7 86 be fe 01 00 mov WORD PTR [bp-322],1 ;bootType + *** 000966 c7 86 c0 fe 00 00 mov WORD PTR [bp-320],0 +;|*** +;|*** for( pTemp = (UCHAR*)pszFileName; *pTemp; pTemp++ ) +; Line 1020 + *** 00096c 8b 46 08 mov ax,WORD PTR [bp+8] ;pszFileName + *** 00096f 89 86 c8 fe mov WORD PTR [bp-312],ax ;pTemp + *** 000973 eb 0f jmp SHORT $F829 + *** 000975 90 nop + $FC830: +;|*** { +;|*** bootType++; +; Line 1022 + *** 000976 83 86 be fe 01 add WORD PTR [bp-322],1 ;bootType + *** 00097b 83 96 c0 fe 00 adc WORD PTR [bp-320],0 +;|*** } +; Line 1023 + *** 000980 ff 86 c8 fe inc WORD PTR [bp-312] ;pTemp + $F829: + *** 000984 8b 9e c8 fe mov bx,WORD PTR [bp-312] ;pTemp + *** 000988 80 3f 00 cmp BYTE PTR [bx],0 + *** 00098b 75 e9 jne $FC830 +;|*** +;|*** len += (unsigned)bootType; +; Line 1025 + *** 00098d 8b 86 be fe mov ax,WORD PTR [bp-322] ;bootType + *** 000991 01 86 bc fe add WORD PTR [bp-324],ax ;len +;|*** +;|*** } +;|*** else +; Line 1028 + *** 000995 eb 22 jmp SHORT $I832 + *** 000997 90 nop + $I824: +;|*** { +;|*** if( bSerialDownload ) +; Line 1030 + *** 000998 83 3e 00 00 00 cmp WORD PTR _bSerialDownload,0 + *** 00099d 74 05 je $I833 +;|*** printf("Loading host default image via serial port.\r\n"); +; Line 1031 + *** 00099f 68 00 00 push OFFSET DGROUP:$SG834 + *** 0009a2 eb 03 jmp SHORT $L1014 + $I833: +;|*** else +;|*** printf("Loading host default image via parallel port.\r\n"); +; Line 1033 + *** 0009a4 68 00 00 push OFFSET DGROUP:$SG836 + $L1014: + *** 0009a7 e8 00 00 call _printf + *** 0009aa 83 c4 02 add sp,2 +;|*** +;|*** bootType = BOOT_TYPE; +; Line 1035 + *** 0009ad c7 86 be fe fc ff mov WORD PTR [bp-322],-4 ;fffcH ;bootType + *** 0009b3 c7 86 c0 fe ff ff mov WORD PTR [bp-320],-1 ;ffffH +;|*** } +; Line 1036 + $I832: +;|*** +;|*** uiTemp = len; +; Line 1038 + *** 0009b9 8b 86 bc fe mov ax,WORD PTR [bp-324] ;len + *** 0009bd 89 86 c2 fe mov WORD PTR [bp-318],ax ;uiTemp + *** 0009c1 c7 86 c4 fe 00 00 mov WORD PTR [bp-316],0 +;|*** +;|*** for( i = 0; i < 2; i++ ) +; Line 1040 + *** 0009c7 c7 46 cc 00 00 mov WORD PTR [bp-52],0 ;i + $FC838: +;|*** { +;|*** *pDestByte++ = (unsigned char)(uiTemp & 0xFF); +; Line 1042 + *** 0009cc 8b c8 mov cx,ax + *** 0009ce 8b 9e ca fe mov bx,WORD PTR [bp-310] ;pDestByte + *** 0009d2 ff 86 ca fe inc WORD PTR [bp-310] ;pDestByte + *** 0009d6 88 07 mov BYTE PTR [bx],al +;|*** chksum += (unsigned int)(uiTemp & 0xFF); +; Line 1043 + *** 0009d8 2a ed sub ch,ch + *** 0009da 01 8e c6 fe add WORD PTR [bp-314],cx ;chksum +;|*** uiTemp >>= 8; +; Line 1044 + *** 0009de 8b 86 c2 fe mov ax,WORD PTR [bp-318] ;uiTemp + *** 0009e2 8b 96 c4 fe mov dx,WORD PTR [bp-316] + *** 0009e6 8a c4 mov al,ah + *** 0009e8 8a e2 mov ah,dl + *** 0009ea 8a d6 mov dl,dh + *** 0009ec 02 f6 add dh,dh + *** 0009ee 1a f6 sbb dh,dh + *** 0009f0 89 86 c2 fe mov WORD PTR [bp-318],ax ;uiTemp + *** 0009f4 89 96 c4 fe mov WORD PTR [bp-316],dx +;|*** } +; Line 1045 + *** 0009f8 ff 46 cc inc WORD PTR [bp-52] ;i + *** 0009fb 83 7e cc 02 cmp WORD PTR [bp-52],2 ;i + *** 0009ff 7c cb jl $FC838 +;|*** +;|*** uiTemp = bootType; +; Line 1047 + *** 000a01 8b 86 be fe mov ax,WORD PTR [bp-322] ;bootType + *** 000a05 8b 96 c0 fe mov dx,WORD PTR [bp-320] + *** 000a09 89 86 c2 fe mov WORD PTR [bp-318],ax ;uiTemp + *** 000a0d 89 96 c4 fe mov WORD PTR [bp-316],dx +;|*** +;|*** for( i = 0; i < 4; i++ ) +; Line 1049 + *** 000a11 c7 46 cc 00 00 mov WORD PTR [bp-52],0 ;i + $FC841: +;|*** { +;|*** *pDestByte++ = (unsigned char)(uiTemp & 0xFF); +; Line 1051 + *** 000a16 8b c8 mov cx,ax + *** 000a18 8b 9e ca fe mov bx,WORD PTR [bp-310] ;pDestByte + *** 000a1c ff 86 ca fe inc WORD PTR [bp-310] ;pDestByte + *** 000a20 88 07 mov BYTE PTR [bx],al +;|*** chksum += (unsigned int)(uiTemp & 0xFF); +; Line 1052 + *** 000a22 2a ed sub ch,ch + *** 000a24 01 8e c6 fe add WORD PTR [bp-314],cx ;chksum +;|*** uiTemp >>= 8; +; Line 1053 + *** 000a28 8b 86 c2 fe mov ax,WORD PTR [bp-318] ;uiTemp + *** 000a2c 8b 96 c4 fe mov dx,WORD PTR [bp-316] + *** 000a30 8a c4 mov al,ah + *** 000a32 8a e2 mov ah,dl + *** 000a34 8a d6 mov dl,dh + *** 000a36 02 f6 add dh,dh + *** 000a38 1a f6 sbb dh,dh + *** 000a3a 89 86 c2 fe mov WORD PTR [bp-318],ax ;uiTemp + *** 000a3e 89 96 c4 fe mov WORD PTR [bp-316],dx +;|*** } +; Line 1054 + *** 000a42 ff 46 cc inc WORD PTR [bp-52] ;i + *** 000a45 83 7e cc 04 cmp WORD PTR [bp-52],4 ;i + *** 000a49 7c cb jl $FC841 +;|*** +;|*** if( bootType > 0 ) +; Line 1056 + *** 000a4b 83 be c0 fe 00 cmp WORD PTR [bp-320],0 + *** 000a50 7c 3e jl $I843 + *** 000a52 7f 07 jg $L989 + *** 000a54 83 be be fe 00 cmp WORD PTR [bp-322],0 ;bootType + *** 000a59 74 35 je $I843 + $L989: +;|*** { +;|*** for( pTemp = (UCHAR*)pszFileName; *pTemp; pTemp++ ) +; Line 1058 + *** 000a5b 8b 46 08 mov ax,WORD PTR [bp+8] ;pszFileName + *** 000a5e 89 86 c8 fe mov WORD PTR [bp-312],ax ;pTemp + *** 000a62 eb 18 jmp SHORT $F844 + $FC845: +;|*** { +;|*** *pDestByte++ = *pTemp; +; Line 1060 + *** 000a64 8a 07 mov al,BYTE PTR [bx] + *** 000a66 8b b6 ca fe mov si,WORD PTR [bp-310] ;pDestByte + *** 000a6a ff 86 ca fe inc WORD PTR [bp-310] ;pDestByte + *** 000a6e 88 04 mov BYTE PTR [si],al +;|*** chksum += *pTemp; +; Line 1061 + *** 000a70 8a 07 mov al,BYTE PTR [bx] + *** 000a72 2a e4 sub ah,ah + *** 000a74 01 86 c6 fe add WORD PTR [bp-314],ax ;chksum +;|*** } +; Line 1062 + *** 000a78 ff 86 c8 fe inc WORD PTR [bp-312] ;pTemp + $F844: + *** 000a7c 8b 9e c8 fe mov bx,WORD PTR [bp-312] ;pTemp + *** 000a80 80 3f 00 cmp BYTE PTR [bx],0 + *** 000a83 75 df jne $FC845 +;|*** *pDestByte++ = 0; +; Line 1063 + *** 000a85 8b 9e ca fe mov bx,WORD PTR [bp-310] ;pDestByte + *** 000a89 ff 86 ca fe inc WORD PTR [bp-310] ;pDestByte + *** 000a8d c6 07 00 mov BYTE PTR [bx],0 +;|*** } +;|*** +;|*** *pDestByte++ = (unsigned char)((~chksum) & 0xFF); +; Line 1066 + $I843: + *** 000a90 8a 86 c6 fe mov al,BYTE PTR [bp-314] ;chksum + *** 000a94 f6 d0 not al + *** 000a96 8b 9e ca fe mov bx,WORD PTR [bp-310] ;pDestByte + *** 000a9a ff 86 ca fe inc WORD PTR [bp-310] ;pDestByte + *** 000a9e 88 07 mov BYTE PTR [bx],al +;|*** +;|*** for( i = 0; i < BOOT_TAIL_SIZE; i++ ) +; Line 1068 + *** 000aa0 c7 46 cc 00 00 mov WORD PTR [bp-52],0 ;i + $FC848: +;|*** { +;|*** *pDestByte++ = BootTail[i]; +; Line 1070 + *** 000aa5 8b 5e cc mov bx,WORD PTR [bp-52] ;i + *** 000aa8 8a 87 00 00 mov al,BYTE PTR $S520_BootTail[bx] + *** 000aac 8b 9e ca fe mov bx,WORD PTR [bp-310] ;pDestByte + *** 000ab0 ff 86 ca fe inc WORD PTR [bp-310] ;pDestByte + *** 000ab4 88 07 mov BYTE PTR [bx],al +;|*** } +; Line 1071 + *** 000ab6 ff 46 cc inc WORD PTR [bp-52] ;i + *** 000ab9 83 7e cc 04 cmp WORD PTR [bp-52],4 ;i + *** 000abd 72 e6 jb $FC848 +;|*** +;|*** +;|*** if( bVerbose ) printf("Sending boot packet: "); +; Line 1074 + *** 000abf 83 7e 04 00 cmp WORD PTR [bp+4],0 ;bVerbose + *** 000ac3 74 09 je $I850 + *** 000ac5 68 00 00 push OFFSET DGROUP:$SG851 + *** 000ac8 e8 00 00 call _printf + *** 000acb 83 c4 02 add sp,2 +;|*** +;|*** usIndex=0; +; Line 1076 + $I850: + *** 000ace c7 46 ce 00 00 mov WORD PTR [bp-50],0 ;usIndex +;|*** +;|*** while( &BootPacket[usIndex] < pDestByte ) +; Line 1078 + *** 000ad3 eb 46 jmp SHORT $L1020 + *** 000ad5 90 nop + $FC853: +;|*** { +;|*** if( NoPPFS ) +; Line 1080 + *** 000ad6 83 3e 00 00 00 cmp WORD PTR _NoPPFS,0 + *** 000adb 74 03 je $JCC2779 + *** 000add e9 60 fc jmp $I788 + $JCC2779: +;|*** { +;|*** return FALSE; +;|*** } +;|*** +;|*** if( bVerbose ) printf("%x ",BootPacket[usIndex]); +; Line 1085 + *** 000ae0 83 7e 04 00 cmp WORD PTR [bp+4],0 ;bVerbose + *** 000ae4 74 10 je $I856 + *** 000ae6 8a 82 cc fe mov al,BYTE PTR [bp-308][si] + *** 000aea 2a e4 sub ah,ah + *** 000aec 50 push ax + *** 000aed 68 00 00 push OFFSET DGROUP:$SG857 + *** 000af0 e8 00 00 call _printf + *** 000af3 83 c4 04 add sp,4 +;|*** +;|*** if( bSerialDownload ) +; Line 1087 + $I856: + *** 000af6 83 3e 00 00 00 cmp WORD PTR _bSerialDownload,0 + *** 000afb 74 0d je $I858 +;|*** { +;|*** OEMWriteDebugByte(BootPacket[usIndex]); +; Line 1089 + *** 000afd 8b 76 ce mov si,WORD PTR [bp-50] ;usIndex + *** 000b00 8a 82 cc fe mov al,BYTE PTR [bp-308][si] + *** 000b04 50 push ax + *** 000b05 e8 00 00 call _OEMWriteDebugByte + *** 000b08 eb 0b jmp SHORT $L1019 + $I858: +;|*** } +;|*** else +;|*** { +;|*** OEMParallelPortSendByte(BootPacket[usIndex]); +; Line 1093 + *** 000b0a 8b 76 ce mov si,WORD PTR [bp-50] ;usIndex + *** 000b0d 8a 82 cc fe mov al,BYTE PTR [bp-308][si] + *** 000b11 50 push ax + *** 000b12 e8 00 00 call _OEMParallelPortSendByte + $L1019: + *** 000b15 83 c4 02 add sp,2 +;|*** } +;|*** usIndex++; +; Line 1095 + *** 000b18 ff 46 ce inc WORD PTR [bp-50] ;usIndex +;|*** } +; Line 1096 + $L1020: + *** 000b1b 8b 76 ce mov si,WORD PTR [bp-50] ;usIndex + *** 000b1e 8d 82 cc fe lea ax,WORD PTR [bp-308][si] + *** 000b22 3b 86 ca fe cmp ax,WORD PTR [bp-310] ;pDestByte + *** 000b26 72 ae jb $FC853 +;|*** +;|*** if( bVerbose ) printf("Sent.\r\n"); +; Line 1098 + *** 000b28 83 7e 04 00 cmp WORD PTR [bp+4],0 ;bVerbose + *** 000b2c 75 03 jne $JCC2860 + *** 000b2e e9 80 00 jmp $I868 + $JCC2860: + *** 000b31 68 00 00 push OFFSET DGROUP:$SG861 + *** 000b34 e8 00 00 call _printf + *** 000b37 eb 75 jmp SHORT $L1024 + *** 000b39 90 nop + $I819: +;|*** } +;|*** else +;|*** { +;|*** hImage = _open(pszFileName, _O_BINARY | _O_RDONLY); +;|*** +;|*** if( hImage == -1 ) +; Line 1104 + *** 000b3a 68 00 80 push -32768 ;8000H + *** 000b3d ff 76 08 push WORD PTR [bp+8] ;pszFileName + *** 000b40 e8 00 00 call __open + *** 000b43 83 c4 04 add sp,4 + *** 000b46 89 46 fe mov WORD PTR [bp-2],ax ;hImage + *** 000b49 40 inc ax + *** 000b4a 75 18 jne $I863 +;|*** { +;|*** printf("%s: Error opening file - %s\n", pszFileName, _strerror(NULL)); +; Line 1106 + *** 000b4c 6a 00 push 0 + *** 000b4e e8 00 00 call __strerror + *** 000b51 83 c4 02 add sp,2 + *** 000b54 50 push ax + *** 000b55 ff 76 08 push WORD PTR [bp+8] ;pszFileName + *** 000b58 68 00 00 push OFFSET DGROUP:$SG864 + *** 000b5b e8 00 00 call _printf + *** 000b5e 83 c4 06 add sp,6 + *** 000b61 e9 dc fb jmp $I788 +;|*** return FALSE; +;|*** } +;|*** +;|*** if( (lImageSize = _filelength(hImage)) == -1 ) +; Line 1110 + $I863: + *** 000b64 ff 76 fe push WORD PTR [bp-2] ;hImage + *** 000b67 e8 00 00 call __filelength + *** 000b6a 83 c4 02 add sp,2 + *** 000b6d 89 46 fa mov WORD PTR [bp-6],ax ;lImageSize + *** 000b70 89 56 fc mov WORD PTR [bp-4],dx + *** 000b73 3d ff ff cmp ax,-1 ;ffffH + *** 000b76 75 1c jne $I865 + *** 000b78 3b d0 cmp dx,ax + *** 000b7a 75 18 jne $I865 +;|*** { +;|*** printf("%s: Error obtaining file size - %s\n", pszFileName, _strerror(NULL)); +; Line 1112 + *** 000b7c 6a 00 push 0 + *** 000b7e e8 00 00 call __strerror + *** 000b81 83 c4 02 add sp,2 + *** 000b84 50 push ax + *** 000b85 ff 76 08 push WORD PTR [bp+8] ;pszFileName + *** 000b88 68 00 00 push OFFSET DGROUP:$SG866 + *** 000b8b e8 00 00 call _printf + *** 000b8e 83 c4 06 add sp,6 + *** 000b91 e9 96 fb jmp $L1023 +;|*** if( !bParallelDownload && !bSerialDownload ) +;|*** _close(hImage); +;|*** +;|*** return FALSE; +;|*** } +;|*** +;|*** if( bVerbose ) +; Line 1119 + $I865: + *** 000b94 83 7e 04 00 cmp WORD PTR [bp+4],0 ;bVerbose + *** 000b98 74 17 je $I868 +;|*** { +;|*** printf("Loading %s, size = %ld\n", pszFileName, lImageSize); +; Line 1121 + *** 000b9a 52 push dx + *** 000b9b 50 push ax + *** 000b9c ff 76 08 push WORD PTR [bp+8] ;pszFileName + *** 000b9f 68 00 00 push OFFSET DGROUP:$SG869 + *** 000ba2 e8 00 00 call _printf + *** 000ba5 83 c4 08 add sp,8 +;|*** DisplayCEOSVersion( pszFileName ); // Extract Version Number from image if available +; Line 1122 + *** 000ba8 ff 76 08 push WORD PTR [bp+8] ;pszFileName + *** 000bab e8 00 00 call DisplayCEOSVersion + $L1024: + *** 000bae 83 c4 02 add sp,2 +;|*** } +;|*** } +; Line 1124 + $I868: +;|*** +;|*** // Read initial signature and physical start and size +;|*** +;|*** usReadSize = sizeof(ucSignature) + 2 * sizeof(ULONG); +;|*** +;|*** if( DownloadRead( hImage, ucBuffer, usReadSize, bParallelDownload) != usReadSize ) +; Line 1130 + *** 000bb1 ff 76 06 push WORD PTR [bp+6] ;bParallelDownload + *** 000bb4 b8 0f 00 mov ax,15 ;000fH + *** 000bb7 89 46 da mov WORD PTR [bp-38],ax ;usReadSize + *** 000bba 50 push ax + *** 000bbb 68 00 00 push OFFSET DGROUP:$S775_?ucBuffer@?1??LoadImage@@9@9 + *** 000bbe ff 76 fe push WORD PTR [bp-2] ;hImage + *** 000bc1 e8 c8 fa call DownloadRead + *** 000bc4 83 c4 08 add sp,8 + *** 000bc7 3d 0f 00 cmp ax,15 ;000fH + *** 000bca 74 10 je $I870 +;|*** { +;|*** printf("Error reading signature - %s\n", _strerror(NULL)); +; Line 1132 + *** 000bcc 6a 00 push 0 + *** 000bce e8 00 00 call __strerror + *** 000bd1 83 c4 02 add sp,2 + *** 000bd4 50 push ax + *** 000bd5 68 00 00 push OFFSET DGROUP:$SG871 + *** 000bd8 e9 49 fb jmp $L1022 + *** 000bdb 90 nop +;|*** if( !bParallelDownload && !bSerialDownload ) +;|*** _close(hImage); +;|*** +;|*** return FALSE; +;|*** } +;|*** +;|*** if( memcmp(ucBuffer, ucSignature, sizeof(ucSignature)) != 0 ) +; Line 1139 + $I870: + *** 000bdc b8 00 00 mov ax,OFFSET DGROUP:$S775_?ucBuffer@?1??LoadImage@@9@9 + *** 000bdf ba 00 00 mov dx,OFFSET DGROUP:$S777_?ucSignature@?1??LoadImage@@9@9 + *** 000be2 b9 07 00 mov cx,7 + *** 000be5 8b fa mov di,dx + *** 000be7 8b f0 mov si,ax + *** 000be9 1e push ds + *** 000bea 07 pop es + *** 000beb d1 e9 shr cx,1 + *** 000bed 1b c0 sbb ax,ax + *** 000bef 3b c9 cmp cx,cx + *** 000bf1 f3 repz + *** 000bf2 a7 cmpsw + *** 000bf3 75 04 jne $L990 + *** 000bf5 2b c8 sub cx,ax + *** 000bf7 f3 repz + *** 000bf8 a6 cmpsb + $L990: + *** 000bf9 74 3b je $I873 +;|*** { +;|*** printf("Error invalid signature\nData: "); +; Line 1141 + *** 000bfb 68 00 00 push OFFSET DGROUP:$SG874 + *** 000bfe e8 00 00 call _printf + *** 000c01 83 c4 02 add sp,2 +;|*** for( i = 0; i < (int)usReadSize; i++ ) +; Line 1142 + *** 000c04 c7 46 cc 00 00 mov WORD PTR [bp-52],0 ;i + *** 000c09 eb 17 jmp SHORT $F875 + *** 000c0b 90 nop + $FC876: +;|*** printf("%x ",ucBuffer[i]); +; Line 1143 + *** 000c0c 8b 5e cc mov bx,WORD PTR [bp-52] ;i + *** 000c0f 2a e4 sub ah,ah + *** 000c11 8a 87 00 00 mov al,BYTE PTR $S775_?ucBuffer@?1??LoadImage@@9@9[bx] + *** 000c15 50 push ax + *** 000c16 68 00 00 push OFFSET DGROUP:$SG878 + *** 000c19 e8 00 00 call _printf + *** 000c1c 83 c4 04 add sp,4 + *** 000c1f ff 46 cc inc WORD PTR [bp-52] ;i + $F875: + *** 000c22 8b 46 da mov ax,WORD PTR [bp-38] ;usReadSize + *** 000c25 39 46 cc cmp WORD PTR [bp-52],ax ;i + *** 000c28 7c e2 jl $FC876 +;|*** printf("\r\n"); +; Line 1144 + *** 000c2a 68 00 00 push OFFSET DGROUP:$SG879 + *** 000c2d e8 00 00 call _printf + *** 000c30 83 c4 02 add sp,2 + *** 000c33 e9 f4 fa jmp $L1023 +;|*** if( !bParallelDownload && !bSerialDownload ) +;|*** _close(hImage); +;|*** +;|*** return FALSE; +;|*** } +;|*** +;|*** ulReadTotal=*(PULONG)&ucBuffer[sizeof(ucSignature) + sizeof(ULONG)]; +; Line 1151 + $I873: + *** 000c36 a1 0b 00 mov ax,WORD PTR $S775_?ucBuffer@?1??LoadImage@@9@9+11 + *** 000c39 8b 16 0d 00 mov dx,WORD PTR $S775_?ucBuffer@?1??LoadImage@@9@9+13 + *** 000c3d 89 46 d4 mov WORD PTR [bp-44],ax ;ulReadTotal + *** 000c40 89 56 d6 mov WORD PTR [bp-42],dx +;|*** +;|*** // Print Physical start and size +;|*** +;|*** if( bVerbose ) +; Line 1155 + *** 000c43 83 7e 04 00 cmp WORD PTR [bp+4],0 ;bVerbose + *** 000c47 74 13 je $I881 +;|*** { +;|*** printf( "Image physical start = 0x%8.8lX, size = %ld\n", +;|*** *(PULONG)&ucBuffer[sizeof(ucSignature)], +;|*** *(PULONG)&ucBuffer[sizeof(ucSignature) + sizeof(ULONG)]); +; Line 1159 + *** 000c49 52 push dx + *** 000c4a 50 push ax + *** 000c4b ff 36 09 00 push WORD PTR $S775_?ucBuffer@?1??LoadImage@@9@9+9 + *** 000c4f ff 36 07 00 push WORD PTR $S775_?ucBuffer@?1??LoadImage@@9@9+7 + *** 000c53 68 00 00 push OFFSET DGROUP:$SG882 + *** 000c56 e8 00 00 call _printf + *** 000c59 83 c4 0a add sp,10 ;000aH +;|*** } +;|*** +;|*** // Initialize the percent thingie. +;|*** +;|*** DrawPercent( (DWORD)-1, (DWORD)""); +; Line 1164 + $I881: + *** 000c5c 1e push ds + *** 000c5d 68 00 00 push OFFSET DGROUP:$SG883 + *** 000c60 6a ff push -1 ;ffffH + *** 000c62 6a ff push -1 ;ffffH + *** 000c64 e8 00 00 call _DrawPercent + *** 000c67 83 c4 08 add sp,8 +;|*** +;|*** // Copy file to upper memory in CHUNKSIZE chunks +;|*** +;|*** for(;;) +; Line 1168 + $FC885: +;|*** { +;|*** usAmountRead = DownloadRead(hImage, ucBuffer, 3 * sizeof(ULONG), bParallelDownload); +;|*** ulReadProgress+=12; +; Line 1171 + *** 000c6a 83 46 d0 0c add WORD PTR [bp-48],12 ;000cH ;ulReadProgress + *** 000c6e 83 56 d2 00 adc WORD PTR [bp-46],0 +;|*** +;|*** if( usAmountRead != 3 * sizeof(ULONG) ) +; Line 1173 + *** 000c72 ff 76 06 push WORD PTR [bp+6] ;bParallelDownload + *** 000c75 6a 0c push 12 ;000cH + *** 000c77 68 00 00 push OFFSET DGROUP:$S775_?ucBuffer@?1??LoadImage@@9@9 + *** 000c7a ff 76 fe push WORD PTR [bp-2] ;hImage + *** 000c7d e8 0c fa call DownloadRead + *** 000c80 83 c4 08 add sp,8 + *** 000c83 89 46 d8 mov WORD PTR [bp-40],ax ;usAmountRead + *** 000c86 3d 0c 00 cmp ax,12 ;000cH + *** 000c89 74 1d je $I887 +;|*** { +;|*** fprintf(stderr, "\r \r"); +; Line 1175 + *** 000c8b 68 00 00 push OFFSET DGROUP:$SG888 + *** 000c8e 68 10 00 push OFFSET __iob+16 + *** 000c91 e8 00 00 call _fprintf + *** 000c94 83 c4 04 add sp,4 +;|*** printf("Error reading header - %s\n", XmsErrorString(xmsError)); +; Line 1176 + *** 000c97 ff 76 f8 push WORD PTR [bp-8] ;xmsError + *** 000c9a e8 00 00 call _XmsErrorString + *** 000c9d 83 c4 02 add sp,2 + *** 000ca0 50 push ax + *** 000ca1 68 00 00 push OFFSET DGROUP:$SG889 + *** 000ca4 e9 7d fa jmp $L1022 + *** 000ca7 90 nop +;|*** if( !bParallelDownload && !bSerialDownload ) +;|*** _close(hImage); +;|*** +;|*** return FALSE; +;|*** } +;|*** +;|*** ulSectionAddress = *(PULONG)&ucBuffer[0]; +; Line 1183 + $I887: + *** 000ca8 a1 00 00 mov ax,WORD PTR $S775_?ucBuffer@?1??LoadImage@@9@9 + *** 000cab 8b 16 02 00 mov dx,WORD PTR $S775_?ucBuffer@?1??LoadImage@@9@9+2 + *** 000caf 89 46 ec mov WORD PTR [bp-20],ax ;ulSectionAddress + *** 000cb2 89 56 ee mov WORD PTR [bp-18],dx +;|*** ulSectionSize = *(PULONG)&ucBuffer[4]; +; Line 1184 + *** 000cb5 8b 0e 04 00 mov cx,WORD PTR $S775_?ucBuffer@?1??LoadImage@@9@9+4 + *** 000cb9 8b 1e 06 00 mov bx,WORD PTR $S775_?ucBuffer@?1??LoadImage@@9@9+6 + *** 000cbd 89 4e e8 mov WORD PTR [bp-24],cx ;ulSectionSize + *** 000cc0 89 5e ea mov WORD PTR [bp-22],bx +;|*** ulSectionChecksum = *(PULONG)&ucBuffer[8]; +; Line 1185 + *** 000cc3 8b 36 08 00 mov si,WORD PTR $S775_?ucBuffer@?1??LoadImage@@9@9+8 + *** 000cc7 8b 3e 0a 00 mov di,WORD PTR $S775_?ucBuffer@?1??LoadImage@@9@9+10 + *** 000ccb 89 76 e4 mov WORD PTR [bp-28],si ;ulSectionChecksum + *** 000cce 89 7e e6 mov WORD PTR [bp-26],di +;|*** +;|*** if( ulSectionAddress == 0 ) +; Line 1187 + *** 000cd1 0b d0 or dx,ax + *** 000cd3 75 0b jne $I891 +;|*** { +;|*** *pulEntryPoint = ulSectionSize; +; Line 1189 + *** 000cd5 8b 76 0a mov si,WORD PTR [bp+10] ;pulEntryPoint + *** 000cd8 89 0c mov WORD PTR [si],cx + *** 000cda 89 5c 02 mov WORD PTR [si+2],bx +;|*** +;|*** break; +; Line 1191 + *** 000cdd e9 a0 01 jmp $FB886 +;|*** } +;|*** +;|*** if( ulSectionAddress < ulLinearAddress || +; Line 1194 + $I891: +;|*** (ulSectionAddress + ulSectionSize) > +;|*** (ulLinearAddress + (ULONG)usLargestBlock * 1024) ) +; Line 1196 + *** 000ce0 8b 46 f0 mov ax,WORD PTR [bp-16] ;ulLinearAddress + *** 000ce3 8b 56 f2 mov dx,WORD PTR [bp-14] + *** 000ce6 39 56 ee cmp WORD PTR [bp-18],dx + *** 000ce9 72 36 jb $L993 + *** 000ceb 77 05 ja $L991 + *** 000ced 39 46 ec cmp WORD PTR [bp-20],ax ;ulSectionAddress + *** 000cf0 72 2f jb $L993 + $L991: + *** 000cf2 8b 46 f4 mov ax,WORD PTR [bp-12] ;usLargestBlock + *** 000cf5 2b d2 sub dx,dx + *** 000cf7 8a d4 mov dl,ah + *** 000cf9 8a e0 mov ah,al + *** 000cfb 2a c0 sub al,al + *** 000cfd 03 c0 add ax,ax + *** 000cff 13 d2 adc dx,dx + *** 000d01 03 c0 add ax,ax + *** 000d03 13 d2 adc dx,dx + *** 000d05 03 46 f0 add ax,WORD PTR [bp-16] ;ulLinearAddress + *** 000d08 13 56 f2 adc dx,WORD PTR [bp-14] + *** 000d0b 8b 4e e8 mov cx,WORD PTR [bp-24] ;ulSectionSize + *** 000d0e 8b 5e ea mov bx,WORD PTR [bp-22] + *** 000d11 03 4e ec add cx,WORD PTR [bp-20] ;ulSectionAddress + *** 000d14 13 5e ee adc bx,WORD PTR [bp-18] + *** 000d17 3b d3 cmp dx,bx + *** 000d19 77 45 ja $I892 + *** 000d1b 72 04 jb $L993 + *** 000d1d 3b c1 cmp ax,cx + *** 000d1f 73 3f jae $I892 + $L993: +;|*** { +;|*** fprintf(stderr, "\r \r"); +; Line 1198 + *** 000d21 68 00 00 push OFFSET DGROUP:$SG894 + *** 000d24 68 10 00 push OFFSET __iob+16 + *** 000d27 e8 00 00 call _fprintf + *** 000d2a 83 c4 04 add sp,4 +;|*** printf( +;|*** "Error image section doesn't fit in allocated block\n" +;|*** "Block allocated at 0x%lX, size = %ld\n" +;|*** "Section physical start = 0x%8.8lX, size = %ld\n" +;|*** "Memory too low in your VM might cause this.\n" +;|*** "\n" +;|*** ">> Increase memory may fix this.\n", +;|*** ulLinearAddress, (ULONG)usLargestBlock * 1024, +;|*** ulSectionAddress, ulSectionSize); +; Line 1207 + *** 000d2d ff 76 ea push WORD PTR [bp-22] + *** 000d30 ff 76 e8 push WORD PTR [bp-24] ;ulSectionSize + *** 000d33 ff 76 ee push WORD PTR [bp-18] + *** 000d36 ff 76 ec push WORD PTR [bp-20] ;ulSectionAddress + *** 000d39 8b 46 f4 mov ax,WORD PTR [bp-12] ;usLargestBlock + *** 000d3c 2b d2 sub dx,dx + *** 000d3e 8a d4 mov dl,ah + *** 000d40 8a e0 mov ah,al + *** 000d42 2a c0 sub al,al + *** 000d44 03 c0 add ax,ax + *** 000d46 13 d2 adc dx,dx + *** 000d48 03 c0 add ax,ax + *** 000d4a 13 d2 adc dx,dx + *** 000d4c 52 push dx + *** 000d4d 50 push ax + *** 000d4e ff 76 f2 push WORD PTR [bp-14] + *** 000d51 ff 76 f0 push WORD PTR [bp-16] ;ulLinearAddress + *** 000d54 68 00 00 push OFFSET DGROUP:$SG895 + *** 000d57 e8 00 00 call _printf + *** 000d5a 83 c4 12 add sp,18 ;0012H + *** 000d5d e9 ca f9 jmp $L1023 +;|*** +;|*** if( !bParallelDownload && !bSerialDownload ) +;|*** _close(hImage); +;|*** +;|*** return FALSE; +;|*** } +;|*** +;|*** if( bVerbose ) +; Line 1215 + $I892: + *** 000d60 83 7e 04 00 cmp WORD PTR [bp+4],0 ;bVerbose + *** 000d64 74 21 je $I897 +;|*** { +;|*** fprintf(stderr, "\r \r"); +; Line 1217 + *** 000d66 68 00 00 push OFFSET DGROUP:$SG898 + *** 000d69 68 10 00 push OFFSET __iob+16 + *** 000d6c e8 00 00 call _fprintf + *** 000d6f 83 c4 04 add sp,4 +;|*** printf( +;|*** "Section physical start = 0x%8.8lX, size = %ld\n", +;|*** ulSectionAddress, ulSectionSize); +; Line 1220 + *** 000d72 ff 76 ea push WORD PTR [bp-22] + *** 000d75 ff 76 e8 push WORD PTR [bp-24] ;ulSectionSize + *** 000d78 ff 76 ee push WORD PTR [bp-18] + *** 000d7b ff 76 ec push WORD PTR [bp-20] ;ulSectionAddress + *** 000d7e 68 00 00 push OFFSET DGROUP:$SG899 + *** 000d81 e8 00 00 call _printf + *** 000d84 83 c4 0a add sp,10 ;000aH +;|*** } +;|*** +;|*** ulChecksum = 0; +; Line 1223 + $I897: + *** 000d87 2b c0 sub ax,ax + *** 000d89 89 46 de mov WORD PTR [bp-34],ax + *** 000d8c 89 46 dc mov WORD PTR [bp-36],ax ;ulChecksum +;|*** +;|*** for( ulSectionOffset = 0; ulSectionOffset < ulSectionSize; ) +; Line 1225 + *** 000d8f 89 46 e2 mov WORD PTR [bp-30],ax + *** 000d92 89 46 e0 mov WORD PTR [bp-32],ax ;ulSectionOffset + $FC901: + *** 000d95 8b 46 e8 mov ax,WORD PTR [bp-24] ;ulSectionSize + *** 000d98 8b 56 ea mov dx,WORD PTR [bp-22] + *** 000d9b 39 56 e2 cmp WORD PTR [bp-30],dx + *** 000d9e 76 03 jbe $JCC3486 + *** 000da0 e9 c7 fe jmp $FC885 + $JCC3486: + *** 000da3 72 08 jb $L994 + *** 000da5 39 46 e0 cmp WORD PTR [bp-32],ax ;ulSectionOffset + *** 000da8 72 03 jb $JCC3496 + *** 000daa e9 bd fe jmp $FC885 + $JCC3496: + $L994: +;|*** { +;|*** if( (ulSectionSize - ulSectionOffset) < CHUNKSIZE ) +; Line 1227 + *** 000dad 2b 46 e0 sub ax,WORD PTR [bp-32] ;ulSectionOffset + *** 000db0 1b 56 e2 sbb dx,WORD PTR [bp-30] + *** 000db3 0b d2 or dx,dx + *** 000db5 75 11 jne $I903 + *** 000db7 3d 00 80 cmp ax,-32768 ;8000H + *** 000dba 73 0c jae $I903 +;|*** { +;|*** usReadSize = (USHORT)(ulSectionSize - ulSectionOffset); +; Line 1229 + *** 000dbc 8b 46 e8 mov ax,WORD PTR [bp-24] ;ulSectionSize + *** 000dbf 2b 46 e0 sub ax,WORD PTR [bp-32] ;ulSectionOffset + *** 000dc2 89 46 da mov WORD PTR [bp-38],ax ;usReadSize +;|*** } +;|*** else +; Line 1231 + *** 000dc5 eb 06 jmp SHORT $I904 + *** 000dc7 90 nop + $I903: +;|*** { +;|*** usReadSize = CHUNKSIZE; +; Line 1233 + *** 000dc8 c7 46 da 00 80 mov WORD PTR [bp-38],-32768 ;8000H ;usReadSize +;|*** } +; Line 1234 + $I904: +;|*** usAmountRead = DownloadRead(hImage, ucBuffer, usReadSize,bParallelDownload); +;|*** +;|*** if( usAmountRead != usReadSize ) +; Line 1237 + *** 000dcd ff 76 06 push WORD PTR [bp+6] ;bParallelDownload + *** 000dd0 ff 76 da push WORD PTR [bp-38] ;usReadSize + *** 000dd3 68 00 00 push OFFSET DGROUP:$S775_?ucBuffer@?1??LoadImage@@9@9 + *** 000dd6 ff 76 fe push WORD PTR [bp-2] ;hImage + *** 000dd9 e8 b0 f8 call DownloadRead + *** 000ddc 83 c4 08 add sp,8 + *** 000ddf 89 46 d8 mov WORD PTR [bp-40],ax ;usAmountRead + *** 000de2 3b 46 da cmp ax,WORD PTR [bp-38] ;usReadSize + *** 000de5 74 1d je $I905 +;|*** { +;|*** fprintf(stderr, "\r \r"); +; Line 1239 + *** 000de7 68 00 00 push OFFSET DGROUP:$SG906 + *** 000dea 68 10 00 push OFFSET __iob+16 + *** 000ded e8 00 00 call _fprintf + *** 000df0 83 c4 04 add sp,4 +;|*** printf("Error reading section - %s\n", XmsErrorString(xmsError)); +; Line 1240 + *** 000df3 ff 76 f8 push WORD PTR [bp-8] ;xmsError + *** 000df6 e8 00 00 call _XmsErrorString + *** 000df9 83 c4 02 add sp,2 + *** 000dfc 50 push ax + *** 000dfd 68 00 00 push OFFSET DGROUP:$SG907 + *** 000e00 e9 21 f9 jmp $L1022 + *** 000e03 90 nop +;|*** if( !bParallelDownload && !bSerialDownload ) +;|*** _close(hImage); +;|*** +;|*** return FALSE; +;|*** } +;|*** ulReadProgress+= usReadSize; +; Line 1246 + $I905: +;|*** DrawPercent(ulReadProgress, ulReadTotal); +; Line 1247 + *** 000e04 ff 76 d6 push WORD PTR [bp-42] + *** 000e07 ff 76 d4 push WORD PTR [bp-44] ;ulReadTotal + *** 000e0a 8b 46 da mov ax,WORD PTR [bp-38] ;usReadSize + *** 000e0d 2b d2 sub dx,dx + *** 000e0f 01 46 d0 add WORD PTR [bp-48],ax ;ulReadProgress + *** 000e12 11 56 d2 adc WORD PTR [bp-46],dx + *** 000e15 ff 76 d2 push WORD PTR [bp-46] + *** 000e18 ff 76 d0 push WORD PTR [bp-48] ;ulReadProgress + *** 000e1b e8 00 00 call _DrawPercent + *** 000e1e 83 c4 08 add sp,8 +;|*** +;|*** #if 0 +;|*** for( usIndex = 0; usIndex < usAmountRead; usIndex++ ) +;|*** { +;|*** ulChecksum += ucBuffer[usIndex]; +;|*** } +;|*** #endif +;|*** +;|*** #if 1 +;|*** xmsError = XmsMoveExtendedMemory( +;|*** 0, (ULONG)(UCHAR far *)ucBuffer, +;|*** usBlockHandle, ulSectionAddress - ulLinearAddress + ulSectionOffset, +;|*** (usAmountRead + 1) & ~1U); +;|*** +;|*** if( xmsError != XMS_SUCCESS ) +; Line 1262 + *** 000e21 8b 46 d8 mov ax,WORD PTR [bp-40] ;usAmountRead + *** 000e24 40 inc ax + *** 000e25 24 fe and al,254 ;00feH + *** 000e27 6a 00 push 0 + *** 000e29 50 push ax + *** 000e2a 8b 46 e0 mov ax,WORD PTR [bp-32] ;ulSectionOffset + *** 000e2d 8b 56 e2 mov dx,WORD PTR [bp-30] + *** 000e30 2b 46 f0 sub ax,WORD PTR [bp-16] ;ulLinearAddress + *** 000e33 1b 56 f2 sbb dx,WORD PTR [bp-14] + *** 000e36 03 46 ec add ax,WORD PTR [bp-20] ;ulSectionAddress + *** 000e39 13 56 ee adc dx,WORD PTR [bp-18] + *** 000e3c 52 push dx + *** 000e3d 50 push ax + *** 000e3e ff 36 00 00 push WORD PTR _usBlockHandle + *** 000e42 1e push ds + *** 000e43 68 00 00 push OFFSET DGROUP:$S775_?ucBuffer@?1??LoadImage@@9@9 + *** 000e46 6a 00 push 0 + *** 000e48 e8 00 00 call _XmsMoveExtendedMemory + *** 000e4b 83 c4 10 add sp,16 ;0010H + *** 000e4e 89 46 f8 mov WORD PTR [bp-8],ax ;xmsError + *** 000e51 0b c0 or ax,ax + *** 000e53 74 1d je $I909 +;|*** { +;|*** fprintf(stderr, "\r \r"); +; Line 1264 + *** 000e55 68 00 00 push OFFSET DGROUP:$SG910 + *** 000e58 68 10 00 push OFFSET __iob+16 + *** 000e5b e8 00 00 call _fprintf + *** 000e5e 83 c4 04 add sp,4 +;|*** printf("Error moving extended memory - %s\n", XmsErrorString(xmsError)); +; Line 1265 + *** 000e61 ff 76 f8 push WORD PTR [bp-8] ;xmsError + *** 000e64 e8 00 00 call _XmsErrorString + *** 000e67 83 c4 02 add sp,2 + *** 000e6a 50 push ax + *** 000e6b 68 00 00 push OFFSET DGROUP:$SG911 + *** 000e6e e9 b3 f8 jmp $L1022 + *** 000e71 90 nop +;|*** if( !bParallelDownload && !bSerialDownload ) +;|*** _close(hImage); +;|*** +;|*** return FALSE; +;|*** } +;|*** #endif +;|*** ulSectionOffset += usAmountRead; +; Line 1272 + $I909: + *** 000e72 8b 46 d8 mov ax,WORD PTR [bp-40] ;usAmountRead + *** 000e75 2b d2 sub dx,dx + *** 000e77 01 46 e0 add WORD PTR [bp-32],ax ;ulSectionOffset + *** 000e7a 11 56 e2 adc WORD PTR [bp-30],dx +;|*** } +; Line 1273 + *** 000e7d e9 15 ff jmp $FC901 + $FB886: +;|*** #if 0 +;|*** if( ulChecksum != ulSectionChecksum ) +;|*** { +;|*** fprintf(stderr, "\r \r"); +;|*** printf( +;|*** "Bad checksum 0x%8.8lX, expected 0x%8.8lX\n", +;|*** ulChecksum, ulSectionChecksum); +;|*** +;|*** if( !bParallelDownload && !bSerialDownload ) +;|*** _close(hImage); +;|*** +;|*** return FALSE; +;|*** } +;|*** #endif +;|*** } +;|*** +;|*** DrawPercent(ulReadTotal, ulReadTotal); +; Line 1290 + *** 000e80 ff 76 d6 push WORD PTR [bp-42] + *** 000e83 ff 76 d4 push WORD PTR [bp-44] ;ulReadTotal + *** 000e86 ff 76 d6 push WORD PTR [bp-42] + *** 000e89 ff 76 d4 push WORD PTR [bp-44] ;ulReadTotal + *** 000e8c e8 00 00 call _DrawPercent + *** 000e8f 83 c4 08 add sp,8 +;|*** +;|*** if( !bParallelDownload && !bSerialDownload ) +; Line 1292 + *** 000e92 83 7e 06 00 cmp WORD PTR [bp+6],0 ;bParallelDownload + *** 000e96 75 10 jne $I913 + *** 000e98 83 3e 00 00 00 cmp WORD PTR _bSerialDownload,0 + *** 000e9d 75 09 jne $I913 +;|*** { +;|*** _close(hImage); +; Line 1294 + *** 000e9f ff 76 fe push WORD PTR [bp-2] ;hImage + *** 000ea2 e8 00 00 call __close + *** 000ea5 83 c4 02 add sp,2 +;|*** } +;|*** +;|*** // Stop the floppy motor in case it contained the image file +;|*** +;|*** __asm +; Line 1299 + $I913: +;|*** { +;|*** push dx +; Line 1301 + *** 000ea8 52 push dx +;|*** mov dx, 03F2h ; Floppy motor and DMA control +; Line 1302 + *** 000ea9 ba f2 03 mov dx,1010 ;03f2H +;|*** in al, dx +; Line 1303 + *** 000eac ec in al,dx +;|*** and al, 00Fh ; Clear motor on bits +; Line 1304 + *** 000ead 24 0f and al,15 ;000fH +;|*** out dx, al +; Line 1305 + *** 000eaf ee out dx, al + +;|*** pop dx +; Line 1306 + *** 000eb0 5a pop dx +;|*** } +; Line 1307 +;|*** fprintf(stderr, "\r \r"); +; Line 1308 + *** 000eb1 68 00 00 push OFFSET DGROUP:$SG914 + *** 000eb4 68 10 00 push OFFSET __iob+16 + *** 000eb7 e8 00 00 call _fprintf + *** 000eba 83 c4 04 add sp,4 +;|*** +;|*** // Indicate success +;|*** +;|*** return( TRUE ); +; Line 1312 + *** 000ebd b8 01 00 mov ax,1 +;|*** } +; Line 1313 + *** 000ec0 5e pop si + *** 000ec1 5f pop di + *** 000ec2 c9 leave + *** 000ec3 c3 ret + +LoadImage ENDP + +GetPCIConfigMechanism PROC NEAR +;|*** +;|*** //------------------------------------------------------------------------------ +;|*** // +;|*** // Function Name: GetPCIConfigMechanism() +;|*** // Description..: Execute trap to obtain PCI configuration Mechanism. +;|*** // Inputs.......: none +;|*** // Outputs......: UCHAR 0 indicates no PCI bus, else PCI configuration mech. +;|*** // +;|*** //------------------------------------------------------------------------------ +;|*** +;|*** static UCHAR GetPCIConfigMechanism() +;|*** { +; Line 1325 + *** 000ec4 c8 08 00 00 enter 8,0 +; ucPCIVersionMajor = -2 +; ucPCIVersionMinor = -4 +; ucPCIBus = -6 +; ucPCIConfigMech = -8 +;|*** UCHAR ucPCIVersionMajor; +;|*** UCHAR ucPCIVersionMinor; +;|*** UCHAR ucPCIBus; +;|*** UCHAR ucPCIConfigMech; +;|*** +;|*** __asm +;|*** { +;|*** mov ax, 0xB101 +; Line 1333 + *** 000ec8 b8 01 b1 mov ax,-20223 ;b101H +;|*** int 0x1A +; Line 1334 + *** 000ecb cd 1a int 26 ;001aH +;|*** +;|*** jc noPCI +; Line 1336 + *** 000ecd 72 23 jb $noPCI920 +;|*** +;|*** cmp dx, 0x4350 ; 'CP' +; Line 1338 + *** 000ecf 81 fa 50 43 cmp dx,17232 ;4350H +;|*** +;|*** jne noPCI +; Line 1340 + *** 000ed3 75 1d jne $noPCI920 +;|*** +;|*** or ah, ah +; Line 1342 + *** 000ed5 0a e4 or ah,ah +;|*** jnz noPCI +; Line 1343 + *** 000ed7 75 19 jne $noPCI920 +;|*** +;|*** mov ucPCIVersionMajor, bh +; Line 1345 + *** 000ed9 88 7e fe mov BYTE PTR [bp-2],bh ;ucPCIVersionMajor +;|*** mov ucPCIVersionMinor, bl +; Line 1346 + *** 000edc 88 5e fc mov BYTE PTR [bp-4],bl ;ucPCIVersionMinor +;|*** mov ucPCIBus, cl +; Line 1347 + *** 000edf 88 4e fa mov BYTE PTR [bp-6],cl ;ucPCIBus +;|*** +;|*** and al, 0x03 +; Line 1349 + *** 000ee2 24 03 and al,3 +;|*** mov ucPCIConfigMech, al +; Line 1350 + *** 000ee4 88 46 f8 mov BYTE PTR [bp-8],al ;ucPCIConfigMech +;|*** } +; Line 1351 +;|*** +;|*** // Indicate PCI bus info +;|*** +;|*** /*printf( "%d PCI bus%s (Version %X.%2.2X) using Configuration Mechanism # %d\n", +;|*** ucPCIBus + 1, ucPCIBus == 0 ? "" : "ses", +;|*** ucPCIVersionMajor, ucPCIVersionMinor, ucPCIConfigMech);*/ +;|*** +;|*** +;|*** // Indicate Configuration mechanism +;|*** +;|*** return( UCHAR)((ucPCIBus << 2) | ucPCIConfigMech ); +; Line 1362 + *** 000ee7 8a 46 fa mov al,BYTE PTR [bp-6] ;ucPCIBus + *** 000eea c0 e0 02 shl al,2 + *** 000eed 0a 46 f8 or al,BYTE PTR [bp-8] ;ucPCIConfigMech + *** 000ef0 c9 leave + *** 000ef1 c3 ret +;|*** +;|*** // Indicate no PCI bus +;|*** +;|*** noPCI: printf( "PCI bus not detected\n" ); +; Line 1366 + $noPCI920: + *** 000ef2 68 00 00 push OFFSET DGROUP:$SG921 + *** 000ef5 e8 00 00 call _printf +;|*** return( 0 ); +; Line 1367 + *** 000ef8 32 c0 xor al,al +;|*** } +; Line 1368 + *** 000efa c9 leave + *** 000efb c3 ret + +GetPCIConfigMechanism ENDP + +GetJumpFlags PROC NEAR +;|*** +;|*** //------------------------------------------------------------------------------ +;|*** // +;|*** // Type Name..: JUMP_PACKET +;|*** // Description: Defines the JUMP_PACKET type. Type is byte aligned. +;|*** // +;|*** //------------------------------------------------------------------------------ +;|*** +;|*** #pragma pack(1) +;|*** +;|*** typedef struct JUMP_PACKET +;|*** { +;|*** UCHAR Header[BOOT_HEADER_SIZE]; +;|*** WORD wLen; +;|*** DWORD dwTransport; +;|*** UCHAR ucChkSum; +;|*** UCHAR Tail[BOOT_TAIL_SIZE]; +;|*** } +;|*** JUMP_PACKET, *PJUMP_PACKET; +;|*** +;|*** #pragma pack() +;|*** +;|*** +;|*** //------------------------------------------------------------------------------ +;|*** // +;|*** // Function Name: GetJumpFlags(void) +;|*** // Description..: This function validates the JUMP_PACKET and if valid +;|*** // indicates the transport parameter. +;|*** // Inputs.......: none +;|*** // Outputs......: 0 indicates JUMP_PACKET failure, else Transport parameter +;|*** // +;|*** //------------------------------------------------------------------------------ +;|*** +;|*** static WORD GetJumpFlags(void) +;|*** { +; Line 1403 + *** 000efc c8 12 00 00 enter 18,0 + *** 000f00 57 push di + *** 000f01 56 push si +; Packet = -18 +; usRead = -20 +; register si = pData +; CheckSum = -1 +; i = -26 +;|*** JUMP_PACKET Packet; +;|*** USHORT usRead; +;|*** UCHAR *pData; +;|*** UCHAR CheckSum; +;|*** int i; +;|*** +;|*** usRead = DownloadRead( 0, (UCHAR *)&Packet, sizeof(Packet), TRUE ); +;|*** +;|*** // check read size +;|*** +;|*** if( usRead != sizeof(Packet) ) +; Line 1414 + *** 000f02 6a 01 push 1 + *** 000f04 6a 11 push 17 ;0011H + *** 000f06 8d 46 ee lea ax,WORD PTR [bp-18] ;Packet + *** 000f09 50 push ax + *** 000f0a 6a 00 push 0 + *** 000f0c e8 7d f7 call DownloadRead + *** 000f0f 83 c4 08 add sp,8 + *** 000f12 3d 11 00 cmp ax,17 ;0011H + *** 000f15 74 07 je $I931 +;|*** { +;|*** printf( "Read Packet Failed\n" ); +; Line 1416 + *** 000f17 68 00 00 push OFFSET DGROUP:$SG932 + *** 000f1a e9 80 00 jmp $L1029 + *** 000f1d 90 nop +;|*** return 0; // KTS_DEFAULT +;|*** } +;|*** +;|*** // check header/tail valid +;|*** +;|*** if( (memcmp(Packet.Header, BootHeader, 4) != 0) || +; Line 1422 + $I931: +;|*** (memcmp(Packet.Tail, BootTail, 4) != 0) ) +; Line 1423 + *** 000f1e b8 00 00 mov ax,OFFSET DGROUP:$S519_BootHeader + *** 000f21 b9 04 00 mov cx,4 + *** 000f24 8b f8 mov di,ax + *** 000f26 8d 76 ee lea si,WORD PTR [bp-18] ;Packet + *** 000f29 1e push ds + *** 000f2a 07 pop es + *** 000f2b d1 e9 shr cx,1 + *** 000f2d 1b c0 sbb ax,ax + *** 000f2f 3b c9 cmp cx,cx + *** 000f31 f3 repz + *** 000f32 a7 cmpsw + *** 000f33 75 65 jne $I934 + *** 000f35 2b c8 sub cx,ax + *** 000f37 f3 repz + *** 000f38 a6 cmpsb + *** 000f39 75 5f jne $I934 + *** 000f3b b8 00 00 mov ax,OFFSET DGROUP:$S520_BootTail + *** 000f3e b9 04 00 mov cx,4 + *** 000f41 8b f8 mov di,ax + *** 000f43 8d 76 fb lea si,WORD PTR [bp-5] + *** 000f46 d1 e9 shr cx,1 + *** 000f48 1b c0 sbb ax,ax + *** 000f4a 3b c9 cmp cx,cx + *** 000f4c f3 repz + *** 000f4d a7 cmpsw + *** 000f4e 75 4a jne $I934 + *** 000f50 2b c8 sub cx,ax + *** 000f52 f3 repz + *** 000f53 a6 cmpsb + *** 000f54 75 44 jne $I934 +;|*** { +;|*** printf( "Read Header/Tail failed\n"); +;|*** return 0; +;|*** } +;|*** +;|*** // check command +;|*** +;|*** if( Packet.Header[4] != 0x00 || Packet.Header[5] != 0x00 ) +; Line 1431 + *** 000f56 80 7e f2 00 cmp BYTE PTR [bp-14],0 + *** 000f5a 75 38 jne $I937 + *** 000f5c 80 7e f3 00 cmp BYTE PTR [bp-13],0 + *** 000f60 75 32 jne $I937 +;|*** { +;|*** printf("Invalid Command\n"); +;|*** return 0; +;|*** } +;|*** +;|*** // check wlen +;|*** +;|*** if( Packet.wLen != 9 ) +; Line 1439 + *** 000f62 83 7e f4 09 cmp WORD PTR [bp-12],9 + *** 000f66 74 06 je $I939 +;|*** { +;|*** printf("Invalid Length\n"); +; Line 1441 + *** 000f68 68 00 00 push OFFSET DGROUP:$SG940 + *** 000f6b eb 30 jmp SHORT $L1029 + *** 000f6d 90 nop +;|*** return 0; +;|*** } +;|*** +;|*** // check checksum +;|*** +;|*** CheckSum = 0; +; Line 1447 + $I939: + *** 000f6e c6 46 ff 00 mov BYTE PTR [bp-1],0 ;CheckSum +;|*** +;|*** for( i=0, pData = (UCHAR *)&Packet.dwTransport; i < sizeof(Packet.dwTransport); i++, pData++ ) +; Line 1449 + *** 000f72 8d 76 f6 lea si,WORD PTR [bp-10] + *** 000f75 ba 04 00 mov dx,4 + $F941: +;|*** { +;|*** CheckSum += *pData; +; Line 1451 + *** 000f78 ac lodsb + *** 000f79 00 46 ff add BYTE PTR [bp-1],al ;CheckSum + *** 000f7c 4a dec dx + *** 000f7d 75 f9 jne $F941 +;|*** } +;|*** +;|*** if( CheckSum != Packet.ucChkSum ) +; Line 1454 + *** 000f7f 8a 46 fa mov al,BYTE PTR [bp-6] + *** 000f82 38 46 ff cmp BYTE PTR [bp-1],al ;CheckSum + *** 000f85 74 05 je $I944 +;|*** { +;|*** printf("Invalid checksum\n"); +; Line 1456 + *** 000f87 68 00 00 push OFFSET DGROUP:$SG945 + *** 000f8a eb 11 jmp SHORT $L1029 +;|*** return 0; +;|*** } +;|*** +;|*** // Packet is valid - indicate Transport +;|*** +;|*** return( (WORD)Packet.dwTransport ); +; Line 1462 + $I944: + *** 000f8c 8b 46 f6 mov ax,WORD PTR [bp-10] + *** 000f8f 5e pop si + *** 000f90 5f pop di + *** 000f91 c9 leave + *** 000f92 c3 ret + *** 000f93 90 nop +;|*** if( Packet.Header[4] != 0x00 || Packet.Header[5] != 0x00 ) +; Line 1431 + $I937: +;|*** { +;|*** printf("Invalid Command\n"); +; Line 1433 + *** 000f94 68 00 00 push OFFSET DGROUP:$SG938 + *** 000f97 eb 04 jmp SHORT $L1029 + *** 000f99 90 nop +;|*** (memcmp(Packet.Tail, BootTail, 4) != 0) ) +; Line 1423 + $I934: +;|*** { +;|*** printf( "Read Header/Tail failed\n"); +; Line 1425 + *** 000f9a 68 00 00 push OFFSET DGROUP:$SG935 + $L1029: + *** 000f9d e8 00 00 call _printf + *** 000fa0 83 c4 02 add sp,2 +;|*** return 0; +; Line 1426 + *** 000fa3 33 c0 xor ax,ax +;|*** } +;|*** +;|*** // check command +;|*** +;|*** if( Packet.Header[4] != 0x00 || Packet.Header[5] != 0x00 ) +;|*** { +;|*** printf("Invalid Command\n"); +;|*** return 0; +;|*** } +;|*** +;|*** // check wlen +;|*** +;|*** if( Packet.wLen != 9 ) +;|*** { +;|*** printf("Invalid Length\n"); +;|*** return 0; +;|*** } +;|*** +;|*** // check checksum +;|*** +;|*** CheckSum = 0; +;|*** +;|*** for( i=0, pData = (UCHAR *)&Packet.dwTransport; i < sizeof(Packet.dwTransport); i++, pData++ ) +;|*** { +;|*** CheckSum += *pData; +;|*** } +;|*** +;|*** if( CheckSum != Packet.ucChkSum ) +;|*** { +;|*** printf("Invalid checksum\n"); +;|*** return 0; +;|*** } +;|*** +;|*** // Packet is valid - indicate Transport +;|*** +;|*** return( (WORD)Packet.dwTransport ); +;|*** } +; Line 1463 + *** 000fa5 5e pop si + *** 000fa6 5f pop di + *** 000fa7 c9 leave + *** 000fa8 c3 ret + *** 000fa9 90 nop + +GetJumpFlags ENDP + +DisplayCEOSVersion PROC NEAR +;|*** +;|*** +;|*** //------------------------------------------------------------------------------ +;|*** // +;|*** // Function Name: DisplayCEOSVersion(void) +;|*** // Description..: This function searches through the Image binary (e.g. eboot.bin) looking for +;|*** // a Windows CE Version number, delimited by a unique string--> "$@( VER $@(" +;|*** // Inputs.......: char *pszFileName, denotes the image being loaded by LoadImage +;|*** // Outputs......: none, simply prints debug info to the user +;|*** // +;|*** //------------------------------------------------------------------------------ +;|*** +;|*** static void DisplayCEOSVersion(char *pszFileName) +;|*** { +; Line 1477 + *** 000faa c8 10 00 00 enter 16,0 + *** 000fae 57 push di + *** 000faf 56 push si +; pszFileName = 4 +; delim = -16 +; register si = delim_ptr +; delim_end = -2 +; align32bit = -10 +; lImageFile = -4 +; ver_lo = -10 +; ver_hi = -12 +; done = -6 +; iterations = -8 +; cnt = -22 +;|*** +;|*** #define DELIM_LEN 3 +;|*** +;|*** char delim[] = "$@("; // To change delimiter, modify delim & DELIM_LEN! +; Line 1481 + *** 000fb0 a1 00 00 mov ax,WORD PTR $SG950 + *** 000fb3 8b 16 02 00 mov dx,WORD PTR $SG950+2 + *** 000fb7 89 46 f0 mov WORD PTR [bp-16],ax ;delim + *** 000fba 89 56 f2 mov WORD PTR [bp-14],dx +;|*** char *delim_ptr = delim; +; Line 1482 + *** 000fbd 8d 76 f0 lea si,WORD PTR [bp-16] ;delim +;|*** char *delim_end = delim + DELIM_LEN; +; Line 1483 + *** 000fc0 8d 46 f3 lea ax,WORD PTR [bp-13] + *** 000fc3 89 46 fe mov WORD PTR [bp-2],ax ;delim_end +;|*** int align32bit = 4 - ( DELIM_LEN % 4 ); +;|*** +;|*** FILE *lImageFile = NULL; +;|*** int ver_lo,ver_hi; +;|*** int done = 0; // Loop exit condition, done = 1 denotes version found +;|*** int iterations = 0; // Used to limit search length +; Line 1489 + *** 000fc6 33 c0 xor ax,ax + *** 000fc8 89 46 fa mov WORD PTR [bp-6],ax ;done + *** 000fcb 89 46 f8 mov WORD PTR [bp-8],ax ;iterations +;|*** int cnt; +;|*** +;|*** lImageFile = fopen( pszFileName, "rb" ); +;|*** +;|*** // Algorithm to search through image for 'delim' (version) 'delim' +;|*** // If successful, sets done = 1. +;|*** if( lImageFile ) { +; Line 1496 + *** 000fce 68 00 00 push OFFSET DGROUP:$SG960 + *** 000fd1 ff 76 04 push WORD PTR [bp+4] ;pszFileName + *** 000fd4 e8 00 00 call _fopen + *** 000fd7 83 c4 04 add sp,4 + *** 000fda 89 46 fc mov WORD PTR [bp-4],ax ;lImageFile + *** 000fdd 0b c0 or ax,ax + *** 000fdf 75 03 jne $JCC4063 + *** 000fe1 e9 b8 00 jmp $I961 + $JCC4063: +;|*** +;|*** while( !feof(lImageFile) && !done && (iterations++ < 512) ) { +; Line 1498 + *** 000fe4 8b d8 mov bx,ax + *** 000fe6 f6 47 06 10 test BYTE PTR [bx+6],16 ;0010H + *** 000fea 74 03 je $JCC4074 + *** 000fec e9 a4 00 jmp $FB964 + $JCC4074: + $FC963: + *** 000fef 83 7e fa 00 cmp WORD PTR [bp-6],0 ;done + *** 000ff3 74 03 je $JCC4083 + *** 000ff5 e9 9b 00 jmp $FB964 + $JCC4083: + *** 000ff8 8b 46 f8 mov ax,WORD PTR [bp-8] ;iterations + *** 000ffb ff 46 f8 inc WORD PTR [bp-8] ;iterations + *** 000ffe 3d 00 02 cmp ax,512 ;0200H + *** 001001 7c 03 jl $JCC4097 + *** 001003 e9 8d 00 jmp $FB964 + $JCC4097: +;|*** +;|*** if( fgetc(lImageFile) == *delim_ptr ) { +; Line 1500 + *** 001006 53 push bx + *** 001007 e8 00 00 call _fgetc + *** 00100a 83 c4 02 add sp,2 + *** 00100d 8b c8 mov cx,ax + *** 00100f 8a 04 mov al,BYTE PTR [si] + *** 001011 98 cbw + *** 001012 3b c8 cmp cx,ax + *** 001014 75 04 jne $I965 +;|*** delim_ptr++; +; Line 1501 + *** 001016 46 inc si +;|*** } else { +; Line 1502 + *** 001017 eb 04 jmp SHORT $I966 + *** 001019 90 nop + $I965: +;|*** delim_ptr = delim; +; Line 1503 + *** 00101a 8d 76 f0 lea si,WORD PTR [bp-16] ;delim +;|*** } +; Line 1504 + $I966: +;|*** +;|*** if( delim_ptr == delim_end ) { +; Line 1506 + *** 00101d 8d 46 f3 lea ax,WORD PTR [bp-13] + *** 001020 3b f0 cmp si,ax + *** 001022 75 63 jne $L1003 +;|*** +;|*** // Initial delimiter string found, collect data: +;|*** fseek(lImageFile, align32bit, SEEK_CUR); // next 32-bit boundary +; Line 1509 + *** 001024 6a 01 push 1 + *** 001026 6a 00 push 0 + *** 001028 6a 01 push 1 + *** 00102a ff 76 fc push WORD PTR [bp-4] ;lImageFile + *** 00102d e8 00 00 call _fseek + *** 001030 83 c4 08 add sp,8 +;|*** ver_lo = fgetc(lImageFile); // Get two bytes (in a DWORD) +; Line 1510 + *** 001033 ff 76 fc push WORD PTR [bp-4] ;lImageFile + *** 001036 e8 00 00 call _fgetc + *** 001039 83 c4 02 add sp,2 + *** 00103c 89 46 f6 mov WORD PTR [bp-10],ax ;align32bit +;|*** ver_hi = fgetc(lImageFile); +; Line 1511 + *** 00103f ff 76 fc push WORD PTR [bp-4] ;lImageFile + *** 001042 e8 00 00 call _fgetc + *** 001045 83 c4 02 add sp,2 + *** 001048 89 46 f4 mov WORD PTR [bp-12],ax ;ver_hi +;|*** fseek(lImageFile, 2, SEEK_CUR); // Skip two bytes to next 32-bit boundary +; Line 1512 + *** 00104b 6a 01 push 1 + *** 00104d 6a 00 push 0 + *** 00104f 6a 02 push 2 + *** 001051 ff 76 fc push WORD PTR [bp-4] ;lImageFile + *** 001054 e8 00 00 call _fseek + *** 001057 83 c4 08 add sp,8 +;|*** +;|*** delim_ptr = delim; +; Line 1514 + *** 00105a 8d 76 f0 lea si,WORD PTR [bp-16] ;delim + *** 00105d c7 46 fe 03 00 mov WORD PTR [bp-2],3 ;delim_end +;|*** { +; Line 1477 + *** 001062 8b 7e fe mov di,WORD PTR [bp-2] ;delim_end +;|*** +;|*** #define DELIM_LEN 3 +;|*** +;|*** char delim[] = "$@("; // To change delimiter, modify delim & DELIM_LEN! +;|*** char *delim_ptr = delim; +;|*** char *delim_end = delim + DELIM_LEN; +;|*** int align32bit = 4 - ( DELIM_LEN % 4 ); +;|*** +;|*** FILE *lImageFile = NULL; +;|*** int ver_lo,ver_hi; +;|*** int done = 0; // Loop exit condition, done = 1 denotes version found +;|*** int iterations = 0; // Used to limit search length +;|*** int cnt; +;|*** +;|*** lImageFile = fopen( pszFileName, "rb" ); +;|*** +;|*** // Algorithm to search through image for 'delim' (version) 'delim' +;|*** // If successful, sets done = 1. +;|*** if( lImageFile ) { +;|*** +;|*** while( !feof(lImageFile) && !done && (iterations++ < 512) ) { +;|*** +;|*** if( fgetc(lImageFile) == *delim_ptr ) { +;|*** delim_ptr++; +;|*** } else { +;|*** delim_ptr = delim; +;|*** } +;|*** +;|*** if( delim_ptr == delim_end ) { +;|*** +;|*** // Initial delimiter string found, collect data: +;|*** fseek(lImageFile, align32bit, SEEK_CUR); // next 32-bit boundary +;|*** ver_lo = fgetc(lImageFile); // Get two bytes (in a DWORD) +;|*** ver_hi = fgetc(lImageFile); +;|*** fseek(lImageFile, 2, SEEK_CUR); // Skip two bytes to next 32-bit boundary +;|*** +;|*** delim_ptr = delim; +;|*** +;|*** for( cnt=0; cnt < DELIM_LEN; cnt++) { +; Line 1516 + $F968: +;|*** if( fgetc(lImageFile) == *delim_ptr ) { +; Line 1517 + *** 001065 ff 76 fc push WORD PTR [bp-4] ;lImageFile + *** 001068 e8 00 00 call _fgetc + *** 00106b 83 c4 02 add sp,2 + *** 00106e 8b c8 mov cx,ax + *** 001070 8a 04 mov al,BYTE PTR [si] + *** 001072 98 cbw + *** 001073 3b c8 cmp cx,ax + *** 001075 75 01 jne $FC969 +;|*** delim_ptr++; +; Line 1518 + *** 001077 46 inc si +;|*** for( cnt=0; cnt < DELIM_LEN; cnt++) { +; Line 1516 + $FC969: + *** 001078 4f dec di + *** 001079 75 ea jne $F968 +;|*** if( fgetc(lImageFile) == *delim_ptr ) { +;|*** delim_ptr++; +;|*** } +;|*** } +;|*** +;|*** if( delim_ptr == delim_end ) { +; Line 1522 + *** 00107b 8d 46 f3 lea ax,WORD PTR [bp-13] + *** 00107e 3b f0 cmp si,ax + *** 001080 75 05 jne $L1003 +;|*** done = 1; +; Line 1523 + *** 001082 c7 46 fa 01 00 mov WORD PTR [bp-6],1 ;done + $L1003: +;|*** } +;|*** } +;|*** } +; Line 1526 + *** 001087 8b 5e fc mov bx,WORD PTR [bp-4] ;lImageFile + *** 00108a f6 47 06 10 test BYTE PTR [bx+6],16 ;0010H + *** 00108e 75 03 jne $JCC4238 + *** 001090 e9 5c ff jmp $FC963 + $JCC4238: + $FB964: +;|*** +;|*** fclose( lImageFile ); +; Line 1528 + *** 001093 ff 76 fc push WORD PTR [bp-4] ;lImageFile + *** 001096 e8 00 00 call _fclose + *** 001099 83 c4 02 add sp,2 +;|*** } +;|*** +;|*** if (done) { +; Line 1531 + $I961: + *** 00109c 83 7e fa 00 cmp WORD PTR [bp-6],0 ;done + *** 0010a0 74 1a je $I973 +;|*** printf("Booting %s compiled with Windows CE Version %d\n", pszFileName, (ver_lo | (ver_hi << 8)) ); +; Line 1532 + *** 0010a2 8a 66 f4 mov ah,BYTE PTR [bp-12] ;ver_hi + *** 0010a5 2a c0 sub al,al + *** 0010a7 0b 46 f6 or ax,WORD PTR [bp-10] ;align32bit + *** 0010aa 50 push ax + *** 0010ab ff 76 04 push WORD PTR [bp+4] ;pszFileName + *** 0010ae 68 00 00 push OFFSET DGROUP:$SG974 + *** 0010b1 e8 00 00 call _printf + *** 0010b4 83 c4 06 add sp,6 +;|*** } else { +; Line 1533 + *** 0010b7 5e pop si + *** 0010b8 5f pop di + *** 0010b9 c9 leave + *** 0010ba c3 ret + *** 0010bb 90 nop + $I973: +;|*** printf("%s: Unknown or old version of bootloader\n", pszFileName); +; Line 1534 + *** 0010bc ff 76 04 push WORD PTR [bp+4] ;pszFileName + *** 0010bf 68 00 00 push OFFSET DGROUP:$SG976 + *** 0010c2 e8 00 00 call _printf + *** 0010c5 83 c4 04 add sp,4 +;|*** } +;|*** +;|*** }; Line 1537 + *** 0010c8 5e pop si + *** 0010c9 5f pop di + *** 0010ca c9 leave + *** 0010cb c3 ret + +DisplayCEOSVersion ENDP +_TEXT ENDS +END diff --git a/DOS/LOADCEPC/main.obj b/DOS/LOADCEPC/main.obj new file mode 100644 index 0000000000000000000000000000000000000000..ef47524bf7fe59779e9c9acc9725f6c2f63c6dd2 GIT binary patch literal 19864 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 GANZfEPKId! literal 0 HcmV?d00001 diff --git a/DOS/LOADCEPC/mdppfs.c b/DOS/LOADCEPC/mdppfs.c new file mode 100644 index 0000000..2bdbe6b --- /dev/null +++ b/DOS/LOADCEPC/mdppfs.c @@ -0,0 +1,500 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// +// Use of this sample source code is subject to the terms of the Microsoft +// license agreement under which you licensed this sample source code. If +// you did not accept the terms of the license agreement, you are not +// authorized to use this sample source code. For the terms of the license, +// please see the license agreement between you and Microsoft or, if applicable, +// see the LICENSE.RTF on your install media or the root of your tools installation. +// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +// +/*++ +THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +PARTICULAR PURPOSE. + +Module Name: + + mdppfs.c + +Abstract: + + This file implements the NK kernel ppfs client side interface + +Notes: + +--*/ + +#include "windows.h" +#include "wdm.h" +#include "pc.h" + +#define PAR_PORT_BASE 0x0378 +#define PAR_PORT_DATA 0 +#define PAR_PORT_STAT 1 +#define PAR_PORT_CTRL 2 + +#define PAR_STAT_NBUSY 0x80 +#define PAR_STAT_NACK 0x40 +#define PAR_STAT_PE 0x20 +#define PAR_STAT_SLCT 0x10 +#define PAR_STAT_NERR 0x08 // This isn't connected + +#define PAR_CTRL_READ 0x20 +#define PAR_CTRL_IRQE 0x10 +#define PAR_CTRL_SLCT_IN 0x08 +#define PAR_CTRL_NINIT 0x04 +#define PAR_CTRL_AUTOFEED 0x02 +#define PAR_CTRL_STROBE 0x01 + +#define STATUS_IS_DISCONNECTED(a) \ + ((((a) & (PAR_STAT_PE | PAR_STAT_SLCT)) != PAR_STAT_SLCT) || \ + (((a) & (PAR_STAT_NBUSY | PAR_STAT_NACK)) == PAR_STAT_NACK)) + +//#define STATUS_IS_DISCONNECTED(a) (!((a) & PAR_STAT_SLCT)) + +#if DEBUG +#define LOG_ENTRY_TYPE_MASK 0xFF00 +#define LOG_ENTRY_DATA_MASK 0x00FF + +#define LOG_ENTRY_READ ((USHORT)('R' << 8)) +#define LOG_ENTRY_WRITE ((USHORT)('W' << 8)) +#define LOG_ENTRY_CONTROL ((USHORT)('C' << 8)) +#define LOG_ENTRY_STATUS ((USHORT)('S' << 8)) +#define LOG_ENTRY_DATA ((USHORT)('D' << 8)) +#define LOG_ENTRY_EXIT ((USHORT)('E' << 8)) +#define LOG_ENTRY_EVENT ((USHORT)('V' << 8)) + +#define LOG_EVENT_SKIP_RECEIVE ((USHORT)0) +#define LOG_EVENT_BAD_STATUS ((USHORT)1) +#define LOG_EVENT_BAD_DISCONNECT ((USHORT)2) + +#define NUMBER_LOG_EVENTS 3 + +TCHAR *EventDescriptions[NUMBER_LOG_EVENTS] = +{ + TEXT("# Skipped Receives"), + TEXT("# Bad Status"), + TEXT("# Bad Disconnect"), +}; + +DWORD dwEventCounters[NUMBER_LOG_EVENTS]; + +VOID LogEntry(USHORT usEntry); +VOID DumpLog(VOID); +VOID DumpCounters(VOID); + +#define LOG_ENTRY(a) LogEntry(a) +#define DUMP_LOG() DumpLog() +#else +#define LOG_ENTRY(a) +#define DUMP_LOG() +#endif + +extern volatile DWORD *PtrCurMSec; /* current millisecond counter */ + +#define IoPortBase ((PUCHAR)PAR_PORT_BASE) + +BOOL NoPPFS; +BOOL bLastOpWasWrite; + +BOOL __inline VerifyDisconnect(VOID) +{ + int i; + USHORT usStatus; + + for (i = 0; i < 3; i++) + { + usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); + + LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); + + if (!STATUS_IS_DISCONNECTED(usStatus)) + { + LOG_ENTRY(LOG_ENTRY_EVENT | LOG_EVENT_BAD_STATUS); + + return FALSE; + } + } + return TRUE; + +} + +BOOL WaitForStatus(USHORT usMask, USHORT usValue) +{ + USHORT usStatus; + DWORD msecStart = *PtrCurMSec; + int tries = 0; + + do + { + if (*PtrCurMSec - msecStart >= 200) + { + if (++tries > 5) + { + NoPPFS = TRUE; + + printf("\r\nWaitForStatus: time out (1), status = %2.2X\r\n", + usStatus); + + LOG_ENTRY(LOG_ENTRY_EXIT | 2); + + DUMP_LOG(); + + return FALSE; + } + msecStart = *PtrCurMSec; + } + + usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); + + LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); + + // + // Use SELECTIN to identify the existence of ppsh + // + if (STATUS_IS_DISCONNECTED(usStatus)) + { + if (VerifyDisconnect()) + { + printf("\r\nWaitForStatus: PPSH disconnected\r\n"); + + NoPPFS = TRUE; + + LOG_ENTRY(LOG_ENTRY_EXIT | 1); + + DUMP_LOG(); + + return FALSE; + } + else + { + usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); + LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); + } + } + + if ((usStatus & usMask) == usValue) + { + int i; + + for (i = 0; i < 2; i++) + { + usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); + + LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); + + if ((usStatus & usMask) != usValue) + { + LOG_ENTRY(LOG_ENTRY_EVENT | LOG_EVENT_BAD_STATUS); + + break; + } + } + } + } + while ((usStatus & usMask) != usValue); + + return TRUE; +} + +int OEMParallelPortInit(void) +{ + LOG_ENTRY(LOG_ENTRY_CONTROL | PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE); + + WRITE_PORT_UCHAR( + IoPortBase + PAR_PORT_CTRL, PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE); + + return TRUE; +} + +int OEMParallelPortGetByte(void) +{ + BYTE value; + + if (NoPPFS) + { + return -1; + } + +Retry: + LOG_ENTRY(LOG_ENTRY_READ); + + LOG_ENTRY(LOG_ENTRY_CONTROL | PAR_CTRL_READ | PAR_CTRL_STROBE); + + WRITE_PORT_UCHAR(IoPortBase + PAR_PORT_CTRL, PAR_CTRL_READ | PAR_CTRL_STROBE); + + if (!WaitForStatus(PAR_STAT_NACK, PAR_STAT_NACK)) + { + return -1; + } + + value = READ_PORT_UCHAR(IoPortBase + PAR_PORT_DATA); + + LOG_ENTRY((USHORT)(LOG_ENTRY_DATA | value)); + + LOG_ENTRY(LOG_ENTRY_CONTROL | PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE); + + WRITE_PORT_UCHAR(IoPortBase + PAR_PORT_CTRL, PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE); + + if (!WaitForStatus(PAR_STAT_NACK, 0)) + { + return -1; + } + + LOG_ENTRY(LOG_ENTRY_EXIT | 0); + + if (bLastOpWasWrite && value == 0x1A) + { + // + // The problem is that periodically the first character we + // receive after a write is the last byte sent of the previous write. + // + // For now we will ignore it + // + LOG_ENTRY(LOG_ENTRY_EVENT | LOG_EVENT_SKIP_RECEIVE); + bLastOpWasWrite = FALSE; + goto Retry; + } + + bLastOpWasWrite = FALSE; + + return value; +} + +VOID OEMParallelPortSendByte(BYTE chData) +{ + if (NoPPFS) + return; + + LOG_ENTRY(LOG_ENTRY_WRITE); + + if (!WaitForStatus(PAR_STAT_NBUSY, 0)) + { + return; + } + + LOG_ENTRY((USHORT)(LOG_ENTRY_DATA | chData)); + + WRITE_PORT_UCHAR(IoPortBase + PAR_PORT_CTRL, PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE); + + WRITE_PORT_UCHAR(IoPortBase + PAR_PORT_DATA, chData); + + LOG_ENTRY(LOG_ENTRY_CONTROL | PAR_CTRL_AUTOFEED); + + WRITE_PORT_UCHAR(IoPortBase + PAR_PORT_CTRL, PAR_CTRL_AUTOFEED); + + if (!WaitForStatus(PAR_STAT_NBUSY, PAR_STAT_NBUSY)) + { + return; + } + + LOG_ENTRY(LOG_ENTRY_CONTROL | PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE); + + WRITE_PORT_UCHAR(IoPortBase + PAR_PORT_CTRL, PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE); + + LOG_ENTRY(LOG_ENTRY_EXIT | 0); + + bLastOpWasWrite = TRUE; +} + +#if DEBUG +#define LOG_SIZE 0x1000 +#define RW_STACK_SIZE 10 + +WCHAR wcHexDigits[16] = +{ + TEXT('0'), TEXT('1'), TEXT('2'), TEXT('3'), + TEXT('4'), TEXT('5'), TEXT('6'), TEXT('7'), + TEXT('8'), TEXT('9'), TEXT('A'), TEXT('B'), + TEXT('C'), TEXT('D'), TEXT('E'), TEXT('F') +}; + +USHORT usLogBuffer[LOG_SIZE]; +int iLogHead = 0; +int iLogTail = 0; + +VOID +LogEntry(USHORT usEntry) +{ + static USHORT usLastEntry; + USHORT usEntryType; + USHORT usEntryData; + + usEntryData = usEntry & LOG_ENTRY_DATA_MASK; + usEntryType = usEntry & LOG_ENTRY_TYPE_MASK; + + switch (usEntryType) + { + case LOG_ENTRY_STATUS: + if (usLastEntry == usEntry) + { + // + // Don't log duplicate status + // + return; + } + break; + + case LOG_ENTRY_EVENT: + if (usEntryData < NUMBER_LOG_EVENTS) + { + dwEventCounters[usEntryData]++; + } + break; + } + + usLastEntry = usEntry; + + usLogBuffer[iLogTail++] = usEntry; + iLogTail %= LOG_SIZE; + + if (iLogTail == iLogHead) + { + iLogHead++; + iLogHead %= LOG_SIZE; + } +} + +VOID +DumpLog(VOID) +{ + // R 00 W 4F + TCHAR szPrintLine[100]; + int iLogCurrent; + PTCHAR pCurrentColumn; + int nDataItems; + USHORT usCurrentOp, usLastOp; + int iReadWriteStack[RW_STACK_SIZE]; + int i; + + pCurrentColumn = szPrintLine; + nDataItems = 0; + + usLastOp = 0; + + for (i = 0; i < RW_STACK_SIZE; i++) + { + iReadWriteStack[i] = iLogTail; + } + + for (iLogCurrent = iLogHead; iLogCurrent != iLogTail; + iLogCurrent++, iLogCurrent %= LOG_SIZE) + { + usCurrentOp = usLogBuffer[iLogCurrent] & LOG_ENTRY_TYPE_MASK; + switch (usCurrentOp) + { + case LOG_ENTRY_READ: + case LOG_ENTRY_WRITE: + if (usLastOp != usCurrentOp) + { + if (pCurrentColumn != szPrintLine) + { + memcpy(pCurrentColumn, TEXT("\r\n"), sizeof(TEXT("\r\n"))); + OutputDebugString(szPrintLine); + pCurrentColumn = szPrintLine; + } + + *pCurrentColumn++ = (TCHAR)(usLogBuffer[iLogCurrent] >> 8); + *pCurrentColumn++ = TEXT(' '); + usLastOp = usCurrentOp; + nDataItems = 0; + } + + for (i = 0; i < (RW_STACK_SIZE - 1); i++) + { + iReadWriteStack[i] = iReadWriteStack[i + 1]; + } + + iReadWriteStack[RW_STACK_SIZE - 1] = iLogCurrent; + break; + + case LOG_ENTRY_EVENT: + case LOG_ENTRY_DATA: + if (nDataItems == 25) + { + memcpy(pCurrentColumn, TEXT("\r\n"), sizeof(TEXT("\r\n"))); + OutputDebugString(szPrintLine); + pCurrentColumn = szPrintLine; + *pCurrentColumn++ = TEXT(' '); + *pCurrentColumn++ = TEXT(' '); + nDataItems = 0; + } + *pCurrentColumn++ = wcHexDigits[(usLogBuffer[iLogCurrent] >> 4) & 0x0F]; + *pCurrentColumn++ = wcHexDigits[usLogBuffer[iLogCurrent] & 0x0F]; + *pCurrentColumn++ = usCurrentOp == LOG_ENTRY_DATA ? TEXT(' ') : TEXT('!'); + nDataItems++; + break; + } + } + + if (pCurrentColumn != szPrintLine) + { + memcpy(pCurrentColumn, TEXT("\r\n"), sizeof(TEXT("\r\n"))); + OutputDebugString(szPrintLine); + pCurrentColumn = szPrintLine; + } + + nDataItems = 0; + + for (i = 0; i < RW_STACK_SIZE; i++) + { + if (iReadWriteStack[i] != iLogTail) + { + break; + } + } + + iLogCurrent = (i < RW_STACK_SIZE) ? iReadWriteStack[i] : iLogTail; + + for ( ; iLogCurrent != iLogTail; iLogCurrent++, iLogCurrent %= LOG_SIZE) + { + if (nDataItems == 16) + { + memcpy(pCurrentColumn, TEXT("\r\n"), sizeof(TEXT("\r\n"))); + OutputDebugString(szPrintLine); + pCurrentColumn = szPrintLine; + nDataItems = 0; + } + + *pCurrentColumn++ = (TCHAR)(usLogBuffer[iLogCurrent] >> 8); + + *pCurrentColumn++ = TEXT(' '); + + *pCurrentColumn++ = wcHexDigits[(usLogBuffer[iLogCurrent] >> 4) & 0x0F]; + + *pCurrentColumn++ = wcHexDigits[usLogBuffer[iLogCurrent] & 0x0F]; + + *pCurrentColumn++ = TEXT(' '); + + nDataItems++; + } + + if (pCurrentColumn != szPrintLine) + { + memcpy(pCurrentColumn, TEXT("\r\n"), sizeof(TEXT("\r\n"))); + OutputDebugString(szPrintLine); + pCurrentColumn = szPrintLine; + } + + DumpCounters(); +} + +VOID +DumpCounters(VOID) +{ + int i; + + for (i = 0; i < NUMBER_LOG_EVENTS; i++) + { + if (dwEventCounters[i] != 0) + { + NKDbgPrintfW( + TEXT("%s = %d\r\n"), EventDescriptions[i], dwEventCounters[i]); + } + } +} +#endif diff --git a/DOS/LOADCEPC/mdppfs.cod b/DOS/LOADCEPC/mdppfs.cod new file mode 100644 index 0000000..892d8d8 --- /dev/null +++ b/DOS/LOADCEPC/mdppfs.cod @@ -0,0 +1,1138 @@ +; Static Name Aliases +; + TITLE mdppfs.c + .286p + .287 +INCLUDELIB SLIBCE +INCLUDELIB OLDNAMES.LIB +_TEXT SEGMENT WORD PUBLIC 'CODE' +_TEXT ENDS +_DATA SEGMENT WORD PUBLIC 'DATA' +_DATA ENDS +CONST SEGMENT WORD PUBLIC 'CONST' +CONST ENDS +_BSS SEGMENT WORD PUBLIC 'BSS' +_BSS ENDS +$$SYMBOLS SEGMENT BYTE PUBLIC 'DEBSYM' +$$SYMBOLS ENDS +$$TYPES SEGMENT BYTE PUBLIC 'DEBTYP' +$$TYPES ENDS +DGROUP GROUP CONST, _BSS, _DATA + ASSUME DS: DGROUP, SS: DGROUP +EXTRN _printf:NEAR +_BSS SEGMENT +COMM NEAR _bLastOpWasWrite: BYTE: 4 +_BSS ENDS +EXTRN _PtrCurMSec:WORD +_BSS SEGMENT +COMM NEAR _NoPPFS: BYTE: 4 +_BSS ENDS +_DATA SEGMENT +$SG343 DB 0dH, 0aH, 'WaitForStatus: time out (1), status = %2.2X', 0dH + DB 0aH, 00H +$SG347 DB 0dH, 0aH, 'WaitForStatus: PPSH disconnected', 0dH, 0aH, 00H +_DATA ENDS +_TEXT SEGMENT + ASSUME CS: _TEXT + PUBLIC _WaitForStatus +_WaitForStatus PROC NEAR +;|*** // +;|*** // Copyright (c) Microsoft Corporation. All rights reserved. +;|*** // +;|*** // +;|*** // Use of this sample source code is subject to the terms of the Microsoft +;|*** // license agreement under which you licensed this sample source code. If +;|*** // you did not accept the terms of the license agreement, you are not +;|*** // authorized to use this sample source code. For the terms of the license, +;|*** // please see the license agreement between you and Microsoft or, if applicable, +;|*** // see the LICENSE.RTF on your install media or the root of your tools installation. +;|*** // THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +;|*** // +;|*** /*++ +;|*** THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +;|*** ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +;|*** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +;|*** PARTICULAR PURPOSE. +;|*** +;|*** Module Name: +;|*** +;|*** mdppfs.c +;|*** +;|*** Abstract: +;|*** +;|*** This file implements the NK kernel ppfs client side interface +;|*** +;|*** Notes: +;|*** +;|*** --*/ +;|*** +;|*** #include "windows.h" +;|*** #include "wdm.h" +;|*** #include "pc.h" +;|*** +;|*** #define PAR_PORT_BASE 0x0378 +;|*** #define PAR_PORT_DATA 0 +;|*** #define PAR_PORT_STAT 1 +;|*** #define PAR_PORT_CTRL 2 +;|*** +;|*** #define PAR_STAT_NBUSY 0x80 +;|*** #define PAR_STAT_NACK 0x40 +;|*** #define PAR_STAT_PE 0x20 +;|*** #define PAR_STAT_SLCT 0x10 +;|*** #define PAR_STAT_NERR 0x08 // This isn't connected +;|*** +;|*** #define PAR_CTRL_READ 0x20 +;|*** #define PAR_CTRL_IRQE 0x10 +;|*** #define PAR_CTRL_SLCT_IN 0x08 +;|*** #define PAR_CTRL_NINIT 0x04 +;|*** #define PAR_CTRL_AUTOFEED 0x02 +;|*** #define PAR_CTRL_STROBE 0x01 +;|*** +;|*** #define STATUS_IS_DISCONNECTED(a) \ +;|*** ((((a) & (PAR_STAT_PE | PAR_STAT_SLCT)) != PAR_STAT_SLCT) || \ +;|*** (((a) & (PAR_STAT_NBUSY | PAR_STAT_NACK)) == PAR_STAT_NACK)) +;|*** +;|*** //#define STATUS_IS_DISCONNECTED(a) (!((a) & PAR_STAT_SLCT)) +;|*** +;|*** #if DEBUG +;|*** #define LOG_ENTRY_TYPE_MASK 0xFF00 +;|*** #define LOG_ENTRY_DATA_MASK 0x00FF +;|*** +;|*** #define LOG_ENTRY_READ ((USHORT)('R' << 8)) +;|*** #define LOG_ENTRY_WRITE ((USHORT)('W' << 8)) +;|*** #define LOG_ENTRY_CONTROL ((USHORT)('C' << 8)) +;|*** #define LOG_ENTRY_STATUS ((USHORT)('S' << 8)) +;|*** #define LOG_ENTRY_DATA ((USHORT)('D' << 8)) +;|*** #define LOG_ENTRY_EXIT ((USHORT)('E' << 8)) +;|*** #define LOG_ENTRY_EVENT ((USHORT)('V' << 8)) +;|*** +;|*** #define LOG_EVENT_SKIP_RECEIVE ((USHORT)0) +;|*** #define LOG_EVENT_BAD_STATUS ((USHORT)1) +;|*** #define LOG_EVENT_BAD_DISCONNECT ((USHORT)2) +;|*** +;|*** #define NUMBER_LOG_EVENTS 3 +;|*** +;|*** TCHAR *EventDescriptions[NUMBER_LOG_EVENTS] = +;|*** { +;|*** TEXT("# Skipped Receives"), +;|*** TEXT("# Bad Status"), +;|*** TEXT("# Bad Disconnect"), +;|*** }; +;|*** +;|*** DWORD dwEventCounters[NUMBER_LOG_EVENTS]; +;|*** +;|*** VOID LogEntry(USHORT usEntry); +;|*** VOID DumpLog(VOID); +;|*** VOID DumpCounters(VOID); +;|*** +;|*** #define LOG_ENTRY(a) LogEntry(a) +;|*** #define DUMP_LOG() DumpLog() +;|*** #else +;|*** #define LOG_ENTRY(a) +;|*** #define DUMP_LOG() +;|*** #endif +;|*** +;|*** extern volatile DWORD *PtrCurMSec; /* current millisecond counter */ +;|*** +;|*** #define IoPortBase ((PUCHAR)PAR_PORT_BASE) +;|*** +;|*** BOOL NoPPFS; +;|*** BOOL bLastOpWasWrite; +;|*** +;|*** BOOL __inline VerifyDisconnect(VOID) +;|*** { +;|*** int i; +;|*** USHORT usStatus; +;|*** +;|*** for (i = 0; i < 3; i++) +;|*** { +;|*** usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); +;|*** +;|*** LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); +;|*** +;|*** if (!STATUS_IS_DISCONNECTED(usStatus)) +;|*** { +;|*** LOG_ENTRY(LOG_ENTRY_EVENT | LOG_EVENT_BAD_STATUS); +;|*** +;|*** return FALSE; +;|*** } +;|*** } +;|*** return TRUE; +;|*** +;|*** } +;|*** +;|*** BOOL WaitForStatus(USHORT usMask, USHORT usValue) +;|*** { +; Line 127 + *** 000000 c8 0a 00 00 enter 10,0 + *** 000004 57 push di + *** 000005 56 push si +; usMask = 4 +; usValue = 6 +; usStatus = -2 +; msecStart = -8 +; tries = -10 +; register cx = i +;|*** USHORT usStatus; +;|*** DWORD msecStart = *PtrCurMSec; +; Line 129 + *** 000006 8b 1e 00 00 mov bx,WORD PTR _PtrCurMSec + *** 00000a 8b 07 mov ax,WORD PTR [bx] + *** 00000c 8b 57 02 mov dx,WORD PTR [bx+2] + *** 00000f 89 46 f8 mov WORD PTR [bp-8],ax ;msecStart + *** 000012 89 56 fa mov WORD PTR [bp-6],dx +;|*** int tries = 0; +; Line 130 + *** 000015 c7 46 f6 00 00 mov WORD PTR [bp-10],0 ;tries +;|*** { +; Line 105 + *** 00001a 8b 4e fe mov cx,WORD PTR [bp-2] ;usStatus + *** 00001d 8b 5e 04 mov bx,WORD PTR [bp+4] ;usMask +;|*** int i; +;|*** USHORT usStatus; +;|*** +;|*** for (i = 0; i < 3; i++) +;|*** { +;|*** usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); +;|*** +;|*** LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); +;|*** +;|*** if (!STATUS_IS_DISCONNECTED(usStatus)) +;|*** { +;|*** LOG_ENTRY(LOG_ENTRY_EVENT | LOG_EVENT_BAD_STATUS); +;|*** +;|*** return FALSE; +;|*** } +;|*** } +;|*** return TRUE; +;|*** +;|*** } +;|*** +;|*** BOOL WaitForStatus(USHORT usMask, USHORT usValue) +;|*** { +;|*** USHORT usStatus; +;|*** DWORD msecStart = *PtrCurMSec; +;|*** int tries = 0; +;|*** +;|*** do +; Line 132 + $D338: +;|*** { +;|*** if (*PtrCurMSec - msecStart >= 200) +; Line 134 + *** 000020 8b 36 00 00 mov si,WORD PTR _PtrCurMSec + *** 000024 8b 04 mov ax,WORD PTR [si] + *** 000026 8b 54 02 mov dx,WORD PTR [si+2] + *** 000029 2b 46 f8 sub ax,WORD PTR [bp-8] ;msecStart + *** 00002c 1b 56 fa sbb dx,WORD PTR [bp-6] + *** 00002f 0b d2 or dx,dx + *** 000031 75 05 jne $L393 + *** 000033 3d c8 00 cmp ax,200 ;00c8H + *** 000036 72 17 jb $I341 + $L393: +;|*** { +;|*** if (++tries > 5) +; Line 136 + *** 000038 ff 46 f6 inc WORD PTR [bp-10] ;tries + *** 00003b 83 7e f6 05 cmp WORD PTR [bp-10],5 ;tries + *** 00003f 7e 03 jle $JCC63 + *** 000041 e9 a4 00 jmp $L384 + $JCC63: +;|*** { +;|*** NoPPFS = TRUE; +;|*** +;|*** printf("\r\nWaitForStatus: time out (1), status = %2.2X\r\n", +;|*** usStatus); +;|*** +;|*** LOG_ENTRY(LOG_ENTRY_EXIT | 2); +;|*** +;|*** DUMP_LOG(); +;|*** +;|*** return FALSE; +;|*** } +;|*** msecStart = *PtrCurMSec; +; Line 149 + *** 000044 8b 04 mov ax,WORD PTR [si] + *** 000046 8b 54 02 mov dx,WORD PTR [si+2] + *** 000049 89 46 f8 mov WORD PTR [bp-8],ax ;msecStart + *** 00004c 89 56 fa mov WORD PTR [bp-6],dx +;|*** } +;|*** +;|*** usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); +; Line 152 + $I341: +;|*** +;|*** LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); +;|*** +;|*** // +;|*** // Use SELECTIN to identify the existence of ppsh +;|*** // +;|*** if (STATUS_IS_DISCONNECTED(usStatus)) +; Line 159 + *** 00004f ba 79 03 mov dx,889 ;0379H + *** 000052 ec in al,dx + *** 000053 8a c8 mov cl,al + *** 000055 2a ed sub ch,ch + *** 000057 8b c1 mov ax,cx + *** 000059 24 30 and al,48 ;0030H + *** 00005b 3c 10 cmp al,16 ;0010H + *** 00005d 75 08 jne $I345 + *** 00005f 8a c1 mov al,cl + *** 000061 24 c0 and al,192 ;00c0H + *** 000063 3c 40 cmp al,64 ;0040H + *** 000065 75 69 jne $L392 +;|*** { +; Line 105 + $I345: +;|*** int i; +;|*** USHORT usStatus; +;|*** +;|*** for (i = 0; i < 3; i++) +;|*** { +;|*** usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); +;|*** +;|*** LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); +;|*** +;|*** if (!STATUS_IS_DISCONNECTED(usStatus)) +;|*** { +;|*** LOG_ENTRY(LOG_ENTRY_EVENT | LOG_EVENT_BAD_STATUS); +;|*** +;|*** return FALSE; +;|*** } +;|*** } +;|*** return TRUE; +;|*** +;|*** } +;|*** +;|*** BOOL WaitForStatus(USHORT usMask, USHORT usValue) +;|*** { +;|*** USHORT usStatus; +;|*** DWORD msecStart = *PtrCurMSec; +;|*** int tries = 0; +;|*** +;|*** do +;|*** { +;|*** if (*PtrCurMSec - msecStart >= 200) +;|*** { +;|*** if (++tries > 5) +;|*** { +;|*** NoPPFS = TRUE; +;|*** +;|*** printf("\r\nWaitForStatus: time out (1), status = %2.2X\r\n", +;|*** usStatus); +;|*** +;|*** LOG_ENTRY(LOG_ENTRY_EXIT | 2); +;|*** +;|*** DUMP_LOG(); +;|*** +;|*** return FALSE; +;|*** } +;|*** msecStart = *PtrCurMSec; +;|*** } +;|*** +;|*** usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); +;|*** +;|*** LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); +;|*** +;|*** // +;|*** // Use SELECTIN to identify the existence of ppsh +;|*** // +;|*** if (STATUS_IS_DISCONNECTED(usStatus)) +;|*** { +;|*** if (VerifyDisconnect()) +; Line 161 + *** 000067 c7 46 fe 00 00 mov WORD PTR [bp-2],0 ;usStatus +;|*** { +; Line 105 + *** 00006c 8b 7e 06 mov di,WORD PTR [bp+6] ;usValue +;|*** int i; +;|*** USHORT usStatus; +;|*** +;|*** for (i = 0; i < 3; i++) +;|*** { +;|*** usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); +;|*** +;|*** LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); +;|*** +;|*** if (!STATUS_IS_DISCONNECTED(usStatus)) +;|*** { +;|*** LOG_ENTRY(LOG_ENTRY_EVENT | LOG_EVENT_BAD_STATUS); +;|*** +;|*** return FALSE; +;|*** } +;|*** } +;|*** return TRUE; +;|*** +;|*** } +;|*** +;|*** BOOL WaitForStatus(USHORT usMask, USHORT usValue) +;|*** { +;|*** USHORT usStatus; +;|*** DWORD msecStart = *PtrCurMSec; +;|*** int tries = 0; +;|*** +;|*** do +;|*** { +;|*** if (*PtrCurMSec - msecStart >= 200) +;|*** { +;|*** if (++tries > 5) +;|*** { +;|*** NoPPFS = TRUE; +;|*** +;|*** printf("\r\nWaitForStatus: time out (1), status = %2.2X\r\n", +;|*** usStatus); +;|*** +;|*** LOG_ENTRY(LOG_ENTRY_EXIT | 2); +;|*** +;|*** DUMP_LOG(); +;|*** +;|*** return FALSE; +;|*** } +;|*** msecStart = *PtrCurMSec; +;|*** } +;|*** +;|*** usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); +;|*** +;|*** LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); +;|*** +;|*** // +;|*** // Use SELECTIN to identify the existence of ppsh +;|*** // +;|*** if (STATUS_IS_DISCONNECTED(usStatus)) +;|*** { +;|*** if (VerifyDisconnect()) +; Line 161 + $L376: + *** 00006f ba 79 03 mov dx,889 ;0379H + *** 000072 ec in al,dx + *** 000073 8a c8 mov cl,al + *** 000075 2a ed sub ch,ch + *** 000077 8b c1 mov ax,cx + *** 000079 24 30 and al,48 ;0030H + *** 00007b 3c 10 cmp al,16 ;0010H + *** 00007d 75 08 jne $L375 + *** 00007f 8a c1 mov al,cl + *** 000081 24 c0 and al,192 ;00c0H + *** 000083 3c 40 cmp al,64 ;0040H + *** 000085 75 4f jne $L383 + $L375: + *** 000087 ff 46 fe inc WORD PTR [bp-2] ;usStatus + *** 00008a 83 7e fe 03 cmp WORD PTR [bp-2],3 ;usStatus + *** 00008e 7c df jl $L376 + *** 000090 c7 46 fc 01 00 mov WORD PTR [bp-4],1 + *** 000095 c7 46 fe 00 00 mov WORD PTR [bp-2],0 ;usStatus + $L377: + *** 00009a 8b 46 fe mov ax,WORD PTR [bp-2] ;usStatus + *** 00009d 0b 46 fc or ax,WORD PTR [bp-4] + *** 0000a0 75 5e jne $L386 +;|*** { +;|*** printf("\r\nWaitForStatus: PPSH disconnected\r\n"); +;|*** +;|*** NoPPFS = TRUE; +;|*** +;|*** LOG_ENTRY(LOG_ENTRY_EXIT | 1); +;|*** +;|*** DUMP_LOG(); +;|*** +;|*** return FALSE; +;|*** } +;|*** else +;|*** { +;|*** usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); +; Line 175 + *** 0000a2 ec in al,dx + *** 0000a3 8a c8 mov cl,al + *** 0000a5 2a ed sub ch,ch +;|*** LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); +;|*** } +;|*** } +;|*** +;|*** if ((usStatus & usMask) == usValue) +; Line 180 + $I344: + *** 0000a7 8b c1 mov ax,cx + *** 0000a9 23 c3 and ax,bx + *** 0000ab 3b c7 cmp ax,di + *** 0000ad 75 14 jne $DC339 +;|*** { +;|*** int i; +;|*** +;|*** for (i = 0; i < 2; i++) +; Line 184 + *** 0000af 33 c9 xor cx,cx + $F351: +;|*** { +;|*** usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); +;|*** +;|*** LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); +;|*** +;|*** if ((usStatus & usMask) != usValue) +; Line 190 + *** 0000b1 ba 79 03 mov dx,889 ;0379H + *** 0000b4 ec in al,dx + *** 0000b5 2a e4 sub ah,ah + *** 0000b7 89 46 fe mov WORD PTR [bp-2],ax ;usStatus + *** 0000ba 23 c3 and ax,bx + *** 0000bc 3b c7 cmp ax,di + *** 0000be 74 20 je $L391 +;|*** { +; Line 105 + $L390: + *** 0000c0 8b 4e fe mov cx,WORD PTR [bp-2] ;usStatus + $DC339: + *** 0000c3 8b c1 mov ax,cx + *** 0000c5 23 c3 and ax,bx + *** 0000c7 3b c7 cmp ax,di + *** 0000c9 74 03 je $JCC201 + *** 0000cb e9 52 ff jmp $D338 + $JCC201: + *** 0000ce eb 4e jmp SHORT $L385 + $L392: + *** 0000d0 8b 7e 06 mov di,WORD PTR [bp+6] ;usValue + *** 0000d3 eb d2 jmp SHORT $I344 + *** 0000d5 90 nop +;|*** int i; +;|*** USHORT usStatus; +;|*** +;|*** for (i = 0; i < 3; i++) +;|*** { +;|*** usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); +;|*** +;|*** LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); +;|*** +;|*** if (!STATUS_IS_DISCONNECTED(usStatus)) +;|*** { +;|*** LOG_ENTRY(LOG_ENTRY_EVENT | LOG_EVENT_BAD_STATUS); +;|*** +;|*** return FALSE; +;|*** } +;|*** } +;|*** return TRUE; +;|*** +;|*** } +;|*** +;|*** BOOL WaitForStatus(USHORT usMask, USHORT usValue) +;|*** { +;|*** USHORT usStatus; +;|*** DWORD msecStart = *PtrCurMSec; +;|*** int tries = 0; +;|*** +;|*** do +;|*** { +;|*** if (*PtrCurMSec - msecStart >= 200) +;|*** { +;|*** if (++tries > 5) +;|*** { +;|*** NoPPFS = TRUE; +;|*** +;|*** printf("\r\nWaitForStatus: time out (1), status = %2.2X\r\n", +;|*** usStatus); +;|*** +;|*** LOG_ENTRY(LOG_ENTRY_EXIT | 2); +;|*** +;|*** DUMP_LOG(); +;|*** +;|*** return FALSE; +;|*** } +;|*** msecStart = *PtrCurMSec; +;|*** } +;|*** +;|*** usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); +;|*** +;|*** LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); +;|*** +;|*** // +;|*** // Use SELECTIN to identify the existence of ppsh +;|*** // +;|*** if (STATUS_IS_DISCONNECTED(usStatus)) +; Line 159 + $L383: + *** 0000d6 2b c0 sub ax,ax + *** 0000d8 89 46 fe mov WORD PTR [bp-2],ax ;usStatus + *** 0000db 89 46 fc mov WORD PTR [bp-4],ax + *** 0000de eb ba jmp SHORT $L377 + $L391: + *** 0000e0 41 inc cx + *** 0000e1 83 f9 02 cmp cx,2 + *** 0000e4 7c cb jl $F351 + *** 0000e6 eb d8 jmp SHORT $L390 +;|*** { +;|*** if (VerifyDisconnect()) +;|*** { +;|*** printf("\r\nWaitForStatus: PPSH disconnected\r\n"); +;|*** +;|*** NoPPFS = TRUE; +;|*** +;|*** LOG_ENTRY(LOG_ENTRY_EXIT | 1); +;|*** +;|*** DUMP_LOG(); +;|*** +;|*** return FALSE; +;|*** } +;|*** else +;|*** { +;|*** usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); +;|*** LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); +;|*** } +;|*** } +;|*** +;|*** if ((usStatus & usMask) == usValue) +;|*** { +;|*** int i; +;|*** +;|*** for (i = 0; i < 2; i++) +;|*** { +;|*** usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); +;|*** +;|*** LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); +;|*** +;|*** if ((usStatus & usMask) != usValue) +;|*** { +;|*** LOG_ENTRY(LOG_ENTRY_EVENT | LOG_EVENT_BAD_STATUS); +;|*** +;|*** break; +;|*** } +;|*** } +;|*** } +;|*** } +;|*** while ((usStatus & usMask) != usValue); +; Line 199 + $L384: +;|*** NoPPFS = TRUE; +; Line 138 + *** 0000e8 c7 06 00 00 01 00 mov WORD PTR _NoPPFS,1 + *** 0000ee c7 06 02 00 00 00 mov WORD PTR _NoPPFS+2,0 +;|*** +;|*** printf("\r\nWaitForStatus: time out (1), status = %2.2X\r\n", +;|*** usStatus); +; Line 141 + *** 0000f4 51 push cx + *** 0000f5 68 00 00 push OFFSET DGROUP:$SG343 + *** 0000f8 e8 00 00 call _printf + *** 0000fb 83 c4 04 add sp,4 + *** 0000fe eb 15 jmp SHORT $L398 + $L386: +;|*** +;|*** LOG_ENTRY(LOG_ENTRY_EXIT | 2); +;|*** +;|*** DUMP_LOG(); +;|*** +;|*** return FALSE; +;|*** } +;|*** msecStart = *PtrCurMSec; +;|*** } +;|*** +;|*** usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); +;|*** +;|*** LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); +;|*** +;|*** // +;|*** // Use SELECTIN to identify the existence of ppsh +;|*** // +;|*** if (STATUS_IS_DISCONNECTED(usStatus)) +;|*** { +;|*** if (VerifyDisconnect()) +;|*** { +;|*** printf("\r\nWaitForStatus: PPSH disconnected\r\n"); +; Line 163 + *** 000100 68 00 00 push OFFSET DGROUP:$SG347 + *** 000103 e8 00 00 call _printf + *** 000106 83 c4 02 add sp,2 +;|*** +;|*** NoPPFS = TRUE; +; Line 165 + *** 000109 c7 06 00 00 01 00 mov WORD PTR _NoPPFS,1 + *** 00010f c7 06 02 00 00 00 mov WORD PTR _NoPPFS+2,0 +;|*** +;|*** LOG_ENTRY(LOG_ENTRY_EXIT | 1); +;|*** +;|*** DUMP_LOG(); +;|*** +;|*** return FALSE; +; Line 171 + $L398: + *** 000115 33 c0 xor ax,ax + *** 000117 33 d2 xor dx,dx + *** 000119 5e pop si + *** 00011a 5f pop di + *** 00011b c9 leave + *** 00011c c3 ret + *** 00011d 90 nop + $L385: +;|*** } +;|*** else +;|*** { +;|*** usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); +;|*** LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); +;|*** } +;|*** } +;|*** +;|*** if ((usStatus & usMask) == usValue) +;|*** { +;|*** int i; +;|*** +;|*** for (i = 0; i < 2; i++) +;|*** { +;|*** usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT); +;|*** +;|*** LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus)); +;|*** +;|*** if ((usStatus & usMask) != usValue) +;|*** { +;|*** LOG_ENTRY(LOG_ENTRY_EVENT | LOG_EVENT_BAD_STATUS); +;|*** +;|*** break; +;|*** } +;|*** } +;|*** } +;|*** } +;|*** while ((usStatus & usMask) != usValue); +;|*** +;|*** return TRUE; +; Line 201 + *** 00011e b8 01 00 mov ax,1 + *** 000121 33 d2 xor dx,dx +;|*** } +; Line 202 + *** 000123 5e pop si + *** 000124 5f pop di + *** 000125 c9 leave + *** 000126 c3 ret + *** 000127 90 nop + +_WaitForStatus ENDP + PUBLIC _OEMParallelPortInit +_OEMParallelPortInit PROC NEAR +;|*** +;|*** int OEMParallelPortInit(void) +;|*** { +;|*** LOG_ENTRY(LOG_ENTRY_CONTROL | PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE); +;|*** +;|*** WRITE_PORT_UCHAR( +; Line 208 + *** 000128 b8 03 00 mov ax,3 + *** 00012b ba 7a 03 mov dx,890 ;037aH + *** 00012e ee out dx, al + +;|*** IoPortBase + PAR_PORT_CTRL, PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE); +;|*** +;|*** return TRUE; +; Line 211 + *** 00012f b8 01 00 mov ax,1 +;|*** } +; Line 212 + *** 000132 c3 ret + *** 000133 90 nop + +_OEMParallelPortInit ENDP + PUBLIC _OEMParallelPortGetByte +_OEMParallelPortGetByte PROC NEAR +;|*** +;|*** int OEMParallelPortGetByte(void) +;|*** { +; Line 215 + *** 000134 c8 02 00 00 enter 2,0 +; value = -1 +;|*** BYTE value; +;|*** +;|*** if (NoPPFS) +; Line 218 + *** 000138 a1 02 00 mov ax,WORD PTR _NoPPFS+2 + *** 00013b 0b 06 00 00 or ax,WORD PTR _NoPPFS + *** 00013f 74 05 je $L394 +;|*** { +;|*** return -1; +; Line 220 + $L399: + *** 000141 b8 ff ff mov ax,-1 ;ffffH + *** 000144 c9 leave + *** 000145 c3 ret + $L394: +;|*** } +;|*** +;|*** Retry: +;|*** LOG_ENTRY(LOG_ENTRY_READ); +;|*** +;|*** LOG_ENTRY(LOG_ENTRY_CONTROL | PAR_CTRL_READ | PAR_CTRL_STROBE); +;|*** +;|*** WRITE_PORT_UCHAR(IoPortBase + PAR_PORT_CTRL, PAR_CTRL_READ | PAR_CTRL_STROBE); +; Line 228 + *** 000146 b8 21 00 mov ax,33 ;0021H + *** 000149 ba 7a 03 mov dx,890 ;037aH + *** 00014c ee out dx, al + +;|*** +;|*** if (!WaitForStatus(PAR_STAT_NACK, PAR_STAT_NACK)) +; Line 230 + *** 00014d 6a 40 push 64 ;0040H + *** 00014f 6a 40 push 64 ;0040H + *** 000151 e8 ac fe call _WaitForStatus + *** 000154 83 c4 04 add sp,4 + *** 000157 0b d0 or dx,ax + *** 000159 74 e6 je $L399 +;|*** { +;|*** return -1; +;|*** } +;|*** +;|*** value = READ_PORT_UCHAR(IoPortBase + PAR_PORT_DATA); +; Line 235 + *** 00015b ba 78 03 mov dx,888 ;0378H + *** 00015e ec in al,dx + *** 00015f 88 46 ff mov BYTE PTR [bp-1],al ;value +;|*** +;|*** LOG_ENTRY((USHORT)(LOG_ENTRY_DATA | value)); +;|*** +;|*** LOG_ENTRY(LOG_ENTRY_CONTROL | PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE); +;|*** +;|*** WRITE_PORT_UCHAR(IoPortBase + PAR_PORT_CTRL, PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE); +; Line 241 + *** 000162 b8 03 00 mov ax,3 + *** 000165 ba 7a 03 mov dx,890 ;037aH + *** 000168 ee out dx, al + +;|*** +;|*** if (!WaitForStatus(PAR_STAT_NACK, 0)) +; Line 243 + *** 000169 6a 00 push 0 + *** 00016b 6a 40 push 64 ;0040H + *** 00016d e8 90 fe call _WaitForStatus + *** 000170 83 c4 04 add sp,4 + *** 000173 0b d0 or dx,ax + *** 000175 74 ca je $L399 +;|*** { +;|*** return -1; +;|*** } +;|*** +;|*** LOG_ENTRY(LOG_ENTRY_EXIT | 0); +;|*** +;|*** if (bLastOpWasWrite && value == 0x1A) +; Line 250 + *** 000177 a1 02 00 mov ax,WORD PTR _bLastOpWasWrite+2 + *** 00017a 0b 06 00 00 or ax,WORD PTR _bLastOpWasWrite + *** 00017e 74 10 je $I364 + *** 000180 80 7e ff 1a cmp BYTE PTR [bp-1],26 ;001aH ;value + *** 000184 75 0a jne $I364 +;|*** { +;|*** // +;|*** // The problem is that periodically the first character we +;|*** // receive after a write is the last byte sent of the previous write. +;|*** // +;|*** // For now we will ignore it +;|*** // +;|*** LOG_ENTRY(LOG_ENTRY_EVENT | LOG_EVENT_SKIP_RECEIVE); +;|*** bLastOpWasWrite = FALSE; +; Line 259 + *** 000186 2b c0 sub ax,ax + *** 000188 a3 02 00 mov WORD PTR _bLastOpWasWrite+2,ax + *** 00018b a3 00 00 mov WORD PTR _bLastOpWasWrite,ax +;|*** goto Retry; +; Line 260 + *** 00018e eb b6 jmp SHORT $L394 + $I364: + *** 000190 2b c0 sub ax,ax + *** 000192 a3 02 00 mov WORD PTR _bLastOpWasWrite+2,ax + *** 000195 a3 00 00 mov WORD PTR _bLastOpWasWrite,ax +;|*** } +;|*** +;|*** bLastOpWasWrite = FALSE; +;|*** +;|*** return value; +; Line 265 + *** 000198 8a 46 ff mov al,BYTE PTR [bp-1] ;value +;|*** } +; Line 266 + *** 00019b c9 leave + *** 00019c c3 ret + *** 00019d 90 nop + +_OEMParallelPortGetByte ENDP + PUBLIC _OEMParallelPortSendByte +_OEMParallelPortSendByte PROC NEAR +;|*** +;|*** VOID OEMParallelPortSendByte(BYTE chData) +;|*** { +; Line 269 + *** 00019e 55 push bp + *** 00019f 8b ec mov bp,sp +; chData = 4 +;|*** if (NoPPFS) +; Line 270 + *** 0001a1 a1 02 00 mov ax,WORD PTR _NoPPFS+2 + *** 0001a4 0b 06 00 00 or ax,WORD PTR _NoPPFS + *** 0001a8 75 45 jne $EX368 +;|*** return; +;|*** +;|*** LOG_ENTRY(LOG_ENTRY_WRITE); +;|*** +;|*** if (!WaitForStatus(PAR_STAT_NBUSY, 0)) +; Line 275 + *** 0001aa 6a 00 push 0 + *** 0001ac 68 80 00 push 128 ;0080H + *** 0001af e8 4e fe call _WaitForStatus + *** 0001b2 8b e5 mov sp,bp + *** 0001b4 0b d0 or dx,ax + *** 0001b6 74 37 je $EX368 +;|*** { +;|*** return; +;|*** } +;|*** +;|*** LOG_ENTRY((USHORT)(LOG_ENTRY_DATA | chData)); +;|*** +;|*** WRITE_PORT_UCHAR(IoPortBase + PAR_PORT_CTRL, PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE); +; Line 282 + *** 0001b8 b8 03 00 mov ax,3 + *** 0001bb ba 7a 03 mov dx,890 ;037aH + *** 0001be ee out dx, al + +;|*** +;|*** WRITE_PORT_UCHAR(IoPortBase + PAR_PORT_DATA, chData); +; Line 284 + *** 0001bf 8a 46 04 mov al,BYTE PTR [bp+4] ;chData + *** 0001c2 ba 78 03 mov dx,888 ;0378H + *** 0001c5 ee out dx, al + +;|*** +;|*** LOG_ENTRY(LOG_ENTRY_CONTROL | PAR_CTRL_AUTOFEED); +;|*** +;|*** WRITE_PORT_UCHAR(IoPortBase + PAR_PORT_CTRL, PAR_CTRL_AUTOFEED); +; Line 288 + *** 0001c6 b8 02 00 mov ax,2 + *** 0001c9 ba 7a 03 mov dx,890 ;037aH + *** 0001cc ee out dx, al + +;|*** +;|*** if (!WaitForStatus(PAR_STAT_NBUSY, PAR_STAT_NBUSY)) +; Line 290 + *** 0001cd 68 80 00 push 128 ;0080H + *** 0001d0 68 80 00 push 128 ;0080H + *** 0001d3 e8 2a fe call _WaitForStatus + *** 0001d6 8b e5 mov sp,bp + *** 0001d8 0b d0 or dx,ax + *** 0001da 74 13 je $EX368 +;|*** { +;|*** return; +;|*** } +;|*** +;|*** LOG_ENTRY(LOG_ENTRY_CONTROL | PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE); +;|*** +;|*** WRITE_PORT_UCHAR(IoPortBase + PAR_PORT_CTRL, PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE); +; Line 297 + *** 0001dc b8 03 00 mov ax,3 + *** 0001df ba 7a 03 mov dx,890 ;037aH + *** 0001e2 ee out dx, al + +;|*** +;|*** LOG_ENTRY(LOG_ENTRY_EXIT | 0); +;|*** +;|*** bLastOpWasWrite = TRUE; +; Line 301 + *** 0001e3 c7 06 00 00 01 00 mov WORD PTR _bLastOpWasWrite,1 + *** 0001e9 c7 06 02 00 00 00 mov WORD PTR _bLastOpWasWrite+2,0 +;|*** } +; Line 302 + $EX368: + *** 0001ef c9 leave + *** 0001f0 c3 ret + *** 0001f1 90 nop + +_OEMParallelPortSendByte ENDP +_TEXT ENDS +END +;|*** +;|*** #if DEBUG +;|*** #define LOG_SIZE 0x1000 +;|*** #define RW_STACK_SIZE 10 +;|*** +;|*** WCHAR wcHexDigits[16] = +;|*** { +;|*** TEXT('0'), TEXT('1'), TEXT('2'), TEXT('3'), +;|*** TEXT('4'), TEXT('5'), TEXT('6'), TEXT('7'), +;|*** TEXT('8'), TEXT('9'), TEXT('A'), TEXT('B'), +;|*** TEXT('C'), TEXT('D'), TEXT('E'), TEXT('F') +;|*** }; +;|*** +;|*** USHORT usLogBuffer[LOG_SIZE]; +;|*** int iLogHead = 0; +;|*** int iLogTail = 0; +;|*** +;|*** VOID +;|*** LogEntry(USHORT usEntry) +;|*** { +;|*** static USHORT usLastEntry; +;|*** USHORT usEntryType; +;|*** USHORT usEntryData; +;|*** +;|*** usEntryData = usEntry & LOG_ENTRY_DATA_MASK; +;|*** usEntryType = usEntry & LOG_ENTRY_TYPE_MASK; +;|*** +;|*** switch (usEntryType) +;|*** { +;|*** case LOG_ENTRY_STATUS: +;|*** if (usLastEntry == usEntry) +;|*** { +;|*** // +;|*** // Don't log duplicate status +;|*** // +;|*** return; +;|*** } +;|*** break; +;|*** +;|*** case LOG_ENTRY_EVENT: +;|*** if (usEntryData < NUMBER_LOG_EVENTS) +;|*** { +;|*** dwEventCounters[usEntryData]++; +;|*** } +;|*** break; +;|*** } +;|*** +;|*** usLastEntry = usEntry; +;|*** +;|*** usLogBuffer[iLogTail++] = usEntry; +;|*** iLogTail %= LOG_SIZE; +;|*** +;|*** if (iLogTail == iLogHead) +;|*** { +;|*** iLogHead++; +;|*** iLogHead %= LOG_SIZE; +;|*** } +;|*** } +;|*** +;|*** VOID +;|*** DumpLog(VOID) +;|*** { +;|*** // R 00 W 4F +;|*** TCHAR szPrintLine[100]; +;|*** int iLogCurrent; +;|*** PTCHAR pCurrentColumn; +;|*** int nDataItems; +;|*** USHORT usCurrentOp, usLastOp; +;|*** int iReadWriteStack[RW_STACK_SIZE]; +;|*** int i; +;|*** +;|*** pCurrentColumn = szPrintLine; +;|*** nDataItems = 0; +;|*** +;|*** usLastOp = 0; +;|*** +;|*** for (i = 0; i < RW_STACK_SIZE; i++) +;|*** { +;|*** iReadWriteStack[i] = iLogTail; +;|*** } +;|*** +;|*** for (iLogCurrent = iLogHead; iLogCurrent != iLogTail; +;|*** iLogCurrent++, iLogCurrent %= LOG_SIZE) +;|*** { +;|*** usCurrentOp = usLogBuffer[iLogCurrent] & LOG_ENTRY_TYPE_MASK; +;|*** switch (usCurrentOp) +;|*** { +;|*** case LOG_ENTRY_READ: +;|*** case LOG_ENTRY_WRITE: +;|*** if (usLastOp != usCurrentOp) +;|*** { +;|*** if (pCurrentColumn != szPrintLine) +;|*** { +;|*** memcpy(pCurrentColumn, TEXT("\r\n"), sizeof(TEXT("\r\n"))); +;|*** OutputDebugString(szPrintLine); +;|*** pCurrentColumn = szPrintLine; +;|*** } +;|*** +;|*** *pCurrentColumn++ = (TCHAR)(usLogBuffer[iLogCurrent] >> 8); +;|*** *pCurrentColumn++ = TEXT(' '); +;|*** usLastOp = usCurrentOp; +;|*** nDataItems = 0; +;|*** } +;|*** +;|*** for (i = 0; i < (RW_STACK_SIZE - 1); i++) +;|*** { +;|*** iReadWriteStack[i] = iReadWriteStack[i + 1]; +;|*** } +;|*** +;|*** iReadWriteStack[RW_STACK_SIZE - 1] = iLogCurrent; +;|*** break; +;|*** +;|*** case LOG_ENTRY_EVENT: +;|*** case LOG_ENTRY_DATA: +;|*** if (nDataItems == 25) +;|*** { +;|*** memcpy(pCurrentColumn, TEXT("\r\n"), sizeof(TEXT("\r\n"))); +;|*** OutputDebugString(szPrintLine); +;|*** pCurrentColumn = szPrintLine; +;|*** *pCurrentColumn++ = TEXT(' '); +;|*** *pCurrentColumn++ = TEXT(' '); +;|*** nDataItems = 0; +;|*** } +;|*** *pCurrentColumn++ = wcHexDigits[(usLogBuffer[iLogCurrent] >> 4) & 0x0F]; +;|*** *pCurrentColumn++ = wcHexDigits[usLogBuffer[iLogCurrent] & 0x0F]; +;|*** *pCurrentColumn++ = usCurrentOp == LOG_ENTRY_DATA ? TEXT(' ') : TEXT('!'); +;|*** nDataItems++; +;|*** break; +;|*** } +;|*** } +;|*** +;|*** if (pCurrentColumn != szPrintLine) +;|*** { +;|*** memcpy(pCurrentColumn, TEXT("\r\n"), sizeof(TEXT("\r\n"))); +;|*** OutputDebugString(szPrintLine); +;|*** pCurrentColumn = szPrintLine; +;|*** } +;|*** +;|*** nDataItems = 0; +;|*** +;|*** for (i = 0; i < RW_STACK_SIZE; i++) +;|*** { +;|*** if (iReadWriteStack[i] != iLogTail) +;|*** { +;|*** break; +;|*** } +;|*** } +;|*** +;|*** iLogCurrent = (i < RW_STACK_SIZE) ? iReadWriteStack[i] : iLogTail; +;|*** +;|*** for ( ; iLogCurrent != iLogTail; iLogCurrent++, iLogCurrent %= LOG_SIZE) +;|*** { +;|*** if (nDataItems == 16) +;|*** { +;|*** memcpy(pCurrentColumn, TEXT("\r\n"), sizeof(TEXT("\r\n"))); +;|*** OutputDebugString(szPrintLine); +;|*** pCurrentColumn = szPrintLine; +;|*** nDataItems = 0; +;|*** } +;|*** +;|*** *pCurrentColumn++ = (TCHAR)(usLogBuffer[iLogCurrent] >> 8); +;|*** +;|*** *pCurrentColumn++ = TEXT(' '); +;|*** +;|*** *pCurrentColumn++ = wcHexDigits[(usLogBuffer[iLogCurrent] >> 4) & 0x0F]; +;|*** +;|*** *pCurrentColumn++ = wcHexDigits[usLogBuffer[iLogCurrent] & 0x0F]; +;|*** +;|*** *pCurrentColumn++ = TEXT(' '); +;|*** +;|*** nDataItems++; +;|*** } +;|*** +;|*** if (pCurrentColumn != szPrintLine) +;|*** { +;|*** memcpy(pCurrentColumn, TEXT("\r\n"), sizeof(TEXT("\r\n"))); +;|*** OutputDebugString(szPrintLine); +;|*** pCurrentColumn = szPrintLine; +;|*** } +;|*** +;|*** DumpCounters(); +;|*** } +;|*** +;|*** VOID +;|*** DumpCounters(VOID) +;|*** { +;|*** int i; +;|*** +;|*** for (i = 0; i < NUMBER_LOG_EVENTS; i++) +;|*** { +;|*** if (dwEventCounters[i] != 0) +;|*** { +;|*** NKDbgPrintfW( +;|*** TEXT("%s = %d\r\n"), EventDescriptions[i], dwEventCounters[i]); +;|*** } +;|*** } +;|*** } +;|*** #endif diff --git a/DOS/LOADCEPC/mdppfs.obj b/DOS/LOADCEPC/mdppfs.obj new file mode 100644 index 0000000000000000000000000000000000000000..58a9192084fa3c4b47c811227b5df3977a69d7a6 GIT binary patch literal 2286 zcmZ`*eQZ-z6#t#q_g+87pgIPKX6eSz4P@X(1VNL1w2x`FwXEG6iwUKS0v-EG-z$Dk z6k^7TrhlLT9kPNSiJGX1F$;g_$f^UJ34%dGNQjCA9UlUQAd=Se+Ad&~o7~smJ@>qG z&ikEn?(G&EEM4n*d)I3f?cRPffJU#QuDjm~?DaN0UR&oX>Yv8g-QaAhX>@rjSQhS= zfjyO)`zHg$sZL$;MiU@AS2Vj@Jd)q%TICb#+)kI|ch>l7MB^dVxtqK`(O>KJns{1E zOTBH4weAM5>~z&KG?$k8+B~lGl0o?{GwQF9Nu(kJwLp?-*g$~UOtuWNSjoKGisE|& zz?Mf-4D8`An37M&-?TtTnNng(PzUn?6A1!at0otXd{PLze{DlR)7`zT0j)J0(t{;y z#kL*2nCfp0gmk4R?9~H$M1$Gi8xD2r>oMK$b~Sne;Xr3+u+!5M)*tT<>6n=-T@lo4 zpV5PumAl~$cCSnC84TxiKJS`d{y56cg_h zz+&FJV+?OoOkU700{iH@_)CzOF%ZwYz)9y}%hp5B+KxPk&>(A}XM=uy3NL!eygA_S z3~9QtbvNYoy*-*=xACF`lC#y_?6jt_SnGB-7|;Q+w$0}<)Ey*yTI%X+nvF#<G{)R%1uH>TS?|AHzTXF_U4Q(AB#+{ zI&4^&cV@eiGz7ZCi1J_>ntp3eO*FBOiDR+(BdoApxjAv5X6s+V^WRMTIL6J%hGp&! ztmMi%2W(A<6NQsdxLu)Yr0Upe|KZWtFd>Uh50>MrJk|1*q*}HmRa4^c-HWj8DuX}v zBz{*di8DO!Q_TrMHDB7fft|g`o?e2Cmr;liX5$skem|DtbvUsXZp5*H<(>T7gO9Nf zpW%HBGx`FbvV4SfPGErJd=-CUKihj3R{9WybQnc+1ar7b9-w#Q4?%j49hF03!L3oo zNi|fs+3m>xS09fLN*JG^3UlK&E_c=uILH-4c2F4&n{eP+(?$O5(b%$`1?=@G%IG*2 z()Xxj)ha5EFNY*DT$tmLD~v137@{2o|8qbXZrU=w#W_P3&|*5o*;o~y4ylU`8YP-a zIUsE|N<2E$0a{9N0ePG`T^dfM4v!8Or^D;0?x;TZQIhkQcT_)n;AzwOekGL+y#u@# z%kCYSeBHjKFEu-2n?JH&Fu0ufd=d>PY&O<4Sd7GKl@d?#^zmHD)5)`%Cnr2XswJ{> zIS2Ry7Sl;ArBkS(Gf?O(8fgMg(q*irs|e8zJVhpYg+zLdth9@4^cH{G9-0$h2I&!o zl{vI^aQAbyWN4d_LtFL)tpjt`kZZ&OS3{DpWSq|aEKITjp{+c!D` zdZ1va1r(p8FyiXK#w|F<{qif*wj|5ffFd%17l(y3v#em~%**H$WOZ(D4QA_w!Ml)n zBFj*g9oNo<%uYTBG?iTz&<8Y|hUq@~k{t9kmC(0TPN!%A{X!LVi9@|in~XwwkzrL1 zBR-h0GR=r=$IKi?Ca;c>3?*{0LCI*Al5KGX(ikshLEtC&6rPrIwG~Y6knPshGi_1` zIdlD->0KsdsloGBr}`i&gSSXur94ww5Z*|qjP}8`akc(avuNy literal 0 HcmV?d00001 diff --git a/DOS/LOADCEPC/mdppfs.sbr b/DOS/LOADCEPC/mdppfs.sbr new file mode 100644 index 0000000000000000000000000000000000000000..3e7b20d9f36e4c23d6e63c9f1d2f95f75033b147 GIT binary patch literal 2720 zcmZ{mYm5_B6vxlKy-0UgFo+mLqDDbQBC15W3rHrhVHnOdznMs(tnzK>U$|lT6R9i?2 z3W+V$M|P>=58%B(wp--aNkkU{J82pA##ov}fA_#ZkGCLCV$dyimj=BBeIz(!zqdV~ zb&L5zrQ6ARez#j56?1JmD;vou!iAFeLX=|m2 z!V{#X5t0ijG_8e*>;b<_vbiSZi#++^nzS|NIV2a=#GXQ~m*nCrqFZpNK`tRRg7Bl% z7Ei=T_K+GS*$>?q^$e6eo#GeJo&vuFzXrbnPlMlr-+^bq@4+85)fmYiA^rsZ0{#a6 z4*miDNouI}a2|g_c@{hep4ZggEGeBj9o{3a$m$gGtZ?H-KsIQE)TZ1v+3a=z{%V5%j@9a3}Z#xC?v=d>VWXd=q>N ze1{t4H1ue*u#I#)6E`9W+lm>PxY=H9*J~M?nuWaia{sx}N`LoSGa)S#t(!72ysi+b4r6U3P4YI#D@BL3)=Xze-j1VrGH8n=ENp={j`09Biox!Fy$4gqpKUpH!l~D}-avFLNXH^kJH=7#%dw}!a5U)T z(qrQ-jbb3rZX4x22zVq&MbcG!YeZ)?2kOIhbu^NRkemzkSY2&pB3#nFP#>zRjZB&s z<$kC~q1FTK_SOz-6UlkdkBrktjP<%&UHfodo#I61LpfAeS_y+AE`a(V)H;~0OUEaL zT^y*ZBOMvDEf!-Fe_q(MzizTJX|t6hEX5k_3v`AZmL0e3XxuW)_IB1uzo@9>HVi8hXXq8C$WusC~T27v19zk~p@lvW(_FM6t<8EKV zLtALIXfLHwZ5BRdRaJ}Fn#g&+InbH&I?Jx_knGdL)$t%KUEcH-iinL)+3nd8b-jG4 zSak9}HAO^NK1LxW$Pg~cZKPIm1VK?z@hm^*S3Ht@qzqAg!m>mvD%7z+?GDtDK#c{e zKx&1MkCWOPNRQOMKn(|K2+wGsM)2^IC`YPb5Ff~sK|_P&BY8sq@^R!mSL!D$pG2xj z(V27owo>_W4oyiB3K6a2tdcoz8)+fI!p2;o;!s%fS+3@7j?0^mwq995Dbepad3IIi zFTyGzpFzPJgkN?Yk7qxtwJOEYpC`3}e_kN9T5xjmMN+3ozC_9t@?|9d3aLGTd=(|g z*NA8F+y?o&9&(Lkc>|MnUuRi(ipk;jlG6LIAHm+P#eNr4-$T4%#0$%@>x4P1$MRCX z4?BOW6YTE;l-Z^C^+Qr!qWXm8N7r$3905;^ckyx6FMIx^u9lxxH!dtc!)E1$8B3;e zTZ7E>Dp$=IS(DIaj+{j>iRaun{3c_UQNE3j|W^#SWe-KyM;RTPqM oe@>Qf|0~w&9#uDp{|q2PHOPG!JMVvEuk7c140sUr>cidmAIP? + * -4 0 4 N-1 N N+4 + * AA5555AA
5AA50A1A + * + * Header format: + * 0 2 4 + * + * lsb msb + * + * Length is 16 bit value. It includes all fields (== N) + * Opcode is 16 bit value. Current values are: + * 0x0000 - boot (AA5555AA00000500FA5AA50A1A) + * 0x0001 - init (AA5555AA01000500F95AA50A1A) + * 0x0002 - open + * 0x0003 - close + * 0x0004 - read + * 0x0005 - write + * 0x0006 - seek + * 0x0007 - delete + * 0x0008 - findfirst + * 0x0009 - findnext + * 0x000A - rRegGet + * 0x000B - rRegOpen + * 0x000C - rRegClose + * 0x000D - rRegEnum + * + * + * Reply to a message will have the same opcode. Bit15 is set to + * indicate transmission failure. + * + * Data is stream of bytes + * + * Checksum is ~(sum of preceding N-1 bytes) + * + * Length of data is - 5 + * + */ + +CRITICAL_SECTION ppfscs; +extern int NoPPFS; // parallel port not present flag + +int read_value(int *chksum) { + int loop; + int result; + BYTE ch; + for (loop = 0; loop < sizeof(int); loop++ ) { + ch = (BYTE)OEMParallelPortGetByte(); + *chksum += ch; + ((LPBYTE)&result)[loop] = ch; + } + return result; +} + +void write_value(int val, int *chksum) { + int loop; + BYTE ch; + for (loop = 0; loop < 4; loop++) { + ch = ((LPBYTE)&val)[loop]; + *chksum += ch; + OEMParallelPortSendByte(ch); + } +} + +int read_header(int *chksum) { + if (read_value(chksum) != 0xaa5555aa) + return -1; + *chksum = 0; + return read_value(chksum); +} + +void write_header(int cmd, int *chksum) { + write_value(0xaa5555aa,chksum); + *chksum = 0; + write_value(cmd,chksum); +} + +void read_data(LPBYTE buf, int cnt, int *chksum) { + BYTE ch; + while (cnt--) { + ch = (BYTE)OEMParallelPortGetByte(); + *chksum += ch; + *buf++ = ch; + } +} + +void write_data(LPBYTE buf, int cnt, int *chksum) { + while (cnt--) { + *chksum += *buf; + OEMParallelPortSendByte(*buf++); + } +} + +/* returns TRUE if success, FALSE if failure */ +BOOL read_end(int checksum) { + BYTE b; + int tmp; + b = (BYTE)OEMParallelPortGetByte(); + if (((checksum & 0xff) != b) || + (read_value(&tmp) != 0x1a0aa55a)) + return FALSE; + return TRUE; +} + +void write_end(int checksum) { + int tmp; + BYTE ch = (BYTE)((checksum & 0xff) ^ 0xff); + OEMParallelPortSendByte(ch); + write_value(0x1a0aa55a,&tmp); /* Write out end of message signature */ +} + +int rlseek(int fd, int off, int mode) { + int chksum, result; + + EnterCriticalSection(&ppfscs); + if (NoPPFS) + { + LeaveCriticalSection(&ppfscs); + return -1; + } + write_header(0x00110006,&chksum); /* opcode = 0x0006, length = 17 */ + write_value(fd,&chksum); + write_value(off,&chksum); + write_value(mode,&chksum); + write_end(chksum); + if (read_header(&chksum) != 0x00090006) { /* opcode = 0x0006, length = 9 */ + LeaveCriticalSection(&ppfscs); + return -1; + } + result = read_value(&chksum); + if (!read_end(chksum)) { + LeaveCriticalSection(&ppfscs); + return -1; + } + LeaveCriticalSection(&ppfscs); + return result; +} + +int rwriteshort(int fd, char *buf, int cnt) { + int chksum, result; + + write_header(0x000d0005+(cnt<<16), &chksum); /* opcode = 0x0005, length = 13 + cnt */ + write_value(fd,&chksum); + write_value(cnt,&chksum); + write_data(buf,cnt,&chksum); + write_end(chksum); + if (read_header(&chksum) != 0x00090005) /* opcode = 0x0005, length = 9 */ + return -1; + result = read_value(&chksum); + if (!read_end(chksum)) + return -1; + return result; +} + +int rwrite(int fd, char *buf, int cnt) { + int csize, fullsize; + int result, result2; + char *buf2 = buf; + if (NoPPFS) + return -1; + fullsize = cnt; + LockPages(buf,fullsize,0,0); + EnterCriticalSection(&ppfscs); + result2 = 0; + while (cnt) { + csize = ( cnt > 32*1024L ? 32*1024L : cnt); + if ((result = rwriteshort(fd,buf2,csize)) == -1) { + result2 = -1; + break; + } + result2 += result; + cnt -= csize; + buf2 += csize; + } + LeaveCriticalSection(&ppfscs); + UnlockPages(buf,fullsize); + return result2; +} + +int rreadshort(int fd, char *buf, int cnt) { + int chksum, result, size; + write_header(0x000d0004, &chksum); /* opcode = 0x0004, length = 13 */ + write_value(fd, &chksum); + write_value(cnt,&chksum); + write_end(chksum); + result = read_header(&chksum); + if ((result & 0xffff) != 0x0004) + return -1; + size = ((result >> 16) & 0xffff) - 9; /* subtract header & chksum */ + result = read_value(&chksum); + read_data(buf,size,&chksum); + if (!read_end(chksum)) + return -1; + return result; +} + +int rread(int fd, char *buf, int cnt) { + int csize, fullsize; + int result, result2; + char *buf2 = buf; + if (NoPPFS) + return -1; + fullsize = cnt; + LockPages(buf,fullsize,0,LOCKFLAG_WRITE); + EnterCriticalSection(&ppfscs); + result2 = 0; + while (cnt) { + csize = ( cnt > 32*1024L ? 32*1024L : cnt); + if ((result = rreadshort(fd,buf2,csize)) == -1) { + result2 = -1; + break; + } + result2 += result; + cnt -= csize; + buf2 += csize; + } + LeaveCriticalSection(&ppfscs); + UnlockPages(buf,fullsize); + return result2; +} + +int rclose(int fd) { + int chksum, result; + + EnterCriticalSection(&ppfscs); + if (NoPPFS) { + LeaveCriticalSection(&ppfscs); + return -1; + } + write_header(0x00090003, &chksum); /* opcode = 0x0003, length = 9 */ + write_value(fd,&chksum); + write_end(chksum); + if (read_header(&chksum) != 0x00090003) { + LeaveCriticalSection(&ppfscs); + return -1; + } + result = read_value(&chksum); + if (!read_end(chksum)) { + LeaveCriticalSection(&ppfscs); + return -1; + } + LeaveCriticalSection(&ppfscs); + return result; +} + +#define MAX_FILENAME_LEN 256 + +void SC_PPSHRestart(void) { + NoPPFS = 0; +} + +int ropen(WCHAR *name, int mode) { + int chksum, result, len; + char fname[MAX_FILENAME_LEN]; + len = strlenW(name)+1; + KUnicodeToAscii(fname,name,MAX_FILENAME_LEN); + if (NoPPFS) + return -1; + EnterCriticalSection(&ppfscs); + write_header(0x00090002 + (len<<16), &chksum); /* opcode = 0x0002, length = 9 + strlen + 1 */ + write_value(mode,&chksum); + write_data(fname,len,&chksum); + write_end(chksum); + if (read_header(&chksum) != 0x00090002) { + LeaveCriticalSection(&ppfscs); + return -1; + } + result = read_value(&chksum); + if (!read_end(chksum)) { + LeaveCriticalSection(&ppfscs); + return -1; + } + LeaveCriticalSection(&ppfscs); + return result; +} + +int rfindfirst(DWORD hFind, WCHAR *pattern, struct _finddata_t *fd) { + int chksum, result, len; + char fname[MAX_FILENAME_LEN]; + + if (NoPPFS) + return -1; + if (pattern != NULL) { + len = strlenW(pattern)+1; + KUnicodeToAscii(fname,pattern,MAX_FILENAME_LEN); + } else { + len = 0; + } + EnterCriticalSection(&ppfscs); + write_header(0x00090008 + (len<<16), &chksum); /* opcode = 0x0002, length = 9 + strlen + 1 */ + write_value(hFind,&chksum); + if (len != 0) { + write_data(fname,len,&chksum); + } + write_end(chksum); + result = read_header(&chksum); + if ((result & 0xffff) != 0x0008) + return -1; + len = ((result >> 16) & 0xffff) - 9; /* subtract header & chksum */ + result = read_value(&chksum); + if (len != 0) { + read_data((LPBYTE)fd,len,&chksum); + } + if (!read_end(chksum)) { + LeaveCriticalSection(&ppfscs); + return -1; + } + LeaveCriticalSection(&ppfscs); + return result; +} + +int rfindnext(DWORD hFind, struct _finddata_t *fd) { + int chksum, result, len; + + if (NoPPFS) + return -1; + EnterCriticalSection(&ppfscs); + write_header(0x00090009, &chksum); /* opcode = 0x0009, length = 9 */ + write_value(hFind,&chksum); + write_end(chksum); + result = read_header(&chksum); + if ((result & 0xffff) != 0x0009) + return -1; + len = ((result >> 16) & 0xffff) - 9; /* subtract header & chksum */ + result = read_value(&chksum); + if (len != 0) { + read_data((LPBYTE)fd,len,&chksum); + } + if (!read_end(chksum)) { + LeaveCriticalSection(&ppfscs); + return -1; + } + LeaveCriticalSection(&ppfscs); + return result; +} + +// Registration database access functions for kernel debug support initialization +int rRegOpen(DWORD hKey, CHAR *szName, LPDWORD lphKey) { + int chksum, len; + if (NoPPFS) + return -1; + len = strlen(szName)+1; + EnterCriticalSection(&ppfscs); + write_header(0x0009000B + (len<<16), &chksum); /* opcode = 0x000B, length = 9 + strlen + 1 */ + write_value(hKey,&chksum); + write_data(szName,len,&chksum); + write_end(chksum); + if (read_header(&chksum) != 0x0009000B) { + LeaveCriticalSection(&ppfscs); + return -1; + } + *lphKey = read_value(&chksum); + if (!read_end(chksum)) { + LeaveCriticalSection(&ppfscs); + return -1; + } + LeaveCriticalSection(&ppfscs); + return 0; +} + +int rRegClose(DWORD hKey) { + int chksum, result; + if (NoPPFS) + return -1; + EnterCriticalSection(&ppfscs); + write_header(0x0009000C, &chksum); /* opcode = 0x000C, length = 9 */ + write_value(hKey,&chksum); + write_end(chksum); + if (read_header(&chksum) != 0x0009000C) { + LeaveCriticalSection(&ppfscs); + return -1; + } + result = read_value(&chksum); + if (!read_end(chksum)) { + LeaveCriticalSection(&ppfscs); + return -1; + } + LeaveCriticalSection(&ppfscs); + return result; +} + +int rRegGet(DWORD hKey, CHAR *szName, LPDWORD lpdwType, + LPBYTE lpbData, LPDWORD lpdwSize) { + int chksum, result, len; + if (NoPPFS) + return -1; + len = strlen(szName)+1; + EnterCriticalSection(&ppfscs); + write_header(0x0009000A + (len<<16), &chksum); /* opcode = 0x000A, length = 9 + strlen + 1 */ + write_value(hKey,&chksum); + write_data(szName,len,&chksum); + write_end(chksum); + DEBUGMSG(ZONE_DEBUG,(TEXT("NKDBG: RegGet. hKey=%lu, Name=%a\r\n"), hKey, szName)); + result = read_header(&chksum); + if ((result & 0xffff) != 0x000A) + { + LeaveCriticalSection(&ppfscs); + return 0; + } + len = ((result >> 16) & 0xffff) - 9; /* subtract header & chksum */ + *lpdwType = read_value(&chksum); + *lpdwSize = len; + DEBUGMSG(ZONE_DEBUG,(TEXT("NKDBG: RegGet. Type=%lu, Size=%lu\r\n"), *lpdwType, *lpdwSize)); + read_data(lpbData,len,&chksum); + if (!read_end(chksum)) { + LeaveCriticalSection(&ppfscs); + return 0; + } + LeaveCriticalSection(&ppfscs); + return 1; +} + +int rRegEnum(DWORD hKey, DWORD dwIndex, LPBYTE lpbData, LPDWORD lpdwSize) { + int chksum, result, len; + if (NoPPFS) + return -1; + EnterCriticalSection(&ppfscs); + write_header(0x000D000D, &chksum); /* opcode = 0x000A, length = 13 */ + write_value(hKey,&chksum); + write_value(dwIndex,&chksum); + write_end(chksum); + DEBUGMSG(ZONE_DEBUG,(TEXT("NKDBG: RegEnum. hKey=%lu, Index=%u\r\n"), hKey, dwIndex)); + result = read_header(&chksum); + if ((result & 0xffff) != 0x000D) + { + LeaveCriticalSection(&ppfscs); + return -1; + } + len = ((result >> 16) & 0xffff) - 9; /* subtract header & chksum */ + result = read_value(&chksum); + *lpdwSize = len; + DEBUGMSG(ZONE_DEBUG,(TEXT("NKDBG: RegEnum. Return=%lu, Size=%lu\r\n"), result, *lpdwSize)); + read_data(lpbData,len,&chksum); + if (!read_end(chksum)) { + LeaveCriticalSection(&ppfscs); + return -1; + } + LeaveCriticalSection(&ppfscs); + return result; +} + diff --git a/DOS/LOADCEPC/ppfs.cod b/DOS/LOADCEPC/ppfs.cod new file mode 100644 index 0000000..a427719 --- /dev/null +++ b/DOS/LOADCEPC/ppfs.cod @@ -0,0 +1,2143 @@ +; Static Name Aliases +; + TITLE ppfs.c + .286p + .287 +INCLUDELIB SLIBCE +INCLUDELIB OLDNAMES.LIB +_TEXT SEGMENT WORD PUBLIC 'CODE' +_TEXT ENDS +_DATA SEGMENT WORD PUBLIC 'DATA' +_DATA ENDS +CONST SEGMENT WORD PUBLIC 'CONST' +CONST ENDS +_BSS SEGMENT WORD PUBLIC 'BSS' +_BSS ENDS +$$SYMBOLS SEGMENT BYTE PUBLIC 'DEBSYM' +$$SYMBOLS ENDS +$$TYPES SEGMENT BYTE PUBLIC 'DEBTYP' +$$TYPES ENDS +DGROUP GROUP CONST, _BSS, _DATA + ASSUME DS: DGROUP, SS: DGROUP +EXTRN _OEMParallelPortSendByte:NEAR +EXTRN _strncpy:NEAR +EXTRN _printf:NEAR +EXTRN _OEMParallelPortGetByte:NEAR +_BSS SEGMENT +COMM NEAR _ppfscs: BYTE: 2 +_BSS ENDS +EXTRN _NoPPFS:DWORD +_DATA SEGMENT +$SG562 DB 'NKDBG: RegGet. hKey=%lu, Name=%a', 0dH, 0aH, 00H +$SG564 DB 'NKDBG: RegGet. Type=%lu, Size=%lu', 0dH, 0aH, 00H +$SG580 DB 'NKDBG: RegEnum. hKey=%lu, Index=%u', 0dH, 0aH, 00H +$SG582 DB 'NKDBG: RegEnum. Return=%lu, Size=%lu', 0dH, 0aH, 00H +_DATA ENDS +_TEXT SEGMENT + ASSUME CS: _TEXT + PUBLIC _read_value +_read_value PROC NEAR +;|*** // +;|*** // Copyright (c) Microsoft Corporation. All rights reserved. +;|*** // +;|*** // +;|*** // Use of this sample source code is subject to the terms of the Microsoft +;|*** // license agreement under which you licensed this sample source code. If +;|*** // you did not accept the terms of the license agreement, you are not +;|*** // authorized to use this sample source code. For the terms of the license, +;|*** // please see the license agreement between you and Microsoft or, if applicable, +;|*** // see the LICENSE.RTF on your install media or the root of your tools installation. +;|*** // THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +;|*** // +;|*** /*++ +;|*** THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +;|*** ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +;|*** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +;|*** PARTICULAR PURPOSE. +;|*** +;|*** Module Name: +;|*** ppfs.c +;|*** +;|*** Abstract: +;|*** This file implements the NK kernel ppfs client side interface +;|*** +;|*** Notes: +;|*** --*/ +;|*** +;|*** #include "kernel.h" +;|*** +;|*** /* All strings must be <= 128 bytes including the null termination */ +;|*** +;|*** /* Message format: (assume little endians, lower address first> +;|*** * -4 0 4 N-1 N N+4 +;|*** * AA5555AA
5AA50A1A +;|*** * +;|*** * Header format: +;|*** * 0 2 4 +;|*** * +;|*** * lsb msb +;|*** * +;|*** * Length is 16 bit value. It includes all fields (== N) +;|*** * Opcode is 16 bit value. Current values are: +;|*** * 0x0000 - boot (AA5555AA00000500FA5AA50A1A) +;|*** * 0x0001 - init (AA5555AA01000500F95AA50A1A) +;|*** * 0x0002 - open +;|*** * 0x0003 - close +;|*** * 0x0004 - read +;|*** * 0x0005 - write +;|*** * 0x0006 - seek +;|*** * 0x0007 - delete +;|*** * 0x0008 - findfirst +;|*** * 0x0009 - findnext +;|*** * 0x000A - rRegGet +;|*** * 0x000B - rRegOpen +;|*** * 0x000C - rRegClose +;|*** * 0x000D - rRegEnum +;|*** * +;|*** * +;|*** * Reply to a message will have the same opcode. Bit15 is set to +;|*** * indicate transmission failure. +;|*** * +;|*** * Data is stream of bytes +;|*** * +;|*** * Checksum is ~(sum of preceding N-1 bytes) +;|*** * +;|*** * Length of data is - 5 +;|*** * +;|*** */ +;|*** +;|*** CRITICAL_SECTION ppfscs; +;|*** extern int NoPPFS; // parallel port not present flag +;|*** +;|*** int read_value(int *chksum) { +; Line 73 + *** 000000 c8 06 00 00 enter 6,0 + *** 000004 57 push di + *** 000005 56 push si +; chksum = 4 +; loop = -4 +; result = -6 +; ch = -1 + *** 000006 8d 76 fa lea si,WORD PTR [bp-6] ;result + *** 000009 8b 7e 04 mov di,WORD PTR [bp+4] ;chksum +;|*** int loop; +;|*** int result; +;|*** BYTE ch; +;|*** for (loop = 0; loop < sizeof(int); loop++ ) { +; Line 77 + $F331: +;|*** ch = (BYTE)OEMParallelPortGetByte(); +;|*** *chksum += ch; +; Line 79 + *** 00000c e8 00 00 call _OEMParallelPortGetByte + *** 00000f 88 46 ff mov BYTE PTR [bp-1],al ;ch + *** 000012 2a e4 sub ah,ah + *** 000014 2b d2 sub dx,dx + *** 000016 01 05 add WORD PTR [di],ax + *** 000018 11 55 02 adc WORD PTR [di+2],dx +;|*** ((LPBYTE)&result)[loop] = ch; +; Line 80 + *** 00001b 8a 46 ff mov al,BYTE PTR [bp-1] ;ch + *** 00001e 88 04 mov BYTE PTR [si],al + *** 000020 46 inc si + *** 000021 8d 46 fe lea ax,WORD PTR [bp-2] + *** 000024 3b f0 cmp si,ax + *** 000026 72 e4 jb $F331 +;|*** } +;|*** return result; +; Line 82 + *** 000028 8b 46 fa mov ax,WORD PTR [bp-6] ;result + *** 00002b 8b 56 fc mov dx,WORD PTR [bp-4] ;loop +;|*** } +; Line 83 + *** 00002e 5e pop si + *** 00002f 5f pop di + *** 000030 c9 leave + *** 000031 c3 ret + +_read_value ENDP + PUBLIC _write_value +_write_value PROC NEAR +;|*** +;|*** void write_value(int val, int *chksum) { +; Line 85 + *** 000032 c8 02 00 00 enter 2,0 + *** 000036 57 push di + *** 000037 56 push si +; val = 4 +; chksum = 8 +; loop = -4 +; ch = -1 + *** 000038 8d 76 04 lea si,WORD PTR [bp+4] ;val + *** 00003b 8b 7e 08 mov di,WORD PTR [bp+8] ;chksum +;|*** int loop; +;|*** BYTE ch; +;|*** for (loop = 0; loop < 4; loop++) { +; Line 88 + $F342: +;|*** ch = ((LPBYTE)&val)[loop]; +;|*** *chksum += ch; +; Line 90 + *** 00003e 8a 04 mov al,BYTE PTR [si] + *** 000040 88 46 ff mov BYTE PTR [bp-1],al ;ch + *** 000043 2a e4 sub ah,ah + *** 000045 2b d2 sub dx,dx + *** 000047 01 05 add WORD PTR [di],ax + *** 000049 11 55 02 adc WORD PTR [di+2],dx +;|*** OEMParallelPortSendByte(ch); +; Line 91 + *** 00004c 8a 46 ff mov al,BYTE PTR [bp-1] ;ch + *** 00004f 50 push ax + *** 000050 e8 00 00 call _OEMParallelPortSendByte + *** 000053 83 c4 02 add sp,2 + *** 000056 46 inc si + *** 000057 8d 46 08 lea ax,WORD PTR [bp+8] ;chksum + *** 00005a 3b f0 cmp si,ax + *** 00005c 72 e0 jb $F342 +;|*** } +;|*** } +; Line 93 + *** 00005e 5e pop si + *** 00005f 5f pop di + *** 000060 c9 leave + *** 000061 c3 ret + +_write_value ENDP + PUBLIC _read_header +_read_header PROC NEAR +;|*** +;|*** int read_header(int *chksum) { +; Line 95 + *** 000062 55 push bp + *** 000063 8b ec mov bp,sp + *** 000065 56 push si +; chksum = 4 + *** 000066 8b 76 04 mov si,WORD PTR [bp+4] ;chksum +;|*** if (read_value(chksum) != 0xaa5555aa) +; Line 96 + *** 000069 56 push si + *** 00006a e8 93 ff call _read_value + *** 00006d 83 c4 02 add sp,2 + *** 000070 3d aa 55 cmp ax,21930 ;55aaH + *** 000073 75 06 jne $L588 + *** 000075 81 fa 55 aa cmp dx,-21931 ;aa55H + *** 000079 74 07 je $I349 + $L588: +;|*** return -1; +; Line 97 + *** 00007b b8 ff ff mov ax,-1 ;ffffH + *** 00007e 99 cwd + *** 00007f 5e pop si + *** 000080 c9 leave + *** 000081 c3 ret +;|*** *chksum = 0; +; Line 98 + $I349: + *** 000082 2b c0 sub ax,ax + *** 000084 89 44 02 mov WORD PTR [si+2],ax + *** 000087 89 04 mov WORD PTR [si],ax +;|*** return read_value(chksum); +; Line 99 + *** 000089 56 push si + *** 00008a e8 73 ff call _read_value + *** 00008d 83 c4 02 add sp,2 +;|*** } +; Line 100 + *** 000090 5e pop si + *** 000091 c9 leave + *** 000092 c3 ret + *** 000093 90 nop + +_read_header ENDP + PUBLIC _write_header +_write_header PROC NEAR +;|*** +;|*** void write_header(int cmd, int *chksum) { +; Line 102 + *** 000094 55 push bp + *** 000095 8b ec mov bp,sp + *** 000097 56 push si +; cmd = 4 +; chksum = 8 + *** 000098 8b 76 08 mov si,WORD PTR [bp+8] ;chksum +;|*** write_value(0xaa5555aa,chksum); +; Line 103 + *** 00009b 56 push si + *** 00009c 68 55 aa push -21931 ;aa55H + *** 00009f 68 aa 55 push 21930 ;55aaH + *** 0000a2 e8 8d ff call _write_value + *** 0000a5 83 c4 06 add sp,6 +;|*** *chksum = 0; +; Line 104 + *** 0000a8 2b c0 sub ax,ax + *** 0000aa 89 44 02 mov WORD PTR [si+2],ax + *** 0000ad 89 04 mov WORD PTR [si],ax +;|*** write_value(cmd,chksum); +; Line 105 + *** 0000af 56 push si + *** 0000b0 ff 76 06 push WORD PTR [bp+6] + *** 0000b3 ff 76 04 push WORD PTR [bp+4] ;cmd + *** 0000b6 e8 79 ff call _write_value + *** 0000b9 83 c4 06 add sp,6 +;|*** } +; Line 106 + *** 0000bc 5e pop si + *** 0000bd c9 leave + *** 0000be c3 ret + *** 0000bf 90 nop + +_write_header ENDP + PUBLIC _read_data +_read_data PROC NEAR +;|*** +;|*** void read_data(LPBYTE buf, int cnt, int *chksum) { +; Line 108 + *** 0000c0 c8 02 00 00 enter 2,0 + *** 0000c4 57 push di + *** 0000c5 56 push si +; buf = 4 +; cnt = 6 +; chksum = 10 +; ch = -1 + *** 0000c6 8b 76 04 mov si,WORD PTR [bp+4] ;buf + *** 0000c9 8b 7e 0a mov di,WORD PTR [bp+10] ;chksum +;|*** BYTE ch; +;|*** while (cnt--) { +; Line 110 + $FC366: + *** 0000cc 8b 46 06 mov ax,WORD PTR [bp+6] ;cnt + *** 0000cf 8b 56 08 mov dx,WORD PTR [bp+8] + *** 0000d2 83 6e 06 01 sub WORD PTR [bp+6],1 ;cnt + *** 0000d6 83 5e 08 00 sbb WORD PTR [bp+8],0 + *** 0000da 0b d0 or dx,ax + *** 0000dc 74 18 je $EX363 +;|*** ch = (BYTE)OEMParallelPortGetByte(); +;|*** *chksum += ch; +; Line 112 + *** 0000de e8 00 00 call _OEMParallelPortGetByte + *** 0000e1 88 46 ff mov BYTE PTR [bp-1],al ;ch + *** 0000e4 2a e4 sub ah,ah + *** 0000e6 2b d2 sub dx,dx + *** 0000e8 01 05 add WORD PTR [di],ax + *** 0000ea 11 55 02 adc WORD PTR [di+2],dx +;|*** *buf++ = ch; +; Line 113 + *** 0000ed 8a 46 ff mov al,BYTE PTR [bp-1] ;ch + *** 0000f0 88 04 mov BYTE PTR [si],al + *** 0000f2 46 inc si +;|*** } +; Line 114 + *** 0000f3 eb d7 jmp SHORT $FC366 + *** 0000f5 90 nop +;|*** } +; Line 115 + $EX363: + *** 0000f6 5e pop si + *** 0000f7 5f pop di + *** 0000f8 c9 leave + *** 0000f9 c3 ret + +_read_data ENDP + PUBLIC _write_data +_write_data PROC NEAR +;|*** +;|*** void write_data(LPBYTE buf, int cnt, int *chksum) { +; Line 117 + *** 0000fa 55 push bp + *** 0000fb 8b ec mov bp,sp + *** 0000fd 57 push di + *** 0000fe 56 push si +; buf = 4 +; cnt = 6 +; chksum = 10 + *** 0000ff 8b 76 04 mov si,WORD PTR [bp+4] ;buf +;|*** while (cnt--) { +; Line 118 + $FC377: + *** 000102 8b 46 06 mov ax,WORD PTR [bp+6] ;cnt + *** 000105 8b 56 08 mov dx,WORD PTR [bp+8] + *** 000108 83 6e 06 01 sub WORD PTR [bp+6],1 ;cnt + *** 00010c 83 5e 08 00 sbb WORD PTR [bp+8],0 + *** 000110 0b d0 or dx,ax + *** 000112 74 1c je $EX375 +;|*** *chksum += *buf; +; Line 119 + *** 000114 8a 04 mov al,BYTE PTR [si] + *** 000116 2a e4 sub ah,ah + *** 000118 8b 5e 0a mov bx,WORD PTR [bp+10] ;chksum + *** 00011b 2b d2 sub dx,dx + *** 00011d 01 07 add WORD PTR [bx],ax + *** 00011f 11 57 02 adc WORD PTR [bx+2],dx +;|*** OEMParallelPortSendByte(*buf++); +; Line 120 + *** 000122 8b fe mov di,si + *** 000124 46 inc si + *** 000125 8a 05 mov al,BYTE PTR [di] + *** 000127 50 push ax + *** 000128 e8 00 00 call _OEMParallelPortSendByte + *** 00012b 83 c4 02 add sp,2 +;|*** } +; Line 121 + *** 00012e eb d2 jmp SHORT $FC377 +;|*** } +; Line 122 + $EX375: + *** 000130 5e pop si + *** 000131 5f pop di + *** 000132 c9 leave + *** 000133 c3 ret + +_write_data ENDP + PUBLIC _read_end +_read_end PROC NEAR +;|*** +;|*** /* returns TRUE if success, FALSE if failure */ +;|*** BOOL read_end(int checksum) { +; Line 125 + *** 000134 c8 04 00 00 enter 4,0 +; tmp = -4 +; checksum = 4 +; b = -2 +;|*** BYTE b; +;|*** int tmp; +;|*** b = (BYTE)OEMParallelPortGetByte(); +;|*** if (((checksum & 0xff) != b) || +;|*** (read_value(&tmp) != 0x1a0aa55a)) +; Line 130 + *** 000138 e8 00 00 call _OEMParallelPortGetByte + *** 00013b 2a e4 sub ah,ah + *** 00013d 8a 4e 04 mov cl,BYTE PTR [bp+4] ;checksum + *** 000140 2a ed sub ch,ch + *** 000142 3b c1 cmp ax,cx + *** 000144 75 1c jne $I386 + *** 000146 8d 46 fc lea ax,WORD PTR [bp-4] ;tmp + *** 000149 50 push ax + *** 00014a e8 b3 fe call _read_value + *** 00014d 83 c4 02 add sp,2 + *** 000150 3d 5a a5 cmp ax,-23206 ;a55aH + *** 000153 75 0d jne $I386 + *** 000155 81 fa 0a 1a cmp dx,6666 ;1a0aH + *** 000159 75 07 jne $I386 +;|*** return FALSE; +;|*** return TRUE; +; Line 132 + *** 00015b b8 01 00 mov ax,1 + *** 00015e 33 d2 xor dx,dx + *** 000160 c9 leave + *** 000161 c3 ret +;|*** (read_value(&tmp) != 0x1a0aa55a)) +; Line 130 + $I386: +;|*** return FALSE; +; Line 131 + *** 000162 33 c0 xor ax,ax + *** 000164 33 d2 xor dx,dx +;|*** return TRUE; +;|*** } +; Line 133 + *** 000166 c9 leave + *** 000167 c3 ret + +_read_end ENDP + PUBLIC _write_end +_write_end PROC NEAR +;|*** +;|*** void write_end(int checksum) { +; Line 135 + *** 000168 c8 04 00 00 enter 4,0 +; checksum = 4 +; tmp = -4 +; ch = -6 +;|*** int tmp; +;|*** BYTE ch = (BYTE)((checksum & 0xff) ^ 0xff); +;|*** OEMParallelPortSendByte(ch); +; Line 138 + *** 00016c 8a 46 04 mov al,BYTE PTR [bp+4] ;checksum + *** 00016f f6 d0 not al + *** 000171 50 push ax + *** 000172 e8 00 00 call _OEMParallelPortSendByte + *** 000175 83 c4 02 add sp,2 +;|*** write_value(0x1a0aa55a,&tmp); /* Write out end of message signature */ +; Line 139 + *** 000178 8d 46 fc lea ax,WORD PTR [bp-4] ;tmp + *** 00017b 50 push ax + *** 00017c 68 0a 1a push 6666 ;1a0aH + *** 00017f 68 5a a5 push -23206 ;a55aH + *** 000182 e8 ad fe call _write_value +;|*** } +; Line 140 + *** 000185 c9 leave + *** 000186 c3 ret + *** 000187 90 nop + +_write_end ENDP + PUBLIC _rlseek +_rlseek PROC NEAR +;|*** +;|*** int rlseek(int fd, int off, int mode) { +; Line 142 + *** 000188 c8 08 00 00 enter 8,0 +; fd = 4 +; off = 8 +; mode = 12 +; chksum = -8 +; result = -4 +;|*** int chksum, result; +;|*** +;|*** EnterCriticalSection(&ppfscs); +;|*** if (NoPPFS) +; Line 146 + *** 00018c a1 02 00 mov ax,WORD PTR _NoPPFS+2 + *** 00018f 0b 06 00 00 or ax,WORD PTR _NoPPFS + *** 000193 74 07 je $I403 +;|*** { +;|*** LeaveCriticalSection(&ppfscs); +;|*** return -1; +; Line 149 + $L620: + *** 000195 b8 ff ff mov ax,-1 ;ffffH + *** 000198 99 cwd + *** 000199 c9 leave + *** 00019a c3 ret + *** 00019b 90 nop +;|*** } +;|*** write_header(0x00110006,&chksum); /* opcode = 0x0006, length = 17 */ +; Line 151 + $I403: + *** 00019c 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 00019f 50 push ax + *** 0001a0 6a 11 push 17 ;0011H + *** 0001a2 6a 06 push 6 + *** 0001a4 e8 ed fe call _write_header + *** 0001a7 83 c4 06 add sp,6 +;|*** write_value(fd,&chksum); +; Line 152 + *** 0001aa 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 0001ad 50 push ax + *** 0001ae ff 76 06 push WORD PTR [bp+6] + *** 0001b1 ff 76 04 push WORD PTR [bp+4] ;fd + *** 0001b4 e8 7b fe call _write_value + *** 0001b7 83 c4 06 add sp,6 +;|*** write_value(off,&chksum); +; Line 153 + *** 0001ba 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 0001bd 50 push ax + *** 0001be ff 76 0a push WORD PTR [bp+10] + *** 0001c1 ff 76 08 push WORD PTR [bp+8] ;off + *** 0001c4 e8 6b fe call _write_value + *** 0001c7 83 c4 06 add sp,6 +;|*** write_value(mode,&chksum); +; Line 154 + *** 0001ca 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 0001cd 50 push ax + *** 0001ce ff 76 0e push WORD PTR [bp+14] + *** 0001d1 ff 76 0c push WORD PTR [bp+12] ;mode + *** 0001d4 e8 5b fe call _write_value + *** 0001d7 83 c4 06 add sp,6 +;|*** write_end(chksum); +; Line 155 + *** 0001da ff 76 fa push WORD PTR [bp-6] + *** 0001dd ff 76 f8 push WORD PTR [bp-8] ;chksum + *** 0001e0 e8 85 ff call _write_end + *** 0001e3 83 c4 04 add sp,4 +;|*** if (read_header(&chksum) != 0x00090006) { /* opcode = 0x0006, length = 9 */ +; Line 156 + *** 0001e6 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 0001e9 50 push ax + *** 0001ea e8 75 fe call _read_header + *** 0001ed 83 c4 02 add sp,2 + *** 0001f0 3d 06 00 cmp ax,6 + *** 0001f3 75 a0 jne $L620 + *** 0001f5 83 fa 09 cmp dx,9 + *** 0001f8 75 9b jne $L620 +;|*** LeaveCriticalSection(&ppfscs); +;|*** return -1; +;|*** } +;|*** result = read_value(&chksum); +; Line 160 + *** 0001fa 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 0001fd 50 push ax + *** 0001fe e8 ff fd call _read_value + *** 000201 83 c4 02 add sp,2 + *** 000204 89 46 fc mov WORD PTR [bp-4],ax ;result + *** 000207 89 56 fe mov WORD PTR [bp-2],dx +;|*** if (!read_end(chksum)) { +; Line 161 + *** 00020a ff 76 fa push WORD PTR [bp-6] + *** 00020d ff 76 f8 push WORD PTR [bp-8] ;chksum + *** 000210 e8 21 ff call _read_end + *** 000213 83 c4 04 add sp,4 + *** 000216 0b d0 or dx,ax + *** 000218 75 03 jne $JCC536 + *** 00021a e9 78 ff jmp $L620 + $JCC536: + *** 00021d 8b 46 fc mov ax,WORD PTR [bp-4] ;result + *** 000220 8b 56 fe mov dx,WORD PTR [bp-2] +;|*** LeaveCriticalSection(&ppfscs); +;|*** return -1; +;|*** } +;|*** LeaveCriticalSection(&ppfscs); +;|*** return result; +;|*** } +; Line 167 + *** 000223 c9 leave + *** 000224 c3 ret + *** 000225 90 nop + +_rlseek ENDP + PUBLIC _rwriteshort +_rwriteshort PROC NEAR +;|*** +;|*** int rwriteshort(int fd, char *buf, int cnt) { +; Line 169 + *** 000226 c8 08 00 00 enter 8,0 +; fd = 4 +; buf = 8 +; cnt = 10 +; chksum = -8 +; result = -4 +;|*** int chksum, result; +;|*** +;|*** write_header(0x000d0005+(cnt<<16), &chksum); /* opcode = 0x0005, length = 13 + cnt */ +; Line 172 + *** 00022a 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 00022d 50 push ax + *** 00022e 8b 4e 0a mov cx,WORD PTR [bp+10] ;cnt + *** 000231 8b d9 mov bx,cx + *** 000233 2b d2 sub dx,dx + *** 000235 83 c2 05 add dx,5 + *** 000238 83 d3 0d adc bx,13 ;000dH + *** 00023b 53 push bx + *** 00023c 52 push dx + *** 00023d e8 54 fe call _write_header + *** 000240 83 c4 06 add sp,6 +;|*** write_value(fd,&chksum); +; Line 173 + *** 000243 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 000246 50 push ax + *** 000247 ff 76 06 push WORD PTR [bp+6] + *** 00024a ff 76 04 push WORD PTR [bp+4] ;fd + *** 00024d e8 e2 fd call _write_value + *** 000250 83 c4 06 add sp,6 +;|*** write_value(cnt,&chksum); +; Line 174 + *** 000253 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 000256 50 push ax + *** 000257 ff 76 0c push WORD PTR [bp+12] + *** 00025a ff 76 0a push WORD PTR [bp+10] ;cnt + *** 00025d e8 d2 fd call _write_value + *** 000260 83 c4 06 add sp,6 +;|*** write_data(buf,cnt,&chksum); +; Line 175 + *** 000263 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 000266 50 push ax + *** 000267 ff 76 0c push WORD PTR [bp+12] + *** 00026a ff 76 0a push WORD PTR [bp+10] ;cnt + *** 00026d ff 76 08 push WORD PTR [bp+8] ;buf + *** 000270 e8 87 fe call _write_data + *** 000273 83 c4 08 add sp,8 +;|*** write_end(chksum); +; Line 176 + *** 000276 ff 76 fa push WORD PTR [bp-6] + *** 000279 ff 76 f8 push WORD PTR [bp-8] ;chksum + *** 00027c e8 e9 fe call _write_end + *** 00027f 83 c4 04 add sp,4 +;|*** if (read_header(&chksum) != 0x00090005) /* opcode = 0x0005, length = 9 */ +; Line 177 + *** 000282 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 000285 50 push ax + *** 000286 e8 d9 fd call _read_header + *** 000289 83 c4 02 add sp,2 + *** 00028c 3d 05 00 cmp ax,5 + *** 00028f 75 05 jne $L594 + *** 000291 83 fa 09 cmp dx,9 + *** 000294 74 06 je $I416 + $L594: +;|*** return -1; +; Line 178 + *** 000296 b8 ff ff mov ax,-1 ;ffffH + *** 000299 99 cwd + *** 00029a c9 leave + *** 00029b c3 ret +;|*** result = read_value(&chksum); +; Line 179 + $I416: + *** 00029c 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 00029f 50 push ax + *** 0002a0 e8 5d fd call _read_value + *** 0002a3 83 c4 02 add sp,2 + *** 0002a6 89 46 fc mov WORD PTR [bp-4],ax ;result + *** 0002a9 89 56 fe mov WORD PTR [bp-2],dx +;|*** if (!read_end(chksum)) +; Line 180 + *** 0002ac ff 76 fa push WORD PTR [bp-6] + *** 0002af ff 76 f8 push WORD PTR [bp-8] ;chksum + *** 0002b2 e8 7f fe call _read_end + *** 0002b5 83 c4 04 add sp,4 + *** 0002b8 0b d0 or dx,ax + *** 0002ba 74 da je $L594 + *** 0002bc 8b 46 fc mov ax,WORD PTR [bp-4] ;result + *** 0002bf 8b 56 fe mov dx,WORD PTR [bp-2] +;|*** return -1; +;|*** return result; +;|*** } +; Line 183 + *** 0002c2 c9 leave + *** 0002c3 c3 ret + +_rwriteshort ENDP + PUBLIC _rwrite +_rwrite PROC NEAR +;|*** +;|*** int rwrite(int fd, char *buf, int cnt) { +; Line 185 + *** 0002c4 c8 0c 00 00 enter 12,0 + *** 0002c8 56 push si +; fd = 4 +; buf = 8 +; cnt = 10 +; csize = -4 +; fullsize = -8 +; result = -8 +; result2 = -12 +; register si = buf2 +;|*** int csize, fullsize; +;|*** int result, result2; +;|*** char *buf2 = buf; +; Line 188 + *** 0002c9 8b 76 08 mov si,WORD PTR [bp+8] ;buf +;|*** if (NoPPFS) +; Line 189 + *** 0002cc a1 02 00 mov ax,WORD PTR _NoPPFS+2 + *** 0002cf 0b 06 00 00 or ax,WORD PTR _NoPPFS + *** 0002d3 74 07 je $I431 +;|*** return -1; +; Line 190 + *** 0002d5 b8 ff ff mov ax,-1 ;ffffH + *** 0002d8 99 cwd + *** 0002d9 5e pop si + *** 0002da c9 leave + *** 0002db c3 ret +;|*** fullsize = cnt; +; Line 191 + $I431: +;|*** LockPages(buf,fullsize,0,0); +;|*** EnterCriticalSection(&ppfscs); +;|*** result2 = 0; +; Line 194 + *** 0002dc 2b c0 sub ax,ax + *** 0002de 89 46 f6 mov WORD PTR [bp-10],ax + *** 0002e1 89 46 f4 mov WORD PTR [bp-12],ax ;result2 +;|*** while (cnt) { +; Line 195 + *** 0002e4 8b 46 0c mov ax,WORD PTR [bp+12] + *** 0002e7 0b 46 0a or ax,WORD PTR [bp+10] ;cnt + *** 0002ea 74 5c je $FB434 + $FC433: +;|*** csize = ( cnt > 32*1024L ? 32*1024L : cnt); +;|*** if ((result = rwriteshort(fd,buf2,csize)) == -1) { +; Line 197 + *** 0002ec 8b 46 0a mov ax,WORD PTR [bp+10] ;cnt + *** 0002ef 8b 56 0c mov dx,WORD PTR [bp+12] + *** 0002f2 0b d2 or dx,dx + *** 0002f4 7c 0c jl $L598 + *** 0002f6 7f 05 jg $L599 + *** 0002f8 3d 00 80 cmp ax,-32768 ;8000H + *** 0002fb 76 05 jbe $L598 + $L599: + *** 0002fd 33 d2 xor dx,dx + *** 0002ff b8 00 80 mov ax,-32768 ;8000H + $L598: + *** 000302 89 46 fc mov WORD PTR [bp-4],ax ;csize + *** 000305 89 56 fe mov WORD PTR [bp-2],dx + *** 000308 52 push dx + *** 000309 50 push ax + *** 00030a 56 push si + *** 00030b ff 76 06 push WORD PTR [bp+6] + *** 00030e ff 76 04 push WORD PTR [bp+4] ;fd + *** 000311 e8 12 ff call _rwriteshort + *** 000314 83 c4 0a add sp,10 ;000aH + *** 000317 3d ff ff cmp ax,-1 ;ffffH + *** 00031a 75 04 jne $L600 + *** 00031c 3b d0 cmp dx,ax + *** 00031e 74 1e je $L596 + $L600: +;|*** result2 = -1; +;|*** break; +;|*** } +;|*** result2 += result; +; Line 201 + *** 000320 01 46 f4 add WORD PTR [bp-12],ax ;result2 + *** 000323 11 56 f6 adc WORD PTR [bp-10],dx +;|*** cnt -= csize; +;|*** buf2 += csize; +; Line 203 + *** 000326 8b 46 fc mov ax,WORD PTR [bp-4] ;csize + *** 000329 03 f0 add si,ax +;|*** } +; Line 204 + *** 00032b 8b 56 fe mov dx,WORD PTR [bp-2] + *** 00032e 29 46 0a sub WORD PTR [bp+10],ax ;cnt + *** 000331 19 56 0c sbb WORD PTR [bp+12],dx + *** 000334 8b 46 0c mov ax,WORD PTR [bp+12] + *** 000337 0b 46 0a or ax,WORD PTR [bp+10] ;cnt + *** 00033a 75 b0 jne $FC433 + *** 00033c eb 0a jmp SHORT $FB434 + $L596: +;|*** result2 = -1; +; Line 198 + *** 00033e c7 46 f4 ff ff mov WORD PTR [bp-12],-1 ;ffffH ;result2 + *** 000343 c7 46 f6 ff ff mov WORD PTR [bp-10],-1 ;ffffH +;|*** break; +;|*** } +;|*** result2 += result; +;|*** cnt -= csize; +;|*** buf2 += csize; +;|*** } +; Line 204 + $FB434: +;|*** LeaveCriticalSection(&ppfscs); +;|*** UnlockPages(buf,fullsize); +;|*** return result2; +; Line 207 + *** 000348 8b 46 f4 mov ax,WORD PTR [bp-12] ;result2 + *** 00034b 8b 56 f6 mov dx,WORD PTR [bp-10] +;|*** } +; Line 208 + *** 00034e 5e pop si + *** 00034f c9 leave + *** 000350 c3 ret + *** 000351 90 nop + +_rwrite ENDP + PUBLIC _rreadshort +_rreadshort PROC NEAR +;|*** +;|*** int rreadshort(int fd, char *buf, int cnt) { +; Line 210 + *** 000352 c8 0c 00 00 enter 12,0 +; fd = 4 +; buf = 8 +; cnt = 10 +; chksum = -12 +; result = -4 +; size = -8 +;|*** int chksum, result, size; +;|*** write_header(0x000d0004, &chksum); /* opcode = 0x0004, length = 13 */ +; Line 212 + *** 000356 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 000359 50 push ax + *** 00035a 6a 0d push 13 ;000dH + *** 00035c 6a 04 push 4 + *** 00035e e8 33 fd call _write_header + *** 000361 83 c4 06 add sp,6 +;|*** write_value(fd, &chksum); +; Line 213 + *** 000364 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 000367 50 push ax + *** 000368 ff 76 06 push WORD PTR [bp+6] + *** 00036b ff 76 04 push WORD PTR [bp+4] ;fd + *** 00036e e8 c1 fc call _write_value + *** 000371 83 c4 06 add sp,6 +;|*** write_value(cnt,&chksum); +; Line 214 + *** 000374 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 000377 50 push ax + *** 000378 ff 76 0c push WORD PTR [bp+12] + *** 00037b ff 76 0a push WORD PTR [bp+10] ;cnt + *** 00037e e8 b1 fc call _write_value + *** 000381 83 c4 06 add sp,6 +;|*** write_end(chksum); +; Line 215 + *** 000384 ff 76 f6 push WORD PTR [bp-10] + *** 000387 ff 76 f4 push WORD PTR [bp-12] ;chksum + *** 00038a e8 db fd call _write_end + *** 00038d 83 c4 04 add sp,4 +;|*** result = read_header(&chksum); +;|*** if ((result & 0xffff) != 0x0004) +; Line 217 + *** 000390 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 000393 50 push ax + *** 000394 e8 cb fc call _read_header + *** 000397 83 c4 02 add sp,2 + *** 00039a 89 46 fc mov WORD PTR [bp-4],ax ;result + *** 00039d 89 56 fe mov WORD PTR [bp-2],dx + *** 0003a0 3d 04 00 cmp ax,4 + *** 0003a3 74 07 je $I447 +;|*** return -1; +; Line 218 + $L622: + *** 0003a5 b8 ff ff mov ax,-1 ;ffffH + *** 0003a8 99 cwd + *** 0003a9 c9 leave + *** 0003aa c3 ret + *** 0003ab 90 nop +;|*** size = ((result >> 16) & 0xffff) - 9; /* subtract header & chksum */ +; Line 219 + $I447: + *** 0003ac 8b c2 mov ax,dx + *** 0003ae 2b d2 sub dx,dx + *** 0003b0 2d 09 00 sub ax,9 + *** 0003b3 1b d2 sbb dx,dx + *** 0003b5 89 46 f8 mov WORD PTR [bp-8],ax ;size + *** 0003b8 89 56 fa mov WORD PTR [bp-6],dx +;|*** result = read_value(&chksum); +; Line 220 + *** 0003bb 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 0003be 50 push ax + *** 0003bf e8 3e fc call _read_value + *** 0003c2 83 c4 02 add sp,2 + *** 0003c5 89 46 fc mov WORD PTR [bp-4],ax ;result + *** 0003c8 89 56 fe mov WORD PTR [bp-2],dx +;|*** read_data(buf,size,&chksum); +; Line 221 + *** 0003cb 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 0003ce 50 push ax + *** 0003cf ff 76 fa push WORD PTR [bp-6] + *** 0003d2 ff 76 f8 push WORD PTR [bp-8] ;size + *** 0003d5 ff 76 08 push WORD PTR [bp+8] ;buf + *** 0003d8 e8 e5 fc call _read_data + *** 0003db 83 c4 08 add sp,8 +;|*** if (!read_end(chksum)) +; Line 222 + *** 0003de ff 76 f6 push WORD PTR [bp-10] + *** 0003e1 ff 76 f4 push WORD PTR [bp-12] ;chksum + *** 0003e4 e8 4d fd call _read_end + *** 0003e7 83 c4 04 add sp,4 + *** 0003ea 0b d0 or dx,ax + *** 0003ec 74 b7 je $L622 + *** 0003ee 8b 46 fc mov ax,WORD PTR [bp-4] ;result + *** 0003f1 8b 56 fe mov dx,WORD PTR [bp-2] +;|*** return -1; +;|*** return result; +;|*** } +; Line 225 + *** 0003f4 c9 leave + *** 0003f5 c3 ret + +_rreadshort ENDP + PUBLIC _rread +_rread PROC NEAR +;|*** +;|*** int rread(int fd, char *buf, int cnt) { +; Line 227 + *** 0003f6 c8 0c 00 00 enter 12,0 + *** 0003fa 56 push si +; fd = 4 +; buf = 8 +; cnt = 10 +; csize = -4 +; fullsize = -8 +; result = -8 +; result2 = -12 +; register si = buf2 +;|*** int csize, fullsize; +;|*** int result, result2; +;|*** char *buf2 = buf; +; Line 230 + *** 0003fb 8b 76 08 mov si,WORD PTR [bp+8] ;buf +;|*** if (NoPPFS) +; Line 231 + *** 0003fe a1 02 00 mov ax,WORD PTR _NoPPFS+2 + *** 000401 0b 06 00 00 or ax,WORD PTR _NoPPFS + *** 000405 74 07 je $I462 +;|*** return -1; +; Line 232 + *** 000407 b8 ff ff mov ax,-1 ;ffffH + *** 00040a 99 cwd + *** 00040b 5e pop si + *** 00040c c9 leave + *** 00040d c3 ret +;|*** fullsize = cnt; +; Line 233 + $I462: +;|*** LockPages(buf,fullsize,0,LOCKFLAG_WRITE); +;|*** EnterCriticalSection(&ppfscs); +;|*** result2 = 0; +; Line 236 + *** 00040e 2b c0 sub ax,ax + *** 000410 89 46 f6 mov WORD PTR [bp-10],ax + *** 000413 89 46 f4 mov WORD PTR [bp-12],ax ;result2 +;|*** while (cnt) { +; Line 237 + *** 000416 8b 46 0c mov ax,WORD PTR [bp+12] + *** 000419 0b 46 0a or ax,WORD PTR [bp+10] ;cnt + *** 00041c 74 5c je $FB465 + $FC464: +;|*** csize = ( cnt > 32*1024L ? 32*1024L : cnt); +;|*** if ((result = rreadshort(fd,buf2,csize)) == -1) { +; Line 239 + *** 00041e 8b 46 0a mov ax,WORD PTR [bp+10] ;cnt + *** 000421 8b 56 0c mov dx,WORD PTR [bp+12] + *** 000424 0b d2 or dx,dx + *** 000426 7c 0c jl $L605 + *** 000428 7f 05 jg $L606 + *** 00042a 3d 00 80 cmp ax,-32768 ;8000H + *** 00042d 76 05 jbe $L605 + $L606: + *** 00042f 33 d2 xor dx,dx + *** 000431 b8 00 80 mov ax,-32768 ;8000H + $L605: + *** 000434 89 46 fc mov WORD PTR [bp-4],ax ;csize + *** 000437 89 56 fe mov WORD PTR [bp-2],dx + *** 00043a 52 push dx + *** 00043b 50 push ax + *** 00043c 56 push si + *** 00043d ff 76 06 push WORD PTR [bp+6] + *** 000440 ff 76 04 push WORD PTR [bp+4] ;fd + *** 000443 e8 0c ff call _rreadshort + *** 000446 83 c4 0a add sp,10 ;000aH + *** 000449 3d ff ff cmp ax,-1 ;ffffH + *** 00044c 75 04 jne $L607 + *** 00044e 3b d0 cmp dx,ax + *** 000450 74 1e je $L603 + $L607: +;|*** result2 = -1; +;|*** break; +;|*** } +;|*** result2 += result; +; Line 243 + *** 000452 01 46 f4 add WORD PTR [bp-12],ax ;result2 + *** 000455 11 56 f6 adc WORD PTR [bp-10],dx +;|*** cnt -= csize; +;|*** buf2 += csize; +; Line 245 + *** 000458 8b 46 fc mov ax,WORD PTR [bp-4] ;csize + *** 00045b 03 f0 add si,ax +;|*** } +; Line 246 + *** 00045d 8b 56 fe mov dx,WORD PTR [bp-2] + *** 000460 29 46 0a sub WORD PTR [bp+10],ax ;cnt + *** 000463 19 56 0c sbb WORD PTR [bp+12],dx + *** 000466 8b 46 0c mov ax,WORD PTR [bp+12] + *** 000469 0b 46 0a or ax,WORD PTR [bp+10] ;cnt + *** 00046c 75 b0 jne $FC464 + *** 00046e eb 0a jmp SHORT $FB465 + $L603: +;|*** result2 = -1; +; Line 240 + *** 000470 c7 46 f4 ff ff mov WORD PTR [bp-12],-1 ;ffffH ;result2 + *** 000475 c7 46 f6 ff ff mov WORD PTR [bp-10],-1 ;ffffH +;|*** break; +;|*** } +;|*** result2 += result; +;|*** cnt -= csize; +;|*** buf2 += csize; +;|*** } +; Line 246 + $FB465: +;|*** LeaveCriticalSection(&ppfscs); +;|*** UnlockPages(buf,fullsize); +;|*** return result2; +; Line 249 + *** 00047a 8b 46 f4 mov ax,WORD PTR [bp-12] ;result2 + *** 00047d 8b 56 f6 mov dx,WORD PTR [bp-10] +;|*** } +; Line 250 + *** 000480 5e pop si + *** 000481 c9 leave + *** 000482 c3 ret + *** 000483 90 nop + +_rread ENDP + PUBLIC _rclose +_rclose PROC NEAR +;|*** +;|*** int rclose(int fd) { +; Line 252 + *** 000484 c8 08 00 00 enter 8,0 +; fd = 4 +; chksum = -8 +; result = -4 +;|*** int chksum, result; +;|*** +;|*** EnterCriticalSection(&ppfscs); +;|*** if (NoPPFS) { +; Line 256 + *** 000488 a1 02 00 mov ax,WORD PTR _NoPPFS+2 + *** 00048b 0b 06 00 00 or ax,WORD PTR _NoPPFS + *** 00048f 74 07 je $I473 +;|*** LeaveCriticalSection(&ppfscs); +;|*** return -1; +; Line 258 + $L623: + *** 000491 b8 ff ff mov ax,-1 ;ffffH + *** 000494 99 cwd + *** 000495 c9 leave + *** 000496 c3 ret + *** 000497 90 nop +;|*** } +;|*** write_header(0x00090003, &chksum); /* opcode = 0x0003, length = 9 */ +; Line 260 + $I473: + *** 000498 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 00049b 50 push ax + *** 00049c 6a 09 push 9 + *** 00049e 6a 03 push 3 + *** 0004a0 e8 f1 fb call _write_header + *** 0004a3 83 c4 06 add sp,6 +;|*** write_value(fd,&chksum); +; Line 261 + *** 0004a6 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 0004a9 50 push ax + *** 0004aa ff 76 06 push WORD PTR [bp+6] + *** 0004ad ff 76 04 push WORD PTR [bp+4] ;fd + *** 0004b0 e8 7f fb call _write_value + *** 0004b3 83 c4 06 add sp,6 +;|*** write_end(chksum); +; Line 262 + *** 0004b6 ff 76 fa push WORD PTR [bp-6] + *** 0004b9 ff 76 f8 push WORD PTR [bp-8] ;chksum + *** 0004bc e8 a9 fc call _write_end + *** 0004bf 83 c4 04 add sp,4 +;|*** if (read_header(&chksum) != 0x00090003) { +; Line 263 + *** 0004c2 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 0004c5 50 push ax + *** 0004c6 e8 99 fb call _read_header + *** 0004c9 83 c4 02 add sp,2 + *** 0004cc 3d 03 00 cmp ax,3 + *** 0004cf 75 c0 jne $L623 + *** 0004d1 83 fa 09 cmp dx,9 + *** 0004d4 75 bb jne $L623 +;|*** LeaveCriticalSection(&ppfscs); +;|*** return -1; +;|*** } +;|*** result = read_value(&chksum); +; Line 267 + *** 0004d6 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 0004d9 50 push ax + *** 0004da e8 23 fb call _read_value + *** 0004dd 83 c4 02 add sp,2 + *** 0004e0 89 46 fc mov WORD PTR [bp-4],ax ;result + *** 0004e3 89 56 fe mov WORD PTR [bp-2],dx +;|*** if (!read_end(chksum)) { +; Line 268 + *** 0004e6 ff 76 fa push WORD PTR [bp-6] + *** 0004e9 ff 76 f8 push WORD PTR [bp-8] ;chksum + *** 0004ec e8 45 fc call _read_end + *** 0004ef 83 c4 04 add sp,4 + *** 0004f2 0b d0 or dx,ax + *** 0004f4 74 9b je $L623 + *** 0004f6 8b 46 fc mov ax,WORD PTR [bp-4] ;result + *** 0004f9 8b 56 fe mov dx,WORD PTR [bp-2] +;|*** LeaveCriticalSection(&ppfscs); +;|*** return -1; +;|*** } +;|*** LeaveCriticalSection(&ppfscs); +;|*** return result; +;|*** } +; Line 274 + *** 0004fc c9 leave + *** 0004fd c3 ret + +_rclose ENDP + PUBLIC _SC_PPSHRestart +_SC_PPSHRestart PROC NEAR +;|*** +;|*** #define MAX_FILENAME_LEN 256 +;|*** +;|*** void SC_PPSHRestart(void) { +;|*** NoPPFS = 0; +; Line 279 + *** 0004fe 2b c0 sub ax,ax + *** 000500 a3 02 00 mov WORD PTR _NoPPFS+2,ax + *** 000503 a3 00 00 mov WORD PTR _NoPPFS,ax +;|*** } +; Line 280 + *** 000506 c3 ret + *** 000507 90 nop + +_SC_PPSHRestart ENDP + PUBLIC _ropen +_ropen PROC NEAR +;|*** +;|*** int ropen(WCHAR *name, int mode) { +; Line 282 + *** 000508 c8 08 01 00 enter 264,0 + *** 00050c 57 push di + *** 00050d 56 push si +; name = 4 +; mode = 6 +; chksum = -8 +; result = -4 +; len = -4 +; fname = -264 + *** 00050e 8b 76 04 mov si,WORD PTR [bp+4] ;name +;|*** int chksum, result, len; +;|*** char fname[MAX_FILENAME_LEN]; +;|*** len = strlenW(name)+1; +; Line 285 + *** 000511 8b fe mov di,si + *** 000513 8c d8 mov ax,ds + *** 000515 8e c0 mov es,ax + *** 000517 b9 ff ff mov cx,-1 ;ffffH + *** 00051a 33 c0 xor ax,ax + *** 00051c f2 repnz + *** 00051d ae scasb + *** 00051e f7 d1 not cx + *** 000520 89 4e fc mov WORD PTR [bp-4],cx ;result + *** 000523 89 46 fe mov WORD PTR [bp-2],ax +;|*** KUnicodeToAscii(fname,name,MAX_FILENAME_LEN); +; Line 286 + *** 000526 68 00 01 push 256 ;0100H + *** 000529 56 push si + *** 00052a 8d 86 f8 fe lea ax,WORD PTR [bp-264] ;fname + *** 00052e 50 push ax + *** 00052f e8 00 00 call _strncpy + *** 000532 83 c4 06 add sp,6 +;|*** if (NoPPFS) +; Line 287 + *** 000535 a1 02 00 mov ax,WORD PTR _NoPPFS+2 + *** 000538 0b 06 00 00 or ax,WORD PTR _NoPPFS + *** 00053c 74 08 je $I488 +;|*** return -1; +; Line 288 + $L624: + *** 00053e b8 ff ff mov ax,-1 ;ffffH + *** 000541 99 cwd + *** 000542 5e pop si + *** 000543 5f pop di + *** 000544 c9 leave + *** 000545 c3 ret +;|*** EnterCriticalSection(&ppfscs); +; Line 289 + $I488: +;|*** write_header(0x00090002 + (len<<16), &chksum); /* opcode = 0x0002, length = 9 + strlen + 1 */ +; Line 290 + *** 000546 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 000549 50 push ax + *** 00054a 8b 4e fc mov cx,WORD PTR [bp-4] ;result + *** 00054d 8b d9 mov bx,cx + *** 00054f 2b d2 sub dx,dx + *** 000551 83 c2 02 add dx,2 + *** 000554 83 d3 09 adc bx,9 + *** 000557 53 push bx + *** 000558 52 push dx + *** 000559 e8 38 fb call _write_header + *** 00055c 83 c4 06 add sp,6 +;|*** write_value(mode,&chksum); +; Line 291 + *** 00055f 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 000562 50 push ax + *** 000563 ff 76 08 push WORD PTR [bp+8] + *** 000566 ff 76 06 push WORD PTR [bp+6] ;mode + *** 000569 e8 c6 fa call _write_value + *** 00056c 83 c4 06 add sp,6 +;|*** write_data(fname,len,&chksum); +; Line 292 + *** 00056f 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 000572 50 push ax + *** 000573 ff 76 fe push WORD PTR [bp-2] + *** 000576 ff 76 fc push WORD PTR [bp-4] ;result + *** 000579 8d 8e f8 fe lea cx,WORD PTR [bp-264] ;fname + *** 00057d 51 push cx + *** 00057e e8 79 fb call _write_data + *** 000581 83 c4 08 add sp,8 +;|*** write_end(chksum); +; Line 293 + *** 000584 ff 76 fa push WORD PTR [bp-6] + *** 000587 ff 76 f8 push WORD PTR [bp-8] ;chksum + *** 00058a e8 db fb call _write_end + *** 00058d 83 c4 04 add sp,4 +;|*** if (read_header(&chksum) != 0x00090002) { +; Line 294 + *** 000590 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 000593 50 push ax + *** 000594 e8 cb fa call _read_header + *** 000597 83 c4 02 add sp,2 + *** 00059a 3d 02 00 cmp ax,2 + *** 00059d 75 9f jne $L624 + *** 00059f 83 fa 09 cmp dx,9 + *** 0005a2 75 9a jne $L624 +;|*** LeaveCriticalSection(&ppfscs); +;|*** return -1; +;|*** } +;|*** result = read_value(&chksum); +; Line 298 + *** 0005a4 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 0005a7 50 push ax + *** 0005a8 e8 55 fa call _read_value + *** 0005ab 83 c4 02 add sp,2 + *** 0005ae 89 46 fc mov WORD PTR [bp-4],ax ;result + *** 0005b1 89 56 fe mov WORD PTR [bp-2],dx +;|*** if (!read_end(chksum)) { +; Line 299 + *** 0005b4 ff 76 fa push WORD PTR [bp-6] + *** 0005b7 ff 76 f8 push WORD PTR [bp-8] ;chksum + *** 0005ba e8 77 fb call _read_end + *** 0005bd 83 c4 04 add sp,4 + *** 0005c0 0b d0 or dx,ax + *** 0005c2 75 03 jne $JCC1474 + *** 0005c4 e9 77 ff jmp $L624 + $JCC1474: + *** 0005c7 8b 46 fc mov ax,WORD PTR [bp-4] ;result + *** 0005ca 8b 56 fe mov dx,WORD PTR [bp-2] +;|*** LeaveCriticalSection(&ppfscs); +;|*** return -1; +;|*** } +;|*** LeaveCriticalSection(&ppfscs); +;|*** return result; +;|*** } +; Line 305 + *** 0005cd 5e pop si + *** 0005ce 5f pop di + *** 0005cf c9 leave + *** 0005d0 c3 ret + *** 0005d1 90 nop + +_ropen ENDP + PUBLIC _rfindfirst +_rfindfirst PROC NEAR +;|*** +;|*** int rfindfirst(DWORD hFind, WCHAR *pattern, struct _finddata_t *fd) { +; Line 307 + *** 0005d2 c8 0c 01 00 enter 268,0 + *** 0005d6 57 push di + *** 0005d7 56 push si +; hFind = 4 +; pattern = 8 +; fd = 10 +; chksum = -12 +; result = -8 +; len = -4 +; fname = -268 +;|*** int chksum, result, len; +;|*** char fname[MAX_FILENAME_LEN]; +;|*** +;|*** if (NoPPFS) +; Line 311 + *** 0005d8 a1 02 00 mov ax,WORD PTR _NoPPFS+2 + *** 0005db 0b 06 00 00 or ax,WORD PTR _NoPPFS + *** 0005df 74 09 je $I504 +;|*** return -1; +; Line 312 + $L625: + *** 0005e1 b8 ff ff mov ax,-1 ;ffffH + *** 0005e4 99 cwd + *** 0005e5 5e pop si + *** 0005e6 5f pop di + *** 0005e7 c9 leave + *** 0005e8 c3 ret + *** 0005e9 90 nop +;|*** if (pattern != NULL) { +; Line 313 + $I504: + *** 0005ea 8b 76 08 mov si,WORD PTR [bp+8] ;pattern + *** 0005ed 0b f6 or si,si + *** 0005ef 74 27 je $I505 +;|*** len = strlenW(pattern)+1; +; Line 314 + *** 0005f1 8b fe mov di,si + *** 0005f3 8c d8 mov ax,ds + *** 0005f5 8e c0 mov es,ax + *** 0005f7 b9 ff ff mov cx,-1 ;ffffH + *** 0005fa 33 c0 xor ax,ax + *** 0005fc f2 repnz + *** 0005fd ae scasb + *** 0005fe f7 d1 not cx + *** 000600 89 4e fc mov WORD PTR [bp-4],cx ;len + *** 000603 89 46 fe mov WORD PTR [bp-2],ax +;|*** KUnicodeToAscii(fname,pattern,MAX_FILENAME_LEN); +; Line 315 + *** 000606 68 00 01 push 256 ;0100H + *** 000609 56 push si + *** 00060a 8d 86 f4 fe lea ax,WORD PTR [bp-268] ;fname + *** 00060e 50 push ax + *** 00060f e8 00 00 call _strncpy + *** 000612 83 c4 06 add sp,6 +;|*** } else { +; Line 316 + *** 000615 eb 09 jmp SHORT $I506 + *** 000617 90 nop + $I505: +;|*** len = 0; +; Line 317 + *** 000618 2b c0 sub ax,ax + *** 00061a 89 46 fe mov WORD PTR [bp-2],ax + *** 00061d 89 46 fc mov WORD PTR [bp-4],ax ;len +;|*** } +; Line 318 + $I506: +;|*** EnterCriticalSection(&ppfscs); +;|*** write_header(0x00090008 + (len<<16), &chksum); /* opcode = 0x0002, length = 9 + strlen + 1 */ +; Line 320 + *** 000620 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 000623 50 push ax + *** 000624 8b 4e fc mov cx,WORD PTR [bp-4] ;len + *** 000627 8b d9 mov bx,cx + *** 000629 2b d2 sub dx,dx + *** 00062b 83 c2 08 add dx,8 + *** 00062e 83 d3 09 adc bx,9 + *** 000631 53 push bx + *** 000632 52 push dx + *** 000633 e8 5e fa call _write_header + *** 000636 83 c4 06 add sp,6 +;|*** write_value(hFind,&chksum); +; Line 321 + *** 000639 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 00063c 50 push ax + *** 00063d ff 76 06 push WORD PTR [bp+6] + *** 000640 ff 76 04 push WORD PTR [bp+4] ;hFind + *** 000643 e8 ec f9 call _write_value + *** 000646 83 c4 06 add sp,6 +;|*** if (len != 0) { +; Line 322 + *** 000649 8b 46 fe mov ax,WORD PTR [bp-2] + *** 00064c 0b 46 fc or ax,WORD PTR [bp-4] ;len + *** 00064f 74 15 je $I507 +;|*** write_data(fname,len,&chksum); +; Line 323 + *** 000651 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 000654 50 push ax + *** 000655 ff 76 fe push WORD PTR [bp-2] + *** 000658 ff 76 fc push WORD PTR [bp-4] ;len + *** 00065b 8d 86 f4 fe lea ax,WORD PTR [bp-268] ;fname + *** 00065f 50 push ax + *** 000660 e8 97 fa call _write_data + *** 000663 83 c4 08 add sp,8 +;|*** } +;|*** write_end(chksum); +; Line 325 + $I507: + *** 000666 ff 76 f6 push WORD PTR [bp-10] + *** 000669 ff 76 f4 push WORD PTR [bp-12] ;chksum + *** 00066c e8 f9 fa call _write_end + *** 00066f 83 c4 04 add sp,4 +;|*** result = read_header(&chksum); +;|*** if ((result & 0xffff) != 0x0008) +; Line 327 + *** 000672 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 000675 50 push ax + *** 000676 e8 e9 f9 call _read_header + *** 000679 83 c4 02 add sp,2 + *** 00067c 89 46 f8 mov WORD PTR [bp-8],ax ;result + *** 00067f 89 56 fa mov WORD PTR [bp-6],dx + *** 000682 3d 08 00 cmp ax,8 + *** 000685 74 03 je $JCC1669 + *** 000687 e9 57 ff jmp $L625 + $JCC1669: +;|*** return -1; +;|*** len = ((result >> 16) & 0xffff) - 9; /* subtract header & chksum */ +; Line 329 + *** 00068a 8b c2 mov ax,dx + *** 00068c 2b d2 sub dx,dx + *** 00068e 2d 09 00 sub ax,9 + *** 000691 1b d2 sbb dx,dx + *** 000693 89 46 fc mov WORD PTR [bp-4],ax ;len + *** 000696 89 56 fe mov WORD PTR [bp-2],dx +;|*** result = read_value(&chksum); +; Line 330 + *** 000699 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 00069c 50 push ax + *** 00069d e8 60 f9 call _read_value + *** 0006a0 83 c4 02 add sp,2 + *** 0006a3 89 46 f8 mov WORD PTR [bp-8],ax ;result + *** 0006a6 89 56 fa mov WORD PTR [bp-6],dx +;|*** if (len != 0) { +; Line 331 + *** 0006a9 8b 46 fe mov ax,WORD PTR [bp-2] + *** 0006ac 0b 46 fc or ax,WORD PTR [bp-4] ;len + *** 0006af 74 13 je $I509 +;|*** read_data((LPBYTE)fd,len,&chksum); +; Line 332 + *** 0006b1 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 0006b4 50 push ax + *** 0006b5 ff 76 fe push WORD PTR [bp-2] + *** 0006b8 ff 76 fc push WORD PTR [bp-4] ;len + *** 0006bb ff 76 0a push WORD PTR [bp+10] ;fd + *** 0006be e8 ff f9 call _read_data + *** 0006c1 83 c4 08 add sp,8 +;|*** } +;|*** if (!read_end(chksum)) { +; Line 334 + $I509: + *** 0006c4 ff 76 f6 push WORD PTR [bp-10] + *** 0006c7 ff 76 f4 push WORD PTR [bp-12] ;chksum + *** 0006ca e8 67 fa call _read_end + *** 0006cd 83 c4 04 add sp,4 + *** 0006d0 0b d0 or dx,ax + *** 0006d2 75 03 jne $JCC1746 + *** 0006d4 e9 0a ff jmp $L625 + $JCC1746: + *** 0006d7 8b 46 f8 mov ax,WORD PTR [bp-8] ;result + *** 0006da 8b 56 fa mov dx,WORD PTR [bp-6] +;|*** LeaveCriticalSection(&ppfscs); +;|*** return -1; +;|*** } +;|*** LeaveCriticalSection(&ppfscs); +;|*** return result; +;|*** } +; Line 340 + *** 0006dd 5e pop si + *** 0006de 5f pop di + *** 0006df c9 leave + *** 0006e0 c3 ret + *** 0006e1 90 nop + +_rfindfirst ENDP + PUBLIC _rfindnext +_rfindnext PROC NEAR +;|*** +;|*** int rfindnext(DWORD hFind, struct _finddata_t *fd) { +; Line 342 + *** 0006e2 c8 0c 00 00 enter 12,0 +; hFind = 4 +; fd = 8 +; chksum = -12 +; result = -8 +; len = -4 +;|*** int chksum, result, len; +;|*** +;|*** if (NoPPFS) +; Line 345 + *** 0006e6 a1 02 00 mov ax,WORD PTR _NoPPFS+2 + *** 0006e9 0b 06 00 00 or ax,WORD PTR _NoPPFS + *** 0006ed 74 07 je $I520 +;|*** return -1; +; Line 346 + $L626: + *** 0006ef b8 ff ff mov ax,-1 ;ffffH + *** 0006f2 99 cwd + *** 0006f3 c9 leave + *** 0006f4 c3 ret + *** 0006f5 90 nop +;|*** EnterCriticalSection(&ppfscs); +; Line 347 + $I520: +;|*** write_header(0x00090009, &chksum); /* opcode = 0x0009, length = 9 */ +; Line 348 + *** 0006f6 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 0006f9 50 push ax + *** 0006fa 6a 09 push 9 + *** 0006fc 6a 09 push 9 + *** 0006fe e8 93 f9 call _write_header + *** 000701 83 c4 06 add sp,6 +;|*** write_value(hFind,&chksum); +; Line 349 + *** 000704 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 000707 50 push ax + *** 000708 ff 76 06 push WORD PTR [bp+6] + *** 00070b ff 76 04 push WORD PTR [bp+4] ;hFind + *** 00070e e8 21 f9 call _write_value + *** 000711 83 c4 06 add sp,6 +;|*** write_end(chksum); +; Line 350 + *** 000714 ff 76 f6 push WORD PTR [bp-10] + *** 000717 ff 76 f4 push WORD PTR [bp-12] ;chksum + *** 00071a e8 4b fa call _write_end + *** 00071d 83 c4 04 add sp,4 +;|*** result = read_header(&chksum); +;|*** if ((result & 0xffff) != 0x0009) +; Line 352 + *** 000720 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 000723 50 push ax + *** 000724 e8 3b f9 call _read_header + *** 000727 83 c4 02 add sp,2 + *** 00072a 89 46 f8 mov WORD PTR [bp-8],ax ;result + *** 00072d 89 56 fa mov WORD PTR [bp-6],dx + *** 000730 3d 09 00 cmp ax,9 + *** 000733 75 ba jne $L626 +;|*** return -1; +;|*** len = ((result >> 16) & 0xffff) - 9; /* subtract header & chksum */ +; Line 354 + *** 000735 8b c2 mov ax,dx + *** 000737 2b d2 sub dx,dx + *** 000739 2d 09 00 sub ax,9 + *** 00073c 1b d2 sbb dx,dx + *** 00073e 89 46 fc mov WORD PTR [bp-4],ax ;len + *** 000741 89 56 fe mov WORD PTR [bp-2],dx +;|*** result = read_value(&chksum); +; Line 355 + *** 000744 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 000747 50 push ax + *** 000748 e8 b5 f8 call _read_value + *** 00074b 83 c4 02 add sp,2 + *** 00074e 89 46 f8 mov WORD PTR [bp-8],ax ;result + *** 000751 89 56 fa mov WORD PTR [bp-6],dx +;|*** if (len != 0) { +; Line 356 + *** 000754 8b 46 fe mov ax,WORD PTR [bp-2] + *** 000757 0b 46 fc or ax,WORD PTR [bp-4] ;len + *** 00075a 74 13 je $I522 +;|*** read_data((LPBYTE)fd,len,&chksum); +; Line 357 + *** 00075c 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 00075f 50 push ax + *** 000760 ff 76 fe push WORD PTR [bp-2] + *** 000763 ff 76 fc push WORD PTR [bp-4] ;len + *** 000766 ff 76 08 push WORD PTR [bp+8] ;fd + *** 000769 e8 54 f9 call _read_data + *** 00076c 83 c4 08 add sp,8 +;|*** } +;|*** if (!read_end(chksum)) { +; Line 359 + $I522: + *** 00076f ff 76 f6 push WORD PTR [bp-10] + *** 000772 ff 76 f4 push WORD PTR [bp-12] ;chksum + *** 000775 e8 bc f9 call _read_end + *** 000778 83 c4 04 add sp,4 + *** 00077b 0b d0 or dx,ax + *** 00077d 75 03 jne $JCC1917 + *** 00077f e9 6d ff jmp $L626 + $JCC1917: + *** 000782 8b 46 f8 mov ax,WORD PTR [bp-8] ;result + *** 000785 8b 56 fa mov dx,WORD PTR [bp-6] +;|*** LeaveCriticalSection(&ppfscs); +;|*** return -1; +;|*** } +;|*** LeaveCriticalSection(&ppfscs); +;|*** return result; +;|*** } +; Line 365 + *** 000788 c9 leave + *** 000789 c3 ret + +_rfindnext ENDP + PUBLIC _rRegOpen +_rRegOpen PROC NEAR +;|*** +;|*** // Registration database access functions for kernel debug support initialization +;|*** int rRegOpen(DWORD hKey, CHAR *szName, LPDWORD lphKey) { +; Line 368 + *** 00078a c8 08 00 00 enter 8,0 + *** 00078e 57 push di + *** 00078f 56 push si +; hKey = 4 +; szName = 8 +; lphKey = 10 +; chksum = -8 +; len = -4 +;|*** int chksum, len; +;|*** if (NoPPFS) +; Line 370 + *** 000790 a1 02 00 mov ax,WORD PTR _NoPPFS+2 + *** 000793 0b 06 00 00 or ax,WORD PTR _NoPPFS + *** 000797 74 03 je $JCC1943 + *** 000799 e9 8f 00 jmp $L629 + $JCC1943: +;|*** return -1; +;|*** len = strlen(szName)+1; +; Line 372 + *** 00079c 8b 76 08 mov si,WORD PTR [bp+8] ;szName +;|*** EnterCriticalSection(&ppfscs); +;|*** write_header(0x0009000B + (len<<16), &chksum); /* opcode = 0x000B, length = 9 + strlen + 1 */ +; Line 374 + *** 00079f 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 0007a2 50 push ax + *** 0007a3 8b fe mov di,si + *** 0007a5 8c d8 mov ax,ds + *** 0007a7 8e c0 mov es,ax + *** 0007a9 b9 ff ff mov cx,-1 ;ffffH + *** 0007ac 33 c0 xor ax,ax + *** 0007ae f2 repnz + *** 0007af ae scasb + *** 0007b0 f7 d1 not cx + *** 0007b2 89 4e fc mov WORD PTR [bp-4],cx ;len + *** 0007b5 89 46 fe mov WORD PTR [bp-2],ax + *** 0007b8 8b d1 mov dx,cx + *** 0007ba 05 0b 00 add ax,11 ;000bH + *** 0007bd 83 d2 09 adc dx,9 + *** 0007c0 52 push dx + *** 0007c1 50 push ax + *** 0007c2 e8 cf f8 call _write_header + *** 0007c5 83 c4 06 add sp,6 +;|*** write_value(hKey,&chksum); +; Line 375 + *** 0007c8 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 0007cb 50 push ax + *** 0007cc ff 76 06 push WORD PTR [bp+6] + *** 0007cf ff 76 04 push WORD PTR [bp+4] ;hKey + *** 0007d2 e8 5d f8 call _write_value + *** 0007d5 83 c4 06 add sp,6 +;|*** write_data(szName,len,&chksum); +; Line 376 + *** 0007d8 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 0007db 50 push ax + *** 0007dc ff 76 fe push WORD PTR [bp-2] + *** 0007df ff 76 fc push WORD PTR [bp-4] ;len + *** 0007e2 56 push si + *** 0007e3 e8 14 f9 call _write_data + *** 0007e6 83 c4 08 add sp,8 +;|*** write_end(chksum); +; Line 377 + *** 0007e9 ff 76 fa push WORD PTR [bp-6] + *** 0007ec ff 76 f8 push WORD PTR [bp-8] ;chksum + *** 0007ef e8 76 f9 call _write_end + *** 0007f2 83 c4 04 add sp,4 +;|*** if (read_header(&chksum) != 0x0009000B) { +; Line 378 + *** 0007f5 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 0007f8 50 push ax + *** 0007f9 e8 66 f8 call _read_header + *** 0007fc 83 c4 02 add sp,2 + *** 0007ff 3d 0b 00 cmp ax,11 ;000bH + *** 000802 75 27 jne $L629 + *** 000804 83 fa 09 cmp dx,9 + *** 000807 75 22 jne $L629 +;|*** LeaveCriticalSection(&ppfscs); +;|*** return -1; +;|*** } +;|*** *lphKey = read_value(&chksum); +; Line 382 + *** 000809 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 00080c 50 push ax + *** 00080d e8 f0 f7 call _read_value + *** 000810 8b 5e 0a mov bx,WORD PTR [bp+10] ;lphKey + *** 000813 83 c4 02 add sp,2 + *** 000816 89 07 mov WORD PTR [bx],ax + *** 000818 89 57 02 mov WORD PTR [bx+2],dx +;|*** if (!read_end(chksum)) { +; Line 383 + *** 00081b ff 76 fa push WORD PTR [bp-6] + *** 00081e ff 76 f8 push WORD PTR [bp-8] ;chksum + *** 000821 e8 10 f9 call _read_end + *** 000824 83 c4 04 add sp,4 + *** 000827 0b d0 or dx,ax + *** 000829 75 09 jne $I536 + $L629: + *** 00082b b8 ff ff mov ax,-1 ;ffffH + *** 00082e 99 cwd + *** 00082f 5e pop si + *** 000830 5f pop di + *** 000831 c9 leave + *** 000832 c3 ret + *** 000833 90 nop + $I536: + *** 000834 33 c0 xor ax,ax + *** 000836 99 cwd +;|*** LeaveCriticalSection(&ppfscs); +;|*** return -1; +;|*** } +;|*** LeaveCriticalSection(&ppfscs); +;|*** return 0; +;|*** } +; Line 389 + *** 000837 5e pop si + *** 000838 5f pop di + *** 000839 c9 leave + *** 00083a c3 ret + *** 00083b 90 nop + +_rRegOpen ENDP + PUBLIC _rRegClose +_rRegClose PROC NEAR +;|*** +;|*** int rRegClose(DWORD hKey) { +; Line 391 + *** 00083c c8 08 00 00 enter 8,0 +; hKey = 4 +; chksum = -8 +; result = -4 +;|*** int chksum, result; +;|*** if (NoPPFS) +; Line 393 + *** 000840 a1 02 00 mov ax,WORD PTR _NoPPFS+2 + *** 000843 0b 06 00 00 or ax,WORD PTR _NoPPFS + *** 000847 74 07 je $I543 +;|*** return -1; +; Line 394 + $L630: + *** 000849 b8 ff ff mov ax,-1 ;ffffH + *** 00084c 99 cwd + *** 00084d c9 leave + *** 00084e c3 ret + *** 00084f 90 nop +;|*** EnterCriticalSection(&ppfscs); +; Line 395 + $I543: +;|*** write_header(0x0009000C, &chksum); /* opcode = 0x000C, length = 9 */ +; Line 396 + *** 000850 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 000853 50 push ax + *** 000854 6a 09 push 9 + *** 000856 6a 0c push 12 ;000cH + *** 000858 e8 39 f8 call _write_header + *** 00085b 83 c4 06 add sp,6 +;|*** write_value(hKey,&chksum); +; Line 397 + *** 00085e 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 000861 50 push ax + *** 000862 ff 76 06 push WORD PTR [bp+6] + *** 000865 ff 76 04 push WORD PTR [bp+4] ;hKey + *** 000868 e8 c7 f7 call _write_value + *** 00086b 83 c4 06 add sp,6 +;|*** write_end(chksum); +; Line 398 + *** 00086e ff 76 fa push WORD PTR [bp-6] + *** 000871 ff 76 f8 push WORD PTR [bp-8] ;chksum + *** 000874 e8 f1 f8 call _write_end + *** 000877 83 c4 04 add sp,4 +;|*** if (read_header(&chksum) != 0x0009000C) { +; Line 399 + *** 00087a 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 00087d 50 push ax + *** 00087e e8 e1 f7 call _read_header + *** 000881 83 c4 02 add sp,2 + *** 000884 3d 0c 00 cmp ax,12 ;000cH + *** 000887 75 c0 jne $L630 + *** 000889 83 fa 09 cmp dx,9 + *** 00088c 75 bb jne $L630 +;|*** LeaveCriticalSection(&ppfscs); +;|*** return -1; +;|*** } +;|*** result = read_value(&chksum); +; Line 403 + *** 00088e 8d 46 f8 lea ax,WORD PTR [bp-8] ;chksum + *** 000891 50 push ax + *** 000892 e8 6b f7 call _read_value + *** 000895 83 c4 02 add sp,2 + *** 000898 89 46 fc mov WORD PTR [bp-4],ax ;result + *** 00089b 89 56 fe mov WORD PTR [bp-2],dx +;|*** if (!read_end(chksum)) { +; Line 404 + *** 00089e ff 76 fa push WORD PTR [bp-6] + *** 0008a1 ff 76 f8 push WORD PTR [bp-8] ;chksum + *** 0008a4 e8 8d f8 call _read_end + *** 0008a7 83 c4 04 add sp,4 + *** 0008aa 0b d0 or dx,ax + *** 0008ac 74 9b je $L630 + *** 0008ae 8b 46 fc mov ax,WORD PTR [bp-4] ;result + *** 0008b1 8b 56 fe mov dx,WORD PTR [bp-2] +;|*** LeaveCriticalSection(&ppfscs); +;|*** return -1; +;|*** } +;|*** LeaveCriticalSection(&ppfscs); +;|*** return result; +;|*** } +; Line 410 + *** 0008b4 c9 leave + *** 0008b5 c3 ret + +_rRegClose ENDP + PUBLIC _rRegGet +_rRegGet PROC NEAR +;|*** +;|*** int rRegGet(DWORD hKey, CHAR *szName, LPDWORD lpdwType, +;|*** LPBYTE lpbData, LPDWORD lpdwSize) { +; Line 413 + *** 0008b6 c8 0c 00 00 enter 12,0 + *** 0008ba 57 push di + *** 0008bb 56 push si +; hKey = 4 +; szName = 8 +; lpdwType = 10 +; lpbData = 12 +; lpdwSize = 14 +; chksum = -12 +; result = -4 +; len = -8 +;|*** int chksum, result, len; +;|*** if (NoPPFS) +; Line 415 + *** 0008bc a1 02 00 mov ax,WORD PTR _NoPPFS+2 + *** 0008bf 0b 06 00 00 or ax,WORD PTR _NoPPFS + *** 0008c3 74 09 je $I561 +;|*** return -1; +; Line 416 + *** 0008c5 b8 ff ff mov ax,-1 ;ffffH + $L632: + *** 0008c8 99 cwd + *** 0008c9 5e pop si + *** 0008ca 5f pop di + *** 0008cb c9 leave + *** 0008cc c3 ret + *** 0008cd 90 nop +;|*** len = strlen(szName)+1; +; Line 417 + $I561: + *** 0008ce 8b 76 08 mov si,WORD PTR [bp+8] ;szName +;|*** EnterCriticalSection(&ppfscs); +;|*** write_header(0x0009000A + (len<<16), &chksum); /* opcode = 0x000A, length = 9 + strlen + 1 */ +; Line 419 + *** 0008d1 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 0008d4 50 push ax + *** 0008d5 8b fe mov di,si + *** 0008d7 8c d8 mov ax,ds + *** 0008d9 8e c0 mov es,ax + *** 0008db b9 ff ff mov cx,-1 ;ffffH + *** 0008de 33 c0 xor ax,ax + *** 0008e0 f2 repnz + *** 0008e1 ae scasb + *** 0008e2 f7 d1 not cx + *** 0008e4 89 4e f8 mov WORD PTR [bp-8],cx ;len + *** 0008e7 89 46 fa mov WORD PTR [bp-6],ax + *** 0008ea 8b d1 mov dx,cx + *** 0008ec 05 0a 00 add ax,10 ;000aH + *** 0008ef 83 d2 09 adc dx,9 + *** 0008f2 52 push dx + *** 0008f3 50 push ax + *** 0008f4 e8 9d f7 call _write_header + *** 0008f7 83 c4 06 add sp,6 +;|*** write_value(hKey,&chksum); +; Line 420 + *** 0008fa 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 0008fd 50 push ax + *** 0008fe ff 76 06 push WORD PTR [bp+6] + *** 000901 ff 76 04 push WORD PTR [bp+4] ;hKey + *** 000904 e8 2b f7 call _write_value + *** 000907 83 c4 06 add sp,6 +;|*** write_data(szName,len,&chksum); +; Line 421 + *** 00090a 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 00090d 50 push ax + *** 00090e ff 76 fa push WORD PTR [bp-6] + *** 000911 ff 76 f8 push WORD PTR [bp-8] ;len + *** 000914 56 push si + *** 000915 e8 e2 f7 call _write_data + *** 000918 83 c4 08 add sp,8 +;|*** write_end(chksum); +; Line 422 + *** 00091b ff 76 f6 push WORD PTR [bp-10] + *** 00091e ff 76 f4 push WORD PTR [bp-12] ;chksum + *** 000921 e8 44 f8 call _write_end + *** 000924 83 c4 04 add sp,4 +;|*** DEBUGMSG(ZONE_DEBUG,(TEXT("NKDBG: RegGet. hKey=%lu, Name=%a\r\n"), hKey, szName)); +; Line 423 + *** 000927 56 push si + *** 000928 ff 76 06 push WORD PTR [bp+6] + *** 00092b ff 76 04 push WORD PTR [bp+4] ;hKey + *** 00092e 68 00 00 push OFFSET DGROUP:$SG562 + *** 000931 e8 00 00 call _printf + *** 000934 83 c4 08 add sp,8 +;|*** result = read_header(&chksum); +;|*** if ((result & 0xffff) != 0x000A) +; Line 425 + *** 000937 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 00093a 50 push ax + *** 00093b e8 24 f7 call _read_header + *** 00093e 83 c4 02 add sp,2 + *** 000941 89 46 fc mov WORD PTR [bp-4],ax ;result + *** 000944 89 56 fe mov WORD PTR [bp-2],dx + *** 000947 3d 0a 00 cmp ax,10 ;000aH + *** 00094a 74 06 je $I563 +;|*** { +;|*** LeaveCriticalSection(&ppfscs); +;|*** return 0; +; Line 428 + *** 00094c 33 c0 xor ax,ax + *** 00094e e9 77 ff jmp $L632 + *** 000951 90 nop +;|*** } +;|*** len = ((result >> 16) & 0xffff) - 9; /* subtract header & chksum */ +; Line 430 + $I563: + *** 000952 8b 76 0a mov si,WORD PTR [bp+10] ;lpdwType +;|*** *lpdwType = read_value(&chksum); +; Line 431 + *** 000955 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 000958 50 push ax + *** 000959 e8 a4 f6 call _read_value + *** 00095c 83 c4 02 add sp,2 + *** 00095f 89 04 mov WORD PTR [si],ax + *** 000961 89 54 02 mov WORD PTR [si+2],dx +;|*** *lpdwSize = len; +; Line 432 + *** 000964 8b 46 fe mov ax,WORD PTR [bp-2] + *** 000967 2b d2 sub dx,dx + *** 000969 2d 09 00 sub ax,9 + *** 00096c 1b d2 sbb dx,dx + *** 00096e 8b 5e 0e mov bx,WORD PTR [bp+14] ;lpdwSize + *** 000971 89 07 mov WORD PTR [bx],ax + *** 000973 89 57 02 mov WORD PTR [bx+2],dx +;|*** DEBUGMSG(ZONE_DEBUG,(TEXT("NKDBG: RegGet. Type=%lu, Size=%lu\r\n"), *lpdwType, *lpdwSize)); +; Line 433 + *** 000976 52 push dx + *** 000977 50 push ax + *** 000978 ff 74 02 push WORD PTR [si+2] + *** 00097b ff 34 push WORD PTR [si] + *** 00097d 68 00 00 push OFFSET DGROUP:$SG564 + *** 000980 8b f0 mov si,ax + *** 000982 8b fa mov di,dx + *** 000984 e8 00 00 call _printf + *** 000987 83 c4 0a add sp,10 ;000aH +;|*** read_data(lpbData,len,&chksum); +; Line 434 + *** 00098a 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 00098d 50 push ax + *** 00098e 57 push di + *** 00098f 56 push si + *** 000990 ff 76 0c push WORD PTR [bp+12] ;lpbData + *** 000993 e8 2a f7 call _read_data + *** 000996 83 c4 08 add sp,8 +;|*** if (!read_end(chksum)) { +; Line 435 + *** 000999 ff 76 f6 push WORD PTR [bp-10] + *** 00099c ff 76 f4 push WORD PTR [bp-12] ;chksum + *** 00099f e8 92 f7 call _read_end + *** 0009a2 83 c4 04 add sp,4 + *** 0009a5 0b d0 or dx,ax + *** 0009a7 75 05 jne $I565 + *** 0009a9 33 c0 xor ax,ax + *** 0009ab eb 04 jmp SHORT $L631 + *** 0009ad 90 nop + $I565: + *** 0009ae b8 01 00 mov ax,1 + $L631: + *** 0009b1 33 d2 xor dx,dx +;|*** LeaveCriticalSection(&ppfscs); +;|*** return 0; +;|*** } +;|*** LeaveCriticalSection(&ppfscs); +;|*** return 1; +;|*** } +; Line 441 + *** 0009b3 5e pop si + *** 0009b4 5f pop di + *** 0009b5 c9 leave + *** 0009b6 c3 ret + *** 0009b7 90 nop + +_rRegGet ENDP + PUBLIC _rRegEnum +_rRegEnum PROC NEAR +;|*** +;|*** int rRegEnum(DWORD hKey, DWORD dwIndex, LPBYTE lpbData, LPDWORD lpdwSize) { +; Line 443 + *** 0009b8 c8 0c 00 00 enter 12,0 +; chksum = -12 +; result = -8 +; len = -4 +; hKey = 4 +; dwIndex = 8 +; lpbData = 12 +; lpdwSize = 14 +;|*** int chksum, result, len; +;|*** if (NoPPFS) +; Line 445 + *** 0009bc a1 02 00 mov ax,WORD PTR _NoPPFS+2 + *** 0009bf 0b 06 00 00 or ax,WORD PTR _NoPPFS + *** 0009c3 74 07 je $I579 +;|*** return -1; +; Line 446 + $L633: + *** 0009c5 b8 ff ff mov ax,-1 ;ffffH + *** 0009c8 99 cwd + *** 0009c9 c9 leave + *** 0009ca c3 ret + *** 0009cb 90 nop +;|*** EnterCriticalSection(&ppfscs); +; Line 447 + $I579: +;|*** write_header(0x000D000D, &chksum); /* opcode = 0x000A, length = 13 */ +; Line 448 + *** 0009cc 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 0009cf 50 push ax + *** 0009d0 6a 0d push 13 ;000dH + *** 0009d2 6a 0d push 13 ;000dH + *** 0009d4 e8 bd f6 call _write_header + *** 0009d7 83 c4 06 add sp,6 +;|*** write_value(hKey,&chksum); +; Line 449 + *** 0009da 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 0009dd 50 push ax + *** 0009de ff 76 06 push WORD PTR [bp+6] + *** 0009e1 ff 76 04 push WORD PTR [bp+4] ;hKey + *** 0009e4 e8 4b f6 call _write_value + *** 0009e7 83 c4 06 add sp,6 +;|*** write_value(dwIndex,&chksum); +; Line 450 + *** 0009ea 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 0009ed 50 push ax + *** 0009ee ff 76 0a push WORD PTR [bp+10] + *** 0009f1 ff 76 08 push WORD PTR [bp+8] ;dwIndex + *** 0009f4 e8 3b f6 call _write_value + *** 0009f7 83 c4 06 add sp,6 +;|*** write_end(chksum); +; Line 451 + *** 0009fa ff 76 f6 push WORD PTR [bp-10] + *** 0009fd ff 76 f4 push WORD PTR [bp-12] ;chksum + *** 000a00 e8 65 f7 call _write_end + *** 000a03 83 c4 04 add sp,4 +;|*** DEBUGMSG(ZONE_DEBUG,(TEXT("NKDBG: RegEnum. hKey=%lu, Index=%u\r\n"), hKey, dwIndex)); +; Line 452 + *** 000a06 ff 76 0a push WORD PTR [bp+10] + *** 000a09 ff 76 08 push WORD PTR [bp+8] ;dwIndex + *** 000a0c ff 76 06 push WORD PTR [bp+6] + *** 000a0f ff 76 04 push WORD PTR [bp+4] ;hKey + *** 000a12 68 00 00 push OFFSET DGROUP:$SG580 + *** 000a15 e8 00 00 call _printf + *** 000a18 83 c4 0a add sp,10 ;000aH +;|*** result = read_header(&chksum); +;|*** if ((result & 0xffff) != 0x000D) +; Line 454 + *** 000a1b 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 000a1e 50 push ax + *** 000a1f e8 40 f6 call _read_header + *** 000a22 83 c4 02 add sp,2 + *** 000a25 89 46 f8 mov WORD PTR [bp-8],ax ;result + *** 000a28 89 56 fa mov WORD PTR [bp-6],dx + *** 000a2b 3d 0d 00 cmp ax,13 ;000dH + *** 000a2e 75 95 jne $L633 +;|*** { +;|*** LeaveCriticalSection(&ppfscs); +;|*** return -1; +;|*** } +;|*** len = ((result >> 16) & 0xffff) - 9; /* subtract header & chksum */ +; Line 459 + *** 000a30 8b c2 mov ax,dx + *** 000a32 2b d2 sub dx,dx + *** 000a34 2d 09 00 sub ax,9 + *** 000a37 1b d2 sbb dx,dx + *** 000a39 89 46 fc mov WORD PTR [bp-4],ax ;len + *** 000a3c 89 56 fe mov WORD PTR [bp-2],dx +;|*** result = read_value(&chksum); +; Line 460 + *** 000a3f 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 000a42 50 push ax + *** 000a43 e8 ba f5 call _read_value + *** 000a46 83 c4 02 add sp,2 + *** 000a49 89 46 f8 mov WORD PTR [bp-8],ax ;result + *** 000a4c 89 56 fa mov WORD PTR [bp-6],dx +;|*** *lpdwSize = len; +; Line 461 + *** 000a4f 8b 46 fc mov ax,WORD PTR [bp-4] ;len + *** 000a52 8b 5e 0e mov bx,WORD PTR [bp+14] ;lpdwSize + *** 000a55 8b 56 fe mov dx,WORD PTR [bp-2] + *** 000a58 89 07 mov WORD PTR [bx],ax + *** 000a5a 89 57 02 mov WORD PTR [bx+2],dx +;|*** DEBUGMSG(ZONE_DEBUG,(TEXT("NKDBG: RegEnum. Return=%lu, Size=%lu\r\n"), result, *lpdwSize)); +; Line 462 + *** 000a5d 52 push dx + *** 000a5e 50 push ax + *** 000a5f ff 76 fa push WORD PTR [bp-6] + *** 000a62 ff 76 f8 push WORD PTR [bp-8] ;result + *** 000a65 68 00 00 push OFFSET DGROUP:$SG582 + *** 000a68 e8 00 00 call _printf + *** 000a6b 83 c4 0a add sp,10 ;000aH +;|*** read_data(lpbData,len,&chksum); +; Line 463 + *** 000a6e 8d 46 f4 lea ax,WORD PTR [bp-12] ;chksum + *** 000a71 50 push ax + *** 000a72 ff 76 fe push WORD PTR [bp-2] + *** 000a75 ff 76 fc push WORD PTR [bp-4] ;len + *** 000a78 ff 76 0c push WORD PTR [bp+12] ;lpbData + *** 000a7b e8 42 f6 call _read_data + *** 000a7e 83 c4 08 add sp,8 +;|*** if (!read_end(chksum)) { +; Line 464 + *** 000a81 ff 76 f6 push WORD PTR [bp-10] + *** 000a84 ff 76 f4 push WORD PTR [bp-12] ;chksum + *** 000a87 e8 aa f6 call _read_end + *** 000a8a 83 c4 04 add sp,4 + *** 000a8d 0b d0 or dx,ax + *** 000a8f 75 03 jne $JCC2703 + *** 000a91 e9 31 ff jmp $L633 + $JCC2703: +;|*** LeaveCriticalSection(&ppfscs); +;|*** return -1; +;|*** } +;|*** LeaveCriticalSection(&ppfscs); +;|*** return result; +; Line 469 + *** 000a94 8b 46 f8 mov ax,WORD PTR [bp-8] ;result + *** 000a97 8b 56 fa mov dx,WORD PTR [bp-6] +;|*** } +; Line 470 + *** 000a9a c9 leave + *** 000a9b c3 ret + +_rRegEnum ENDP +_TEXT ENDS +END +;|*** diff --git a/DOS/LOADCEPC/ppfs.h b/DOS/LOADCEPC/ppfs.h new file mode 100644 index 0000000..751f321 --- /dev/null +++ b/DOS/LOADCEPC/ppfs.h @@ -0,0 +1,26 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// +// Use of this sample source code is subject to the terms of the Microsoft +// license agreement under which you licensed this sample source code. If +// you did not accept the terms of the license agreement, you are not +// authorized to use this sample source code. For the terms of the license, +// please see the license agreement between you and Microsoft or, if applicable, +// see the LICENSE.RTF on your install media or the root of your tools installation. +// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +// +long rlseek(long fd, long off, long mode); +long rwrite(long fd, char *buf, long cnt); +long rread(long fd, char *buf, long cnt); +long rclose(long fd); +long ropen(WCHAR *name, long mode); + +long rRegOpen(DWORD hKey, CHAR *szName, LPDWORD lphKey); +long rRegClose(DWORD hKey); +long rRegGet(DWORD hKey, CHAR *szName, LPDWORD lpdwType, + LPBYTE lpbData, LPDWORD lpdwSize); +long rRegEnum(DWORD hKey, DWORD dwIndex, LPBYTE lpbData, LPDWORD lpdwSize); + +long rfindfirst(DWORD hFind, WCHAR *pattern, struct _finddata_t *fd); +long rfindnext(DWORD hFind, struct _finddata_t *fd); diff --git a/DOS/LOADCEPC/ppfs.obj b/DOS/LOADCEPC/ppfs.obj new file mode 100644 index 0000000000000000000000000000000000000000..3230b63f90ec75b807a35f6278e799fed47d0aa0 GIT binary patch literal 9234 zcmcgy33!y%x&F?-%|Cx8VG`Lv3;_{=rbw`|7%N!@A~A_s21Q{E$%FtQNt2ndSP>=G zBm+1tp~@o8C~jO(a7D%52&f>mLaZBBZ$Yjd3O)sm0b98JLj-c1*NvOqCT~3bdw1HZZ1mBtZp&`JX(~SlaZM{tf>!{^K-NErrn%fl!|S2 zO$xvx6YBGiQ^C(N?brQ24?xM9UYK7}AUle)Z!MNG^Ru#LN7l6BX%hV-XXfV>6-$nc zq9PIhnn#W-y6xtS{M;fXD?0;=rja9yZ!5^=RV-ZnunA^t)4Z#xj=^5_iUf$w7FO)q97}6DF^o!Zb%+#e(YcYUffH_T|+S z6xfPDb1bP_;Bq=}BE&iBoTcTChSDmx6I4gNtFF4Nb{Qy+I%>x`byf9F=OS9TZb7xH z0xZU4eTLalSLmFdU+b)1$FgQ(M989u!kn-U&Ec! zWRh9mbau6SF${=B6IbM5W_WWLM8bDM@eYgtu9A7Kzt|YP;<19|>$14vxgO5CsmyJCS*{Fv7dd-sEeVB!I`*QU6OI zqm=^cIrIV4eEg~0erx6}i~|YkL8)J`-05&xuu{uR4W*8%1@$f~)|fTUK{OMw4i^nh z0;Qt1rrzP|kCoxpL`P;}PH|4=v|L9~c4l!-ex8QyDIjOf$}h~K1yh(Qw}98oyhqB& z&(Eb|El8O&rWH~#8KjKcinD3`WTxa6P-VSOqb(mmhcU~3%zr(|AK}K)G8t}yDP@(5 z>fMXuu-Y9=0;#H|rk47;u%gsC>)ll@l#~U7$sm+fntbDdDX^xY%dd@F4(_6*O)G+;m^UWe@kaE5rR7$niKuz=2ap)Cq7v zAW^sbCxbi%dq^BLEUJc8f?vdSqQs7n^P(>m*d&xw@~lu>q!=*^Q1Vs#1(a1qS^r8> zen?Udva?041915gm;kfk2Dlw^VGhhiVM?LS|8tNNaXVMVNH`uhK90+)SRqcge=g!) zUBtMdB;sO2#A7}c*gPoloUy;}?+5ZmL%;|wJA4y>Re+~KvIo`$aii(mO5Do5T_xLG zrrp8dhPem#jcser5}L8Up8B!DtF>N%8+X7wxDyuOcJIQ{eNYC?P!3+)-8y)X1o+h@ z1ek!@Ml5oQ;y6XR3w%NsAYl**@QfkA780P93*h$;M`bhwxD-QWi_7zU=cY?yx%$d{wak)CPMdZv(`l~ucR zol9ooJaLOOuBukps<|q}9dQl3q=B9O$V&?Mk*;t<3pj68 z&<53T7+t~V@GJNV>fjsnMx7|pMX2}x4CGGS`IRw3PeH}|1s7Vif|>J1?&-gDiTfpy z#Q7)}S=M=<8GQn=Hp~76EqK>Y7kH3wGCB}0WvqxpTcj~3J##g5A*RGxf~UvUA{*9q zx}C&KBQeL=*=#PR8@iwY1hxeFvZd${mq9994&za_H1;xikRsewtOuEbUb|OJP3M;6 zJgdt&un)=km?7s@($0zO0D62oiFp{?F$v=iLoKUxmXWh0Hpy9vuEn(~mV3}SvU#U` z6VYcdByG&emON?9S5x0~4_#yHE(pBPLq<6J33vRxUD{x`X*Ywkc9gA+{{1sa$m~Na zx#r#t6WM(*i8aFQY!%F7_d^9rH=iB!j|2Hh+|0-r5+|bOPT(YJR!}*Km?Lb_Wg8q% zvVCL7Rz$K@a@kS{tYPB6k&QI9OLzRKJ`}Nvwb-Q2BL+bvTBSC)a`qE}9X)7zog|3K z&hF+e@Bye~El|Zgu#~Na`%#Do*n5QNdE8B`CSurv%efG7sEIm7D8(1L6mkklVZ+^$ zCI(50CUyXU@A1z7xfd)AuF8J*-dwgFya8{u8H368PN@Fnv>7xRNA zJOv{NcA>^U2IQL%F-$CwlJIW}GO&qP_;(ucuP69N2?W2xKON-H zu$>S`$JguWR7`$Cp6(~1zn#z@BM=^*Jk9gT*!ER>F*&r?9MJ{|VuoE`wV}>|F{4!h`!b19N`Bz&$hzJ@By*{GYX^p^VSK zC}BH{5q3bP@GKMw&q0~66B>kFaG&rz{9bqgHVZGpcHtG+i)il?&QQdB5dn$~`Godn zj&>gm`4KsBk`B3b06{(soe*jKDDu7gg##A!Nfmwr~wOtFT|#0|$jS z;IQxq_(0eTe-ZY55rjTZMZ>v4`zr*APE~_M9+%`JzlbiLXqf6^%sNu*Pq4?!B2Q!+8>ceBeo=B>X2_MFuSK8j zm-rDhil2a2JO)pQpTc(WFYvnf85|NnhtI|1(19d;EAF6hv>S1Yjon+(P#z1BpoNda z>vSRpB@hv*cq$`1=|^_b$%(M1k)4!a$N#ULTqHaBPW(T!6U+b7PLvlAiTn4e|s86jS!7 z$Pr~HGN-6fXGgt)*x6^Wvy#lDQKG;RB)@nX+bO~LNde+-zU3J7r6}hU3eV<+V&L3& zy-|TjiF>GSgn(yIXY~-U0b7N15!`JQeqZO#e+0Efh2Lx%k9xf+q}Pu{h2Edzp1YwD zkMvEFz|se}Pf7}VSu(M`QXKnGvam0uB-V|?Q7*gudd_!X0! z4l=D#KIsyZ&22UWBWWN222l z&#|aNR~%Ax>Edu8xnyQV2FR1;DrYrCqzgS@l`Cl88@>a;5@b64^sN4PZQHBCU|QSP z&z?WpoY&oK>#0Pax8^q&dh~Qt330FTBP<>b^lYJ9&lZGL@0&4Om=x9nbW=*;?XF(E z!0f7f&Dsk+w*;2qpiqABDVBBRID|umbOGFtl5%Y1%27gXQOdD|#`D~4iIJPpDaE@Q zZ#wsnLqUX-t4e?$h4%D*IAn}L|e+SBe*yL`Yx z40ikHgM12m$l5dzte6Z_u%|4|R9otDIqNtv{I;pmhL=>A2u(b5)-!`xLOXg1ebAS{ z*vE2+DRYP^FZ#o{PS;gGLUTum=F?^`r4&7gI)xrjo7#>R=@9-L10__%x*EI>c!bJ1$RVf5$tjbMjQC zDA%)oN;(^;+{luZX>78R!E%&Lc8ikDDwOH0PRU^{%1vy8GLt={Dn=D<24Q3scM@8MK8vW%I%yiE-gl5Pg~ zYnLMJr3<~>UWzm|P#i(p9xUsmEjCCyxX%&g>nX9cBOtfo?q{=qD0i?0 zoh;cjk6mjjV_BwhR%~*zJ52LgjcGBXx145E2_1Ixuo!#TeH#7#liY|0(zOdQLhl>5 z>V$|RiICj}A8T3R$ao>Os0?<6iYr?$~owj)PV0=E8!&dx&!6VR%lsPR3^s^wm-3 zr{4xbnS0X;A}2i#+*gr@P2p{4&*SY6ab{|sB^UwQYVZ>FA8BnHxIM*1u|r3)T12M~ zrEsy$rUv$?X$d=ETFO2)En}xl%h|W470j&O!-lB$v+EGUsp|D~kFp0bjJ-#B9@T#b zXJs(mqZqG3O*$!-AwM0jgQP_rbZ!1xy%D7N;B@Kh2^NL zS%JES%~jX3YV|?3TwTZ3s;z8`x{03%+8Qs%qzD;dLDiAf@L6 zikH>$wByIr{$C%i$O_0PL`+HU_5ovidf5o;9Jd7wK(V%Pp&6exj>?*03y%;x5x#3| zxK51O11GQ{6ehBW4&w}52@s%X1hhCjoQ(`qm#%?JNozZ`B#3cS{kn24|c4$I{4Q>gJKEX8elWd6jDR!0l z8Frm{JIggc%L>iUu@du6R&L(K8qCkL7V`^igZWkV0)~=T%t!rWLB3A~7!i}63K*%r z=N353inkE@^XPAN4eFmr8gvCNKpK=x2DsZy8noA64RQ{)|6BdhQ=Swsl`qMuE_W{d zfyKt?%fHBYYJDex?JhSTUl<>F1F4GChne9zzbKqabtASpi4aUB@MNvuiy(<% z0s}X4*7Zas9^C6M74TmBmYX~!Gjv>;n}8Q6A+_MQk5Nko8^}MCUS#0fA+6koWjzjF z(;Elh+&lytcc3b4+fW6Kv#~I1!}Q(@$ah<3qE@_)9K3;8{DHk?ZexedZ?a?Nz3lJi zeXPs8pDEhgY>0MfLoB2cy9||B>&GXZm$)7XJlh#=<^Q#!tiBJv7tk7b)1v?X zfnTEwJlxMN9hU6E1>ZxcQIIz?D`WbUWL@P_lPPefUs>fImrU_A{mRmKEp`YwAbkk= zDk?>dp?yZK!!<7b%1aF@bh_Mi)jwEE@VBEq;Ey)1frw8#iBvf^Sbv0umDGv9$aiIh zgu%CF1sDpQg#MB)!fBdlMW-tWSW9AGpQCoXc)`&!Zx_+eQctK|1XE}Y{I&`yd<`>> z)#ovwG805v5C2d*eMbaKZ+k7S7;aDCbM?KL`Pu;CeE=l#d358LWVF**0WLGvOTiwY zcMTEx8RJthGu7A8#}9}YpVBM82!jlHQhN8qV2BmZ)q;%D)v^?pjDJJ>mEm&UN6Bsq zVv}NEM&FR&3M(Gv5z`baR`Dmm4&dP!;_u|FN&K>g)#0O8*QY%gu U5H$0o)bZoXlJU2`1*voW6Gm|grT_o{ literal 0 HcmV?d00001 diff --git a/DOS/LOADCEPC/ppfstool.c b/DOS/LOADCEPC/ppfstool.c new file mode 100644 index 0000000..8ae0671 --- /dev/null +++ b/DOS/LOADCEPC/ppfstool.c @@ -0,0 +1,556 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// +// Use of this sample source code is subject to the terms of the Microsoft +// license agreement under which you licensed this sample source code. If +// you did not accept the terms of the license agreement, you are not +// authorized to use this sample source code. For the terms of the license, +// please see the license agreement between you and Microsoft or, if applicable, +// see the LICENSE.RTF on your install media or the root of your tools installation. +// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +// +/*++ +THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +PARTICULAR PURPOSE. + +Module Name: + +Abstract: + +Functions: + + +Notes: + +--*/ +#include "windows.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ppfs.h" + +#if DEBUG +VOID DumpCounters(VOID); +#endif + +DWORD CurMSec = 0; +DWORD *PtrCurMSec = &CurMSec; + +#define COPY_FLAG_UPDATE_EXISTING 0x0001 +#define COPY_FLAG_UPDATE_OR_ADD 0x0002 + +typedef unsigned long _fsize_t; /* Could be 64 bits for Win32 */ + +struct _finddata_t { + unsigned long attrib; + time_t time_create; /* -1 for FAT file systems */ + time_t time_access; /* -1 for FAT file systems */ + time_t time_write; + _fsize_t size; + char name[260]; +}; + +void +usage2(char *pszProgramPath) +{ + char *pszProgramName; + + if ((pszProgramName = strrchr(pszProgramPath, '\\')) == NULL) + { + pszProgramName = pszProgramPath; + } + else + { + pszProgramName++; + } + + printf( + "%s: Parallel Port FileSystem Tool\n" + "usage: %s -d[:] -(g|r|u)[[:] []\n" + "-d Display a directory of files matching .\n\n" + "-g Get files matching and copy them to the\n" + " optionally specified . Any existing file with\n" + " the same name will be overwritten.\n\n" + "-r Refresh files matching which already exist in \n" + " and have a timestamp newer than the one in .\n\n" + "-u Update files matching which don't already exist in\n" + " or those that have a timestamp newer than those\n" + " in .\n\n" + " Windows filename path with optional wildcard characters.\n\n" + " If not specified then the current directory is the\n" + " default.\n" + " If specified and it doesn't exist and the last character is \\,\n" + " then the directory is created. Otherwise is\n" + " treated as the name of the file.\n" + " It is an error for to match multiple files\n" + " when specifies a file.\n", + pszProgramName, pszProgramName); +} + +VOID +DisplayDirectory(char *pszPath) +{ + DWORD hFind; + struct _finddata_t fd; + struct tm *ptmWrite; + + hFind = rfindfirst(0, pszPath, &fd); + + if (hFind == 0) + { + printf("%s: No files found\n", pszPath); + } + else if (hFind != -1) + { + do + { + ptmWrite = gmtime(&fd.time_write); + + printf( + "%c%c%c%c%c %2.2d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d %-8ld %s\n", + fd.attrib & _A_RDONLY ? 'R' : ' ', + fd.attrib & _A_HIDDEN ? 'H' : ' ', + fd.attrib & _A_SYSTEM ? 'S' : ' ', + fd.attrib & _A_SUBDIR ? 'D' : ' ', + fd.attrib & _A_ARCH ? 'A' : ' ', + ptmWrite->tm_mon + 1, ptmWrite->tm_mday, ptmWrite->tm_year, + ptmWrite->tm_hour, ptmWrite->tm_min, ptmWrite->tm_sec, + fd.size, fd.name); + + hFind = rfindnext(hFind, &fd); + } + while (hFind != 0 && hFind != -1); + } + + if (hFind == -1) + { + printf("%s: Error processing directory\n", pszPath); + } +} + +VOID +DrawPercent (DWORD CurValue, DWORD MaxValue) +{ + DWORD dwPercent; + static DWORD dwOldPercent = 10000; + + if (CurValue == (DWORD)-1) { + dwOldPercent = 10000; + fprintf(stderr, "%s ", MaxValue); + return; + } + + dwPercent = (CurValue*100)/MaxValue; + if ((dwPercent / 2) != (dwOldPercent / 2)) + { + fprintf(stderr, "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); + + for (dwOldPercent=0; dwOldPercent < (dwPercent/2); dwOldPercent++) + { + fprintf(stderr, "%c", 219); + } + + for (; dwOldPercent < 50; dwOldPercent++) + { + fprintf(stderr, "%c", 176); + } + + dwOldPercent = dwPercent; + fprintf(stderr, " %2d%%", dwPercent); + } + else + { + fprintf(stderr, "\b\b\b%2d%%", dwPercent); + } +} + +BOOL +GetOneFile( + char *pszSourceFile, char *pszDestinationFile, + DWORD dwFileSize, time_t tmModify) +{ + int hDestinationFile; + DWORD hSourceFile; + + int nReadCount; + static char cReadBuffer[16384]; + + DWORD dwBytesWritten; + + printf("%s --> %s\n", pszSourceFile, pszDestinationFile); + + hDestinationFile = _open( + pszDestinationFile, _O_WRONLY | _O_CREAT | _O_BINARY | _O_TRUNC, + _S_IREAD | _S_IWRITE); + + if (hDestinationFile == -1) + { + printf( + "%s: Error opening file for write access, error = %d\n", + pszDestinationFile, errno); + return FALSE; + } + + hSourceFile = ropen(pszSourceFile, _O_RDONLY); + + if (hSourceFile == -1) + { + _close(hDestinationFile); + printf("%s: Error opening file for read access\n", pszSourceFile); + return FALSE; + } + + // Initialize the percent thingie. + DrawPercent((DWORD)-1, (DWORD)""); + + dwBytesWritten = 0; + + for ( ; ; ) + { + nReadCount = (int)rread(hSourceFile, &cReadBuffer[0], sizeof(cReadBuffer)); + + if (nReadCount <= 0) + { + break; + } + + _write(hDestinationFile, cReadBuffer, nReadCount); + + dwBytesWritten += nReadCount; + + DrawPercent(dwBytesWritten, dwFileSize); + } + + fprintf(stderr, "\r \r"); + + rclose(hSourceFile); + + _close(hDestinationFile); + + if (nReadCount == 0) + { + struct _utimbuf utDestination; + time_t tmNow; + + time(&tmNow); + + utDestination.actime = tmNow; + utDestination.modtime = tmModify != 0 ? tmModify : tmNow; + _utime(pszDestinationFile, &utDestination); + } + else + { + _unlink(pszDestinationFile); + } + + return nReadCount == 0; +} + +BOOL +CheckDestination(char *pszDestination, char **ppszDirEnd) +{ + struct _stat stDestination; + BOOL bIsDir; + + *ppszDirEnd = strrchr(pszDestination, '\\'); + + if (*ppszDirEnd == NULL && pszDestination[1] == ':') + { + *ppszDirEnd = &pszDestination[1]; + } + + if (*ppszDirEnd == NULL) + { + *ppszDirEnd = pszDestination; + } + else + { + (*ppszDirEnd)++; + } + + bIsDir = FALSE; + + if (pszDestination[strlen(pszDestination)-1] == '\\') + { + pszDestination[strlen(pszDestination)-1] = '\0'; + bIsDir = TRUE; + } + + if (_stat(pszDestination, &stDestination) == 0) + { + if (stDestination.st_mode & _S_IFDIR) + { + bIsDir = TRUE; + } + } + else if (bIsDir) + { + if (_mkdir(pszDestination) == -1) + { + printf("%s: Error creating directory, error = %d\n", pszDestination, errno); + } + } + + if (bIsDir) + { + *ppszDirEnd = &pszDestination[strlen(pszDestination)]; + + if (*ppszDirEnd[-1] != '\\') + { + *(*ppszDirEnd)++ = '\\'; + } + } + + return bIsDir; +} + +VOID +GetFile(char *pszSource, char *pszDestination, USHORT usCopyFlags) +{ + DWORD hFind; + + struct _stat stDestination; + char szDestinationFile[_MAX_PATH]; + char *pDestinationDirEnd; + + struct _finddata_t fdSource; + char szSourceFile[_MAX_PATH]; + char *pSourceDirEnd; + + BOOL bDestinationIsDir; + + int nFilesCopied = 0; + + BOOL bDestinationExists; + BOOL bDoCopy; + + pSourceDirEnd = strrchr(pszSource, '\\'); + + if (pSourceDirEnd == NULL && pszSource[1] == ':') + { + pSourceDirEnd = &pszSource[1]; + } + + if (pSourceDirEnd != NULL) + { + int nDirLength = pSourceDirEnd - pszSource + 1; + + memcpy(szSourceFile, pszSource, nDirLength); + pSourceDirEnd = &szSourceFile[nDirLength]; + } + else + { + pSourceDirEnd = szSourceFile; + } + + hFind = rfindfirst(0, pszSource, &fdSource); + + if (hFind == 0 || hFind == -1) + { + printf("%s: File(s) not found\n", pszSource); + return; + } + + if (pszDestination != NULL) + { + strcpy(szDestinationFile, pszDestination); + + bDestinationIsDir = CheckDestination(szDestinationFile, &pDestinationDirEnd); + } + else + { + pDestinationDirEnd = szDestinationFile; + bDestinationIsDir = TRUE; + } + + do + { + strcpy(pSourceDirEnd, fdSource.name); + + if (bDestinationIsDir) + { + strcpy(pDestinationDirEnd, fdSource.name); + } + + bDoCopy = TRUE; + + if (usCopyFlags & (COPY_FLAG_UPDATE_EXISTING | COPY_FLAG_UPDATE_OR_ADD)) + { + bDestinationExists = _stat(szDestinationFile, &stDestination) == 0; + + if (bDestinationExists) + { + // + // Clear lsb of both times so inaccurate FATFS doesn't cause + // problems + // + stDestination.st_mtime &= ~1; + fdSource.time_write &= ~1; + + if (stDestination.st_mtime >= fdSource.time_write) + { + printf("%s: Up to date\n", szDestinationFile); + bDoCopy = FALSE; + } + } + else if (!(usCopyFlags & COPY_FLAG_UPDATE_OR_ADD)) + { + printf("%s: Skipping\n", szSourceFile); + bDoCopy = FALSE; + } + } + + if (bDoCopy) + { + if (GetOneFile(szSourceFile, szDestinationFile, fdSource.size, fdSource.time_write)) + { + nFilesCopied++; + } + else + { + break; + } + } + + hFind = rfindnext(hFind, &fdSource); + + if (!bDestinationIsDir && hFind != 0 && hFind != -1) + { + printf( + "%s: Destination isn't a directory and multiple files selected\n", + szDestinationFile); + + break; + } + } + while (hFind != 0 && hFind != -1); + + if (hFind != 0 && hFind != -1) + { + rfindfirst(hFind, NULL, NULL); + } + + printf("%d files copied\n", nFilesCopied); +} + +int +main2(int argc, char **argv) +{ + char cOption; + int i; + int OEMParallelPortInit(void); + + // + // Keep timezone conversions from getting in our way. All of the responses + // from the host are in local time anyways. + // + _daylight = 0; + _timezone = 0; + + OEMParallelPortInit(); + + for (i = 1; i < argc; i++) + { + if (argv[i][0] == '-' || argv[i][0] == '/') + { + cOption = tolower(argv[i][1]); + + switch (cOption) + { + case '?': + case 'h': + usage2(argv[0]); + break; + case 'd': + { + char *pszPath; + + if (argv[i][2] != '\0') + { + pszPath = &argv[i][2]; + if (*pszPath == ':') + { + pszPath++; + } + } + else if (argc > (i+1) && argv[i+1][0] != '-' && argv[i+1][0] != '/') + { + pszPath = argv[i+1]; + i++; + } + else + { + pszPath = "*.*"; + } + DisplayDirectory(pszPath); + } + break; + + case 'g': + case 'r': + case 'u': + { + char *pszSource; + char *pszDestination; + + if (argv[i][2] != '\0') + { + pszSource = &argv[i][2]; + if (*pszSource == ':') + { + pszSource++; + } + } + else if (argc > (i+1) && argv[i+1][0] != '-' && argv[i+1][0] != '/') + { + pszSource = argv[i+1]; + i++; + } + else + { + printf("Error source path missing\n"); + break; + } + + if (argc > (i+1) && argv[i+1][0] != '-' && argv[i+1][0] != '/') + { + pszDestination = argv[i+1]; + i++; + } + else + { + pszDestination = NULL; + } + + GetFile( + pszSource, pszDestination, + cOption == 'r' ? COPY_FLAG_UPDATE_EXISTING : + cOption == 'u' ? COPY_FLAG_UPDATE_OR_ADD : + 0); + } + break; + + default: + printf("%s: Unsupported option\n\n", argv[i]); + usage2(argv[0]); + } + } + } + +#if DEBUG + DumpCounters(); +#endif + + return 0; +} diff --git a/DOS/LOADCEPC/ppfstool.cod b/DOS/LOADCEPC/ppfstool.cod new file mode 100644 index 0000000..fc98900 --- /dev/null +++ b/DOS/LOADCEPC/ppfstool.cod @@ -0,0 +1,2118 @@ +; Static Name Aliases +; +; $S714_?cReadBuffer@?1??GetOneFile@@9@9 EQU ?cReadBuffer@?1??GetOneFile@@9@9 +; $S684_?dwOldPercent@?1??DrawPercent@@9@9 EQU ?dwOldPercent@?1??DrawPercent@@9@9 + TITLE ppfstool.c + .286p + .287 +INCLUDELIB SLIBCE +INCLUDELIB OLDNAMES.LIB +_TEXT SEGMENT WORD PUBLIC 'CODE' +_TEXT ENDS +_DATA SEGMENT WORD PUBLIC 'DATA' +_DATA ENDS +CONST SEGMENT WORD PUBLIC 'CONST' +CONST ENDS +_BSS SEGMENT WORD PUBLIC 'BSS' +_BSS ENDS +$$SYMBOLS SEGMENT BYTE PUBLIC 'DEBSYM' +$$SYMBOLS ENDS +$$TYPES SEGMENT BYTE PUBLIC 'DEBTYP' +$$TYPES ENDS +DGROUP GROUP CONST, _BSS, _DATA + ASSUME DS: DGROUP, SS: DGROUP +PUBLIC _CurMSec +PUBLIC _PtrCurMSec +EXTRN _rfindfirst:NEAR +EXTRN _fprintf:NEAR +EXTRN __close:NEAR +EXTRN _rfindnext:NEAR +EXTRN _strrchr:NEAR +EXTRN __open:NEAR +EXTRN _printf:NEAR +EXTRN _rread:NEAR +EXTRN __write:NEAR +EXTRN _rclose:NEAR +EXTRN __aNulmul:NEAR +EXTRN __aNuldiv:NEAR +EXTRN _ropen:NEAR +EXTRN __stat:NEAR +EXTRN __unlink:NEAR +EXTRN __utime:NEAR +EXTRN _OEMParallelPortInit:NEAR +EXTRN _gmtime:NEAR +EXTRN _time:NEAR +EXTRN __mkdir:NEAR +EXTRN _errno:WORD +EXTRN __ctype:BYTE +EXTRN __daylight:WORD +EXTRN __timezone:DWORD +EXTRN __iob:BYTE +_DATA SEGMENT +_CurMSec DD 00H +_PtrCurMSec DW DGROUP:_CurMSec +$SG657 DB '%s: Parallel Port FileSystem Tool', 0aH, 'usage: %s -d[:] -(g|r|u)[[:] []', 0aH, '-d ' + DB ' Display a directory of files matching .', 0aH, 0aH + DB '-g Get files matching and copy them to the', 0aH + DB ' optionally specified . Any existing file' + DB ' with', 0aH, ' the same name will be overwritten.', 0aH + DB 0aH, '-r Refresh files matching which already e' + DB 'xist in ', 0aH, ' and have a timestamp ne' + DB 'wer than the one in .', 0aH, 0aH, '-u Upda' + DB 'te files matching which don''t already exist in', 0aH + DB ' or those that have a timestamp newer tha' + DB 'n those', 0aH, ' in .', 0aH, 0aH, ' Windows filename path with optional wildcard character' + DB 's.', 0aH, 0aH, ' If not specified then the cu' + DB 'rrent directory is the', 0aH, ' default.', 0aH, ' ' + DB ' If specified and it doesn''t exist and the last character ' + DB 'is \,', 0aH, ' then the directory is created. Otherwi' + DB 'se is', 0aH, ' treated as the name of th' + DB 'e file.', 0aH, ' It is an error for to match' + DB ' multiple files', 0aH, ' when specifies ' + DB 'a file.', 0aH, 00H +$SG666 DB '%s: No files found', 0aH, 00H +$SG672 DB '%c%c%c%c%c %2.2d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d %-8ld %s', 0aH + DB 00H +$SG675 DB '%s: Error processing directory', 0aH, 00H + ORG $+1 +$S684_?dwOldPercent@?1??DrawPercent@@9@9 DD 02710H +$SG686 DB '%s ', 00H +$SG688 DB 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H + DB 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H + DB 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H + DB 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H + DB 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 00H +$SG692 DB '%c', 00H +$SG696 DB '%c', 00H +$SG697 DB ' %2d%%', 00H +$SG699 DB 08H, 08H, 08H, '%2d%%', 00H +$SG716 DB '%s --> %s', 0aH, 00H +$SG718 DB '%s: Error opening file for write access, error = %d', 0aH, 00H +$SG720 DB '%s: Error opening file for read access', 0aH, 00H +$SG721 DB 00H +$SG726 DB 0dH, ' ' + DB ' ', 0dH, 00H +$SG748 DB '%s: Error creating directory, error = %d', 0aH, 00H +$SG776 DB '%s: File(s) not found', 0aH, 00H +$SG786 DB '%s: Up to date', 0aH, 00H +$SG789 DB '%s: Skipping', 0aH, 00H +$SG794 DB '%s: Destination isn''t a directory and multiple files select' + DB 'ed', 0aH, 00H +$SG797 DB '%d files copied', 0aH, 00H +$SG824 DB '*.*', 00H +$SG833 DB 'Error source path missing', 0aH, 00H +$SG837 DB '%s: Unsupported option', 0aH, 0aH, 00H +_DATA ENDS +_BSS SEGMENT +$S714_?cReadBuffer@?1??GetOneFile@@9@9 DW 02000H DUP (?) +_BSS ENDS +_TEXT SEGMENT + ASSUME CS: _TEXT + PUBLIC _usage2 +_usage2 PROC NEAR +;|*** // +;|*** // Copyright (c) Microsoft Corporation. All rights reserved. +;|*** // +;|*** // +;|*** // Use of this sample source code is subject to the terms of the Microsoft +;|*** // license agreement under which you licensed this sample source code. If +;|*** // you did not accept the terms of the license agreement, you are not +;|*** // authorized to use this sample source code. For the terms of the license, +;|*** // please see the license agreement between you and Microsoft or, if applicable, +;|*** // see the LICENSE.RTF on your install media or the root of your tools installation. +;|*** // THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +;|*** // +;|*** /*++ +;|*** THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +;|*** ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +;|*** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +;|*** PARTICULAR PURPOSE. +;|*** +;|*** Module Name: +;|*** +;|*** Abstract: +;|*** +;|*** Functions: +;|*** +;|*** +;|*** Notes: +;|*** +;|*** --*/ +;|*** #include "windows.h" +;|*** #include +;|*** #include +;|*** #include +;|*** #include +;|*** #include +;|*** #include +;|*** #include +;|*** #include +;|*** #include +;|*** #include +;|*** #include +;|*** #include "ppfs.h" +;|*** +;|*** #if DEBUG +;|*** VOID DumpCounters(VOID); +;|*** #endif +;|*** +;|*** DWORD CurMSec = 0; +;|*** DWORD *PtrCurMSec = &CurMSec; +;|*** +;|*** #define COPY_FLAG_UPDATE_EXISTING 0x0001 +;|*** #define COPY_FLAG_UPDATE_OR_ADD 0x0002 +;|*** +;|*** typedef unsigned long _fsize_t; /* Could be 64 bits for Win32 */ +;|*** +;|*** struct _finddata_t { +;|*** unsigned long attrib; +;|*** time_t time_create; /* -1 for FAT file systems */ +;|*** time_t time_access; /* -1 for FAT file systems */ +;|*** time_t time_write; +;|*** _fsize_t size; +;|*** char name[260]; +;|*** }; +;|*** +;|*** void +;|*** usage2(char *pszProgramPath) +;|*** { +; Line 66 + *** 000000 55 push bp + *** 000001 8b ec mov bp,sp + *** 000003 57 push di + *** 000004 56 push si +; pszProgramPath = 4 +; register si = pszProgramName + *** 000005 8b 7e 04 mov di,WORD PTR [bp+4] ;pszProgramPath +;|*** char *pszProgramName; +;|*** +;|*** if ((pszProgramName = strrchr(pszProgramPath, '\\')) == NULL) +; Line 69 + *** 000008 6a 5c push 92 ;005cH + *** 00000a 57 push di + *** 00000b e8 00 00 call _strrchr + *** 00000e 83 c4 04 add sp,4 + *** 000011 8b f0 mov si,ax + *** 000013 0b f0 or si,ax + *** 000015 75 05 jne $I655 +;|*** { +;|*** pszProgramName = pszProgramPath; +; Line 71 + *** 000017 8b f7 mov si,di +;|*** } +;|*** else +; Line 73 + *** 000019 eb 02 jmp SHORT $I656 + *** 00001b 90 nop + $I655: +;|*** { +;|*** pszProgramName++; +; Line 75 + *** 00001c 46 inc si +;|*** } +; Line 76 + $I656: +;|*** +;|*** printf( +;|*** "%s: Parallel Port FileSystem Tool\n" +;|*** "usage: %s -d[:] -(g|r|u)[[:] []\n" +;|*** "-d Display a directory of files matching .\n\n" +;|*** "-g Get files matching and copy them to the\n" +;|*** " optionally specified . Any existing file with\n" +;|*** " the same name will be overwritten.\n\n" +;|*** "-r Refresh files matching which already exist in \n" +;|*** " and have a timestamp newer than the one in .\n\n" +;|*** "-u Update files matching which don't already exist in\n" +;|*** " or those that have a timestamp newer than those\n" +;|*** " in .\n\n" +;|*** " Windows filename path with optional wildcard characters.\n\n" +;|*** " If not specified then the current directory is the\n" +;|*** " default.\n" +;|*** " If specified and it doesn't exist and the last character is \\,\n" +;|*** " then the directory is created. Otherwise is\n" +;|*** " treated as the name of the file.\n" +;|*** " It is an error for to match multiple files\n" +;|*** " when specifies a file.\n", +;|*** pszProgramName, pszProgramName); +; Line 98 + *** 00001d 56 push si + *** 00001e 56 push si + *** 00001f 68 00 00 push OFFSET DGROUP:$SG657 + *** 000022 e8 00 00 call _printf + *** 000025 83 c4 06 add sp,6 +;|*** } +; Line 99 + *** 000028 5e pop si + *** 000029 5f pop di + *** 00002a c9 leave + *** 00002b c3 ret + +_usage2 ENDP + PUBLIC _DisplayDirectory +_DisplayDirectory PROC NEAR +;|*** +;|*** VOID +;|*** DisplayDirectory(char *pszPath) +;|*** { +; Line 103 + *** 00002c c8 1c 01 00 enter 284,0 + *** 000030 57 push di + *** 000031 56 push si +; pszPath = 4 +; hFind = -4 +; fd = -284 +; register si = ptmWrite + *** 000032 8b 7e 04 mov di,WORD PTR [bp+4] ;pszPath +;|*** DWORD hFind; +;|*** struct _finddata_t fd; +;|*** struct tm *ptmWrite; +;|*** +;|*** hFind = rfindfirst(0, pszPath, &fd); +;|*** +;|*** if (hFind == 0) +; Line 110 + *** 000035 8d 86 e4 fe lea ax,WORD PTR [bp-284] ;fd + *** 000039 50 push ax + *** 00003a 57 push di + *** 00003b 6a 00 push 0 + *** 00003d 6a 00 push 0 + *** 00003f e8 00 00 call _rfindfirst + *** 000042 83 c4 08 add sp,8 + *** 000045 89 46 fc mov WORD PTR [bp-4],ax ;hFind + *** 000048 89 56 fe mov WORD PTR [bp-2],dx + *** 00004b 0b d0 or dx,ax + *** 00004d 75 0d jne $I665 +;|*** { +;|*** printf("%s: No files found\n", pszPath); +; Line 112 + *** 00004f 57 push di + *** 000050 68 00 00 push OFFSET DGROUP:$SG666 + *** 000053 e8 00 00 call _printf + *** 000056 83 c4 04 add sp,4 +;|*** } +;|*** else if (hFind != -1) +; Line 114 + *** 000059 e9 c8 00 jmp $D673 + $I665: + *** 00005c 3d ff ff cmp ax,-1 ;ffffH + *** 00005f 75 08 jne $L849 + *** 000061 39 46 fe cmp WORD PTR [bp-2],ax + *** 000064 75 03 jne $JCC100 + *** 000066 e9 bb 00 jmp $D673 + $JCC100: + $L849: +;|*** { +;|*** do +;|*** { +;|*** ptmWrite = gmtime(&fd.time_write); +; Line 118 + *** 000069 8d 86 f0 fe lea ax,WORD PTR [bp-272] + *** 00006d 50 push ax + *** 00006e e8 00 00 call _gmtime + *** 000071 83 c4 02 add sp,2 + *** 000074 8b f0 mov si,ax +;|*** +;|*** printf( +;|*** "%c%c%c%c%c %2.2d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d %-8ld %s\n", +;|*** fd.attrib & _A_RDONLY ? 'R' : ' ', +;|*** fd.attrib & _A_HIDDEN ? 'H' : ' ', +;|*** fd.attrib & _A_SYSTEM ? 'S' : ' ', +;|*** fd.attrib & _A_SUBDIR ? 'D' : ' ', +;|*** fd.attrib & _A_ARCH ? 'A' : ' ', +;|*** ptmWrite->tm_mon + 1, ptmWrite->tm_mday, ptmWrite->tm_year, +;|*** ptmWrite->tm_hour, ptmWrite->tm_min, ptmWrite->tm_sec, +;|*** fd.size, fd.name); +; Line 129 + *** 000076 8d 86 f8 fe lea ax,WORD PTR [bp-264] + *** 00007a 50 push ax + *** 00007b ff b6 f6 fe push WORD PTR [bp-266] + *** 00007f ff b6 f4 fe push WORD PTR [bp-268] + *** 000083 ff 34 push WORD PTR [si] + *** 000085 ff 74 02 push WORD PTR [si+2] + *** 000088 ff 74 04 push WORD PTR [si+4] + *** 00008b ff 74 0a push WORD PTR [si+10] + *** 00008e ff 74 06 push WORD PTR [si+6] + *** 000091 8b 44 08 mov ax,WORD PTR [si+8] + *** 000094 40 inc ax + *** 000095 50 push ax + *** 000096 8b 86 e4 fe mov ax,WORD PTR [bp-284] ;fd + *** 00009a 25 20 00 and ax,32 ;0020H + *** 00009d 3d 01 00 cmp ax,1 + *** 0000a0 1b c0 sbb ax,ax + *** 0000a2 24 df and al,223 ;00dfH + *** 0000a4 05 41 00 add ax,65 ;0041H + *** 0000a7 50 push ax + *** 0000a8 8b 86 e4 fe mov ax,WORD PTR [bp-284] ;fd + *** 0000ac 25 10 00 and ax,16 ;0010H + *** 0000af 3d 01 00 cmp ax,1 + *** 0000b2 1b c0 sbb ax,ax + *** 0000b4 24 dc and al,220 ;00dcH + *** 0000b6 05 44 00 add ax,68 ;0044H + *** 0000b9 50 push ax + *** 0000ba 8b 86 e4 fe mov ax,WORD PTR [bp-284] ;fd + *** 0000be 25 04 00 and ax,4 + *** 0000c1 3d 01 00 cmp ax,1 + *** 0000c4 1b c0 sbb ax,ax + *** 0000c6 24 cd and al,205 ;00cdH + *** 0000c8 05 53 00 add ax,83 ;0053H + *** 0000cb 50 push ax + *** 0000cc 8b 86 e4 fe mov ax,WORD PTR [bp-284] ;fd + *** 0000d0 25 02 00 and ax,2 + *** 0000d3 3d 01 00 cmp ax,1 + *** 0000d6 1b c0 sbb ax,ax + *** 0000d8 24 d8 and al,216 ;00d8H + *** 0000da 05 48 00 add ax,72 ;0048H + *** 0000dd 50 push ax + *** 0000de 8a 86 e4 fe mov al,BYTE PTR [bp-284] ;fd + *** 0000e2 25 01 00 and ax,1 + *** 0000e5 3d 01 00 cmp ax,1 + *** 0000e8 1b c0 sbb ax,ax + *** 0000ea 24 ce and al,206 ;00ceH + *** 0000ec 05 52 00 add ax,82 ;0052H + *** 0000ef 50 push ax + *** 0000f0 68 00 00 push OFFSET DGROUP:$SG672 + *** 0000f3 e8 00 00 call _printf + *** 0000f6 83 c4 1e add sp,30 ;001eH +;|*** +;|*** hFind = rfindnext(hFind, &fd); +;|*** } +;|*** while (hFind != 0 && hFind != -1); +; Line 133 + *** 0000f9 8d 86 e4 fe lea ax,WORD PTR [bp-284] ;fd + *** 0000fd 50 push ax + *** 0000fe ff 76 fe push WORD PTR [bp-2] + *** 000101 ff 76 fc push WORD PTR [bp-4] ;hFind + *** 000104 e8 00 00 call _rfindnext + *** 000107 83 c4 06 add sp,6 + *** 00010a 89 46 fc mov WORD PTR [bp-4],ax ;hFind + *** 00010d 89 56 fe mov WORD PTR [bp-2],dx + *** 000110 0b d0 or dx,ax + *** 000112 74 10 je $D673 + *** 000114 3d ff ff cmp ax,-1 ;ffffH + *** 000117 74 03 je $JCC279 + *** 000119 e9 4d ff jmp $L849 + $JCC279: + *** 00011c 39 46 fe cmp WORD PTR [bp-2],ax + *** 00011f 74 03 je $JCC287 + *** 000121 e9 45 ff jmp $L849 + $JCC287: + $D673: +;|*** } +;|*** +;|*** if (hFind == -1) +; Line 136 + *** 000124 83 7e fc ff cmp WORD PTR [bp-4],-1 ;ffffH ;hFind + *** 000128 75 10 jne $EX661 + *** 00012a 83 7e fe ff cmp WORD PTR [bp-2],-1 ;ffffH + *** 00012e 75 0a jne $EX661 +;|*** { +;|*** printf("%s: Error processing directory\n", pszPath); +; Line 138 + *** 000130 57 push di + *** 000131 68 00 00 push OFFSET DGROUP:$SG675 + *** 000134 e8 00 00 call _printf + *** 000137 83 c4 04 add sp,4 +;|*** } +;|*** } +; Line 140 + $EX661: + *** 00013a 5e pop si + *** 00013b 5f pop di + *** 00013c c9 leave + *** 00013d c3 ret + +_DisplayDirectory ENDP + PUBLIC _DrawPercent +_DrawPercent PROC NEAR +;|*** +;|*** VOID +;|*** DrawPercent (DWORD CurValue, DWORD MaxValue) +;|*** { +; Line 144 + *** 00013e c8 04 00 00 enter 4,0 +; CurValue = 4 +; MaxValue = 8 +; dwPercent = -4 +;|*** DWORD dwPercent; +;|*** static DWORD dwOldPercent = 10000; +;|*** +;|*** if (CurValue == (DWORD)-1) { +; Line 148 + *** 000142 83 7e 04 ff cmp WORD PTR [bp+4],-1 ;ffffH ;CurValue + *** 000146 75 1e jne $I685 + *** 000148 83 7e 06 ff cmp WORD PTR [bp+6],-1 ;ffffH + *** 00014c 75 18 jne $I685 +;|*** dwOldPercent = 10000; +; Line 149 + *** 00014e c7 06 00 00 10 27 mov WORD PTR $S684_?dwOldPercent@?1??DrawPercent@@9@9,10000 ;2710H + *** 000154 c7 06 02 00 00 00 mov WORD PTR $S684_?dwOldPercent@?1??DrawPercent@@9@9+2,0 +;|*** fprintf(stderr, "%s ", MaxValue); +; Line 150 + *** 00015a ff 76 0a push WORD PTR [bp+10] + *** 00015d ff 76 08 push WORD PTR [bp+8] ;MaxValue + *** 000160 68 00 00 push OFFSET DGROUP:$SG686 + *** 000163 e9 d5 00 jmp $L881 +;|*** return; +;|*** } +;|*** +;|*** dwPercent = (CurValue*100)/MaxValue; +; Line 154 + $I685: +;|*** if ((dwPercent / 2) != (dwOldPercent / 2)) +; Line 155 + *** 000166 ff 76 0a push WORD PTR [bp+10] + *** 000169 ff 76 08 push WORD PTR [bp+8] ;MaxValue + *** 00016c 6a 00 push 0 + *** 00016e 6a 64 push 100 ;0064H + *** 000170 ff 76 06 push WORD PTR [bp+6] + *** 000173 ff 76 04 push WORD PTR [bp+4] ;CurValue + *** 000176 e8 00 00 call __aNulmul + *** 000179 52 push dx + *** 00017a 50 push ax + *** 00017b e8 00 00 call __aNuldiv + *** 00017e 89 46 fc mov WORD PTR [bp-4],ax ;dwPercent + *** 000181 89 56 fe mov WORD PTR [bp-2],dx + *** 000184 33 06 00 00 xor ax,WORD PTR $S684_?dwOldPercent@?1??DrawPercent@@9@9 + *** 000188 33 16 02 00 xor dx,WORD PTR $S684_?dwOldPercent@?1??DrawPercent@@9@9+2 + *** 00018c 24 fe and al,254 ;00feH + *** 00018e 0b d0 or dx,ax + *** 000190 75 03 jne $JCC400 + *** 000192 e9 9d 00 jmp $I687 + $JCC400: +;|*** { +;|*** fprintf(stderr, "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); +; Line 157 + *** 000195 68 00 00 push OFFSET DGROUP:$SG688 + *** 000198 68 10 00 push OFFSET __iob+16 + *** 00019b e8 00 00 call _fprintf + *** 00019e 83 c4 04 add sp,4 +;|*** +;|*** for (dwOldPercent=0; dwOldPercent < (dwPercent/2); dwOldPercent++) +; Line 159 + *** 0001a1 2b c0 sub ax,ax + *** 0001a3 a3 02 00 mov WORD PTR $S684_?dwOldPercent@?1??DrawPercent@@9@9+2,ax + *** 0001a6 a3 00 00 mov WORD PTR $S684_?dwOldPercent@?1??DrawPercent@@9@9,ax + *** 0001a9 f7 46 fe ff ff test WORD PTR [bp-2],-1 ;ffffH + *** 0001ae 77 07 ja $L856 + *** 0001b0 f7 46 fc fe ff test WORD PTR [bp-4],-2 ;fffeH ;dwPercent + *** 0001b5 76 31 jbe $L857 + $L856: +;|*** { +;|*** fprintf(stderr, "%c", 219); +; Line 161 + *** 0001b7 68 db 00 push 219 ;00dbH + *** 0001ba 68 00 00 push OFFSET DGROUP:$SG692 + *** 0001bd 68 10 00 push OFFSET __iob+16 + *** 0001c0 e8 00 00 call _fprintf + *** 0001c3 83 c4 06 add sp,6 + *** 0001c6 83 06 00 00 01 add WORD PTR $S684_?dwOldPercent@?1??DrawPercent@@9@9,1 + *** 0001cb 83 16 02 00 00 adc WORD PTR $S684_?dwOldPercent@?1??DrawPercent@@9@9+2,0 + *** 0001d0 8b 46 fc mov ax,WORD PTR [bp-4] ;dwPercent + *** 0001d3 8b 56 fe mov dx,WORD PTR [bp-2] + *** 0001d6 d1 ea shr dx,1 + *** 0001d8 d1 d8 rcr ax,1 + *** 0001da 3b 16 02 00 cmp dx,WORD PTR $S684_?dwOldPercent@?1??DrawPercent@@9@9+2 + *** 0001de 77 d7 ja $L856 + *** 0001e0 72 06 jb $L857 + *** 0001e2 3b 06 00 00 cmp ax,WORD PTR $S684_?dwOldPercent@?1??DrawPercent@@9@9 + *** 0001e6 77 cf ja $L856 + $L857: +;|*** } +;|*** +;|*** for (; dwOldPercent < 50; dwOldPercent++) +; Line 164 + *** 0001e8 83 3e 02 00 00 cmp WORD PTR $S684_?dwOldPercent@?1??DrawPercent@@9@9+2,0 + *** 0001ed 75 2e jne $L859 + *** 0001ef 83 3e 00 00 32 cmp WORD PTR $S684_?dwOldPercent@?1??DrawPercent@@9@9,50 ;0032H + *** 0001f4 73 27 jae $L859 + $F693: +;|*** { +;|*** fprintf(stderr, "%c", 176); +; Line 166 + *** 0001f6 68 b0 00 push 176 ;00b0H + *** 0001f9 68 00 00 push OFFSET DGROUP:$SG696 + *** 0001fc 68 10 00 push OFFSET __iob+16 + *** 0001ff e8 00 00 call _fprintf + *** 000202 83 c4 06 add sp,6 + *** 000205 83 06 00 00 01 add WORD PTR $S684_?dwOldPercent@?1??DrawPercent@@9@9,1 + *** 00020a 83 16 02 00 00 adc WORD PTR $S684_?dwOldPercent@?1??DrawPercent@@9@9+2,0 + *** 00020f 83 3e 02 00 00 cmp WORD PTR $S684_?dwOldPercent@?1??DrawPercent@@9@9+2,0 + *** 000214 75 07 jne $L859 + *** 000216 83 3e 00 00 32 cmp WORD PTR $S684_?dwOldPercent@?1??DrawPercent@@9@9,50 ;0032H + *** 00021b 72 d9 jb $F693 + $L859: +;|*** } +;|*** +;|*** dwOldPercent = dwPercent; +; Line 169 + *** 00021d 8b 46 fc mov ax,WORD PTR [bp-4] ;dwPercent + *** 000220 8b 56 fe mov dx,WORD PTR [bp-2] + *** 000223 a3 00 00 mov WORD PTR $S684_?dwOldPercent@?1??DrawPercent@@9@9,ax + *** 000226 89 16 02 00 mov WORD PTR $S684_?dwOldPercent@?1??DrawPercent@@9@9+2,dx +;|*** fprintf(stderr, " %2d%%", dwPercent); +; Line 170 + *** 00022a 52 push dx + *** 00022b 50 push ax + *** 00022c 68 00 00 push OFFSET DGROUP:$SG697 + *** 00022f eb 0a jmp SHORT $L881 + *** 000231 90 nop + $I687: +;|*** } +;|*** else +;|*** { +;|*** fprintf(stderr, "\b\b\b%2d%%", dwPercent); +; Line 174 + *** 000232 ff 76 fe push WORD PTR [bp-2] + *** 000235 ff 76 fc push WORD PTR [bp-4] ;dwPercent + *** 000238 68 00 00 push OFFSET DGROUP:$SG699 + $L881: + *** 00023b 68 10 00 push OFFSET __iob+16 + *** 00023e e8 00 00 call _fprintf +;|*** } +;|*** } +; Line 176 + *** 000241 c9 leave + *** 000242 c3 ret + *** 000243 90 nop + +_DrawPercent ENDP + PUBLIC _GetOneFile +_GetOneFile PROC NEAR +;|*** +;|*** BOOL +;|*** GetOneFile( +;|*** char *pszSourceFile, char *pszDestinationFile, +;|*** DWORD dwFileSize, time_t tmModify) +;|*** { +; Line 182 + *** 000244 c8 0c 00 00 enter 12,0 + *** 000248 57 push di + *** 000249 56 push si +; dwFileSize = 8 +; tmModify = 12 +; hDestinationFile = -6 +; hSourceFile = -10 +; register si = nReadCount +; dwBytesWritten = -4 +; utDestination = -12 +; tmNow = -4 +; pszSourceFile = 4 +; pszDestinationFile = 6 + *** 00024a 8b 76 04 mov si,WORD PTR [bp+4] ;pszSourceFile + *** 00024d 8b 7e 06 mov di,WORD PTR [bp+6] ;pszDestinationFile +;|*** int hDestinationFile; +;|*** DWORD hSourceFile; +;|*** +;|*** int nReadCount; +;|*** static char cReadBuffer[16384]; +;|*** +;|*** DWORD dwBytesWritten; +;|*** +;|*** printf("%s --> %s\n", pszSourceFile, pszDestinationFile); +; Line 191 + *** 000250 57 push di + *** 000251 56 push si + *** 000252 68 00 00 push OFFSET DGROUP:$SG716 + *** 000255 e8 00 00 call _printf + *** 000258 83 c4 06 add sp,6 +;|*** +;|*** hDestinationFile = _open( +;|*** pszDestinationFile, _O_WRONLY | _O_CREAT | _O_BINARY | _O_TRUNC, +;|*** _S_IREAD | _S_IWRITE); +;|*** +;|*** if (hDestinationFile == -1) +; Line 197 + *** 00025b 68 80 01 push 384 ;0180H + *** 00025e 68 01 83 push -31999 ;8301H + *** 000261 57 push di + *** 000262 e8 00 00 call __open + *** 000265 83 c4 06 add sp,6 + *** 000268 89 46 fa mov WORD PTR [bp-6],ax ;hDestinationFile + *** 00026b 40 inc ax + *** 00026c 75 16 jne $I717 +;|*** { +;|*** printf( +;|*** "%s: Error opening file for write access, error = %d\n", +;|*** pszDestinationFile, errno); +; Line 201 + *** 00026e ff 36 00 00 push WORD PTR _errno + *** 000272 57 push di + *** 000273 68 00 00 push OFFSET DGROUP:$SG718 + *** 000276 e8 00 00 call _printf + *** 000279 83 c4 06 add sp,6 +;|*** return FALSE; +; Line 202 + $L882: + *** 00027c 33 c0 xor ax,ax + *** 00027e 99 cwd + *** 00027f 5e pop si + *** 000280 5f pop di + *** 000281 c9 leave + *** 000282 c3 ret + *** 000283 90 nop +;|*** } +;|*** +;|*** hSourceFile = ropen(pszSourceFile, _O_RDONLY); +; Line 205 + $I717: +;|*** +;|*** if (hSourceFile == -1) +; Line 207 + *** 000284 6a 00 push 0 + *** 000286 6a 00 push 0 + *** 000288 56 push si + *** 000289 e8 00 00 call _ropen + *** 00028c 83 c4 06 add sp,6 + *** 00028f 89 46 f6 mov WORD PTR [bp-10],ax ;hSourceFile + *** 000292 89 56 f8 mov WORD PTR [bp-8],dx + *** 000295 3d ff ff cmp ax,-1 ;ffffH + *** 000298 75 1a jne $I719 + *** 00029a 3b d0 cmp dx,ax + *** 00029c 75 16 jne $I719 +;|*** { +;|*** _close(hDestinationFile); +; Line 209 + *** 00029e ff 76 fa push WORD PTR [bp-6] ;hDestinationFile + *** 0002a1 e8 00 00 call __close + *** 0002a4 83 c4 02 add sp,2 +;|*** printf("%s: Error opening file for read access\n", pszSourceFile); +; Line 210 + *** 0002a7 56 push si + *** 0002a8 68 00 00 push OFFSET DGROUP:$SG720 + *** 0002ab e8 00 00 call _printf + *** 0002ae 83 c4 04 add sp,4 + *** 0002b1 eb c9 jmp SHORT $L882 + *** 0002b3 90 nop +;|*** return FALSE; +;|*** } +;|*** +;|*** // Initialize the percent thingie. +;|*** DrawPercent((DWORD)-1, (DWORD)""); +; Line 215 + $I719: + *** 0002b4 1e push ds + *** 0002b5 68 00 00 push OFFSET DGROUP:$SG721 + *** 0002b8 6a ff push -1 ;ffffH + *** 0002ba 6a ff push -1 ;ffffH + *** 0002bc e8 7f fe call _DrawPercent + *** 0002bf 83 c4 08 add sp,8 +;|*** +;|*** dwBytesWritten = 0; +; Line 217 + *** 0002c2 2b c0 sub ax,ax + *** 0002c4 89 46 fe mov WORD PTR [bp-2],ax + *** 0002c7 89 46 fc mov WORD PTR [bp-4],ax ;dwBytesWritten + *** 0002ca 8b 7e fa mov di,WORD PTR [bp-6] ;hDestinationFile +;|*** +;|*** for ( ; ; ) +; Line 219 + *** 0002cd eb 27 jmp SHORT $L883 + *** 0002cf 90 nop + $FC723: +;|*** { +;|*** nReadCount = (int)rread(hSourceFile, &cReadBuffer[0], sizeof(cReadBuffer)); +;|*** +;|*** if (nReadCount <= 0) +;|*** { +;|*** break; +;|*** } +;|*** +;|*** _write(hDestinationFile, cReadBuffer, nReadCount); +; Line 228 + *** 0002d0 56 push si + *** 0002d1 68 00 00 push OFFSET DGROUP:$S714_?cReadBuffer@?1??GetOneFile@@9@9 + *** 0002d4 57 push di + *** 0002d5 e8 00 00 call __write + *** 0002d8 83 c4 06 add sp,6 +;|*** +;|*** dwBytesWritten += nReadCount; +;|*** +;|*** DrawPercent(dwBytesWritten, dwFileSize); +; Line 232 + *** 0002db ff 76 0a push WORD PTR [bp+10] + *** 0002de ff 76 08 push WORD PTR [bp+8] ;dwFileSize + *** 0002e1 8b c6 mov ax,si + *** 0002e3 99 cwd + *** 0002e4 01 46 fc add WORD PTR [bp-4],ax ;dwBytesWritten + *** 0002e7 11 56 fe adc WORD PTR [bp-2],dx + *** 0002ea ff 76 fe push WORD PTR [bp-2] + *** 0002ed ff 76 fc push WORD PTR [bp-4] ;dwBytesWritten + *** 0002f0 e8 4b fe call _DrawPercent + *** 0002f3 83 c4 08 add sp,8 +;|*** } +; Line 233 + $L883: + *** 0002f6 6a 00 push 0 + *** 0002f8 68 00 40 push 16384 ;4000H + *** 0002fb 68 00 00 push OFFSET DGROUP:$S714_?cReadBuffer@?1??GetOneFile@@9@9 + *** 0002fe ff 76 f8 push WORD PTR [bp-8] + *** 000301 ff 76 f6 push WORD PTR [bp-10] ;hSourceFile + *** 000304 e8 00 00 call _rread + *** 000307 83 c4 0a add sp,10 ;000aH + *** 00030a 8b f0 mov si,ax + *** 00030c 0b f0 or si,ax + *** 00030e 7f c0 jg $FC723 +;|*** +;|*** fprintf(stderr, "\r \r"); +; Line 235 + *** 000310 68 00 00 push OFFSET DGROUP:$SG726 + *** 000313 68 10 00 push OFFSET __iob+16 + *** 000316 e8 00 00 call _fprintf + *** 000319 83 c4 04 add sp,4 +;|*** +;|*** rclose(hSourceFile); +; Line 237 + *** 00031c ff 76 f8 push WORD PTR [bp-8] + *** 00031f ff 76 f6 push WORD PTR [bp-10] ;hSourceFile + *** 000322 e8 00 00 call _rclose + *** 000325 83 c4 04 add sp,4 +;|*** +;|*** _close(hDestinationFile); +; Line 239 + *** 000328 57 push di + *** 000329 e8 00 00 call __close + *** 00032c 83 c4 02 add sp,2 +;|*** +;|*** if (nReadCount == 0) +; Line 241 + *** 00032f 0b f6 or si,si + *** 000331 75 3f jne $I727 +;|*** { +;|*** struct _utimbuf utDestination; +;|*** time_t tmNow; +;|*** +;|*** time(&tmNow); +; Line 246 + *** 000333 8d 46 fc lea ax,WORD PTR [bp-4] ;dwBytesWritten + *** 000336 50 push ax + *** 000337 e8 00 00 call _time + *** 00033a 83 c4 02 add sp,2 +;|*** +;|*** utDestination.actime = tmNow; +; Line 248 + *** 00033d 8b 46 fc mov ax,WORD PTR [bp-4] ;dwBytesWritten + *** 000340 8b 56 fe mov dx,WORD PTR [bp-2] + *** 000343 89 46 f4 mov WORD PTR [bp-12],ax ;utDestination + *** 000346 89 56 f6 mov WORD PTR [bp-10],dx ;hSourceFile +;|*** utDestination.modtime = tmModify != 0 ? tmModify : tmNow; +; Line 249 + *** 000349 8b 46 0e mov ax,WORD PTR [bp+14] + *** 00034c 0b 46 0c or ax,WORD PTR [bp+12] ;tmModify + *** 00034f 74 09 je $L860 + *** 000351 8b 46 0c mov ax,WORD PTR [bp+12] ;tmModify + *** 000354 8b 56 0e mov dx,WORD PTR [bp+14] + *** 000357 eb 04 jmp SHORT $L884 + *** 000359 90 nop + $L860: + *** 00035a 8b 46 fc mov ax,WORD PTR [bp-4] ;dwBytesWritten + $L884: + *** 00035d 89 46 f8 mov WORD PTR [bp-8],ax + *** 000360 89 56 fa mov WORD PTR [bp-6],dx ;hDestinationFile +;|*** _utime(pszDestinationFile, &utDestination); +; Line 250 + *** 000363 8d 46 f4 lea ax,WORD PTR [bp-12] ;utDestination + *** 000366 50 push ax + *** 000367 ff 76 06 push WORD PTR [bp+6] ;pszDestinationFile + *** 00036a e8 00 00 call __utime + *** 00036d 83 c4 04 add sp,4 +;|*** } +;|*** else +; Line 252 + *** 000370 eb 09 jmp SHORT $I730 + $I727: +;|*** { +;|*** _unlink(pszDestinationFile); +; Line 254 + *** 000372 ff 76 06 push WORD PTR [bp+6] ;pszDestinationFile + *** 000375 e8 00 00 call __unlink + *** 000378 83 c4 02 add sp,2 +;|*** } +; Line 255 + $I730: +;|*** +;|*** return nReadCount == 0; +; Line 257 + *** 00037b 83 fe 01 cmp si,1 + *** 00037e 1b c0 sbb ax,ax + *** 000380 f7 d8 neg ax + *** 000382 99 cwd +;|*** } +; Line 258 + *** 000383 5e pop si + *** 000384 5f pop di + *** 000385 c9 leave + *** 000386 c3 ret + *** 000387 90 nop + +_GetOneFile ENDP + PUBLIC _CheckDestination +_CheckDestination PROC NEAR +;|*** +;|*** BOOL +;|*** CheckDestination(char *pszDestination, char **ppszDirEnd) +;|*** { +; Line 262 + *** 000388 c8 22 00 00 enter 34,0 + *** 00038c 57 push di + *** 00038d 56 push si +; pszDestination = 4 +; ppszDirEnd = 6 +; stDestination = -34 +; bIsDir = -4 + *** 00038e 8b 76 04 mov si,WORD PTR [bp+4] ;pszDestination +;|*** struct _stat stDestination; +;|*** BOOL bIsDir; +;|*** +;|*** *ppszDirEnd = strrchr(pszDestination, '\\'); +; Line 266 + *** 000391 6a 5c push 92 ;005cH + *** 000393 56 push si + *** 000394 e8 00 00 call _strrchr + *** 000397 8b 5e 06 mov bx,WORD PTR [bp+6] ;ppszDirEnd + *** 00039a 83 c4 04 add sp,4 + *** 00039d 89 07 mov WORD PTR [bx],ax +;|*** +;|*** if (*ppszDirEnd == NULL && pszDestination[1] == ':') +; Line 268 + *** 00039f 0b c0 or ax,ax + *** 0003a1 75 0e jne $I739 + *** 0003a3 80 7c 01 3a cmp BYTE PTR [si+1],58 ;003aH + *** 0003a7 75 08 jne $I739 +;|*** { +;|*** *ppszDirEnd = &pszDestination[1]; +; Line 270 + *** 0003a9 8d 44 01 lea ax,WORD PTR [si+1] + *** 0003ac 8b 5e 06 mov bx,WORD PTR [bp+6] ;ppszDirEnd + *** 0003af 89 07 mov WORD PTR [bx],ax +;|*** } +;|*** +;|*** if (*ppszDirEnd == NULL) +; Line 273 + $I739: + *** 0003b1 8b 5e 06 mov bx,WORD PTR [bp+6] ;ppszDirEnd + *** 0003b4 83 3f 00 cmp WORD PTR [bx],0 + *** 0003b7 75 05 jne $I740 +;|*** { +;|*** *ppszDirEnd = pszDestination; +; Line 275 + *** 0003b9 89 37 mov WORD PTR [bx],si +;|*** } +;|*** else +; Line 277 + *** 0003bb eb 03 jmp SHORT $I741 + *** 0003bd 90 nop + $I740: +;|*** { +;|*** (*ppszDirEnd)++; +; Line 279 + *** 0003be ff 07 inc WORD PTR [bx] +;|*** } +; Line 280 + $I741: +;|*** +;|*** bIsDir = FALSE; +; Line 282 + *** 0003c0 2b c0 sub ax,ax + *** 0003c2 89 46 fe mov WORD PTR [bp-2],ax + *** 0003c5 89 46 fc mov WORD PTR [bp-4],ax ;bIsDir +;|*** +;|*** if (pszDestination[strlen(pszDestination)-1] == '\\') +; Line 284 + *** 0003c8 8b fe mov di,si + *** 0003ca 8c d8 mov ax,ds + *** 0003cc 8e c0 mov es,ax + *** 0003ce b9 ff ff mov cx,-1 ;ffffH + *** 0003d1 33 c0 xor ax,ax + *** 0003d3 f2 repnz + *** 0003d4 ae scasb + *** 0003d5 f7 d1 not cx + *** 0003d7 49 dec cx + *** 0003d8 8b d9 mov bx,cx + *** 0003da 80 78 ff 5c cmp BYTE PTR [bx-1][si],92 ;005cH + *** 0003de 75 17 jne $I742 +;|*** { +;|*** pszDestination[strlen(pszDestination)-1] = '\0'; +; Line 286 + *** 0003e0 8b fe mov di,si + *** 0003e2 b9 ff ff mov cx,-1 ;ffffH + *** 0003e5 f2 repnz + *** 0003e6 ae scasb + *** 0003e7 f7 d1 not cx + *** 0003e9 49 dec cx + *** 0003ea 8b d9 mov bx,cx + *** 0003ec 88 40 ff mov BYTE PTR [bx-1][si],al +;|*** bIsDir = TRUE; +; Line 287 + *** 0003ef c7 46 fc 01 00 mov WORD PTR [bp-4],1 ;bIsDir + *** 0003f4 89 46 fe mov WORD PTR [bp-2],ax +;|*** } +;|*** +;|*** if (_stat(pszDestination, &stDestination) == 0) +; Line 290 + $I742: + *** 0003f7 8d 46 de lea ax,WORD PTR [bp-34] ;stDestination + *** 0003fa 50 push ax + *** 0003fb 56 push si + *** 0003fc e8 00 00 call __stat + *** 0003ff 83 c4 04 add sp,4 + *** 000402 0b c0 or ax,ax + *** 000404 75 10 jne $I743 +;|*** { +;|*** if (stDestination.st_mode & _S_IFDIR) +; Line 292 + *** 000406 f6 46 e3 40 test BYTE PTR [bp-29],64 ;0040H + *** 00040a 74 2a je $I745 +;|*** { +;|*** bIsDir = TRUE; +; Line 294 + *** 00040c c7 46 fc 01 00 mov WORD PTR [bp-4],1 ;bIsDir + *** 000411 89 46 fe mov WORD PTR [bp-2],ax +;|*** } +;|*** } +;|*** else if (bIsDir) +; Line 297 + *** 000414 eb 20 jmp SHORT $I745 + $I743: + *** 000416 8b 46 fe mov ax,WORD PTR [bp-2] + *** 000419 0b 46 fc or ax,WORD PTR [bp-4] ;bIsDir + *** 00041c 74 18 je $I745 +;|*** { +;|*** if (_mkdir(pszDestination) == -1) +; Line 299 + *** 00041e 56 push si + *** 00041f e8 00 00 call __mkdir + *** 000422 83 c4 02 add sp,2 + *** 000425 40 inc ax + *** 000426 75 0e jne $I745 +;|*** { +;|*** printf("%s: Error creating directory, error = %d\n", pszDestination, errno); +; Line 301 + *** 000428 ff 36 00 00 push WORD PTR _errno + *** 00042c 56 push si + *** 00042d 68 00 00 push OFFSET DGROUP:$SG748 + *** 000430 e8 00 00 call _printf + *** 000433 83 c4 06 add sp,6 +;|*** } +;|*** } +;|*** +;|*** if (bIsDir) +; Line 305 + $I745: + *** 000436 8b 46 fe mov ax,WORD PTR [bp-2] + *** 000439 0b 46 fc or ax,WORD PTR [bp-4] ;bIsDir + *** 00043c 74 29 je $I749 +;|*** { +;|*** *ppszDirEnd = &pszDestination[strlen(pszDestination)]; +; Line 307 + *** 00043e 8b fe mov di,si + *** 000440 8c d8 mov ax,ds + *** 000442 8e c0 mov es,ax + *** 000444 b9 ff ff mov cx,-1 ;ffffH + *** 000447 33 c0 xor ax,ax + *** 000449 f2 repnz + *** 00044a ae scasb + *** 00044b f7 d1 not cx + *** 00044d 49 dec cx + *** 00044e 8b 5e 06 mov bx,WORD PTR [bp+6] ;ppszDirEnd + *** 000451 03 ce add cx,si + *** 000453 89 0f mov WORD PTR [bx],cx +;|*** +;|*** if (*ppszDirEnd[-1] != '\\') +; Line 309 + *** 000455 8b 5f fe mov bx,WORD PTR [bx-2] + *** 000458 80 3f 5c cmp BYTE PTR [bx],92 ;005cH + *** 00045b 74 0a je $I749 +;|*** { +;|*** *(*ppszDirEnd)++ = '\\'; +; Line 311 + *** 00045d 8b 5e 06 mov bx,WORD PTR [bp+6] ;ppszDirEnd + *** 000460 8b 37 mov si,WORD PTR [bx] + *** 000462 c6 04 5c mov BYTE PTR [si],92 ;005cH + *** 000465 ff 07 inc WORD PTR [bx] +;|*** } +;|*** } +;|*** +;|*** return bIsDir; +; Line 315 + $I749: + *** 000467 8b 46 fc mov ax,WORD PTR [bp-4] ;bIsDir + *** 00046a 8b 56 fe mov dx,WORD PTR [bp-2] +;|*** } +; Line 316 + *** 00046d 5e pop si + *** 00046e 5f pop di + *** 00046f c9 leave + *** 000470 c3 ret + *** 000471 90 nop + +_CheckDestination ENDP + PUBLIC _GetFile +_GetFile PROC NEAR +;|*** +;|*** VOID +;|*** GetFile(char *pszSource, char *pszDestination, USHORT usCopyFlags) +;|*** { +; Line 320 + *** 000472 c8 50 03 00 enter 848,0 + *** 000476 57 push di + *** 000477 56 push si +; bDestinationExists = -848 +; bDoCopy = -14 +; nDirLength = -854 +; pszSource = 4 +; pszDestination = 6 +; usCopyFlags = 8 +; hFind = -4 +; stDestination = -48 +; szDestinationFile = -568 +; pDestinationDirEnd = -18 +; fdSource = -848 +; szSourceFile = -308 +; pSourceDirEnd = -10 +; bDestinationIsDir = -8 +; nFilesCopied = -16 +;|*** DWORD hFind; +;|*** +;|*** struct _stat stDestination; +;|*** char szDestinationFile[_MAX_PATH]; +;|*** char *pDestinationDirEnd; +;|*** +;|*** struct _finddata_t fdSource; +;|*** char szSourceFile[_MAX_PATH]; +;|*** char *pSourceDirEnd; +;|*** +;|*** BOOL bDestinationIsDir; +;|*** +;|*** int nFilesCopied = 0; +; Line 333 + *** 000478 c7 46 f0 00 00 mov WORD PTR [bp-16],0 ;nFilesCopied +;|*** +;|*** BOOL bDestinationExists; +;|*** BOOL bDoCopy; +;|*** +;|*** pSourceDirEnd = strrchr(pszSource, '\\'); +;|*** +;|*** if (pSourceDirEnd == NULL && pszSource[1] == ':') +; Line 340 + *** 00047d 6a 5c push 92 ;005cH + *** 00047f ff 76 04 push WORD PTR [bp+4] ;pszSource + *** 000482 e8 00 00 call _strrchr + *** 000485 83 c4 04 add sp,4 + *** 000488 89 46 f6 mov WORD PTR [bp-10],ax ;pSourceDirEnd + *** 00048b 0b c0 or ax,ax + *** 00048d 75 0f jne $I770 + *** 00048f 8b 5e 04 mov bx,WORD PTR [bp+4] ;pszSource + *** 000492 80 7f 01 3a cmp BYTE PTR [bx+1],58 ;003aH + *** 000496 75 06 jne $I770 +;|*** { +;|*** pSourceDirEnd = &pszSource[1]; +; Line 342 + *** 000498 8d 47 01 lea ax,WORD PTR [bx+1] + *** 00049b 89 46 f6 mov WORD PTR [bp-10],ax ;pSourceDirEnd +;|*** } +;|*** +;|*** if (pSourceDirEnd != NULL) +; Line 345 + $I770: + *** 00049e 0b c0 or ax,ax + *** 0004a0 74 24 je $I771 +;|*** { +;|*** int nDirLength = pSourceDirEnd - pszSource + 1; +;|*** +;|*** memcpy(szSourceFile, pszSource, nDirLength); +; Line 349 + *** 0004a2 8b 46 04 mov ax,WORD PTR [bp+4] ;pszSource + *** 0004a5 8b 4e f6 mov cx,WORD PTR [bp-10] ;pSourceDirEnd + *** 0004a8 2b c8 sub cx,ax + *** 0004aa 41 inc cx + *** 0004ab 8b d1 mov dx,cx + *** 0004ad 8d be cc fe lea di,WORD PTR [bp-308] ;szSourceFile + *** 0004b1 8b f0 mov si,ax + *** 0004b3 16 push ss + *** 0004b4 07 pop es + *** 0004b5 d1 e9 shr cx,1 + *** 0004b7 f3 rep + *** 0004b8 a5 movsw + *** 0004b9 13 c9 adc cx,cx + *** 0004bb f3 rep + *** 0004bc a4 movsb +;|*** pSourceDirEnd = &szSourceFile[nDirLength]; +; Line 350 + *** 0004bd 8b f2 mov si,dx + *** 0004bf 8d 82 cc fe lea ax,WORD PTR [bp-308][si] + *** 0004c3 eb 05 jmp SHORT $L886 + *** 0004c5 90 nop + $I771: +;|*** } +;|*** else +;|*** { +;|*** pSourceDirEnd = szSourceFile; +; Line 354 + *** 0004c6 8d 86 cc fe lea ax,WORD PTR [bp-308] ;szSourceFile + $L886: + *** 0004ca 89 46 f6 mov WORD PTR [bp-10],ax ;pSourceDirEnd +;|*** } +;|*** +;|*** hFind = rfindfirst(0, pszSource, &fdSource); +;|*** +;|*** if (hFind == 0 || hFind == -1) +; Line 359 + *** 0004cd 8d 86 b0 fc lea ax,WORD PTR [bp-848] ;bDestinationExists + *** 0004d1 50 push ax + *** 0004d2 ff 76 04 push WORD PTR [bp+4] ;pszSource + *** 0004d5 6a 00 push 0 + *** 0004d7 6a 00 push 0 + *** 0004d9 e8 00 00 call _rfindfirst + *** 0004dc 83 c4 08 add sp,8 + *** 0004df 89 46 fc mov WORD PTR [bp-4],ax ;hFind + *** 0004e2 89 56 fe mov WORD PTR [bp-2],dx + *** 0004e5 0b d0 or dx,ax + *** 0004e7 75 03 jne $JCC1255 + *** 0004e9 e9 b8 01 jmp $I775 + $JCC1255: + *** 0004ec 3d ff ff cmp ax,-1 ;ffffH + *** 0004ef 75 08 jne $L869 + *** 0004f1 39 46 fe cmp WORD PTR [bp-2],ax + *** 0004f4 75 03 jne $JCC1268 + *** 0004f6 e9 ab 01 jmp $I775 + $JCC1268: + $L869: +;|*** { +;|*** printf("%s: File(s) not found\n", pszSource); +;|*** return; +;|*** } +;|*** +;|*** if (pszDestination != NULL) +; Line 365 + *** 0004f9 83 7e 06 00 cmp WORD PTR [bp+6],0 ;pszDestination + *** 0004fd 74 35 je $I777 +;|*** { +;|*** strcpy(szDestinationFile, pszDestination); +; Line 367 + *** 0004ff 8d b6 c8 fd lea si,WORD PTR [bp-568] ;szDestinationFile + *** 000503 1e push ds + *** 000504 07 pop es + *** 000505 8b 7e 06 mov di,WORD PTR [bp+6] ;pszDestination + *** 000508 b9 ff ff mov cx,-1 ;ffffH + *** 00050b 33 c0 xor ax,ax + *** 00050d f2 repnz + *** 00050e ae scasb + *** 00050f f7 d1 not cx + *** 000511 2b f9 sub di,cx + *** 000513 87 fe xchg di,si + *** 000515 d1 e9 shr cx,1 + *** 000517 f3 rep + *** 000518 a5 movsw + *** 000519 13 c9 adc cx,cx + *** 00051b f3 rep + *** 00051c a4 movsb +;|*** +;|*** bDestinationIsDir = CheckDestination(szDestinationFile, &pDestinationDirEnd); +; Line 369 + *** 00051d 8d 46 ee lea ax,WORD PTR [bp-18] ;pDestinationDirEnd + *** 000520 50 push ax + *** 000521 8d 86 c8 fd lea ax,WORD PTR [bp-568] ;szDestinationFile + *** 000525 50 push ax + *** 000526 e8 5f fe call _CheckDestination + *** 000529 83 c4 04 add sp,4 + *** 00052c 89 46 f8 mov WORD PTR [bp-8],ax ;bDestinationIsDir + *** 00052f 89 56 fa mov WORD PTR [bp-6],dx +;|*** } +;|*** else +; Line 371 + *** 000532 eb 11 jmp SHORT $L867 + $I777: +;|*** { +;|*** pDestinationDirEnd = szDestinationFile; +; Line 373 + *** 000534 8d 86 c8 fd lea ax,WORD PTR [bp-568] ;szDestinationFile + *** 000538 89 46 ee mov WORD PTR [bp-18],ax ;pDestinationDirEnd +;|*** bDestinationIsDir = TRUE; +; Line 374 + *** 00053b c7 46 f8 01 00 mov WORD PTR [bp-8],1 ;bDestinationIsDir + *** 000540 c7 46 fa 00 00 mov WORD PTR [bp-6],0 + $L867: +;|*** } +;|*** +;|*** do +;|*** { +;|*** strcpy(pSourceDirEnd, fdSource.name); +; Line 379 + *** 000545 8d be c4 fc lea di,WORD PTR [bp-828] + *** 000549 8c d1 mov cx,ss + *** 00054b 8e c1 mov es,cx + *** 00054d 8b 76 f6 mov si,WORD PTR [bp-10] ;pSourceDirEnd + *** 000550 b9 ff ff mov cx,-1 ;ffffH + *** 000553 33 c0 xor ax,ax + *** 000555 f2 repnz + *** 000556 ae scasb + *** 000557 f7 d1 not cx + *** 000559 2b f9 sub di,cx + *** 00055b 87 fe xchg di,si + *** 00055d d1 e9 shr cx,1 + *** 00055f f3 rep + *** 000560 a5 movsw + *** 000561 13 c9 adc cx,cx + *** 000563 f3 rep + *** 000564 a4 movsb +;|*** +;|*** if (bDestinationIsDir) +; Line 381 + *** 000565 8b 46 fa mov ax,WORD PTR [bp-6] + *** 000568 0b 46 f8 or ax,WORD PTR [bp-8] ;bDestinationIsDir + *** 00056b 74 1c je $I782 +;|*** { +;|*** strcpy(pDestinationDirEnd, fdSource.name); +; Line 383 + *** 00056d 8d be c4 fc lea di,WORD PTR [bp-828] + *** 000571 8b 76 ee mov si,WORD PTR [bp-18] ;pDestinationDirEnd + *** 000574 b9 ff ff mov cx,-1 ;ffffH + *** 000577 33 c0 xor ax,ax + *** 000579 f2 repnz + *** 00057a ae scasb + *** 00057b f7 d1 not cx + *** 00057d 2b f9 sub di,cx + *** 00057f 87 fe xchg di,si + *** 000581 d1 e9 shr cx,1 + *** 000583 f3 rep + *** 000584 a5 movsw + *** 000585 13 c9 adc cx,cx + *** 000587 f3 rep + *** 000588 a4 movsb +;|*** } +;|*** +;|*** bDoCopy = TRUE; +; Line 386 + $I782: + *** 000589 c7 46 f2 01 00 mov WORD PTR [bp-14],1 ;bDoCopy + *** 00058e c7 46 f4 00 00 mov WORD PTR [bp-12],0 +;|*** +;|*** if (usCopyFlags & (COPY_FLAG_UPDATE_EXISTING | COPY_FLAG_UPDATE_OR_ADD)) +; Line 388 + *** 000593 f6 46 08 03 test BYTE PTR [bp+8],3 ;usCopyFlags + *** 000597 74 57 je $I783 +;|*** { +;|*** bDestinationExists = _stat(szDestinationFile, &stDestination) == 0; +;|*** +;|*** if (bDestinationExists) +; Line 392 + *** 000599 8d 46 d0 lea ax,WORD PTR [bp-48] ;stDestination + *** 00059c 50 push ax + *** 00059d 8d 86 c8 fd lea ax,WORD PTR [bp-568] ;szDestinationFile + *** 0005a1 50 push ax + *** 0005a2 e8 00 00 call __stat + *** 0005a5 83 c4 04 add sp,4 + *** 0005a8 0b c0 or ax,ax + *** 0005aa 75 28 jne $I784 +;|*** { +;|*** // +;|*** // Clear lsb of both times so inaccurate FATFS doesn't cause +;|*** // problems +;|*** // +;|*** stDestination.st_mtime &= ~1; +;|*** fdSource.time_write &= ~1; +;|*** +;|*** if (stDestination.st_mtime >= fdSource.time_write) +; Line 401 + *** 0005ac 80 66 e6 fe and BYTE PTR [bp-26],254 ;00feH + *** 0005b0 8b 46 e6 mov ax,WORD PTR [bp-26] + *** 0005b3 8b 56 e8 mov dx,WORD PTR [bp-24] + *** 0005b6 80 a6 bc fc fe and BYTE PTR [bp-836],254 ;00feH + *** 0005bb 39 96 be fc cmp WORD PTR [bp-834],dx + *** 0005bf 77 2f ja $I783 + *** 0005c1 72 06 jb $L870 + *** 0005c3 39 86 bc fc cmp WORD PTR [bp-836],ax + *** 0005c7 77 27 ja $I783 + $L870: +;|*** { +;|*** printf("%s: Up to date\n", szDestinationFile); +; Line 403 + *** 0005c9 8d 86 c8 fd lea ax,WORD PTR [bp-568] ;szDestinationFile + *** 0005cd 50 push ax + *** 0005ce 68 00 00 push OFFSET DGROUP:$SG786 + *** 0005d1 eb 0f jmp SHORT $L887 + *** 0005d3 90 nop + $I784: + *** 0005d4 f6 46 08 02 test BYTE PTR [bp+8],2 ;usCopyFlags + *** 0005d8 75 16 jne $I783 +;|*** bDoCopy = FALSE; +;|*** } +;|*** } +;|*** else if (!(usCopyFlags & COPY_FLAG_UPDATE_OR_ADD)) +;|*** { +;|*** printf("%s: Skipping\n", szSourceFile); +; Line 409 + *** 0005da 8d 86 cc fe lea ax,WORD PTR [bp-308] ;szSourceFile + *** 0005de 50 push ax + *** 0005df 68 00 00 push OFFSET DGROUP:$SG789 + $L887: + *** 0005e2 e8 00 00 call _printf + *** 0005e5 83 c4 04 add sp,4 +;|*** bDoCopy = FALSE; +; Line 410 + *** 0005e8 2b c0 sub ax,ax + *** 0005ea 89 46 f4 mov WORD PTR [bp-12],ax + *** 0005ed 89 46 f2 mov WORD PTR [bp-14],ax ;bDoCopy +;|*** } +;|*** } +;|*** +;|*** if (bDoCopy) +; Line 414 + $I783: + *** 0005f0 8b 46 f4 mov ax,WORD PTR [bp-12] + *** 0005f3 0b 46 f2 or ax,WORD PTR [bp-14] ;bDoCopy + *** 0005f6 74 27 je $I790 +;|*** { +;|*** if (GetOneFile(szSourceFile, szDestinationFile, fdSource.size, fdSource.time_write)) +; Line 416 + *** 0005f8 ff b6 be fc push WORD PTR [bp-834] + *** 0005fc ff b6 bc fc push WORD PTR [bp-836] + *** 000600 ff b6 c2 fc push WORD PTR [bp-830] + *** 000604 ff b6 c0 fc push WORD PTR [bp-832] + *** 000608 8d 86 c8 fd lea ax,WORD PTR [bp-568] ;szDestinationFile + *** 00060c 50 push ax + *** 00060d 8d 86 cc fe lea ax,WORD PTR [bp-308] ;szSourceFile + *** 000611 50 push ax + *** 000612 e8 2f fc call _GetOneFile + *** 000615 83 c4 0c add sp,12 ;000cH + *** 000618 0b d0 or dx,ax + *** 00061a 74 4c je $D795 +;|*** { +;|*** nFilesCopied++; +; Line 418 + *** 00061c ff 46 f0 inc WORD PTR [bp-16] ;nFilesCopied +;|*** } +;|*** else +;|*** { +;|*** break; +;|*** } +;|*** } +;|*** +;|*** hFind = rfindnext(hFind, &fdSource); +; Line 426 + $I790: + *** 00061f 8d 86 b0 fc lea ax,WORD PTR [bp-848] ;bDestinationExists + *** 000623 50 push ax + *** 000624 ff 76 fe push WORD PTR [bp-2] + *** 000627 ff 76 fc push WORD PTR [bp-4] ;hFind + *** 00062a e8 00 00 call _rfindnext + *** 00062d 83 c4 06 add sp,6 + *** 000630 89 46 fc mov WORD PTR [bp-4],ax ;hFind + *** 000633 89 56 fe mov WORD PTR [bp-2],dx +;|*** +;|*** if (!bDestinationIsDir && hFind != 0 && hFind != -1) +; Line 428 + *** 000636 8b 46 fa mov ax,WORD PTR [bp-6] + *** 000639 0b 46 f8 or ax,WORD PTR [bp-8] ;bDestinationIsDir + *** 00063c 75 12 jne $DC780 + *** 00063e 8b c2 mov ax,dx + *** 000640 0b 46 fc or ax,WORD PTR [bp-4] ;hFind + *** 000643 74 0b je $DC780 + *** 000645 83 7e fc ff cmp WORD PTR [bp-4],-1 ;ffffH ;hFind + *** 000649 75 49 jne $L868 + *** 00064b 83 fa ff cmp dx,-1 ;ffffH + *** 00064e 75 44 jne $L868 +;|*** { +;|*** printf( +;|*** "%s: Destination isn't a directory and multiple files selected\n", +;|*** szDestinationFile); +;|*** +;|*** break; +;|*** } +;|*** } +;|*** while (hFind != 0 && hFind != -1); +; Line 437 + $DC780: + *** 000650 8b c2 mov ax,dx + *** 000652 0b 46 fc or ax,WORD PTR [bp-4] ;hFind + *** 000655 74 11 je $D795 + *** 000657 83 7e fc ff cmp WORD PTR [bp-4],-1 ;ffffH ;hFind + *** 00065b 74 03 je $JCC1627 + *** 00065d e9 e5 fe jmp $L867 + $JCC1627: + *** 000660 83 fa ff cmp dx,-1 ;ffffH + *** 000663 74 03 je $JCC1635 + *** 000665 e9 dd fe jmp $L867 + $JCC1635: + $D795: +;|*** +;|*** if (hFind != 0 && hFind != -1) +; Line 439 + *** 000668 8b 46 fe mov ax,WORD PTR [bp-2] + *** 00066b 0b 46 fc or ax,WORD PTR [bp-4] ;hFind + *** 00066e 74 1c je $I796 + *** 000670 83 7e fc ff cmp WORD PTR [bp-4],-1 ;ffffH ;hFind + *** 000674 75 06 jne $L871 + *** 000676 83 7e fe ff cmp WORD PTR [bp-2],-1 ;ffffH + *** 00067a 74 10 je $I796 + $L871: +;|*** { +;|*** rfindfirst(hFind, NULL, NULL); +; Line 441 + *** 00067c 6a 00 push 0 + *** 00067e 6a 00 push 0 + *** 000680 ff 76 fe push WORD PTR [bp-2] + *** 000683 ff 76 fc push WORD PTR [bp-4] ;hFind + *** 000686 e8 00 00 call _rfindfirst + *** 000689 83 c4 08 add sp,8 +;|*** } +;|*** +;|*** printf("%d files copied\n", nFilesCopied); +; Line 444 + $I796: + *** 00068c ff 76 f0 push WORD PTR [bp-16] ;nFilesCopied + *** 00068f 68 00 00 push OFFSET DGROUP:$SG797 + *** 000692 eb 16 jmp SHORT $L888 + $L868: +;|*** szDestinationFile); +; Line 432 + *** 000694 8d 86 c8 fd lea ax,WORD PTR [bp-568] ;szDestinationFile + *** 000698 50 push ax + *** 000699 68 00 00 push OFFSET DGROUP:$SG794 + *** 00069c e8 00 00 call _printf + *** 00069f 83 c4 04 add sp,4 +;|*** +;|*** break; +; Line 434 + *** 0006a2 eb c4 jmp SHORT $D795 +;|*** if (hFind == 0 || hFind == -1) +; Line 359 + $I775: +;|*** { +;|*** printf("%s: File(s) not found\n", pszSource); +; Line 361 + *** 0006a4 ff 76 04 push WORD PTR [bp+4] ;pszSource + *** 0006a7 68 00 00 push OFFSET DGROUP:$SG776 + $L888: + *** 0006aa e8 00 00 call _printf + *** 0006ad 83 c4 04 add sp,4 +;|*** return; +;|*** } +;|*** +;|*** if (pszDestination != NULL) +;|*** { +;|*** strcpy(szDestinationFile, pszDestination); +;|*** +;|*** bDestinationIsDir = CheckDestination(szDestinationFile, &pDestinationDirEnd); +;|*** } +;|*** else +;|*** { +;|*** pDestinationDirEnd = szDestinationFile; +;|*** bDestinationIsDir = TRUE; +;|*** } +;|*** +;|*** do +;|*** { +;|*** strcpy(pSourceDirEnd, fdSource.name); +;|*** +;|*** if (bDestinationIsDir) +;|*** { +;|*** strcpy(pDestinationDirEnd, fdSource.name); +;|*** } +;|*** +;|*** bDoCopy = TRUE; +;|*** +;|*** if (usCopyFlags & (COPY_FLAG_UPDATE_EXISTING | COPY_FLAG_UPDATE_OR_ADD)) +;|*** { +;|*** bDestinationExists = _stat(szDestinationFile, &stDestination) == 0; +;|*** +;|*** if (bDestinationExists) +;|*** { +;|*** // +;|*** // Clear lsb of both times so inaccurate FATFS doesn't cause +;|*** // problems +;|*** // +;|*** stDestination.st_mtime &= ~1; +;|*** fdSource.time_write &= ~1; +;|*** +;|*** if (stDestination.st_mtime >= fdSource.time_write) +;|*** { +;|*** printf("%s: Up to date\n", szDestinationFile); +;|*** bDoCopy = FALSE; +;|*** } +;|*** } +;|*** else if (!(usCopyFlags & COPY_FLAG_UPDATE_OR_ADD)) +;|*** { +;|*** printf("%s: Skipping\n", szSourceFile); +;|*** bDoCopy = FALSE; +;|*** } +;|*** } +;|*** +;|*** if (bDoCopy) +;|*** { +;|*** if (GetOneFile(szSourceFile, szDestinationFile, fdSource.size, fdSource.time_write)) +;|*** { +;|*** nFilesCopied++; +;|*** } +;|*** else +;|*** { +;|*** break; +;|*** } +;|*** } +;|*** +;|*** hFind = rfindnext(hFind, &fdSource); +;|*** +;|*** if (!bDestinationIsDir && hFind != 0 && hFind != -1) +;|*** { +;|*** printf( +;|*** "%s: Destination isn't a directory and multiple files selected\n", +;|*** szDestinationFile); +;|*** +;|*** break; +;|*** } +;|*** } +;|*** while (hFind != 0 && hFind != -1); +;|*** +;|*** if (hFind != 0 && hFind != -1) +;|*** { +;|*** rfindfirst(hFind, NULL, NULL); +;|*** } +;|*** +;|*** printf("%d files copied\n", nFilesCopied); +;|*** } +; Line 445 + *** 0006b0 5e pop si + *** 0006b1 5f pop di + *** 0006b2 c9 leave + *** 0006b3 c3 ret + +_GetFile ENDP + PUBLIC _main2 +_main2 PROC NEAR +;|*** +;|*** int +;|*** main2(int argc, char **argv) +;|*** { +; Line 449 + *** 0006b4 c8 0a 00 00 enter 10,0 + *** 0006b8 56 push si +; argc = 4 +; argv = 6 +; cOption = -1 +; register si = i +; register dx = pszPath +; pszSource = -4 +; pszDestination = -8 +;|*** char cOption; +;|*** int i; +;|*** int OEMParallelPortInit(void); +;|*** +;|*** // +;|*** // Keep timezone conversions from getting in our way. All of the responses +;|*** // from the host are in local time anyways. +;|*** // +;|*** _daylight = 0; +; Line 458 + *** 0006b9 c7 06 00 00 00 00 mov WORD PTR __daylight,0 +;|*** _timezone = 0; +; Line 459 + *** 0006bf 2b c0 sub ax,ax + *** 0006c1 a3 02 00 mov WORD PTR __timezone+2,ax + *** 0006c4 a3 00 00 mov WORD PTR __timezone,ax +;|*** +;|*** OEMParallelPortInit(); +; Line 461 + *** 0006c7 e8 00 00 call _OEMParallelPortInit +;|*** +;|*** for (i = 1; i < argc; i++) +; Line 463 + *** 0006ca be 01 00 mov si,1 + *** 0006cd 39 76 04 cmp WORD PTR [bp+4],si ;argc + *** 0006d0 7f 03 jg $JCC1744 + *** 0006d2 e9 ab 01 jmp $FB809 + $JCC1744: + $F807: +;|*** { +;|*** if (argv[i][0] == '-' || argv[i][0] == '/') +; Line 465 + *** 0006d5 8b de mov bx,si + *** 0006d7 03 de add bx,si + *** 0006d9 03 5e 06 add bx,WORD PTR [bp+6] ;argv + *** 0006dc 89 5e f6 mov WORD PTR [bp-10],bx + *** 0006df 8b 1f mov bx,WORD PTR [bx] + *** 0006e1 80 3f 2d cmp BYTE PTR [bx],45 ;002dH + *** 0006e4 74 0d je $I811 + *** 0006e6 8b 5e f6 mov bx,WORD PTR [bp-10] + *** 0006e9 8b 1f mov bx,WORD PTR [bx] + *** 0006eb 80 3f 2f cmp BYTE PTR [bx],47 ;002fH + *** 0006ee 74 03 je $JCC1774 + *** 0006f0 e9 84 01 jmp $FC808 + $JCC1774: + $I811: +;|*** { +;|*** cOption = tolower(argv[i][1]); +; Line 467 + *** 0006f3 8b 5e f6 mov bx,WORD PTR [bp-10] + *** 0006f6 8b 1f mov bx,WORD PTR [bx] + *** 0006f8 8a 47 01 mov al,BYTE PTR [bx+1] + *** 0006fb 98 cbw + *** 0006fc 8b d8 mov bx,ax + *** 0006fe f6 87 01 00 01 test BYTE PTR __ctype[bx+1],1 + *** 000703 74 0d je $L872 + *** 000705 8b 5e f6 mov bx,WORD PTR [bp-10] + *** 000708 8b 1f mov bx,WORD PTR [bx] + *** 00070a 8a 47 01 mov al,BYTE PTR [bx+1] + *** 00070d 04 20 add al,32 ;0020H + *** 00070f eb 09 jmp SHORT $L889 + *** 000711 90 nop + $L872: + *** 000712 8b 5e f6 mov bx,WORD PTR [bp-10] + *** 000715 8b 1f mov bx,WORD PTR [bx] + *** 000717 8a 47 01 mov al,BYTE PTR [bx+1] + $L889: + *** 00071a 88 46 ff mov BYTE PTR [bp-1],al ;cOption +;|*** +;|*** switch (cOption) +; Line 469 + *** 00071d 98 cbw +;|*** { +;|*** case '?': +;|*** case 'h': +;|*** usage2(argv[0]); +;|*** break; +;|*** case 'd': +;|*** { +;|*** char *pszPath; +;|*** +;|*** if (argv[i][2] != '\0') +;|*** { +;|*** pszPath = &argv[i][2]; +;|*** if (*pszPath == ':') +;|*** { +;|*** pszPath++; +;|*** } +;|*** } +;|*** else if (argc > (i+1) && argv[i+1][0] != '-' && argv[i+1][0] != '/') +;|*** { +;|*** pszPath = argv[i+1]; +;|*** i++; +;|*** } +;|*** else +;|*** { +;|*** pszPath = "*.*"; +;|*** } +;|*** DisplayDirectory(pszPath); +;|*** } +;|*** break; +;|*** +;|*** case 'g': +;|*** case 'r': +;|*** case 'u': +;|*** { +;|*** char *pszSource; +;|*** char *pszDestination; +;|*** +;|*** if (argv[i][2] != '\0') +;|*** { +;|*** pszSource = &argv[i][2]; +;|*** if (*pszSource == ':') +;|*** { +;|*** pszSource++; +;|*** } +;|*** } +;|*** else if (argc > (i+1) && argv[i+1][0] != '-' && argv[i+1][0] != '/') +;|*** { +;|*** pszSource = argv[i+1]; +;|*** i++; +;|*** } +;|*** else +;|*** { +;|*** printf("Error source path missing\n"); +;|*** break; +;|*** } +;|*** +;|*** if (argc > (i+1) && argv[i+1][0] != '-' && argv[i+1][0] != '/') +;|*** { +;|*** pszDestination = argv[i+1]; +;|*** i++; +;|*** } +;|*** else +;|*** { +;|*** pszDestination = NULL; +;|*** } +;|*** +;|*** GetFile( +;|*** pszSource, pszDestination, +;|*** cOption == 'r' ? COPY_FLAG_UPDATE_EXISTING : +;|*** cOption == 'u' ? COPY_FLAG_UPDATE_OR_ADD : +;|*** 0); +;|*** } +;|*** break; +;|*** +;|*** default: +;|*** printf("%s: Unsupported option\n\n", argv[i]); +;|*** usage2(argv[0]); +;|*** } +; Line 547 + *** 00071e 3d 75 00 cmp ax,117 ;0075H + *** 000721 75 03 jne $JCC1825 + *** 000723 e9 8a 00 jmp $SC825 + $JCC1825: + *** 000726 77 11 ja $SD836 + *** 000728 3c 67 cmp al,103 ;0067H + *** 00072a 75 03 jne $JCC1834 + *** 00072c e9 81 00 jmp $SC825 + $JCC1834: + *** 00072f 7f 23 jg $L880 + *** 000731 2c 3f sub al,63 ;003fH + *** 000733 74 12 je $L891 + *** 000735 2c 25 sub al,37 ;0025H + *** 000737 74 25 je $SC817 + $SD836: +;|*** printf("%s: Unsupported option\n\n", argv[i]); +; Line 545 + *** 000739 8b 5e f6 mov bx,WORD PTR [bp-10] + *** 00073c ff 37 push WORD PTR [bx] + *** 00073e 68 00 00 push OFFSET DGROUP:$SG837 + *** 000741 e8 00 00 call _printf + *** 000744 83 c4 04 add sp,4 +;|*** usage2(argv[0]); +; Line 546 + $L891: + *** 000747 8b 5e 06 mov bx,WORD PTR [bp+6] ;argv + *** 00074a ff 37 push WORD PTR [bx] + *** 00074c e8 b1 f8 call _usage2 + *** 00074f e9 22 01 jmp $L890 + *** 000752 90 nop + *** 000753 90 nop + $L880: + *** 000754 2c 68 sub al,104 ;0068H + *** 000756 74 ef je $L891 + *** 000758 2c 0a sub al,10 ;000aH + *** 00075a 74 54 je $SC825 + *** 00075c eb db jmp SHORT $SD836 + $SC817: +;|*** if (argv[i][2] != '\0') +; Line 479 + *** 00075e 8b 5e f6 mov bx,WORD PTR [bp-10] + *** 000761 8b 1f mov bx,WORD PTR [bx] + *** 000763 80 7f 02 00 cmp BYTE PTR [bx+2],0 + *** 000767 74 15 je $I819 +;|*** { +;|*** pszPath = &argv[i][2]; +; Line 481 + *** 000769 8b 5e f6 mov bx,WORD PTR [bp-10] + *** 00076c 8b 07 mov ax,WORD PTR [bx] + *** 00076e 05 02 00 add ax,2 + *** 000771 8b d0 mov dx,ax +;|*** if (*pszPath == ':') +; Line 482 + *** 000773 8b d8 mov bx,ax + *** 000775 80 3f 3a cmp BYTE PTR [bx],58 ;003aH + *** 000778 75 2f jne $I821 +;|*** { +;|*** pszPath++; +; Line 484 + *** 00077a 42 inc dx +;|*** } +;|*** } +;|*** else if (argc > (i+1) && argv[i+1][0] != '-' && argv[i+1][0] != '/') +; Line 487 + *** 00077b eb 2c jmp SHORT $I821 + *** 00077d 90 nop + $I819: + *** 00077e 8d 44 01 lea ax,WORD PTR [si+1] + *** 000781 3b 46 04 cmp ax,WORD PTR [bp+4] ;argc + *** 000784 7d 20 jge $I822 + *** 000786 8b 5e f6 mov bx,WORD PTR [bp-10] + *** 000789 8b 5f 02 mov bx,WORD PTR [bx+2] + *** 00078c 80 3f 2d cmp BYTE PTR [bx],45 ;002dH + *** 00078f 74 15 je $I822 + *** 000791 8b 5e f6 mov bx,WORD PTR [bp-10] + *** 000794 8b 5f 02 mov bx,WORD PTR [bx+2] + *** 000797 80 3f 2f cmp BYTE PTR [bx],47 ;002fH + *** 00079a 74 0a je $I822 +;|*** { +;|*** pszPath = argv[i+1]; +; Line 489 + *** 00079c 8b 5e f6 mov bx,WORD PTR [bp-10] + *** 00079f 8b f0 mov si,ax + *** 0007a1 8b 57 02 mov dx,WORD PTR [bx+2] +;|*** i++; +;|*** } +;|*** else +; Line 492 + *** 0007a4 eb 03 jmp SHORT $I821 + $I822: +;|*** { +;|*** pszPath = "*.*"; +; Line 494 + *** 0007a6 ba 00 00 mov dx,OFFSET DGROUP:$SG824 +;|*** } +; Line 495 + $I821: +;|*** DisplayDirectory(pszPath); +; Line 496 + *** 0007a9 52 push dx + *** 0007aa e8 7f f8 call _DisplayDirectory + *** 0007ad e9 c4 00 jmp $L890 +;|*** } +;|*** break; +;|*** +;|*** case 'g': +; Line 500 + $SC825: +;|*** case 'r': +;|*** case 'u': +;|*** { +;|*** char *pszSource; +;|*** char *pszDestination; +;|*** +;|*** if (argv[i][2] != '\0') +; Line 507 + *** 0007b0 8b 5e f6 mov bx,WORD PTR [bp-10] + *** 0007b3 8b 1f mov bx,WORD PTR [bx] + *** 0007b5 80 7f 02 00 cmp BYTE PTR [bx+2],0 + *** 0007b9 74 17 je $I828 +;|*** { +;|*** pszSource = &argv[i][2]; +; Line 509 + *** 0007bb 8b 5e f6 mov bx,WORD PTR [bp-10] + *** 0007be 8b 07 mov ax,WORD PTR [bx] + *** 0007c0 05 02 00 add ax,2 + *** 0007c3 89 46 fc mov WORD PTR [bp-4],ax ;pszSource +;|*** if (*pszSource == ':') +; Line 510 + *** 0007c6 8b d8 mov bx,ax + *** 0007c8 80 3f 3a cmp BYTE PTR [bx],58 ;003aH + *** 0007cb 75 37 jne $I830 +;|*** { +;|*** pszSource++; +; Line 512 + *** 0007cd ff 46 fc inc WORD PTR [bp-4] ;pszSource +;|*** } +;|*** } +;|*** else if (argc > (i+1) && argv[i+1][0] != '-' && argv[i+1][0] != '/') +; Line 515 + *** 0007d0 eb 32 jmp SHORT $I830 + $I828: + *** 0007d2 8d 44 01 lea ax,WORD PTR [si+1] + *** 0007d5 3b 46 04 cmp ax,WORD PTR [bp+4] ;argc + *** 0007d8 7c 03 jl $JCC2008 + *** 0007da e9 91 00 jmp $I831 + $JCC2008: + *** 0007dd 8b 5e f6 mov bx,WORD PTR [bp-10] + *** 0007e0 8b 5f 02 mov bx,WORD PTR [bx+2] + *** 0007e3 80 3f 2d cmp BYTE PTR [bx],45 ;002dH + *** 0007e6 75 03 jne $JCC2022 + *** 0007e8 e9 83 00 jmp $I831 + $JCC2022: + *** 0007eb 8b 5e f6 mov bx,WORD PTR [bp-10] + *** 0007ee 8b 5f 02 mov bx,WORD PTR [bx+2] + *** 0007f1 80 3f 2f cmp BYTE PTR [bx],47 ;002fH + *** 0007f4 74 78 je $I831 +;|*** { +;|*** pszSource = argv[i+1]; +; Line 517 + *** 0007f6 8b 5e f6 mov bx,WORD PTR [bp-10] + *** 0007f9 8b 47 02 mov ax,WORD PTR [bx+2] + *** 0007fc 89 46 fc mov WORD PTR [bp-4],ax ;pszSource +;|*** i++; +; Line 518 + *** 0007ff 8d 44 01 lea ax,WORD PTR [si+1] + *** 000802 8b f0 mov si,ax +;|*** } +;|*** else +;|*** { +;|*** printf("Error source path missing\n"); +;|*** break; +;|*** } +; Line 524 + $I830: +;|*** +;|*** if (argc > (i+1) && argv[i+1][0] != '-' && argv[i+1][0] != '/') +; Line 526 + *** 000804 8d 44 01 lea ax,WORD PTR [si+1] + *** 000807 3b 46 04 cmp ax,WORD PTR [bp+4] ;argc + *** 00080a 7d 2e jge $I834 + *** 00080c 8b de mov bx,si + *** 00080e 03 de add bx,si + *** 000810 03 5e 06 add bx,WORD PTR [bp+6] ;argv + *** 000813 89 5e f6 mov WORD PTR [bp-10],bx + *** 000816 8b 5f 02 mov bx,WORD PTR [bx+2] + *** 000819 80 3f 2d cmp BYTE PTR [bx],45 ;002dH + *** 00081c 74 1c je $I834 + *** 00081e 8b 5e f6 mov bx,WORD PTR [bp-10] + *** 000821 8b 5f 02 mov bx,WORD PTR [bx+2] + *** 000824 80 3f 2f cmp BYTE PTR [bx],47 ;002fH + *** 000827 74 11 je $I834 +;|*** { +;|*** pszDestination = argv[i+1]; +; Line 528 + *** 000829 8b 5e f6 mov bx,WORD PTR [bp-10] + *** 00082c 8b 47 02 mov ax,WORD PTR [bx+2] + *** 00082f 89 46 f8 mov WORD PTR [bp-8],ax ;pszDestination +;|*** i++; +; Line 529 + *** 000832 8d 44 01 lea ax,WORD PTR [si+1] + *** 000835 8b f0 mov si,ax +;|*** } +;|*** else +; Line 531 + *** 000837 eb 06 jmp SHORT $I835 + *** 000839 90 nop + $I834: +;|*** { +;|*** pszDestination = NULL; +; Line 533 + *** 00083a c7 46 f8 00 00 mov WORD PTR [bp-8],0 ;pszDestination +;|*** } +; Line 534 + $I835: +;|*** +;|*** GetFile( +;|*** pszSource, pszDestination, +;|*** cOption == 'r' ? COPY_FLAG_UPDATE_EXISTING : +;|*** cOption == 'u' ? COPY_FLAG_UPDATE_OR_ADD : +;|*** 0); +; Line 540 + *** 00083f 80 7e ff 72 cmp BYTE PTR [bp-1],114 ;0072H ;cOption + *** 000843 75 07 jne $L874 + *** 000845 c7 46 fa 01 00 mov WORD PTR [bp-6],1 + *** 00084a eb 11 jmp SHORT $L875 + $L874: + *** 00084c 80 7e ff 75 cmp BYTE PTR [bp-1],117 ;0075H ;cOption + *** 000850 75 06 jne $L878 + *** 000852 b8 02 00 mov ax,2 + *** 000855 eb 03 jmp SHORT $L879 + *** 000857 90 nop + $L878: + *** 000858 33 c0 xor ax,ax + $L879: + *** 00085a 89 46 fa mov WORD PTR [bp-6],ax + $L875: + *** 00085d ff 76 fa push WORD PTR [bp-6] + *** 000860 ff 76 f8 push WORD PTR [bp-8] ;pszDestination + *** 000863 ff 76 fc push WORD PTR [bp-4] ;pszSource + *** 000866 e8 09 fc call _GetFile + *** 000869 83 c4 06 add sp,6 +;|*** } +;|*** break; +; Line 542 + *** 00086c eb 09 jmp SHORT $FC808 +;|*** else +; Line 520 + $I831: +;|*** { +;|*** printf("Error source path missing\n"); +; Line 522 + *** 00086e 68 00 00 push OFFSET DGROUP:$SG833 + *** 000871 e8 00 00 call _printf + $L890: + *** 000874 83 c4 02 add sp,2 +;|*** for (i = 1; i < argc; i++) +; Line 463 + $FC808: + *** 000877 46 inc si + *** 000878 3b 76 04 cmp si,WORD PTR [bp+4] ;argc + *** 00087b 7d 03 jge $JCC2171 + *** 00087d e9 55 fe jmp $F807 + $JCC2171: +;|*** { +;|*** if (argv[i][0] == '-' || argv[i][0] == '/') +;|*** { +;|*** cOption = tolower(argv[i][1]); +;|*** +;|*** switch (cOption) +;|*** { +;|*** case '?': +;|*** case 'h': +;|*** usage2(argv[0]); +;|*** break; +;|*** case 'd': +;|*** { +;|*** char *pszPath; +;|*** +;|*** if (argv[i][2] != '\0') +;|*** { +;|*** pszPath = &argv[i][2]; +;|*** if (*pszPath == ':') +;|*** { +;|*** pszPath++; +;|*** } +;|*** } +;|*** else if (argc > (i+1) && argv[i+1][0] != '-' && argv[i+1][0] != '/') +;|*** { +;|*** pszPath = argv[i+1]; +;|*** i++; +;|*** } +;|*** else +;|*** { +;|*** pszPath = "*.*"; +;|*** } +;|*** DisplayDirectory(pszPath); +;|*** } +;|*** break; +;|*** +;|*** case 'g': +;|*** case 'r': +;|*** case 'u': +;|*** { +;|*** char *pszSource; +;|*** char *pszDestination; +;|*** +;|*** if (argv[i][2] != '\0') +;|*** { +;|*** pszSource = &argv[i][2]; +;|*** if (*pszSource == ':') +;|*** { +;|*** pszSource++; +;|*** } +;|*** } +;|*** else if (argc > (i+1) && argv[i+1][0] != '-' && argv[i+1][0] != '/') +;|*** { +;|*** pszSource = argv[i+1]; +;|*** i++; +;|*** } +;|*** else +;|*** { +;|*** printf("Error source path missing\n"); +;|*** break; +;|*** } +;|*** +;|*** if (argc > (i+1) && argv[i+1][0] != '-' && argv[i+1][0] != '/') +;|*** { +;|*** pszDestination = argv[i+1]; +;|*** i++; +;|*** } +;|*** else +;|*** { +;|*** pszDestination = NULL; +;|*** } +;|*** +;|*** GetFile( +;|*** pszSource, pszDestination, +;|*** cOption == 'r' ? COPY_FLAG_UPDATE_EXISTING : +;|*** cOption == 'u' ? COPY_FLAG_UPDATE_OR_ADD : +;|*** 0); +;|*** } +;|*** break; +;|*** +;|*** default: +;|*** printf("%s: Unsupported option\n\n", argv[i]); +;|*** usage2(argv[0]); +;|*** } +;|*** } +;|*** } +; Line 549 + $FB809: +;|*** +;|*** #if DEBUG +;|*** DumpCounters(); +;|*** #endif +;|*** +;|*** return 0; +; Line 555 + *** 000880 33 c0 xor ax,ax +;|*** } +; Line 556 + *** 000882 5e pop si + *** 000883 c9 leave + *** 000884 c3 ret + *** 000885 90 nop + +_main2 ENDP +_TEXT ENDS +END diff --git a/DOS/LOADCEPC/ppfstool.obj b/DOS/LOADCEPC/ppfstool.obj new file mode 100644 index 0000000000000000000000000000000000000000..96545d12970b285b6e26285c837eb37e5cf825ef GIT binary patch literal 8945 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 RExzTJ09C~24&q#l{|7yv-Io9W literal 0 HcmV?d00001 diff --git a/DOS/LOADCEPC/ppfstool.sbr b/DOS/LOADCEPC/ppfstool.sbr new file mode 100644 index 0000000000000000000000000000000000000000..8e5c9d3a96290edc5cad3a4bde8d136a8acb0509 GIT binary patch literal 8660 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 _WINCEROOT= + + - Execute the batch file setupenv.bat: + + X:>setupenv.bat + + - Execute the make file using nmake: + + x:>nmake /F loadcepc.mak + +This will build a loadcepc.exe in this directory. The warning +messages may be safely ignored. + +To remove files used in the build process the "clean" target +is available, as follows: + + X:>nmake /F loadcepc.mak clean diff --git a/DOS/LOADCEPC/setupen2.bat b/DOS/LOADCEPC/setupen2.bat new file mode 100644 index 0000000..6775cc4 --- /dev/null +++ b/DOS/LOADCEPC/setupen2.bat @@ -0,0 +1,59 @@ +@REM +@REM Copyright (c) Microsoft Corporation. All rights reserved. +@REM +@REM +@REM Use of this sample source code is subject to the terms of the Microsoft +@REM license agreement under which you licensed this sample source code. If +@REM you did not accept the terms of the license agreement, you are not +@REM authorized to use this sample source code. For the terms of the license, +@REM please see the license agreement between you and Microsoft or, if applicable, +@REM see the LICENSE.RTF on your install media or the root of your tools installation. +@REM THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +@REM + +@ECHO OFF + +@REM Note: Please read the README.TXT in this directory for build instructions +@REM for loadcepc. +@REM +@REM The environment variable WINCEROOT must be set. The assembler +@REM "ml" used for TRANSFER.ASM requires this program. + +if "%_WINCEROOT%"=="" goto ERROR2 + +PROMPT *** 16-bit dev mode - type exit to return to normal ***$_%prompt% + +@REM Locate the 16 bit dev tools. Try local drive, then Windows CE tree +@REM and finally, the \\boneyard share. + +if not exist %HOMEDRIVE%\msvc goto ENLIST_PATH +set __MSVCDIR=%HOMEDRIVE%\msvc +goto PATH_DONE + +:ENLIST_PATH +if not exist %_WINCEROOT%\sdk\vc150.win goto SHARE_PATH +set __MSVCDIR=%_WINCEROOT%\sdk\vc150.win +goto PATH_DONE + +:SHARE_PATH +if not exist \\boneyard\rellang\vc150.win\msvc goto ERROR +set __MSVCDIR=\\boneyard\rellang\vc150.win\msvc + +@REM Setup PATH, DevDir, LIB, and INCLUDE locations. + +:PATH_DONE +set PATH=%__MSVCDIR%\bin;%PATH%;%_WINCEROOT%\sdk\bin\i386;C:\MASM\BIN +set MSDevDir=%__MSVCDIR% +set LIB=%__MSVCDIR%\lib +set INCLUDE=%__MSVCDIR%\include +goto DONE + +:ERROR +echo ERROR: vc150.win path NOT found. +goto DONE + +:ERROR2 +echo ERROR: WINCEROOT must be set. + +:DONE +command \ No newline at end of file diff --git a/DOS/LOADCEPC/setupenv.bat b/DOS/LOADCEPC/setupenv.bat new file mode 100644 index 0000000..e66a05f --- /dev/null +++ b/DOS/LOADCEPC/setupenv.bat @@ -0,0 +1,19 @@ +@REM +@REM Copyright (c) Microsoft Corporation. All rights reserved. +@REM +@REM +@REM Use of this sample source code is subject to the terms of the Microsoft +@REM license agreement under which you licensed this sample source code. If +@REM you did not accept the terms of the license agreement, you are not +@REM authorized to use this sample source code. For the terms of the license, +@REM please see the license agreement between you and Microsoft or, if applicable, +@REM see the LICENSE.RTF on your install media or the root of your tools installation. +@REM THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +@REM + +@echo off + +SET _WINCEROOT=C:\WINCE600 + +%comspec% /k setupen2.bat + diff --git a/DOS/LOADCEPC/smchw.h b/DOS/LOADCEPC/smchw.h new file mode 100644 index 0000000..d4c47f7 --- /dev/null +++ b/DOS/LOADCEPC/smchw.h @@ -0,0 +1,193 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// +// Use of this sample source code is subject to the terms of the Microsoft +// license agreement under which you licensed this sample source code. If +// you did not accept the terms of the license agreement, you are not +// authorized to use this sample source code. For the terms of the license, +// please see the license agreement between you and Microsoft or, if applicable, +// see the LICENSE.RTF on your install media or the root of your tools installation. +// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +// +/*++ +THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +PARTICULAR PURPOSE. + +Module Name: + smchw.h +Abstract: + Definitions for the SMC9000 registers + +Notes: + +--*/ +#ifndef _SMCHW_H +#define _SMCHW_H + + +// These registers are in Bank 0 at the given offsets from the base address +// Since they are set up for 32-bit accesses, the offsets are multiplied by 2 from +// the numbers given in the SMC91C94 spec. +#define TCR_REG 0 +#define EPHSTATUS_REG 2 +#define RCR_REG 4 +#define COUNTER_REG 6 +#define MIR_REG 8 +#define MCR_REG 10 +// The register at offset 24 is reserved +// The bank select register is the same for all 4 banks +#define BANKSEL_REG 14 + +// Bank 1 registers +#define CONFIG_REG 0 +#define BASE_REG 2 +#define MACADDR_REG0 4 +#define MACADDR_REG1 6 +#define MACADDR_REG2 8 +#define GENERAL_REG 10 +#define CONTROL_REG 12 + +// Bank 2 _REGisters +#define MMUCOMMAND_REG 0 +#define PNR_ARR_REG 2 +#define FIFOPORTS_REG 4 +#define POINTER_REG 6 +#define DATA_REG 8 +#define AUXDATA_REG 10 +#define INTERRUPT_REG 12 +#define INTERRUPT_MASK_REG 13 + +// Bank 3 registers +#define MULTITAB_REG0 0 +#define MULTITAB_REG1 2 +#define MULTITAB_REG2 4 +#define MULTITAB_REG3 6 +#define MGMT_REG 8 +#define REVISION_REG 10 +#define ERCV_REG 12 + +// These values are written to the bank select register to change banks. +#define BANK0 0x3300 +#define BANK1 0x3301 +#define BANK2 0x3302 +#define BANK3 0x3303 + +// EPH Status reg (also used for TX status word) +#define EPH_UNDERRUN 0x8000 // Frame uderrun +#define EPH_LINKERROR 0x4000 // 10BASET link error condition +#define EPH_RXOVERRUN 0x2000 // Receiver overrun +#define EPH_COUNTER 0x1000 // Counter roll over +#define EPH_EXDEFER 0x0800 // Excessive deferral +#define EPH_CARRIER 0x0400 // Carrier not present +#define EPH_LATE 0x0200 // Late collision +#define EPH_DEFER 0x0080 // Frame was deferred +#define EPH_BCAST 0x0040 // Last frame was broadcast +#define EPH_SQET 0x0020 // Signal Quality Error +#define EPH_16COL 0x0010 // Too many collisions +#define EPH_MCAST 0x0008 // Last frame was multicast +#define EPH_MULTICOL 0x0004 // Multiple collisions on last frame +#define EPH_1COL 0x0002 // Single collision on last frame +#define EPH_TX_OK 0x0001 // Frame successfully transmitted + + +// MMU Commands +#define CMD_NOP 0 // No-Op command +#define CMD_ALLOC 0x0020 // Allocate memory +#define CMD_RESET 0x0040 // Reset MMU to initial state +#define CMD_REM_TOP 0x0060 // Remove frame from top of RX fifo +#define CMD_REM_REL_TOP 0x0080 // Remove and release top of RX fifo +#define CMD_REL_SPEC 0x00a0 // Release specific packet +#define CMD_ENQ_TX 0x00c0 // Enqueue to xmit fifo +#define CMD_ENQ_RX 0x00e0 // Reset xmit fifos (should only be done + // with transmitter disabled) +#define MMU_CMD_BUSY 0x0001 // MMU busy, don't modify PNR + +// Allocation Result Register (low byte of PNR_ARR_REG) +#define ARR_FAIL 0x80 // Allocation failed +#define ARR_ALLOC_MSK 0x7f // Mask allocated packet number + // Actually 1fh but use full mask for + // upward compatibility. + +// Pointer Register (POINTER_REG) +#define PTR_RCV 0x8000 // Access is to receive area +#define PTR_AUTO 0x4000 // Auto-increment on access +#define PTR_READ 0x2000 // =1 then read operation + // =0 then write operation +#define PTR_ETEN 0x1000 // Detect early transmit underrun +#define PTR_NOT_EMPTY 0x0800 // Write fifo not empty +#define PTR_OFFSET 0x03ff // Mask pointer value + +// Fifo Ports Register (FIFOPORTS_REG) +#define FIFO_EMPTY 0x80 // No packet at top of fifo +#define FIFO_TX_PKT_MASK 0x7f // Mask top packet number + // Actually 1fh but use full mask for + // upward compatibility. + +// Interrupt flags that can be set/acknowledged +#define ERCV_INT 0x0040 +#define EPH_INT 0x0020 +#define RX_OVRN_INT 0x0010 +#define ALLOC_INT 0x0008 +#define TXEMPTY_INT 0x0004 +#define TX_INT 0x0002 +#define RCV_INT 0x0001 + +// Interrupt mask bits, if these are set the interrupt is enabled +#define ERCV_INTM 0x4000 +#define EPH_INTM 0x2000 +#define RX_OVRN_INTM 0x1000 +#define ALLOC_INTM 0x0800 +#define TXEMPTY_INTM 0x0400 +#define TX_INTM 0x0200 +#define RCV_INTM 0x0100 + +// This value is used to intialize the Control Register (Pg 49 of the SMC91C94 spec): +// Bit 14 - RCV_BAD - Don't receive Frames with bad CRC +// Bit 13 - PWRDN - Don't go into power down mode +// Bit 11 - AUTO RELEASE - Do use the auto memory release feature for successfully transmitted Frames +// Bit 7 - LE ENABLE - Don't generate interrupts for link errors (merged through EPH_INT) +// Bit 6 - CR ENABLE - Don't generate interrupts for counter roll over (merged through EPH_INT) +// Bit 5 - TE ENABLE - Do generate interrupts for transmit errors (merged through EPH_INT) +// Bit 2 - EEPROM SELECT - Don't select the EEPROM +// Bit 1 - RELOAD - Don't reload EEPROM data +// Bit 0 - STORE - Don't store EEPROM data +#define CONTROL_REG_INIT 0x0920 + +// This value is used to intialize the Transmit Control Register (Pg 35 of the SMC91C94 spec): +// Bit 13 - EPH LOOP - Don't do EPH Internal Loopback +// Bit 12 - STP SQET - Don't stop transmission on SQET error +// DANGER - May need FDUPLX for IPX +// Bit 11 - FDUPLX - Don't use full duplex operation so that Frames sourced by this card are not received by it +// Bit 10 - MON_CSN - Don't monitor carrier while transmitting. Transmission will continue whether the card senses +// it's own carrier after the preamble or not. +// Bit 8 - NOCRC - Do insert the CRC at the end of transmitted frames automatically +// Bit 7 - PAD_EN - Do pad frames shorter than the minimum of 64 bytes automatically +// Bit 2 - FORCOL - Don't force a collision +// Bit 1 - LOOP - Don't loop back frames internally without transmitting +// Bit 0 - TXENA - Do enable transmission +#define TCR_REG_INIT 0x0081 + +// This value is used to initialize the Memory Configuration Register (Pg 42 of the SMC91C94 spec): +// Bits 7-0 - MEMORY RESERVED FOR TRANSMIT - Reserve memory for transmit purposes only. I need to +// reserve enough memory for one maximum sized Frame for transmission purposes. This will prevent +// deadlock conditions in which Frames keep coming in, but can't be acknowledged because of a lack of memory. +// The amount of memory reserved is calculated as MCR_REG_INIT * 256 * M, where M is 1 for the 91C94 +// (pg 42 of the SMC91C94 spec.). So, for a 1500 byte frame, I need 1500 / 256 = 6 memory pages. +#define MCR_REG_INIT 0x0006 + +// This value is used to initialize the Receive Control Register (Pg 39 of the SMC91C94 spec): +// Bit 15 - SOFT RST - Don't do a soft reset +// Bit 14 - FILT_CAR - Don't filter the carrier signal +// Bit 9 - STRIP CRC - Don't strip the CRC from the Frame +// Bit 8 - RXEN - Do enable the Frame receiver +// Bit 2 - ALMUL - Don't accept all multicast frames +// Bit 1 - PRMS - Don't go into promiscuous mode +// Bit 0 - RX_ABORT - Write the receive abort flag low +// (set by a frame that was longer than 1532 bytes or out of buffer memory error) +#define RCR_REG_INIT 0x0100 + + +#endif // _SMCHW_H diff --git a/DOS/LOADCEPC/transfer.asm b/DOS/LOADCEPC/transfer.asm new file mode 100644 index 0000000..cad14a8 --- /dev/null +++ b/DOS/LOADCEPC/transfer.asm @@ -0,0 +1,217 @@ +; +; Copyright (c) Microsoft Corporation. All rights reserved. +; +; +; Use of this sample source code is subject to the terms of the Microsoft +; license agreement under which you licensed this sample source code. If +; you did not accept the terms of the license agreement, you are not +; authorized to use this sample source code. For the terms of the license, +; please see the license agreement between you and Microsoft or, if applicable, +; see the LICENSE.RTF on your install media or the root of your tools installation. +; THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +; +;*********************************************************************************************************** +; +; Init.Asm - Boot Loader initialization code for x86 PC. +; +; Author: RBN +; +; Written 5/1/96 +; +;*********************************************************************************************************** + +.486p + +OpPrefix MACRO + db 66h + ENDM + +_TEXT SEGMENT WORD PUBLIC USE16 'CODE' + +FLAT_STACK_SIZE EQU 4000h + db FLAT_STACK_SIZE dup ( 0 ) +FLAT_STACK_START equ $ + +; +; This static GDT contains 2 selectors - A flat code selector, and a flat data selector. +; +GDT_Data LABEL DWORD + db 0, 0, 0, 0, 0, 0, 0, 0 ; First GDT entry always unused +CS_FLAT_SEL EQU ($-GDT_Data) + db 0FFh, 0FFh, 00h, 00h, 00h, 10011010b, 11001111b, 00h ; Code +DS_FLAT_SEL EQU ($-GDT_Data) + db 0FFh, 0FFh, 00h, 00h, 00h, 10010010b, 11001111b, 00h ; Data +GDT_TABLE_SIZE = $ - OFFSET GDT_Data + +; +; Limit + Pointer to the GDT +; +GDTPtr LABEL FWORD + dw GDT_TABLE_SIZE - 1 ; Limit of 0 = 1 byte + dd OFFSET GDT_Data + +PModeEntrySeg dw SEG InPModeNow + +PModeEntryOff dd OFFSET InPModeNow + + + +;****************************************************************************** +; +; Launch +; +; At this point, we are running in a 16-bit code segment. +; Since this code is written in a 16-bit code segment, we need to put an +; OpPrefix in front of all 32-bit instructions. +; +; This function jumps to InPModeNow to force CS to be reloaded with a +; valid PMode selector. +; +;****************************************************************************** + +Launch PROC NEAR C PUBLIC + + cli ; Make sure we don't get any more interrupts + + mov al, 0FFh ; Disable all PIC interrupts + out 021h, al + +if 0 + mov dx, 003FBh + mov al, 080h ; Access Baud Divisor + out dx, al + + dec dx ; 3FAh + dec dx ; 3F9h + + dec dx ; 3F8h + mov al, 002h ; 57600 Baud + out dx, al + + inc dx ; 3F9h + xor al, al + out dx, al + + inc dx ; 3FAh + + inc dx ; 3FBh + mov al, 003h ; DLAB = 0, 8 bit, no parity + out dx, al + + dec dx ; 3FAh + + dec dx ; 3F9h + xor al, al ; No interrupts, polled + out dx, al + + inc dx ; 3FAh + mov al, 001h ; Enable FIFO if present + out dx, al + + inc dx ; 3FBh + + inc dx ; 3FCh + mov al, 003h ; Assert DTR, RTS + out dx, al + + mov dx, 03FDh +@@: + in al, dx ; Get Modem status + test al, 020h + jz @B + + mov al, 'A' + mov dx, 03F8h + out dx, al +endif + + ; + ; Since we were loaded by the DOS 16bit real-mode loader we need to + ; manually relocate all references to linear addresses before we switch + ; to protect mode. + ; + + xor ebx, ebx ; Clear upper word + mov bx, cs ; Our segment + shl ebx, 4 ; Convert segment to linear address + + mov eax, DWORD PTR [GDTPtr + 2] + add eax, ebx + mov DWORD PTR [GDTPtr + 2], eax + + xor eax, eax + mov ax, [PModeEntrySeg] + shl eax, 4 + add eax, [PModeEntryOff] + mov [PModeLbl], eax + + pop ax ; Remove return address from stack + pop edx ; Load entry point from arguments + pop esi ; Linear address of arguments + + OpPrefix + lgdt FWORD PTR [GDTPtr] ; Load the GDTR + + mov ecx, OFFSET FLAT_STACK_START + add ecx, ebx + + ; + ; Don't need OpPrefix on mov to/from CR0 -- It's always 32-bit + ; + mov eax, cr0 ; Get the current CR0 + or al, 1 ; Set the PE bit to enable protected mode + mov cr0, eax ; NOW WE'RE IN PMODE! + + OpPrefix + db 0EAh ; Far jump forces a selector lookup +PModeLbl dd 0 + dw CS_FLAT_SEL + +Launch ENDP + +_TEXT ENDS + +_TEXT32 SEGMENT WORD PUBLIC USE32 'CODE32' + +;*********************************************************************************************************** +; +; InPModeNow +; +; This function is responsible for setting up the data selectors and the stack and then jumping to main. +; +;*********************************************************************************************************** + +InPModeNow PROC NEAR + + mov eax, DS_FLAT_SEL + mov ds, eax + mov es, eax + mov fs, eax + mov gs, eax + mov ss, eax + mov esp, ecx + + push edx + + mov edx, 001FFFFCh + mov dword ptr [edx], esi ; Save linear ptr to args in known location + +if 0 + mov dx, 03FDh +@@: + in al, dx ; Get Modem status + test al, 020h + jz @B + + mov al, 'B' + mov dx, 03F8h + out dx, al +endif + + ret ; Jump to entry point + +InPModeNow ENDP + +_TEXT32 ENDS + + END diff --git a/DOS/LOADCEPC/video.c b/DOS/LOADCEPC/video.c new file mode 100644 index 0000000..2d7e24a --- /dev/null +++ b/DOS/LOADCEPC/video.c @@ -0,0 +1,565 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// +// Use of this sample source code is subject to the terms of the Microsoft +// license agreement under which you licensed this sample source code. If +// you did not accept the terms of the license agreement, you are not +// authorized to use this sample source code. For the terms of the license, +// please see the license agreement between you and Microsoft or, if applicable, +// see the LICENSE.RTF on your install media or the root of your tools installation. +// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +// + +/*++ + +THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +PARTICULAR PURPOSE. + +Module Name: video.c + +Abstract: + +Functions: + + +Notes: + +--*/ + + +#include +#include +#include + +#include "loadcepc.h" +#include "video.h" +#include "bootarg.h" + +extern BOOT_ARGS BootArgs; + +static BOOL bNoModeSet = FALSE; + + +void mode320x200x256( void ) +{ + // Put the display into 320x200x256 colour mode and clear it + + __asm + { + mov ah, 0 ; Set video mode + mov al, 013h ; 320x200x256 and clear screen + int 10h ; set mode 13 + } +} + + +int isVesaSupported( void ) +{ + VESA_GENERAL_INFO vesaInfo, far *pVesaInfo = &vesaInfo; + + __asm + { + mov ax, 04F00h ; Get VESA info + les di, pVesaInfo ; Pointer to info buffer + int 10h ; check for VESA + + cmp ax, 0004Fh ; Was it successful? + jne noVesa + } + return TRUE; + +noVesa: + + return FALSE; +} + + +int setVesaMode( int vesaMode, int scanLength ) +{ + //printf( "setVesaMode( %d, %d\n", vesaMode, scanLength ); + + __asm + { + mov ax, 04F02h ; VESA Set mode + mov bx, vesaMode ; Set given VESA Mode + int 10h ; + + cmp ax, 0004Fh ; Was it successful? + jne failed ; + + mov cx, scanLength ; Set so banks are an integral number lines + jcxz finished ; if no scanLength requested, just exit + mov ax, 04F06h ; VESA Set logical scan line length + mov bl, 0 ; + int 10h ; set VESA scan length + + cmp ax, 0004Fh ; Was it successful? + jne failed ; + } + +finished: + return TRUE; + +failed: + return FALSE; +} + +/* +** SetVideoMode: maps from the user input 0-X to a VESA mode +** +** User VESA MODE +** Input +** 0 320x200x256 default mode, should work on any video card with 64K +** memory. +** 1 480x240x256 non-standard VGA resolution, emulated in a 640x480 +** window. +** 2 640x480x256 +** 3 800x600x256 +** 4 1024x768x256 +** 5 320x240x256 non-standard VGA resolution, emulated in a 640x480 +** window. +** 6 208x240x256 +*/ + +UCHAR SetVideoMode( int desiredMode ) +{ + int vesaMode = 0; + int scanLength; + + // if user requested to skip the mode set, just pass bootargs + + if( bNoModeSet ) + { + return( 0xFF ); // force caller to leave bootargs vars alone + } + + // In the default mode, there is no need to bank switch the card + // since only 64K required VESA is NOT required for this mode. + + if( desiredMode == 0 ) + { + mode320x200x256(); + return( 0 ); + } + + // If VESA is supported use VESA to put the + // video card into the appropriate mode. + + if( isVesaSupported() ) + { + switch( desiredMode ) + { + case 0x01: // 480x240x256 is emulated in a partial 640x480x256 screen + case 0x02: + case 0x05: // 240x320x256 is emulated in a partial 640x480x256 screen + case 0x06: // 208x240x256 is emulated in a partial 640x480x256 screen + + scanLength = VESASCANLENGTH1024; // scan length for this mode + vesaMode = VESAMODE640x480x256; // VESA Mode 101 640x480x256 + break; + + case 0x03: + + scanLength = VESASCANLENGTH1024; // scan length for this mode + vesaMode = VESAMODE800x600x256; // VESA Mode 103 800x600x256 + break; + + case 0x04: + + scanLength = VESASCANLENGTH1024; // scan length for this mode + vesaMode = VESAMODE1024x768x256; // VESA Mode 105 1024x768x256 + break; + + default: + + // VESA mode value was passed in - use directly + + vesaMode = desiredMode; /* use passed in mode value */ + vesaMode |= 0x4000; /* ask for linear/flat framebuffer mode */ + scanLength = 0; /* use mode default scan length */ + break; + } + + // Setup the video card + + if( setVesaMode( vesaMode, scanLength ) ) + { + // Indicate status + + return( (UCHAR)(desiredMode < 0x100 ? desiredMode : 0xFF) ); + } + } + + // Set default mode if we get here + + mode320x200x256(); + return( 0 ); +} + +// +// FindClosestVESAMode - Finds VESA mode with X and Y size closest to +// requested screen size. +// +// Returns flat framebuffer pointer, flat framebuffer stride, and physical X +// and Y size +// + +void FindClosestVESAMode( void ) +{ + VESA_GENERAL_INFO vesaInfo, far *pVesaInfo = &vesaInfo; + VESA_MODE_INFO modeInfo, far *pModeInfo = &modeInfo; + DWORD deltaX, deltaY; + DWORD currError, error; + WORD vesaMode; + int index; + + //printf( "FindClosestVESAMode\n\r" ); + + vesaInfo.szSignature[0] = 'V'; + vesaInfo.szSignature[1] = 'B'; + vesaInfo.szSignature[2] = 'E'; + vesaInfo.szSignature[3] = '2'; + + __asm + { + push es + mov ax, 04F00h ; Get VESA info + les di, pVesaInfo ; Pointer to info buffer + int 10h ; check for VESA + pop es + + cmp ax, 0004Fh ; Was it successful? + je itsok + jmp noVesa + } + +itsok: + + // check for minimum compat version of VBE + + if (vesaInfo.wVersion < 0x0200) + { + goto noVesa; + } + + // Clear mode, set error to large value + + BootArgs.vesaMode = 0; + currError = 0xFFFFFFFF; + + // Process the VESA mode list + + for( index=0; vesaInfo.pModeList[index] != -1; index++ ) + { + // Set mode we are checking + + vesaMode = vesaInfo.pModeList[index]; + + // Fetch the Mode Info + + __asm + { + push es + mov cx, vesaMode + les di, pModeInfo ; Pointer to info buffer + mov ax, 04F01h ; Return VBE Mode Information + int 10h + pop es + } + + // Check Mode Info - the following are required: + // + // - planer mode + // - flat frame buffer compat mode + // - matching color depth + // - same size or bigger than requested + + if( (modeInfo.ucNumberOfPlanes == 1) && + (modeInfo.dwPhysBasePtr != 0) && + (modeInfo.ucBitsPerPixel == BootArgs.bppScreen) && + (modeInfo.wXResolution >= BootArgs.cxDisplayScreen) && + (modeInfo.wYResolution >= BootArgs.cyDisplayScreen) ) + { + // only allow 565 16bpp modes through + + if( (modeInfo.ucBitsPerPixel == 16) && + ((modeInfo.ucRedMaskSize != 5) || + (modeInfo.ucGreenMaskSize != 6) || + (modeInfo.ucBlueMaskSize != 5)) ) + { + continue; + } + + // Compute screen resolution error + + deltaX = (DWORD)modeInfo.wXResolution - + (DWORD)BootArgs.cxDisplayScreen; + deltaY = (DWORD)modeInfo.wYResolution - + (DWORD)BootArgs.cyDisplayScreen; + + error = ((deltaX * deltaX) + (deltaY * deltaY)); + + // If the error is diminishing save the mode data + + if( error < currError ) + { + // Save the current error for next comparison + + currError = error; + + // Update the boot args with current data + + BootArgs.vesaMode = vesaMode; + BootArgs.pvFlatFrameBuffer = modeInfo.dwPhysBasePtr; + BootArgs.cxPhysicalScreen = modeInfo.wXResolution; + BootArgs.cyPhysicalScreen = modeInfo.wYResolution; + BootArgs.cbScanLineLength = modeInfo.wBytesPerScanLine; + BootArgs.RedMaskSize = modeInfo.ucRedMaskSize; + BootArgs.RedMaskPosition = modeInfo.ucRedFieldPosition; + BootArgs.GreenMaskSize = modeInfo.ucGreenMaskSize; + BootArgs.GreenMaskPosition = modeInfo.ucGreenFieldPosition; + BootArgs.BlueMaskSize = modeInfo.ucBlueMaskSize; + BootArgs.BlueMaskPosition = modeInfo.ucBlueFieldPosition; + } + } + } + + + if( BootArgs.vesaMode == 0) + { + goto noVesa; + } + + return; + +noVesa: + + // no matching VESA mode found, use 320x200x8 video mode as fallback + + BootArgs.vesaMode = 0; +} + +// +// FindVESAMode - Finds VESA mode which exactly matches requested X and Y size +// Returns flat framebuffer pointer and flat framebuffer stride +// + +void FindVESAMode( void ) +{ + VESA_GENERAL_INFO vesaInfo, far *pVesaInfo = &vesaInfo; + VESA_MODE_INFO modeInfo, far *pModeInfo = &modeInfo; + WORD vesaMode; + int index; + + //printf( "FindVesaMode( void )\n" ); + + vesaInfo.szSignature[0] = 'V'; + vesaInfo.szSignature[1] = 'B'; + vesaInfo.szSignature[2] = 'E'; + vesaInfo.szSignature[3] = '2'; + + // Fetch the VESA info data + + __asm + { + push es + mov ax, 04F00h ; Get VESA info + les di, pVesaInfo ; Pointer to info buffer + int 10h ; check for VESA + pop es + + cmp ax, 0004Fh ; Was it successful? + je itsok + jmp noVesa + } + +itsok: + + // Validate minimum compatibility version of VBE + + if( vesaInfo.wVersion < 0x0200 ) + { + goto noVesa; + } + + // Clear mode + + BootArgs.vesaMode = 0; + + // Process the VESA ModeList + + for( index=0; vesaInfo.pModeList[index] != -1; index++ ) + { + // Set mode we are checking + + vesaMode = vesaInfo.pModeList[index]; + + // Fetch the Mode Info + + __asm + { + push es + mov cx, vesaMode + les di, pModeInfo ; Pointer to info buffer + mov ax, 04F01h ; Return VBE Mode Information + int 10h + pop es + } + + // Check Mode Info - the following are required: + // + // - planer mode + // - flat frame buffer compat mode + // - matching color depth + // - same size or bigger than requested + + if( (modeInfo.ucNumberOfPlanes == 1) && + (modeInfo.dwPhysBasePtr != 0) && + (modeInfo.ucBitsPerPixel == BootArgs.bppScreen) && + (modeInfo.wXResolution == BootArgs.cxPhysicalScreen) && + (modeInfo.wYResolution == BootArgs.cyPhysicalScreen) ) + { + // Conditions are met. Set BootArgs with Mode data and return. + + BootArgs.vesaMode = vesaMode; + BootArgs.pvFlatFrameBuffer = modeInfo.dwPhysBasePtr; + BootArgs.cbScanLineLength = modeInfo.wBytesPerScanLine; + BootArgs.RedMaskSize = modeInfo.ucRedMaskSize; + BootArgs.RedMaskPosition = modeInfo.ucRedFieldPosition; + BootArgs.GreenMaskSize = modeInfo.ucGreenMaskSize; + BootArgs.GreenMaskPosition = modeInfo.ucGreenFieldPosition; + BootArgs.BlueMaskSize = modeInfo.ucBlueMaskSize; + BootArgs.BlueMaskPosition = modeInfo.ucBlueFieldPosition; + return; + } + } + +noVesa: + + // No matching VESA mode found, use 320x200x8 as fallback + + BootArgs.vesaMode = 0; +} + +// +// ParseVESAOptions +// + +BOOL ParseVESAOptions( char *params ) +{ + int cArgs; + + //printf( "ParseVESAOptions( 0x%x )\n", params ); + + // Clear mode + + BootArgs.vesaMode = 0; + + // Verify option format is /L: + + if (params[2] != ':') + { + return( FALSE ); // colon after /L missing, exit + } + + // Check for the N format of the option, /L:N:xxx. This + // mode skips all the VESA mode processing and the mode set. + + if( (memcmp( ¶ms[3],"N:",2) == 0) || (memcmp( ¶ms[3],"n:",2) == 0) ) + { + bNoModeSet = TRUE; + + cArgs = sscanf( ¶ms[5], "%dx%dx%d:%dx%d", + &BootArgs.cxDisplayScreen, + &BootArgs.cyDisplayScreen, + &BootArgs.bppScreen, + &BootArgs.cxPhysicalScreen, + &BootArgs.cyPhysicalScreen ); + if(cArgs == 3) + { + BootArgs.cxPhysicalScreen = BootArgs.cxDisplayScreen; + BootArgs.cyPhysicalScreen = BootArgs.cyDisplayScreen; + } + else if(cArgs == 5) + { + if (BootArgs.cxPhysicalScreen < BootArgs.cxDisplayScreen || + BootArgs.cyPhysicalScreen < BootArgs.cyDisplayScreen) + { + printf + ( +"ERROR: The physical screen dimensions (PX & PY) should be larger than the\n" +" display resolution chosen. This option is used to simulate a \n" +" smaller drawing area on a larger display.\n" + ); + + // The physical screen size must be >= display screen size + + return( FALSE ); + } + } + BootArgs.vesaMode = 0xffff; // just some really large value + } + else + { + // No 'N' present in option. Process and set the VESA mode + + bNoModeSet = FALSE; + + cArgs = sscanf( ¶ms[3], "%dx%dx%d:%dx%d", + &BootArgs.cxDisplayScreen, + &BootArgs.cyDisplayScreen, + &BootArgs.bppScreen, + &BootArgs.cxPhysicalScreen, + &BootArgs.cyPhysicalScreen ); + + // Process according to # of args specified + + switch( cArgs ) + { + case 3: + + // Explicit physical size not specified - find closest one + + FindClosestVESAMode(); // uses and fills in BootArgs values + break; + + case 5: + + // Validate specified physical size + + if( BootArgs.cxPhysicalScreen < BootArgs.cxDisplayScreen || + BootArgs.cyPhysicalScreen < BootArgs.cyDisplayScreen ) + { + printf + ( +"ERROR: The physical screen dimensions (PX & PY) should be larger than the\n" +" display resolution chosen. This option is used to simulate a \n" +" smaller drawing area on a larger display.\n" + ); + + // The physical screen size must be >= display screen size + + return( FALSE ); + } + + // Find the actual VESA mode + + FindVESAMode(); // uses and fills in BootArgs values + break; + + default: + + // Invalid number of parameters + + return( FALSE ); + break; + } + } + + // Indicate success + + return( TRUE ); +} diff --git a/DOS/LOADCEPC/video.cod b/DOS/LOADCEPC/video.cod new file mode 100644 index 0000000..8326f2a --- /dev/null +++ b/DOS/LOADCEPC/video.cod @@ -0,0 +1,1524 @@ +; Static Name Aliases +; +; $S422_bNoModeSet EQU bNoModeSet + TITLE video.c + .286p + .287 +INCLUDELIB SLIBCE +INCLUDELIB OLDNAMES.LIB +_TEXT SEGMENT WORD PUBLIC 'CODE' +_TEXT ENDS +_DATA SEGMENT WORD PUBLIC 'DATA' +_DATA ENDS +CONST SEGMENT WORD PUBLIC 'CONST' +CONST ENDS +_BSS SEGMENT WORD PUBLIC 'BSS' +_BSS ENDS +$$SYMBOLS SEGMENT BYTE PUBLIC 'DEBSYM' +$$SYMBOLS ENDS +$$TYPES SEGMENT BYTE PUBLIC 'DEBTYP' +$$TYPES ENDS +DGROUP GROUP CONST, _BSS, _DATA + ASSUME DS: DGROUP, SS: DGROUP +EXTRN __aNulmul:NEAR +EXTRN _printf:NEAR +EXTRN _sscanf:NEAR +EXTRN _BootArgs:BYTE +_DATA SEGMENT +$S422_bNoModeSet DW 00H +$SG502 DB 'N:', 00H +$SG503 DB 'n:', 00H +$SG504 DB '%dx%dx%d:%dx%d', 00H +$SG510 DB 'ERROR: The physical screen dimensions (PX & PY) should be la' + DB 'rger than the', 0aH, ' display resolution chosen. Thi' + DB 's option is used to simulate a ', 0aH, ' smaller draw' + DB 'ing area on a larger display.', 0aH, 00H +$SG512 DB '%dx%dx%d:%dx%d', 00H +$SG521 DB 'ERROR: The physical screen dimensions (PX & PY) should be la' + DB 'rger than the', 0aH, ' display resolution chosen. Th' + DB 'is option is used to simulate a ', 0aH, ' smaller dra' + DB 'wing area on a larger display.', 0aH, 00H +_DATA ENDS +_TEXT SEGMENT + ASSUME CS: _TEXT + PUBLIC _mode320x200x256 +_mode320x200x256 PROC NEAR +;|*** // +;|*** // Copyright (c) Microsoft Corporation. All rights reserved. +;|*** // +;|*** // +;|*** // Use of this sample source code is subject to the terms of the Microsoft +;|*** // license agreement under which you licensed this sample source code. If +;|*** // you did not accept the terms of the license agreement, you are not +;|*** // authorized to use this sample source code. For the terms of the license, +;|*** // please see the license agreement between you and Microsoft or, if applicable, +;|*** // see the LICENSE.RTF on your install media or the root of your tools installation. +;|*** // THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +;|*** // +;|*** +;|*** /*++ +;|*** +;|*** THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +;|*** ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +;|*** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +;|*** PARTICULAR PURPOSE. +;|*** +;|*** Module Name: video.c +;|*** +;|*** Abstract: +;|*** +;|*** Functions: +;|*** +;|*** +;|*** Notes: +;|*** +;|*** --*/ +;|*** +;|*** +;|*** #include +;|*** #include +;|*** #include +;|*** +;|*** #include "loadcepc.h" +;|*** #include "video.h" +;|*** #include "bootarg.h" +;|*** +;|*** extern BOOT_ARGS BootArgs; +;|*** +;|*** static BOOL bNoModeSet = FALSE; +;|*** +;|*** +;|*** void mode320x200x256( void ) +;|*** { +; Line 47 + *** 000000 55 push bp + *** 000001 8b ec mov bp,sp +;|*** // Put the display into 320x200x256 colour mode and clear it +;|*** +;|*** __asm +;|*** { +;|*** mov ah, 0 ; Set video mode +; Line 52 + *** 000003 b4 00 mov ah,0 +;|*** mov al, 013h ; 320x200x256 and clear screen +; Line 53 + *** 000005 b0 13 mov al,19 ;0013H +;|*** int 10h ; set mode 13 +; Line 54 + *** 000007 cd 10 int 16 ;0010H +;|*** } +; Line 55 +;|*** } +; Line 56 + *** 000009 c9 leave + *** 00000a c3 ret + *** 00000b 90 nop + +_mode320x200x256 ENDP + PUBLIC _isVesaSupported +_isVesaSupported PROC NEAR +;|*** +;|*** +;|*** int isVesaSupported( void ) +;|*** { +; Line 60 + *** 00000c c8 04 02 00 enter 516,0 + *** 000010 57 push di +; vesaInfo = -512 +; pVesaInfo = -516 +;|*** VESA_GENERAL_INFO vesaInfo, far *pVesaInfo = &vesaInfo; +; Line 61 + *** 000011 8d 86 00 fe lea ax,WORD PTR [bp-512] ;vesaInfo + *** 000015 89 86 fc fd mov WORD PTR [bp-516],ax ;pVesaInfo + *** 000019 8c 96 fe fd mov WORD PTR [bp-514],ss +;|*** +;|*** __asm +;|*** { +;|*** mov ax, 04F00h ; Get VESA info +; Line 65 + *** 00001d b8 00 4f mov ax,20224 ;4f00H +;|*** les di, pVesaInfo ; Pointer to info buffer +; Line 66 + *** 000020 c4 be fc fd les di,DWORD PTR [bp-516] ;pVesaInfo +;|*** int 10h ; check for VESA +; Line 67 + *** 000024 cd 10 int 16 ;0010H +;|*** +;|*** cmp ax, 0004Fh ; Was it successful? +; Line 69 + *** 000026 3d 4f 00 cmp ax,79 ;004fH +;|*** jne noVesa +; Line 70 + *** 000029 75 07 jne $noVesa429 +;|*** } +; Line 71 +;|*** return TRUE; +; Line 72 + *** 00002b b8 01 00 mov ax,1 + *** 00002e 5f pop di + *** 00002f c9 leave + *** 000030 c3 ret + *** 000031 90 nop +;|*** +;|*** noVesa: +; Line 74 + $noVesa429: +;|*** +;|*** return FALSE; +; Line 76 + *** 000032 33 c0 xor ax,ax +;|*** } +; Line 77 + *** 000034 5f pop di + *** 000035 c9 leave + *** 000036 c3 ret + *** 000037 90 nop + +_isVesaSupported ENDP + PUBLIC _setVesaMode +_setVesaMode PROC NEAR +;|*** +;|*** +;|*** int setVesaMode( int vesaMode, int scanLength ) +;|*** { +; Line 81 + *** 000038 55 push bp + *** 000039 8b ec mov bp,sp +; scanLength = 6 +; vesaMode = 4 +;|*** //printf( "setVesaMode( %d, %d\n", vesaMode, scanLength ); +;|*** +;|*** __asm +;|*** { +;|*** mov ax, 04F02h ; VESA Set mode +; Line 86 + *** 00003b b8 02 4f mov ax,20226 ;4f02H +;|*** mov bx, vesaMode ; Set given VESA Mode +; Line 87 + *** 00003e 8b 5e 04 mov bx,WORD PTR [bp+4] ;vesaMode +;|*** int 10h ; +; Line 88 + *** 000041 cd 10 int 16 ;0010H +;|*** +;|*** cmp ax, 0004Fh ; Was it successful? +; Line 90 + *** 000043 3d 4f 00 cmp ax,79 ;004fH +;|*** jne failed ; +; Line 91 + *** 000046 75 16 jne $failed436 +;|*** +;|*** mov cx, scanLength ; Set so banks are an integral number lines +; Line 93 + *** 000048 8b 4e 06 mov cx,WORD PTR [bp+6] ;scanLength +;|*** jcxz finished ; if no scanLength requested, just exit +; Line 94 + *** 00004b e3 0c jcxz $finished437 +;|*** mov ax, 04F06h ; VESA Set logical scan line length +; Line 95 + *** 00004d b8 06 4f mov ax,20230 ;4f06H +;|*** mov bl, 0 ; +; Line 96 + *** 000050 b3 00 mov bl,0 +;|*** int 10h ; set VESA scan length +; Line 97 + *** 000052 cd 10 int 16 ;0010H +;|*** +;|*** cmp ax, 0004Fh ; Was it successful? +; Line 99 + *** 000054 3d 4f 00 cmp ax,79 ;004fH +;|*** jne failed ; +; Line 100 + *** 000057 75 05 jne $failed436 +;|*** } +; Line 101 +;|*** +;|*** finished: +; Line 103 + $finished437: +;|*** return TRUE; +; Line 104 + *** 000059 b8 01 00 mov ax,1 + *** 00005c c9 leave + *** 00005d c3 ret +;|*** +;|*** failed: +; Line 106 + $failed436: +;|*** return FALSE; +; Line 107 + *** 00005e 33 c0 xor ax,ax +;|*** } +; Line 108 + *** 000060 c9 leave + *** 000061 c3 ret + +_setVesaMode ENDP + PUBLIC _SetVideoMode +_SetVideoMode PROC NEAR +;|*** +;|*** /* +;|*** ** SetVideoMode: maps from the user input 0-X to a VESA mode +;|*** ** +;|*** ** User VESA MODE +;|*** ** Input +;|*** ** 0 320x200x256 default mode, should work on any video card with 64K +;|*** ** memory. +;|*** ** 1 480x240x256 non-standard VGA resolution, emulated in a 640x480 +;|*** ** window. +;|*** ** 2 640x480x256 +;|*** ** 3 800x600x256 +;|*** ** 4 1024x768x256 +;|*** ** 5 320x240x256 non-standard VGA resolution, emulated in a 640x480 +;|*** ** window. +;|*** ** 6 208x240x256 +;|*** */ +;|*** +;|*** UCHAR SetVideoMode( int desiredMode ) +;|*** { +; Line 128 + *** 000062 55 push bp + *** 000063 8b ec mov bp,sp +; desiredMode = 4 +; register dx = vesaMode +; register cx = scanLength +;|*** int vesaMode = 0; +;|*** int scanLength; +;|*** +;|*** // if user requested to skip the mode set, just pass bootargs +;|*** +;|*** if( bNoModeSet ) +; Line 134 + *** 000065 83 3e 00 00 00 cmp WORD PTR $S422_bNoModeSet,0 + *** 00006a 74 04 je $I444 +;|*** { +;|*** return( 0xFF ); // force caller to leave bootargs vars alone +; Line 136 + $L530: + *** 00006c b0 ff mov al,255 ;00ffH + *** 00006e c9 leave + *** 00006f c3 ret +;|*** } +;|*** +;|*** // In the default mode, there is no need to bank switch the card +;|*** // since only 64K required VESA is NOT required for this mode. +;|*** +;|*** if( desiredMode == 0 ) +; Line 142 + $I444: + *** 000070 83 7e 04 00 cmp WORD PTR [bp+4],0 ;desiredMode + *** 000074 74 5c je $I446 +;|*** { +;|*** mode320x200x256(); +;|*** return( 0 ); +;|*** } +;|*** +;|*** // If VESA is supported use VESA to put the +;|*** // video card into the appropriate mode. +;|*** +;|*** if( isVesaSupported() ) +; Line 151 + *** 000076 e8 93 ff call _isVesaSupported + *** 000079 0b c0 or ax,ax + *** 00007b 74 55 je $I446 +;|*** { +;|*** switch( desiredMode ) +; Line 153 + *** 00007d 8b 46 04 mov ax,WORD PTR [bp+4] ;desiredMode +;|*** { +;|*** case 0x01: // 480x240x256 is emulated in a partial 640x480x256 screen +;|*** case 0x02: +;|*** case 0x05: // 240x320x256 is emulated in a partial 640x480x256 screen +;|*** case 0x06: // 208x240x256 is emulated in a partial 640x480x256 screen +;|*** +;|*** scanLength = VESASCANLENGTH1024; // scan length for this mode +;|*** vesaMode = VESAMODE640x480x256; // VESA Mode 101 640x480x256 +;|*** break; +;|*** +;|*** case 0x03: +;|*** +;|*** scanLength = VESASCANLENGTH1024; // scan length for this mode +;|*** vesaMode = VESAMODE800x600x256; // VESA Mode 103 800x600x256 +;|*** break; +;|*** +;|*** case 0x04: +;|*** +;|*** scanLength = VESASCANLENGTH1024; // scan length for this mode +;|*** vesaMode = VESAMODE1024x768x256; // VESA Mode 105 1024x768x256 +;|*** break; +;|*** +;|*** default: +;|*** +;|*** // VESA mode value was passed in - use directly +;|*** +;|*** vesaMode = desiredMode; /* use passed in mode value */ +;|*** vesaMode |= 0x4000; /* ask for linear/flat framebuffer mode */ +;|*** scanLength = 0; /* use mode default scan length */ +;|*** break; +;|*** } +; Line 184 + *** 000080 48 dec ax + *** 000081 3d 05 00 cmp ax,5 + *** 000084 77 14 ja $SD454 + *** 000086 03 c0 add ax,ax + *** 000088 93 xchg ax,bx + *** 000089 2e ff a7 00 00 jmp WORD PTR cs:$L525[bx] + $L525: + *** 00008e 00 00 DW $SC451 + *** 000090 00 00 DW $SC451 + *** 000092 00 00 DW $SC452 + *** 000094 00 00 DW $SC453 + *** 000096 00 00 DW $SC451 + *** 000098 00 00 DW $SC451 +;|*** default: +; Line 176 + $SD454: +;|*** +;|*** // VESA mode value was passed in - use directly +;|*** +;|*** vesaMode = desiredMode; /* use passed in mode value */ +;|*** vesaMode |= 0x4000; /* ask for linear/flat framebuffer mode */ +; Line 181 + *** 00009a 8b 56 04 mov dx,WORD PTR [bp+4] ;desiredMode + *** 00009d 80 ce 40 or dh,64 ;0040H +;|*** scanLength = 0; /* use mode default scan length */ +; Line 182 + *** 0000a0 33 c9 xor cx,cx +;|*** break; +; Line 183 + *** 0000a2 eb 16 jmp SHORT $SB448 +;|*** case 0x01: // 480x240x256 is emulated in a partial 640x480x256 screen +; Line 155 + $SC451: +;|*** case 0x02: +;|*** case 0x05: // 240x320x256 is emulated in a partial 640x480x256 screen +;|*** case 0x06: // 208x240x256 is emulated in a partial 640x480x256 screen +;|*** +;|*** scanLength = VESASCANLENGTH1024; // scan length for this mode +; Line 160 + *** 0000a4 b9 00 04 mov cx,1024 ;0400H +;|*** vesaMode = VESAMODE640x480x256; // VESA Mode 101 640x480x256 +; Line 161 + *** 0000a7 ba 01 01 mov dx,257 ;0101H +;|*** break; +; Line 162 + *** 0000aa eb 0e jmp SHORT $SB448 +;|*** +;|*** case 0x03: +; Line 164 + $SC452: +;|*** +;|*** scanLength = VESASCANLENGTH1024; // scan length for this mode +; Line 166 + *** 0000ac b9 00 04 mov cx,1024 ;0400H +;|*** vesaMode = VESAMODE800x600x256; // VESA Mode 103 800x600x256 +; Line 167 + *** 0000af ba 03 01 mov dx,259 ;0103H +;|*** break; +; Line 168 + *** 0000b2 eb 06 jmp SHORT $SB448 +;|*** +;|*** case 0x04: +; Line 170 + $SC453: +;|*** +;|*** scanLength = VESASCANLENGTH1024; // scan length for this mode +; Line 172 + *** 0000b4 b9 00 04 mov cx,1024 ;0400H +;|*** vesaMode = VESAMODE1024x768x256; // VESA Mode 105 1024x768x256 +; Line 173 + *** 0000b7 ba 05 01 mov dx,261 ;0105H +;|*** break; +;|*** +;|*** default: +;|*** +;|*** // VESA mode value was passed in - use directly +;|*** +;|*** vesaMode = desiredMode; /* use passed in mode value */ +;|*** vesaMode |= 0x4000; /* ask for linear/flat framebuffer mode */ +;|*** scanLength = 0; /* use mode default scan length */ +;|*** break; +;|*** } +; Line 184 + $SB448: +;|*** +;|*** // Setup the video card +;|*** +;|*** if( setVesaMode( vesaMode, scanLength ) ) +; Line 188 + *** 0000ba 51 push cx + *** 0000bb 52 push dx + *** 0000bc e8 79 ff call _setVesaMode + *** 0000bf 8b e5 mov sp,bp + *** 0000c1 0b c0 or ax,ax + *** 0000c3 74 0d je $I446 +;|*** { +;|*** // Indicate status +;|*** +;|*** return( (UCHAR)(desiredMode < 0x100 ? desiredMode : 0xFF) ); +; Line 192 + *** 0000c5 81 7e 04 00 01 cmp WORD PTR [bp+4],256 ;0100H ;desiredMode + *** 0000ca 7d a0 jge $L530 + *** 0000cc 8a 46 04 mov al,BYTE PTR [bp+4] ;desiredMode + *** 0000cf c9 leave + *** 0000d0 c3 ret + *** 0000d1 90 nop +;|*** } +;|*** } +;|*** +;|*** // Set default mode if we get here +;|*** +;|*** mode320x200x256(); +; Line 198 + $I446: + *** 0000d2 e8 2b ff call _mode320x200x256 +;|*** return( 0 ); +; Line 199 + *** 0000d5 32 c0 xor al,al +;|*** } +; Line 200 + *** 0000d7 c9 leave + *** 0000d8 c3 ret + *** 0000d9 90 nop + +_SetVideoMode ENDP + PUBLIC _FindClosestVESAMode +_FindClosestVESAMode PROC NEAR +;|*** +;|*** // +;|*** // FindClosestVESAMode - Finds VESA mode with X and Y size closest to +;|*** // requested screen size. +;|*** // +;|*** // Returns flat framebuffer pointer, flat framebuffer stride, and physical X +;|*** // and Y size +;|*** // +;|*** +;|*** void FindClosestVESAMode( void ) +;|*** { +; Line 211 + *** 0000da c8 1c 03 00 enter 796,0 + *** 0000de 57 push di + *** 0000df 56 push si +; vesaInfo = -512 +; pVesaInfo = -516 +; modeInfo = -772 +; pModeInfo = -776 +; deltaX = -780 +; deltaY = -784 +; currError = -788 +; error = -792 +; vesaMode = -794 +; index = -796 +;|*** VESA_GENERAL_INFO vesaInfo, far *pVesaInfo = &vesaInfo; +; Line 212 + *** 0000e0 8d 86 00 fe lea ax,WORD PTR [bp-512] ;vesaInfo + *** 0000e4 89 86 fc fd mov WORD PTR [bp-516],ax ;pVesaInfo + *** 0000e8 8c 96 fe fd mov WORD PTR [bp-514],ss +;|*** VESA_MODE_INFO modeInfo, far *pModeInfo = &modeInfo; +; Line 213 + *** 0000ec 8d 8e fc fc lea cx,WORD PTR [bp-772] ;modeInfo + *** 0000f0 89 8e f8 fc mov WORD PTR [bp-776],cx ;pModeInfo + *** 0000f4 8c 96 fa fc mov WORD PTR [bp-774],ss +;|*** DWORD deltaX, deltaY; +;|*** DWORD currError, error; +;|*** WORD vesaMode; +;|*** int index; +;|*** +;|*** //printf( "FindClosestVESAMode\n\r" ); +;|*** +;|*** vesaInfo.szSignature[0] = 'V'; +; Line 221 + *** 0000f8 c6 86 00 fe 56 mov BYTE PTR [bp-512],86 ;0056H ;vesaInfo +;|*** vesaInfo.szSignature[1] = 'B'; +; Line 222 + *** 0000fd c6 86 01 fe 42 mov BYTE PTR [bp-511],66 ;0042H +;|*** vesaInfo.szSignature[2] = 'E'; +; Line 223 + *** 000102 c6 86 02 fe 45 mov BYTE PTR [bp-510],69 ;0045H +;|*** vesaInfo.szSignature[3] = '2'; +; Line 224 + *** 000107 c6 86 03 fe 32 mov BYTE PTR [bp-509],50 ;0032H +;|*** +;|*** __asm +;|*** { +;|*** push es +; Line 228 + *** 00010c 06 push es +;|*** mov ax, 04F00h ; Get VESA info +; Line 229 + *** 00010d b8 00 4f mov ax,20224 ;4f00H +;|*** les di, pVesaInfo ; Pointer to info buffer +; Line 230 + *** 000110 c4 be fc fd les di,DWORD PTR [bp-516] ;pVesaInfo +;|*** int 10h ; check for VESA +; Line 231 + *** 000114 cd 10 int 16 ;0010H +;|*** pop es +; Line 232 + *** 000116 07 pop es +;|*** +;|*** cmp ax, 0004Fh ; Was it successful? +; Line 234 + *** 000117 3d 4f 00 cmp ax,79 ;004fH +;|*** je itsok +; Line 235 + *** 00011a 74 04 je $itsok468 +;|*** jmp noVesa +; Line 236 + *** 00011c e9 73 01 jmp $noVesa469 +;|*** } +; Line 237 + *** 00011f 90 nop +;|*** +;|*** itsok: +; Line 239 + $itsok468: +;|*** +;|*** // check for minimum compat version of VBE +;|*** +;|*** if (vesaInfo.wVersion < 0x0200) +; Line 243 + *** 000120 81 be 04 fe 00 02 cmp WORD PTR [bp-508],512 ;0200H + *** 000126 73 03 jae $JCC294 + *** 000128 e9 67 01 jmp $noVesa469 + $JCC294: +;|*** { +;|*** goto noVesa; +;|*** } +;|*** +;|*** // Clear mode, set error to large value +;|*** +;|*** BootArgs.vesaMode = 0; +; Line 250 + *** 00012b c7 06 6c 00 00 00 mov WORD PTR _BootArgs+108,0 +;|*** currError = 0xFFFFFFFF; +; Line 251 + *** 000131 c7 86 ec fc ff ff mov WORD PTR [bp-788],-1 ;ffffH ;currError + *** 000137 c7 86 ee fc ff ff mov WORD PTR [bp-786],-1 ;ffffH +;|*** +;|*** // Process the VESA mode list +;|*** +;|*** for( index=0; vesaInfo.pModeList[index] != -1; index++ ) +; Line 255 + *** 00013d c7 86 e4 fc 00 00 mov WORD PTR [bp-796],0 ;index + *** 000143 e9 32 01 jmp $F471 + $FC472: +;|*** { +;|*** // Set mode we are checking +;|*** +;|*** vesaMode = vesaInfo.pModeList[index]; +; Line 259 + *** 000146 26 8b 00 mov ax,WORD PTR es:[bx][si] + *** 000149 89 86 e6 fc mov WORD PTR [bp-794],ax ;vesaMode +;|*** +;|*** // Fetch the Mode Info +;|*** +;|*** __asm +;|*** { +;|*** push es +; Line 265 + *** 00014d 06 push es +;|*** mov cx, vesaMode +; Line 266 + *** 00014e 8b 8e e6 fc mov cx,WORD PTR [bp-794] ;vesaMode +;|*** les di, pModeInfo ; Pointer to info buffer +; Line 267 + *** 000152 c4 be f8 fc les di,DWORD PTR [bp-776] ;pModeInfo +;|*** mov ax, 04F01h ; Return VBE Mode Information +; Line 268 + *** 000156 b8 01 4f mov ax,20225 ;4f01H +;|*** int 10h +; Line 269 + *** 000159 cd 10 int 16 ;0010H +;|*** pop es +; Line 270 + *** 00015b 07 pop es +;|*** } +; Line 271 +;|*** +;|*** // Check Mode Info - the following are required: +;|*** // +;|*** // - planer mode +;|*** // - flat frame buffer compat mode +;|*** // - matching color depth +;|*** // - same size or bigger than requested +;|*** +;|*** if( (modeInfo.ucNumberOfPlanes == 1) && +;|*** (modeInfo.dwPhysBasePtr != 0) && +;|*** (modeInfo.ucBitsPerPixel == BootArgs.bppScreen) && +;|*** (modeInfo.wXResolution >= BootArgs.cxDisplayScreen) && +;|*** (modeInfo.wYResolution >= BootArgs.cyDisplayScreen) ) +; Line 284 + *** 00015c 80 be 14 fd 01 cmp BYTE PTR [bp-748],1 + *** 000161 74 03 je $JCC353 + *** 000163 e9 0e 01 jmp $I477 + $JCC353: + *** 000166 8b 86 26 fd mov ax,WORD PTR [bp-730] + *** 00016a 0b 86 24 fd or ax,WORD PTR [bp-732] + *** 00016e 75 03 jne $JCC366 + *** 000170 e9 01 01 jmp $I477 + $JCC366: + *** 000173 8a 86 15 fd mov al,BYTE PTR [bp-747] + *** 000177 2a e4 sub ah,ah + *** 000179 3b 06 78 00 cmp ax,WORD PTR _BootArgs+120 + *** 00017d 74 03 je $JCC381 + *** 00017f e9 f2 00 jmp $I477 + $JCC381: + *** 000182 a1 6e 00 mov ax,WORD PTR _BootArgs+110 + *** 000185 39 86 0e fd cmp WORD PTR [bp-754],ax + *** 000189 73 03 jae $JCC393 + *** 00018b e9 e6 00 jmp $I477 + $JCC393: + *** 00018e a1 70 00 mov ax,WORD PTR _BootArgs+112 + *** 000191 39 86 10 fd cmp WORD PTR [bp-752],ax + *** 000195 73 03 jae $JCC405 + *** 000197 e9 da 00 jmp $I477 + $JCC405: +;|*** { +;|*** // only allow 565 16bpp modes through +;|*** +;|*** if( (modeInfo.ucBitsPerPixel == 16) && +;|*** ((modeInfo.ucRedMaskSize != 5) || +;|*** (modeInfo.ucGreenMaskSize != 6) || +;|*** (modeInfo.ucBlueMaskSize != 5)) ) +; Line 291 + *** 00019a 80 be 15 fd 10 cmp BYTE PTR [bp-747],16 ;0010H + *** 00019f 75 1e jne $I475 + *** 0001a1 80 be 1b fd 05 cmp BYTE PTR [bp-741],5 + *** 0001a6 74 03 je $JCC422 + *** 0001a8 e9 c9 00 jmp $I477 + $JCC422: + *** 0001ab 80 be 1d fd 06 cmp BYTE PTR [bp-739],6 + *** 0001b0 74 03 je $JCC432 + *** 0001b2 e9 bf 00 jmp $I477 + $JCC432: + *** 0001b5 80 be 1f fd 05 cmp BYTE PTR [bp-737],5 + *** 0001ba 74 03 je $JCC442 + *** 0001bc e9 b5 00 jmp $I477 + $JCC442: +;|*** { +;|*** continue; +;|*** } +;|*** +;|*** // Compute screen resolution error +;|*** +;|*** deltaX = (DWORD)modeInfo.wXResolution - +; Line 298 + $I475: +;|*** (DWORD)BootArgs.cxDisplayScreen; +; Line 299 + *** 0001bf 8b 86 0e fd mov ax,WORD PTR [bp-754] + *** 0001c3 2b d2 sub dx,dx + *** 0001c5 2b 06 6e 00 sub ax,WORD PTR _BootArgs+110 + *** 0001c9 1b d2 sbb dx,dx + *** 0001cb 89 86 f4 fc mov WORD PTR [bp-780],ax ;deltaX + *** 0001cf 89 96 f6 fc mov WORD PTR [bp-778],dx +;|*** deltaY = (DWORD)modeInfo.wYResolution - +;|*** (DWORD)BootArgs.cyDisplayScreen; +; Line 301 + *** 0001d3 8b 8e 10 fd mov cx,WORD PTR [bp-752] + *** 0001d7 2b db sub bx,bx + *** 0001d9 2b 0e 70 00 sub cx,WORD PTR _BootArgs+112 + *** 0001dd 1b db sbb bx,bx + *** 0001df 89 8e f0 fc mov WORD PTR [bp-784],cx ;deltaY + *** 0001e3 89 9e f2 fc mov WORD PTR [bp-782],bx +;|*** +;|*** error = ((deltaX * deltaX) + (deltaY * deltaY)); +; Line 303 + *** 0001e7 53 push bx + *** 0001e8 51 push cx + *** 0001e9 53 push bx + *** 0001ea 51 push cx + *** 0001eb 8b f0 mov si,ax + *** 0001ed 8b fa mov di,dx + *** 0001ef e8 00 00 call __aNulmul + *** 0001f2 57 push di + *** 0001f3 56 push si + *** 0001f4 57 push di + *** 0001f5 56 push si + *** 0001f6 8b f0 mov si,ax + *** 0001f8 8b fa mov di,dx + *** 0001fa e8 00 00 call __aNulmul + *** 0001fd 03 f0 add si,ax + *** 0001ff 13 fa adc di,dx + *** 000201 89 b6 e8 fc mov WORD PTR [bp-792],si ;error + *** 000205 89 be ea fc mov WORD PTR [bp-790],di +;|*** +;|*** // If the error is diminishing save the mode data +;|*** +;|*** if( error < currError ) +; Line 307 + *** 000209 3b be ee fc cmp di,WORD PTR [bp-786] + *** 00020d 77 65 ja $I477 + *** 00020f 72 06 jb $L527 + *** 000211 3b b6 ec fc cmp si,WORD PTR [bp-788] ;currError + *** 000215 73 5d jae $I477 + $L527: +;|*** { +;|*** // Save the current error for next comparison +;|*** +;|*** currError = error; +; Line 311 + *** 000217 89 b6 ec fc mov WORD PTR [bp-788],si ;currError + *** 00021b 89 be ee fc mov WORD PTR [bp-786],di +;|*** +;|*** // Update the boot args with current data +;|*** +;|*** BootArgs.vesaMode = vesaMode; +; Line 315 + *** 00021f 8b 86 e6 fc mov ax,WORD PTR [bp-794] ;vesaMode + *** 000223 a3 6c 00 mov WORD PTR _BootArgs+108,ax +;|*** BootArgs.pvFlatFrameBuffer = modeInfo.dwPhysBasePtr; +; Line 316 + *** 000226 8b 86 24 fd mov ax,WORD PTR [bp-732] + *** 00022a 8b 96 26 fd mov dx,WORD PTR [bp-730] + *** 00022e a3 68 00 mov WORD PTR _BootArgs+104,ax + *** 000231 89 16 6a 00 mov WORD PTR _BootArgs+106,dx +;|*** BootArgs.cxPhysicalScreen = modeInfo.wXResolution; +; Line 317 + *** 000235 8b 86 0e fd mov ax,WORD PTR [bp-754] + *** 000239 a3 72 00 mov WORD PTR _BootArgs+114,ax +;|*** BootArgs.cyPhysicalScreen = modeInfo.wYResolution; +; Line 318 + *** 00023c 8b 86 10 fd mov ax,WORD PTR [bp-752] + *** 000240 a3 74 00 mov WORD PTR _BootArgs+116,ax +;|*** BootArgs.cbScanLineLength = modeInfo.wBytesPerScanLine; +; Line 319 + *** 000243 8b 86 0c fd mov ax,WORD PTR [bp-756] + *** 000247 a3 76 00 mov WORD PTR _BootArgs+118,ax +;|*** BootArgs.RedMaskSize = modeInfo.ucRedMaskSize; +; Line 320 + *** 00024a 8a 86 1b fd mov al,BYTE PTR [bp-741] + *** 00024e a2 7a 00 mov BYTE PTR _BootArgs+122,al +;|*** BootArgs.RedMaskPosition = modeInfo.ucRedFieldPosition; +; Line 321 + *** 000251 8a 86 1c fd mov al,BYTE PTR [bp-740] + *** 000255 a2 7b 00 mov BYTE PTR _BootArgs+123,al +;|*** BootArgs.GreenMaskSize = modeInfo.ucGreenMaskSize; +; Line 322 + *** 000258 8a 86 1d fd mov al,BYTE PTR [bp-739] + *** 00025c a2 7c 00 mov BYTE PTR _BootArgs+124,al +;|*** BootArgs.GreenMaskPosition = modeInfo.ucGreenFieldPosition; +; Line 323 + *** 00025f 8a 86 1e fd mov al,BYTE PTR [bp-738] + *** 000263 a2 7d 00 mov BYTE PTR _BootArgs+125,al +;|*** BootArgs.BlueMaskSize = modeInfo.ucBlueMaskSize; +; Line 324 + *** 000266 8a 86 1f fd mov al,BYTE PTR [bp-737] + *** 00026a a2 7e 00 mov BYTE PTR _BootArgs+126,al +;|*** BootArgs.BlueMaskPosition = modeInfo.ucBlueFieldPosition; +; Line 325 + *** 00026d 8a 86 20 fd mov al,BYTE PTR [bp-736] + *** 000271 a2 7f 00 mov BYTE PTR _BootArgs+127,al +;|*** } +;|*** } +; Line 327 + $I477: +;|*** } +; Line 328 + *** 000274 ff 86 e4 fc inc WORD PTR [bp-796] ;index + $F471: + *** 000278 8b 9e e4 fc mov bx,WORD PTR [bp-796] ;index + *** 00027c 03 db add bx,bx + *** 00027e c4 b6 0e fe les si,DWORD PTR [bp-498] + *** 000282 26 83 38 ff cmp WORD PTR es:[bx][si],-1 ;ffffH + *** 000286 74 03 je $JCC646 + *** 000288 e9 bb fe jmp $FC472 + $JCC646: +;|*** +;|*** +;|*** if( BootArgs.vesaMode == 0) +; Line 331 + *** 00028b 83 3e 6c 00 00 cmp WORD PTR _BootArgs+108,0 + *** 000290 75 06 jne $EX457 +;|*** { +;|*** goto noVesa; +; Line 333 + $noVesa469: +;|*** } +;|*** +;|*** return; +;|*** +;|*** noVesa: +;|*** +;|*** // no matching VESA mode found, use 320x200x8 video mode as fallback +;|*** +;|*** BootArgs.vesaMode = 0; +; Line 342 + *** 000292 c7 06 6c 00 00 00 mov WORD PTR _BootArgs+108,0 +;|*** } +; Line 343 + $EX457: + *** 000298 5e pop si + *** 000299 5f pop di + *** 00029a c9 leave + *** 00029b c3 ret + +_FindClosestVESAMode ENDP + PUBLIC _FindVESAMode +_FindVESAMode PROC NEAR +;|*** +;|*** // +;|*** // FindVESAMode - Finds VESA mode which exactly matches requested X and Y size +;|*** // Returns flat framebuffer pointer and flat framebuffer stride +;|*** // +;|*** +;|*** void FindVESAMode( void ) +;|*** { +; Line 351 + *** 00029c c8 0c 03 00 enter 780,0 + *** 0002a0 57 push di + *** 0002a1 56 push si +; vesaInfo = -512 +; pVesaInfo = -516 +; modeInfo = -772 +; pModeInfo = -776 +; vesaMode = -778 +; index = -780 +;|*** VESA_GENERAL_INFO vesaInfo, far *pVesaInfo = &vesaInfo; +; Line 352 + *** 0002a2 8d 86 00 fe lea ax,WORD PTR [bp-512] ;vesaInfo + *** 0002a6 89 86 fc fd mov WORD PTR [bp-516],ax ;pVesaInfo + *** 0002aa 8c 96 fe fd mov WORD PTR [bp-514],ss +;|*** VESA_MODE_INFO modeInfo, far *pModeInfo = &modeInfo; +; Line 353 + *** 0002ae 8d 8e fc fc lea cx,WORD PTR [bp-772] ;modeInfo + *** 0002b2 89 8e f8 fc mov WORD PTR [bp-776],cx ;pModeInfo + *** 0002b6 8c 96 fa fc mov WORD PTR [bp-774],ss +;|*** WORD vesaMode; +;|*** int index; +;|*** +;|*** //printf( "FindVesaMode( void )\n" ); +;|*** +;|*** vesaInfo.szSignature[0] = 'V'; +; Line 359 + *** 0002ba c6 86 00 fe 56 mov BYTE PTR [bp-512],86 ;0056H ;vesaInfo +;|*** vesaInfo.szSignature[1] = 'B'; +; Line 360 + *** 0002bf c6 86 01 fe 42 mov BYTE PTR [bp-511],66 ;0042H +;|*** vesaInfo.szSignature[2] = 'E'; +; Line 361 + *** 0002c4 c6 86 02 fe 45 mov BYTE PTR [bp-510],69 ;0045H +;|*** vesaInfo.szSignature[3] = '2'; +; Line 362 + *** 0002c9 c6 86 03 fe 32 mov BYTE PTR [bp-509],50 ;0032H +;|*** +;|*** // Fetch the VESA info data +;|*** +;|*** __asm +;|*** { +;|*** push es +; Line 368 + *** 0002ce 06 push es +;|*** mov ax, 04F00h ; Get VESA info +; Line 369 + *** 0002cf b8 00 4f mov ax,20224 ;4f00H +;|*** les di, pVesaInfo ; Pointer to info buffer +; Line 370 + *** 0002d2 c4 be fc fd les di,DWORD PTR [bp-516] ;pVesaInfo +;|*** int 10h ; check for VESA +; Line 371 + *** 0002d6 cd 10 int 16 ;0010H +;|*** pop es +; Line 372 + *** 0002d8 07 pop es +;|*** +;|*** cmp ax, 0004Fh ; Was it successful? +; Line 374 + *** 0002d9 3d 4f 00 cmp ax,79 ;004fH +;|*** je itsok +; Line 375 + *** 0002dc 74 04 je $itsok487 +;|*** jmp noVesa +; Line 376 + *** 0002de e9 c2 00 jmp $noVesa488 +;|*** } +; Line 377 + *** 0002e1 90 nop +;|*** +;|*** itsok: +; Line 379 + $itsok487: +;|*** +;|*** // Validate minimum compatibility version of VBE +;|*** +;|*** if( vesaInfo.wVersion < 0x0200 ) +; Line 383 + *** 0002e2 81 be 04 fe 00 02 cmp WORD PTR [bp-508],512 ;0200H + *** 0002e8 73 03 jae $JCC744 + *** 0002ea e9 b6 00 jmp $noVesa488 + $JCC744: +;|*** { +;|*** goto noVesa; +;|*** } +;|*** +;|*** // Clear mode +;|*** +;|*** BootArgs.vesaMode = 0; +; Line 390 + *** 0002ed c7 06 6c 00 00 00 mov WORD PTR _BootArgs+108,0 +;|*** +;|*** // Process the VESA ModeList +;|*** +;|*** for( index=0; vesaInfo.pModeList[index] != -1; index++ ) +; Line 394 + *** 0002f3 c7 86 f4 fc 00 00 mov WORD PTR [bp-780],0 ;index + *** 0002f9 e9 94 00 jmp $F490 + $FC491: +;|*** { +;|*** // Set mode we are checking +;|*** +;|*** vesaMode = vesaInfo.pModeList[index]; +; Line 398 + *** 0002fc 26 8b 00 mov ax,WORD PTR es:[bx][si] + *** 0002ff 89 86 f6 fc mov WORD PTR [bp-778],ax ;vesaMode +;|*** +;|*** // Fetch the Mode Info +;|*** +;|*** __asm +;|*** { +;|*** push es +; Line 404 + *** 000303 06 push es +;|*** mov cx, vesaMode +; Line 405 + *** 000304 8b 8e f6 fc mov cx,WORD PTR [bp-778] ;vesaMode +;|*** les di, pModeInfo ; Pointer to info buffer +; Line 406 + *** 000308 c4 be f8 fc les di,DWORD PTR [bp-776] ;pModeInfo +;|*** mov ax, 04F01h ; Return VBE Mode Information +; Line 407 + *** 00030c b8 01 4f mov ax,20225 ;4f01H +;|*** int 10h +; Line 408 + *** 00030f cd 10 int 16 ;0010H +;|*** pop es +; Line 409 + *** 000311 07 pop es +;|*** } +; Line 410 +;|*** +;|*** // Check Mode Info - the following are required: +;|*** // +;|*** // - planer mode +;|*** // - flat frame buffer compat mode +;|*** // - matching color depth +;|*** // - same size or bigger than requested +;|*** +;|*** if( (modeInfo.ucNumberOfPlanes == 1) && +;|*** (modeInfo.dwPhysBasePtr != 0) && +;|*** (modeInfo.ucBitsPerPixel == BootArgs.bppScreen) && +;|*** (modeInfo.wXResolution == BootArgs.cxPhysicalScreen) && +;|*** (modeInfo.wYResolution == BootArgs.cyPhysicalScreen) ) +; Line 423 + *** 000312 80 be 14 fd 01 cmp BYTE PTR [bp-748],1 + *** 000317 75 73 jne $L532 + *** 000319 8b 86 26 fd mov ax,WORD PTR [bp-730] + *** 00031d 0b 86 24 fd or ax,WORD PTR [bp-732] + *** 000321 74 69 je $L532 + *** 000323 8a 86 15 fd mov al,BYTE PTR [bp-747] + *** 000327 2a e4 sub ah,ah + *** 000329 3b 06 78 00 cmp ax,WORD PTR _BootArgs+120 + *** 00032d 75 5d jne $L532 + *** 00032f a1 72 00 mov ax,WORD PTR _BootArgs+114 + *** 000332 39 86 0e fd cmp WORD PTR [bp-754],ax + *** 000336 75 54 jne $L532 + *** 000338 a1 74 00 mov ax,WORD PTR _BootArgs+116 + *** 00033b 39 86 10 fd cmp WORD PTR [bp-752],ax + *** 00033f 75 4b jne $L532 +;|*** { +;|*** // Conditions are met. Set BootArgs with Mode data and return. +;|*** +;|*** BootArgs.vesaMode = vesaMode; +; Line 427 + *** 000341 8b 86 f6 fc mov ax,WORD PTR [bp-778] ;vesaMode + *** 000345 a3 6c 00 mov WORD PTR _BootArgs+108,ax +;|*** BootArgs.pvFlatFrameBuffer = modeInfo.dwPhysBasePtr; +; Line 428 + *** 000348 8b 86 24 fd mov ax,WORD PTR [bp-732] + *** 00034c 8b 96 26 fd mov dx,WORD PTR [bp-730] + *** 000350 a3 68 00 mov WORD PTR _BootArgs+104,ax + *** 000353 89 16 6a 00 mov WORD PTR _BootArgs+106,dx +;|*** BootArgs.cbScanLineLength = modeInfo.wBytesPerScanLine; +; Line 429 + *** 000357 8b 86 0c fd mov ax,WORD PTR [bp-756] + *** 00035b a3 76 00 mov WORD PTR _BootArgs+118,ax +;|*** BootArgs.RedMaskSize = modeInfo.ucRedMaskSize; +; Line 430 + *** 00035e 8a 86 1b fd mov al,BYTE PTR [bp-741] + *** 000362 a2 7a 00 mov BYTE PTR _BootArgs+122,al +;|*** BootArgs.RedMaskPosition = modeInfo.ucRedFieldPosition; +; Line 431 + *** 000365 8a 86 1c fd mov al,BYTE PTR [bp-740] + *** 000369 a2 7b 00 mov BYTE PTR _BootArgs+123,al +;|*** BootArgs.GreenMaskSize = modeInfo.ucGreenMaskSize; +; Line 432 + *** 00036c 8a 86 1d fd mov al,BYTE PTR [bp-739] + *** 000370 a2 7c 00 mov BYTE PTR _BootArgs+124,al +;|*** BootArgs.GreenMaskPosition = modeInfo.ucGreenFieldPosition; +; Line 433 + *** 000373 8a 86 1e fd mov al,BYTE PTR [bp-738] + *** 000377 a2 7d 00 mov BYTE PTR _BootArgs+125,al +;|*** BootArgs.BlueMaskSize = modeInfo.ucBlueMaskSize; +; Line 434 + *** 00037a 8a 86 1f fd mov al,BYTE PTR [bp-737] + *** 00037e a2 7e 00 mov BYTE PTR _BootArgs+126,al +;|*** BootArgs.BlueMaskPosition = modeInfo.ucBlueFieldPosition; +; Line 435 + *** 000381 8a 86 20 fd mov al,BYTE PTR [bp-736] + *** 000385 a2 7f 00 mov BYTE PTR _BootArgs+127,al +;|*** return; +; Line 436 + *** 000388 5e pop si + *** 000389 5f pop di + *** 00038a c9 leave + *** 00038b c3 ret +;|*** } +;|*** } +; Line 438 + $L532: + *** 00038c ff 86 f4 fc inc WORD PTR [bp-780] ;index + $F490: + *** 000390 8b 9e f4 fc mov bx,WORD PTR [bp-780] ;index + *** 000394 03 db add bx,bx + *** 000396 c4 b6 0e fe les si,DWORD PTR [bp-498] + *** 00039a 26 83 38 ff cmp WORD PTR es:[bx][si],-1 ;ffffH + *** 00039e 74 03 je $JCC926 + *** 0003a0 e9 59 ff jmp $FC491 + $JCC926: +;|*** +;|*** noVesa: +; Line 440 + $noVesa488: +;|*** +;|*** // No matching VESA mode found, use 320x200x8 as fallback +;|*** +;|*** BootArgs.vesaMode = 0; +; Line 444 + *** 0003a3 c7 06 6c 00 00 00 mov WORD PTR _BootArgs+108,0 +;|*** } +; Line 445 + *** 0003a9 5e pop si + *** 0003aa 5f pop di + *** 0003ab c9 leave + *** 0003ac c3 ret + *** 0003ad 90 nop + +_FindVESAMode ENDP + PUBLIC _ParseVESAOptions +_ParseVESAOptions PROC NEAR +;|*** +;|*** // +;|*** // ParseVESAOptions +;|*** // +;|*** +;|*** BOOL ParseVESAOptions( char *params ) +;|*** { +; Line 452 + *** 0003ae 55 push bp + *** 0003af 8b ec mov bp,sp + *** 0003b1 57 push di + *** 0003b2 56 push si +; params = 4 +; register si = cArgs + *** 0003b3 8b 56 04 mov dx,WORD PTR [bp+4] ;params +;|*** int cArgs; +;|*** +;|*** //printf( "ParseVESAOptions( 0x%x )\n", params ); +;|*** +;|*** // Clear mode +;|*** +;|*** BootArgs.vesaMode = 0; +; Line 459 + *** 0003b6 c7 06 6c 00 00 00 mov WORD PTR _BootArgs+108,0 +;|*** +;|*** // Verify option format is /L: +;|*** +;|*** if (params[2] != ':') +; Line 463 + *** 0003bc 8b da mov bx,dx + *** 0003be 80 7f 02 3a cmp BYTE PTR [bx+2],58 ;003aH + *** 0003c2 74 06 je $I499 +;|*** { +;|*** return( FALSE ); // colon after /L missing, exit +; Line 465 + $L533: + *** 0003c4 33 c0 xor ax,ax + *** 0003c6 5e pop si + *** 0003c7 5f pop di + *** 0003c8 c9 leave + *** 0003c9 c3 ret +;|*** } +;|*** +;|*** // Check for the N format of the option, /L:N:xxx. This +;|*** // mode skips all the VESA mode processing and the mode set. +;|*** +;|*** if( (memcmp( ¶ms[3],"N:",2) == 0) || (memcmp( ¶ms[3],"n:",2) == 0) ) +; Line 471 + $I499: + *** 0003ca 8b c2 mov ax,dx + *** 0003cc 05 03 00 add ax,3 + *** 0003cf bb 00 00 mov bx,OFFSET DGROUP:$SG502 + *** 0003d2 b9 02 00 mov cx,2 + *** 0003d5 8b fb mov di,bx + *** 0003d7 8b f0 mov si,ax + *** 0003d9 1e push ds + *** 0003da 07 pop es + *** 0003db d1 e9 shr cx,1 + *** 0003dd 1b c0 sbb ax,ax + *** 0003df 3b c9 cmp cx,cx + *** 0003e1 f3 repz + *** 0003e2 a7 cmpsw + *** 0003e3 75 04 jne $L528 + *** 0003e5 2b c8 sub cx,ax + *** 0003e7 f3 repz + *** 0003e8 a6 cmpsb + $L528: + *** 0003e9 74 77 je $I501 + *** 0003eb 8b c2 mov ax,dx + *** 0003ed 05 03 00 add ax,3 + *** 0003f0 bb 00 00 mov bx,OFFSET DGROUP:$SG503 + *** 0003f3 b9 02 00 mov cx,2 + *** 0003f6 8b fb mov di,bx + *** 0003f8 8b f0 mov si,ax + *** 0003fa d1 e9 shr cx,1 + *** 0003fc 1b c0 sbb ax,ax + *** 0003fe 3b c9 cmp cx,cx + *** 000400 f3 repz + *** 000401 a7 cmpsw + *** 000402 75 04 jne $L529 + *** 000404 2b c8 sub cx,ax + *** 000406 f3 repz + *** 000407 a6 cmpsb + $L529: + *** 000408 74 58 je $I501 +;|*** { +;|*** bNoModeSet = TRUE; +;|*** +;|*** cArgs = sscanf( ¶ms[5], "%dx%dx%d:%dx%d", +;|*** &BootArgs.cxDisplayScreen, +;|*** &BootArgs.cyDisplayScreen, +;|*** &BootArgs.bppScreen, +;|*** &BootArgs.cxPhysicalScreen, +;|*** &BootArgs.cyPhysicalScreen ); +;|*** if(cArgs == 3) +;|*** { +;|*** BootArgs.cxPhysicalScreen = BootArgs.cxDisplayScreen; +;|*** BootArgs.cyPhysicalScreen = BootArgs.cyDisplayScreen; +;|*** } +;|*** else if(cArgs == 5) +;|*** { +;|*** if (BootArgs.cxPhysicalScreen < BootArgs.cxDisplayScreen || +;|*** BootArgs.cyPhysicalScreen < BootArgs.cyDisplayScreen) +;|*** { +;|*** printf +;|*** ( +;|*** "ERROR: The physical screen dimensions (PX & PY) should be larger than the\n" +;|*** " display resolution chosen. This option is used to simulate a \n" +;|*** " smaller drawing area on a larger display.\n" +;|*** ); +;|*** +;|*** // The physical screen size must be >= display screen size +;|*** +;|*** return( FALSE ); +;|*** } +;|*** } +;|*** BootArgs.vesaMode = 0xffff; // just some really large value +;|*** } +;|*** else +;|*** { +;|*** // No 'N' present in option. Process and set the VESA mode +;|*** +;|*** bNoModeSet = FALSE; +; Line 509 + *** 00040a c7 06 00 00 00 00 mov WORD PTR $S422_bNoModeSet,0 +;|*** +;|*** cArgs = sscanf( ¶ms[3], "%dx%dx%d:%dx%d", +;|*** &BootArgs.cxDisplayScreen, +;|*** &BootArgs.cyDisplayScreen, +;|*** &BootArgs.bppScreen, +;|*** &BootArgs.cxPhysicalScreen, +;|*** &BootArgs.cyPhysicalScreen ); +;|*** +;|*** // Process according to # of args specified +;|*** +;|*** switch( cArgs ) +; Line 520 + *** 000410 68 74 00 push OFFSET _BootArgs+116 + *** 000413 68 72 00 push OFFSET _BootArgs+114 + *** 000416 68 78 00 push OFFSET _BootArgs+120 + *** 000419 68 70 00 push OFFSET _BootArgs+112 + *** 00041c 68 6e 00 push OFFSET _BootArgs+110 + *** 00041f 68 00 00 push OFFSET DGROUP:$SG512 + *** 000422 83 c2 03 add dx,3 + *** 000425 52 push dx + *** 000426 e8 00 00 call _sscanf + *** 000429 83 c4 0e add sp,14 ;000eH +;|*** { +;|*** case 3: +;|*** +;|*** // Explicit physical size not specified - find closest one +;|*** +;|*** FindClosestVESAMode(); // uses and fills in BootArgs values +;|*** break; +;|*** +;|*** case 5: +;|*** +;|*** // Validate specified physical size +;|*** +;|*** if( BootArgs.cxPhysicalScreen < BootArgs.cxDisplayScreen || +;|*** BootArgs.cyPhysicalScreen < BootArgs.cyDisplayScreen ) +;|*** { +;|*** printf +;|*** ( +;|*** "ERROR: The physical screen dimensions (PX & PY) should be larger than the\n" +;|*** " display resolution chosen. This option is used to simulate a \n" +;|*** " smaller drawing area on a larger display.\n" +;|*** ); +;|*** +;|*** // The physical screen size must be >= display screen size +;|*** +;|*** return( FALSE ); +;|*** } +;|*** +;|*** // Find the actual VESA mode +;|*** +;|*** FindVESAMode(); // uses and fills in BootArgs values +;|*** break; +;|*** +;|*** default: +;|*** +;|*** // Invalid number of parameters +;|*** +;|*** return( FALSE ); +;|*** break; +;|*** } +; Line 559 + *** 00042c 2d 03 00 sub ax,3 + *** 00042f 74 07 je $SC517 + *** 000431 48 dec ax + *** 000432 48 dec ax + *** 000433 74 09 je $SC518 +;|*** default: +; Line 553 + *** 000435 eb 8d jmp SHORT $L533 + *** 000437 90 nop +;|*** case 3: +; Line 522 + $SC517: +;|*** +;|*** // Explicit physical size not specified - find closest one +;|*** +;|*** FindClosestVESAMode(); // uses and fills in BootArgs values +; Line 526 + *** 000438 e8 9f fc call _FindClosestVESAMode +;|*** break; +; Line 527 + *** 00043b eb 7f jmp SHORT $I511 + *** 00043d 90 nop +;|*** +;|*** case 5: +; Line 529 + $SC518: +;|*** +;|*** // Validate specified physical size +;|*** +;|*** if( BootArgs.cxPhysicalScreen < BootArgs.cxDisplayScreen || +;|*** BootArgs.cyPhysicalScreen < BootArgs.cyDisplayScreen ) +; Line 534 + *** 00043e a1 72 00 mov ax,WORD PTR _BootArgs+114 + *** 000441 39 06 6e 00 cmp WORD PTR _BootArgs+110,ax + *** 000445 77 0f ja $I520 + *** 000447 a1 74 00 mov ax,WORD PTR _BootArgs+116 + *** 00044a 39 06 70 00 cmp WORD PTR _BootArgs+112,ax + *** 00044e 77 06 ja $I520 +;|*** { +;|*** printf +;|*** ( +;|*** "ERROR: The physical screen dimensions (PX & PY) should be larger than the\n" +;|*** " display resolution chosen. This option is used to simulate a \n" +;|*** " smaller drawing area on a larger display.\n" +;|*** ); +;|*** +;|*** // The physical screen size must be >= display screen size +;|*** +;|*** return( FALSE ); +;|*** } +;|*** +;|*** // Find the actual VESA mode +;|*** +;|*** FindVESAMode(); // uses and fills in BootArgs values +; Line 550 + *** 000450 e8 49 fe call _FindVESAMode +;|*** break; +; Line 551 + *** 000453 eb 67 jmp SHORT $I511 + *** 000455 90 nop +;|*** BootArgs.cyPhysicalScreen < BootArgs.cyDisplayScreen ) +; Line 534 + $I520: +;|*** { +;|*** printf +;|*** ( +;|*** "ERROR: The physical screen dimensions (PX & PY) should be larger than the\n" +;|*** " display resolution chosen. This option is used to simulate a \n" +;|*** " smaller drawing area on a larger display.\n" +;|*** ); +; Line 541 + *** 000456 68 00 00 push OFFSET DGROUP:$SG521 + $L534: + *** 000459 e8 00 00 call _printf + *** 00045c 83 c4 02 add sp,2 + *** 00045f e9 62 ff jmp $L533 +;|*** if( (memcmp( ¶ms[3],"N:",2) == 0) || (memcmp( ¶ms[3],"n:",2) == 0) ) +; Line 471 + $I501: +;|*** { +;|*** bNoModeSet = TRUE; +; Line 473 + *** 000462 c7 06 00 00 01 00 mov WORD PTR $S422_bNoModeSet,1 +;|*** +;|*** cArgs = sscanf( ¶ms[5], "%dx%dx%d:%dx%d", +;|*** &BootArgs.cxDisplayScreen, +;|*** &BootArgs.cyDisplayScreen, +;|*** &BootArgs.bppScreen, +;|*** &BootArgs.cxPhysicalScreen, +;|*** &BootArgs.cyPhysicalScreen ); +;|*** if(cArgs == 3) +; Line 481 + *** 000468 68 74 00 push OFFSET _BootArgs+116 + *** 00046b 68 72 00 push OFFSET _BootArgs+114 + *** 00046e 68 78 00 push OFFSET _BootArgs+120 + *** 000471 68 70 00 push OFFSET _BootArgs+112 + *** 000474 68 6e 00 push OFFSET _BootArgs+110 + *** 000477 68 00 00 push OFFSET DGROUP:$SG504 + *** 00047a 83 c2 05 add dx,5 + *** 00047d 52 push dx + *** 00047e e8 00 00 call _sscanf + *** 000481 83 c4 0e add sp,14 ;000eH + *** 000484 8b f0 mov si,ax + *** 000486 83 fe 03 cmp si,3 + *** 000489 75 0f jne $I505 +;|*** { +;|*** BootArgs.cxPhysicalScreen = BootArgs.cxDisplayScreen; +; Line 483 + *** 00048b a1 6e 00 mov ax,WORD PTR _BootArgs+110 + *** 00048e a3 72 00 mov WORD PTR _BootArgs+114,ax +;|*** BootArgs.cyPhysicalScreen = BootArgs.cyDisplayScreen; +; Line 484 + *** 000491 a1 70 00 mov ax,WORD PTR _BootArgs+112 + *** 000494 a3 74 00 mov WORD PTR _BootArgs+116,ax +;|*** } +;|*** else if(cArgs == 5) +; Line 486 + *** 000497 eb 1d jmp SHORT $I506 + *** 000499 90 nop + $I505: + *** 00049a 83 fe 05 cmp si,5 + *** 00049d 75 17 jne $I506 +;|*** { +;|*** if (BootArgs.cxPhysicalScreen < BootArgs.cxDisplayScreen || +;|*** BootArgs.cyPhysicalScreen < BootArgs.cyDisplayScreen) +; Line 489 + *** 00049f a1 72 00 mov ax,WORD PTR _BootArgs+114 + *** 0004a2 39 06 6e 00 cmp WORD PTR _BootArgs+110,ax + *** 0004a6 77 09 ja $I509 + *** 0004a8 a1 74 00 mov ax,WORD PTR _BootArgs+116 + *** 0004ab 39 06 70 00 cmp WORD PTR _BootArgs+112,ax + *** 0004af 76 05 jbe $I506 + $I509: +;|*** { +;|*** printf +;|*** ( +;|*** "ERROR: The physical screen dimensions (PX & PY) should be larger than the\n" +;|*** " display resolution chosen. This option is used to simulate a \n" +;|*** " smaller drawing area on a larger display.\n" +;|*** ); +; Line 496 + *** 0004b1 68 00 00 push OFFSET DGROUP:$SG510 + *** 0004b4 eb a3 jmp SHORT $L534 +;|*** +;|*** // The physical screen size must be >= display screen size +;|*** +;|*** return( FALSE ); +;|*** } +;|*** } +;|*** BootArgs.vesaMode = 0xffff; // just some really large value +; Line 503 + $I506: + *** 0004b6 c7 06 6c 00 ff ff mov WORD PTR _BootArgs+108,-1 ;ffffH +;|*** } +;|*** else +;|*** { +;|*** // No 'N' present in option. Process and set the VESA mode +;|*** +;|*** bNoModeSet = FALSE; +;|*** +;|*** cArgs = sscanf( ¶ms[3], "%dx%dx%d:%dx%d", +;|*** &BootArgs.cxDisplayScreen, +;|*** &BootArgs.cyDisplayScreen, +;|*** &BootArgs.bppScreen, +;|*** &BootArgs.cxPhysicalScreen, +;|*** &BootArgs.cyPhysicalScreen ); +;|*** +;|*** // Process according to # of args specified +;|*** +;|*** switch( cArgs ) +;|*** { +;|*** case 3: +;|*** +;|*** // Explicit physical size not specified - find closest one +;|*** +;|*** FindClosestVESAMode(); // uses and fills in BootArgs values +;|*** break; +;|*** +;|*** case 5: +;|*** +;|*** // Validate specified physical size +;|*** +;|*** if( BootArgs.cxPhysicalScreen < BootArgs.cxDisplayScreen || +;|*** BootArgs.cyPhysicalScreen < BootArgs.cyDisplayScreen ) +;|*** { +;|*** printf +;|*** ( +;|*** "ERROR: The physical screen dimensions (PX & PY) should be larger than the\n" +;|*** " display resolution chosen. This option is used to simulate a \n" +;|*** " smaller drawing area on a larger display.\n" +;|*** ); +;|*** +;|*** // The physical screen size must be >= display screen size +;|*** +;|*** return( FALSE ); +;|*** } +;|*** +;|*** // Find the actual VESA mode +;|*** +;|*** FindVESAMode(); // uses and fills in BootArgs values +;|*** break; +;|*** +;|*** default: +;|*** +;|*** // Invalid number of parameters +;|*** +;|*** return( FALSE ); +;|*** break; +;|*** } +;|*** } +; Line 560 + $I511: +;|*** +;|*** // Indicate success +;|*** +;|*** return( TRUE ); +; Line 564 + *** 0004bc b8 01 00 mov ax,1 +;|*** } +; Line 565 + *** 0004bf 5e pop si + *** 0004c0 5f pop di + *** 0004c1 c9 leave + *** 0004c2 c3 ret + *** 0004c3 90 nop + +_ParseVESAOptions ENDP +_TEXT ENDS +END diff --git a/DOS/LOADCEPC/video.h b/DOS/LOADCEPC/video.h new file mode 100644 index 0000000..51e0758 --- /dev/null +++ b/DOS/LOADCEPC/video.h @@ -0,0 +1,73 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// +// Use of this sample source code is subject to the terms of the Microsoft +// license agreement under which you licensed this sample source code. If +// you did not accept the terms of the license agreement, you are not +// authorized to use this sample source code. For the terms of the license, +// please see the license agreement between you and Microsoft or, if applicable, +// see the LICENSE.RTF on your install media or the root of your tools installation. +// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +// +#define VESAMODE480x200x256 0x101 /* VESA Mode 101 - 480x200x256 emulated in 640x480 */ +#define VESAMODE640x480x256 0x101 /* VESA Mode 101 - 640x480x256 */ +#define VESAMODE800x600x256 0x103 /* VESA Mode 103 - 800x600x256 */ +#define VESAMODE1024x768x256 0x105 /* VESA Mode 105 - 1024x768x256 */ + +#define VESASCANLENGTH1024 1024 /* These VESA modes have the same scan length */ + +#pragma pack(1) +typedef struct _VESA_GENERAL_INFO +{ + UCHAR szSignature[4]; + WORD wVersion; + UCHAR far * pszVendor; + DWORD dwCapabilities; + WORD far * pModeList; + WORD wTotalMemory; + WORD wOemSoftwareRev; + UCHAR far* pszVenderName; + UCHAR far* pszProductName; + UCHAR far* pszProductRev; + UCHAR ucReserved[222]; + UCHAR ucOemData[256]; +} VESA_GENERAL_INFO; + +typedef struct _VESA_MODE_INFO +{ + WORD wModeAttributes; /* Mode attributes */ + UCHAR ucWindowAAttributes; /* Window A attributes */ + UCHAR ucWindowBAttributes; /* Window B attributes */ + WORD wWindowGranularity; /* Window granularity in k */ + WORD wWindowSize; /* Window size in k */ + WORD wWindowASegment; /* Window A segment */ + WORD wWindowBSegment; /* Window B segment */ + DWORD pWindowSchemeFunction; /* Pointer to window function */ + WORD wBytesPerScanLine; /* Bytes per scanline */ + WORD wXResolution; /* Horizontal resolution */ + WORD wYResolution; /* Vertical resolution */ + UCHAR ucXCharSize; /* Character cell width */ + UCHAR ucYCharSize; /* Character cell height */ + UCHAR ucNumberOfPlanes; /* Number of memory planes */ + UCHAR ucBitsPerPixel; /* Bits per pixel */ + UCHAR ucNumberOfBanks; /* Number of CGA style banks */ + UCHAR ucMemoryModel; /* Memory model type */ + UCHAR ucBankSize; /* Size of CGA style banks */ + UCHAR ucNumberOfImagePages; /* Number of images pages */ + UCHAR ucReserved1; /* Reserved */ + UCHAR ucRedMaskSize; /* Size of direct color red mask */ + UCHAR ucRedFieldPosition; /* Bit posn of lsb of red mask */ + UCHAR ucGreenMaskSize; /* Size of direct color green mask */ + UCHAR ucGreenFieldPosition; /* Bit posn of lsb of green mask */ + UCHAR ucBlueMaskSize; /* Size of direct color blue mask */ + UCHAR ucBlueFieldPosition; /* Bit posn of lsb of blue mask */ + UCHAR ucRsvdMaskSize; /* Size of direct color res mask */ + UCHAR ucRsvdFieldPosition; /* Bit posn of lsb of res mask */ + UCHAR ucDirectColorModeInfo; /* Direct color mode attributes */ + /* VESA 2.0 variables */ + DWORD dwPhysBasePtr; /* physical address for flat frame buffer */ + UCHAR ucReserved2[212]; /* Pad to 256 byte block size */ +} VESA_MODE_INFO; + +#pragma pack() diff --git a/DOS/LOADCEPC/video.obj b/DOS/LOADCEPC/video.obj new file mode 100644 index 0000000000000000000000000000000000000000..4cfc8909f66990f23f2dd28152ff63fc73cc7e3c GIT binary patch literal 7831 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 literal 0 HcmV?d00001 diff --git a/DOS/LOADCEPC/wdm.h b/DOS/LOADCEPC/wdm.h new file mode 100644 index 0000000..3cacd40 --- /dev/null +++ b/DOS/LOADCEPC/wdm.h @@ -0,0 +1,19 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// +// Use of this sample source code is subject to the terms of the Microsoft +// license agreement under which you licensed this sample source code. If +// you did not accept the terms of the license agreement, you are not +// authorized to use this sample source code. For the terms of the license, +// please see the license agreement between you and Microsoft or, if applicable, +// see the LICENSE.RTF on your install media or the root of your tools installation. +// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +// +int __cdecl _inp(unsigned); +int __cdecl _outp(unsigned, int); + +#pragma intrinsic(_inp, _outp) + +#define READ_PORT_UCHAR(a) _inp((unsigned)a) +#define WRITE_PORT_UCHAR(a, b) _outp((unsigned)a, (int)b) diff --git a/DOS/LOADCEPC/windows.h b/DOS/LOADCEPC/windows.h new file mode 100644 index 0000000..b721cce --- /dev/null +++ b/DOS/LOADCEPC/windows.h @@ -0,0 +1,42 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// +// Use of this sample source code is subject to the terms of the Microsoft +// license agreement under which you licensed this sample source code. If +// you did not accept the terms of the license agreement, you are not +// authorized to use this sample source code. For the terms of the license, +// please see the license agreement between you and Microsoft or, if applicable, +// see the LICENSE.RTF on your install media or the root of your tools installation. +// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +// +#include +#include + +typedef struct _CRITICAL_SECTION +{ + int iDummy; +} CRITICAL_SECTION, *LPCRITICAL_SECTION; + +typedef unsigned long DWORD, *LPDWORD; +typedef unsigned long BOOL; +typedef char CHAR; +typedef unsigned char BYTE, *LPBYTE, UCHAR, *PUCHAR; +typedef unsigned short USHORT, *PUSHORT; + +#define FALSE 0 +#define TRUE 1 + +#define TEXT +#define VOID void +#define WCHAR char +#define TCHAR char +#define PTCHAR char * + +#define strlenW strlen + +#define OutputDebugString printf +#define NKDbgPrintfW printf + +#define EnterCriticalSection(a) +#define LeaveCriticalSection(a) diff --git a/DOS/LOADCEPC/xmsapi.c b/DOS/LOADCEPC/xmsapi.c new file mode 100644 index 0000000..0b47ee3 --- /dev/null +++ b/DOS/LOADCEPC/xmsapi.c @@ -0,0 +1,419 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// +// Use of this sample source code is subject to the terms of the Microsoft +// license agreement under which you licensed this sample source code. If +// you did not accept the terms of the license agreement, you are not +// authorized to use this sample source code. For the terms of the license, +// please see the license agreement between you and Microsoft or, if applicable, +// see the LICENSE.RTF on your install media or the root of your tools installation. +// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +// +/*++ +THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +PARTICULAR PURPOSE. + +Module Name: + +Abstract: + +Functions: + + +Notes: + +--*/ + +#include "xmsapi.h" + +#pragma warning(disable:4704) + +#pragma pack(1) + +typedef struct _EXTENDED_MEMORY_MOVE +{ + unsigned long ulLength; + unsigned int uiSourceHandle; + unsigned long ulSourceOffset; + unsigned int uiDestinationHandle; + unsigned long ulDestinationOffset; + +} EXTENDED_MEMORY_MOVE, *PEXTENDED_MEMORY_MOVE; + +#pragma pack() + +int (far * XMSControl)() = 0; + +struct +{ + int iErrorCode; + char * pszErrorString; +} +XmsErrorMessages[] = +{ + { XMS_SUCCESS, "Success" }, + + { XMS_E_NOT_IMPLEMENTED, "Not implemented" }, + { XMS_E_VDISK_DETECTED, "VDISK detected" }, + { XMS_E_A20_ERROR, "A20 error" }, + + { XMS_W_NO_HMA, "No HMA" }, + { XMS_W_HMA_IN_USE, "HMA in use" }, + { XMS_W_HMA_DENIED, "HMA denied" }, + { XMS_W_HMA_NOT_ALLOCATED, "HMA not allocated" }, + { XMS_W_A20_STILL_ENABLED, "A20 still enabled" }, + + { XMS_S_NO_FREE_EXTENDED_MEMORY, "No free extended memory" }, + { XMS_S_NO_FREE_HANDLES, "No free handles" }, + { XMS_S_INVALID_HANDLE, "Invalid handle" }, + { XMS_S_INVALID_SOURCE_HANDLE, "Invalid source handle" }, + { XMS_S_INVALID_SOURCE_OFFSET, "Invalid source offset" }, + { XMS_S_INVALID_DESTINATION_HANDLE, "Invalid destination handle" }, + { XMS_S_INVALID_DESTINATION_OFFSET, "Invalid destination offset" }, + { XMS_S_INVALID_LENGTH, "Invalid length" }, + { XMS_S_INVALID_OVERLAP, "Invalid overlap" }, + { XMS_S_PARITY_ERROR, "Parity error" }, + { XMS_S_BLOCK_LOCKED, "Block locked" }, + { XMS_S_HANDLE_LOCKED, "Handle locked" }, + { XMS_S_LOCK_COUNT_OVERFLOW, "Lock count overflow" }, + { XMS_S_LOCK_FAILED, "Lock failed" }, + + { XMS_I_SMALLER_UMB_AVAILABLE, "Smaller UMB available" }, + { XMS_I_NO_UMBS_AVAILABLE, "No UMBs available" }, + { XMS_I_INVALID_UMB_SEGMENT, "Invalid UMB segment" } +}; + +#define N_XMS_ERROR_MESSAGES (sizeof(XmsErrorMessages) / sizeof(XmsErrorMessages[0])) + +int +XmsIsInstalled() +{ + int bInstalled = 0; + + if (XMSControl != 0) + { + return 1; + } + + _asm + { + mov ax,4300h ; Check if XMS is present) + int 2Fh + xor ah,ah + cmp al,80h + jne done ; Nope - no point in continuing + + mov ax,4310h ; Get XMS entry point + int 2Fh + mov WORD PTR [XMSControl], bx ; Save entry point + mov WORD PTR [XMSControl + 2], es + + inc bInstalled ; Indicate installed + } + +done: + return bInstalled; +} + +int +XmsLocalEnableA20() +{ + int xmsError = XMS_SUCCESS; + + if (!XmsIsInstalled()) + { + return XMS_E_NOT_IMPLEMENTED; + } + + _asm + { + mov ah, 05h + call [XMSControl] + clc + rcr al, 1 + jc done + + xor bh, bh + mov xmsError, bx + } + +done: + return xmsError; +} + +int +XmsLocalDisableA20() +{ + int xmsError = XMS_SUCCESS; + + if (!XmsIsInstalled()) + { + return XMS_E_NOT_IMPLEMENTED; + } + + _asm + { + mov ah, 06h + call [XMSControl] + clc + rcr al, 1 + jc done + + xor bh, bh + mov xmsError, bx + } + +done: + return xmsError; +} + +int +XmsQueryA20( + int *pbEnabled) +{ + int xmsError = XMS_SUCCESS; + + if (!XmsIsInstalled()) + { + return XMS_E_NOT_IMPLEMENTED; + } + + _asm + { + mov ah, 07h + call [XMSControl] + + push si + mov si, pbEnabled + mov WORD PTR [si], ax + pop si + + xor bh, bh + mov xmsError, bx + } + + return xmsError; +} + +int +XmsQueryFreeExtendedMemory( + unsigned int *puiLargestFreeBlock, + unsigned int *puiTotalFree) +{ + int xmsError = XMS_SUCCESS; + + if (!XmsIsInstalled()) + { + return XMS_E_NOT_IMPLEMENTED; + } + + _asm + { + mov ah, 08h + call [XMSControl] + + push si + mov si, puiLargestFreeBlock + mov WORD PTR [si], ax + + mov si, puiTotalFree + mov WORD PTR [si], dx + pop si + + xor bh, bh + mov xmsError, bx + } + + return xmsError; +} + +int +XmsAllocateExtendedMemory( + unsigned int uiBlockSizeK, + unsigned int * puiBlockHandle) +{ + int xmsError = XMS_SUCCESS; + + if (!XmsIsInstalled()) + { + return XMS_E_NOT_IMPLEMENTED; + } + + _asm + { + mov ah, 09h + mov dx, uiBlockSizeK + call [XMSControl] + + push si + mov si, puiBlockHandle + mov WORD PTR [si], dx + pop si + + clc + rcr al, 1 + jc done + + xor bh, bh + mov xmsError, bx + } + +done: + return xmsError; +} + +int +XmsFreeExtendedMemory( + unsigned int uiBlockHandle) +{ + int xmsError = XMS_SUCCESS; + + if (!XmsIsInstalled()) + { + return XMS_E_NOT_IMPLEMENTED; + } + + _asm + { + mov ah, 0Ah + mov dx, uiBlockHandle + call [XMSControl] + + clc + rcr al, 1 + jc done + + xor bh, bh + mov xmsError, bx + } + +done: + return xmsError; +} + +int +XmsMoveExtendedMemory( + unsigned int uiSourceHandle, + unsigned long ulSourceOffset, + unsigned int uiDestinationHandle, + unsigned long ulDestinationOffset, + unsigned long ulLength) +{ + EXTENDED_MEMORY_MOVE moveInfo; + + int xmsError = XMS_SUCCESS; + + if (!XmsIsInstalled()) + { + return XMS_E_NOT_IMPLEMENTED; + } + + moveInfo.uiSourceHandle = uiSourceHandle; + moveInfo.ulSourceOffset = ulSourceOffset; + moveInfo.uiDestinationHandle = uiDestinationHandle; + moveInfo.ulDestinationOffset = ulDestinationOffset; + moveInfo.ulLength = ulLength; + + _asm + { + mov ah, 0Bh + + push si + lea si, moveInfo + call [XMSControl] + pop si + + clc + rcr al, 1 + jc done + + xor bh, bh + mov xmsError, bx + } + +done: + return xmsError; +} + +int +XmsLockExtendedMemory( + unsigned int uiBlockHandle, + unsigned long * pulLinearAddress) +{ + int xmsError = XMS_SUCCESS; + + if (!XmsIsInstalled()) + { + return XMS_E_NOT_IMPLEMENTED; + } + + _asm + { + mov ah, 0Ch + mov dx, uiBlockHandle + call [XMSControl] + + push si + mov si, pulLinearAddress + mov WORD PTR [si], bx + mov WORD PTR [si + 2], dx + pop si + + clc + rcr al, 1 + jc done + + xor bh, bh + mov xmsError, bx + } + +done: + return xmsError; +} + +int +XmsUnlockExtendedMemory( + unsigned int uiBlockHandle) +{ + int xmsError = XMS_SUCCESS; + + if (!XmsIsInstalled()) + { + return XMS_E_NOT_IMPLEMENTED; + } + + _asm + { + mov ah, 0Dh + mov dx, uiBlockHandle + call [XMSControl] + + clc + rcr al, 1 + jc done + + xor bh, bh + mov xmsError, bx + } + +done: + return xmsError; +} + +char *XmsErrorString(int xmsError) +{ + int i; + + for (i = 0; i < N_XMS_ERROR_MESSAGES; i++) + { + if (XmsErrorMessages[i].iErrorCode == xmsError) + { + return XmsErrorMessages[i].pszErrorString; + } + } + + return "Unknown error"; +} diff --git a/DOS/LOADCEPC/xmsapi.cod b/DOS/LOADCEPC/xmsapi.cod new file mode 100644 index 0000000..8b04407 --- /dev/null +++ b/DOS/LOADCEPC/xmsapi.cod @@ -0,0 +1,1083 @@ +; Static Name Aliases +; + TITLE xmsapi.c + .286p + .287 +INCLUDELIB SLIBCE +INCLUDELIB OLDNAMES.LIB +_TEXT SEGMENT WORD PUBLIC 'CODE' +_TEXT ENDS +_DATA SEGMENT WORD PUBLIC 'DATA' +_DATA ENDS +CONST SEGMENT WORD PUBLIC 'CONST' +CONST ENDS +_BSS SEGMENT WORD PUBLIC 'BSS' +_BSS ENDS +$$SYMBOLS SEGMENT BYTE PUBLIC 'DEBSYM' +$$SYMBOLS ENDS +$$TYPES SEGMENT BYTE PUBLIC 'DEBTYP' +$$TYPES ENDS +DGROUP GROUP CONST, _BSS, _DATA + ASSUME DS: DGROUP, SS: DGROUP +PUBLIC _XMSControl +PUBLIC _XmsErrorMessages +_DATA SEGMENT +_XMSControl DD 00H +$SG215 DB 'Success', 00H +$SG216 DB 'Not implemented', 00H +$SG217 DB 'VDISK detected', 00H +$SG218 DB 'A20 error', 00H +$SG219 DB 'No HMA', 00H +$SG220 DB 'HMA in use', 00H +$SG221 DB 'HMA denied', 00H +$SG222 DB 'HMA not allocated', 00H +$SG223 DB 'A20 still enabled', 00H +$SG224 DB 'No free extended memory', 00H +$SG225 DB 'No free handles', 00H +$SG226 DB 'Invalid handle', 00H +$SG227 DB 'Invalid source handle', 00H +$SG228 DB 'Invalid source offset', 00H +$SG229 DB 'Invalid destination handle', 00H +$SG230 DB 'Invalid destination offset', 00H +$SG231 DB 'Invalid length', 00H +$SG232 DB 'Invalid overlap', 00H +$SG233 DB 'Parity error', 00H +$SG234 DB 'Block locked', 00H +$SG235 DB 'Handle locked', 00H +$SG236 DB 'Lock count overflow', 00H +$SG237 DB 'Lock failed', 00H +$SG238 DB 'Smaller UMB available', 00H +$SG239 DB 'No UMBs available', 00H +$SG240 DB 'Invalid UMB segment', 00H +_XmsErrorMessages DW 00H + DW DGROUP:$SG215 + DW 080H + DW DGROUP:$SG216 + DW 081H + DW DGROUP:$SG217 + DW 082H + DW DGROUP:$SG218 + DW 090H + DW DGROUP:$SG219 + DW 091H + DW DGROUP:$SG220 + DW 092H + DW DGROUP:$SG221 + DW 093H + DW DGROUP:$SG222 + DW 094H + DW DGROUP:$SG223 + DW 0a0H + DW DGROUP:$SG224 + DW 0a1H + DW DGROUP:$SG225 + DW 0a2H + DW DGROUP:$SG226 + DW 0a3H + DW DGROUP:$SG227 + DW 0a4H + DW DGROUP:$SG228 + DW 0a5H + DW DGROUP:$SG229 + DW 0a6H + DW DGROUP:$SG230 + DW 0a7H + DW DGROUP:$SG231 + DW 0a8H + DW DGROUP:$SG232 + DW 0a9H + DW DGROUP:$SG233 + DW 0aaH + DW DGROUP:$SG234 + DW 0abH + DW DGROUP:$SG235 + DW 0acH + DW DGROUP:$SG236 + DW 0adH + DW DGROUP:$SG237 + DW 0b0H + DW DGROUP:$SG238 + DW 0b1H + DW DGROUP:$SG239 + DW 0b2H + DW DGROUP:$SG240 +$SG316 DB 'Unknown error', 00H +_DATA ENDS +_TEXT SEGMENT + ASSUME CS: _TEXT + PUBLIC _XmsIsInstalled +_XmsIsInstalled PROC NEAR +;|*** // +;|*** // Copyright (c) Microsoft Corporation. All rights reserved. +;|*** // +;|*** // +;|*** // Use of this sample source code is subject to the terms of the Microsoft +;|*** // license agreement under which you licensed this sample source code. If +;|*** // you did not accept the terms of the license agreement, you are not +;|*** // authorized to use this sample source code. For the terms of the license, +;|*** // please see the license agreement between you and Microsoft or, if applicable, +;|*** // see the LICENSE.RTF on your install media or the root of your tools installation. +;|*** // THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +;|*** // +;|*** /*++ +;|*** THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +;|*** ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +;|*** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +;|*** PARTICULAR PURPOSE. +;|*** +;|*** Module Name: +;|*** +;|*** Abstract: +;|*** +;|*** Functions: +;|*** +;|*** +;|*** Notes: +;|*** +;|*** --*/ +;|*** +;|*** #include "xmsapi.h" +;|*** +;|*** #pragma warning(disable:4704) +;|*** +;|*** #pragma pack(1) +;|*** +;|*** typedef struct _EXTENDED_MEMORY_MOVE +;|*** { +;|*** unsigned long ulLength; +;|*** unsigned int uiSourceHandle; +;|*** unsigned long ulSourceOffset; +;|*** unsigned int uiDestinationHandle; +;|*** unsigned long ulDestinationOffset; +;|*** +;|*** } EXTENDED_MEMORY_MOVE, *PEXTENDED_MEMORY_MOVE; +;|*** +;|*** #pragma pack() +;|*** +;|*** int (far * XMSControl)() = 0; +;|*** +;|*** struct +;|*** { +;|*** int iErrorCode; +;|*** char * pszErrorString; +;|*** } +;|*** XmsErrorMessages[] = +;|*** { +;|*** { XMS_SUCCESS, "Success" }, +;|*** +;|*** { XMS_E_NOT_IMPLEMENTED, "Not implemented" }, +;|*** { XMS_E_VDISK_DETECTED, "VDISK detected" }, +;|*** { XMS_E_A20_ERROR, "A20 error" }, +;|*** +;|*** { XMS_W_NO_HMA, "No HMA" }, +;|*** { XMS_W_HMA_IN_USE, "HMA in use" }, +;|*** { XMS_W_HMA_DENIED, "HMA denied" }, +;|*** { XMS_W_HMA_NOT_ALLOCATED, "HMA not allocated" }, +;|*** { XMS_W_A20_STILL_ENABLED, "A20 still enabled" }, +;|*** +;|*** { XMS_S_NO_FREE_EXTENDED_MEMORY, "No free extended memory" }, +;|*** { XMS_S_NO_FREE_HANDLES, "No free handles" }, +;|*** { XMS_S_INVALID_HANDLE, "Invalid handle" }, +;|*** { XMS_S_INVALID_SOURCE_HANDLE, "Invalid source handle" }, +;|*** { XMS_S_INVALID_SOURCE_OFFSET, "Invalid source offset" }, +;|*** { XMS_S_INVALID_DESTINATION_HANDLE, "Invalid destination handle" }, +;|*** { XMS_S_INVALID_DESTINATION_OFFSET, "Invalid destination offset" }, +;|*** { XMS_S_INVALID_LENGTH, "Invalid length" }, +;|*** { XMS_S_INVALID_OVERLAP, "Invalid overlap" }, +;|*** { XMS_S_PARITY_ERROR, "Parity error" }, +;|*** { XMS_S_BLOCK_LOCKED, "Block locked" }, +;|*** { XMS_S_HANDLE_LOCKED, "Handle locked" }, +;|*** { XMS_S_LOCK_COUNT_OVERFLOW, "Lock count overflow" }, +;|*** { XMS_S_LOCK_FAILED, "Lock failed" }, +;|*** +;|*** { XMS_I_SMALLER_UMB_AVAILABLE, "Smaller UMB available" }, +;|*** { XMS_I_NO_UMBS_AVAILABLE, "No UMBs available" }, +;|*** { XMS_I_INVALID_UMB_SEGMENT, "Invalid UMB segment" } +;|*** }; +;|*** +;|*** #define N_XMS_ERROR_MESSAGES (sizeof(XmsErrorMessages) / sizeof(XmsErrorMessages[0])) +;|*** +;|*** int +;|*** XmsIsInstalled() +;|*** { +; Line 93 + *** 000000 c8 02 00 00 enter 2,0 +; bInstalled = -2 +;|*** int bInstalled = 0; +; Line 94 + *** 000004 c7 46 fe 00 00 mov WORD PTR [bp-2],0 ;bInstalled +;|*** +;|*** if (XMSControl != 0) +; Line 96 + *** 000009 a1 02 00 mov ax,WORD PTR _XMSControl+2 + *** 00000c 0b 06 00 00 or ax,WORD PTR _XMSControl + *** 000010 74 06 je $I243 +;|*** { +;|*** return 1; +; Line 98 + *** 000012 b8 01 00 mov ax,1 + *** 000015 c9 leave + *** 000016 c3 ret + *** 000017 90 nop +;|*** } +;|*** +;|*** _asm +; Line 101 + $I243: +;|*** { +;|*** mov ax,4300h ; Check if XMS is present) +; Line 103 + *** 000018 b8 00 43 mov ax,17152 ;4300H +;|*** int 2Fh +; Line 104 + *** 00001b cd 2f int 47 ;002fH +;|*** xor ah,ah +; Line 105 + *** 00001d 32 e4 xor ah,ah +;|*** cmp al,80h +; Line 106 + *** 00001f 3c 80 cmp al,128 ;0080H +;|*** jne done ; Nope - no point in continuing +; Line 107 + *** 000021 75 10 jne $done244 +;|*** +;|*** mov ax,4310h ; Get XMS entry point +; Line 109 + *** 000023 b8 10 43 mov ax,17168 ;4310H +;|*** int 2Fh +; Line 110 + *** 000026 cd 2f int 47 ;002fH +;|*** mov WORD PTR [XMSControl], bx ; Save entry point +; Line 111 + *** 000028 89 1e 00 00 mov WORD PTR _XMSControl,bx +;|*** mov WORD PTR [XMSControl + 2], es +; Line 112 + *** 00002c 8c 06 02 00 mov WORD PTR _XMSControl+2,es +;|*** +;|*** inc bInstalled ; Indicate installed +; Line 114 + *** 000030 ff 46 fe inc WORD PTR [bp-2] ;bInstalled +;|*** } +; Line 115 +;|*** +;|*** done: +; Line 117 + $done244: +;|*** return bInstalled; +; Line 118 + *** 000033 8b 46 fe mov ax,WORD PTR [bp-2] ;bInstalled +;|*** } +; Line 119 + *** 000036 c9 leave + *** 000037 c3 ret + +_XmsIsInstalled ENDP + PUBLIC _XmsLocalEnableA20 +_XmsLocalEnableA20 PROC NEAR +;|*** +;|*** int +;|*** XmsLocalEnableA20() +;|*** { +; Line 123 + *** 000038 c8 02 00 00 enter 2,0 +; xmsError = -2 +;|*** int xmsError = XMS_SUCCESS; +; Line 124 + *** 00003c c7 46 fe 00 00 mov WORD PTR [bp-2],0 ;xmsError +;|*** +;|*** if (!XmsIsInstalled()) +; Line 126 + *** 000041 e8 bc ff call _XmsIsInstalled + *** 000044 0b c0 or ax,ax + *** 000046 75 06 jne $I247 +;|*** { +;|*** return XMS_E_NOT_IMPLEMENTED; +; Line 128 + *** 000048 b8 80 00 mov ax,128 ;0080H + *** 00004b c9 leave + *** 00004c c3 ret + *** 00004d 90 nop +;|*** } +;|*** +;|*** _asm +; Line 131 + $I247: +;|*** { +;|*** mov ah, 05h +; Line 133 + *** 00004e b4 05 mov ah,5 +;|*** call [XMSControl] +; Line 134 + *** 000050 ff 1e 00 00 call DWORD PTR _XMSControl +;|*** clc +; Line 135 + *** 000054 f8 clc +;|*** rcr al, 1 +; Line 136 + *** 000055 d0 d8 rcr al,1 +;|*** jc done +; Line 137 + *** 000057 72 05 jb $done248 +;|*** +;|*** xor bh, bh +; Line 139 + *** 000059 32 ff xor bh,bh +;|*** mov xmsError, bx +; Line 140 + *** 00005b 89 5e fe mov WORD PTR [bp-2],bx ;xmsError +;|*** } +; Line 141 +;|*** +;|*** done: +; Line 143 + $done248: +;|*** return xmsError; +; Line 144 + *** 00005e 8b 46 fe mov ax,WORD PTR [bp-2] ;xmsError +;|*** } +; Line 145 + *** 000061 c9 leave + *** 000062 c3 ret + *** 000063 90 nop + +_XmsLocalEnableA20 ENDP + PUBLIC _XmsLocalDisableA20 +_XmsLocalDisableA20 PROC NEAR +;|*** +;|*** int +;|*** XmsLocalDisableA20() +;|*** { +; Line 149 + *** 000064 c8 02 00 00 enter 2,0 +; xmsError = -2 +;|*** int xmsError = XMS_SUCCESS; +; Line 150 + *** 000068 c7 46 fe 00 00 mov WORD PTR [bp-2],0 ;xmsError +;|*** +;|*** if (!XmsIsInstalled()) +; Line 152 + *** 00006d e8 90 ff call _XmsIsInstalled + *** 000070 0b c0 or ax,ax + *** 000072 75 06 jne $I251 +;|*** { +;|*** return XMS_E_NOT_IMPLEMENTED; +; Line 154 + *** 000074 b8 80 00 mov ax,128 ;0080H + *** 000077 c9 leave + *** 000078 c3 ret + *** 000079 90 nop +;|*** } +;|*** +;|*** _asm +; Line 157 + $I251: +;|*** { +;|*** mov ah, 06h +; Line 159 + *** 00007a b4 06 mov ah,6 +;|*** call [XMSControl] +; Line 160 + *** 00007c ff 1e 00 00 call DWORD PTR _XMSControl +;|*** clc +; Line 161 + *** 000080 f8 clc +;|*** rcr al, 1 +; Line 162 + *** 000081 d0 d8 rcr al,1 +;|*** jc done +; Line 163 + *** 000083 72 05 jb $done252 +;|*** +;|*** xor bh, bh +; Line 165 + *** 000085 32 ff xor bh,bh +;|*** mov xmsError, bx +; Line 166 + *** 000087 89 5e fe mov WORD PTR [bp-2],bx ;xmsError +;|*** } +; Line 167 +;|*** +;|*** done: +; Line 169 + $done252: +;|*** return xmsError; +; Line 170 + *** 00008a 8b 46 fe mov ax,WORD PTR [bp-2] ;xmsError +;|*** } +; Line 171 + *** 00008d c9 leave + *** 00008e c3 ret + *** 00008f 90 nop + +_XmsLocalDisableA20 ENDP + PUBLIC _XmsQueryA20 +_XmsQueryA20 PROC NEAR +;|*** +;|*** int +;|*** XmsQueryA20( +;|*** int *pbEnabled) +;|*** { +; Line 176 + *** 000090 c8 02 00 00 enter 2,0 + *** 000094 56 push si +; xmsError = -2 +; pbEnabled = 4 +;|*** int xmsError = XMS_SUCCESS; +; Line 177 + *** 000095 c7 46 fe 00 00 mov WORD PTR [bp-2],0 ;xmsError +;|*** +;|*** if (!XmsIsInstalled()) +; Line 179 + *** 00009a e8 63 ff call _XmsIsInstalled + *** 00009d 0b c0 or ax,ax + *** 00009f 75 07 jne $I257 +;|*** { +;|*** return XMS_E_NOT_IMPLEMENTED; +; Line 181 + *** 0000a1 b8 80 00 mov ax,128 ;0080H + *** 0000a4 5e pop si + *** 0000a5 c9 leave + *** 0000a6 c3 ret + *** 0000a7 90 nop +;|*** } +;|*** +;|*** _asm +; Line 184 + $I257: +;|*** { +;|*** mov ah, 07h +; Line 186 + *** 0000a8 b4 07 mov ah,7 +;|*** call [XMSControl] +; Line 187 + *** 0000aa ff 1e 00 00 call DWORD PTR _XMSControl +;|*** +;|*** push si +; Line 189 + *** 0000ae 56 push si +;|*** mov si, pbEnabled +; Line 190 + *** 0000af 8b 76 04 mov si,WORD PTR [bp+4] ;pbEnabled +;|*** mov WORD PTR [si], ax +; Line 191 + *** 0000b2 89 04 mov WORD PTR [si],ax +;|*** pop si +; Line 192 + *** 0000b4 5e pop si +;|*** +;|*** xor bh, bh +; Line 194 + *** 0000b5 32 ff xor bh,bh +;|*** mov xmsError, bx +; Line 195 + *** 0000b7 89 5e fe mov WORD PTR [bp-2],bx ;xmsError +;|*** } +; Line 196 +;|*** +;|*** return xmsError; +; Line 198 + *** 0000ba 8b 46 fe mov ax,WORD PTR [bp-2] ;xmsError +;|*** } +; Line 199 + *** 0000bd 5e pop si + *** 0000be c9 leave + *** 0000bf c3 ret + +_XmsQueryA20 ENDP + PUBLIC _XmsQueryFreeExtendedMemory +_XmsQueryFreeExtendedMemory PROC NEAR +;|*** +;|*** int +;|*** XmsQueryFreeExtendedMemory( +;|*** unsigned int *puiLargestFreeBlock, +;|*** unsigned int *puiTotalFree) +;|*** { +; Line 205 + *** 0000c0 c8 02 00 00 enter 2,0 + *** 0000c4 56 push si +; xmsError = -2 +; puiTotalFree = 6 +; puiLargestFreeBlock = 4 +;|*** int xmsError = XMS_SUCCESS; +; Line 206 + *** 0000c5 c7 46 fe 00 00 mov WORD PTR [bp-2],0 ;xmsError +;|*** +;|*** if (!XmsIsInstalled()) +; Line 208 + *** 0000ca e8 33 ff call _XmsIsInstalled + *** 0000cd 0b c0 or ax,ax + *** 0000cf 75 07 jne $I264 +;|*** { +;|*** return XMS_E_NOT_IMPLEMENTED; +; Line 210 + *** 0000d1 b8 80 00 mov ax,128 ;0080H + *** 0000d4 5e pop si + *** 0000d5 c9 leave + *** 0000d6 c3 ret + *** 0000d7 90 nop +;|*** } +;|*** +;|*** _asm +; Line 213 + $I264: +;|*** { +;|*** mov ah, 08h +; Line 215 + *** 0000d8 b4 08 mov ah,8 +;|*** call [XMSControl] +; Line 216 + *** 0000da ff 1e 00 00 call DWORD PTR _XMSControl +;|*** +;|*** push si +; Line 218 + *** 0000de 56 push si +;|*** mov si, puiLargestFreeBlock +; Line 219 + *** 0000df 8b 76 04 mov si,WORD PTR [bp+4] ;puiLargestFreeBlock +;|*** mov WORD PTR [si], ax +; Line 220 + *** 0000e2 89 04 mov WORD PTR [si],ax +;|*** +;|*** mov si, puiTotalFree +; Line 222 + *** 0000e4 8b 76 06 mov si,WORD PTR [bp+6] ;puiTotalFree +;|*** mov WORD PTR [si], dx +; Line 223 + *** 0000e7 89 14 mov WORD PTR [si],dx +;|*** pop si +; Line 224 + *** 0000e9 5e pop si +;|*** +;|*** xor bh, bh +; Line 226 + *** 0000ea 32 ff xor bh,bh +;|*** mov xmsError, bx +; Line 227 + *** 0000ec 89 5e fe mov WORD PTR [bp-2],bx ;xmsError +;|*** } +; Line 228 +;|*** +;|*** return xmsError; +; Line 230 + *** 0000ef 8b 46 fe mov ax,WORD PTR [bp-2] ;xmsError +;|*** } +; Line 231 + *** 0000f2 5e pop si + *** 0000f3 c9 leave + *** 0000f4 c3 ret + *** 0000f5 90 nop + +_XmsQueryFreeExtendedMemory ENDP + PUBLIC _XmsAllocateExtendedMemory +_XmsAllocateExtendedMemory PROC NEAR +;|*** +;|*** int +;|*** XmsAllocateExtendedMemory( +;|*** unsigned int uiBlockSizeK, +;|*** unsigned int * puiBlockHandle) +;|*** { +; Line 237 + *** 0000f6 c8 02 00 00 enter 2,0 + *** 0000fa 56 push si +; xmsError = -2 +; puiBlockHandle = 6 +; uiBlockSizeK = 4 +;|*** int xmsError = XMS_SUCCESS; +; Line 238 + *** 0000fb c7 46 fe 00 00 mov WORD PTR [bp-2],0 ;xmsError +;|*** +;|*** if (!XmsIsInstalled()) +; Line 240 + *** 000100 e8 fd fe call _XmsIsInstalled + *** 000103 0b c0 or ax,ax + *** 000105 75 07 jne $I271 +;|*** { +;|*** return XMS_E_NOT_IMPLEMENTED; +; Line 242 + *** 000107 b8 80 00 mov ax,128 ;0080H + *** 00010a 5e pop si + *** 00010b c9 leave + *** 00010c c3 ret + *** 00010d 90 nop +;|*** } +;|*** +;|*** _asm +; Line 245 + $I271: +;|*** { +;|*** mov ah, 09h +; Line 247 + *** 00010e b4 09 mov ah,9 +;|*** mov dx, uiBlockSizeK +; Line 248 + *** 000110 8b 56 04 mov dx,WORD PTR [bp+4] ;uiBlockSizeK +;|*** call [XMSControl] +; Line 249 + *** 000113 ff 1e 00 00 call DWORD PTR _XMSControl +;|*** +;|*** push si +; Line 251 + *** 000117 56 push si +;|*** mov si, puiBlockHandle +; Line 252 + *** 000118 8b 76 06 mov si,WORD PTR [bp+6] ;puiBlockHandle +;|*** mov WORD PTR [si], dx +; Line 253 + *** 00011b 89 14 mov WORD PTR [si],dx +;|*** pop si +; Line 254 + *** 00011d 5e pop si +;|*** +;|*** clc +; Line 256 + *** 00011e f8 clc +;|*** rcr al, 1 +; Line 257 + *** 00011f d0 d8 rcr al,1 +;|*** jc done +; Line 258 + *** 000121 72 05 jb $done272 +;|*** +;|*** xor bh, bh +; Line 260 + *** 000123 32 ff xor bh,bh +;|*** mov xmsError, bx +; Line 261 + *** 000125 89 5e fe mov WORD PTR [bp-2],bx ;xmsError +;|*** } +; Line 262 +;|*** +;|*** done: +; Line 264 + $done272: +;|*** return xmsError; +; Line 265 + *** 000128 8b 46 fe mov ax,WORD PTR [bp-2] ;xmsError +;|*** } +; Line 266 + *** 00012b 5e pop si + *** 00012c c9 leave + *** 00012d c3 ret + +_XmsAllocateExtendedMemory ENDP + PUBLIC _XmsFreeExtendedMemory +_XmsFreeExtendedMemory PROC NEAR +;|*** +;|*** int +;|*** XmsFreeExtendedMemory( +;|*** unsigned int uiBlockHandle) +;|*** { +; Line 271 + *** 00012e c8 02 00 00 enter 2,0 +; xmsError = -2 +; uiBlockHandle = 4 +;|*** int xmsError = XMS_SUCCESS; +; Line 272 + *** 000132 c7 46 fe 00 00 mov WORD PTR [bp-2],0 ;xmsError +;|*** +;|*** if (!XmsIsInstalled()) +; Line 274 + *** 000137 e8 c6 fe call _XmsIsInstalled + *** 00013a 0b c0 or ax,ax + *** 00013c 75 06 jne $I277 +;|*** { +;|*** return XMS_E_NOT_IMPLEMENTED; +; Line 276 + *** 00013e b8 80 00 mov ax,128 ;0080H + *** 000141 c9 leave + *** 000142 c3 ret + *** 000143 90 nop +;|*** } +;|*** +;|*** _asm +; Line 279 + $I277: +;|*** { +;|*** mov ah, 0Ah +; Line 281 + *** 000144 b4 0a mov ah,10 ;000aH +;|*** mov dx, uiBlockHandle +; Line 282 + *** 000146 8b 56 04 mov dx,WORD PTR [bp+4] ;uiBlockHandle +;|*** call [XMSControl] +; Line 283 + *** 000149 ff 1e 00 00 call DWORD PTR _XMSControl +;|*** +;|*** clc +; Line 285 + *** 00014d f8 clc +;|*** rcr al, 1 +; Line 286 + *** 00014e d0 d8 rcr al,1 +;|*** jc done +; Line 287 + *** 000150 72 05 jb $done278 +;|*** +;|*** xor bh, bh +; Line 289 + *** 000152 32 ff xor bh,bh +;|*** mov xmsError, bx +; Line 290 + *** 000154 89 5e fe mov WORD PTR [bp-2],bx ;xmsError +;|*** } +; Line 291 +;|*** +;|*** done: +; Line 293 + $done278: +;|*** return xmsError; +; Line 294 + *** 000157 8b 46 fe mov ax,WORD PTR [bp-2] ;xmsError +;|*** } +; Line 295 + *** 00015a c9 leave + *** 00015b c3 ret + +_XmsFreeExtendedMemory ENDP + PUBLIC _XmsMoveExtendedMemory +_XmsMoveExtendedMemory PROC NEAR +;|*** +;|*** int +;|*** XmsMoveExtendedMemory( +;|*** unsigned int uiSourceHandle, +;|*** unsigned long ulSourceOffset, +;|*** unsigned int uiDestinationHandle, +;|*** unsigned long ulDestinationOffset, +;|*** unsigned long ulLength) +;|*** { +; Line 304 + *** 00015c c8 12 00 00 enter 18,0 + *** 000160 56 push si +; moveInfo = -16 +; xmsError = -18 +; ulLength = 16 +; ulDestinationOffset = 12 +; uiDestinationHandle = 10 +; ulSourceOffset = 6 +; uiSourceHandle = 4 +;|*** EXTENDED_MEMORY_MOVE moveInfo; +;|*** +;|*** int xmsError = XMS_SUCCESS; +; Line 307 + *** 000161 c7 46 ee 00 00 mov WORD PTR [bp-18],0 ;xmsError +;|*** +;|*** if (!XmsIsInstalled()) +; Line 309 + *** 000166 e8 97 fe call _XmsIsInstalled + *** 000169 0b c0 or ax,ax + *** 00016b 75 07 jne $I292 +;|*** { +;|*** return XMS_E_NOT_IMPLEMENTED; +; Line 311 + *** 00016d b8 80 00 mov ax,128 ;0080H + *** 000170 5e pop si + *** 000171 c9 leave + *** 000172 c3 ret + *** 000173 90 nop +;|*** } +;|*** +;|*** moveInfo.uiSourceHandle = uiSourceHandle; +; Line 314 + $I292: + *** 000174 8b 46 04 mov ax,WORD PTR [bp+4] ;uiSourceHandle + *** 000177 89 46 f4 mov WORD PTR [bp-12],ax +;|*** moveInfo.ulSourceOffset = ulSourceOffset; +; Line 315 + *** 00017a 8b 46 06 mov ax,WORD PTR [bp+6] ;ulSourceOffset + *** 00017d 8b 56 08 mov dx,WORD PTR [bp+8] + *** 000180 89 46 f6 mov WORD PTR [bp-10],ax + *** 000183 89 56 f8 mov WORD PTR [bp-8],dx +;|*** moveInfo.uiDestinationHandle = uiDestinationHandle; +; Line 316 + *** 000186 8b 46 0a mov ax,WORD PTR [bp+10] ;uiDestinationHandle + *** 000189 89 46 fa mov WORD PTR [bp-6],ax +;|*** moveInfo.ulDestinationOffset = ulDestinationOffset; +; Line 317 + *** 00018c 8b 46 0c mov ax,WORD PTR [bp+12] ;ulDestinationOffset + *** 00018f 8b 56 0e mov dx,WORD PTR [bp+14] + *** 000192 89 46 fc mov WORD PTR [bp-4],ax + *** 000195 89 56 fe mov WORD PTR [bp-2],dx +;|*** moveInfo.ulLength = ulLength; +; Line 318 + *** 000198 8b 46 10 mov ax,WORD PTR [bp+16] ;ulLength + *** 00019b 8b 56 12 mov dx,WORD PTR [bp+18] + *** 00019e 89 46 f0 mov WORD PTR [bp-16],ax ;moveInfo + *** 0001a1 89 56 f2 mov WORD PTR [bp-14],dx +;|*** +;|*** _asm +;|*** { +;|*** mov ah, 0Bh +; Line 322 + *** 0001a4 b4 0b mov ah,11 ;000bH +;|*** +;|*** push si +; Line 324 + *** 0001a6 56 push si +;|*** lea si, moveInfo +; Line 325 + *** 0001a7 8d 76 f0 lea si,WORD PTR [bp-16] ;moveInfo +;|*** call [XMSControl] +; Line 326 + *** 0001aa ff 1e 00 00 call DWORD PTR _XMSControl +;|*** pop si +; Line 327 + *** 0001ae 5e pop si +;|*** +;|*** clc +; Line 329 + *** 0001af f8 clc +;|*** rcr al, 1 +; Line 330 + *** 0001b0 d0 d8 rcr al,1 +;|*** jc done +; Line 331 + *** 0001b2 72 05 jb $done293 +;|*** +;|*** xor bh, bh +; Line 333 + *** 0001b4 32 ff xor bh,bh +;|*** mov xmsError, bx +; Line 334 + *** 0001b6 89 5e ee mov WORD PTR [bp-18],bx ;xmsError +;|*** } +; Line 335 +;|*** +;|*** done: +; Line 337 + $done293: +;|*** return xmsError; +; Line 338 + *** 0001b9 8b 46 ee mov ax,WORD PTR [bp-18] ;xmsError +;|*** } +; Line 339 + *** 0001bc 5e pop si + *** 0001bd c9 leave + *** 0001be c3 ret + *** 0001bf 90 nop + +_XmsMoveExtendedMemory ENDP + PUBLIC _XmsLockExtendedMemory +_XmsLockExtendedMemory PROC NEAR +;|*** +;|*** int +;|*** XmsLockExtendedMemory( +;|*** unsigned int uiBlockHandle, +;|*** unsigned long * pulLinearAddress) +;|*** { +; Line 345 + *** 0001c0 c8 02 00 00 enter 2,0 + *** 0001c4 56 push si +; xmsError = -2 +; pulLinearAddress = 6 +; uiBlockHandle = 4 +;|*** int xmsError = XMS_SUCCESS; +; Line 346 + *** 0001c5 c7 46 fe 00 00 mov WORD PTR [bp-2],0 ;xmsError +;|*** +;|*** if (!XmsIsInstalled()) +; Line 348 + *** 0001ca e8 33 fe call _XmsIsInstalled + *** 0001cd 0b c0 or ax,ax + *** 0001cf 75 07 jne $I300 +;|*** { +;|*** return XMS_E_NOT_IMPLEMENTED; +; Line 350 + *** 0001d1 b8 80 00 mov ax,128 ;0080H + *** 0001d4 5e pop si + *** 0001d5 c9 leave + *** 0001d6 c3 ret + *** 0001d7 90 nop +;|*** } +;|*** +;|*** _asm +; Line 353 + $I300: +;|*** { +;|*** mov ah, 0Ch +; Line 355 + *** 0001d8 b4 0c mov ah,12 ;000cH +;|*** mov dx, uiBlockHandle +; Line 356 + *** 0001da 8b 56 04 mov dx,WORD PTR [bp+4] ;uiBlockHandle +;|*** call [XMSControl] +; Line 357 + *** 0001dd ff 1e 00 00 call DWORD PTR _XMSControl +;|*** +;|*** push si +; Line 359 + *** 0001e1 56 push si +;|*** mov si, pulLinearAddress +; Line 360 + *** 0001e2 8b 76 06 mov si,WORD PTR [bp+6] ;pulLinearAddress +;|*** mov WORD PTR [si], bx +; Line 361 + *** 0001e5 89 1c mov WORD PTR [si],bx +;|*** mov WORD PTR [si + 2], dx +; Line 362 + *** 0001e7 89 54 02 mov WORD PTR [si+2],dx +;|*** pop si +; Line 363 + *** 0001ea 5e pop si +;|*** +;|*** clc +; Line 365 + *** 0001eb f8 clc +;|*** rcr al, 1 +; Line 366 + *** 0001ec d0 d8 rcr al,1 +;|*** jc done +; Line 367 + *** 0001ee 72 05 jb $done301 +;|*** +;|*** xor bh, bh +; Line 369 + *** 0001f0 32 ff xor bh,bh +;|*** mov xmsError, bx +; Line 370 + *** 0001f2 89 5e fe mov WORD PTR [bp-2],bx ;xmsError +;|*** } +; Line 371 +;|*** +;|*** done: +; Line 373 + $done301: +;|*** return xmsError; +; Line 374 + *** 0001f5 8b 46 fe mov ax,WORD PTR [bp-2] ;xmsError +;|*** } +; Line 375 + *** 0001f8 5e pop si + *** 0001f9 c9 leave + *** 0001fa c3 ret + *** 0001fb 90 nop + +_XmsLockExtendedMemory ENDP + PUBLIC _XmsUnlockExtendedMemory +_XmsUnlockExtendedMemory PROC NEAR +;|*** +;|*** int +;|*** XmsUnlockExtendedMemory( +;|*** unsigned int uiBlockHandle) +;|*** { +; Line 380 + *** 0001fc c8 02 00 00 enter 2,0 +; xmsError = -2 +; uiBlockHandle = 4 +;|*** int xmsError = XMS_SUCCESS; +; Line 381 + *** 000200 c7 46 fe 00 00 mov WORD PTR [bp-2],0 ;xmsError +;|*** +;|*** if (!XmsIsInstalled()) +; Line 383 + *** 000205 e8 f8 fd call _XmsIsInstalled + *** 000208 0b c0 or ax,ax + *** 00020a 75 06 jne $I306 +;|*** { +;|*** return XMS_E_NOT_IMPLEMENTED; +; Line 385 + *** 00020c b8 80 00 mov ax,128 ;0080H + *** 00020f c9 leave + *** 000210 c3 ret + *** 000211 90 nop +;|*** } +;|*** +;|*** _asm +; Line 388 + $I306: +;|*** { +;|*** mov ah, 0Dh +; Line 390 + *** 000212 b4 0d mov ah,13 ;000dH +;|*** mov dx, uiBlockHandle +; Line 391 + *** 000214 8b 56 04 mov dx,WORD PTR [bp+4] ;uiBlockHandle +;|*** call [XMSControl] +; Line 392 + *** 000217 ff 1e 00 00 call DWORD PTR _XMSControl +;|*** +;|*** clc +; Line 394 + *** 00021b f8 clc +;|*** rcr al, 1 +; Line 395 + *** 00021c d0 d8 rcr al,1 +;|*** jc done +; Line 396 + *** 00021e 72 05 jb $done307 +;|*** +;|*** xor bh, bh +; Line 398 + *** 000220 32 ff xor bh,bh +;|*** mov xmsError, bx +; Line 399 + *** 000222 89 5e fe mov WORD PTR [bp-2],bx ;xmsError +;|*** } +; Line 400 +;|*** +;|*** done: +; Line 402 + $done307: +;|*** return xmsError; +; Line 403 + *** 000225 8b 46 fe mov ax,WORD PTR [bp-2] ;xmsError +;|*** } +; Line 404 + *** 000228 c9 leave + *** 000229 c3 ret + +_XmsUnlockExtendedMemory ENDP + PUBLIC _XmsErrorString +_XmsErrorString PROC NEAR +;|*** +;|*** char *XmsErrorString(int xmsError) +;|*** { +; Line 407 + *** 00022a 55 push bp + *** 00022b 8b ec mov bp,sp + *** 00022d 57 push di +; xmsError = 4 +; register di = i +;|*** int i; +;|*** +;|*** for (i = 0; i < N_XMS_ERROR_MESSAGES; i++) +; Line 410 + *** 00022e 33 ff xor di,di + *** 000230 bb 00 00 mov bx,OFFSET DGROUP:_XmsErrorMessages + *** 000233 8b 56 04 mov dx,WORD PTR [bp+4] ;xmsError + $F312: +;|*** { +;|*** if (XmsErrorMessages[i].iErrorCode == xmsError) +; Line 412 + *** 000236 39 17 cmp WORD PTR [bx],dx + *** 000238 74 0c je $L318 + *** 00023a 47 inc di + *** 00023b 83 c3 04 add bx,4 + *** 00023e 81 fb 68 00 cmp bx,OFFSET DGROUP:_XmsErrorMessages+104 + *** 000242 72 f2 jb $F312 + *** 000244 eb 0a jmp SHORT $FB314 + $L318: +;|*** { +;|*** return XmsErrorMessages[i].pszErrorString; +; Line 414 + *** 000246 c1 e7 02 shl di,2 + *** 000249 8b 85 02 00 mov ax,WORD PTR _XmsErrorMessages[di+2] + *** 00024d 5f pop di + *** 00024e c9 leave + *** 00024f c3 ret +;|*** } +;|*** } +; Line 416 + $FB314: +;|*** +;|*** return "Unknown error"; +; Line 418 + *** 000250 b8 00 00 mov ax,OFFSET DGROUP:$SG316 +;|*** } +; Line 419 + *** 000253 5f pop di + *** 000254 c9 leave + *** 000255 c3 ret + +_XmsErrorString ENDP +_TEXT ENDS +END diff --git a/DOS/LOADCEPC/xmsapi.h b/DOS/LOADCEPC/xmsapi.h new file mode 100644 index 0000000..ead9574 --- /dev/null +++ b/DOS/LOADCEPC/xmsapi.h @@ -0,0 +1,74 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// +// Use of this sample source code is subject to the terms of the Microsoft +// license agreement under which you licensed this sample source code. If +// you did not accept the terms of the license agreement, you are not +// authorized to use this sample source code. For the terms of the license, +// please see the license agreement between you and Microsoft or, if applicable, +// see the LICENSE.RTF on your install media or the root of your tools installation. +// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. +// +#define XMS_SUCCESS 0x00 + +#define XMS_E_NOT_IMPLEMENTED 0x80 +#define XMS_E_VDISK_DETECTED 0x81 +#define XMS_E_A20_ERROR 0x82 + +#define XMS_W_NO_HMA 0x90 +#define XMS_W_HMA_IN_USE 0x91 +#define XMS_W_HMA_DENIED 0x92 +#define XMS_W_HMA_NOT_ALLOCATED 0x93 +#define XMS_W_A20_STILL_ENABLED 0x94 + +#define XMS_S_NO_FREE_EXTENDED_MEMORY 0xA0 +#define XMS_S_NO_FREE_HANDLES 0xA1 +#define XMS_S_INVALID_HANDLE 0xA2 +#define XMS_S_INVALID_SOURCE_HANDLE 0xA3 +#define XMS_S_INVALID_SOURCE_OFFSET 0xA4 +#define XMS_S_INVALID_DESTINATION_HANDLE 0xA5 +#define XMS_S_INVALID_DESTINATION_OFFSET 0xA6 +#define XMS_S_INVALID_LENGTH 0xA7 +#define XMS_S_INVALID_OVERLAP 0xA8 +#define XMS_S_PARITY_ERROR 0xA9 +#define XMS_S_BLOCK_LOCKED 0xAA +#define XMS_S_HANDLE_LOCKED 0xAB +#define XMS_S_LOCK_COUNT_OVERFLOW 0xAC +#define XMS_S_LOCK_FAILED 0xAD + +#define XMS_I_SMALLER_UMB_AVAILABLE 0xB0 +#define XMS_I_NO_UMBS_AVAILABLE 0xB1 +#define XMS_I_INVALID_UMB_SEGMENT 0xB2 + +int XmsIsInstalled(); + +int XmsLocalEnableA20(); + +int XmsLocalDisableA20(); + +int XmsQueryA20( + int *pbEnabled); + +int XmsQueryFreeExtendedMemory( + unsigned int *puiLargestFreeBlock, unsigned int *puiTotalFree); + +int XmsAllocateExtendedMemory( + unsigned int uiBlockSizeK, unsigned int * puiBlockHandle); + +int XmsFreeExtendedMemory( + unsigned int uiBlockHandle); + +int XmsMoveExtendedMemory( + unsigned int uiSourceHandle, unsigned long ulSourceOffset, + unsigned int uiDestinationHandle, unsigned long ulDestinationOffset, + unsigned long ulLength); + +int XmsLockExtendedMemory( + unsigned int uiBlockHandle, + unsigned long * pulLinearAddress); + +int XmsUnlockExtendedMemory( + unsigned int uiBlockHandle); + +char *XmsErrorString(); diff --git a/DOS/LOADCEPC/xmsapi.obj b/DOS/LOADCEPC/xmsapi.obj new file mode 100644 index 0000000000000000000000000000000000000000..0aae4980f938a8ab718f4e69c03a78def03a78af GIT binary patch literal 5594 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 PQ>Rurc+K2Ga?$?-9s~tj literal 0 HcmV?d00001 diff --git a/WNT/menu2.exe/Release/DigHelp.obj b/WNT/menu2.exe/Release/DigHelp.obj index 14c2cb0ede23098cf0d076bd88a8a282fab6003a..220388e2c2ac0b103401a53e873fc0c293c1e3f6 100644 GIT binary patch delta 36 rcmZ4chI#E9W^M+C|Nj{od>GY)x+ZcYLga**D*63(f}s?3xU@ delta 36 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 PaV#U4elq*tKSKT&$+T<6 delta 3391 zcmZ8k3s6+&75@MKUUn}m3kxeRK^}`<*ySNEh_Hfyi}I937Yu0?Aw^MZcnLn@g9|E% zGl|iY#yFZz<7k}8qdvBEq%$~;(^#wNBTdIlJ8e^^qivHm6<<}ENYAWJ9t;R{&&g2*yJQEhSkb{)*`UwGFY<_`k0i#O z5^`9y_tvp6NiErx4ebJ(t8HR z_tJ3tp^@>h`*1@k5$_35gIDqx*d5%Gs0A^m3C>tP8FLx9-_&mf#*h_J7(LT65aL+- zI`WIFS7gRvOUQE3puq1!nv#F5AmB{|$Snw9@^13@5A-M!9^sG*m8OE2OkA+mA#f$c z!udIhGAtbqnVjOQV7O{p9(lrqkoySH^0^L*g51yy&S6z(oFyHpcsB7B(@+AhhPuQL zBjHz}i>!Ad(WXjfEa-1<;g=WoHpkesz_4}H_f;B z68JnU&s;|Wk00-W*zgRc-v3YsHR1CSIvk#+)c8eJzH{L<5}Yb5K4|?fe*m|v3yk+E z%d8USPP0ED_q9#?SmN2>h<%@@!nN3!6iNvfEWuYA=S=j?Ecz;i-}YIWt-|nttSiCZ zQpJzL#ul&T)AsS--`wrq@woLjO3da*VQ{VGRX*WsYi*ZJ69{H9=dxB0*H$N6^k>P? z`ch|KFEg?PFsvz#OGRHyP&t^a*MiALMmhAgta&IIxey2~h863R9VG;nLKm@R`0v4s zp^A156P2Wr#TU9q@xb@#_kS#S6=)qvybgZUk!qwgGf@RsIugUHb+D09qM4|J|DlXB zN}eg1Oe}%M&eSl=)JPFfMR&`L7_M8=#?1Iz?j;x;bj}*rsSO4BeTihD)6V zAa~7#>@Ej1}-Yi*)9su|}oiI4ar5Ez`lXF*M4H@>klmiEzT(3BW{rpF+|(q0D-g6+Mj zHW{@;3;S}1%6hq}z=%(yQ$(_gqDd3SXZ)-BQK+{$?&W~=L6K_G}ko#m0X6R&3ZHc~3?29EIajhr9>)|OXojY9l?U!A#eq1c! z($YOV4fW|>m73$|EYt-y*-t1qzqtbrZ_DDd;FsHGhGe)@KY>aFv$H)s3kkBlDs{uf zS!p=>jb^J3oMY{5xa}6&F#a6X0WI6Jc^d5BJ|}dJnt}QwL+)`U3qILy=MK2PJ+nFs zg*hZF$IUvfpqW$M(>{iq%A$P|!PqFVB3~v-a6^>!juH()F;C+P?Y>D}OkQRsqJ8dD z1SViyaoG{?;dxknJ1xOp;NkOd2?bvDpOk|fR0nc!{#gzRRUaJLmcetNbmvUDNZoP} z9uLst8#^5YU3Mte`A3V-|=Nv(WY=;MLgG zp7V_87BKBj#~dHsnz$Uh!?8}i2Ts$D&0|bIUSoOzwJIv`v(;eax0KrF3exs`LDt}Y zpF{gSt{r>BRy?X@7!w^;mz#nUb~kAYNV^NQi%^(V9)MK%A$0RZRy6PiwnXCeeoDd* z88hej;`+;;1P8q|0uqLE)>Yryv$~^~4M|Lr@ioe{WE(>h0V%@?b<~6jE(z+?iTaGX z{|tRbEj*D)LK4*0D^Ny`=#`?bTD4|FYx_nvB%aXraeN6OrI}iGAOaIgtkIgrm{}Mk zPE9zV3L~&e?KB{vZp*sLo2G=CR!E^n5;TmuYXBPc2>!Y!KAakAhWyuqJh7en@5C5l=vL;ut_0~E7}G@Uw8Kthd^ZS3ut;=c<&AI*Y`4A{Rn3EShT zy)h|tx{{dSl0*kfPnkrUi)NIb93+lQ<|3EqdV0$@w6h`n^p!2_9i}j?G9H&C3L$wU z9{W?#$c$L(L~LDCS0`qZBan*J%SAqPk4$$`n_=r-d|pXMk+p4Jwz{>ANW*;)AyXXQ7}$#47a?Yq((baYhKHu-+>ujvxp`S%&$$^TppF`hau tpE)jHfc^*d_|f{=gAx3B1I-U@;&Lzy;;qgK?><}{O+RVA{fF6R{|B4t#Sj1h diff --git a/WNT/menu2.exe/Release/menu2.log b/WNT/menu2.exe/Release/menu2.log index bb8852f..e40774d 100644 --- a/WNT/menu2.exe/Release/menu2.log +++ b/WNT/menu2.exe/Release/menu2.log @@ -1,6 +1,6 @@ C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Platforms\Win32\PlatformToolsets\v141_xp\Toolset.targets(39,5): warning MSB8051: 面向 Windows XP 的支持已被弃用,将来的 Visual Studio 版本不再提供该支持。请访问 https://go.microsoft.com/fwlink/?linkid=2023588,获取详细信息。 正在生成代码 - 0 of 260 functions ( 0.0%) were compiled, the rest were copied from previous compilation. + 0 of 263 functions ( 0.0%) were compiled, the rest were copied from previous compilation. 0 functions were new in current compilation 0 functions had inline decision re-evaluated but remain unchanged 已完成代码的生成 diff --git a/WNT/menu2.exe/Release/menu2.obj b/WNT/menu2.exe/Release/menu2.obj index b8960e9d7883cbf647ad92d29733b2b49fb4d756..77c8b40396a0d8f57d547ffea33beb3f91505bba 100644 GIT binary patch delta 2532 zcmZ`*ZETZO6u#$u-?bgJ>o&5r zsVIJOG>RmKkw7pJgDWvKh9AU)K%$X9i2wE1f+8496cNw4?>dIWA3gV;=RD_}d(S=h zzCE>~o?21OLOgs3!V52Fzxlp7OQqq<;u{J?@PTp*_QY1zO3je@mr*FTSiZ>u;KYjL z9%Bh1kWvzRJ-Hgp_x~g%iIF{cWz!hk#{%;>B*hM!n*m1f%2PGzqih{x5oQ5m94(eA z%SL1hyDhb*HS;JQwNzV%m^-XHjN!MIN<)y95NauRAdG*c)L14MnA9mDthYK%W zS!+E^;wfvXX-bDC@CWNI7{>I}64Qtd4aHhgKiv$2_;W#-K~EQZy6`l7J#IW1Bl{2FSz;UrV8lFrh4-OcFv@KxD3zdd zP1}RVeLG<=cGdS2zz}}kTL3}4-kS##c(=FE$Ym1B5N_+UTY29cfGZ-D3G5_{H_8~- zO(;Qpk+9Gj#+wvM81M9LO;#j9lUhaw?^P%=w)U81M#ck0qpirFs>mpmK}OwR(G;#L z=a%c*U`bMBe6kEOV}pfuB7Kx$ocI3-R%{EDm{JJ}D9%*unQp|d0%;jswWg^1?z66R z-NXZaF;Rz``_sUVMg5H=C;LMrFZV}CItKhCUmDn!mZN*{5QMz0xE;?9bZ6#~dd9ta zQ9B-W-?^xX*0Nj<`Oie2(Q%b}HJ*o6g9U>OMw?%#iZ(5RxxRq3_y$NbHxv@&X#D`h zrPqvV>XI!}kSk#_c4^do*d+Q{db?Z>f?Y)FR(K8%L=3Cky^;~Gi zts}cNf=lr3aEZB0cjDpLbPWbaOqu00Pn7I8S+bpkP|1q$jFj;H}^e13y~?*g^y3wh*e%Y#;_XydBrPm6XgwZeE8AFNZ3~ z<8H|Ds*4D;bJ;OD^?OP4`(PjadIL#5=nH7BX9#mjgFn83t>n}<>1;o-2Lg0Tg8_r9 znc33t82e#Py<2Aw5qp@^30lhtel(so#g>3EU~sZ?ASs|ZIcGri$GMiWMpaUZ+2;cc}o#FeY4q@{!aJSS*mu!2TU z6A4!pX+D?>!qT!3qKmqqif*{ePEB|C9A#=J`x$q1S*1Jq@v=&HvXziTgO#)LM1!sS zP=k>tHCPAHD0GLs5qy5}PW*Ku44vqkY#{l@WSyx?=XBxK$&PG3^thMA8Ta4vJ$N9S zyN!_b+^js2d)kxEY8d>h^Q)5O{3~A z&Dua%6oU%FVpKBl_VhtBe|WYSm24XDv-VCrzuzR^SV4S#C=-G07(QUD;Wvg6 zRpEEYE@%AiZIiPiiK&XJ@T1kXwxnFNAJ_tU>~GoizaI46aDqj?tQso|&vn0L_`ivV~&WzmiI*&V=XIz;|ik4LfN;P4kV}5qgz4-h= zDw9EgW)jQdh*Ffx;0!`D&F_f0PxdTxGUT10_p^wATGpzy^Pk%I@s5%ygg z0xI&dFo~rV{CXze!d;ixNGoq-2Y2RUhXP_LdR^#;!VQ?9cjC@jn}u5^fwaj=cqPu= zlEC-jiCNnw?i3wC(_Efa1#XN4C4hHkv%rt$xklK6?Q=^Ii(Q+$5TZXTuUwl+vAh-6 T=RqikV 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 delta 8 PcmZ27mGPbEhId>55-|hj diff --git a/WNT/menu2.exe/Release/menu2Dlg.obj b/WNT/menu2.exe/Release/menu2Dlg.obj index 11701d00342cf29a99862a199ff5a56e44c83db4..ac77e830cbe4d6d2b49f650d1c6d7f0abab103f3 100644 GIT binary patch delta 7149 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 delta 7074 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 U@_f7X8~)XKFe}u_zuwXR0HxwGGXMYp delta 966 zcmb`_zfTlF6bJCx-P>hBaOe0TiU=o)A_#IQ$0{oC1UVGc^9O=@I@hR$4OUW~77r3b zau~xJ3v-DE8-fQUjD>|3icu1U@CQ&(S`dY309oIm)@tG;pJcK-yP5BMFE)EyizQ-O zyeva87@N;$wB%|is+uF=$+Ua?regL7+q4(j>ewruv=m=|u-OD9b&RdhqXtWH$90LI%P*giM4ig!Kp(0!Q#7WFzDtF5#$kZ3>8M7U4($4YDJYy_{({#)wsd&!R zSfIoyeqUGN43FA|?B&szrRYxjN4rtBg+)t&jK8zFDxVCAs8*F4zE=9|K6N3rx@tY_ z2DO5RJZt}3)@kI(BDt%{nxwdvr!MGn__Zifja0X;YR>e8C^tXTi7!OX-->Y4|CP4i z2;+?XWt(Tk?U=}(I5dFslqWO^S(d*e(^hzetg-Y@GT R!EDo5rLC(=Z#cSS{Q%qbNk#ww diff --git a/WNT/menu2.exe/about.cpp b/WNT/menu2.exe/about.cpp index 9706106..0915c28 100644 --- a/WNT/menu2.exe/about.cpp +++ b/WNT/menu2.exe/about.cpp @@ -25,6 +25,7 @@ void about::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_STATICVER, m_textver); + DDX_Control(pDX, IDC_EDIT1, m_edit1); } @@ -95,7 +96,16 @@ BOOL about::OnInitDialog() m_textver.SetWindowText(AsciiToUnicode(buffer)); - + m_edit1.SetWindowText( L"Name Bilibili ID\r\n" + "351 351Workshop\r\n" + "Inter -INTER_INIT-\r\n" + "WinPad とある科学の手机副屏\r\n" + "GoldApple 不务正业的金苹果\r\n" + "DZY DZY20070614\r\n" + "Zesa LinuxMEMZ\r\n" + "XJBLMNP(?"); + //HWND hWndEdit1 = m_edit1.GetSafeHwnd(); + //::SendMessage(hWndEdit1, EM_LINESCROLL, 0, 3); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE diff --git a/WNT/menu2.exe/about.h b/WNT/menu2.exe/about.h index 16d954f..462d340 100644 --- a/WNT/menu2.exe/about.h +++ b/WNT/menu2.exe/about.h @@ -25,4 +25,5 @@ public: virtual BOOL OnInitDialog(); CStatic m_textver; afx_msg void OnStnClicked65535(); + CEdit m_edit1; }; diff --git a/WNT/menu2.exe/menu2.aps b/WNT/menu2.exe/menu2.aps index 4116a5134d82e01c1796565debb521d2fac3f1fd..b6288eb371d503a647cefc0b9f1e2c64e32eda3e 100644 GIT binary patch delta 20017 zcmeHvd0dlM*8dF%h$5iK6BcEuGIm-Q7VFZEZyS;a%oviG1X15QX?>@5v5M1bH`}89 z)jI7s7LEF-Ra@(HvF_qtt+?+3DxiQYih_Uwvak7_yFB3u*h)I@=lyHqlW?DV?mhS1 z?>YCJbMF&V{OyYuw@ph{Iae6uf}*GV&%(6BT%Zi?fB!INjCDGRgv-wI02hQ`!q=|y zGs0_b@&Uq&edRs(FL9Iia2>qF38BG29gh-FH2k$%N62vNaPJ;H@n8HBnw{k>{nCvPaB{aLp``K>)oP>}9`q^_DX5$2dke7*{Y*K5Lns^nDA`p_^M%v#-ArvtZ zMMRE4YL&qpr%-ES42n4D1(i{eP^mVnl{#$%dIm*=MzZMn#!zFD>S;; z2qakD<#Hjpm)v)NiZ`lbwZKP*V&l~+UZd9XMuegwM~@mMEbA%f0!gt83sSqPmz+zA z1X={Jk2XiEO>qi+1j04XNNOTUO}L~6=7G>UWoKxHcY)>!C$-9Kr!|x5KnocV+@ZZvp;hu4kb?A9MC%MD6h&_g zyvZ;Hjifh#gwDVNc%$<3L&#XZ!~K`>t^GWI9_F*q|n4uBEW(b6~}AiBbmC0CZQLe ztjI3fpi40F224uA3_Do^*azv*0|=s8qChF(wAx!z9YM55T6;pZXg}DRNTmx@b{Gye zBvS20ssYLPr%X0EqefC@f&j(xp=o#25%_alSgV5oCFX7q&N{mix(i?PoN@UHAQ;cBJ6G#tOTlO&G z9(ZUY?m{$!M_^q*@^Dx~VwWhUVBE)Onxdhdm`T|>0m|Xw3?o;xs+N<#!UTzqH<|Ft z1UiGs&4z=~WKd7wb@3)j6-75GOll?R@eCECqer|}#T)Qi#XZ1Yg&jvYU%U?RN)WU# zu80?}Qkw{m(a4FCJFE{}g~_1P*z7MH?50CIN}Wb$Fh^??N?2|%4Dhx|Olb+@)h3XD zS+%HDN)xu%a_-M|=@JX-)8Z~<{n>YkCaWL<@PTeZbuAY_wO_}~U}zoZ_u?ZsDyCqD zWKG&L)Tm>}n_>-=ZnsRSj4Fj;f`L~-?+7wG;hQ>cAQ>~YjvGJ<1$ERISJiXDPjnd@ zGf+-Z;0Z+#uOTSvIXUV0-}PL;07(aInZ(Q^L_1$r&-r34i89kg4c@&IHX2?5D?O6J zA~rTDqRmWwDEz&s@JQwwLAiR(6th;BK&zQmn-kPiqp>1MTju+qa>!KdhG;Ewg1Bjn zTB|mWr`2>`8y|4~WL`%eunA^A;DRRE#8-jS1&?IXMgN&sf_Duc9ZC36c~xfW0C8|4 zG{V$I(`mtT(@w0;gsg_M!iODiU!>RgE3UXg;ks%L3v#j=Ra1$$z%ZKX~E}{#u7QP zL&PNBm_SH$?K}WMq{c_uB+$+j;gD+1Z=hs=INc$ z0sm#!Dc;DN^$M+7OGY0n(Tvg@r?XKp*Rf>wLUJ`*&D*Ql`n~`)A&=w=0uy%%L_zV8 z^XUzv5dSGw^dk3c0rENKCNr;F-sV{0lEJvrZ3wn^cP~g;djgh}5%KNShlKlZeF3(K9YS zW?XMp7%3-etV_-@L)d(d3xqTs!aU_c(gWI(uCIb~Y%cBRn2LkWbKF!(7s6ht(@(LD z5sl##IU0E_Bv%TxhH_O(X)tZ3a55VerU^^WbN&eu262XXB3lGuK%<7pT%<)(njK6c zEsD~pj@o~P`7^W;L8mkGQItkZzB6q!rO^dG`vT`b!L`j3}(hIEQ_6{8*L3XzT2d;|?oFiBFaR~R9aA5jI#(LVF3h4l^7H1>y`kM07+lS+H`afVwFPbC9Xd+_ymwkmtb3aEMiq& zV&19uWzL^wbP%3NOA}s{<8_9qgdybRbQ~#_1XVmI>b_vEj7lO8?I#)%c0xFvr!yNV z$tKMFWHqTxiWn){GXxli2!TTUg zrxa13jvCQ92~VVP{TZBO^8|s1!u<@5o_e6;sD~|AXNXgn;14)pEXXL@VnG_ia~%{y zX;U5GNUe&cA<#Y&5`UlyS!rA_@uH1sTo8`zz#6v)WTU|k7>tB_q|Fc5XnLJKo=hl` zTCOlLow=?#=`5HoOK0(Fhgi5Iwy8*G?#&~E3kssc0;p;w-UNd_$f%=fq!4Bw=lpS= z4Wf0l(Zgqqt-~yQ$)805iB1s|cY=e=|AaRQ2J7}WmQ5x*B z$#@Z><&kO?Zvx*=g3Fi)(ezjcEl(9PW-J_*NG1?Hg=FPqe9`s{yi#YtL5L}MEQ5N( z6`EE7o~#MWp82uNVA7#Q2yn*{+N6%-4G_UQ_$V2l=o8$N#H?nW;D(XH`V-u6QV2cC z`3OZPm}yu~F#Ch*FhW<0g}D%Hk9-{0Dr9cZ0=(kC1zce46V; z8m>Rh{ZTCV^_2_@F#seJ9-ii&AawZ|HlcB6xTi@C6y(AuXSn|4uHp>m?`>OP$_VO9 zajlShhVvBLP+$j~<@}#v6IZK@FkPd1D)AaI_L-JZiBn)~R59!vV)#`S0w#!s*RFB{ z{$$5YZ{R0Ur%HPg3lh^aqtccg#e~yIre0+ZC=Ynz@GQ2CgVjA=ts$`~CW3@RkpxF{ z6BJ4%WPv(3s=@-QNDLO~I5We!7?5C2)Y0j#aemk-h;3k*K@$^k%g~6d8j%*SCD|t) z8c1Z>2pg|4ca?gLxuQa-!OmCgH69KNNskB`ez{DhzUMNzAw&nSh&5kiGK1Qd$$a1C zOfIZrqhy4P8V-VVT0K6P!&1=rBMzn0!T}&jfPq3s8=l2>q2sfdps!}JrSiF0*dmh7 zXR+l}3N_g4i;T&zCY=quku+?FWplwDTLB}D4%p=r*~SnFL>3CANj*tnq9K9O?ZBmb zOgI+Q;=OlF_!x$7HVsuGn>d9wUV+^*v>-MlWMp%k)IdOkB=f}H4H`){9AMNqsm5o9 zlqT7Q8O`x}6&A09O6T~(b%vYyIv0w)z9s@;M! zm}2ah(=~VW22=md8`KV0<=FoE3D4y)hxun#E6mDamb@Ga9p(c05x7f}j-ZWa%eFQ` zW)4RkV`~mWX<#n%iM&{tmCKeuaxOE|-MQSL7i_re&GA|T9}8!pB&7k~#H-P1i^LcR zZt-wFO~$5*@y%oGMnmB*5_WK64qJ0rRirhItRgo`Gw{^l;OGkbUwa}xmo<Obh=Dtyi1D5+7M6*HJy5{8mIyc5u4_g6Qjj=dM~mgP zyg{ubcq{B|f_26DG;CpL1IfbG6URhA(ko2(*f1tSLH(TZ7MtLEVqyI)Hiu)kmO@JfT<+zu|bVMr@IOu+gT71TBB1=u#pLfc2icVjT2(xN%{lb z@s@vpJzl&nhK@{jufoyWTmU?^6LN1e8)^oT$w~+)W*T`;EWB9ENFR!Ybt36VF&AdG zsRsNvO`_RuB_@*Y{zMBi>2w;C8sl4KPxArsXIiaRXTn0ANR$bviE zQ$*Npci1w@yu+4&>@I6F_%3TR@h)rg{#~|=zPZc&fpkA7Hm(p!J|&FL^ChhNnhTh}C2_MrvHr5CC zSa&D{4CS?oXbqh1gXKhymFOO#7O&w=B849GJh;b12qLfB#7NIR%?Vl+-oN89_;97aKopsC5OM$Wen*-t_r zDi+_!5Cd9&;iEutqHW+{OefXyd}9i4z=61IHK*dEynr+ea=S#zTT1 z$H&pV6VR!5RJF6&z1q&^vZS32u(O@5?(6Lgx2ASBO|zBr6^2`xCdOHrv`|e|vdGGX zhS*@xn|Vl(J0c8EA`B8vLo1>)7|B<#TDhM1Ze=eydF;LNX*prGa-y8r^vZWwy&xw? z04tBO`$9Q&$L=!PP#7+wJ%x{Ca(`i#OiuUya7VY%TV!(T|DoVd%{ZDS7OgTlJ&+jU zB&VWHaAIwtz}hP5)^eQ_8}67B>r~++rw0aJ&QvrZ+*wXj;smkqv9ml(4znZ=*vW%! zGz`L+47nh;U0>Gq3i(p@j4Tp);#3sAZnFRx&^$C7{TKYhuf^|K{?&W2>|M)H4};U< zcT*O4_&Lc6Eo(eS^y)<#gv$bCmMfk^Ev{a}lZHUwt?(e+YQ?-hL2>96;5840pgHI* zl!#u1&zI3G^fuJI43xjZ-|0}A3x8*z*U_8M{%yim`r)L15~K5aHi5~K$5qKEYTn{mgcYM zS@`lwIDF|P8s6bhwtva=HOOj7^bYlqBWL6+8%btvS?BHN;e-B!dIQWD3QMYY|AZ&e zx9Gk^3Kh)t9eBS9vd;lbFj5!?6O=GU&)N^gX0r4VGx7E9z{3bU=7HR=qeP3pckmF* z@~}!zJp{cOLbqJvljVS zl>NeW zGUpedQMS*ZUu$IP(?3?0V~Ovdpu#3-wYtE25yId9`WWtGY;~WJx|49v!5ewwuWBGW z6%9u(BB9<@{s+s0{?mJh0M%-3PqJEPSdRMo_Z06fhkXawZkBU?vZpNmT$IcyC63$M z&vnk6IrHbww=DDbOGyoG>p5}z_U$K6p0rx6Uw!ozeCFij0Qv0MvsbQM*}Z#rVPWBp z9Xs~y+4Iv+Kdo4?;=Av@%gxQ*yLT^;e);8>{QUe6KKP)Zpy2b*KaY%z{Qmpz8yXsf z5eIyH1zmDKcVYXPenBa7I9KPCWdBPp6Nd~LGHcc>7{uM(9X?-w{dJ8-vvA?UH{N*T z?YG~)efu^{XxXx5XU?2?_uY5LjT@JooSc}L_&?;eXwf3ITK(y#pDtax6qrn!H0jWx zL%%ZAc^6Z8d3jh^*n982_x0Cb2LuGbWMG8%-+vz%%$P9)I966x!e~GL{PX3@myJf_ z+O=yBA3hA!dGqGI^wLW(tGRRMLid?7XMXa@C(vcfmM!+9xh{|KvgB#~EWc>oEg{q0 zEnn+`EHA})EsqJbESNdO0@L0d^K4HO@L9EL6)^Gk_686aELZ>o!H7Tn@B^ScV#Ej- z@y$2iT(f4);>C+$I8eih6DL$EReXFrAOX-%oH!A>Y}>XCYCt!DQ->s$Hr|&>5or16 zT0eLPTD)UiEU8*ICY7%xP3M*Jk}lsh>793~5)&&Oy=Kg~zj}2oC`|fVQ`|D+T2tZ; zN3NtBO|x$_y_VH;*4BbD zV`5^Oo13Agy1E*S?&i&#pyxYx?$9<+Lksur-D_zPs+acbFFb$1$Av5p%aO_bQi3Kg za7*&=C`2gV@hexUWWvx<;Pbf)4d|yDw5QgAD+yYs)S_)QTT1Pa%x!#t&c2II{|$dS zbRD1RnX#m$z1=1j6z*Mr=fd|WV>`;&(di27bl>^*{J&61)=ZmT#^&YaQN|S&6;OZ$ zAsvU7!8LWNymjjquoz}Z4fe1Moatd1G2P3OI@u52L3kr|~`e4D-9enAjyl@M&GnnA}` zxzlB@=5zD^*c~k%L|6BqtGhvq`%(5mlz9MM*^REHJVuL_#2&7eA6))u+36DO1sVk- zK6maM1WR~Hb+A0fFU369jJ;RaMN$aB4j53ZRF;kyahJdgIClcMd+_e5NBis15fMx% z>?6MIU>&P;0N%9E(fJS2>9^6Dx#IOUzP-2rrTx8QA$12{fO9X(`MG!Qv9Qprg9Orj zC^uDp{b*38{YvV*NS=TGc{nMDbgAo$d>0wx47p2JYNwhWJ$gXP&6_uag3{B|q3q=3 z)LB7CKYEmc3c|vQ_wIdYwYFHT5Q*DLN*bn3DU6f6M;6m)KWZ0-+VmYv^Japn8_ncr7j`|*C(j}NlOT>l0u z&gSX5p`dG^gk7km?6davu(sS&lP>*)3R97_{dQer>$SaJpgfzmvsch4_ujpG1DNN} zp9jYl>KhUg0(X$P*VeZR4 zWx@21I|rPCr=Pyl&;Z#*+mdoQ@wjWde@#_U9&K%Hy~w`()TvWMTfxD>kI>e# zHG^?PNcl@LNw#e6s>sQy=;qCO80q=vOKj;^uUReqdBaCdAqoPO)e(sO`=PsW$%?0Y!enQ8wvwBTz7 zFNd^7+-okF>19dVSZmt<8P=ItFcPb>+(3DzvRGyRN;V&5HKdxgDvo z*8W~-|KHsc0BvncV`XzgO><*iOLKdB`_%lM4!PrNdr|gYWNkiJT3&vAe;8_MIA4*! zuB|Ei>hV`9t_+88aqZv;Tk!l}g0^7({QD4wMvn%ogSI9*Q^786xY8srJppvF0 z-Ll%I>dKF=Rlc4J?#=ov?1;D52A!z={m?EYZaDbbO4)^^9%+AfPFw7r{zcF9FNh}= zQ}f3qC0F*K0tj=~w%a*}(!UEs4fnnQC)U(bmA)^mfO#D(srQIi~T^Rn`v_{0j|{r zX1J-Ud3bTRQ~m*r>+S2`rf+>Du71=CA3JsoxWHNAk3as{ zwHdAH-@ku1G=lx`s#V~ktw)a3L_`#OdftL~ID0mn61CRUH2eD6JP2<2m_vkvbxuFm z-m3)HW4&72j?a4zz*Ubez3IM?_YkEx8Wm5?vD~`=?ADZB{^IV5f0Uj9!(UN$aYXhy zbm8M}Y6P5f`W94I^cwKFmKv9~ISiGj4TYPEyV;jEqpW?Pk+b(7TGMv1BL{mY;>Wh1 zLGExm3ccX)*0QiisMp4g8{v-bb07gv>1^xNKNPN50pNm{f>adpWPC1{m)9_C*d2+X zcMsXawdX3EbL!gzPSoRL8`#(!td}3Fy-{8{FY_VJ?;OiF&di-#e5Aak4hse^oOa_^ zLjDeP_MPq`yB}rlLJfD`uc^toy4O2nXBf&q*0-rHr!ea?I8)2qiRy39seYJ$b)P#8 zew~n=HgxFFfddCZ{?_#c^)h(4gAg1!gIxHlTnPF2_&`40wQ*=@DAdCd4z&DDjR4ez zfc&^|rOTIBfyHmzRy}K0g_|2zfyB>uLnDATzDQaPR&F~EfJ#WTf6r0NrA4l3pZCpJ z+AIAZZfT$QO#8wu4ZCy~oc_V#OLx6G-uoYvv1H?57=q0|++2g?0|@&O#8a}*bf&va zdyPc-)z{b4YZe8`17s zywbaWB|%d#;k~sfU60Sf7B3`Wi*)EZ`~Hxu)m@Iy7o~&u1xtmcZ+B5|U{__=0``Vw zx%g2mdEVq0v}CcvdUy27RVZLzZui0o^6!3R^ppJ~qa60g=q<;d7r}|qiJ5&emNd81 z_{ikDcYQ8?WCYKPc6Pepkx}O=yBhMy=#Ae8?YH07tzYl(WwF%k+t*+Rtkrs;qSaE= zy#7v$16R_WmUVYpR^4hYY7o-|!nL}!@vDlowH24wSEM_13FQ}mc#zrYDQSJxx%)-S zD{rr>EM9Mag>|~`e0#qzxxVU*2<<3ex-+5P03K&U-T>bxAl{&=3N{${R2s51XZLBx zj~|Eq3mhYLeZeCmnrc%vH2p|QO6uCOQw=<5f+3(U8N!x3!cc%2JioPUbQxhub8$)8 z8*J@4&EMZ2zIp%=_mM9zFE39|PdN95t}ndsLZ3c;U}}$SDXoM!1HB+g0tq&T!M7cP z@V6a~KmDK5e=zuu9sJ*~g^&TT@?Gau+%*nlQGyFOU z@4@4dFsQFQ)X76F%yyG=l1Go9yw&zyIjDu-UnAeOBSi!Z(1$kq oB2w9z{tcrq=lZ)o)#Qs#ZWT6ogFN2f3%}sMTek}N-tvI|4~??p_5c6? delta 15962 zcmeHOU2Igx6+W|n_Ojb-*!AujjMsK!YJ#a*a7t3Q3JytX3|9ED4QEwDn*J=LYRu-A#D;GEZ3~TWfeIOklqT1|PbX^w;)J~M=ITY&ppTE>MUX2`t-7}n)}F-Pz|@8o3FBfY{mL2db!}8$hw$(?V8~PEu76k0`Anbr|V&o3Y!h49Vzk~hq{n4hl zw)_*b&?(AWqqSjxb?}jV^3A%DFgjnI?E+T9b`1CoCO3pBHp0`e7rue#S!6dNI{8Ly zcOkbC9)-soO=I7~OC;=Z*oqd@vj@GN#%MZWeOwMe5DDr`e|Bl$azG}>zA84z!Lj>9 zPQEg>CHMeD2d`mBQ(2>250hVLLs7ym43L&(s_S}b=S|Jv}Zi{FNq z4aMERXcfT@h)FemU#bE@{&BoZoRdpV?_8Y0Ah&Oa@pA}5I0Sac7fz?buOga}^@Sz! zFQ=br?L_SnOybKhfS2Blat~~QF4THZ{tC+dct>@dZ^@SnX?dU!x(lB}uFs13_9KrJ zYQ+k9s?aW=_~*h~NtvI_sk6_g66YqC1&>XH)y4Cv^~L<;jqqKgDjyJ0b#I4=$oHnB za_@9f{_H|jzB`?homZl2s76H8NQX$OqcIWHrsBYbZ&zai+k%6GgX*Wxr<&AEUaVCA z&Wm>SR0jr21Vnt6{_b?F3h5iaj&yp6uw|JA0#T)-A_q+rfd$h`HcjSgO^e5vAED4p z@eBUwW(>Ac98x_X#Uuj9FL746FncoFA4R?YnN(WtznNBzEuvO-&P3(N&1CV?wM|Yn zH=Ds(_6r!;-wF3dRxDgv-%LE$=H_BE)hQ!IAdF=0nn6ZbU@zt{Vscn!foLUlt)r2` zEmK)A`@r(GVEGcV;Yvgg_@ow&O+@v`O~}RzaV)fhX=6?ewBS&mybv#*z4_P3CpUJ@ z)cA@J!~;uTS1LVO%a4&?=;F3xtg-&%210BD3ZsG&sPJH`9JGsZXQu16R^F0Eq z6bH-R{6D%go`n2)Q!3cfL41@=p`LxNiOB#Fj!^* zVWzp$3pnBC=s7F855wd9}u8C88g&soV9! zS$#L8Ia?BZ*}M>C2Ijb}Tyx$kFkrH5F`B}aX;T%xcKk*-1bz?5$<~?l>?1ug6Q7#Q zi=_q?^V96Oeqo5XFCD63jYv*i`aA~3Nq4t*EvJ+*OI^dV{I2WDIj~gZT#foKtZklRLK@p&~+{*_Ve#?tYN-K|x#V-BOWGZY3MN zHa;gatN{ zBe!!A2p`P4MfLD-q^~TiI0f{uJiU}+(j9dJBZs|M;AkF%$OvluVTYxqIRs*J>!JOh zip}}Wl?UT@Dt41DHXVE!E-*XnITUjkK{Csx)dWor$+OHZ65W=~et{#hi4hd$RdsSe ze-1%1wP+_qovD+JzL1`>48-b3GF{?W&HqHx+f99_6-Z4~R5vBz60`@pZCyZO_l3VK6R81KpwUl0cno8$& zmA=N<7b;uy`%2t8*Jp!!c@?hMpD1PE!RMRG0={SQyqVYt3;xE+R`Tw@<+C-jHCyO6 z#CGi1v17;1$NMjfeTM8aWS=4X41E&+v9)uFolERoV&@V&mn`J>E_U{`v!|Us?d)l1 zPdj@q{8y896|t*`T}A9FVpkEnir7`;F=lEve+;;pHj()ZiyQHM~5t|G?DsQ<+q1^TzDynO%Vq+* zg6d3PHWwI<$TP1ljeHuN-mX&j;O^PThnVTDDs`<768G1b+@ z1oGa#N4=zF+^`~*;en9r2|94ALi|U$Z_)c zKMFOt2X}tkYk%wuu;L$Scqk*s3ro9x7y&qt$lxyA0DcbpsGXw#%QCM0pwHgZh5qkk c)E9cQ^;LRQTn}c|KyS7wc%&*TXExUV2iU{MZ~y=R diff --git a/WNT/menu2.exe/menu2.rc b/WNT/menu2.exe/menu2.rc index 8530df7c2519482c1a7d716e89ef9b4611737340..d224a68a9f68da65a92a0b45fcfacb6387646cf9 100644 GIT binary patch delta 848 zcmZ`%O>0v@6g^r$+F(TzLK{qz*Vcq$KHp1TKH7zClPp4$w8Ur>loII&mD;pT>p~26 zDS`{RATHgy6SGr97p?_2B8VXVg#H50%xg(q$na+7%{}*?bI;7ztyjBm_uNByM3F)g z`Ciu@8yZ&IG>;5e$jPru&!y;pDS!M=7phpr7WNt0#xB}e=iI^rba>KYWQFTJ?)JE@ zVFR1QcQC{m zqd>-!f>X!Rs|6dT!c11k-O=pxRH^t^Fs*Btm?vuzmYAbH-%YaCS>0jEG5?q;7HrGG z$hotsrY&7}UVaDfdo8WS(PL{)o0aYw>t0j;Wwc@o8LDP~GBcLAR%GuF`EAmtZF;1f zQ@%8~Q=Uzq@Ws(#GT+ilQuOCU&m#tooMQfUR@rA?8)(amKrnLbMfxb0Ua&?E!*CJp zj1r0{qaoh{KKVR)rdhx;9nfbQog!Y{OIF{z#Y!3eXLN5RGA^Tv8>mownR8j+nt{ix z?nLJpZD3J$JYL&5sWUQ12Bo`#+eG%!O-5?OD@=o#b<|`$?&-ZA|2{C;e`0GiZkLG# z!U|lQI%x?Nc@nC6Ffv>aR+ ww5t?azyifAv2jD2V(az=f0e)tfB>(^b delta 514 zcmZuuJxc>Y5FNG2sTdOlQ7-19XcD=L_vu}Xi63XL1oop;Fw%Ojij5*F`Iu7*XGhdLD+SuzDKZP6imEz&Ya;)#fX8Xb8TlL)TE zxp-wj4|*D8LhC*LJR%t47tTbqDa*G}i(eEQTotJ3Z1Vbqdo@R!=x~7fD{!Gufyz`w z{6&s{2!9IJ61WQGC?A{zc8*) + diff --git a/WNT/menu2.exe/menu2.vcxproj.filters b/WNT/menu2.exe/menu2.vcxproj.filters index 17fc255..fa4a805 100644 --- a/WNT/menu2.exe/menu2.vcxproj.filters +++ b/WNT/menu2.exe/menu2.vcxproj.filters @@ -86,5 +86,8 @@ 资源文件 + + 资源文件 + \ No newline at end of file diff --git a/WNT/menu2.exe/menu2Dlg.cpp b/WNT/menu2.exe/menu2Dlg.cpp index 63f817f..854d1f1 100644 --- a/WNT/menu2.exe/menu2Dlg.cpp +++ b/WNT/menu2.exe/menu2Dlg.cpp @@ -41,6 +41,7 @@ BEGIN_MESSAGE_MAP(Cmenu2Dlg, CDialogEx) ON_NOTIFY(NM_CLICK, IDC_SYSLINK1, &Cmenu2Dlg::OnNMClickSyslink1) ON_NOTIFY(NM_CLICK, IDC_SYSLINK2, &Cmenu2Dlg::OnNMClickSyslink2) ON_NOTIFY(NM_CLICK, IDC_SYSLINK3, &Cmenu2Dlg::OnNMClickSyslink3) + ON_NOTIFY(NM_DBLCLK, IDC_TREE1, &Cmenu2Dlg::OnNMDblclkTree1) END_MESSAGE_MAP() @@ -222,3 +223,14 @@ void Cmenu2Dlg::OnNMClickSyslink3(NMHDR *pNMHDR, LRESULT *pResult) *pResult = 0; } + + + + + +void Cmenu2Dlg::OnNMDblclkTree1(NMHDR *pNMHDR, LRESULT *pResult) +{ + // TODO: 在此添加控件通知处理程序代码 + Cmenu2Dlg::OnBnClickedOk(); + *pResult = 0; +} diff --git a/WNT/menu2.exe/menu2Dlg.h b/WNT/menu2.exe/menu2Dlg.h index d10e846..89aca3a 100644 --- a/WNT/menu2.exe/menu2Dlg.h +++ b/WNT/menu2.exe/menu2Dlg.h @@ -41,4 +41,5 @@ public: afx_msg void OnNMClickSyslink1(NMHDR *pNMHDR, LRESULT *pResult); afx_msg void OnNMClickSyslink2(NMHDR *pNMHDR, LRESULT *pResult); afx_msg void OnNMClickSyslink3(NMHDR *pNMHDR, LRESULT *pResult); + afx_msg void OnNMDblclkTree1(NMHDR *pNMHDR, LRESULT *pResult); }; diff --git a/WNT/menu2.exe/res/about.bmp b/WNT/menu2.exe/res/about.bmp index 6b7eb535234a27b8b34fb166c78bad18567db0d8..0e73fc32bec68ba14f7772de0373bf51c012a8e1 100644 GIT binary patch delta 1796 zcmd5-O-NKx6n=M{d2eQ#A1y}ar&6(O)N~x}&k~6W3B_hM8kW@CL>N--A`+fOK@h~i z*$B1}5nHsVxa%m0AVT8pawV=>1kuohWVT1z)m2ui^#xKD#A`ovQ7KFz3 zuH&S>LSt`$$M)ZBfO3c5SE+!VZ{`baFPVR3MOX=Lwhu9k2CWs6io8&fK_VAqI1chi zw@i?Jl_n6#r7BcFAyK)C)ov|p<^y212YAoH;Vr zLbSY&DgdnKqrBWP^v^^@Gu2r#ZKlS@- zGB{ci_<~cJ@5(XgoAE>Geh8Tvmdo6M70}zTon}Ib?I%1>WvxjOZ_w+YVkNMV*Tw&4 z{BRe8)?CzbD;*r^P;F7;2eDiJ!kN=G}D9qt|b+!rm#?Dd#e{%0AgCCa+SUO@r`E(REI(3+t zj_~huiwrIxmD_~~yqeTu^iCQ!7pHi}!V2?197>ZIyw(JTD{-(pC-M8S2m2ZP_k4yv zHgSYYf_>G1!HEo**AeC1Fn{p?tBd|d5iCyVJoXU#P&V~3XCvHxG~h!=0y7NW^7vUA RjUHG!73M#eryG2l_6I>mPM81y delta 513 zcmca`hUwfHCT%BQzhw+yV8+70paEnZWn^H82GWcS9AI&YMGOpw_<(q$_6+vT(!2@~ zV)Ad+SCjj!I5&S2Gh&<^z|uWA!IEq9UI}9mrwhcH94X1Od4iM%UkMDXs-+k=&f1Yy)ESOioZ{-K?u>4(4qBpavEFpeD5W zl!g{Wv_VUsk!{KUCIA2bpWJAp2h^4d*5<3D1rc8Y7vC(P2UUv@n|wi@ZSy^S4Mx@_ zATYU6Q5ph6 zyV{hIg?$P8|H*-kvXe7ocs9SSnav0k06L6)$>fW{qLUk{SSEXwOHF<-J94vhy(v)g z{}P~vC6hm@D^I?V%RBj8zTl)F!AVwDKr4kOA24Fy{I@}xkp-w9Xh5>WWX_ diff --git a/WNT/menu2.exe/res/about_ori.bmp b/WNT/menu2.exe/res/about_ori.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6b7eb535234a27b8b34fb166c78bad18567db0d8 GIT binary patch literal 42574 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 SA8&jHMJH|&uG!{7$iD#2rXTkJ delta 17002 zcmeHOPiP!v6yG>>(;*8h6UVLu*M=7SLnW1H$R4yBl!{Aq3n}qp-CJyMX>%(P=}HTp z3cGyBo`fDe2|~l5_0W^hn>8ZjCInC7trR?XkoA4vZ|3dWnb~OA4PM^Be)GQH`@Q$Q zeKYgkm)-35kJi6?w0>%3b?L9LV2>qwJx8yTUZL>*V}-(0p<>}eVdvDhfoXfy-t~Jy zX=n8*uiKdE-QEsLy*t0p?nQ0yy<=mj%-0)bv%gR@&05hsv*nWR=?lxUA-5~nQt~M&u3rfYV)RfbIvp_ zhU~XlD|Z_u=i^*$uSh=LZo&t-p@U@>0MZmkE{9asSeQeGiP`e16{a|zT?Yp#&t6X^ zX)lC>&PJ&z3|T9uDG;tefXuF1XA*b-xrLdR=N*c$+OQr-&X~Y3O$x?`?he{gVhKqC?`sT|8 zKYHcThqcd{D2%-K-pav4LEcNeez~>8&ruHEk(A*W+_FKA+98dDnI8cm-RN zUBR&RI(mHTO?%Z=LXHMPX1&jRW>6FthG+0^>wT&}M4Q|1Oh;|+hpB{;ZP&LKiqV4` z=LN01>f3H@_LqI$ApE=>MlaqvZ-c#@ZmbBF;EadHE_B?x^;EB1alvCiebVsoGJmPMqU zl-U!3xmFTn&Jbum@n&k$57VT;va}^R>iB<554{CqGFi$gL&?diV94Vr0`S&}B!ej) z-P$kwr`WP_#-0<$qoM^amt|K3T7207RvIA?3@vkj99?Ep3n4HL1JgL912Q{rGmC>w z5@2vc=eu>;Aabr&f|3K7*Xq9kF&SB%71$%IfQ(8pv_xh;WQK9 zlG9regzZOf@e06rL>N5UNRl^|;t)=ro{e`a^YM9UEWzQ<1-^us_i_=+$l1 u2fvoT+uoe*9RI&Y`VHo9y-)uRg5Iky&(3^)|5`w=S$aKj_x`nTtNjmM_mE-$ diff --git a/WNT/menu2.exe/resource.h b/WNT/menu2.exe/resource.h index d00c35d..77d84cf 100644 --- a/WNT/menu2.exe/resource.h +++ b/WNT/menu2.exe/resource.h @@ -17,6 +17,7 @@ #define IDC_BUTTON1 1004 #define IDC_STATIC1 1005 #define IDC_STATICVER 1006 +#define IDC_EDIT1 1007 // Next default values for new objects // @@ -24,7 +25,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 136 #define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1007 +#define _APS_NEXT_CONTROL_VALUE 1008 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif