IMD 1.12: 12/12/2009 19:48:52 Seattle Computer MS-DOS Operating System Version 2.0 Disk #2 Serial #MS-422 Copyright 1979-1983 by Seattle Computer Products, Inc.  3؎2404r 34s0$utƂu2°X0߸@Ў@22͚ q͏: @`  @`! #@%`')+-/1 3@5`79;=?A C@E`GIKMOQ S@U`WY[]_a c@e`gikmoq s@u`wy{} @` @ ` @ `  @ ` @ ` ǀ ɠ @ ` ׀ ٠  @`@`!Aa   !Aa!!#A%a')+-/1!3A5a79;=?A!CAEaGIKMOQ!SAoWY[]_a!ceagikmoq!sAuawy{}!A//Oa!Aa ;Loop until completion @`  @`! #@%`')+-/1 3@5`79;=?A C@E`GIKMOQ S@U`WY[]_a c@e`gikmoq s@u`wy{} @` @ ` @ `  @ ` @ ` ǀ ɠ @ ` ׀ ٠  @`@`!Aa   !Aa!!#A%a')+-/1!3A5a79;=?A!CAEaGIKMOQ!SAoWY[]_a!ceagikmoq!sAuawy{}!A//Oa!Aa ;Loop until completion MASTER 2 rmMASM EXE iA.LINK EXE &EXE2BIN EXE vJAqIOSEG &WcIODEF ASM 2MAKIOSYSBAT 0mlLINKIO BAT Y#PUTIO BAT |tINSTALL COM #;FDISK ASM ~u':IO ASM *vwINIT ASM r tCONIO ASM `gUAUXIO ASM TXdPRNIO ASM TXhTIME ASM `gj$ HDISK ASM fop1SYSINIT OBJ H SYSIMES OBJ E]8FORMAT OBJ KrCFORMES OBJ epCIO OBJ ʍwHDISK OBJ FDISK OBJ ՍCONIO OBJ &AUXIO OBJ PRNIO OBJ TIME OBJ INIT OBJ ؄! z3uM in Ok BreaCCtuwwxx7xDxy~yy zz{{]|}}8}h}}3~c~~c~)6U+QzTi.gdžE_Ɉ)_ 1FalȋTn{Ì/ "9CSsŎ؎(I[3Ot jlnĔ=Lݗ?Ud](9Jiȡ 'i.¥ڥP 0"BV(fkx}X,huث@Xϭ0TjXnβ>  *ȹ1ĺԺ+~ "/4m޽>Xоվ3QDSy!M^ $>N_ds +;W`p&~ 5~ B~ Y~ ^~ m~ |~ ~ ~ ~ D o  Z < A F ` x  # N A l W      / / / / <1 K1 1 1 A1 1 1 1 1 1        !!Wr r r r r r o_Vggg^g!j!!!!!!!!$!6!L!!l!{!!!!\ ! ! ! ! ! $)6Rcw ->KPa nE& 'r 1 '1 "."^_ZXWVU! ]w4##FFf]Ys:>t.>VRVR' >2RGW' f] >UuA#s FEf]Z>UuA#s RWf]UF2#uV~Ar~_tV22>tXE6R s >E,R6 s >RF롋Ff]U2uAu@ uA ȃu@ FFf]U  sM66z3R ~ 苷u3 RR1 2RR1 1 66zR ~ 2u t 62f]Uu Ff]U>tB#2&f]U&2r~>~s!>~( t&2(~؋&2~&f]U( tRFF~ r@F0)F3V~ r@F0*(=F0)@F3VF0*V0+(f]U( tR3rEFF3V~ r@F0~(FFVJVu(?3r4FF3VV0~(FFVJVu(f]U6R8&&f]U&2s&2;vAʑ&V2R7f]U>rVrf]U>Vf]U> V f]UV22RV22Rf]U~5~2V~r"F~~22R`VBVJ;Vuf]U ~=uV2RJ ~BVV22RJ V22RJ ~VF~~22ʑ~~5J VBVJ;VuЋ~2N2ʋV2V2+22QJ f]U2u>t2RRRf]UR RRf]U2#t<:Ft4V2tu>VE СR R6RFf]U~rV2€2RV22Rf]UR^v  f]UR1>u3RO~}VV2Br R~uf]URVV~UVU$VF2V22PV2#tu~u&~U 22R~u~u~}"u R ~}"uRf]UR6~u~UV~t5VV~U@tA+2R(~uQ~U Vf]URVV~U2RR!R s!~Us}t}}uu3R~} u3R3R ~} u~u~u 3Rf]U~}VV2BrR~u3R/f]U~=um u踺F~rmRRFRV22RvRRQRQR3Ru rRRY2VV2R2VV2RtFRm~=r2€2RT~22RG 3Rf]UV2sANFf]U>VU; tA ;RtB vV4 FFFf]Uvdf]URsRR:v_ f]URW sRRvk f]U RVR< F~E 8vm RV~M2ʃNV;Vr FRv 69R@RH;FuFRVRP f]U F~u V2VF~U@tF~}uF ~}uFF2V2ЈVF~U@tF~}uF ~}uFV2N2ʈNVVFf]U~ VvT@t~utuVVF~t V2BBVFt5V2 rAvN FsF2ຢ+2RF2FFu V2@V2N2ʈNvAVv1vvvgP!~UV~rV2€2RV22R~UV~rV2€2RV22R~tV22RV22RV2 V2rV3Rlf] UVV~U2RR!R s~}u}u~EvRf]UVV~Uv~Uv~=uv~}t9}u3Uv~Uv~}tUv~=uvf]U VRVRvjF2ຢ+2R?VV~}uXFu3}u U2RF ~}u3Ru3Ro ~ud~}u U2R ~u-~u UtA2Qvvuvf]? >uF~}uU2VBV~}u }UVBVV2Rmr ~5~u~}ug~R< F~E 8v~U22R0~U2V~rFv6 VBVJ;VuVRP !~}u}U2R~u3R@f]=FRRvr>u F FFf]+RB~u 3RaRWVRVRv7~U@t~vv~uFF2V3u VVv~u(~u~U22R~U22ROf]U2BR< ~~=2V~r"~>~v<~@~H;Fuf]U~uF> 2R< >U>u >E>u >E~ 2R< V~EE NMNMEEE EE>u2(6R s >U >R~U2RR!R s ~EEf]U>U !VVURqf]UFr6!v>U tFFt#V~RU VU ~uEV~U !VVUVUEM:NutN2QQ!Q r]~rB~UJUUs>~u7}u >Rq&~U;Vt}u 6V;|t >RqV~U:Vu U@t Rq~Ut}utt~Ut Rq]~U tQV2RR!R r~U ;Rt Rq#~U !VVU~t uf]U<:6V>4t464 $R< 66V~NM#t68f]U<6f]U:2!rf>:>6VU:2B:f]U~t)VVVV~V~u~4F4f]U~UV~=uR!R1 1 ~~U~Ef]UVV~U2!rv~uU2DBUf]Uv~U2~Uf]UVV~UEf]UVV~8UEf]U~=5vP f]U:2u2>6}tE666P >6: >6E :2:>:>6Ef]U~t#~VGGWP VRP VV׍f]UU~5U~u~UV~t~VuVRP VVۍVRP  f]UR< ~~V~U~UEf]UVV~U2u%u|tE uTU ~r~U2Uf]Uj;ru&lR2#u >j >rf]Uj@rhREhR>f]Ur;jt;hujrlR2#urf]Uj;ru hRrf]U>ar>{s 2f]Ur;jt;hu'jrlRv2#u>rr>Ar>[r>ar>{s/>0r>:s> t> uf]UM>tf]U>uB>%uA ʀ>?uB р>@uA ʀ>_uB р>$uA ʀ>.uB шVFf]U~>~ƅ ~@~= uN~rgP>.tB>~uA #ȃ>~tB>u@# s~>~~>~t 2;~u>~u(>uBV>.tB# Vrءr>u">uB s}7~f]U>tMf]U 2VFF~VVVBV uۍf]UF2#tcF>tSFuME6R s >E!R6 s >EF릋VVFf]UVVr 6!v>U:Vu3~uv<&vR s ~U ~Uf]d=> u Rq:u:tf]>uBVFf]vP f]vvv~=E~=!U>(uB~U̍f]覨F~uR< > zU~uR< v Rv VV2}~ UEE~xUr~Eh>u~E| U7V~}u-}u!R$h>tF vRR-F-~}u > VUf]觥~}ھh>.uB~U sM>zt>zu/vRRvhtڹ>zu@ v3RR svRRi2u(>?u!vRRFu KRqs(>}u}u ev vRR\2u7>$u0v R V~RUVU!UE RqvRRf]E V2ʸ3Ff+ЉV v4htڹ>t>ur:ti>ArB22+ЃЉVV2;Vw Rq ;Fw;FrV;VwF2& F Rq:tn^7R3Rf][~}ھh#>0r>Gs>:r>As>Hu URy>Ot>Qu URay>Bu URG>Du U R|6>.u RqU2ʃ2+2QGf]肢U~}ھhF F4svhtڹF~r&VVFVBVJ;Vu Rq*2 ~u 2£ ~vR3R/f]ΡM>u v]? >"t>'u v(?>.uB~#U4#s vWF2Qzzz z!z"z#xz$qz%jz&cz'\FV]w'v(v)v*vŃ+v΃,v׃-v˃.v/v9vÃ:vZv[wv\v]wq~EFt >zn2䣂v3RRvRRf]oRq~=UV^7~=UR]~=}Vf]0 ~}uU~}}tU~UVNN~~vTf] R< ~~V~E~ UEEEEEEEEEEf]胟Rq~}&f]d~}uU7~UV~}tU~Uv~E ~vTf]~=U> ~= U f]Ft~}E4E~UV~}u}t Ut9~UV~UvT~VU~UvT~}UvT~}}u ~}| U~}Uvt:TtAr~UvT6~Uv;Ts~)U ~vT+U~U~}E4E~}u ~}E~UvtTf]Ν~Ut}t *Rqf]覝~Uu -Rqf]脝~}u #Rq~}r | U ~ Uf]F ~}t}}t~}}t RqV2U~u7Fu U~u')Ft U~u^ U~uR ~}Uvt;Tt Rq~}}t ~}}u Rq~UV~}u~}t}u~Uu}u ,RqV^7~UR\~}UvtT~}}UvtT~UR~UvT~E2U~uK%~UV~}t}u "Rq~}}u}u~}Ut +Rq~}U#!V!;Ft $Rq~}Ut.~}Ut}}t &Rq &Rqo~}}t~}}t 'RqL~}}tvtT;Ut (Rq'w.,u****+++ ,++L,o,~}UvT~}t }UvTf]螚~=Uu~==U2#u~=Ur~=UV~}t 0Rqw~=E~U V~t~u'~==}t .Rq ~==VU1~t~u%~==}t /Rq ~==VU؋~U~;uFt 1Rqv^7vf]蜙v~URvv~URv~}UvT~}UvTf]QT^7VR ~=}u^7VRFV2RRR r&~)t~(u^7VR ^7VR~VU~t ~U~UV2U3RRj~ u V#VV~u V VV V3VV~VU#U3RR(VV~Us VU VB~U~E4EU3RR~Us Rq~rFF V~u F3vF FfF~VUURR{U3R.U R3Ry~"u~}t vUTU3RGURU R3RDUR~}t~!U~EVVU3RR~$uFf~E~u RqF3v~E~U~:UtAMVV~U !VVUEVV~U !VVUEsVV~EUuE~U !V!#VVދVމU}u }u}u~UuEURRVV܀~u ~܋UU ~܋EeEVVڋ~ڋUVVR#^7VR.~ڋVUVVURR~؃}tS}tMUVր~u!vր|uTU~֋U2~؉U ~ր}u U ~؉U ~֋U~؉UBtFXVVԋ~Ԁ}uB2}tB2‹UʁNtAVtAȉNVR-^7VR8~VU~Ur~=Urv~ u UVR3RAU3RR~u RqF3v~U \VVURR]~ҋVURUVU3URR7~U !VЋVЉUVVUR3R~΋Ut}t~Ut ARqe~΋VUvTtUuE~΋U!#ʉN̋vT#!VʋV V̉Vȋ!#VȉVơ! FƉFċVĉUoUR3RtV2fV;VuANoV;VwAN^V;VsANMV;VwAN t R~=Uv4t~=Uv4T=u~=Us ~=Ef]TFF V~t%~U2RRR ~ЋE4#ˆFFt ~U2JVU~}t,~Uv:TwFtV:VuFtы~UrNjF ~U2#u~}UvT~UrsFt?~UV~=u ~E~=UvT~U2~U R].~U> ~ U~M2t MvLf]$ FV2tTHN~=}UV~uUV~t)~t#V;VuF~}u U;VuFFt~=VUҋ~=}VUVVFf]荎 ~UV~UЁti~}u}tZ~}tQ~}tHuA~=VURrFUvFVBVu~U2u~Ef]JFFFFFFFFFU Vʋ~ʀ}uN VV2U~ʀ}uF R~ʀ}u V2#t~ʀ}!uV2#uFV~u ~E ~U~ʉU~ʋU2V2V~ʀ}u V2BV V2BV~uFt?~}t6 z&U3RR;> V VN2M 7V2V*V2~ʉU!wr.:[:M:::[::F~ʀ}&t}'u-~uF!~}uU2RRR 4FV:Vs~ʋU2RRR sFt_~ʋV VFt$}&uE)~E(V2~ʉUF VV~ʋU2RRR sFUiFuV2N2ʃr Rq ~u UVRU,~U#"VȋVȉVFFF~Ƌ~EE E VV#tZF~t~tV~t~uBVFvغR"R s~2#t ;FuGF~E}sUs 7Rq~ƋE3V؋u|tB2BUl"#FЉFġ";FtV"#FЉF¡";Ft ~EEFVЁ@t~ƀ}tFFF~u ~ƀ}tFF~ƋUVր}t~u~ƋU "VVU~ƋUu~t~uU2RR "R r/~ƃ}u&~րsBE4#~ցsB# ЈU ~ƋU~rA#ʁ~r@4# E ~t>E 42@F΃~u~u}u~t }uF~ƃ}tF=~ƃ}u }uF~ƋU UUʁu}tFuE:""#FЉF$";Ft)~u#FFF~Ɓ}u uF~ƀ}u'}uE~ƋUu~u FFV2RR&"R r ~ƃ}ud~ƃ}tWu| uH|u7T VҋF2HU}u}tE~ UEF 1RqUUzV2t~ƋU  VVU~uLV2u/~2t#~ƃ}u}u~2 H~ƉU~ƋU  VVUV2RR("R s2~ƀ}t)U@t U2U~ƋU tU2U ~ƋU@tF~ƋU tF~ƋU#*"V,";FtEEE E F~ƋU#."V0";Fu }t"~t~E}rBU E 4E ~ƋV҈UVΈUNԈMN؉M NЁtt 1RqVVFf]腆~U2t *Rqf]b RSFvVV~Us}t +UBU~UVVRP Ff] RFVVt,~Ut Rq~Uu -RqVVFf]軅ً2#t'r Rq>U VVVU;f]u ~ً2#urt RqVM2]~U@t IRq~U 2"VVUN~}uU 4"VVU Rq(Rqwr.BSBSBBBBSB;f]諄t 66"؍f]荄 ً~UrT68"vV~xUE~uE ~VU t~U6IIV~Ut Rqf~U:VuU;xu}u~tU ;Vt Rq2~U :"VVU>xu JU~u~Ef]蘃׋2#uF؀>:t Rqgtך r RqP>xrUR>E6>xr Rq$>xuxUR{URq;f]Um֋N#tV#tQN#tV^>,tٍf]Ut RqFt6<"3R>EV~EEE EE E"E$E&Ef]Ut>U u Rq>}uUV~}t;Et Rq*~U>u>U f]U՚ r1rR>}t Rq >t1n>zt Rq\q՚r RqE>U2RR>"R s!>E >u +Rq Rqf]U sVV~}t Rq&~Ut~Ut Rq~U @"VVU(t Rq6B"R>Et<>U D"VVU>}t>}u3SES#f]U>U ut Rq>E Hf]U Ӏ>:tG s2>zu ~~DžH~@~=u Rq Rq,r RqV~} t Rq~}t Rq8Ӛ r9r RV$V~}t}u Rq>zu>E DžH>zuqҚr RqXV~U u Rq:~U2RRF"R s~U@uE O Rq Rqf]Ut*~Ur #Rq~Ut ,Rq;Ft~}r 9Rqf]U~V~UsU ~=:U uAr Rq~=U ~U f]Uut!^ uu tvnv荺uRf]UFЋFF2Pf]UVV~U2s/:Nt*M2t 3QR&R&ƅ:&2B&~U2u DRqf]U&2r _&&V>&VGG&f]U VV~UVUs V2+ʈNV2~UE}uB#VFtvBË~}t(Ftv-6H"EuRvM&2;tAʑ&6J"Ft6L"f]U~UV~u u~Us}t +UBU~E&2;tAʑ&}uAEF~r1F&ƅ?&2sB&-VBVJ;Vu~Uu uN:~}tE~}t Ut:~}t&2;tAʑ& & 2B&6N"6P"~}u 6R"~}t6T"~}u6V"VVuFt~}tRy3R耾R~}uR~}u RFR~VUf]UVV~U2s }uE~U2ty#u} uo~U2#tu~U2uEvD~U2u Ev*~}u U 2BU~U svvf]Ut~}u Rqf]U~=U2u8Rq~=Ef]UV2~;s#s 7Rq 2RqV2~f]UVV~U2u} t <Rqf]U~Ut}}u =Rqf]URf]U\ u>p u^ F>t>>U2s.~:Mt&#uF>U2tTRq^ V2VV2Rf rA #sR艻PRFL 2RN Wt Ft3R^ R^ f]U\ ^ 6~u^ f]U r2VVV2VrV~u>LuB2N2ʃN~u+>pu$>}u>LuB2N2ʃN\ u^ V2 rIN2u,uF V2uFV2uFV2s@^ V2uV2s r^ ^ t$FЋFb t@^ ^ uV2tA>u@~}VuB# ђ^ ~u!V2#u>u}uF^ >t'V2t#t tu>} r^ >t(V2tuV2s>} r^ V2t"N2tt>u >pt^ ^ t$FЋFb t@^ ^ t3V2A2RV2A2RFЋFb P TRq^ V2Rf]U r3V>uF~s FF~sFt ^ t3RPVV~U2RhV\ t8^ t1~E2E FQRF 2R WV~U2RVVRu ^ 6f]U~E3ǀ> t>;u ~E~E~E~URxV~U2u 1Rq~UtdEF3vT;NvUs 2Rq~}u}u}t U2t *Rq~ERf]U FUp2F>Nu>OuUiU3RwU3RFu RqF\ t? rARN F#sR;PRX 2RZ R訴U\ t3RFu RqjUU3RU3Rs>t 4RqE>NtU>u 4RqFVUyp2RRX"R s6l>pu/~}u U3RlURb~}t 9Rq>pu4~}t}u UR/U3R&~}t 9Rqcp2RRZ"R sDU3R>pu~}t}t 9Rq~} t}t 9RqU3R~U2r 4Rq>pu$~}u>Lu URURU3RFt Rq]>t 4RqKU(U3R6U3R>,t RqU>uFt 4Rq~t ?RqmU>Luy>uU3RU3Rh`VU~} uURURB:6~}u URU3R~}t 4RqU3Rf>uUR`U3RNVU#~} uUR;UR(6~}u URU3RU3RUFtURU3R>t~u U3R2r3~>~r~%Сr+@rURVV>,t RqU>t 4Rq~tVVU3RBVR>U(~}u UR@U3R7~}t 9RqU3RU>u>Su URU3R>VU6~}u URU3R~}t 4RqU3RF)w.YTQXVtR^ f]U ~UV~U2#u} t;~}uEU  VVU~}r,Rq~E~}uU;Jt}t @Rq~Ut }uE~}t}u%Uu~U \"VVUv8~}u5U tGRqv~EE v~El~}t}uT~u~uRR~}uU2R3RU N2Q~U2R3RU N2Q 9Rq~uf] UF22P`Fu~UV~UvT~VU~UR~U RR~}U2Rvtt u Q~u~}} uFt ;Rq~}U2u#}U2RR^"R s Rqf]UV2uANFu~UV~UvT~VU~}U vt:T uArTs RqV:VtA2~}U 2ЋN22Q~URtFu~}U2Rvtt u 1~ulf]UvRvf]UF~}U2u}}u v3RFFu vRvf]UFu~UV~UvT~VU~}}U2RR`"R s Rq~U RR~}U 2Rf]UFu~UV~UvT~VU~}U2uvtT :U uAr Rq~}} u)U s"~}U2uFu vRg~}U s!U2u} uFt v3R9~}U 22R~}U2Rvtt u C~u~f]U F~UV~}u}u FUVc~U;VuWUtN}tHRBB;UwU+RV~sF#~R+UBBV~s F+VVFt ~}VUVVFf]U FV2RR2 P sF>uB~uB2u@VuB :VtA2푺+ЉVVVFf]U~t~t CRqf]U b"Vd"V~}U r+U#VV~}U#VVV;VtV;Vupf]U~}Us#~}Us~}U vtT ~}U vtT ~}U r-~}U s U2V~t~t 2Rq~}Ur~}Ur #Rq~}Us UvtT~}}u }uEf]UBFF> u~hU3RFVR׉F2RRf"R r#~}s}rU2t 9Rq2RRh"R r vv2RRl"R sVR2RRp"R rvz2RRr"R sv^ދ> t>t2t t>,t RqURFVR։F2t>t vvU2RRv"R sVR)>tv> t#~}s}rU2t 9Rq2 6s2tu RZ VV~Uu -Rq~U;Vt 3Rq~U#z"Vޡ|";Ft 4Rq~UtU4#s 5RqUr 5Rq~}uEU ~"V܋V܉U~}sUVF6~}u Evv}2u~}u Uu ~U2u!}uU r~U 22R-*~U 22Rv'܋~}t 4RqvPVVڋ~ڋU2R2Ru *vhZ VV؋~؋M2tR~؋}U2:RqV؃ RR12Xu~؃} u ;Rq~؋E 2XuAȃ2QO=V؃ RR~؋U 22Q+wu.e?eeKee?eo~؋UsvS~؃}t}t 9Rq2Pu@p2P~؋U2R2Pu@Pu v. VV֋~֋U 22R~֋U2R2Ru v >Xu>X}uˋ~}u}t 6*22R  ~E v VVԋ~ԋUr #Rq~ԋU2uU sU 22Q7~ԋU 22R~ԋU2R2HuAQu v! VVҋV҃RR~҃}u}t 6e2B2RV~ҋU22RH2utvVVЋ~ЋU2u!} u~U 22ʃ2Q8v ًVRR~U 222Q~U22RrvVV΋~΋U2u!} u~U 22ʃ2Q8v؋VRR~U 222Qa~U22RS~U2t Rq&~}U2RR"R s Rq~U2u 1Rq2t~}t 9Rq6~U2Rvt u VV̋~̀}uEv8*URRRR~UtAUN~}tB# VsBVRP hv VFFURR R(R VVʋ~U2s(~ʋU2tU "VȋVȉUuE~U2t~U2us}U2RR"R s 8Rq~E 2E 2PtUHvVVƋ~} t~ƀ}u}u Uu4U~U 22R(ߋ~U2R3Ru avvU~U2ut}U2NURh[~} u~} uU2#u URUR,UR"Rqwr.`k kk:k~U2uo}U2JU3RX~} u~} uU2#u U3RhU3R}+U3Rt"Rqwr.kkkk 4Rq~F~U2tu~U2uJ} uDU2u~U 2¨2R~U 22ʃ2QF~Ur~Ur #RqUF2u~U 22RPj2PR"R s~U 2€2R9~U s(E 2~U 2Ё€2R܋~E 4E R܋~U2R3RU 2QvM~U s~U r 2Rqv*UVVċ~ċUʁu t Ft~U2uQVRVR ܋2u~U 22AA2Q0܋~U2Rvt u fvT~U2t 4RqF}UVVV~u~}u}}u~}t~VV~UVE~u@tv&֐&vv~u,@t%v.~t ~&V~VU> u> t@t Z8&~UV~UV'~t1f]U~t@Dt2Bt+>FU;Vu U3R>FU~UUvUvf]T~}u VRP 7~}u}t WP VRP ~u _VRP f]YTv3SrSBf]?T~tsVV~}u$Vu~&F7~}uE2~~}E~}t~~uf]S  >tB&2+ʑ&R< F~U ~U~E~U2V~rFvߢ6ՋVBVJ;VuVRP f]=S> tX6&~=s&242@@&2Ri ~5J6>&ƅ[ 6f]R>&ƅ]5f]R>t&&2r 5&~}uu{v>t5f]lR~}uWvf]HR>N}uVU$>NUV~}tUV~VU>NEf]QF~}hV楚s9>}u}u~}hvhtvhtFW>+t>-uF>t >.t>.uB~UF>EuF>.tFt~E>tԀ>t̀>+t>-uFu>.t~h>u`>;uB>,uA ʀ>)uB р> uA ʀ>>uB шVhvFuvhtVVJFf]YP~Uvt~Ef]2P~=UvtV~Ef] P`F脣ۢUԢ>t>.t>Et>euUy豢Ur誢>tVRVR3RVRLg~v` u4~WWa_s RqFF~W~W$#>t,u~W~Wa_s RqF>t,uFFVVFF%sUFS22RUFS22RVBVJ;Vuf]N R>-uBV蛡>+t>-u芡]>ArB22+ЃЉVV;Vw Rq~E2fFV2V~VUF~}~2fFFV2V~VVBV uƃ~t Rq㠡:tMFFt\F~}~ 2F+F~V2Vt2;Vw~t RqVBV uf]M`2ЉV>t RqA>uv~E%sFF~=UvD藋V2V~s~Ef]Ly>-uB2~EF>-t>+u褟U7蝟~E23#t Rqf]LF~CVBV u~EIvht>ti>Bu URdJ>Ot>Qu URL2>Ht>Ru UR4>Du U R# Rqʞ%~UsU>t.t U RU R< ~E~UV~Et2U,~6U U2V~rF~s$VBVJ;Vu~U2 t7BV~ s-VV~S2#tt RqVBV uٍf]K'F~}u~}VU ~}VU~VU~}E>uOf]J ~u&ċ~uLы~}Ur}u~}EHRq R< FVV~EvtT~URP ~EEEF>u >(t RqUr|S ǀ>)t萝眀>)t RqԜVVFf]I0aFFF>t+t>'t >"tBt聜~h~~gshv~~VurF R< F嗋VV~EVU6U >~u Rq-VVރ~r!F뛋22R跗VBVJ;Vuϛ̛>t+t>t/t UsU8FtF>t+uV؃RR΀>t/t9>t,t2~؋U2RR"R s *Rq~EE EBt MRq>t+u>t/u~؋U2t}u R< FVV֋~Et2Uq~֋6U ~؋U22Rw~؋U2  2Rg~֋U2Vԃ~r~3RJ~@~H;FuVRP ~؋U2t#u} t 4Rq>t,u~؀}t}u~E R< F~E~VUt2~؉U}r#}t *Rq~؀}u Rq~؃}rBU Fu%VVDtBu~EEVVFf]EF@v3SuSx@~}u ~vT~}tWDt Btu$~Urtv؎r JRq~Usv'DtBtD6VDvv_~}u }E ~E2~Urt~}uu軋v~Usv.vR>u7f]HD B4#DFt Ft R R蓐 RR膐VFUStZt2~UFt9~} u0>Zt 6Z| >FVU~E ~EFZ~VUf]|Cv3SESef]bC3RRVVV~}t Rq~}t Rq~U "VVURFVV~U2t #u} u ~}u 4Rq~UvT DML MLMLM;"t#u~Uu~E~EUs-~u ~=&}VRP f]OBF芗3RR諎}V~}uU:VtFF~U~}E =Ff]AvRr RqX~}u踐[~}8Uvht&}>;t> t22R;`3R0f]oA谖~hg2u >$u2#u>;t > t5 s-URr Rq~U~UgU3Rr RqQrt Rq~E.~}uU~U;t ׌ vFhvVRXFFVV~U2t #u+} u%2 tu~U2u}uVRP U 'VRP hv&rf]? VVF~U;uF^VV~U~;UtVV;VuAN~}u RqF ~UV~}u }uFuFu SRq~}u}t 4RqFtVVFFf]?r;jt#>E8lRhjrf]>>Vu ERq+>VU2u FRqR3u4ƍf]>萒2#u Rq>t RqRf]K>RU"#ʉNVU Rq1>} t RqVu!~EEf]=詶F~r~sF 2Rq2R.yxf]<~ t:tF~:uANGGr uF@rFf]<>u> u RqrBRr JFf]B<>r tRW1 rߚ1 gf]<>;t'> t R񭣊>Uu -RqLf];>bu RqRf];>Xt@JJtFFf];R~U>~S~>t>;t> t>~ uҋ~VtV R< t>tVU 6tVR1 r nRq/R6FW'H^6t1 >tU VtRP Ftf]: r R'V~}t}u3R߷ RqVsV~}t}u >Vt;Vu 3Rq~Uu4u->u>t >U~E~U "VVU>Vt >VRU~VUVERRTv>;un> ud=  >'t跍>'t Rq~}"t-r Rq~U";t Rq52#u Rq(r6"3R>E~U"詋BR r6~R"R s8~U2u |U ~U:|t:U$u2#t RqV6~R"R s-~U$2u |U$~U$:|t Rq~E&~EE$ Rq9f]O8t Rq9>u Rq't B;u f]7>u Rq6;u;uB>t >f]7>>t > tRr;FuBV>>t Rq,Ff]B7 R< F赊FF>>uVVF> t ~tԀ>,u̓~u RqF~VVV> u@Ff]6 UXFUQFvv< FVRP VRP Ff]h6t24FVݯ tBV̯ uBV/rF>U tAN>tuF4FN@FF84F<0F>tuF4F%wv.ӑBSdd-88u2 u t >t>s >tFtf]65?>:u5FF sF>u  FFt.>vuB2>vuA2+d>duFFf]4r2#uPPtR/褈>:u蚈 s>vu >vurf][4\t\ۂJFf]04s"3RׂbhR6Fi ZJ+r>r22R螂r> uf]3~=uPzFvq2#u!v艃~~=u@PF*rv>rr2 uRtFFuPtPtVReHbf]#3 R< ``V~E>t!uE>t"u ~E~E~Ef]2R< F~M~8U>`}uVU!>`UV~=tV~Vf]o2x2#u> t>;t RqP\R< F>`=uV >`V~=tV~V~VBBR|f]12ʋF3#tvP2ʋF3V~ r@F0FV2RUf]1)FUvf]y1 \FFF;>%u F>'t>"uw22R:u&:u22R:t> u:u22R调FF>>u*~rBVF4F~ug~rFG>!uQ;>t>,u~uBVF4F> t>;uFFFt 22R~Fu3R~>u菃>u,f]/ ut_><uBVFt袂F\>,t Rq>t!u,Fu Rq3S S萬>>t RqFGFt@>>uB2><uA2+N~t> uF 22R}'>t>;t> uF 22R}\Ft\>>u Ft軁r}JFf].~E~E~}uR~< ~E~E~vT~}t ~Us~E~UVFf]Y.7>&u F$FrVD`VF~V~tUNsFV€2R|~UV~tFuU sFV2R|Ft V Ft&Rp|r;Vr4NNVV;Vr#F~>~22R=|~@~H;Fuf]q-J>&t> t22R|f]A-sV3R{>`}u)>>u|>>8U>><U6`}bFR6FG8JSr>;t~>;uu>ru  '}2 t u6;8u:2u١6;8u:2u  r2 t6{:> u~~(22Rz> u~S>'t>"uE22Pz:t> u> u~F|22;t6z> t5ur(}>&u>&u 22Rdz~4~F> t RHzf]+~}}t~=UV}~U2BU2rX~}U@V?Rh?Rhvxg42F~rF~(rhVBVJ;Vu2€V~}UV~t)}t#VVF~VVBVJ;VuvVR{~}}u'VVFvzVBVJ;Vu6g!vy2#t6g2#uߍVRP f]<*r~=uPFvy2#u!vy~~=u@PF6vcy2rUO>rr2 uG|RtFFu PuwPt+~}u VRP VRyHvczbf]^)RDb`}2#u> t>;t RqS\R< F>`}uVU!>`UV~=tV~V~VBBRsf](6^~r%R R~V~} u EE>} t RqE>t{>R\3SSsv\2Rw@\JFf]>(F@t$<| s>tuF3S&S4 Fu@t\2Rv@Fu rf]' R`\>3S S>`fU>>E8>8uR< Fvwvv2Vvv2fVRP \;Fs)V+ЉV~rFo3RuVBVJ;VuQ >>E8bR6Fk^f]'VV~M2uM; u R]vvWvFvVRvf]&>U VVVUf]&~=U2s ~; w32Rqf]d& mz2#u,r6" R6"oR_>} t RqV~}u~}VU ~}VU~VU~MM~E~E>:t RqUFCx6y>=u w?FF~VU~UVr2RqFVRVR~VU~u ~EF ~UV~U>uxf]%FF6zr RR{6",^>}t RqFF>EVU S迡VV~VUuE F ~U ~ rBB~UVUMNV~rH~VV~U2)VVU E EE EUV~@~H;Fuf]$~}u LRqt{w>,t>>u~}UVv*oFVR~UR ~}E  fFV~U~}UvT>uwf]{# Vv>>t RqVVFf] #BDF}ut+t/Bf]" R< ~~V~EEEEf]"6#xrRRx>E6"[>}t Rqy>U "VVUFFV~EEu3SrS͋~EZNW%\DRPRJFf]!F st2RR"R F5>u.vv svt2RR"R FFf]f!3R6FZs:JD>FuTU>FRU>FE)^PRrNuNR>F}NUNR>NEN>FUV~Eo܋>NtU NRq>;t> t NRqf]  R< ~~V~EEEEf]C V2Rq~uxˋ^7~URf]  ~}uLRqrWq>,t>>uvVRZrtV~}EtՉFFt ~}u UORa~}}u }}t UPRA~}t}vttT:Utt UQR[~}}U2~U~U2~;Us+VUVV;VrF~ Rm~@~H;Fu~U~U~Uvtt:Tuuu tT}U~}UvT>Vt >TVUFVFT>urf]VFq>F}UVBDUqSLBD~t!UTR>TET~UVـ>>t Rqp>FUvf]BDFt0>FEuBDf]URfRU *RFRU RZRU R"RU >uR"RU "S3S6 >tR"RU "S3S6 , 60jR/ , >2tR RU 62R/ , , f]U#FV# F r=uu u%>t4>bt->t>u>=t> u>Ft untFt?>tTVRVR' "S3S6 R"RU >bt$+>tt#C~!~>~ uu6~R/ >~ t~+R R/ >sPR/ , tUf]U~FFu:*n>;t> uF!~FU~~;FrBVFt ~0 ~2 f]U, R RU f]&ou2Ml2#u Rqc2#u Rqt RRflxo3 4#r|o]o roeot2&3RqE4>VuB s 3Rqr;Vt 3Rq_V~}t 3RqER;Tv~E ~TU~EVEV>Vt >VERR_nn s">xtn6xRe Rq'6nr Rq]n>uRzeH-C!>9'4T/*+v.y!'c6EnsOm >t+rB#Ѐ>t0sA#s rl>}u|Q rm;9=wv wv w9vڃ:w}u r>vt>vt u|t23SGS覔b \JV7PrJD3Rq93-3SCSd T>;t> ut d>+uiit<K>,ui?艐~>~ r>~s~ 2Rq=u >,u&C~>~s>~;t> u 3SBS辒{t\ow.C$IOE=ֱ-K%l5S11111111111== 7[ݱݱݱݱ{s ##` s8e5 #s'S#s,>}u}uEE Rq2#tt Rq^t^5t+> t$>;t gh>;t> t Rqjhf]`rvRR1 F2Br>rƅ > t> urFt+r>DuH&R"R1 1 Lf]RsJf]f] HLJBV2RR"R s%\VR< Fvcc`VPJtJFVd FDFFLtHHuWV286vE6tr  u>rƅ rP>Xt >FuF> tVHuIF2#83.)b$v.Y*/49>CHrHuHBf]Ff>u/.ge s t:Fugs ;FuFFf]U5R6Xr rTXV~}u6R+U VU;Vtt Rq~VUEXEJNJaf]1rfvR]V~E}u(}u ;XtXUu~EXf]fd2#u>;t> u Rx. r Rq>xs Rq6xH>uR:JFf]\~tTVVv~5F~Uu%^#tW#tQP^O#tWv~uf]FUF{VBVuf]UVV~U2RR"Q s%~U}u UvOVV~U#"V";Ft UVV~} uU"#ʉNVU~U##ʉNVUf]UVV~}u@U2uE~U$2uE$~UEv1O~Ef]U~}uWOf]U~U@tWPf]iVV#tQv~uF~Uu'^O#tW#tQP^O#tW_v~uf]Uvf]U;r f]U, f]UV~U #VVUf]UR#RU f]U~t v#R/  #VV~}2V~r'~~}>~>~~@~H;Fuߺ RRU jf]Uv.I>}uUs R*#RU (2R)RU f]UuJRf PU , R,#RU Rf PU f]U~} uvUumu>~HR8#RU , 0R@#RU , 3Rvk~uC>~r ~f]U ~UtAuJRT#RU , Rl#RU , R#RU , c3RvVV~}uu;~U2R,~u!~u5~}uc>E>tPVQRh~u @~U2R1~u%~u~E:>E>t)VQR~u }~EЍf]U VvR~uDR~M2PU ~U2#uU$2#uu& Q~U$2#uR#RU 6R~M$2r@ ɺuB+PU ~}"tnR#RU ~u"t2U}rE~UV~r*~R~}"U~RU ~@~H;FuܺR#RU u[f]UVV~U2RR#Q sm~UuaR9~}u}uU3RyB3RvRR#RU , ~E>tURA>E f]UR#RU vD(2R)RU f]URVRU vf]U F~~ v44;Tu~BV~@~=u֋~=V~u;~} uF+~}uF~}uF ~u~tRfPU f]U ~=UV~~U23~}uR#RU R#RU /U6#$U6#R#RU ~}u }uR#RU U6#~}u<}t }UVFR#RU ~t~2RGWU t~}uR#RU \R#RU ~E8R< FvbVvU2#tRRU vUۍVRP %w.qX/~~~cnnnnnq~}u}u%~} tu ~}2RGWU :~} t} } 2RGWU V@t R#RU Vt R#RU f]U~UtWFtf~UʁuXuR}tLR3RvUVV~}uu~}t}t}u ~un!f]fb2 LJBD9:BP~~DžH~@~=uRVXt2 +£3RR`f]>Vt`u RD R1 1 R#RU , VV~t"t3Rv1~UV؃>Xt`uRR R1 1 R$RU , sXV~t"t3Rvk~UV؃>tYtu Rb R1 $S3S6 1 Rb RU "$S3S6 , f]>u^>jt?~>~i~@~= u rVr2#tÃ>uAR$M 6CBRP f]?   R R R 86v1 t^RR' RR' RR' t60jR/ RR'  u3SS>t6w>E3SظSx3SSnrU2t&63SBS!63SһS3SgS3SS 6 Ku[1 R R1 1 R R1 1 &$S3S6 R*$R1 ,$S3S6 1 R RU R RU 0$S3S6 R4$RU 6$S3S6 {tRR' 6x1 >zt 6z1 >|t 6|1 f][2.Cv˷%tހ!t"u0tS"tP:L"tD@ t::uw<t$ƿ@ tNu FtF3[À} u 2[#LP D=st6R V T -TD tPRV+^DE|ZXJut@=sË>ǣ,;s!KK63;6t$E> Ë6R P 3 t;u|B t ]\à uB3HP w3 t;wt t +;V rˋދtߋًw t3t$ +;V r @wD UTËLO @ËDK Osusvss isO ׃PP 6R | tT >T }t}E݋6T <t;GtP @@Eۋt uX t;uMOË_g uqsCtOrP @M#t+t*rˋ6T u>T ˋDE|ˋ|= T t ;t_ËP 6R ;t FFf]lf]af]Vf]K ~~:uANFt:~2V~r*F~~~~:tF VBVJ;VuۋFf] ~~:sAN~2VFt ~2VVV~r?F~~~~:t~~~~:sAN VBVJ;VuƋFf]`~2RGW1 1 f]8R$R' f] R$R' f]f][2.Czt6zR| R(1 f] >zuVV~sFF~~UV~ uz 3z +z z z ; r F~ u>x u6zR~ R(1 6zRVR(1 Ft~ uB2z @z Fx VBVJ;VtYf]>xt6xvv(1 f]VV>|t6|RVR(1 f] F3FF3V~t vv~EV0~Mvtf]g FUvVVN#tV#tQV2RVRN#tV^f]x z f]f][2.C u!܋_ݍF G _U]F; r U؎v ~Ns]U؎v ~NNO]U؎~ NFs]UF؋v F ~Ns] UF FnFr@]UF fnFr@]UF FnFp~t@]UF nnFp~t@]U^@%]U^];>r;>s E;vA؎X> u[X& . &/ XX[PS / XX[PS / XX[PS / XX[PS / Uv ;vwvN ,r3]U^Ӌ^~ vn &FE< t<t &C3 2ڋ+щ] U ' g O ]Ru t/U=!]rGhb :3%WSK [_u)!! uωE3E!E#밋2B t@!ËG!P_B2XË]ju  t*U<!]r GU %WSK [_u)!!! uЉE3E!E#봋uFuD2$N$:tN2+FSWVP@K X^_[WWGF_ËuG!ߝGuS [ u ?t? r3뾴0!, ˋM t2]uGu)W؎r W03ҋBW tֻ@!;F!QO#t tWS@![r;tYËW!(!;OtY  ˋLT#u ˋLT]uFM2Gu1:r&< t< tF< uI!r +3RB_VwG=rRQWYZwr @G<t ^ t S?![!R'Q!YZ=tw uË\G t 33ҸB!ˋ3G!G#ˋTD5 !E2令۹ PlXPQRW4% 3QPWŕ !_XY_ZYXY[XSQ%?& $ U 5]SWPQR2P3=r2ZYX_ tރ   \6 P2X6 [S w t6 O46 P X6 [ð   tPSQr Y[Xèt / t / t / t / UFŎ]6&UVWPSQRӋ6_6GM݁D‹<3Ћ‹G$3Ћ‹GG5GG ƋՋ~ف6$ZY[X_^]  t4 T ut'|D5rpt+vr\' . t[ utST<~rBt*vDss "6 փ  X33ۨ?u@u춀usTEuͩ t DD\|Ë > 2D\\'] t É> 2D\M} t;w t+=6w߀ PW2ҭȭح tc| tыˋ3wtHr#|+ t֊͊ߊ2wt#Gu?t ^?t XPXp+4L\|v@t@*4L\|v3@ uvt7ً3uwNJ݊Ί2җws(NtlׁrFtdځwwrtvFt1䀀@ԋNj> 5M]EUu3Ѐ@ȋ؋ۋ> EIÉ> D t݋M t֊|2}- v=s PJtXsשu@tE> > DM tu t+x=s|2} P2ɭحЭ> GU=W9W5W1 ‹tX[_]M> EEË6 3;s\ u;w;R3 tP t tZ]蕒sO    sO+     ‹ ɊD2 E U3ۋ  ʋU tU3D t tX PD t U t3ɋ tU tыD t t X P t& ʋ t& 3ۋD tU tӋD tU t ʃU3E t& ڋD t& ڋD tU t ՋD& E t&  & ŋZ^ ]Ñր tm tc:s֑*܀wQ2ۊӇّ2Q| t3ۀrt:~' t֊ߊwtu֋?t ?t psRuJg+׋s 4 uw uII tE3 uv8ފ2 x t(qwrt sty  ð3ҋ t t2pހPƊ2Ɨ܊‹SS X؃tXNjӋX x uth: u~2쀀*pP2ɊދV ‹t[며F;s3sNsþ+ЋsȭЭح ы%}3~ )ƁrwyÁƀ ëƫˌX[_^SPQ_RURUZRWVQz&%7= ;tU ;x7: =+uY^_ZUQVNgv9b^Y]UWk!Ήm!3ɉo!q!ỳg! uu!.h!i!W3x6x+P&k!ȋ.k! uŋr XȃrXg!P g!@3Vu!]7= 3+g!o!~ _9a=]23u! 77%9y!=Qx89!;: =û,0rf< wb2 wxc,0rB< ~,:k!}6[<.t,0r(< w$t ɀo!2À u q!N23 <-t <+tN2 ASM.MSF The Microsoft MACRO Assembler @  @ @ 2/8/82 Ver    @@ Segments and groups:Symbols: Size align combine class Type Value Attr  Open segments Open proceduresAOpen conditionals: (   Warning SevereErrors Errors   $ ABCDEFGHIJKLMNOPQRSTUVWXABCDWB E r r o r --- Block nesting error Extra characters on line ?Register already defined Unknown symbol type Redefinition of symbol Symbol is multi-defined Phase error between passes Already had ELSE clause Not in conditional block Symbol not defined Syntax error Type illegal in context Should have been group name Must be declared in pass 1 Symbol type usage illegal Symbol already different kind Symbol is reserved word Forward reference is illegal Must be register Wrong type of register Must be segment or group Symbol has no segment Must be symbol type Already defined locally  Segment parameters are changedNot proper align/combine type Reference to mult defined Operand was expected Operator was expected Division by 0 or overflow Shift count is negative Operand types must match Illegal use of external Must be record field name Must be record or fieldname Operand must have size Must be var, label or constantMust be structure field name Left operand must have segmentOne operand must be const Operands must be same or 1 absNormal type operand expected Constant was expected Operand must have segment Must be associated with data Must be associated with code Already have base register Already have index register Must be index or base registerIllegal use of register Value is out of range Operand not in IP segment Improper operand type Relative jump out of range Index displ. must be constant Illegal register value No immediate mode Illegal size for item  Byte register is illegal CS register illegal usage Must be AX or AL Improper use of segment reg. No or unreachable CS Operand combination illegal Near JMP/CALL to different CS Label can't have seg. overrideMust have opcode after prefix Can't override ES segment Can't reach with segment reg Must be in segment block Can't use EVEN on BYTE seg. Forward needs override or far Illegal value for DUP count Symbol is already external DUP is too large for linker Usage of ?(indeterminate) bad More values than defined with Only initialize list legal Directive illegal in STRUC Override with DUP is illegal Field cannot be overridden Override is of wrong type Register can't be forward ref Circular chain of EQU aliases A4C;DCENImLNOPRST.%DCEG&L,M2P8R=SDSSUMEOMMENTBDQTWLSENDNDIFNDMVENXITMXTRNFF1F2FBFDEFFDIFFEFIDNFNBFNDEFNCLUDERPRPCOCALAMERGAGEUBLICURGE EPTUBTTLITLECREFLALLLFCONDLISTRADIXSALLSFCONDTFCONDXALLXCREFXLISTOUTNDPNDSQUROUPABELACROROCECORDEGMENTTRUCAjBnDsFyN}QTWBSYTEWORDAREARWORDBYTEORDABnCMPSWTOMMONEMORYAGEARAUBLICTACKADEGH LM N(O5P>SBTUW^Xd.hNDUPQETIGHEENGTHOWTASKODEOTOTHINGFFSETRTREGHLHORTHRIZEHISYPEIDTHORTYPE    AT BYTE WORD PARA PAGE MEMORYPUBLICSTACK COMMONBYTE WORD DWORD QWORD TBYTE NEAR FAR A*C@DhEuHyI}JLM,NAOKPQRbSTWXAAADAMASDCDDNDALLBWLCLDLIMCMPMPSMPSBMPSWWDAAASECIVSCLTDIVMULNNCNTNTORETAAEBBECCXZEGGELLEMPNANAENBNBENCNENGNGENLNLENONPNSNZOPPEPOSZAHFEAESDSOCKODSODSBODSWOOPOOPEOOPNEOOPNZOOPZOVOVSOVSBOVSWULEGOPOTRUTOPOPFUSHUSHFCLCREPEPEEPNEEPNZEPZETOLORAHFALARBBCASCASBCASWHLHRTCTDTITOSTOSBTOSWUBESTAITCHGLATLATBOR      7? 8'/H6@wsrvrt}|~vrswsu~|}q{yupzz{xt𬬭ᢤXP(02 ABC!D5EPFTIYLMNPRS T9W=XBYOXM1BSDDDDPLDSTPHSLEXOMOMPOMPPECSTPISIIVIVPIVRIVRPNIREEADDCOMCOMPDIVDIVRLDMULNCSTPNITSTSTPSUBSUBRDD1DCWDENVDL2EDL2TDLG2DLN2DPIDZULULPCLEXDISIENIINITOPSAVESTCWSTENVSTSWATANREMTANNDINTSTORAVECALEQRTTTCWTENVTPTSWUBUBPUBRUBRPSTAITAMCHTRACTL2XL2XP1       WB MIS1.MSF WB DOSIO.MSF , Open failed , Create failed , Write error ? F!F!r r r r r r r r r r MACRO 0 !!  % Text area read past end%0@ @  @2 ```D1 $1 E?? E---- E R U(8 `lT`@ @`(J% &@% PAGE SymbolsU -U U ?End of file encountered on input file8@ . . . . . . . . . . . . . . . .- N a m e Macros: N a m e LengthStructures and records: N a m e Width # fields Shift Width Mask InitialNONE''GROUPLength =N PROCF PROCL V REG NumberE Alias OpcodeText External GlobalOpen segment(s):Open procedures:1 U 1 1 U U ASMERR.MSF ERRORS 1 :U :ASMSTB *Out Of Memory**Internal Error*M86IO  X]! m g  c 1#NAN?@@@@ @P@$@@ @(k@  @ @C#@ &@ *焑*@ -@1 _0@4@.7@@v:k :@#NJ>@bxA@z&D@n2xH@W ?hK@N@@aQYR@ȥoU@: 'X@fPKе@7pdeAlD> iyB ? d'@Bʚ; TvHrN @zZƤ~o#]xEcd ،$&+؁~&+. ....8 t1  r '8+H t!G8$G ˉ ~2~;rAv:Vu@#FFt~Ff]p ~vV~ar V2VFf]:  v Rlsv/R\r~2~;sv2PR~u sdvi2~~~v藋V2NV322 N~~ vC~f]l vv Rx FVV~raF~2~;r v2RRv r(v~~F~VBVJ;VuV~Ff]~2V~rEF~~= t(vt2Bvtvt~}VBVJ;Vuf]o~U2B~U~UvL~Ef];~==2~==;s F~EL^7~E~U2RRv s ~==~U2RRv FFf]^FFU1RfsU*l~/u ^7O\~\u~=UV2V?~.u"~=v4<\t <.t#~.u~=U sxVBVV2VV;Vr'VV~Svt+~UFVBVJ;VuߋV2+V~}UFVV~r!F~Sv|UVBVJ;Vu~}VU~}UF2 ҹtA~}U2 Ҹt@ FFf]dVv~s$v~tAv~t ~ 2 F~2~;rv^ڎS1 V2#tR^ڎS1 V2#tR^ڎS1 R*2ڎS1 R^ڎS1 R.2ڎS1 R~ڎS1 ~~Dž~22UP~EP~E ~2~;v^v<:uNvR~ R1Rs4~ ~U~E:~~v~t ~~42U Fv:Rs~82]RETv<2TPZv.Rs(vRVRR1R v~t $~ERF~S~URVBVu~UF2#uK~Fv VR>2R< s)~} u ~U2#tv~Ft ~} u~U2#u~vAv~URvU@RVRURVFRURVPRURVRRFf]gvH2R< vR2RF< FFFf]6\2dž$Ğ&2BdžĞ&BJ;udžƆFFUR`2RvVR6t26r2Mr3U,RURv2RvFR6262"U,RUR2RvR6262U,RUR2RvR6262UU;RlUVR2R< r26R2R< r2R2R< r2U6RWs2UR 6Ǻ 6@ 6=u"6&"66 6> 6ƅ 6@ 6= u닾Us Rq66 RU>U U>U"6@"6=tw*RFR1 1 2R6R1 1 1 RZRpVRhRRR6R!RR6Q RR6Q \ RR6Q 4RR6Q RR6Q RR6R 4RR6Q RR6Q RR6Q ` RR6R s' R< |6|hR1 r lRq|RR6R s' R< z6zR1 r lRqRR6R s' R< x6xR1 r lRq R< v6vVR1 r nRq]][.CCU+r;.wSn BW INIT86.MSF  CSDSESSSAXCXDXALBLCLDLAHBHCHDHBXBPSIDISPST-2Version 1.10, Copyright (C) Microsoft Inc. 1981,82U F30~ F30~U~7Uf]UF~sVVFf]U*R3R#7- 2R7R  2R7R ”R7R vv Rx 7RvvKP? f]Uf]WB M86DAT.MSF M86DAT CXDXALBLCLDLAHBHCHDHBXBPSIDISPST-2Version 1.10, Copyright (C) Microsoft Inc. 1981,82U F30~ F30~U~7Uf]UF~sVVFf]U*R3R#7- 2R7R  2R7R ”R7R vv Rx 7RvvKP? f]UMZS< V/4BJRct.? $OYsEw7"',Tan2Lf+plpppp"p-pjpsp}ppppppBpppp}ppppJp\pspppppBpNpZpcppppppppp'p,p^plpppppppppp p*pLpUpapfp5^bfjnrv`)/)G)M)S)f)l)))) )B)Z)i))))))&)LL1L=LLL+\:\J\R\j\x\\\\\\\\\\\ \\'\B\d\z\\\\\\\\%\*\a\\\\&\>\K\P\\\\\\\\\&\6\Q\w\\\\\\\\\$\-\6\;\D\Q\V\`\e\\\\\\\\ \\8\F\K\{\\\\\\\\\>O?[ywA"#q###6#>#G#T#xF?|???#?W?d?????;?q??????B?h????'?rE=S#9Fg{$,;Cu 7l+4=J'38 <NNN}NNNKNrNNNN$xcxxxxxxxxxxxxx'xox}xxxx x xWxxxxxxxxx;x#?Yp$[`nv~=Un->Y-F_irw|/]"HT_B8BoBBBBqBBUBiBrB~BBBBBBBBBBBB'BB>B0_|-Y/x';7;;7;H;;;;;;>;n;;;;L;;;; <<Cmst)M?h     (     ^^^%^^^^^=^z^^^.^Licensed Material - Program Property of Microsoft Inc.3U>v s>t r PP\F)F~u)FF)F)FPp HPFPp HPFPp HPFFF~t <t<t<t<tt ƇQt ;F$<t;^MPPF^vD ;MtCP4P$ۊ^MPPF^G ;F tP7P$~u P \^GFF$<uG+F8F$<tW^vDBF~u@%3~uF%^~u F%^FBF^GFt Q~uÊ XFKt 6~,]UPp HPF^MPPF^GFz Cz r PP\^ HP)]U>^ wF)PPr)PPPPPuZ PPPub 6V PF Gr LJ @r ƇWr ㋶D @Gr Wr @r =r &PP\]U~uT^FC^PS P6L  n FFÀ?t6 6L 7BF+n FFL FI~vC^F^NFu ~vvvjFNFFN뷡n R@9Fv F]UQQ> u% 6n RP P6L  n L #FR vPFn R;r V]UPz HPFPt HPFF;t r ^QFÊ XN: tq> t8)PP5)P^DP$F^tP76< ^GPGP$P)8)8)F ` >^ w>` r ` 8)FPPr)FPPr)^㋇BFv$) PY)^KP):PY)vP)dP5)` v]Ut r z p  F) )^ >^ u> ps> v> u/B"> t> uf > ut> uf> uZ> uL> u@> t> uL+> u s> uB!^ HP)>^ u F)F ]UFF;FrQƋ^0P$F^tP7FFÊOwP^wP$F^tP7^GÊ XvTV<t`΋KN: wNPDP$F^ 8Gu/Ê X㋇KFV+бVFF PY)vP):PY)vP)t : vh!Otn stzPr)P5)Pr)8OtA8t;: w5QOFP$FP5)^GPr))PY)8)F5]UDFFHFFF+Fr ~u ~tF@FF;FwLHFv^Fv^0vesv^@N؋vF^@F묀~uFȈFƋJ։NBFbFFFƋ^FFFFF0vesv~^FFvv^0esGv~^FFv0Pesv~^FFv^FF;FwVvNj^ FNv^0verv^FFvv^0esF+FN+N;sFƋNJ֋FBFFFƋNJ֋FBFFFF< r pP \]UP5)Ɔ~ H;vu s P5)<t5P5)PFP$GPr)8)Ɔ: vÊO:t㋇KPX 艆Ɔv H;v\ˊ X:tDPDP$FFtP7P$䊞㋆B PY)P)P)P5)^udž ^GHPP)P)P5)^wP)P5)GFPr)^?vƆ ^*v PY)P^w P$GPr)8)ttOt>x u> tP5)PP s| Z 6PP>| tmP5) P6| pP6| p| P5)PP P6| pP6| p]U^ _ tD PY)^ _ XKP)EP5)^GPr)8)] UƆ^?v :uƆ^:s ƀx\tx/u Ջ^^:sƀx.uƆ^?v :uƆ^:s ƀx\tx/u Ջ^^:sƀx.uƆtvt򤊆vt򤊆8t-*ȴƋ^pǍ򤊆*1*Ƌ^pǍ򤊆*8t-*ȴƋ^pǍ򤊆*1*Ƌ^pǍ*^8t)*ȴƍpǍ^*0^*ƍpǍ^*~}򤊆^]Udž^ ;s]΍PRv+P#u^ +^ p򤋆@P^딉]U ]Ul ]U ]U ]U ]U8 ]U GP:PP#F~tx ȴ9Fti Fd FF;FsQƋ @,0FF<r< v'>d w>d t@P~w@Y"sP5) ]ˡd  Nd U~t PP\]U^PPP#]U6< ^PS)P$P)]U6< vP)]U6< ^GPP$P)]UF<v3B t F]U~vP6: vFPFP2B >B t vvNFYFF)^ )F몉]U~v16: vFPFP2B >B t F)^ )Fɉ]UQFPPr)F]UP6t F)F^ HF=v P \RPvr)^QF <t ѴÊ X: w@"s   ^FBL ^ X Fn s[> uTn R\ >n v1< F< P\6L B~tF< Fۋ>n R]U< ]UQ4 s 6> F> t8)  s 6< F ]UQ s 6< Fv5)]UQb > t 8) v5)]U3 sZ2P5)/\6: FPnF?P5)vP)vP)FP5) PP)8) s 6< Fv]UP6F P$F^G F^tP7P$FFFÍGPr)~t-(PY)PvP$F^GPr))PY)]Uvv]UQQ~tUgP{P^Pw$F8)3 v]U|PEP5)vP)8)vu]U 3 @ FFuF QPP$F^GFGFu@FGFG F^tH QPP$FFR F0 ;Fu Fr0 ;FtFs 6: FR GPGP : tR :uG,AF< F< P5)R GPr)8)F:5 t@P~u@Y"P~u@Y",PQ8Ft@Y"Y Pv6Y s 8) P5)P"<PPR^F>"< uښ8)F< Ft" FFF6: FP[F^F0 Fs6: Ftv \ ~t2 s 6: F3 ]U^ t7Fs8)^GPr)P5) PY)^ GF /\] U < P5) xFF=w ñ XBDÈVFs؃>< tG s P5)>l u P5)>d t P5)6d $)!P5)8)0 P6\? 5p F~?w^LJFLJFFs0 P6\ b th~t.b {P5)>b uP5)6b $)P5)>b tsPY)P5) s 6< F\ ]U~ }6t+JVu P5)v PPF sL^t4^utG;FuG;FtjP^7P$F6V PF^G FGFG6 FT 6 >@ u@ PvP$F6 ^G]UQ 9 ]U 9 ]U ]U ]U^?tP#^:u?u G AƆ:ƆPP P^P 3 s> t ƆZPPPuE> r P`P\PPP V   ]UQ^^:u8^F~t.FȈFƋ^H^:Htࠗ s @2< tа]UQQ^FF~v#FȈFFȊN΋^H 2ԊF]UQQ H%F F;FvF FF r PP\PvP$F]UPvP$F~,F^PuT FF^8FwFƋ^FuފF^GvDT DvF]UQF V QPP$R R GT  sNP6T P$F^G:Fu-^T uˊFs 6V v]UQQv MF^㋇ V  >V upFrb ^ PYV R ^㋏ ÉGV Gv ^V ~t PvHCP6V P$R v R GPs6V vv R V F]UF~v^㋇ F~tPvP$FF^FGFsNPvP$F^FGF8Ft~uvvvvFP^~t FF멋FxFr\]U^GP6P#tB^+Iƍp^+HPyP6 ]U F^GP:PP#F~u ^F^FFF^ヿLt%L vs~t.FFFρ~u BP5)-F^  ^ć\FF^> t'YP5)vr)_P5)cPP\]UQ^?t6^^:w&^vtt+JVt]U~ =FNu+J]U ~t^F F F _Pv n&9rrz&&G n6r&@Fr< s< un&&:GrYv5)n&&t&OPnGP}PR^n&G8)n&G&G&@ &n&&HN& s tvv]U$vF݀~@t{s PP\P~FFF<,u@NP+u@Z"P;u@Z"P~ r@Z"P w@Z"P:u@Z"sFܴƈJ޸PfFF똀~ t FݢFܴBNQPvP6xPt>tu(P5)FP5)P5)PP\{vF݊F݉]U ~F}s ^GvFF^,9Fr@NP u@Z"P,u@Z"P;u@Z"s' u~tvF^FvMF띃~vvF^8 uN~s"F^Gv5)^GPr)8)FFF;FsJƋ^8 u>t1v^8 u vv~^FF뮋F^GF~uF,8t@P> t@Z"P> t@P8t@Z"Z "Fs F~;u}~u ~;u|]Ux >x wx Ƈ x s b D N f ~ ` v x h l  3 4 d HPPM P PPV P ~ G~ PPPx G x ]U|,p,FYF>p,spp,Ƈ,PFPF~uR>|,uF|,p,Ƈ/LJvFsFp,@r,p,FF=w>r,ZuF눃>p,s PVP\>r>t>r*x,z,~,v,,]UQ PPM > ]U졆&^&Z&WF&;Gr]Uv#^?t>򤍆P^P PPP>uV ]UB`\]U  P+P >u 4P P\P6P$ƆPGP PSP :u A;sHΊAI΀:uN/t\u몋 X 򤊆 ǍbƆ|sPPcP#|sPP PfP P PP~ HG:uA kƆ|r>,u*R ƆQÍGP PsP  x򤊎 򤊆 ǍƆPPcP#t-s%R QÍGP PP PP  +|smƆ sZƆƆPPct;|r4ƀ+u ƆP*P+P 랚PPPu^^PP PPP< >< u P!P\P:PP#>< t>< u5 t,A5  ]U츌PP\]UQF)FF$<tVRF)YFF;Fr;Fv F]UF)PPr)P6F P$PPPV G ]U>^ vm>p r PP\F)PPr)PPPp V MPPsV N p 댉]U >v s>t r PP\F)F~u)FF)F)FPp HPFPp HPFPp HPF~uP !^㋇M;P t ^㋇MFv PPF s4>~ @r PP\~ ^G^MÉF~ ^GFFF~t <t<t<t<tt ƇQt F$<tx^MPPF s9^vD ;Mu@P|u@Y"sP4P$FNj^t/ ^M ^MPF s^ vhF)F~tF)FF)FF)FѸP6t FP^QDP$F^uFG둃>x v PP\]U Pz ȴPP6t 8u)QS㋇BX>^ w F)PPr))PPPPPt PPP sSr W㋆ @GȉOG6~,r @r =r 2PP\2< < ZP\Pr)zP5)/\8)tË< džĉ]U>^ v\F)PPr)PPPPPuPPP띉]UF)FF)F^ HPQPr)Y~uN> t+Ju # P*> t+Ju ~u s P*]UQt r p F) )^ >^ v> pvy> u_m> t> uX> ufJ> u9>> u2> u$> u> t> t!^ HP)>^ u F)FW ]U~ uF;t r ^Q!~ u1F;z r ^ ^ËB^5~ u"F;r r ^Wv㋇ @ы^^]UF)FF$<t^ F F F$F<wPPFF$<t^ F PPFF$F~t~u FFFFvv^ P^Pvv^P^PF$<u )^^]UF)FF$@<uFPFPFPFP~uFF^ XF^ XNˋK+KNv FFPFFFFr@s FFPFFr@s FFP> uCF FD P5) KP)P5)6D P)8)]UQQF$FFs8Nw.PPFPPFF$FF$FFsF^ F F^ F ]U sj I j ȈNF: v:FvX> uv+6L F\ ?^ OF㋇KFFF^FPFPP6f  f ]UQP5)/\P5) F+BPP)8)]UQ< F< P\vB~t F< F܉]UF)FFFFL ȉNRFFPFPFPFP9^ XF~t^ XFF> t.~u+~u~vFHFÀ?u ~tp~tH^FK+KNȱFFF~s;FsvFFFFFss~t  F  FK+KNFF~sF;Fsv~uFFN+ȃ FFN+INFF^FF^.!^FFF=rt=r Fsfv^F^T^㋇K ^6 vvB3F^^^㋇K^6 FP˞]UQQ>^ vpF)FFFF$FF$F^.F$PF$PPvFPPvFPmw]UFs(6| FZ | @| =r P@P\] U6| F Z | @| =r PAP\] UPF PP%NFPF PP%NF> u^_ XF^_ XNÊO:Ov^O^:OsF:Fu^G^;GwɊ^㋇KF^KN FFFF^GFF%FF^GFF%F9Fu|F;FwF;FulF;Fa^GFvDFD8Gw^GF~v,^ F^ N:wF:FrFFN΋^G^:G]UQ^ GF<t^㋇B^ G6~,] UVF8 u(< F< P\~tBF< FP DP$F>d u ^Gd d ^G sV0PPPF^G $ ˆG s!G ,N G 6v T Dv Gv ^GFFv HN;vˀ XtPDP$F^ tg ^ XvD FÈ^F;v s=QDP$F^G ;Fu t ^ XFFtXj Fv HN;wˀ Xuj XFuՠ sv Fj F^ X: w%ùKIGPuҰ~@F +j Fv HN;vˊ XPDP$F^ uvDK^GF<t;À t X:v F^ F: u :FvF^G PFX$<uFF:PvPO<tƀzuF:FvBF^LJB^G OvDGFt s^ XFÊNꈏP FF:Fw ÀOuvPFؠ r F~ HN;w ΊFBFu^㋇GFLJG: w3ÀOt"OrPqOƈZuĊ^FGF: v@POu@Y"s֠: wPF~ HN;wrPFuFF젤: w ÀOuvPFנ sH^㋇GIKFF F-^㉇K^LJB Fv HN;wˊ X዇IBFuؠ j Ƞ;s ƇOOPP]U PF^㋇GP%IFZKVrFf~u F@%7~u F%&~uF%FFf%FFFFFFF%F㋏K;Nr;Nt@IP;Nr@Y"sFKFIFsXFFGFr@sFFHFr@sFF FFPvM ]U~t(GP&P^F>PPP\]UQFsN ^&X FF F~v^&X FNF s ^&X ]UFF FFFf~ w<FF =vF FF FFH1FvQv vPHvF^F+ƉFF~ t>FsvFPv=;6> FPv$PFF)F FFYFFFFFN;w^Ί:FuMF^FsPFPP=;6> FPP$PJ^㋇FHFt+FFF;FreƊvFF] U>^tB^ GFFƆ: wÊO:t uËIKƆ <r˴ÊO:u"u>l tV$<tŠËK+II+%Gr@s%Fԋ%F  ։FtFFԀt ~u^:t Ɔ:ƆƆ^OwǍ򤊆^GtǍ6Y򤀆PPPu^P^FPP >> ut ]PQqPRP\F FMZX  ㋇KFD F:uFb㋇K+HI+Gr@s%Fl Fꊞ㋇FF XˋKVd IVFN҉NVԉVF%+ȉN܋F FԱF؉FFF⊆F6> FP P$P PFPP=;P6f PPヿFt PiP\~t~v6> PP3N㊞㋇IK:vÊO:t㋆;Iu@P;Ku@Y s*6> PP@v묊PGIP ㋇GPY#;v!3X FF6> FP[P!6> X PP$P 6> P4 ] .Ќ+؎72!7!NU&]UQQFNȈF<uFNFFF~rn^-F-Fp,HN;w,ˊ,F<tPP;FF^-Fulj]U^Ƈ/]UFFF;r,s,À,u~,^㋇v;Fw FF~,FɊ~,,toFr,F^F;p,s,À,uF^㋇v;Fw FFFFɊ^/s^/sSPs~,:Ft~FF|,F~,~Z~,,^,~,FƉvv~,/^/~,Ƈ,Ƈ/~,]Up,FFF~w@VNPr@Y"rFȈFÊ,Nt'΋r*惼ru Ê/s~t vvHFFF FFF~uvv"FFFW~t vv]U,r,~v Ft,t,t,Ft, FPPPu^P^PPP^>u PP\P6sE< F< P5)AFPFPP^FP5)F< ^,Fr*ƋËrFuev,FFv,t,t,FFFFFF~v6^,Fr*ƋËNrFFNċF FFFFF|,F6FPP^^F6FPFP^PFY;t3 PP\~v^Ƈ/FN]U~,,:F u㋇;Fu Fsv vPF~u^-F;r,sËz,v`~,F|,FF~,vFYv vP+F~,^-ÊN ,F^/~,/^Ƈ,Ƈ/F~,*~,v vPF~,^-ÊN ,FsI;tr PP\^ ㋇r*Fu P \^^㋇rFFF^ ㋇ F~u~,߸nF FFFvFPP^^Fv~,SPR^=tF;u PPsPP\z,@z,tFFp,HN;wˀ,t㋇v;FsFFuׁ~sFFp,HN;wDˀ,t6㋇v;FsLJv^F)v^㋇v;z,r@z,Fu~,z,vFs ~,Ƈ/~,㋇]UF%Pv F Pv%Y]U^ ㋇r*Fu P \~wev vPF~tB^-|,FFv vFYF FN랊^ F;tv P!  \^^㋇rFu v ߸FNF 뱋F FFFFNF~w@^^NAP9rt@Y"s!v vPuFNFF6FPP^^F6v SFPR^PFY;t P \FF ]Uv v v$F %+ȉ;NvF]U~ v0vvv P )F Fv >F ]U^Ftx,r*Fx,~s=v PP\]UQ,s26^FPP^F~t P \,]UvvvPF]UQFFwÊs Fs۸]UQQ~ }vNFƋ^ @]UQQ~ u^ PPP#F ~ r<6~ t+Ju6~ t+Ju0FukvF Pv Ir^FFw@vN^HP:u@Z"P/u@Z"P\u@Y"sv뾋^vx6t+Jul^vx6t+JtF^vx6t+Jt^vx6t+JuoFsv^GPpv^GP&^u^GGFr~u ^G^G^G G ؉] UQQF PvPv^]UQ~u^PPP#FnF=u'vFPv^GPt]UQQF PvPv^]UQ~t/~t)^Gr^GPZt]UQQ~ uC~ unF^&S^&Gvvv ^ PFF]UQQ~ t.~ u FPvCvvv ^ PFF]U~ t~ u2^ Gr~tvv v^ P8F]!s0UV^ !]UVF=]U^VN F B]UFLU^>=t3]UV3ɴ<]U^^V N @!s0]UVAZ=t3]U^^V N ?Ǵ!2Too many segments Too many groups Too many external symbols in one module Line numbers for H  Abs Ovl Res ( Start Stop Length Name Class Resident Overlay H H H Origin Group Address Publics by Name Address Publics by Value :0 | G)3= DSALLOCATEHIGH LINENUMBERSMAPNODEFAULTLIBRARYSEARCHPAUSESTACKBad numeric parameter. Stack size exceeds 65535 bytes. Out of space on list file  DUP record too complex Input File: pos: Record Type: Cannot open file Invalid format file An internal failure has occured. Code is Cannot find file change diskette in file(s): DS Allocation Loading High Stack Allocation = bytesAbout to generate .EXE file Change disks Unresolved Externals: There was ere error detected. Too many libraries specified. VM.TMPVM.TMP is an illegal file name and has been ignored .LIB Symbol table capacity exceededAmbiguous switch: Unrecognized switch: "" Invalid switch. ?Cannot find library Enter new drive letter: Cannot nest response files. "" Cannot open response file. DGROUPNot enough memory for linker. .OBJObject Modules [.OBJ]: No object modules specified. .EXERun File []: .EXENUL.MAP.MAPList File []: .MAPLibraries [.LIB]: Cannot open list file. Too many segments or classes CODEToo many segments Too many overlays. Segment siz" e exceeds 64K Too many groups Too many public symbols in one module Symbol defined more than once: in file MS PASCAL FORTRAN 77 Program entry point at : in near Fixup offset exceeds field widthToo many PUBLIC symbolsToo many PUBLIC symbolsWarning: No STACK segment OVERLAY_AREAOut of space on run file .OVLCannot open overlayCannot open run fileBad internal reloc tableVM.TMPCannot open temporary file VM.TMP has been created. Do not change diskette in drive : Out of space on VM.TMP Attempt to access data outside of segment bounds Unexpected end-of-file on VM.TMP Unexpected end-of-file on Libray Program size exceeds capacity of Link CON:NUL:CON.NUL.CONNUL Microsoft Object Linker V2.00 (C) Copyright 1982 by Microsoft Inc. PASCAL.LIB#  /YInvalid object module <$ % MZq H .j Vers 2.003P0!<}*ں !ˋ*s0< t< t <.u&.N&qrr< t< t <.u&/&0r<.t<tڀ>.t0<u$>/t'r<u)O< tN< uú0=!rp !˺cSp?![>MZu=s%RQPS3ɰpB![XYZ+Ёs⡽ tЉP;wc  tx t'=uRQPS3ɰpB![XYZ)>u3ۃ>tE: ! !` !Dt,0r< r $_,< r<s ߀| u݋?W>p3S![_s|>tERQPS3ɰpB![XYZ?Sp![s>Î&-u״3S![_r >S![˺"HBMAUlloa/Microsoft/V202.EXE.BINIncorrect DOS version$File not found$Insufficient memory$File creation error$Insufficient disk space$Fix-ups needed - base segment (hex): $ $File cannot be converted$WARNING - Read error on EXE file. Amount read less than size in header. $@W>3S![_r >S![˺"HBMAUlloa/Microsoft/V202.EXE.BINIncorrect DOS version$File not found$Insufficient memory$File creation error$Insufficient disk space$Fix-ups needed - base segment (hex): $l\! ul;+ʴ!'!<u\! uL$Q!Y uء& t@;r%ȴ(!*!  ! File not found$IO.SYS not present on destination$New I/O system too big$IO SYS& IO SYSRR6R s' R< z6zR1 r lRqRR6R s' R< x6xR1 r lRq R<PAGE 60,132 ; Floppy disk I/O System for MS-DOS version 2.00 and later INCLUDE IODEF.ASM IO GROUP CODE CODE SEGMENT BYTE PUBLIC 'IOSYS' ASSUME CS:IO,DS:IO EXTRN EXIT:NEAR, CMDERR:NEAR, BUS$EXIT:NEAR, PTRSAV:DWORD EXTRN ERR$EXIT:NEAR  EXTRN SELECT:BYTE IF LARGDRV PUBLIC LDSKTBL LDSKTBL: DW LDSK$INIT DW LMEDIA$CHK DW GET$BPB DW CMDERR DW LDSK$READ DW BUS$EXIT DW EXIT DW EXIT DW LDSK$WRIT DW LDSK$WRIT ENDIF IF SMALLDRV PUBLIC SDSKTBL SDSKTBL: DW SDSK$INIT DW SMEDIA$CHK DW GET$BPB DW CMDERR DW SDSK$READ DW BUS$EXIT DW EXIT DW EXIT DW SDSK$WRIT DW SDSK$WRIT ENDIF ; ************ 1793-type controller disk I/O ***************** READCOM EQU 80H WRITECOM EQU 0A0H IF SCP SMALLBIT EQU 10H BACKBIT EQU 04H DDENBIT EQU 08H DONEBIT EQU 01H DISK EQU 0E0H ENDIF IF TARBELL BACKBIT EQU 40H DDENBIT EQU 08H DONEBIT EQU 80H DISK EQU 78H DLYTIM EQU 10 ; 24 usec delay after force interrupt ENDIF CURDRV DB -1 ; SIDE has media byte ; Bit 7=1 for 5", 0 for 8" drives ; Bit 6=1 for two-side, 0 for one-side drives ; DDENBIT set for double density, reset for single density SIDE DB 0 ; Explanation of tables below. ; DRVTAB is a table of bytes which are sent to the disk controller as drive- ; select bytes to choose which physical drive is selected for each disk I/O ; driver. Always select side 0 in the drive-select byte if ; a side-select bit is available. Exactly which bits in the drive-select byte ; do what depends on which disk controller is used. ; TRKTAB is a table of bytes used to store which track the read/write ; head of each drive is on. Each physical drive should have its own ; entry in TRKTAB. ; TRKPT is a table of bytes which indicates which TRKTAB entry each ; disk I/O driver should use. Drives such as PerSci 277s which use ; the same head positioner for more than one drive should share entrys ; in TRKTAB. .SALL BYTELST MACRO INITVAL,COUNT,INC,DUPCNT LOCAL X X = INITVAL REPT COUNT DB DUPCNT DUP(X) X = X+INC ENDM ENDM DRVTAB LABEL BYTE IF SCP BYTELST 0,LDRVMAX,1,1 BYTELST 10H,SDRVMAX,1,1 ENDIF IF TARBELL BYTELST 0,LDRVMAX,10H,1 ENDIF TRKPT LABEL BYTE IF PERSCI BYTELST 0,LDRVMAX/2,1,2 BYTELST LDRVMAX/2,SDRVMAX,1,1 TRKTAB DB (LDRVMAX/2+SDRVMAX) DUP (-1) ELSE BYTELST 0,LDRVMAX+SDRVMAX,1,1 TRKTAB DB (LDRVMAX+SDRVMAX) DUP (-1) ENDIF IF LARGDRV LINITTAB LABEL WORD IF LARGEDS OR SIDECHK DW LDRVMAX DUP(LDSDRIVE) ELSE DW LDRVMAX DUP(LSSDRIVE) ENDIF ENDIF IF SMALLDRV SINITTAB LABEL WORD DW SDRVMAX DUP(SDSDRIVE) ENDIF IF SMALLDRV SSSDRIVE: ; This is the IBM Personal Computer DW 512 ; disk format. DB 1 DW 1 DB 2 DW 64 DW 320 DB 80H+DDENBIT DW 1 DW 512 SDSDRIVE: ; The IBM PC format for double sided disks DW 512 DB 2 DW 1 DB 2 DW 112 ; # of directory entries DW 640 DB 0C0H+DDENBIT ; Media DW 1 ; Sectors for 1 fat DW 512 ; Reserve space ENDIF IF LARGDRV LSDRIVE: ;'  Single density / single sided DW 128 ;SECTOR SIZE DB 4 ;SECTORS/ALLOC UNIT DW 1 ;NUMBER OF RESERVED SECTORS DB 2 ;NUMBER OF FATS DW 68 ;NUMBER OF DIRECTORY ENTRIES DW 77*26 ;TOTAL NUMBER OF SECTORS DB 0 ;MEDIA BYTE DW 6 ;SECTORS FOR ONE FAT IF SIDECHK OR LARGEDS LDSDRIVE: ; Double density / double sided DW 1024 DB 1 DW 1 DB 2 DW 192 DW 77*8*2 DB 40H+DDENBIT ; Media byte DW 2 ENDIF IF SIDECHK OR (LARGEDS-1) LSSDRIVE: ; Double density / single sided DW 1024 DB 1 DW 1 DB 2 DW 96 DW 77*8 DB DDENBIT ; Media byte DW 1 ENDIF ENDIF ;********************************************************* ; Disk change function. ; On entry: ; AL = disk unit number. ; AH = media byte ; On exit: ; AX = status (done or error code) ; [TRANS] set as follows: ; = -1 (FF hex) if disk is changed. ; = 0 if don't know. ; = 1 if not changed. ; [SIDE] has media byte for GETBPB call SMEDIA$CHK: IF COMBIN ADD AL,LDRVMAX ; Convert unit # ENDIF LMEDIA$CHK: MOV [SIDE],AH MOV AH,0 MOV SI,AX XCHG [SELECT+SI],AH ; Has drive been selected before? OR AH,AH JNZ DENCHECK ; If no, go check density ; First try head load test. If head is loaded on the drive we want, ; then disk must not have been changed. CMP AL,[CURDRV] ; Same drive? JNZ CHGCHK ; Try disk change signal if not PUSH AX ; Save unit number IF SCP IN AL,DISK+4 ; Head load byte for SCP controller ELSE IN AL,DISK ; Head load byte for Tarbell ENDIF  AND AL,20H ; Look at head load bit POP AX MOV AH,1 ; AH = 1, disk not changed. JNZ MEDIA$EXIT CHGCHK: ; Now look at disk change bit if enabled and not a 5" drive. IF SMALLDRV MOV AH,0 ; Not sure if disk changed TEST [SIDE],80H JNZ MEDIA$EXIT ; If small drive, don't use disk change signal ENDIF IF DSKCHG CALL CHKNEW MOV DL,AL MOV BX,OFFSET IO:DRVTAB XLAT ; Get drive select byte OUT DISK+4,AL IN AL,DISK+1 ; Get current track number OUT DISK+3,AL ; Make it the track to seek to MOV AL,18H ; Seek and load head CALL DCOM CHKLOOP: IN AL,DISK ; Read type I status TEST AL,20H ; Check head load bit JZ CHKLOOP ; Wait until head-load time out TEST AL,80H ; Is disk ready? 1= not ready JNZ NOTRDY IN AL,DISK+4 ; Bit 7=1 if disk not changed TEST AL,80H MOV AH,1 JNZ MEDIA$EXIT MOV AL,DL ; Restore unit number ENDIF MOV AH,0 ; Disk may not have been changed ; Perform density check on 8" drive ; AH has current disk changed status, either 0 or -1 DENCHECK: IF LARGDRV IF COMBIN TEST [SIDE],80H JNZ MEDIA$EXIT ; If small drive, don't need density check ENDIF MOV DH,AH CALL CHKNEW ; Unload head if selecting new drive. MOV BX,OFFSET IO:DRVTAB XLAT ; Get drive select byte  MOV DL,[SIDE] AND DL,[DDENBIT] OR DL,AL MOV CX,4 ; Try each density twice MOV AH,0 ; Disk may not have been changed CHKDENS: MOV AL,DL OUT DISK+4,AL ; Select disk MOV AL,0C4H ; READ ADDRESS command CALL DCOM PUSH AX IN AL,DISK+3 ; Eat last byte to reset DRQ POP AX AND AL,98H JZ HAVDENS ; Jump if no error in reading address. NOT AH XOR DL,DDENBIT ; Try other density LOOP CHKDENS MOV AH,AL JMP ERROR HAVDENS: AND DL,DDENBIT IF SIDECHK IN AL,DISK+4 AND AL,4( 0H ; Get side bit (1=two sided) OR DL,AL ENDIF MOV [SIDE],DL OR AH,DH ENDIF ;IF LARGDRV MEDIA$EXIT: LDS BX,[PTRSAV] MOV BYTE PTR DS:[BX.TRANS],AH MOV AH,1 ;No error RET NOTRDY: MOV AX,8102H ;Return NOT READY error RET CHKNEW: MOV AH,AL ; Save disk drive number in AH. XCHG AL,[CURDRV] ; Make new drive current, AL = previous CMP AL,AH ; Changing drives? JZ RET3 ; Changing drives, unload head so the head load delay one-shot ; will fire again. Do it by seeking to same track the H bit reset. IN AL,DISK+1 ; Get current track number OUT DISK+3,AL ; Make it the track to seek to MOV AL,10H ; Seek and unload head CALL DCOM MOV AL,AH ; Restore current drive number RET3: RET GET$BPB: ; This is the equivalant of the old MAPDEV routine in MS-DOS 1.25. ; Using the media byte and/or FAT ID byte ,set the proper DPT for ; the driver. IF COMBIN TEST [SIDE],80H ; Is it 5" drive ? JZ GET8INCH ENDIF IF SMALLDRV MOV SI,OFFSET IO:SDSDRIVE MOV AL,ES:[DI] ; Get FAT ID byte TEST AL,1 ; Is it double sided? JNZ SETBPB MOV SI,OFFSET IO:SSSDRIVE JMP SHORT SETBPB  ENDIF IF LARGDRV GET8INCH: TEST [SIDE],DDENBIT ; 0=single density, 1=double density MOV SI,OFFSET IO:LSDRIVE JZ SETBPB IF SIDECHK OR LARGEDS MOV SI,OFFSET IO:LDSDRIVE ENDIF IF SIDECHK TEST [SIDE],40H JNZ SETBPB ENDIF IF SIDECHK OR LARGEDS-1 MOV SI,OFFSET IO:LSSDRIVE ENDIF ENDIF ;IF LARGDRV SETBPB: LDS BX,[PTRSAV] SETBPBPT: MOV [BX.COUNT],SI MOV [BX.COUNT+2],CS XOR CX,CX ; Don't change count field MOV AH,1 ;No error RET ; Disk read function. ; ; On entry: ; AL = Disk I/O driver number ; AH = Media byte ; ES:DI = Disk transfer address ; CX = Number of sectors to transfer ; DX = Logical record number of transfer ; On exit: ; CX = number of sectors transferred. ; AH = 1 if success, 81H if fail ; AL = disk error code ; 0 = write protect error ; 2 = not ready error ; 4 = CRC error ; 6 = seek error ; 8 = sector not found ; 10 = write fault ; 12 = "data error" (any other error) SDSK$READ: IF COMBIN ADD AL,LDRVMAX ENDIF LDSK$READ: CALL SEEK ; Position head JC ERROR RDLP: PUSH CX CALL READSECT ;Perform sector read POP CX JC ERROR INC DH ;Next sector number LOOP RDLP ;Read each sector requested MOV AH,1 ;No error RET ; Disk write function.  ; Registers same on entry and exit as read above. SDSK$WRIT: IF COMBIN ADD AL,LDRVMAX ENDIF LDSK$WRIT: CALL SEEK  ;Position head JC ERROR WRTLP: PUSH CX CALL WRITESECT ; Perform sector write POP CX JC ERROR INC DH ; Bump sector counter LOOP WRTLP ; Write CX sectors MOV AH,1 ; No error RET ERROR: MOV BL,[CURDRV] MOV BH,0 MOV DL,-1 MOV [BX+SELECT],DL MOV [SI],DL ; Indicate we don't know where head is. MOV SI,OFFSET IO:ERRTAB GETCOD: INC DL ; Increment to next error code. LODSB TEST AH,AL ; See if error code matches disk status. JZ GETCOD ; Try another if not. MOV AL,DL ; Now we've got the code. SHL AL,1 ; Multiply by two. MOV AH,81H ; Return error code RET ERRTAB DB 40H ; Write protect error DB 80H ; Not ready error DB 8 ; CRC error DB 2 ; Seek error DB 10H ; Sector not found DB 20H ; Writ) e fault DB 7 ; Data error ; Function: ; Seeks to proper track. ; On entry: ; Same as for disk read or write above. ; On exit: ; AH = Drive select byte ; DL = Track number ; DH = Sector number ; DI = Disk transfer address in ES ; SI = pointer to drive's track counter in DS ; CX unchanged (number of sectors) SEEK: MOV [SIDE],AH MOV BL,AL MOV BH,0 CALL CHKNEW MOV AL,[SIDE] AND AL,DDENBIT OR AL,[DRVTAB+BX] ;Get drive select byte OUT DISK+4,AL ;Select drive MOV AH,AL ; Save drive-select byte in AH. XCHG AX,DX ; AX = logical sector number. MOV DL,26 ; 26 sectors/track unless changed below TEST DH,DDENBIT ; Check for double-density. JZ HAVSECT MOV DL,16 TEST [SIDE],40H JNZ HAVSECT ; Disk is double-sided MOV DL,8 ; Disk is single sided HAVSECT: DIV DL ; AL = track, AH = sector. XCHG AX,DX ; AH has drive-select byte, DX = track & sector. INC DH ; Sectors start at one, not zero. MOV BL,[BX+TRKPT] ; Get this drive's displacement into track table. ADD BX,OFFSET IO:TRKTAB ; BX now points to track counter for this drive. MOV SI,BX MOV AL,DL ; Move new track number into AL. XCHG AL,[SI] ; Xchange current track with desired track OUT DISK+1,AL ; Inform controller chip of current track CMP AL,DL ; See if we're at the right track. JZ RET4 MOV BH,2 ; Seek retry count CMP AL,-1 ; Head position known? JNZ NOHOME  ; If not, home head TRYSK: CALL HOME JC SEEKERR NOHOME: MOV AL,DL ; AL = new track number. OUT DISK+3,AL MOV AL,1CH+STPSPD ; Seek command. CALL MOVHEAD AND AL,98H ; Accept not ready, seek, & CRC error bits. JZ RET4 JS SEEKERR ; No retries if not ready DEC BH JNZ TRYSK SEEKERR: MOV AH,AL ; Put status in AH. TEST AL,80H ; See if it was a Not Ready error. STC JNZ RET4 ; Status is OK for Not Ready error. MOV AH,2 ; Everything else is seek error. RET4: RET SETUP: MOV BL,DH ; Move sector number to BL to play with TEST AH,DDENBIT ; Check for double density. JZ CHECK26 ; Not DD. MOV AL,AH ; Select front side of disk. OUT DISK+4,AL CMP BL,8 ; See if legal DD sector number. JBE PUTSEC ; Jump if ok. TEST [SIDE],40H ; Get media byte to see if double sided JZ STEP ; Must step SUB BL,8 ; Find true sector for back side. CMP BL,8 ; See if ok now. JA STEP ; Have to step if still too big. MOV AL,AH ; Move drive select byte into AL. OR AL,BACKBIT ; Select back side. OUT DISK+4,AL JMP SHORT PUTSEC CHECK26: CMP BL,26 ; See if legal large SD/SS sector. JBE PUTSEC ; Jump if ok. STEP: INC DL ; Increment track number. MOV AL,58H ; Step in with update. CALL DCOM INC BYTE PTR CS:[SI] ; Increment the track pointer. MOV DH,1 ; After step, do first sector. MOV BL,DH ; Fix temporary sector number also. PUTSEC: MOV AL,BL ; Output sector number to controller. OUT DISK+2,AL RET5: RET READSECT: CALL SETUP MOV BL,10 PUSH DX MOV DX,DISK+3 RDAGN: MOV AL,READCOM CLI OUT DISK,AL MOV BP,DI JMP SHORT RLOOPENTRY RLOOP: STOSB RLOOPENTRY: IF SCP IN AL,DISK+5 SHR AL,1 IN AL,DX JNC RLOOP ENDIF IF TARBELL IN AL,DISK+4 SHL AL,1 IN AL,DX JC RLOOP ENDIF STI ; Interrupts OK now CALL GETSTAT AND AL,9CH JZ RDPOP MOV DI,BP MOV BH,AL ; Save erro* r status for report DEC BL JNZ RDAGN MOV AH,BH ; Put error status in AH. STC RDPOP: POP DX IF TARBELL FORCINT:  MOV AL,0D0H ; Tarbell controllers need this force interrupt OUT DISK,AL ; so that Type I status is always available MOV AL,DLYTIM ; at the 1793 status port so we can find out INTDLY: ; if the head is loaded. SCP controllers have DEC AL ; head load status available at the DISK+4 JNZ INTDLY ; status port. ENDIF RET WRITESECT: CALL SETUP MOV BL,10 XCHG SI,DI PUSH ES POP DS ;DS must have transfer segment ASSUME DS:NOTHING PUSH DX MOV DX,DISK+3 WRTAGN: MOV AL,WRITECOM CLI OUT DISK,AL MOV BP,SI WRLOOP: IF SCP IN AL,DISK+5 SHR AL,1 LODSB OUT DX,AL JNC WRLOOP ENDIF  IF TARBELL IN AL,DISK+4 SHL AL,1 LODSB OUT DX,AL JC WRLOOP ENDIF STI DEC SI CALL GETSTAT AND AL,0FCH JZ WRPOP MOV SI,BP MOV BH,AL DEC BL JNZ WRTAGN MOV AH,BH ; Error status to AH. STC WRPOP: POP DX PUSH CS POP DS ;Restore local DS ASSUME DS:IO XCHG SI,DI IF TARBELL JMP FORCINT ELSE RET ENDIF HOME: MOV BL,3 TRYHOM: MOV AL,0CH+STPSPD CALL DCOM AND AL,98H JZ RET6 JS HOMERR ; No retries if not ready MOV AL,58H+STPSPD ; Step in with update CALL DCOM DEC BL JNZ TRYHOM HOMERR: STC RET6: RET MOVHEAD: DCOM: OUT DISK,AL PUSH AX AAM ; Delay 10 microseconds POP AX GETSTAT: IN AL,DISK+4 TEST AL,DONEBIT IF SCP JZ GETSTAT ENDIF IF TARBELL JNZ GETSTAT ENDIF IN AL,DISK RET IF LARGDRV LDSK$INIT: MOV AL,LDRVMAX MOV SI,OFFSET IO:LINITTAB ENDIF SETDRV: LDS BX,[PTRSAV] MOV [BX.MEDIA],AL JMP SETBPBPT IF SMALLDRV SDSK$INIT: MOV AL,SDRVMAX MOV SI,OFFSET IO:SINITTAB JMP SETDRV ENDIF CODE ENDS END ֋Fn&Fn&9Fr@vP&x t@Y"sFn&8u z&Gzd load status available at the DISK+4 JNZ INTDLY ; status port. ENDIF RET WRITESECT: CALL SETUP MOV BL,10 XCHG SI,DI PUSH ES POP DS ;DS must have transfer segment ASSUME DS:NOTHING PUSH DX MOV DX,DISK+3 WRTAGN: MOV AL,WRITECOM CLI OUT DISK,AL MOV BP,SI WRLOOP: IF SCP IN AL,DISK+5 SHR AL,1 LODSB OUT DX,AL JNC WRLOOP ENDIF ; I/O System for MS-DOS version 2.00 and later. Revised 12-22-82. ; Contains data packets and init code only BIOSIZ EQU 8*400H ;Size of BIOS in bytes BIOSIZS EQU BIOSIZ/10H ;Size of BIOS in Paragraphs MAXBUF EQU 10 ; # of buffers for files MAXFIL EQU 10 ; # of files to be opened at one time INCLUDE IODEF.ASM PUBLIC PTRSAV,EXIT,BUS$EXIT,CMDERR,ERR$EXIT PUBLIC RE_INIT PUBLIC SELECT EXTRN SYSINIT:FAR EXTRN CURRENT_DOS_LOCATION:WORD EXTRN FINAL_DOS_LOCATION:WORD EXTRN DEVICE_LIST:DWORD EXTRN MEMORY_SIZE:WORD EXTRN DEFAULT_DRIVE:BYTE EXTRN BUFFERS:BYTE,FILES:BYTE EXTRN CONTBL:WORD,AUXTBL:WORD,TIMTBL:WORD,PRNTBL:WORD IF LARGDRV EXTRN LDSKTBL:WORD ENDIF IF SMALLDRV EXTRN SDSKTBL:WORD ELSE SDSKDEV EQU HDSKDEV ENDIF  IF HARD AND (INSTALL-1) EXTRN HDSKTBL:WORD ELSE HDSKDEV EQU -1 ENDIF IO GROUP CODE,INITSEG,LASTSEG CODE SEGMENT BYTE PUBLIC 'IOSYS' ASSUME CS:IO,DS:IO ORG 0 ZERO: JMP INIT SELECT DB (LDRVMAX+SDRVMAX+HARD) DUP (-1) ; *********+ *** DEVICE HEADERS ***************************************** DEVSTART LABEL WORD CONDEV: ;Header for device CON DW AUXDEV,BIOSSEG ;Link to next device DW 8013H ;Attributes - console input, output device DW STRATEGY ;Interrupt service (Used in future versions) DW CON$IN ;Entry point DB "CON " ;Device name AUXDEV: ;Header for device AUX DW PRNDEV,BIOSSEG DW 8000H DW STRATEGY DW AUX$IN DB "AUX " PRNDEV: ;Header for device PRN DW TIMDEV,BIOSSEG DW 8000H DW STRATEGY DW PRN$IN DB "PRN " TIMDEV: ;Header for clock device DW DSKDEV,BIOSSEG DW 8008H DW STRATEGY DW TIM$IN DB "CLOCK " DSKDEV: ;Header for floppy disk device IF LARGDRV DW SDSKDEV,BIOSSEG DW 2000H DW STRATEGY DW LDSK$IN DB ? ENDIF IF SMALLDRV SDSKDEV: DW HDSKDEV,BIOSSEG DW 0 ; IBM compatable DW STRATEGY DW SDSK$IN DB ? ENDIF IF HARD AND (INSTALL-1) HDSKDEV: ;Header for 5.25 hard disk device DW -1,BIOSSEG DW 2000H DW STRATEGY DW HDSK$IN DB ? ENDIF ;************************************************************************ PTRSAV DD 0 STRATEGY PROC FAR MOV WORD PTR CS:[PTRSAV],BX MOV WORD PTR CS:[PTRSAV+2],ES RE_INIT: RET STRATEGY ENDP ;******************************************************** CON$IN: PUSH SI MOV SI,OFFSET IO:CONTBL JMP SHORT ENTRY AUX$IN: PUSH SI MOV SI,OFFSET IO:AUXTBL JMP SHORT ENTRY PRN$IN: PUSH SI MOV SI,OFFSET IO:PRNTBL JMP SHORT ENTRY TIM$IN: PUSH SI MOV SI,OFFSET IO:TIMTBL JMP SHORT ENTRY IF LARGDRV LDSK$IN: PUSH SI MOV SI,OFFSET IO:LDSKTBL JMP SHORT ENTRY ENDIF IF SMALLDRV SDSK$IN: PUSH SI MOV SI,OFFSET IO:SDSKTBL JMP SHORT ENTRY ENDIF IF HARD AND (INSTALL-1) HDSK$IN: PUSH SI MOV SI,OFFSET IO:HDSKTBL JMP SHORT ENTRY ENDIF DISPATCH PROC FAR ENTRY: PUSH AX PUSH CX PUSH DX PUSH DI PUSH BP PUSH DS PUSH ES PUSH BX LDS BX,CS:[PTRSAV] ;GET POINTER TO I/O PACKET MOV AL,[BX.UNIT] ;AL = UNIT CODE MOV AH,[BX.MEDIA] ;AH = MEDIA DESCRIP MOV CX,[BX.COUNT] ;CX = COUNT MOV DX,[BX.START] ;DX = START SECTOR XCHG DI,AX MOV AL,[BX.CMD] XOR AH,AH ADD SI,AX ADD SI,AX CMP AL,11 JA CMDERR XCHG AX,DI LES DI,[BX.TRANS] PUSH CS POP DS  CALL [SI] ;GO DO COMMAND LDS BX,CS:[PTRSAV] MOV [BX.STATUS],AX ;MARK OPERATION COMPLETE SUB [BX.COUNT],CX ;Subtract amount transfered POP BX POP ES POP DS POP BP POP DI POP DX POP CX POP AX POP SI RET ;RESTORE REGS AND RETURN DISPATCH ENDP ; Standard return types used by all functions EXIT: XOR CX,CX ;Transfer complete MOV AH,00000001B ;All done RET BUS$EXIT: ;DEVICE BUSY EXIT MOV AH,00000011B RET CMDERR: MOV AL,3 ;UNKNOWN COMMAND ERROR ERR$EXIT: MOV AH,10000001B ;MARK ERROR RETURN RET CODE ENDS ;*********************************************** ; INIT CODE INITSEG SEGMENT PARA PUBLIC 'IOSYS' ASSUME CS:IO,DS:IO INIT: XOR BP,BP ; Set up stack just below I/O system.  MOV SS,BP MOV SP,BIOSSEG*16 PUSH CS POP DS ;Fall into init code of other modules INITSEG ENDS LASTSEG SEGMENT BYTE PUBLIC 'IOSYS' ASSUME CS:IO, DS:SEG SYSINIT ;Fall into this segment from init code of other modules MOV AX,SEG SYSINIT,  MOV DS,AX MOV AX,CS ADD AX,BIOSIZS MOV [CURRENT_DOS_LOCATION],AX MOV WORD PTR [DEVICE_LIST],OFFSET IO:DEVSTART MOV WORD PTR [DEVICE_LIST+2],CS MOV [FINAL_DOS_LOCATION],INITSEG MOV [FILES],MAXFIL MOV [BUFFERS],MAXBUF JMP SYSINIT LASTSEG ENDS END Look at head load bit POP AX MOV AH,1 ; AH = 1, disk not changed. JNZ MEDIA$EXIT CHGCHK: ; Now look a AL,[BX.CMD] XOR AH,AH ADD SI,AX ADD SI,AX CMP AL,11 JA CMDERR XCHG AX,DI LES DI,[BX.TRANS] PUSH CS POP DS  CALL [SI] ;GO DO COMMAND LDS BX,CS:[PTRSAV] MOV [BX.STATUS],AX ;MARK OPERATION COMPLETE SUB [BX.COUNT],CX ;Subtract amount transfered POP BX POP ES POP DS POP BP POP DI POP DX POP CX POP AX POP SI RET ;RESTORE REGS AND RPAGE 60,80 ; ; SCP's OEM disk initialization module to link with ; Microsoft's FORMAT.OBJ and FORMES.OBJ disk formatting program. ; Use this for MS-DOS 2.0 disks. ; Revised 3-11-83. ; INCLUDE IODEF.ASM BOOTER EQU 200H ; "B" command puts boot sector here. SEGBIOS SEGMENT AT BIOSSEG BIOS LABEL FAR SEGBIOS ENDS CODE SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:CODE,DS:CODE,ES:CODE PUBLIC FATID,STARTSECTOR,SWITCHLIST,FREESPACE,FATSPACE,HARDFLAG PUBLIC INIT,DISKFORMAT,BADSECTOR,WRTFAT,DONE EXTRN SWITCHMAP:WORD,DRIVE:BYTE ; ; ******************************************************************* ; IF SCP DISK EQU 0E0H DONEBIT EQU 01H SMALLBIT EQU 10H BACKBIT EQU 04H DDENBIT EQU 08H ENDIF  IF TARBELL DISK EQU 78H DONEBIT EQU 80H BACKBIT EQU 40H DDENBIT EQU 08H ENDIF GET_DPB EQU 50  GET_CDPB EQU 81 RETRY EQU 3 ONE_BIT EQU 40H TWO_BIT EQU 20H C_BIT EQU 10H ; This must be up here instead of near D_BIT EQU 08H ; SWITCHLIST because the assembler O_BIT EQU 04H ; Can't handle the forward references V_BIT EQU 02H S_BIT EQU 01H INIT: IF SMALLDRV CALL DRIVESELECT TEST AL,SMALLBIT ; See if small drive JZ INIT3 OR [SWITCHMAP],D_BIT ; Force double-density on 5.25 ; drives because controller can't ; handle single-density well. INIT3: ENDIF IF (SIDECHK-1)*(LARGEDS OR SMALLDS) OR [SWITCHMAP],TWO_BIT ; Force double sided if set ENDIF TEST [SWITCHMAP],ONE_BIT JZ INIT4 AND [SWITCHMAP],NOT TWO_BIT ; Turn off 2 sided line INIT4: TEST [SWITCHMAP],TWO_BIT ; Is it double sided JZ INIT1 OR [SIDE],0FFH ; Set flag INIT1: OR [SWITCHMAP],V_BIT ; Always ask for volume ID IF HARD  MOV AL,[DRIVE] CMP AL,LDRVMAX+SDRVMAX ; Is it hard disk ? JB INIT2 ; Exit MOV HARDFLAG,0FFH ; Set flag ENDIF  INIT2: CLC ; No errors. RET DISKFORMAT: MOV BL,[DRIVE] MOV BH,0 PUSH DS MOV AX,BIOSSEG MOV DS,AX  MOV BYTE PTR [BX+3],-1 ; Flag disk as unknown POP DS IF HARD CMP HARDFLAG,0FFH ; Is it a hard disk ? JNZ FT1 JMP HDFORMAT ; Format the hard disk FT1: ENDIF TEST [SWITCHMAP],C_BIT JNZ CHKDENS MOV DX,OFFSET FRMT_MSG CALL MESSAGE JMP KNOW_DENSITY1 ; ; If we are just clearing the disk, it is not necessary for the operator ; to specify the correct density. Therefore, look at the disk to figure ; out what it really is. ; CHKDENS: MOV CX,4 ; Try each density twice C- HK: CALL DRIVESELECT ; Select drive. OUT DISK+4,AL ; Select disk MOV AL,0C4H ; READ ADDRESS command CALL DCOM AND AL,98H IN AL,DISK+3 ; Eat last byte to reset DRQ JZ CHK1 ; Jump if no error in reading address. XOR BYTE PTR [SWITCHMAP],D_BIT ; Try other density LOOP CHK MOV DX,OFFSET READ_ERROR ; Error message. JMP ERROR CHK1: IF SIDECHK CALL DRIVESELECT AND AL,SMALLBIT JNZ CHK2 ; Make sure it is not a small drive TEST SWITCHMAP,D_BIT JZ CHK2 ; Make sure it is not single density IN AL,DISK+4 AND AL,40H ; Get side bit OR [SIDE],AL ; Set it ENDIF CHK2: ; Force a disk read to get proper DPB MOV CX,RETRY CHK3: PUSH CX MOV DL,DRIVE INC DL MOV AH,GET_DPB INT 21H ; Media check PUSH CS POP DS MOV AL,DRIVE MOV CX,1 MOV DX,1 MOV BX,OFFSET PATTERN ; Temp buffer INT 25H ; Direct read POP DX POP CX JNC CHK4 LOOP CHK3 ; Read until good CHK4: JMP BOOTRET KNOW_DENSITY1: CALL HEADUNLOAD ; So I/O system thinks disk may be changed. KNOW_DENSITY2: CALL DRIVESELECT ; Select drive. OUT DISK+4,AL ; Select disk IF SIDECHK AND AL,SMALLBIT ; Make sure it is not a small drive JNZ KNOW_DENSITY3 MOV AL,0C4H ; READ ADDRESS command CALL DCOM ; Just read disk, don't care if error IN AL,DISK+4 AND AL,40H ; Get side bit OR [SIDE],AL ; Set it KNOW_DENSITY3: ENDIF MOV WORD PTR [TKCNT],0 MOV BYTE PTR [TKCNT+2],0 CALL TABLE ; SI points to table of info for disk format. MOV AL,[SI+10] ; Get FATID byte for this format. MOV [FATID],AL MOV AX,[SI+11] ; Get STARTSECTOR for this format. MOV [STARTSECTOR],AX DOIT: MOV BX,OFFSET PATTERN MOV DX,[SI+6] ; DX points to index pattern. CALL MAKE ; Make pattern for index mark and one sector MOV CL,[SI] ; Get sector count for this sector. DEC CL ; Repeat sector pattern for remaining sectors. MAKSEC:  MOV DX,[SI+8] ; DX points to sector pattern. CALL MAKE DEC CL JNZ MAKSEC CALL MAKE ; Fill out rest of track.  ; Put in sequential sector numbers. ; MOV AL,1 ; Start with sector number 1 MOV CL,AL ; Add one to each succeeding sector number MOV BX,[SI+2] ; Get offset from beginning of pattern to first INC BX ; track number. Increment to side, INC BX ; then sector. ADD BX,OFFSET PATTERN ; Compute actual memory address. CALL PUTSEC CALL RESTORE  ; Move the head to track 0. JZ TRACK0 ; Jump if no problem with restoring. MOV DX,OFFSET SEEK_ERROR ; Error message.  JMP ERROR TRACK0: XOR DL,DL ; Start with track 0. TRACKLOOP: PUSH BX MOV BX,OFFSET TRK_MSG CALL INCTRK POP BX  MOV AL,DL ; Get track number. MOV BX,[SI+2] ; Address of first track number in pattern. ADD BX,OFFSET PATTERN MOV CL,0 CALL PUTSEC ; Put track number in each sector. CALL DRIVESELECT ; Get drive-select byte. OUT DISK+4,AL ; Select side. SUB DH,DH ; Start with side 0. SIDELOOP: MOV AL,DH ; Get side number. MOV BX,[SI+2] ; Get offset from beginning of pattern to first INC BX ; track number. Increment to side. ADD BX,OFFSET PATTERN ; Compute actual memory address. MOV CL,0 CALL PUTSEC ; Put side byte in each sector ; ; Write a track. ; CALL TRACK JNC CHECK_SIDE ; Jump if no.  error. MOV DX,OFFSET WRITE_ERROR ; Error message. JMP ERROR CHECK_SIDE: TEST [SIDE],0FFH ; Check two sided bit JZ NEXTRACK CALL DRIVESELECT ; Get drive-select byte. TEST AL,DDENBIT ; See if double-density. JZ NEXTRACK ; Jump if not (single-density always SS). CHKS1: INC DH ; Next side. CMP DH,2 ; See if too big. JAE NEXTRACK ; Finished this track, on to the next. OR AL,BACKBIT ; Select back side. OUT DISK+4,AL JMP SHORT SIDELOOP ; Do the back side. NEXTRACK: INC DL ; Next track. CMP DL,[SI+1] ; See if done. JAE FINIS MOV AL,58H+STPSPD ; Step in with update, no verify. CALL DCOM TEST AL,098H ; Check for errors, Not Ready, JZ TRACKLOOP ; Seek Error, CRC Error. MOV DX,OFFSET SEEK_ERROR JMP ERROR FINIS: MOV DX,10 CALL CONOUT CALL RESTORE ; Move the head back. MOV DX,OFFSET SEEK_ERROR ; Error message in case of error. JZ F2 JMP ERROR F2: CALL HEADUNLOAD ; Make the I/O system think the disk is changed F3: JMP BOOT_SECTOR ; Set SI to point to a table of data for the selected disk format. ; ; [SI+0] = number of sectors/track ; [SI+1] = number of tracks (or cylindars) on disk. ; [SI+2] = number of bytes from beginning of format pattern track number is. ; [SI+4] = number of bytes in pattern for each sector. ; [SI+6] = address of pattern for index address mark. ; [SI+8] = address of pattern for each sector. ; [SI+10] = FATID byte for this format. ; [SI+11] = STARTSECTOR for this format. ; [SI+13] = number of sectors boot sector should load. ; [SI+15] = number of bytes/sector. ; TABLE: TEST HARDFLAG,0FFH MOV AH,6 JNZ DENSITYOK IF SCP AND (SMALL OR COMBIN) SUB AH,AH ; Zero out bit pattern for indexing. CALL DRIVESELECT ; Get drive-select byte. AND AL,SMALLBIT ; See if small disk. JNZ SIZEOK ; Jump if small. ENDIF  TEST [SWITCHMAP],D_BIT MOV AH,3 JZ DENSITYOK ; It is single density MOV AH,4 TEST [SIDE],0FFH ; Is it double/sided? JZ DENSITYOK MOV AH,5 ; Set to double/sided JMP DENSITYOK SIZEOK: TEST [SWITCHMAP],D_BIT MOV AH,0 ; Turn on bit 0 if single-density. JZ DENSITYOK ; Jump if single-density. MOV AH,1 TEST [SIDE],0FFH ; Is it double sided?  JZ DENSITYOK MOV AH,2 ; Set to double sided DENSITYOK: MOV AL,AH ; Computed number to AL. MOV AH,17 ; And multiply by number of bytes in table. MUL AH ; AX = AL*AH. ADD AX,OFFSET DATATABLE ; Add the address of the table. MOV SI,AX RET DRIVESELECT: MOV AL,[DRIVE] ; Get drive-select byte for drive [DRIVE]. PUSH BX MOV BX,OFFSET DRVTAB XLAT TEST [SWITCHMAP],D_BIT ; See if double-density. JZ SPUTNIK ; Jump if not. OR AL,DDENBIT ; Turn on double-density. SPUTNIK: POP BX RET PUTSEC: PUSH DX MOV CH,[SI] ; CH = number of sectors. MOV DX,[SI+4] ; DX = number of bytes in sector pattern. SEC: MOV [BX],AL ; Poke number in sector ID. ADD BX,DX ADD AL,CL ; Increment sector, side, or track number. DEC CH JNZ SEC POP DX RET MAKE: PUSH SI MOV SI,DX MAKELOOP: CLD ; a.k.a. "UP" LODSB ; Get byte count. OR AL,AL ; Return if zero. JZ MAKERETURN MOV CH,AL ; Count to CH. LOD/ SB ; Get byte for pattern. PUTPAT: MOV [BX],AL ; Put byte in pattern. INC BX DEC CH JNZ PUTPAT JMP SHORT MAKELOOP MAKERETURN: MOV DX,SI POP SI RET ; ; Subroutine to restore head to track 0. ; On return, Z flag set if errors. ; RESTORE: MOV AL,08H+STPSPD ; Restore without verify CALL DCOM TEST AL,098H ; Check for errors, Not Ready, RESTORE_RETURN: ; Seek Error, CRC Error. RET TRACK: MOV DI,SI ; Save SI (pointer to DATATABLE). MOV SI,OFFSET PATTERN MOV BP,DX ; Save DX. MOV DX,DISK+3 ; Disk controller data port. MOV AL,0F4H ; Write Track command.  CLI ; Interrupts off. OUT DISK,AL WRTLP: IF SCP IN AL,DISK+5 ; Wait for DRQ or INTRQ. SHR AL,1 LODSB ; Get a byte of the pattern. OUT DX,AL ; Send to controller. JNC WRTLP ENDIF IF TARBELL IN AL,DISK+4 ; Wait for DRQ or INTRQ. SHL AL,1 LODSB ; Get a byte of the pattern. OUT DX,AL ; Send to controller. JC WRTLP  ENDIF STI ; Interrupts back on. MOV DX,BP ; Restore DX. MOV SI,DI ; Restore SI. CALL WAIT ; Wait till status ready. AND AL,0E4H ; Accept "not ready", "write protect", "write JZ WRITERET ; fault", & "lost data" errors. STC ; Set CY flag if error. WRITERET: RET DCOM: OUT DISK,AL AAM ; 10 Microsecond delay. WAIT: IN AL,DISK+4 TEST AL,DONEBIT IF SCP JZ WAIT ENDIF IF TARBELL JNZ WAIT ENDIF IN AL,DISK  ; Get status from disk. RET HEADUNLOAD: IN AL,DISK+1 ; Read current track. OUT DISK+3,AL ; Make it the track to seek to. MOV AL,10H ; Seek with head unloaded. CALL DCOM RET ; ; Transfer the boot sector to the disk. ; BOOT_SECTOR: TEST [SWITCHMAP],C_BIT JZ SECTOR1 JMP BOOTRET SECTOR1: TEST SWITCHMAP,D_BIT JZ POKE_SINGLE TEST [SIDE],0FFH ; Read 2 sided bit JZ POKE_SINGLE ; Do single sided boot POKE_DOUBLE: MOV AX,[SI+13] ; Poke number of sectors to load into boot. MOV WORD PTR [B2POKE_SECTOR+1],AX MOV AL,[SI+11] ; Poke STARTSECTOR into boot sector. INC AL ; First sector on a track is 1, not 0. MOV BYTE PTR [B2POKE_FIRSECT+1],AL MOV AL,[SI] ; Poke sectors/track two places into boot. MOV BYTE PTR [B2POKE_HALFSECT_1+1],AL MOV BYTE PTR [B2POKE_HALFSECT_2+1],AL SAL AL,1 ; Compute number of sectors/"cylinder". MOV BYTE PTR [B2POKE_MAXSECT_1+2],AL MOV BYTE PTR [B2POKE_MAXSECT_2+2],AL CALL DRIVESELECT ; Get drive-select byte. IF SCP AND AL,0FCH ; Force drive 0 ENDIF IF TARBELL AND AL,0CFH ENDIF MOV BYTE PTR [B2POKE_DRIVESELECT+1],AL MOV AX,[SI+15] ; Poke sector size into boot sector. MOV WORD PTR [B2POKE_SECSIZE+2],AX MOV BX,OFFSET BOOT2SIDED JMP SHORT WRITE_BOOT POKE_SINGLE: MOV AX,[SI+13] ; Poke number of sectors to load into boot. MOV WORD PTR [B1POKE_SECTOR+1],AX MOV AL,[SI+11] ; Poke STARTSECTOR into boot sector. INC AL ; First sector on a track is 1, not 0. MOV BYTE PTR [B1POKE_FIRSECT+1],AL MOV AL,[SI] ; Poke sectors/track two places into boot. MOV BYTE PTR [B1POKE_MAXSECT_1+2],AL MOV BYTE PTR [B1POKE_MAXSECT_2+2],AL MOV AX,[SI+15] ; Poke sector size into boot sector. 0 MOV WORD PTR [B1POKE_SECSIZE+2],AX MOV BX,OFFSET BOOT1SIDED WRITE_BOOT: CALL HEADUNLOAD MOV CX,RETRY WRT1: PUSH CX  MOV AL,[DRIVE] ; Which drive to write the boot to. PUSH BX PUSH AX MOV AH,GET_DPB MOV DL,AL INC DL INT 21H  ; Force a media check. Set density PUSH CS POP DS POP AX POP BX MOV CX,1 ; One sector. MOV DX,0 ; Write sector number 0. INT 38 ; Call I/O system to write boot sector. POP DX POP CX JNC WTRET LOOP WRT1 MOV DX,OFFSET BOOT_ERROR ; Error message in case it didn't work. JMP MESSAGE WTRET: IF SCP AND (SMALL OR COMBIN) CALL TABLE CALL DRIVESELECT AND AL,SMALLBIT ; Is it small drive JZ WTRET1 MOV BX,OFFSET SMALLDATA MOV AL,[SI+10] MOV [BX],AL ; Put fatid  MOV CX,1 MOV DX,1 MOV AL,[DRIVE] INT 38 ; Write Fatid byte POP DX ; Restore flags WTRET1: ENDIF BOOTRET: ; Calculate the number of sectors and buffer size here for bad sector ; checking. Initialize the memory parameters. TEST HARDFLAG,0FFH JNZ BOOT0 CALL RESTORE BOOT0: CALL TABLE MOV AL,[SI] CBW MOV CX,[SI+1] ; # of tracks on disk TEST HARDFLAG,0FFH ; Hard disk has 2 bytes for this parameter JNZ BOOT2 MOV CH,0 BOOT2: MUL CX ; Calculate # of sectors on disk  MOV [SCCNT],AX ; Save MOV AX,[SI+15] ; Sector size MOV [SECSZ],AX MOV [SCTN],30 ; Start with 30 sectors to try BOOT1: MOV AX,[SECSZ] MOV CL,[SCTN] ; #of sectors to read MOV CH,0 MUL CX ; Test for maximum reads CMP AX,4096 ; Don't make buffer any bigger JBE BOOTRET1 DEC [SCTN] JMP BOOT1 ; Keep calculating until 4k or smaller BOOTRET1: MOV [SCTN],CL ; This is the number of sectors to read MOV DL,[DRIVE] INC DL MOV AH,50 INT 21H ; Get DPB MOV AL,[BX+0FH]  ; Get size of fat in sectors MOV AH,[BX+8] ; Get number of fats MOV DX,[BX+6] ; First sector of fat MOV BX,[BX+0BH] ; First sector of data PUSH CS POP DS MOV [STARTSECTOR],BX MOV [STRT],BX MOV CX,[SCCNT] SUB CX,BX MOV [SCCNT],CX ; Calculate true remaining sectors MOV  [FATCNT],AH MOV [FATSTART],DX XOR AH,AH MOV [FATSIZE],AX TEST [SWITCHMAP],C_BIT JZ BOOTEXIT MOV CX,RETRY RET2: PUSH CX MOV CX,1 MOV DX,0 MOV BX,OFFSET PATTERN MOV AL,[DRIVE] INT 25H POP DX POP CX JNC BOOTEXIT LOOP RET2 BOOTEXIT: MOV DX,OFFSET BDSCT_MSG CALL MESSAGE CLC RET SMALLDATA: DB 0 DB 0FFH DB 0FFH ERROR: CALL HEADUNLOAD MESSAGE: MOV AH,9 ; Function 9, print string. INT 33 STC RET  INCTRK: PUSH DX PUSH AX PUSH SI MOV DX,BX CALL MESSAGE MOV SI,OFFSET CODE:TKCNT INC WORD PTR [SI] MOV AX,[SI] INC SI INC SI CMP AL,10 JB C2 ADD AH,1 C2: AAM CMP AH,10 JB C1 MOV AX,0 MOV SI,OFFSET CODE:TKCNT MOV [SI],AX INC SI INC SI INC BYTE PTR [SI] C1: CMP BYTE PTR [SI],0 ;Is 100's unit clear ? JZ C3 ; If so,don't print PUSH AX MOV DL,[SI] ADD DL,30H CALL CONOUT POP AX C3: ADD AL,30H ADD AH,30H PUSH AX MOV DL,AH CALL CONOUT POP AX  MOV DL,AL PUSH AX CALL CONOUT POP AX MOV DL,13 CALL CONOUT POP SI POP AX POP DX RET CONOUT: MOV AH,2 IN1 T 21H RET ;------------------------------------------------------------ IF HARD ;Initialize Winchester disk using Morrow HDC-DMA controller IF SCRIBE NHEADS EQU 4 ; Number of heads NSECT EQU 8 ; Number of sectors per track NTRACKS EQU 480 ; Number of cylinders LCTRK EQU 0 ; First track of low write current PRECOMP EQU 0 ; First track to set precomp bit ENDIF IF IMI NHEADS EQU 6 ; Number of heads NSECT EQU 8 ; Number of sectors per track NTRACKS EQU 306 ; Number of cylinders LCTRK EQU 0 ; First track of low write current PRECOMP EQU 256 ; First track to set precomp bit ENDIF ;Controller parameters RESET EQU 54H STRTHDC EQU 55H STATBYT EQU 12 NEXTAD EQU 13 HDFORMAT: MOV DL,10 CALL CONOUT MOV DL,13 CALL CONOUT MOV DX,OFFSET HDISK_MSG CALL MESSAGE MOV AH,1 INT 21H ; Console input CMP AL,'Y' ; Accept a yes only JZ HFMT2 JMP HDFORMAT HFMT2: MOV DL,10 CALL CONOUT MOV DL,13 CALL CONOUT TEST [SWITCHMAP],C_BIT JZ BEGIN JMP BOOTRET BEGIN: MOV DX,OFFSET FRMT_MSG CALL MESSAGE MOV WORD PTR [TKCNT],0 MOV BYTE PTR [TKCNT+2],0 OUT RESET,AL ;Reset the HDC XOR AX,AX MOV ES,AX MOV DI,50H ;First pointer is at 0:50H MOV DX,OFFSET CODE:LOADCONS CALL SETADDR ;Set initial pointer to LOADCONS PUSH DS POP ES MOV DX,OFFSET CODE:HRESTORE MOV DI,OFFSET CODE:LOADCONS+NEXTAD CALL SETADDR ;Set chain pointer to RESTORE MOV SI,OFFSET CODE:LOADCONS+STATBYT CALL DOCOM ;Execute LOADCONS MOV DX,OFFSET CODE:FORMAT MOV DI,OFFSET CODE:HRESTORE+NEXTAD CALL SETADDR ;Set chain pointer to FORMAT MOV DI,OFFSET CODE:FORMAT+NEXTAD CALL SETADDR ;Set FORMAT to loop to itself MOV SI,OFFSET CODE:HRESTORE+STATBYT CALL DOCOM ;Execute RESTORE MOV DX,OFFSET CODE:FORMATDATA MOV DI,OFFSET CODE:FORMATDMA CALL SETADDR NEWCYL: MOV BL,0 ;Initial head number FORMATLOOP: MOV CX,NSECT MOV SI,OFFSET CODE:FORMATDATA+2;Point to head field SETHEAD: MOV [SI],BL ADD SI,4 LOOP SETHEAD MOV AL,BL SHL AL,1 SHL AL,1 NOT AL AND AL,1CH CMP [FORMATDATA],PRECOMP ; Precomp track? JB STHD1 OR AL,80H ;Turn it on STHD1: CMP [FORMATDATA],LCTRK ;Are we at low current track? JAE LOWCUR OR AL,40H ;If not, turn off low write current LOWCUR: MOV BYTE PTR [HEADSEL],AL MOV SI,OFFSET CODE:FORMAT+STATBYT CALL DOCOM ;Format the track MOV [FORMAT+1],0 ;Zero step count (if any) INC BL CMP BL,NHEADS ;Completed the cylinder? JNZ FORMATLOOP MOV [FORMAT+1],1 ;Step in to next track MOV SI,OFFSET CODE:FORMATDATA MOV AX,[SI] ;Get current track number INC AX MOV CX,NSECT SETTRK: MOV [SI],AX ADD SI,4 LOOP SETTRK PUSH AX PUSH DX PUSH BX MOV BX,OFFSET TRK_MSG CALL INCTRK POP BX POP DX POP AX CMP AX,NTRACKS ;All done? JNZ NEWCYL MOV DL,10 MOV AH,2 INT 21H ; Output a linefeed JMP BOOTRET DOCOM: MOV BYTE PTR [SI],0 ;Zero status byte OUT STRTHDC,AL ;Start up HDC HWAIT: TEST BYTE PTR [SI],-1 ;Loop until completion JZ HWAIT  RET SETADDR: MOV AX,DS ;Get current segment XOR CX,CX SHL AX,1 ;Convert to 20-bit number RCL CX,2 1 SHL AX,1 RCL CX,1 SHL AX,1 RCL CX,1 SHL AX,1 RCL CX,1 ADD AX,DX ;Add in offset STOSW XCHG AX,CX ADC AL,0 ;Ripple the carry STOSB RET LOADCONS: DB 0 DW 0 DB 0DCH DB 0,0,0 DB 0,1EH,0,7 ;Set up slow stepping DB 4 ;Load constants DB 0 ;status DB 0,0,0 ;Next address HRESTORE: DB 10H ;Step out DW 0FFFH ;Maximum number of cylinders DB 0DCH DB 0,0,0 DB 0,0,0,0 DB 6 ;No-op DB 0 ;status  DB 0,0,0 ;Next address FORMAT: DB 0 ;Step in DW 0 HEADSEL: DB 0DCH FORMATDMA: DB 0,0,0 ;DMA address (filled in later) DB 24 ;Gap 3 DB -NSECT-1 ;Complement of number of sectors DB 0F8H ;Sector Size code (1024 bytes) DB 0 ;Fill byte DB 3 ;Format opcode DB 0 ;Status DB 0,0,0 ;Next address FORMATDATA: ;CYL, cyl-H, head, sector for nine sectors DB 0,0,0,1 DB 0,0,0,2 DB 0,0,0,3 DB 0,0,0,4 DB 0,0,0,5 DB 0,0,0,6  DB 0,0,0,7 DB 0,0,0,8 DB 0,0,0,9 ENDIF ;---------------------------------------------------------- BADSECTOR: MOV AL,DRIVE MOV CL,[SCTN] MOV CH,0 MOV DX,[STRT] CMP [SCCNT],0 JZ BDRET MOV BX,OFFSET PATTERN ; Set up read buffer PUSH CX PUSH DX INT 25H ; Read sectors POP BP POP DX POP CX JC BDRPT ; Report bad sector MOV AL,SCTN CBW ADD [STRT],AX ; Increment sector start SUB [SCCNT],AX MOV CX,[SCCNT] MOV AL,SCTN CBW CMP AX,CX ; Test for last few sectors JB BADSECTOR MOV SCTN,CL ; Reset sector count to final sectors JMP BADSECTOR BDRPT: MOV BX,[STRT]  MOV AL,[SCTN] CBW SUB AX,CX ; Find out how sectors were read ADD BX,AX ; Set up first bad sector INC AX ADD [STRT],AX SUB [SCCNT],AX MOV AX,1 CLC RET BDRET: CALL HEADUNLOAD MOV AX,0 CLC RET ;------------------------------------------------------------------ WRTFAT: MOV AL,[FATCNT] MOV [CURCNT],AL ;SET UP FAT COUNT MOV AX,[FATSTART] MOV [CNT],AX FATLOOP: MOV AL,DRIVE CBW MOV CX,[FATSIZE] MOV DX,[CNT] MOV BX,[FATSPACE] INT 26H POP AX JC GORET MOV CX,[FATSIZE] ADD [CNT],CX DEC BYTE PTR [CURCNT] JNZ FATLOOP CLC  ;Good return GORET: CALL HEADUNLOAD RET DONE: CALL HEADUNLOAD CLC ; No errors. RET DATATABLE: DB 16 ; Number of sectors/track 5.25-inch SD/SS. DB 40 ; Number of tracks/disk 5.25-inch SD/SS format. DW 11 ; Beginning of pattern to first ID mark. DW 186 ; Number of bytes/sector in pattern. DW OFFSET SSINDEX ; Address of index pattern 5.25-inch SD/SS. DW OFFSET SSSECTOR ; Address of sector pattern 5.25-inch SD/SS. DB 0FEH ; FATID byte for 5.25-inch SD/SS format. DW 1+4+4+17 ; STARTSECTOR for 5.25-inch SD/SS format. DW 256 ; Number of sectors boot sector should load. DW 128 ; Bytes/sector. DB 8 ; 5.25-inch DD/SS format. DB 40 DW 162 DW 652 DW OFFSET SDINDEX DW OFFSET SDSECTOR DB 0FEH DW 1+1+1+4 DW 64 DW 512 DB 8 ; 5.25-inch DD/DS format. DB 40 DW 162 DW 63 52 DW OFFSET SDINDEX DW OFFSET SDSECTOR DB 0FFH DW 1+1+1+7 DW 64 DW 512 DB 26 ; 8-inch SD/SS format. DB 77 DW 80 DW 186 DW OFFSET LSINDEX DW OFFSET LSSECTOR DB 0FEH DW 1+6+6+17 DW 256 DW 128 DB 8 ; 8-inch DD/SS format. DB 77 DW 162 DW 1138 DW OFFSET LDINDEX DW OFFSET LDSECTOR DB 0FFH DW 1+1+1+3 DW 32 DW 1024 DB 8 ; 8-inch DD/DS format. DB 77 DW 162 DW 1138 DW OFFSET LDINDEX DW OFFSET LDSECTOR DB 0FEH DW 1+2+2+6 DW 32 DW 1024  IF HARD DB NSECT ; Hard disk format DW NTRACKS DB ? DW ? DW ? DW ? DB 0FFH DW ? DW ? DW 1024 ENDIF LDINDEX: ; Pattern for 8-inch double-density. DB 80,4EH DB 12,0 DB 3,0F6H DB 1,0FCH DB 50,4EH LDSECTOR: DB 12,0 DB 3,0F5H DB 1,0FEH DB 3,0 ; Track, side, and sector DB 1,3 ; Sector size=1024 DB 1,0F7H DB 22,4EH DB 12,0 DB 3,0F5H DB 1,0FBH DB 255,0E5H DB 255,0E5H DB 255,0E5H DB 255,0E5H DB 4,0E5H DB 1,0F7H DB 54,4EH DB 0 DB 255,4EH DB 255,4EH DB 255,4EH DB 0 LSINDEX: ; Pattern for 8-inch single-density. DB 40,-1 DB 6,0 DB 1,0FCH DB 26,-1 LSSECTOR: DB 6,0 DB 1,0FEH DB 4,0 DB 1,0F7H DB 11,-1 DB 6,0 DB 1,0FBH DB 128,0E5H DB 1,0F7H DB 27,-1 DB 0 DB 255,-1 DB 255,-1 DB 0 SDINDEX: ; Pattern for 5.25-inch double-density. DB 80,4EH DB 12,0 DB 3,0F6H DB 1,0FCH DB 50,4EH SDSECTOR: DB 12,0 DB 3,0F5H DB 1,0FEH DB 3,0 ; Track, side, and sector. DB 1,2 ; Sector size = 512. DB 1,0F7H DB 22,4EH DB 12,0 DB 3,0F5H DB 1,0FBH DB 255,0E5H DB 255,0E5H DB 2,0E5H DB 1,0F7H DB 80,4EH  DB 0 DB 255,4EH DB 255,4EH DB 255,4EH DB 255,4EH DB 255,4EH DB 255,4EH DB 0 SSINDEX: ; Pattern for 5.25-inch single-density. DB 4,-1 ; No index mark. SSSECTOR: DB 6,0 DB 1,0FEH DB 4,0 DB 1,0F7H DB 11,-1 DB 6,0 DB 1,0FBH DB 128,0E5H DB 1,0F7H DB 27,-1 DB 0 DB 255,0 DB 255,0 DB 255,0 DB 255,0 DB 0 .SALL BYTELST MACRO INITVAL,COUNT,INC LOCAL X X = INITVAL REPT COUNT DB X X = X+INC ENDM ENDM DRVTAB LABEL BYTE IF SCP BYTELST 0,LDRVMAX,1 BYTELST 10H,SDRVMAX,1 ENDIF IF TARBELL BYTELST 0,LDRVMAX,10H ENDIF ; Error messages. ; READ_ERROR DB "Read Error - can't determine density",13,10,'$' SEEK_ERROR DB 'Seek Error - disk not ready',13,10,'$' WRITE_ERROR DB 'Write Error - not ready, write protect, ' DB 'write fault, or lost data',13,10,'$' BOOT_ERROR DB 'Error writing boot sector',13,10,'$' FRMT_MSG DB 'Formatting',13,10,'$' TRK_MSG DB 'Cylinder : $' BDSCT_MSG DB 'Testing for bad sectors',13,10,'$' HDISK_MSG DB 'Are you sure you want to format this hard disk ? $' FATSIZE DW ? FATSTART DW ? CNT DW ? STARTSECTOR DW ?  SPC DB ? ;SECTORS PER CLUSTER FATCNT DB ? ;NUMBER OF FATS ON THIS DRIVE CURCNT DB ? DSKSIZE DW ? ;NUMBER OF SECTORS ON THE DRIVE STRT DW 0 ;CURRENT TEST SECTOR SCCNT DW 0 ; # of sectors on disk SCTN DB 0 ; # of sectors to read SECSZ DW 0 ; Sector size SIDE DB 0 TKCNT DW 0 DB 0 SWITCHLIST DB 7,'12CDOVS' FATID DB 0 FIRSTFLAG DB 1 HARDFLAG DB 0 FATSPACE DW BUFFER FREESPACE DW FREE ; ; Boot sectors, one for single-sided boot, a second for double-sided boot. ; B4 oth have various variables such as STARTSECTOR and number of sectors to ; load poked in before the boot sector is written to the disk. The boot ; sectors should be ORGed at 200 hex, but since all jumps and calls are ; reletive, it doesn't matter that it is ORGed at a random location. ; BOOT1SIDED: CLI ; Interrupts off. XOR AX,AX MOV DS,AX MOV ES,AX MOV SS,AX MOV SP,BOOTER ; For debugging purposes. CLD ; a.k.a. "UP" MOV DI,BIOSSEG*16 B1POKE_SECTOR: MOV CX,0 ; CX = number of sectors/track. B1POKE_FIRSECT: MOV BL,0 ; BL = first sector to load. B1SECT: MOV AL,0D0H ; Force Interrupt command. OUT DISK,AL ; To force Type I status AAM ; Give force interrupt time. AAM AAM AAM B1SEEKLP: B1POKE_MAXSECT_1: CMP BL,0  ; Compare with number of sectors/track. JBE B1NOSTEP MOV AL,58H ; Step in with update. CALL B1DCOM B1POKE_MAXSECT_2: SUB BL,0 ; Subtract number of sectors/track. JMP SHORT B1SEEKLP B1NOSTEP: MOV AL,BL ; Get sector number. OUT DISK+2,AL ; Output sector number to disk controller. MOV DX,DISK+3 ; Disk controller data port. PUSH DI MOV AL,88H ; Read Sector command. OUT DISK,AL JMP SHORT B1READ B1READLOOP: STOSB ; Put in memory. B1READ: IF TARBELL IN AL,DISK+4 ROL AL,1 IN AL,DX ; Read data from disk controller chip. JC B1READLOOP ENDIF IF SCP IN AL,DISK+5 ; Input from auto-wait port. ROR AL,1 IN AL,DX ; Read data from disk controller chip. JNC B1READLOOP ENDIF POP DI CALL B1STAT AND AL,9CH JNZ B1SECT B1POKE_SECSIZE: ADD DI,128 ; Add sector size to load next sector. INC BL LOOP B1SECT JMP BIOS B1DCOM: OUT DISK,AL AAM B1STAT: IN AL,DISK+4 TEST AL,DONEBIT IF TARBELL JNZ B1STAT ENDIF IF SCP JZ B1STAT ENDIF IN AL,DISK RET BOOT2SIDED: CLI ; Interrupts off. XOR AX,AX MOV DS,AX MOV ES,AX MOV SS,AX MOV SP,BOOTER ; For debugging purposes. CLD ; a.k.a. "UP" MOV DI,BIOSSEG*16 B2POKE_SECTOR: MOV CX,0 ; CX = number of sectors/track.  B2POKE_FIRSECT: MOV BL,0 ; BL = first sector to load. B2SECT: MOV AL,0D0H ; Force Interrupt command. OUT DISK,AL ; To force Type I status AAM ; Give force interrupt time. AAM AAM AAM B2SEEKLP: B2POKE_MAXSECT_1: CMP BL,0 ; Compare with number of sectors/track. JBE B2NOSTEP MOV AL,58H ; Step in with update. CALL B2DCOM B2POKE_MAXSECT_2: SUB BL,0 ; Subtract number of sectors/track. JMP SHORT B2SEEKLP B2NOSTEP: MOV AL,BL ; Get sector number. MOV AH,0 ; Assume side 0. B2POKE_HALFSECT_1: CMP AL,0 ; Find out which sector and side to use. JBE B2SIDE B2POKE_HALFSECT_2: SUB AL,0 ; Compute sector number for back side. MOV AH,BACKBIT ; Side 1 bit. B2SIDE: OUT DISK+2,AL ; Output sector number to disk controller. MOV AL,AH ; Get side-select byte. B2POKE_DRIVESELECT: OR AL,0 ; Add the rest of the drive-select bits. OUT DISK+4,AL ; And send the mess out. MOV DX,DISK+3 ; Disk controller data port. PUSH DI MOV AL,88H ; Read Sector command. OUT DISK,AL JMP SHORT B2READ B2READLOOP: STOSB ; Put in memory. B2READ: IF TARBELL IN AL,DISK+4 ; Input from auto-wait port. ROL AL,1 IN AL,DX ; Read data from disk controller chip. JC B2READLOOP ENDIF IF SCP IN AL,DISK+5 ; Input from5  auto-wait port. ROR AL,1 IN AL,DX ; Read data from disk controller chip. JNC B2READLOOP ENDIF POP DI CALL B2STAT AND AL,9CH JNZ B2SECT B2POKE_SECSIZE: ADD DI,128 ; Add sector size to load next sector. INC BL LOOP B2SECT JMP BIOS B2DCOM: OUT DISK,AL AAM B2STAT: IN AL,DISK+4 TEST AL,DONEBIT IF TARBELL JNZ B2STAT ENDIF IF SCP JZ B2STAT ENDIF IN AL,DISK RET PATTERN LABEL BYTE BUFFER EQU PATTERN+12*1024 FREE EQU BUFFER+6*1024 CODE ENDS END 8F]!s0UV^ !]UVF=]U^VN F B]UFLU^>=t3] Subtract number of sectors/track. JMP SHORT B2SEEKLP B2NOSTEP: MOV AL,BL ; Get sector number. MOV AH,0 ; Assume side 0. B2POKE_HALFSECT_1: CMP AL,0 ; Find out which sector and side to use. JBE B2SIDE B2POKE_HALFSECT_2: SUB AL,0 ; Compute sector number for back side. MOV AH,BACKBIT ; Side 1 bit. B2SIDE: OUT DISK+2,AL ; Output sector number to disk controller;Console I/O for MS-DOS 2.0 INCLUDE IODEF.ASM IO GROUP CODE,INITSEG INITSEG SEGMENT BYTE PUBLIC 'IOSYS' ASSUME CS:IO, DS:IO IF INTINP ; SS and BP are zero CLI ; Set up keyboard interrupt vector. MOV WORD PTR [BP+64H],OFFSET IO:KBINT MOV [BP+66H],CS STI ELSE MOV AL,0FFH OUT BASE+3,AL ; Mask all interrupts ENDIF ;Set up vector 29H for fast console output MOV WORD PTR [BP+0A4H],OFFSET IO:CON$INT MOV [BP+0A6H],CS INITSEG ENDS CODE SEGMENT BYTE PUBLIC 'IOSYS' ASSUME CS:IO, DS:IO PUBLIC CONTBL,RDNDEXIT EXTRN EXIT:NEAR, CMDERR:NEAR, BUS$EXIT:NEAR, PTRSAV:DWORD ; Command table CONTBL: DW EXIT ; Init DW EXIT DW EXIT DW CMDERR DW CON$READ DW CON$RDND DW EXIT DW CON$FLSH DW CON$WRIT DW CON$WRIT DW CON$WRST ; Console keyboard interrupt handler. KBINT PROC FAR PUSH AX PUSH SI MOV AL,20H ;End of Interrupt command OUT BASE+2,AL ;Send to slave IN AL,DATA ;Get the character AND AL,7FH CMP AL,"C"-"@" JZ FLSH CMP AL,"S"-"@" JZ FLSH CMP AL,"F"-"@" JNZ SAVKY FLSH: CALL FLUSH ; Call I/O system keyboard buffer flush. SAVKY:  MOV SI,CS:[REAR] ;Pointer to rear of queue CALL INCQ CMP SI,CS:[FRONT] ;Any room in queue? JZ QFULL MOV CS:[SI],AL ;Put character in queue MOV CS:[REAR],SI ;Save pointer LEAVINT: POP SI POP AX IRET KBINT ENDP QFULL: MOV AL,7 ; BELL character. CALL OUTCHR ; Call I/O system console output function. JMP SHORT LEAVINT BUSEXIT:JMP BUS$EXIT CON$RDND: CALL CSTATUS JZ BUSEXIT RDNDEXIT: LES DI,[PTRSAV] MOV ES:[DI.MEDIA],AL JMP EXIT CSTATUS: IF INTINP-1 IN AL,STAT AND AL,DAV JZ REPEAT PUSHF ;Look like an INT CALL KBINT REPEAT: ENDIF PUSH SI CLI ; Disable interrupts while checking queue. MOV SI,[FRONT] CMP SI,[REAR] ; Anything in queue? JZ NOCHR ; Jump if nothing in queue. CALL INCQ  LODSB ;Get character (if there is one) OR SI,SI NOCHR: STI POP SI RET CON$READ: CALL INP STOSB LOOP CON$READ JMP EXIT INP: CALL CSTATUS ; Get I/O system console input status. JZ INP PUSH SI CLI ; Disable interrupts while changing queue pointers. MOV SI,[FRONT] CALL INCQ ; Permanently remove char from queue MOV [FRONT],SI STI POP SI6  RET CON$FLSH: CALL FLUSH JMP EXIT FLUSH: CLI MOV CS:[REAR],OFFSET IO:QUEUE MOV CS:[FRONT],OFFSET IO:QUEUE STI RET INCQ: INC SI CMP SI,OFFSET IO:ENDQ ;Exceeded length of queue? JB RET1 MOV SI,OFFSET IO:QUEUE RET1: RET FRONT DW OFFSET IO:QUEUE REAR DW OFFSET IO:QUEUE QUEUE DB QSIZE DUP(?) ENDQ LABEL BYTE ; ************ Console Output ************ CON$WRST: IN AL,STAT AND AL,TBMT JZ BUS$EXITV JMP EXIT BUS$EXITV: JMP BUS$EXIT CON$INT: STI ;INTS back on PUSH AX PUSH CX PUSH DX PUSH DI PUSH DS PUSH CS POP DS CALL CONOUT POP DS POP DI POP DX POP CX  POP AX IRET CON$WRIT: MOV SI,DI CONOUTLP: LODS BYTE PTR ES:[SI] PUSH CX CALL CONOUT POP CX LOOP CONOUTLP JMP EXIT ESC EQU 1BH STATE DW ST1 PRMPNT DW PARMS PARMS DB 0,0,0,0,0,0,0 LASTPRM DB 0 BUFF DB 0,0,0,0,0,0,0,0,0,0 ; Cursor control table CMDTABL DB 'A' ;Cursor up DW CUU DB 'B' ;Cursor down DW CUD DB 'C' ;Cursor forward DW CUF DB 'D' ;Cursor backward DW CUB DB 'H' ;Cursor position DW CUP DB 'J' ;Erase display DW ED DB 'K' ;Erase line DW EL DB 'f' ;Cursor position DW CUP DB 'm' ;Exit/Enter reverse video mode DW SGR DB 's' ;Save cursor position DW PSCP DB 'u' ;Set cursor to saved position DW PRCP DB 00 CONOUT: MOV DI,OFFSET IO:STATE JMP WORD PTR [DI] ;JUMP TO THE CURRENT ANSI STATE ST1: CMP AL,ESC JNZ OUTCHR MOV WORD PTR [DI],OFFSET IO:ST2 RET OUTCHR: PUSH AX OUTLP: IN AL,STAT AND AL,TBMT JZ OUTLP POP AX OUT DATA,AL MOV [STATE],OFFSET IO:ST1 RET SENDESC: PUSH AX MOV AL,ESC  CALL OUTCHR JMP OUTLP ST2: CMP AL,'[' JNZ SENDESC MOV BX,OFFSET IO:PARMS MOV [BX],BYTE PTR 31H MOV WORD PTR [PRMPNT],BX MOV IO:[STATE],OFFSET IO:ST3 RET ST3: CMP AL,';' JNZ ST3A INC WORD PTR [PRMPNT] RET ST3A: CMP AL,'0' JB ST3B CMP AL,'9' JA ST3B PUSH DI MOV DI,[PRMPNT] MOV [DI],AL POP DI RET ST4: PUSH AX MOV AL,ESC CALL OUTCHR  MOV AL,'[' CALL OUTCHR JMP OUTLP ST3B: MOV DI,OFFSET IO:CMDTABL-3 ST3C: ADD DI,3 CMP BYTE PTR [DI],0 JZ ST4 ;Output characters in buffer CMP AL,[DI] JNZ ST3C INC DI ;Point to translate characters MOV BX,WORD PTR [DI] MOV SI,OFFSET IO:BUFF ;Set up temp buffer MOV CX,1 ;Set counter to at least 1 time MOV DL,0 ;Set # of characters TLOOP: MOV AL,[BX] ;Fetch xlate char CMP AL,0 JZ TEXIT ;End of characters TEST AL,80H ;Test for special character JZ NEXTCHR CMP AL,0F1H ;Is it 1st parm JNZ SCHR MOV AL,IO:[PARMS] ;Fetch it JMP NEXTCHR SCHR: CMP AL,0F2H ;Is it 2nd parm JNZ TCHR MOV AL,IO:[PARMS+1] JMP NEXTCHR TCHR: CMP AL,0FEH ;Use special driver ? JZ TDRIV CMP AL,0FFH ;Is it count char  JNZ NEXTCHR MOV CL,IO:[PARMS] CMP CL,31H JAE TCHR1 MOV CL,31H TCHR1: SUB CL,30H INC BX JMP TLOOP NEXTCHR: MOV [SI],AL ;Put to buffer INC SI ;Temp buffer INC BX ;Xlate table INC DL ;# of char in BUFF JMP TLOOP ;Get next character TEXIT: ;All charcters are fetched MOV SI,OFFSET IO:BUFF MOV DH,DL ;Save # of char TEXITL: MOV AL,[SI] CALL OUTCHR INC SI DEC DH JNZ TEXITL ;Output until empty DEC CL ;Do CX count JNZ TEXIT RET TDRIV: ;User defin7 ed driver for SGR CMP WORD PTR [DI],OFFSET IO:SGR JZ DRIVOUT MOV AL,0 ;Dummy char JMP OUTCHR DRIVOUT: MOV BX,OFFSET IO:PARMS CMP BYTE PTR [BX],37H ;Is it enter mode JZ SGRN MOV AL,'q' ;Heath exit video mode JMP SENDESC SGRN: MOV AL,'p' JMP SENDESC ;Heath enter video mode ; ; Cursor controls translation table. This table below contains that ; actual ASCII code sequences used by your terminal to perform basic ; cursor control commands. MS-DOS 2.0 normally expects to see ANSI ; standard sequences for these commands, however this table is set ; up so that the user can re-define the ASCII codes for his specific ; terminal. The table has some specifiers that will tell the code ; to use certain parameters that are passed, such as row or column ; number, or the number of moves. ; ; Specifer action ; 0F1H Use parameter #1 here (the row or line #) ; 0F2H Use parameter #2 here (the column #) ; 0FEH Use special driver routine (User defined) ; 0FFH Use parameter #1 as a count ; 00H end of code ; ESC Outputs the 'esc' character HEATH: CUP: DB ESC ;Cursor position  DB 'Y' DB 0F1H DB 0F2H DB 0 CUU: DB ESC ;Cursor up DB 'A' DB 0FFH DB 0 CUD: DB ESC ;Cursor down DB 'B' DB 0FFH DB 0 CUF: DB ESC ;Cursor forward DB 'C' DB 0FFH DB 0 CUB: DB ESC ;Cursor backward DB 'D' DB 0FFH DB 0 ED: DB ESC ;Erase display DB 'E' DB 0 EL: DB ESC ;Erase line DB 'L' DB 0 PSCP: DB ESC ;Save cursor position DB 'j' DB 0 PRCP: DB ESC ;Set cursor to saved position DB 'k' DB 0 SGR: DB 0FEH ;User defined driver DB 0  CODE ENDS END address of pattern for each sector. ; [SI+10] = FATID byte for this format. ; [SI+11] = STARTSECTOR forMOV AL,'p' JMP SENDESC ;Heath enter video mode ; ; Cursor controls translation table. This table below contains that ; actual ASCII code sequences used by your terminal to perform basic ; cursor control commands. MS-DOS 2.0 normally expects to see; Auxiliary I/O for MS-DOS 2.0 INCLUDE IODEF.ASM IO GROUP CODE,INITSEG,LASTSEG INITSEG SEGMENT BYTE PUBLIC 'IOSYS' ASSUME CS:IO, DS:IO IF SERIAL MOV CX,4 MOV SI,OFFSET IO:SERTAB SERINIT: LODSB OUT SIOBASE+1,AL OUT SIOBASE+3,AL LOOP SERINIT LODSB ;Baud rate for channel 0 OUT SIOBASE+8,AL LODSB ;Baud rate for channel 1 OUT SIOBASE+9,AL ENDIF INITSEG ENDS LASTSEG SEGMENT BYTE PUBLIC 'IOSYS' IF SERIAL SERTAB DB 0B7H, 77H, 4EH, 37H, PRNBAUD, AUXBAUD ENDIF LASTSEG ENDS CODE SEGMENT BYTE PUBLIC 'IOSYS' ASSUME CS:IO, DS:IO PUBLIC AUXTBL EXTRN EXIT:NEAR, CMDERR:NEAR, BUS$EXIT:NEAR, RDNDEXIT:NEAR AUXTBL: DW EXIT DW EXIT DW EXIT DW CMDERR DW AUX$READ DW AUX$RDND DW EXIT DW AUX$FLSH DW AUX$WRIT DW AUX$WRIT DW AUX$WRST AUX$RDND: CALL AUXISTAT JZ BUS$EXITJ JMP RDNDEXIT AUXISTAT: MOV AL,[AUXCHAR] TEST [AUXBST],1 JNZ RET2 IN AL,AUXSTAT AND AL,DAV JZ RET2 IN AL,AUXDATA MOV [AUXCHAR],AL MOV [AUXBST],1 RET2: RET BUS$EXITJ:JMP BUS$EXIT AUX$READ: CALL AUXIN STOSB LOOP AUX$READ JMP EXIT AUXIN: CALL AUXISTAT  JZ AUXIN AUXFLUSH: MOV [AUXBST],0 RET AUX$FLSH: CALL AUXFLUSH JMP EXIT AUX$WRST: IN AL,AUXSTAT AND AL,TBMT 8  JZ BUS$EXITJ JMP EXIT AUX$WRIT: MOV SI,DI AUXOUTLP: LODS BYTE PTR ES:[SI] CALL AUXOUT LOOP AUXOUTLP JMP EXIT  AUXOUT: PUSH AX AUXLP: IN AL,AUXSTAT AND AL,TBMT JZ AUXLP POP AX OUT AUXDATA,AL RET AUXCHAR DB 0 AUXBST DB 0 CODE ENDS END SEXIT RDNDEXIT: LES DI,[PTRSAV] MOV ES:[DI.MEDIA],AL JMP EXIT CSTATUS: IF INTINP-1 IN AL,SSSUME CS:IO, DS:IO IF SERIAL MOV CX,4 MOV SI,OFFSET IO:SERTAB SERINIT: LODSB OUT SIOBASE+1,AL OUT SIOBASE+3,AL LOOP SERINIT LODSB ;Baud rate for channel 0 OUT SIOBASE+8,AL LODSB ;Baud rate for channel 1 OUT SIOBASE+9,AL ENDIF INITSEG ENDS LASTSEG SEGMENT BYTE PUBLIC 'IOSYS' IF SERIAL SERTAB DB 0B7H, 77H, 4EH, 37H, PRNBAUD, AUXBAUD ENDIF; Printer I/O for MS-DOS 2.0 INCLUDE IODEF.ASM IO GROUP CODE CODE SEGMENT BYTE PUBLIC 'IOSYS' ASSUME CS:IO, DS:IO  PUBLIC PRNTBL EXTRN EXIT:NEAR, CMDERR:NEAR, BUS$EXIT:NEAR PRNTBL: DW EXIT ;INIT DW EXIT DW EXIT DW CMDERR DW EXIT DW BUS$EXIT DW EXIT DW EXIT DW PRN$WRIT DW PRN$WRIT DW PRN$STAT DW EXIT PRN$STAT: IN AL,PRNSTAT AND AL,TBMT JZ BUS$EXITJ JMP EXIT BUS$EXITJ: JMP BUS$EXIT PRN$WRIT: MOV SI,DI PRNOUTLP: LODS BYTE PTR ES:[SI] CALL PRINT LOOP PRNOUTLP JMP EXIT PRINT: PUSH AX PRINLP: IN AL,PRNSTAT AND AL,TBMT JZ PRINLP POP AX OUT PRNDATA,AL RET CODE ENDS END  AUXTBL: DW EXIT DW EXIT DW EXIT DW CMDERR DW AUX$READ DW AUX$RDND DW EXIT DW AU JZ BUS$EXITJ JMP EXIT AUX$WRIT: MOV SI,DI AUXOUTLP: LODS BYTE PTR ES:[SI] CALL AUXOUT LOOP AUXOUTLP JMP EXIT  AUXOUT: PUSH AX AUXLP: IN AL,AUXSTAT AND AL,TBMT JZ AUXLP POP AX OUT AUXDATA,AL RET AUXCHAR DB 0 AUXBST DB; Time & date for MS-DOS 2.0 PAGE 60,132 INCLUDE IODEF.ASM IO GROUP CODE,INITSEG,LASTSEG INITSEG SEGMENT BYTE PUBLIC 'IOSYS' ASSUME CS:IO, DS:IO ; Initialize time-of-day clock. MOV SI,OFFSET IO:STCTAB MOV CX,4 ;Initialize 4 registers CLD INITSTC: LODSB OUT STCCOM,AL ;Select register to initialize LODSB OUT STCDATA,AL LODSB OUT STCDATA,AL LOOP INITSTC INITSEG ENDS LASTSEG SEGMENT BYTE PUBLIC 'IOSYS' STCTAB DB 17H ;Select master mode register DW 84F3H ;Enable time-of-day DB 1 ;Counter 1 mode register DW 0138H DB 2 DW 0038H DB 3 DW 0008H ;Set counter 3 to count days LASTSEG ENDS CODE SEGMENT BYTE PUBLIC 'IOSYS' ASSUME CS:IO, DS:IO PUBLIC TIMTBL EXTRN EXIT:NEAR, CMDERR:NEAR, BUS$EXIT:NEAR TIMTBL: DW EXIT DW EXIT DW EXIT DW CMDERR DW TIM$READ DW BUS$EXIT DW EXIT DW EXIT DW TIM$WRIT DW TIM$WRIT TIM$READ: MOV AL,0A7H ;Save counters 1,2,3 OUT STCCOM,AL MOV AL,0E0H ;Enable data pointer sequencing OUT STCCOM,AL MOV AL,19H ;Select hold 1 / hold cycle OUT STCCOM,AL CALL STCTIME ;Get seconds & 1/100's XCHG AX,DX  CALL STCTIME ;Get hours & minutes XCHG AX,CX IN AL,STCDATA MOV AH,AL IN AL,STCDATA XCHG AL,AH ;Count of days CALL POINTSTAT STOSW MOV AX,CX STOSW MOV AX,DX STOSW JMP EXIT STCTIME: CALL STCBYTE MOV CL,AH STCBYTE: IN AL,STCDATA MOV AH,AL SHR AH,1 SHR AH,1 SHR AH,1 SHR AH,1 AND AL,0FH ;Unpack BCD digits AAD ;Convert to binary MOV9  AH,AL MOV AL,CL RET TIM$WRIT: MOV DX,ES:[DI] ;Put date in DX MOV AL,0BH ;Select Counter 3 load register OUT STCCOM,AL XCHG AX,DX OUT STCDATA,AL MOV AL,AH OUT STCDATA,AL MOV AL,44H ;Load counter 3 OUT STCCOM,AL CALL LOAD0 ;Put 0 into load registers to condition timer MOV AL,43H ;Load counters 1 & 2 OUT STCCOM,AL MOV CX,ES:[DI+2] MOV DX,ES:[DI+4] CALL LOAD MOV AL,43H OUT STCCOM,AL ;Load counters 1&2 CALL LOAD0 MOV AL,27H ;Arm counters 1,2,3 OUT STCCOM,AL CALL POINTSTAT JMP EXIT LOAD0: XOR CX,CX MOV DX,CX LOAD: MOV AL,09 ;Counter 1 load register CALL OUTDX MOV AL,0AH ;Counter 2 load register MOV DX,CX OUTDX: OUT STCCOM,AL ;Select a load register MOV AL,DL CALL OUTBCD MOV AL,DH OUTBCD: AAM ;Convert binary to unpacked BCD SHL AH,1 SHL AH,1 SHL AH,1 SHL AH,1 OR AL,AH ;Packed BCD OUT STCDATA,AL RET POINTSTAT: PUSH AX MOV AL,1FH ;Point to status register OUT STCCOM,AL ; so power-off glitches won't hurt  POP AX RET CODE ENDS END FSET IO:QUEUE QUEUE DB QSIZE DUP(?) ENDQ LABEL BYTE ; ************ Console Output *** CALL STCTIME ;Get hours & minutes XCHG AX,CX IN AL,STCDATA MOV AH,AL IN AL,STCDATA XCHG AL,AH ;Count of days CALL POINTSTAT STOSW MOV AX,CX STOSW MOV AX,DX STOSW JMP EXIT STCTIME: CALL STCBYTE MOV CL,AH STCBYTE: IN AL,STCDATA MOV AH,AL SHR AH,1 SHR AH,1 SHR AH,1 SHR AH,1 AND AL,0FH ;Unpack BCD digits AAD ;Convert to binary MOV; Hard disk I/O for MS-DOS 2.0 PAGE 60,132 INCLUDE IODEF.ASM IO GROUP CODE CODE SEGMENT BYTE PUBLIC 'IOSYS' ASSUME CS:IO, DS:IO ;---------------------------------------- IF INSTALL HDSKDEV: ;Header for hard disk DD -1 DW 2000H DW STRATEGY DW HDSK$IN DB ? ELSE PUBLIC HDSKTBL EXTRN EXIT:NEAR, CMDERR:NEAR, BUS$EXIT:NEAR, PTRSAV:DWORD ENDIF ;----------------------------------------- HDSKTBL: DW HDSK$INIT DW HARDCHG DW GET$HBPB DW CMDERR DW HARDREAD DW BUS$EXIT DW EXIT DW EXIT DW HARDWRITE DW HARDWRITE ;************************************************************* DIRENT EQU 96 ALLOCSIZ EQU 4 FATSIZ EQU 6 IF IMI NHEADS EQU 6 ; Number of heads NSECT EQU 8 ; Number of sectors per track NTRACKS EQU 306 ; Number of cylinders LOWCURTRK EQU 0 ; First track of low write current PRECOMTRK EQU 256 ; First track to set precomp bit ENDIF IF SCRIBE NHEADS EQU 4 ; Number of heads NSECT EQU 8 ; Number of sectors per track NTRACKS EQU 480 ; Number of cylinders LOWCURTRK EQU 0 ; First track of low write current PRECOMTRK EQU 0 ; First track to set precomp bit ENDIF RESETHDC EQU 54H STARTHDC EQU 55H HARDRDOP EQU 0 HARDWROP EQU 1 RETRY EQU 3 ; # of times to try disk command TIMEOUT EQU 10 ; 0.2 sec/loop--set 2 seconds for 10 MHZ CPU HDCPARAM: HDIR DB 0 ; Direction HSTEP DW 1 ; Amount to step HDRIVE DB 0DCH ; Drive/head select DMAAD DW 0 ; DMA address DMAHI DB 0 ARG1: HCYL DW -1 ; Current cylinder HHEAD DB 0 ; Current head HSECT DB 0 ; Current sector OPCODE DB 0 ; Read/write code HSTAT DB 0 ; Return status IF INSTALL NEXTAD DW HDCPARAM ELSE NEXTAD DW HDCPARAM+10H*BIOSSEG ENDIF NEXTADHI DB 0 ;-------------------: -------------------------- IF INSTALL PTRSAV DD 0 STRATP PROC FAR STRATEGY: MOV WORD PTR CS:[PTRSAV],BX MOV WORD PTR CS:[PTRSAV+2],ES RET STRATP ENDP HDSK$IN: PUSH SI MOV SI,OFFSET IO:HDSKTBL DISPATCH PROC FAR ENTRY: PUSH AX PUSH CX PUSH DX PUSH DI PUSH BP PUSH DS PUSH ES PUSH BX LDS BX,CS:[PTRSAV] ;GET POINTER TO I/O PACKET  MOV AL,[BX.UNIT] ;AL = UNIT CODE MOV AH,[BX.MEDIA] ;AH = MEDIA DESCRIP MOV CX,[BX.COUNT] ;CX = COUNT MOV DX,[BX.START] ;DX = START SECTOR XCHG DI,AX MOV AL,[BX.CMD] XOR AH,AH ADD SI,AX ADD SI,AX CMP AL,11 JA CMDERR XCHG AX,DI LES DI,[BX.TRANS] PUSH CS POP DS CALL [SI] ;GO DO COMMAND LDS BX,CS:[PTRSAV] MOV [BX.STATUS],AX ;MARK OPERATION COMPLETE SUB [BX.COUNT],CX ;Subtract amount transfered POP BX POP ES POP DS POP BP POP DI POP DX POP CX POP AX  POP SI RET ;RESTORE REGS AND RETURN DISPATCH ENDP ; Standard return types EXIT: XOR CX,CX ;Transfer complete  MOV AH,00000001B ;All done RET BUS$EXIT: ;DEVICE BUSY EXIT MOV AH,00000011B RET CMDERR: MOV AL,3 ;UNKNOWN COMMAND ERROR MOV AH,10000001B ;MARK ERROR RETURN RET ENDIF ;--------------------------------------- HARDCHG: LDS BX,[PTRSAV] MOV BYTE PTR [BX.TRANS],1 ;Disk not changed JMP EXIT HARDREAD: MOV OPCODE,HARDRDOP JMP SHORT HARDIO  HARDWRITE: MOV OPCODE,HARDWROP HARDIO: PUSH DS XOR SI,SI MOV BP,[NEXTAD] MOV AL,[NEXTADHI] MOV DS,SI MOV WORD PTR [SI+50H],BP MOV BYTE PTR [SI+52H],AL OUT RESETHDC,AL ; Reset hard disk controller POP DS MOV AX,ES SHL AX,1 RCL SI,1 SHL AX,1 RCL SI,1 SHL AX,1 RCL SI,1 SHL AX,1 RCL SI,1 ADD AX,DI MOV DMAAD,AX XCHG AX,SI ADC AL,0 MOV DMAHI,AL CMP HCYL,-1 ; Is current track invalid? JNZ COMPPOS CALL RESTORE ; Home disk head COMPPOS: PUSH DX MOV SI,NSECT ; Sector/track on hard disk XCHG AX,DX XOR DX,DX DIV SI ; AX=track, DX=sector INC DX ; Sector numbers start with 1 MOV HSECT,DL MOV SI,NHEADS XOR DX,DX DIV SI ; AX=cylinder, DX=head MOV HHEAD,DL SHL DL,1 SHL DL,1 NOT DL  AND DL,9CH CMP AX,PRECOMTRK JB SAVHEAD1 OR DL,80H ; Turn on precomp SAVHEAD1: CMP AX,LOWCURTRK ; Need low write current? JAE SAVHEAD OR DL,40H ; Turn off low write current SAVHEAD: MOV HDRIVE,DL ; Drive/head select byte MOV DX,AX XCHG HCYL,AX ; Set current cyl, get previous SUB DX,AX ; Amount to move MOV AL,0 ; Assume movement IN JAE HAVSTEP NEG DX ; Get absolute value MOV AL,10H ; Set movement OUT HAVSTEP: MOV HDIR,AL MOV HSTEP,DX POP DX ; BX,CX,DX have orignal command parameters ; All set for hard disk operation! HARDREADWRITE: MOV AH,RETRY ; Retry count HCOM: CALL HDCCOM  JNZ NOTNEXT ; If not successful, don't bump to next sector ADD DMAAD,1024 ADC DMAHI,0 INC DX MOV AL,HSECT INC AL CMP AL,NSECT+1 ; Stay on this track? MOV HSECT,AL LOOPNZ HARDREADWRITE JCXZ OKRET JMP COMPPOS ; Re-compute everything  OKRET: MOV AH,1 ;No error RET NOTNEXT: CMP AL,1 ; Is drive not ready? JBE HARDERR ; Don't retry if not ready or time out DEC AH JNZ HCOM ; Hard disk error on hard disk. AL has the error code. Convert disk ; error code to MSDOS 2.0 e; rror code HARDERR: MOV HCYL,-1 ; Force restore next time CMP AL,10 ; Is it a reasonable error code? JB NEXT1 MOV AL,0 ; General disk failure NEXT1: MOV BX,OFFSET IO:ERRTAB ; Set DOS error table XLAT MOV AH,81H ; ERROR RET ; CX = number of sectors to go ERRTAB: DB 12 ; General failure DB 2 ; Drive not ready DB 12 DB 12 DB 8 ; Sector not found DB 8 ; Data not found DB 12 ; Data overrun DB 4 ; Data CRC error DB 10 ; Write fault DB 4 ; Header CRC error ;Restore head on hard disk. RESTORE: MOV ARG1+1,30 ; 3 ms step time, no head settle delay MOV AX,7+100H*4 ; 1024 byte sector, LOAD CONSTANTS command XCHG AX,ARG1+3 ; Previous opcode in AH MOV BL,1 CALL QUICKCOM ; Execute command JNZ EXITREST ; Abort if controller failure MOV ARG1+1,0 ; Set to fast step (after restore) MOV HSTEP,0FFFH ; Maximum number of steps  MOV HDIR,10H ; Step out CALL HDCCOM ; Restore and set fast seek MOV HCYL,0 ; Now on track zero EXITREST: MOV OPCODE,AH RET HDCCOM: MOV BL,TIMEOUT QUICKCOM: PUSH CX XOR CX,CX MOV HSTAT,0 OUT STARTHDC,AL HWAIT: MOV AL,HSTAT OR AL,AL LOOPZ HWAIT ; Try for 2 seconds JNZ HRET DEC BL JNZ HWAIT HRET: POP CX MOV HSTEP,0 CMP AL,-1 RET GET$HBPB: ; Set up BPB for Hard disk controller. Real simple isn't it? MOV SI,OFFSET IO:HARDDRIVE ; Hard disk Parm table SETBPB: LDS BX,[PTRSAV] MOV [BX.MEDIA],1 ;One hard disk MOV [BX.COUNT],SI MOV [BX.COUNT+2],CS JMP EXIT ; *************************************************************************** HINITTAB: DW HARDDRIVE HARDDRIVE: DW 1024 ; Sector size DB ALLOCSIZ ; Allocation unit DW 1 ; Reserved sectors DB 2 DW DIRENT ; Directory entries DW NSECT*NHEADS*NTRACKS DB 1 ; Media descriptor DW FATSIZ ; Number of sectors for 1 Fat BREAK LABEL BYTE ; Break address ;************************************************************** ; Code below this point is thrown away for installable versions HDSK$INIT:  IF INSTALL MOV AX,CS MOV BX,AX MOV CL,4 SHL AX,CL ROL BX,CL AND BL,0FH ADD [NEXTAD],AX ADC [NEXTADHI],BL LDS BX,[PTRSAV] MOV WORD PTR [BX.TRANS],OFFSET IO:BREAK MOV WORD PTR [BX.TRANS+2],CS PUSH CS POP DS ENDIF MOV SI,OFFSET IO:HINITTAB JMP SETBPB CODE ENDS END  sector should load. ; [SI+15] = number of bytes/sector. ; TABLE: TEST HAR MOV HDIR,10H ; Step out CALL HDCCOM ; Restore and set fast seek MOV HCYL,0 ; Now on track zero EXITREST: MOV OPCODE,ABIOSI SYSINITSEG SYSTEM_INIThF9BADCOMBADLDBADOPMBADSIZCRLFMRE_INITSYSSIZE̠cP 4&&5 4LC\3.u3AtيЈ:Јt.Ȏظ+ȎP..3(.6.Ȏм666>˃3P!$%!6 tʴ!3۴>!>!C=!sP>!XشE!E! uO OOO 3K!H!H!7!=!r,v;>}U>&&E(3t/>G&G&EG&E_< +شJ!H&ú33ҸB!3ҸB!ʡ+Ѓڎ36?!P>!Xr;t rBu t"Cttt&U &]t&U&] . u .Ȋ&U&E...&n&~t&n.&F.&F...^&F&F7CC&VS!&F.>&;Ev ^R.&V&^ZB.>&M&U.6&u̜3:IQW] m rzĀąĊ̍&īĶ? (-05CF?XM[IdgrywzŃGŇIŋřGŬGųGGGIM])C5CLCdg?jmpwƄsƺaƾcI KIC_ I]G DCH\QGYhkapDžGǍIǖGǛGǽFaX&]. T^@tFu tWuи7!Au36r< uQV3!^ZY[Xs3D!€u>!=!ÃX[YZ^_]P!X\DEV\NUL\DEV\CON\DEV\AUX\DEV\PRN\CONFIG.SYS\COMMAND.COMBUFFERSBBREAKCSHELLSDEVICEDFILESFSWITCHARWAVAILDEVAw H!&6;NW[at{~pćėCĝEĤCĨEİCo g|ogg|:C@EDMmG}IŃGʼn ŎŕřŜOšŦpCEAFI\BUFFERS;CURRENT_DOS_LOCATION DEFAULT_DRIVE_ DEVICE_LIST FILESؐFINAL_DOS_LOCATION Ԑ MEMORY_SIZEАSYSINIT't KIC_ I]G DCH\QGYhkapDžGǍIǖGǛGǽFaX&]. T^@tFu tWuA; SYSINITSEG SYSTEM_INIT(nŠr Unrecognized command in CONFIG.SYS $ Sector size too large in file $ Bad or missing $Command Interpreterː BADCOMZ\ BADLDH BADOPM BADSIZ'x CRLFM$ƐSYSSIZEnt0r< wr u66,0r< wӆĊ  !& t!F !PSQRVS3=!Zrع?!ru'u S[t6>u3ҡ6;&36 t@ȡ&+36 t@;t .sKSQR7s  7ZY[À>us t !s&>t6>>u>t6>++S3؋ וZtPZրt"̀0*Ѵ!''r36 t@P36X t@&ô !À>urø ! !A  ),/69DNQain}ĄđĚĪĿ8 8  8 : L N D F : 8 #(+.16 9>H#LQTYR ]dhm8 u|QńD ňB ŌŏP œP Řş8 ťD ŪR Ű@ ź@ žB R @ L N = %+.Q1!69<5@8 G{JMPSVP]b5eH iB m@ pGsH wJ ~ƅD ƌD ƐF ƓƚL ơN ƨL ƬN ƯƶH ƺJ ƾL N D F <<'#'RU`X[`^dB p@ zB ~D ǂF Ǎ  ǛǶǹjvú>tÊ´2!tW JGO률 >e !sB3ʋ> !A;!!tH! u&>[uA>[uA???!+=}! tá! u!'+!<u4!'+!<u !!3G(G*Ӵ!G(O,!GG!Ë!! uA+'!<u stQVW ! t62 󥤺! t뫺!_^Yú>t^!! t! u}'!<u:u7   %BG O [!^bH fB k@ tH | !> ČēĖĝĢ ħ ĭ8 ĴĹ ļ          c #~ &) ,15 :P =@R CI O U [] a_ gx mJ tc x| ŀŊ ŎŔ Řş5 ţŧūŵa Ź j < 5  c $0 48<C O U [ a eimp sv yƅƉƖ8 ƨ ƫƱT ƸƾU V       # .1 = C I N QT Wfim~.! uQ!(! u(! u>t 2ҿ/3Ɉ 2!9Ot  ut;!:/   % + 0 6?B EH K W]a kč8 Ĕ{5 IO SYSc MSDOS SYS COMMAND COM   ??????????? AAAFFFFFFOR+"8 P CRLF DRIVE PRINTG SWITCHMAP8 dČēĖĝĢ ħ ĭ8 ĴĹ ļ          c #~ &) ,15 :P =@R CI O U [] a_ gxFORMATCODEDhiCRLFPRINTm !$zN]PZY_[djp v | ċYIJY 3ռ0،  G7& &&"&&$&(& ՐBUS$EXIT@ CMDERR̐ERR$EXIT< EXIT[ PTRSAVY#RE_INITgȐ SELECTt MEMEX8 NOTSYSi NOUSEH SNGDRVR6 SNGMSG4Y SYSDRV4< SYSMSGZ SYSSPCSYSA;CODEIOIOSYS(_# ..VPQRWUS.Gg OWG2< w%.G)O[]_ZYX^3ɴôðG3.މlPDRTǣ>uR3B3Ҁ=rʀ=s@Ї+аsڰZuB< 돴<vu< r״    u&ó Q3U uuY<þG wO`<ȋرÀGO43>  ,6/;1@ M/t/ĕ/ğ*Ħ*Į,ı.#%&~)("&,0 6<#B%G)N)c&ntŀ'ʼn)Ŕ'Ś ŠŨ&Ů*Ÿ+ž+ /, ./st WAITYNt 3ռ0،  G7& &&"&&$&(& ՐBUS$EXIT@ CMDERR̐ERR$EXIT< EXIT[ PTRSAVY#RE_INITgȐ SELECTt Ml done? JNZ NEWCYL MOV DL,10 MOV AH,2 INT 21H ; Output a linefeed JMP BOOTRET DOCOM: MOV BYTE PTR [SA;CODEIOIOSYS(v_3BUS$EXITCMDERRERR$EXITEXITPTRSAVSELECTF?g:  ߢ5$311, -`Z DH& u:u Px$ Xu?׊ й|P{X$t Ԁp gøÊ:t y{twO3ɴr!QYrrQYrʬtഁ@ &ط$ |t @uƊ†y:t'urø ! !A DB 0,0,0,7 DB 0,0,0,8 DB 0,0,0,9 ENDIF ;---------------------------------------------------------- BADSECTOR: MOV AL,DRIVE MOV CL,[SCTN] MOV CH,0 MOV DX,[STRT] CMP [SCCNT],0 JZ BDRET MOV BX,OFFSET PATTERN ; Set upA;CODEINITSEGIOIOSYS(([!BUS$EXITCMDERREXITPTRSAVFdNfdž,RPV $<t<t<u.6.;6t ..6^Xϰt>&E V6;6t ^tV66^..Fr}x S == -25:DLQTcZagkpycĊđĠĢħĩİ ĵĸĺڠw $tPQRW_ZYXϋ&QYABCDHJKfmsu%<uP$tXP<[u1<;u<0r<9wW>_P[묿=t:uG<t9t-  SbbYy#z2y6z<?GEHNzTLW`gnl. AUXTBLtLQTcZagkpycA;CODEIOIOSYS(;_BUS$EXITCMDERREXIT ?$t&P$tXY  $$")0.d PRNTBLt;u<0r<9wW>_P[묿=t:uG<t9t-Bjy TIMTBLtđĠĢħĩİ ĵĸĺڠw $tPQRW_ZYXϋ&t u$t t$t&P$tX>  SbbYy#z2y6z<?GEHNzTLW`gnl. AUXTBLtLQTcZagkpycA;CODESEGBIOS) @(+ DRIVE SWITCHMAP) @t& t<rÊ@G>uu H|${t 6Q´2!%ZYs|D D T ɋTuȋ\CCt2S[‹\|*Ƌ\Cstt ƀs @|:TsZt tu/t%tt tĴàSt [R,TuZV t 謈Cu^ð Ë{x|rՋ$tx |uxy{tt9t1D D $ϢDD D DQSP2!X[&ZYsuLuD=v´2!GgW_ +ˉ&2tQ%ZYs !RPVFF< r r FF<t P0X00PXPX ^XZô!ò l8$)1F9JFQU\_ho5yĊĕĞ+ Bĵ9Ļ;D*+ + A + )+ .16_9=8Da5hAkqtwA|BLņFŐŜ8ũŵ8 5+ -9I5NUYa8ksx{ƀƃƋƑ ƔƜ\Ƥ_ƩnƬxƲƵKBƿFF3 6565$5*5.F*J1N3T3X-\&a$ev+ yDŽBǠ9Ǻ9͠!r >s @Àu@PRS[ZX=u !UtÌ3«B  >tDQR%]ZYr);rȈ‹+@)à&Xru( (@( @MPMr Mr PN 2N N 6NNNN( PN 2N N PNNNNNNN Read Error - can't determine density  $Seek Error - disk not ready $Write Error - not ready, write protect, write fault, or lost data $Error writing boot sector $Formatting $Cylinder : $Testing for bad sectors $Are yo+#&)-93;@CHKNQTW(Z%]`5cf$il8o,rz:8Ę8Ġ+ģ4Ī)ķ)ļ8ae5k1o3u+ Ł5ņ1Ŋ3Ŏ3ő5Ś5Š1ţ5ŭ1ű3B-.&($(G$(.BB!#24ClEvTlVvs7u sure you want to format this hard disk ? $12CDOVS3؎мx v Xz{Wx|r_$uǁǀx |ux3؎мx v Xô<v,@z |{Wx|r_$uǀx |ux35O+9Q+Q|̪ " "͐ BADSECTOR\] DISKFORMAT7( DONED FATIDDFATSPACEG FREESPACEIvHARDFLAGFА INIT+ STARTSECTOR* SWITCHLIST< WRTFATŠt1 = C I N QT Wfim~.PN 2N N PNNNNNNN Read Error - can't determine density  $Seek Error - disk not ready $Write Error - not ready, write protect, write fault, or lost data $Error writing boot sector $Formatting $Cylinder : $Testing for bad sectors $Are yo+#&)-93;@CHKNQTW(Z%]`5cf$il8o,rz:8Ę8Ġ+ģ4Ī)ķ)ļ8ae5k1o3u+ Ł5ņ1Ŋ3Ŏ3ő5Ś5Š1ţ5ŭ1ű3B-.&($(G$(.BB!#24ClEvTlVvs7u sure you want to format this hard disk ? $12CDOVS3؎мx v Xz{Wx|r_$uǁǀx |ux3؎мx v Xô<v,@z |{Wx|r_$uǀx |ux35O+9Q+Q|̪ " "͐ BADSECTOR\] DISKFORMAT7( DONED FATIDDFATSPACEG FREESPACEIvHARDFLAGFА INIT+ STARTSECTOR* SWC ITCHLIST< WRTFATŠt1 = C I N QT Wfim~.40 []_a!cAeaioq!Ouawy{}Aa!aIO, DS:IO IF INTINP ; SS and BP are zero CLI ; Set up keyboard interrupt vector. MOV WORD PTR [BP+64H],OFFSET IO:KBINT MOV [BP+66H],CS STI ELSE MOV AL,0FFH OUT BASE+3,AL ; Mask all interrupts ENDIF ;Set up vector 29H for fast console output MOV WORD PTR [BP+0A4H],OFFSET IO:CON$INT MOV [BP+0A6H],CS INITSEG ENDS CODE SEGMENT BYTE PUBLIC 'IOSY; Basic I/O System definition - INCLUDEd in each module ; Assumes a CPU Support card at F0 hex for character I/O ; Select whether console input is interrupt-driven or polled. INTINP EQU 1 QSIZE EQU 100 ; Input queue size. ; Select whether the auxiliary port is the Support Card parallel port ; or the second channel of a Multiport Serial card addressed at 10H. PARALLELAUX EQU 1 SERIALAUX EQU 0 ; Select whether the printer is connected to the Support card parallel ; output port (standard) or the first channel of a Multiport Serial card ; addressed at 10H. PARALLELPRN EQU 1 SERIALPRN EQU 0 ; If the Multiport Serial was chosen for either the auxiliary or the ; printer, select the baud rate here, using a hex value from this table: ;  ; 50 0 150 4 1800 8 4800 C ; 75 1 300 5 2000 9 7200 D ; 110 2 600 6 2400 A 9600 E ; 134.5 3 1200 7 3600 B 19200 F PRNBAUD EQU 0EH ; 9600 baud AUXBAUD EQU 0EH ; 9600 baud ; Disk options for MS-DOS 2.0 selected here ;************************************************************ ; If you have a hard disk select it here. If you want the driver ; to be installable (installed at boot time) then select INSTALL ; also. IMI EQU 0 SCRIBE EQU 1 HARD EQU IMI OR SCRIBE INSTALL EQU 1 ;************************************************************ ; Select disk controller here. SCP EQU 0 TARBELL EQU 1 ;Select only LARGE below ; Select disk configuration: LARGE EQU 1 ; Two large drives. COMBIN EQU 0 ; Two 8-inch and one 5-inch. SMALL EQU 0 ; Three 5-inch drives. MAXLARGE EQU 2 ;Number of 8" when LARGE is selected MAXSMALL EQU 3 ;Number of 5" when SMALL is selected MAXLARGECOMB EQU 2 ;Number of 8" when COMBIN is selected MAXSMALLCOMB EQU 1 ;Number of 5" when COMBIN is selected LARGDRV EQU LARGE OR COMBIN SMALLDRV EQU SMALL OR COMBIN LDRVMAX EQU MAXLARGE*LARGE+MAXLARGECOMB*COMBIN ; # of 8" drives SDRVMAX EQU MAXSMALL*SMALL+MAXSMALLCOMB*COMBIN ; # of 5" drives HDRVMAX EQU HARD ; # of hard disk drives ;************************************************************ ; If your disk drives support DISKCHANGE signal and 2 SIDED signal and ; you have a SCP disk controller, then select these options here. ; MS-DOS will use these signals to automaticaD lly select single or ; double sided drives. These are ignored for PerSci drives. DISKCHG EQU 0 TWOSIDE EQU 0 ;************************************************************* ; Select double-sided operation of 8-inch disks in double-density mode.  ; Select this option only if TWOSIDE is not used (or PERSCI is set). LARGEDS EQU 1 ;************************************************************ ; Select whether FORMAT defaults to single- or double-sided for 5" disks. ; (This can always be overridden with the /1 or /2 switches.) SMALLDS EQU 1 ;*********************************************************** ; If 8-inch drives are PerSci, select here: PERSCI EQU 0 ;************************************************************ ; Use table below to select head step speed. Step times for 5" drives ; are double that shown in the table. Times for Fast Seek mode (using ; PerSci drives) is very small - 200-400 microseconds. ; ; Step value 1771 1793 ; ; 0 6ms 3ms ; 1 6ms 6ms ; 2  10ms 10ms ; 3 20ms 15ms STPSPD EQU 2 ;************************************************************ SIDECHK EQU TWOSIDE AND (PERSCI-1) AND SCP AND LARGDRV DSKCHG EQU DISKCHG AND (PERSCI-1) AND SCP AND LARGDRV BIOSSEG EQU 40H ; I/O system segment. BASE EQU 0F0H SIOBASE EQU 10H STAT EQU BASE+7 DATA EQU BASE+6 DAV EQU 2 TBMT EQU 1 SERIAL EQU SERIALPRN+SERIALAUX STCDATA EQU BASE+4 ; Ports for 9513 Timer chip. STCCOM EQU BASE+5 IF SERIALAUX AUXSTAT EQU SIOBASE+3 AUXDATA EQU SIOBASE+2 ENDIF IF PARALLELAUX AUXSTAT EQU BASE+13 AUXDATA EQU BASE+12 ENDIF IF SERIALPRN PRNSTAT EQU SIOBASE+1 PRNDATA EQU SIOBASE+0 ENDIF IF PARALLELPRN PRNSTAT EQU BASE+13 PRNDATA EQU BASE+12 ENDIF ;define offsets for IO data packet IODAT STRUC CMDLEN DB ? ;LENGTH OF THIS COMMAND UNIT DB ? ;SUB UNIT SPECIFIER CMD DB ? ;COMMAND CODE STATUS DW ? ;STATUS DD 2 DUP (?) MEDIA DB ? ;MEDIA DESCRIPTOR TRANS DD ? ;TRANSFER ADDRESS COUNT DW ? ;COUNT OF BLOCKS OR CHARACTERS START DW ? ;FIRST BLOCK TO TRANSFER IODAT ENDS    % + 0 6HR MOV AL,IO:[PARMS+1] JMP NEXTCHR TCHR: CMP AL,0FEH ;Use special driver ? JZ TDRIV CMP AL,0FFH ;Is it count char MASM SOURCE\IO,OBJECT\IO; MASM SOURCE\FDISK,OBJECT\FDISK; MASM SOURCE\INIT,OBJECT\INIT; MASM SOURCE\CONIO,OBJECT\CONIO; MASM SOURCE\AUXIO,OBJECT\AUXIO; MASM SOURCE\PRNIO,OBJECT\PRNIO; MASM SOURCE\TIME,OBJECT\TIME; MASM SOURCE\HDISK,OBJECT\HDISK; LINKIO y port is the Support Card parallel port ; or the second channel of a Multiport Serial card addressed at 10H. PARALLEOUTCHR INC SI DEC DH JNZ TEXITL ;Output until empty DEC CL ;Do CX count JNZ TEXIT RET TDRIV: ;User definLINK OBJECT\FORMAT+OBJECT\FORMES+OBJECT\INIT; EXE2BIN FORMAT.EXE FORMAT.COM DEL FORMAT.EXE LINK OBJECT\IO+OBJECT\FDISK+OBJECT\CONIO+OBJECT\PRNIO+OBJECT\AUXIO+OBJECT\TIME+OBJECT\SYSINIT+OBJECT\SYSIMES; EXE2BIN IO ˃3P!$%!6 tʴ!3۴>!>!C=!sP>!XشE!E! uO OOO 3K!H!H!7!=!r,v;>}U>&&E(3t/>G&G&EG&E_+شJ!H&ú33ҸB!3ҸB!ʡ+Ѓڎ36?!P>!Xr;t rBu t"Cttt&U &]t&U&] . u .Ȋ&U&E...&n&~t&n.&F.&F...^&F&F7CC&VS!&F.>&;Ev ^R.&V&^ZB.>&M&U.6&u̜J 3:IQW] m rzĀąĊ̍&īĶ? (-05CF?XM[IdgrywzŃGŇIŋřGŬGųGGGIM])C5CLCdg?jmpwƄsƺaƾcI KIC_ I]G DCH\QGYhkapDžGǍIǖGǛGǽFaX&]. T^@tFu tWuи7!Au36r< uQV3!^ZY[Xs3D!€u>!=!ÃX[YZ^_]P!X\DEV\NUL\DEV\CON\DEV\AUX\DEV\PRN\CONFIG.SYS\COMMAND.COMBUFFERSBBREAKCSHELLSDEVICEDFILESFSWITCHARWAVAILDEVAw H!&6;NW[at{~pćėCĝEĤCĨEİCo g|ogg|:C@EDMmG}IŃGʼn ŎŕřŜOšŦpCEAFI\BUFFERS;CURRENT_DOS_LOCATION DEFAULT_DRIVE_ DEVICE_LIST FILESؐFINAL_DOS_LOCATION Ԑ MEMORY_SIZEАSYSINIT'tA; SYSINITSEG SYSTEM_INIT(nŠr Unrecognized command in CONFIG.SYS $ Sector size too large in file $ Bad or missing $Command Interpreterː BADCOMZ\ BADLDH BADOPM BADSIZ'x CRLFM$ƐSYSSIZEntA;CODEDh C BADSECTORBADSPCBADVERCRLFMSGDATASPC DISKFORMATDONEDSKSPCFATIDFATSPACE FREESPACEFRMTERRHARDFLAGHRDDRVHRDMSGINITINVCHRINVDRVINVPARLABPRMTMEMEXNOTSYSNOUSESNGDRVSNGMSG STARTSECTOR SWITCHLISTSYSDRVSYSMSGSYSSPCSYSTRANWAITYNWRTFAT Vers 2.00P0!=s ! Xu'u S[t6>u3ҡ6;&36 t@ȡ&+36 t@;t .sKSQR7s  7ZY[À>us t !s&>t6>>u>t6>++S3؋ וZtPZրt"̀0*Ѵ!''r36 t@P36X t@&ô !À>urø ! !A  ),/69DNQain}ĄđĚĪĿ8 8  8 : L N D F : 8 #(+.16 9>H#LQTYR ]dhm8 u|QńD ňB ŌŏP œP Řş8 ťD ŪR Ű@ ź@ žB R @ L N = %+.Q1!69<5@8 G{JMPSVP]b5eH iB m@ pGsH wJ ~ƅD ƌD ƐF ƓƚL ơN ƨL ƬN ƯƶH ƺJ ƾL N D F <<'#'RU`X[`^dB p@ zB ~D ǂF Ǎ  ǛǶǹjvú>tÊ´2!tW JGO률 >e !sB3ʋ> !A;!!tH! u&>[uA>[uA???!+=}! tá! u!'+!<u4!'+!<u !!3G(G*Ӵ!G(O,!GG!Ë!! uA+'!<u stQVW ! t62 󥤺! t뫺!_^Yú>t^!! t! u}'!<u:u7   %BG O [!^bH fB k@ tH | !ČēĖĝĢ ħ ĭ8 ĴĹ ļ          c #~ &) ,15 :P =@R CI O U [] a_ gx mJ tc x| ŀŊ ŎŔ Řş5 ţŧūŵa Ź j < 5  c $0 4L 8<C O U [ a eimp sv yƅƉƖ8 ƨ ƫƱT ƸƾU V       # .1 = C I N QT Wfim~.! uQ!(! u(! u>t 2ҿ/3Ɉ 2!9Ot  ut;!:/   % + 0 6?B EH K W]a kč8 Ĕ{5 IO SYSc MSDOS SYS COMMAND COM   ??????????? AAAFFFFFFOR+"8 P CRLF DRIVE PRINTG SWITCHMAP8 dFORMATCODEDhiCRLFPRINTm !$