CQ80K Double-Sided((i** NONE **Y&)Image file created by unregistered CopyQMh #1 @Ȏ؎м  Ƞ$  Z&u6t$u @洲3vu ztp油߰ 䳪\u>ÀySt4t!t)$ @洠 률t2[䵨t䰨u6[2@wQ@,,,C\X &COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<2 ⇇!2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ ""͌#>?͌͘ =_.:;<> Oo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER.fP!yO#< Ty#O 321y_͸2y2ͽ:˜1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^: ! ~ 3#0 Wx x G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧÆFILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: ! Â$$$ SUB .fP"C{2!"E9"1A22!ty)K!G_^#V*C~E ,&-AGMS!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 O͐  :E B 2>: b# : y! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: !  Hù H H $O͐: 2 *CN# x: 2 p&x~+é72 H! >w_: ! 5ͤNkͱ¦ͱxʊ#Nx: ! 2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \S*C :qn& ^#V>O^"*}:*)=":O:o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*# ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw**{#zr+s{ozg**͕** ,w͜͸Ͳ!!N#F$**O!~#:A#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# #  w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:Eẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E͊:==»y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=262*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!Bw!>2*C~=2u:B2~2wE:A*Cw>"!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6:ʑw:2E**E}DQ>2#4Ñ~ÑÑÑÌçÎÓØÑÑÞ1!"N@۱2 !>52!A-! *"L@{!"L@ÀAy2@>2@>y2y2`i"| n&!::!?:!Y"!:o&:}o&":G:OxGy2:!:!:!t:!>ʹ:::ӱʹ~2:2<Ӳ:@Ӵ:2* Ӱ۳+|^:Ӵͻ“:G:=!8=*±!~±~w> ͹2>~ӳ>Ӱ۵һ۰۰ 4Ӵvw# <ȯ2," *BIOS88 SYS`ALTCHARLOAD ERROR$     $%&'()*+ ,- ./ 01 !23"# "b$@B B HH II$@DI ABI$"$H$H@$$I! H*  $H@@A I $D!!$I"BI"I"@$BIIH$$$$BBI$@BI!"$$A DI$@ A$@$E$@H! "!$$" @B$!!!DH$$"H @k@BHH  !$$A"D@ "A" "BHA " !$ D B I $ !$BIOS88 SBBIOS85 S ALTCHAR S ASM COM@ ASSIGN COMBACKUP COM.BSYSGEN COM0CONFIGURCOM !"#$%&'()*+,CONFIGURCOM-DDT COM&./0DUMP ASM!123DUMP COM4DUP COM56ED COM4789:FORMAT COM$;<=LIST COM>?LOAD COM@MVCPM207COMTABCDEFMVCPM217COMTGHIJKLPIP COM:MNOPPREL COM QRESTORE COM$RSTUVWXYZ[\STAT COM)]^_SUBMIT COM `SYSGEN COMaXSUB COMbAMERICANCHRcDANISH CHRdENGLISH CHReFRENCH CHRfGERMAN CHRgGRAPHICSCHRhITALIAN CHRiSPANISH CHRjSWEDISH CHRkSFORMAT ASMlmnopqrstuvwxyz{FORMAT ASM|}~FORMAT ASM13؎@;u 33u8査)󥻩()6/{1ؿv 6k-sb󤸀ce&H1@&6N6L1A&N&GI&6L1؎G>J1dl&#&&>J1s 6-&&>u6+6-6J1>L1 &u&%&&t[&&&t&&&&n%d&Z%&~uV&a1&N&:GRsH&G@X1E&NY1&u=}17 u4&m1 >Y1ua1&:u&Y1Y1&&b1&2d1&R1}1 uw>R1901&90G &}1 uE6R1 >_1G 90&90 u &<urG && `&&&6t&2C&}1 u&T1 2 tl1&}1 uw&t &ȋw>R1G &}1 uRw&t &Pȋ6R1X>b1u &Et&uȰ mhG G &Í9a1GX1GY1GG &&&&&&&&&SG s=S uCa1GX1GY1Gb1G2>}1td1@G àa1b19t:Gu;Wt 99996:|:>:w WSQRVWS[_^ZY[$Ë9toË9ta1:GtSP[2a19t :Gu g ~19ta1:Gu~1G )G ~1~1GG 2 G t }G ;9t >90;9t  Ë?wu>9À90o&F&Ft]1[1_1 uG h1t6:0:0洋 twt &Fuk6 ؎w&fD$&FD&FD&F&fD $&F&Ft[1>o1t>p1t]1K[1>o1t>o1t>o1t&Nw &~ ]1[1>o1t&v6:0:0洍>o1t&f&Ft]1>u1at&N&f䵨@t&N&#v2r1拴<0t/2>m1&&F&F&F&~ &90Y1B>}1u u^>h1_1_1:f1r3_1:g1uw >_1t  u6h1_1_1:f1r3_1w:g1u7&E@90&Ft>]1u>[1u 䵨@u![1 k1k16R1.tsڀ&90&90>T1t}1o90 PP| X䰨u$@tG &90oG 90& P: X&; t䵨t䰨uG &90À90>U1_1沠[1 k1k1h1>U1"$߄t;s܀>}1ul1>U1&90Ê䳠:0 @0䳪!:0洊À90>U1[1 k1k1>U1&90Í>o1>o1tEE:f1r2g1_1&h1À906U1_1沠[1 k1k1h16U1tns l16U1&90Ê@&Fu&䳠:0 @洜ڊ氬':0洊à[1 t;0 ËoG[1\1&Fts [1\1]1]1>]1u>[1u&Ft f1h1&v &&vf1&fh1 &F汨tj1 90 tj1k1 &F &Ft>]1u>[1u &Ft &Ft!$:0:t泰&k1 &Ft> uuS&Fu >]1s90`t:0$ <u䵨t&Fue& &; u90u{>[1tM䵨@uG>;0u@2P永J䰨t永:䰨uX&Ft  > uP永䰨ue& &; t䰨uX&:0'P&FtQ& &; t䰨uYXPX䵨t䰨uâl1t90t4t0>j1 u)6U16:0:0洍>o1U1P6:0:0Xtg90u &>N&EPj1tQj1<w,u<<u]1x]1)<u(L&Fu O&Fu']1:]1r]1G l190t >_1&90t:0t>]1u>[1u>l1t 90u &>N&EN&F&F@t:0 &F$ &Ft  > u90@tt90@t V r:0洊k1&F:]1t/&F@t:0 $&Ft &F]1&F:0k1à]1&F$ PxX ?JHF>#######>##r'>:u>&; ru >#s.&.N&N &>u.&.N&N&J&F&H&FÀ90G u:w u/w| &;~u#| &;~uD&F &~ &90Y10>}1u uE_1>_1u w 6_1t  uK_1>_1uG À90>U1#qr Ht >}1u0>U1&90À90>U1#=r it>U1&90&Fu&Fu#ð䮨tá]1_1&Fu &;Fr&;Fw #&##&##Ì2ǀ#&##ËoG&Fu&F]1_1 &>u(䮨@t#殠#殠#&>u 䮨@utG #90t >_190u &>N&EN 6p 3 &1& & Í6.8 'PSQRUVWȎ؎H1uuh_^]ZY[X@1+1& & > t ) s > t) w洢:0  & &>tPPX&X%[ÃS.t&N&g&G &G &W&"G&2G&:Gt2t&W&Gt$&Gt-&W&"G&2G&:Gt&Gt<&Gu&G &:G r\&G &W&OZtS&W$<uI&g1&G t*ht&W$<u&g<u&O &G u& t &O &W2ð&G@t&gPt&Gt$&Gtc&W&:O u&G &G &G u&G ,&8G r&G Ü&N&G)&&G&&G&&G(&G&PSu uuXt $ [X1111à1ttS11C1r11[PSQRUVW_^]ZY[XS.>1Pr u.1..1C1r1.1[˜&N&G&'&G'&G'&G'&G'QÜ&N&GW'&G'&G'&G'&G' 2&2&2&Q2&2&G&G& G&GYÜ&N&G'&G(&G(&G](&G`(2&G2&G&G&G$_ 2&G2&G&GÜ$& G$ ĝÍ%&Nh&Gz(&G(&G(&G(&G(ðPSQRUVW6._^]ZY[XPSQRUVW6/|_^]ZY[XPSQRUVWtaĀt<@t6P݊݊ذ ݊ +؃&#&$&&X@t t#$_ Ȏt71Fr u_^]ZY[X&PSQRUVW6$/_^]ZY[XW>/fX>/^X>F/VX>P/NX>Z/=>d/4Ѝ>n/+č>x/"Í>/>/>/ƍ>/ō>/69/6/#P XuP XU.H1&>tF_,N&]90u8G >_1<t'SW6.sP6.X_[<uG &>Lu>v 6-jY>16oq&6L=t &؎1 =t &&o1&qO1QRN1ZYN1Պ&Q1QE&N&Fu'>N1uq>O1u.O1.80 .Q1&n^Q>N1tJ>O1u&F&N&OR3;6O1QY&N.80&f&nYt]Í@80ؠQ1&802Fád1>b1u&Eu&u_12&w090tP>l.؎6.90t6.>M.GAb.S6E.[>W1t)]1>v.f2&Et\1>.dS6o.h[90t _1@>W1u]1H>.)S6.A[S6.8[X&$<u,PX$'@'Gì<$t & TO ABORT, TO IGNORE: $ $ THE TIMER IS BROKE $ DIVIDE BY ZERO INTERRUPT $ ERROR - MEMORY PARITY OR BUSS $ WILD INTERRUPT $F =???? IP=???? CS=???? DS=???? ES=???? SS=???? SP=???? AX=???? BX=???? CX=???? DX=???? DI=???? SI=???? BP=????$ SYSTEM HALT $()$)))()))))))))a*Q* 6w,:Up*2c'[\0n0y0000? 4 @+ 4@@_@M1A*N@|2A*ADM!B~# x“A*ADM!B *N@f.|gҹA xA-¯A#ëA*N@S.38=BGTLY^chmrw|ÁÆËÐÕÚf g@ ANp7Np7R!"Rn}"R Y"R" RBQA RQ`@G1h>2@ͫS1h>͜:O|>!2"!2":!6#=G!w##>Ü>Ü>Ü>Ü>Ü>Ü!> Ü>Ü> Ü> Ü> Ü> Ü>Ü>Ü>Ü>Ü>Ü>Ü>Ü>Ü>Ü>2"`i"">>2:*     %&'()*+, -. /0  12!"34#$$I$I$I0 !$ $!B!B!@P@* ͡. ;ͣW!E# ¡ # ¬# ·@ʴʥzʖ=ʐ=|zJz?4)z z5P,22, Q&&Y""&`>>>a?bscdefghi>>j>kUUUUlm*nopqrsStuvwxyf< \ ?ʻ w# !ͼ ? !ͼ !)ͼ !ͼ :5͡ :6:6͡ :7͡ :\ ʻ 24!dͮ 25ͮ 27ͮ 26!8 ( ʃ !Y 1  :7ʞ !z 8  !"2D2X2#! 8 !ͼ z{* ! !"!8 w#  +6# *#"~!ͼ G:6QxJQS*!w#"! 1 !"!Y~~# …¡z!ͼ wʹ* ! w#" ! 8 !" ! zz_O4:  :6y:! G~#x=2> > ! >x6 #='G! ~ p( O*}O>4?:7w:#ĸ*"!͸* }w>ͪg( ʆ1 Y :7ʗ8 z !<ͼ CP/M ASSEMBLER - VER 2.0 NO SOURCE FILE PRESENT NO DIRECTORY SPACE SOURCE FILE NAME ERROR SOURCE FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES END OF ASSEMBLY G:7xʘ!#~ʄl͸Ä**!O {zʊ͸*"!!#^4!$wͯͯWƐ'@'ê>:ͪ!#^Ww*!{͚|͚}͚͚{!$~#͚͚> ͪ> ͪ8@2 0 0:x0_<2! wI2 2> 2 >2ɯ22 !~@_6^4#: w~$w: 0 q: A: A͋q: a{_2  2 - !ɯ2I:  ;*:  ͭͷ ͭ͋>9q>9: '!2 >9 7:! 6 >2>2: 2 Qͭ:Ğ! :lj<͖<j<|<: OʊQ>ÖH >2 2 û: B­>ôD> ¸!52 !"!N#~#A07O! ~*!) " :  '<ͭ'<>V$>O$:Ğà\ÞØ`rÍÖ![w#w#b!"!F#v2[G*##~w*##~<*}q!~ڬ6![^![^#fk"͎͘!G#*####*^#Vû!^*"*{zA"*![N![ N#Fr+sq#p/>G=#w#w3#w#w!JSYMBOL TABLE OVERFLOW G*##~w*##~͎*_###s#r^#V`à 4 Wm ()*+,-/ABCDEHLMDBDIDSDWEIIFINORSPACIADCADDADIANAANDANICMACMCCMPCPIDAADADDCRDCXENDEQUHLTINRINXJMPLDALXIMODMOVMVINOPNOTORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAXRICALLENDMLDAXLHLDPCHLPUSHSHLDSPHLSTAXXCHGXTHLENDIFMACROTITLE  PF FP! ( 2/?'  v:P@< !  PP27 ( *"  NZZ NCC POPEP M x_BH!œ#¶ ¦{KÈCÈ<:JCR:  !6 s!#  ɯ<:O=_Z!F!V#fjQ̓E!^#Vo&)~#FxGyѯ<àn8m!~ڢͅ6~44O! s#r!~ ڿ6ͅ^4!mw!wp!~ͅ!55N! N#fio&)^#fkz'{ͅ>ɯo>g"k!m6ů{_zW5>)D*kOxGd !m?FDM!xGyOڂÃ)sn55)=â|g}o=î--#zg{ozg{ozg{oÓ:: ;,!ɯ22=2l!"]!~H5_!m~0:ą:  *":  :‰:̅ԅ!^#=ʅVq”*qͦ1& O:lµ̅>2ly:_!w~!s!m~ùy !~=w_!m~ ͅͰ>2lyPLnR>UX:l̅2l͓*>EK2C!" """ :ʼ:*1 |R|ͦ0FIL: R  R* } *" :¿::¿üX!C^#fk[@ :Œ:=ʌG!ʆF#H vÛc*| EH ͺ,^1 ͦ *""1 EH DH ͺ,1 ͦ :  1:  " > 2 :|: |Ë  |*" ͩ !6="1 :  1}1:n:>BʋSSͦSSxS 1:  1"" ͦ 1 |R >O U!" 1 1!|_!^#fk $8AP`ixH ñññ81Ľ y0îH ñGîG  ñH ñ(Ľ yîH ñîîĽ y0îîH ñG 1: :,; c*| } 8OĽ y0G G t :):,.>C :|: Jü;r :R: ʼʋ!ʼR!ʼʋ>SR{ozg!~4ʧͦ !6 ! **̈́**̈́\iͩ !w#H USE FACTOR !* "z{*"* "I !" :1 R O*UR X* G:xl :  *̩ : l x͖ *#"EH DH 0:~ ! ^4! w͆ Æ *! 6z͖ {͖ 4>R>V>D >P >L >N1 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y*NH ~fŸ!~2(#"):(}Ͱ?4Aځ[ҁA2Ͱ::ʁ"+ ~@*+ ~wͰ~=:(ʍͰ;ʣ ‚Ͱ;:(ʓ Ͱ ²Ͱ“ڙ!<~ ʍ#   #  ""+"$2/:/]"-~HO*"ͨʇ*-!/4&*+ ~w !"~#r~ 2425:4~"+~H-!5~³5ڙ*+""!<~ -*"ͨ"6:4A *6~ # >;*6 ~ %#  !44Ì24:4~"+~AW!448ڙ !<"-~ ~*-hâIâ*â=â|âb   ~*Nͮ*N!ͮ*N$ͮ*N'ͮ7*N?ͮ*+~w!<ͼڐ<!,"8!.":!&"&!<"-*8DM͸zI#}2/*&DM*:͸"0:/"2*0DM*2*-ͼڐ*2#"2*-"-!/5e*+~w*N?ͮ|}!(~5*)~#")O*Nͮ|~#fo_:(G*)~ #x2(")*-*-9 }o|g*8͸͸!>͖!͋*-~# D >;*- ~# c   "-!/$>0> w#Ëͱ ͸>0+w=š_z/W{/_zbk 2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#.¶66*>?w#> w#.7:77!a{   `OE!y6$ -7rBo&))T])))!yIANAANDANICMACMCCMPCPIDAADADDCRDCXENDEQUHLTINRINXIRPJMPLDALOWLXIMODMOVMVINOPNOTNULORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAXRIASEGCALLCSEGDSEGELSEENDMHIGHIRPCLDAXLHLDNAMEPAGEPCHLPUSHREPTSHLDSPHLSTAXXCHGXTHLENDIFEXITMEXTRNLOCALMACROSTKLNTITLEINPAGEMACLIBPUBLIC7 PF FPA A A* A A A(#&&#&2#/?&#' '( v'( %:P!@"<& #*)&# PP%27&#(&#  $ %*%"$  NZZ NCC POPEP M êUi !9DM>2Z`i6#6`i^#Vr+sn! s! w#w͐! nѯg͐n} `i^#Vr+s! ^#Vr+s! n͐s! n}x>2ZZ! s#r! n&r! ^#Vr+s`i^#Vr+sns! 5>͐6͡>2Z!ͤ#}2Z!! ͤ}2t[#Z"%ZY"#Z>2Z>2ͧü!9ØO!9DM`i6! 6! 6! n&! n&`in&!! BACKUP version %d.%d%d !/ X Copyright (c) 1982 Zenith Data Systems ` !9Ä ( Ó | O~e+.!9DM*Z}— l o ! s#r͐|®  ͐#| r `is`in} *Yn}? *Yu +| *Y| *Y| x  *Y} {  *Y} ~  ́ *Z}ʌ  !91 UU!9DM`i6>#6>v2Z͐+ ͐+ !Z! . ! + *Zg!Z##! s#r͐6Ê !9Ù W!9DM! w#w͐ ͐)Yw#w! ^#Vr+sé ! w#wZ`is#r͐n} `i^#Vr+s ͐n} !s ͐n}[? ͖͐ |' !s ͐6! ^#Vr+s͐s ! ^#Vr+s)Y͐s#r͐n}=ʇ ͐n}ʇ ͐n}[ʇ `i^#Vr+s[ ͐n}=½ ͐6`i^#Vr+s! ^#Vr+s)Y͐s#r͐n}[ ͐n} `i^#Vr+sý ͐n} `i^#Vr+s͐n}  `i^#Vr+s `i^#Vr+s͐6͐s ͖͐ |2 !s `i^#Vr+s͐n} R `i^#Vr+s; `i^#Vr+s͐6! ^#Vr+s͐s ! 9Ñ P=PØOò2!9DM! w#w͐  ͐ Y6! ^#Vr+sá ! w#w͐  ͐ u[6! ^#Vr+s *t[&u[6*Y`is#r͐| !u! w#w͐n}n! 6͐#! s#r͐n& |͐n&͂ ! s! n}D EʡUʔAvCvRvOvIvFvGvHvJvKvMvNvPvTvWvXvYvZv͐#n}: ! Invalid date in option. ͅ ! 6#6Þ͐##! s#r͐ n};=͐ n}=! ^#Vr+s͐ n! s͐ 6͐##͈ "Z͐ ! ns*Z|ž!wÐInvalid date in option. ͅ ! 6#6͐#n}:!Invalid exception file specifications. ͅ ! 6#6Ñ͐##"Y*Yn};*Yn}*Y#"Y*Yn! s*Y6͐##͋ ! s#r*Y! ns͐|U͐##"YÑ![ÃInvalid exception file specifications. ͅ ! 6#6͐#n}:!üInvalid user option. ͅ ! 6#6s*t[&u[6͐##! s#r͐"Y*Yn}; *Yn} *Y#"Y*Yn! s*Y6͎͐ ! s#r*Y! ns͐|I͐"Ys!OeInvalid user option. ͅ ! 6#6! 6[! n! s! 6]! 6! 6#6! !Invalid option %s specified. ͅ ͐|! n&Y6@! 6[! n! s! 96]! 6! 6#6! !:Invalid option %s specified. ͅ ͐`is#r͐n};k͐n}k`i^#Vr+sJ ͐u!9ÄuP!The BACKUP utility is designed to take any number of individual ́!files and put them into a single backup file that may extend ́! _across many disks. Each disk used to hold the backup file is ́!j}called a volume. ́!Command form: A>BACKUP {destfile}={sorcfile},{sorcfile},...́![{x};{x};...] ́!.Where {destfile} is the file name (and drive name if necessary) of ́!9o the backup file receiving all individual files; ́!zþwhere {sorcfile} is the file name (and drive name if necessary) of ́! each individual file you wish backed up; and ́!Mwhere {x} is an option that further defines the operation as shown: ́!X| *B Backup file directory [B] ́!ü ;D Date on backup file directory [D:12-19-58] ́! CE Exception files [E:DONTSAVE.DOC,LEAVEIT.ASM,*.BAS] ́!, #L List directory [L] ́!7P Q Query user [Q] ́![v !S System files [S] ́!å *U User numbers [U:0,...,15] ́! K V Verify copies [V] ́ò2ØOÇMNÈ ä!4"35Ê869:V'Vþ;!9DM*Y|)*Y|Y!/QNot enough parameters specified. N*Y|œ!lÔInvalid selection file specifications. N*Y|¬N>2Z*}*Y}!- 6 !- !. n&##!- 6!/ "Z*Z|! Invalid date. N>2`i!Z`i!"Z!& w#w!" w#w͐"{͐"u[n}^m!& ͐"!" ^#Vr+s@*Z|¥!ÝNo files selected. N|K>2Z>2Z>2Z*Z##|K*Y!* s#r*Z!, s!"!& w#w!" w#w͐"͐"u[n}*Y"]!"]!& ͐"!( s#r͐(!, n&!$ s#r|h!͐**Y͐(͐"!$ s#r͐$|ž*Z!, s*Y!* s#r!!$ s#r|͐('͐$|!" ^#Vr+s͐$|*YK!|/*Y `iK!, n}2Z!*Y N!;9`ØOçP!9DM͐`is#r͐n}]ʓ͐n}ʓ`i^#Vr+sr͐n}]§͐6!Invalid option ] specified. Z!Y"Y͐*Y]!!9J%!9DM>2Z͐-n}ʱ͐-!& s#r͐&n},E͐&n}E!& ^#Vr+s"͐&n!( s͐&6`i͐-!$ s#r͐&!( ns͐$|Œ>2Z!ü͐&!- s#r͐-n},®!- ^#Vr+s >2Z!ü!)9P!9DM! 6͐n&|! ng ?͐nѯg! sb͐n},#͐n}\! n&9!~! n&u[6͐n}V!~pb!~! ^#Vr+s! ^#Vr+s!9ÐØOJ%!9DM͐ ! s#r͐n}͐n}*͐n}?! ^#Vr+sä͐n}! Backup file name can not be ambiguous. ͊!!Z͐ ͍|.!͐ ! s#r͐n}.]͐n}]! ^#Vr+s:͐n}.!nÓExtension on backup file specified. ͊!þExtention 000 will be assumed. ͊! w#w͐͐Z60! ^#Vr+s!!9 ØOUU!9DM!.Enter today's date: ͐! ! !9DM! ^#Vr+s! ~#fon&A+s! ^#Vr+s6:`iw#w͐! ~#fo#͐n} ±! ^#Vr+s! ~#fo#͐n&|g}os`i^#Vr+sÊ! ~#fo n} v! ^#Vr+s6.`iw#w͐v! ~#fo ͐n} ;v! ^#Vr+s! ~#fo ͐n&|g}os`i^#Vr+s͐6!9ÚUJ%%<ØO*V!O9DM! n&! ͋*Y!$ s#r͐$!& s#r͐$n},͐$n}!$ ^#Vr+s͐$n!( s͐$6`i͐&͎͐$!( ns! 6!) !͋`i!͋! s#r!~ ͐~#fo! s#r͐~#fo|g}o! s#r͐! s#r! n&`in&͐!) ͑|͐)[͐)[~#fo͐|g}os#r*Z#"Z ͐)[͐)[~#fo͐}/o|/g|g}os#r͐~#fo#s#r͐~#fo a !4 T Internal error, too many files ͔!͗`i!͋! s#r!I͐$!& s#r!( n},£ !& ^#Vr+sæ õ ͐&!$ s#r*t[&! ͋ !9 M-VØOÜ)'VN!9DM`i!Z `i "Y#|x!`i!!7!Can not open master backup file %s, !C!b!not enough space on the disk. |u!!Û!{!~! *Y !`i "Y!Û!!9ù!^VMNØOÜ) !9DM! 6#6`iw#w*Z! s>2Z͐͐#$"!!Z*Yͧ!+|"! w#w$"`i^#Vr+s!! n}2Z͐|<"!"! !Zͪ!! ͭ!! !^"Ã"Can not open master backup file %s, Ͱ!!"î"not enough space on the disk. Ͱ!ͳ!|"!"Ͷ!|"!"!!9"UJ%;=V!F9DM*]n}#!A%! n&! "! w#w! 6*]! s#r*]!$ s#r͐$n},Y#͐$n}Y#!$ ^#Vr+s6#͐$n!( s͐$6`i*]"͐$!( ns! 6!) !"`i!"! s#r!$͐#! ^#Vr+s$*]#"]͐)!) ! s#r͐`ins!Z͐"|$$͐~#fo! s#r͐~#fo|g}o! s#r͐~#fo#s#r͐! s#r͐)[~#fo͐|g}o|€$$! ^#Vr+s@k]! s#r! ! ~#fo#͐"͐,$! 6$`i!"! s#r!´#! n}$+%͐$"]!( n},%*]#"]%+%!"]*]!$ s#r6#*t[&! "͐A%!9Y%é*=PØO*!9DM`iw#w! w#w͐Ҝ%! ~#fo#͐6 ! ^#Vr+so%! w#w͐%! ~#fo ͐6 ! ^#Vr+sä%͐ M%͐ #n}:“&͐ ͐ n&P%s͐ n&! s! n&.&! n&r&*Z}l&!<&g&Invalid drive designation on backup file. S%!Ó)! ~#fo! ns! ~#fo##s#r͐ n}&*Z}&!&þ&Invalid filename. S%!Ó)! w#w͐ n}.(͐ n}..(͐ ͐ n&P%s͐ n&V%|'͐ n}?š'! ~#fo#͐͐ ns! ^#Vr+s! ^#Vr+s͐ڗ'͐ n}.ʗ'͐ n}ʗ'*Z}ʍ'!u'È'Invalid filename. S%`i6#6.(+(͐ n}*'͐'! ~#fo#͐6?! ^#Vr+så'͐ n}'͐ n}.'! ^#Vr+s'.(+(*Z}!(! ((Invalid filename. S%`i6#6.(&͐|~)͐ n}~)! ^#Vr+s! w#w͐ n}~)͐ ͐ n&P%s͐ n&V%|Ž(͐ n}? )! ~#fo ͐͐ ns! ^#Vr+s! ^#Vr+s͐)͐ n})*Z}(!((Invalid filename. S%`i6#6~){)͐ n}*K)͐E)! ~#fo ͐6?! ^#Vr+s)~){)*Z}q)!Y)l)Invalid filename. S%`i6#6~)T(͐|ʍ)!Ó)!Ó)!9î)'VØOWUU!9DM*Y͟)*Z&@!)) Insert another disk in drive %c for backup, ͢)!*$*and hit RETURN when ready, ͢)!/*O*or hit any other key to abort. ͢)ͥ)`is#r! ͨ)͐ x*!à**Z&+! s#r͐!%ͫ)!à*!9!9DM! ~#fo*Zs*!9!9DM! n&|g}o! s! n&  +! n&~+!! n} Y+Y+?Y+.Y+,Y+;Y+:Y+=Y+*Y+[Y+]Y+_Y+^+!!Æ+=é*=PØOUMNz>6@'V!9DM`ik+*Y|,*Y*Yn&n+s*Y#n}:+*Yn&A+*Yn&F,!++Invalid drive designation. q+.,*Yn&`is!P w#w!J w#w͐JJ,͐J! 6?!J ^#Vr+s#,!J w#w͐Jy,͐J! 60!J ^#Vr+sR,! 6!j !t+`i!t+!N s#r!.!,, Name Volumes Files q+!,, Date q+͐N)!j ! s#r͐`ins![ ͐w+!![ z+"'Z>2Z!h+!H s#rzʁ.͐H}+|ʁ.!R !H ~#fo'~#fò+!L w#w!J w#w͐J-͐L ?!H ~#fo# ͐Jnѯg!L s#r!J ^#Vr+sÙ-!L ~#fo#s#r͐L!H ~#fo##! .. %-.8s '%3dq+!R !H ~#fo%~#fo!B.g. %4d G%s q+*'Z̓+!P ^#Vr+s!j !t+`i!t+!J 6#6͐J͐P.`i!t+!J ^#Vr+sä.`i!t+!N s#r!-.!9/=ØOÇMNz>'V!9DM*Y|O/!%/G/Not enough parameters specified. .é2*Y/|_/é2`i!Z/!`i/"'Z#|·/`i!/î/Can not find master backup file %s. .Þ2>2Z!.! s#rz/!//Invalid backup file .Þ2͐ /|&0!00Invalid backup file. .Þ2! ~#fo%~#fo! s#r! w#w! w#w͐ҙ0͐ ?! ~#fo# ͐nѯg! s#r! ^#Vr+sN0!00 Filename User Start .!00 End Size in .!01 Volume.!!1@1 Volume Kilobytes .! 6#6͐.! s#rzg1j2! ~#fon}y1j2! ~#fo+~#fo! s#r͐)))! ~#fo+~#fo1! ^#Vr+s`i! ~#fo#/! ~#fo%n&! ~#fo-n&! !12 %-12s %2d '%3d.͐! ~#fo&n&!;2U2 %3d %%7d .! ^#Vr+sN1͐#͐!{2×2%d file(s) on %d volume(s) .*'Z /é2!9ø2P!9DM! w#w͐ n} 2! ^#Vr+s͐ n}A3͐ n}-A3͐ n}/A3͐ n&͵2|3!4͐ k! ^#Vr+sn&! s#r2͐ [3͐a3!4͐ n}q3!4͐)`is#r͐ n! s! ^#Vr+s! w#w͐ n}3͐ n! n}3͐ n&͵2|3!4͐ k! ^#Vr+sn&! s#rÞ3͐4͐4!4͐ n},4!4`i~#fo͐s#r! ^#Vr+s! w#w͐ n}ʟ4͐ n&͵2|s4!4͐ k! ^#Vr+sn&! s#rR4͐Ҿ4! ~#fos#r`i~#fo͐ s#r͐4!94LWU!9DM͐4`is#r͐!$4`i~#fo!~#fo*5!9N5'Vþ;MØOWUNU!9DM*Y! s#r*Z! n}v5!Á8͐65! n}2Z95`i!Z<5*Z}6*Z&@`i!55 Insert backup master volume 1, %s,in drive %c ?5!5 6and hit RETURN when ready.?5Å6*Z&@`i*Z&#!,6W6 Insert backup volume %d, %s, in drive %c ?5!e6À6and hit RETURN when ready.?5B5 ʔ6Å6*Z&+!%E5!`iH5! s#rz6l8*Z}7`i!66 Can not open master backup file %s, ?5*Z&@!757insert another disk in drive %c ?5!A7]7and hit RETURN when ready, ?5!h7Ç7or hit any other key to abort.?5E8`i!7÷7 Can not open backup file %s, ?5*Z&@!77insert another disk in drive %c ?5!78and hit RETURN when ready, ?5!!8@8or hit any other key to abort.?5B5 i8*Z&+}2Z! K5!Á8Ô6! K5͐"Y!Á8!9Ó8LWU!~9DM͍͐8`is#r͐|8`i~#fo!͐s#r8͐!$͐8`i~#fo!~#fo͐s#r! !͐8`i~#fo#6͐!!͐8|&9!-9͐-9!9E9AßEØOáI!9DM! w#w͐͐  :͐@k]`is#r͐͐ 99|“9!:͐<9! s#rz°9!:͐|ʼ99!99Verify error, try BACKUP again (Y/N) ??9B9|99y9! ^#Vr+sU9!:!9(:Ê8\WV^V!9DM͐J|™:!!*Y:!!Y*Y:!@!Y!Z":!!*Y:!!Y*Y%:!õ;Y"#Z*!B s#r*|g}o|:!͐B*Y:!!Y*Y:Y"#Z!͐B*Y:!D w#w͐D͐J҈;͐D@k]!@ s#r!@*#Z͐@":*#Z@"#Z*#Z*%Zs;!!Y*Y%:Y"#Z*#"!D ^#Vr+s ;`i6!@*#Z`i":!!Y*Y%:!õ;!F9!9DM*Z`is! 6#6͐|<͐Z`in& 0s`in& s! ^#Vr+s;!q>!!*'Z=+|@>!q>`is#r͐|g}o|j>`i~#fo@s#r͐q>!9Æ>MØO*!9DM! ~#fo0n&ڹ>! ~#fo1n} ?! ! ~#fo#}>! !>?Invalid version of BACKUP for file %s ̀>!-@! ~#fon}/?! ~#fon}/?!-@! ~#fo#n&Y?! ~#fo#n&_?!-@`iw#w͐?! ~#fo##͐n} ??ô?! ~#fo##͐n&̓>|´?!-@`i^#Vr+se?`iw#w͐'@! ~#fo# ͐n} ?'@@! ~#fo# ͐n&̓>|@!-@`i^#Vr+s?!-@!9!9DM! ~#fos#r! ^#Vr+s6͐|g}o P`is#r! ^#Vr+s͐ )0s`i~#fo ͉s#r! ^#Vr+s͐ )0s! ^#Vr+s6-͐|g}o`is#r! ^#Vr+s͐ )0s`i~#fo ͉s#r! ^#Vr+s͐0s! ^#Vr+s6-͐|g}o`is#r! ^#Vr+s͐ )0s`i~#fo ͉s#r͐|ʯA͐͐0sõA͐6 øA!9ALWMUNØO4\WLKÀL'V^VÜ)ÁM!9DM`i!$ ~#fo#A͐"! A!`iA"'Z#|^B`i!1B@BCan't open %s A*t[&! A!ÖEÐE*'ZA! s#r͐!#A! ~#fo!~#fo! s#r͐"`i!BóB%s from user %d A!$ ~#fo6!$ ~#fo'*YAs#r!$ ~#fo%*Z&#s!$ ~#fo-͐"s! w#w! 6*YA*YA@C! 6*'ZA͐WCE!!Y*'ZA! s#r͐C*'ZA! s#r*'ZA! s#r͐͐±CE!͐͐A|C*'ZA*t[&! A!ÖE!!Y*'ZA*t[&! A! ~#fo͐s#r! n}~D*YA! s#r! ~#fo!*YAs#r! ~#fo#6!Y!A͐!"A!!Y*YA+|DA|D͐"! A*'ZA*t[&! A!ÖEA|D!!Y*YA+|DDÖD͐"! A@C͐"! A*'ZA#|;E`i!%E5ECan't close %s A*t[&! A!$ ~#fo+͐s#r!$ ~#fo&*Z&#s!$ ~#fo)*YAs#r!ÖE!9E35'VUMNØOLWÊ8\W4LKÀL!9DM*Y}E!ØI! ~#fo%n&+͢E|E!ØI*YͥE*Z&+!%ͨE`i!ZͫE!`iͮE"Y`i! ~#fo#ͫE`i!PF^FVerifying %s ͱE! ~#fo-n&! ͨE!`iͮE"'Z#|°F`i!FêFCan't open %s ͱE*'ZʹE! s#r͐!#ͨE! ~#fo!~#fo! s#r*t[&! ͨE!! ~#fo'~#fo*YͷE! ~#fo-n&! ͨE!!)Z*'ZͺE! s#r͐+|,H*'ZͽE! s#r͐͐tGbI*'ZE! s#r͐͐—GbI*t[&! ͨE!͐͐E|G! ~#fo-n&! ͨE*'ZͥE*t[&! ͨE!ØI! ~#fo-n&! ͨE!!)Z*'ZͺE! s#r*t[&! ͨE!!Y*YͺE+|H*Z! ~#fo&nѯgWڤH! ~#fo-n&! ͨE*'ZͥE*t[&! ͨE!ØI*Z&#͢E|H! ~#fo-n&! ͨE*'ZͥE*t[&! ͨE!ØI;H! w#w͐_I͐)Zn͐Yn}QI! ~#fo-n&! ͨE*'ZͥE*t[&! ͨE!ØI! ^#Vr+sHG! ~#fo-n&! ͨE*'ZͥE*t[&! ͨE!ØI!9íI=PWU!9DMͧIͤI`is#r! ͪI͐YI!I͐NI!IõI!9!9DM*Y}J!DJ! ~#fo #n&|g}o`is`in}>J!DJ!DJ!9SJM!9DM*Y}iJ!J*Y`is#r͐n};ʓJ͐n}ʓJ`i^#Vr+srJ͐n! s͐6*Y͐ PJ! s#r͐! ns͐J!9JMØOáI!9DM*Y}J!CK`i͐J! n&`i!K6KBackup %s from user %d (Y/N) ?JJCK!9XKULW*V!v9DM! !OK͐RK`is#r͐!#OK`i~#fo!~#fo! s#r͐!$OK`i~#fo!~#fo! s#r͐! s#r`i~#fo#6`i~#fo!͐s#r͐!!OK! s#r͐|L͐wL͐+|3L! ~#fo#s#r]L͐++++|UL! ~#fos#r]L!UK͐͐tL͐wLK!9ÕL4ULW35Ü)ÁM!z9DM*Y̓L! s#r! !͆L*Y͉L`is#r`i~#fo!͐͐s#r`i~#fo#6͐|M͐!!͆L! s#r(M͐!"͆L! s#r͐|7M!xM͐|YM*Z&#͌L|VM!xMuM͏L|gM!xM͒L|uM!xMÝL!9ÓMþ;M-V'VN!9DM*Z&#}2Z̈́M`i!Z͇M`i͊M"Y#|M*Y͍M!`i͐M"Y!M*Z&+}2Z̈́M!M!9NJ%;=!9DM͐-n}ʾN͐-!$ s#r͐$n},GN͐$n}GN!$ ^#Vr+s$N͐$n!& s͐$6`i͐-N|pN!N͐$!& ns`i!+ ~#foN|ʙN!N͐$!- s#r͐-n},»N!- ^#Vr+sN!N!'9N2O !\N!N2O7,2q*N:q):*O=*O=r:qo&` :>KO@w#gO.WOgO66͊OڀOw#hO͊OwO> w#‚O.7:77?áOQuP!y9DM! `i͛O`i͞O!9!9DM`iw#w! ^#Vr+sn}O`i^#Vr+sO͐O!9 PdTÓT!9DM! n&P|ͣ9P! n& P|ͣCPÓT!9DM! n&@P|jP! n&oP! n&{PU!9DM͐n}ʥP! ^#Vr+sn&xPÃP!9DM͐`is#r! ^#Vr+s! ^#Vr+sns{PùP͐P!9!9DM! n&0ͯQ! n&9ͯ-QTPlU=P!i9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{UT`in}%?T! ! s#r! 6#6! s! s͐n}-¸Q! ^#Vr+s! 4͐n&$Q}Q! 'QQ!! s#r! ^#Vr+sn`is{. R! 'Q! s#r! 4! ^#Vr+sn`is`in&*Q}DLRUʈRXʑROʚRCRSS)T͐~#fo|R! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 àR! 6àR! 6! ~#fo! n&! ^#Vr+s~#fo! !Qѯgs#rÉS! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+sÉS! n}$S! 6#6! ^#Vr+s~#fo! s#r͐n}ʉS͐|ʉS! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+s?S͐6! ! s#r! n}S! ^#Vr+s!S! ^#Vr+s6 åS͐! ^#Vr+sns{S! ^#Vr+sS! n}&T! ^#Vr+s!&T! ^#Vr+s6 S<W~+ xW|}:wo&W2w&!o IW . & ) ,7:)~:,"s!"u*|ʲW**s·W! ~²W6*u*+"*"*u#"u~W+cCOPYRIGHT (C) 1978, DIGITAL RESEARCH o&)a{__> A> AH~A#XO****!*$*'!:5ʮ·÷:2! ">2!4~:2:2*":2:bNo>2:!4Q!^*|#K &FNwy(*DM:G͏J͇\:(*"ɯ21!X: :] \;<’!S\2|\͹ ˜! DM\͹„ë!S\::!S3_A2d|:g::A2H::,!X3 \H:<2 =7M!S::2:a:o!6S3 ʄYyy„H>2n:ʑ:ß!S3 \A2<2 =d|:g:ʄ:ÄA2":!S3 \H1:7 !S:ʄ:Ä>2 * ~#* ~#'! #5/w!6:O':ʄ:>dH!S*"!0"!+"1*~  ~# — ¸*~*6**#s#r**z{ *"*q#p *%"Ç!qS2!+"1*~  ~# E:2:2 ʚ:2:2  :2:2 **͒DM*#͒" **" x½ *:2:222* :2:2*%"0!OS d|7͒" ͒"~2 ~2"##~2~:G:*ʆ>!2x2"~#foCP/M-85 BSYSGEN VER 2.2.102SOURCE DRIVE NAME :SOURCE ON *, THEN TYPE RETURNDESTINATION DRIVE NAME (OR RETURN TO REBOOT):DESTINATION ON , THEN TYPE RETURNCOPY SYSTEM FILES (Y/N):WRITE ERROR DURING SYSTEM FILES ERROR READING SYSTEM FILES INVALID DRIVE NAMEUNABLE TO SELECT DRIVENO SOURCE FILE ON DISKSOURCE FILE INCOMPLETECOMMAND SYNTAX ERRORILLEGAL OPTIONREBOOT):DESTINATION ON , THEN T BIOS88 SYS BIOS85 SYSALTCHAR SYSf      AACE FILE ON DISKSOURCE FILE INCOMPLETECOMMAND SYNTAX ERRORILLEG:G!  _2x2" / :@2\  !\>w#> w#; >2:G*   d 2  _2 ʿ ʇ      y _B¥ >Y2ï N >2 ʇ   :@2\"!]w# *    "!ey >Ow# * !S!S2 2 " x7 * ~! o6 $~2 :  : : oK $) ~#N] * " e ! 4q * #" } y2 " Q: Oz* *  y       :  !TD )? 3[àeø =}×rÝ l ó V 7ýÿE$rÃo%Ð)'+2,[-Ó.:6b8Í:'<ó==?@ÁD1KöNÓRVV"_\!"_!"_*_*_܄" _*_* _s*_^!}\V" _\* _* _^! * _^!zͰ},!!vA* _^! ͔* _^!z܅}o* _^! }}V"_\!_:_&o! Ņҝ!_:_&o!Ņ:_&o! Ņ}o:_&o!Ņ}!!vA:_&o! ͔:_&o!z܅}!!!vA! A!A:_&o!}[!!vA! A!Aõ:_&o!}ҋ!v! A!Aõ:_&o! }҈*_:_&os!v̓o!}2_:_&o!v!!A!H!!A:_&o!!A!J!!A!v̓!v̓!v̓!v̓!v̓!N&`}2#_!O&`}2"_:"_&o!͌:#_&o" _* _H"_*_*v]&`}2._:._&o"$_*$_!^!*x] &`s*x] +"2_!!(+"0_#ͱ"`*0_#"0_*`+"`|!^*0_*2_*0_&`s!|^!*x]4&`s*x]5+"2_!!(+"0_#ͱ" `*0_#"0_* `+" `|q!|^*0_*2_*0_&`sB!!\.`!B!].`!I!^.`!O!_.`!S!`.`!8!a.`!5!b.`! !c.`! !d.`!S!e.`!Y!f.`!S!g.`!!h.`!!i.`!!j.`!!k.`!!\܄}26_:6_&o!}N!}2z^i!}f!}2z^m!}2z^!!}.`!!~.`!!.`!!z]܄"4_!!!\܄"4_!!z]܄"4_!!}.`!!!\܄"4_!S!e.`!Y!f.`!S!g.`!!\܄":_!!z]܄":_!!}.`!"!\܄":_!!z]܄":_!!}.`!"!\܄":_!S!e.`!Y!f.`!!\܄":_!!\܄":_!\!! ͌ͼ 45.5!&!\!! ͌ 50 !&!\!! ͌ 75 !&!\!! ͌. 110 !&!\!! ͌T 134.5!&!\!! ͌z 150 !&!\!! ͌͠ 300 !&!\!! ͌ 600 !&!\!! ͌ 1200 !&!\! !   1800 !&!\! ! ͌8  2000 !&!\! ! ͌^  2400 !&!\! ! ͌̈́  4800 !&!\! ! ͌ͪ  9600 !&!\!! ͌  19200 !&!\!! ͌  38400 !&!v  Baud rate selection ̓̓!v!(A!!!AR pSpace̓!!!A~ q=next possibility,̓̓!v͔  ̓!!!Aͷ pBACKSPACE̓!!!A q=last possibility,̓̓!v  ̓!!!A pRETURN̓!!!AD q=select this one)̓̓!"H_! }2J_!!v!!A!jA:J_&o!}Ң *H_!Ӈ"H_ò *H_#!Ӈ"H_!!v!!A!kA!v Baud Rate :̓!!!A!pA!\*H_! ͌̓!!!A!qA!J_:J_&o! }z !v̓*H_}2>_:>_&o!"Z_!}2\_!}2^_!vͦ  Enter device buffer size (̓!A p10-255̓!A q):̓!V_:V_&o!0͔:V_&o!9܅}H :V_&o!0{ozg"X_*Z_! ͌*X_"Z_*Z_!ͰE !}2\_k :V_&o! }d !}2^_k !}2\_:^_&o:\_&o} *Z_! ҕ !}2^_!v̓:^_&l *Z_"L_*L_!v  Bits per character [̓!A p5, 6, 7 or 8 ̓!A q] :̓!l_:l_&o!0{ozg"j_*j_!͔*j_!܅}ҳ *j_"`_*`_!\!n͹!N͹͚!o͹͚!O͹͚!e͹͚!E͹͚z!vͪ Parity [̓!ApO̓!Aq(dd), ̓!!vApE̓!Aq(ven), ̓!A*pN̓!AEq(one),̓!vY] :̓!x_:x_&o!\cOҖ:x_&oã!}2n_!}2n_!}2n_E*:n_&o!\!n͹!N͹͚!r͹͚!R͹͚!d͹͚!D͹͚z!ve Handshake Pin [̓!A{pN̓!A͗q(one), ̓!!vAʹpD̓!Aq(tr/pin 20), ̓!!vApR̓!Aq(ts/pin 4)] :̓!_:_&o!\cOJ:_&o_!}2z_!}2z_!}2z_D.UAKUAK:z_&o!\!h͹!H͹͚!l͹͚!L͹͚z!v Polarity [̓!!vA/pH̓!AWq(ready when High), ̓!!vAtpL̓!A͜q(ready when Low)] :̓!_:_&o!\cO:_&o!}2_/!}2_/H$//////////////////////////////////:_&o!\!x͹!X͹͚!e͹͚!E͹͚!n͹͚!N͹͚z!v͍ Protocol [̓!AͣpX̓!A q(on/Xoff), ̓!!vApE̓!A q(tx/Ack), ̓!!vApN̓!A9 q(one)] :̓!_:_&o!\cOw:_&oÃ!}2_!}2_!}2_E3oyeoye:_&oV}2_}2_}2_}2_\:_&o4!}2_A!}2_A *A:_&o###!ރ:_&o###ă}2_:_&o##:_&oރ:_&o##:_&oރ:_&o###:_&oރ:_&oă}2_:_&oă}2_V"_"_}2_\!}2_:_&o:_&o}2_:_&o0}2_:_&o }2_*_f:_&o}2_w:_&o####}2_w:_&o}2_w:_&o }2_w&3DUw*_à:_&o@}2_í:_&o}2_í~:_&o}2_:_&oV}2_\:_&o!p}2_!p}2_:_&oV}2_\:_&o&!7}2_3!7}2_33:_&o}2_:_&o:^&o!}!*v].`!*x].`!*v].`!*x].`!*v].`!*x].`!*v].`!*x].`!^LPT!&q:^&o}2_:_&o*v]}#.`:_&o*x]}#.`!*v]}.`!*x]}.`!*v]}.`!*x]}.`:^&o!}:^&o!}}!A*v]}.`!A*x]}.`!@*v]}.`!@*x]}.`:^&o!}:܃^&o!}}`!A*v]}.`!A*x]}.`!*v]}.`!*x]}.`:^&o!}:^&o!}}!*v]}.`!*x]}.`!*v]}.`!*x]}.`:^&o!}:^&o!}}@!*v]}.`!*x]}.`!*v]}.`!*x]}.`:^&o!}Ҟ!*v]}.`!*x]}.`!*v]}.`!*x]}.`:^&o!:^&o*^!O}2_:^&o*^!O}2_:_&o*v]}.`:_&o*x]}.`!R}2_:_&o*v]}.`:_&o*x]}.`!U}2_:_&o*v]}.`:_&o*x]}.`*v]}###&`}2_:_&o!}o|g}2_:^&o!}:_&o}2_:^&o*v]} .`:^&o*x]} .`:^&o!}:_&o }2_:_&o*v]}###.`:_&o*x]}###.`!:_&o:_&o:_&o:^&oL!^jTTY!&!vͬ) *** Printer Configuration ***̓̓"!v; 1- MX-80 or other PARALLEL Centronics-interface printer̓̓!v 2- H/Z-25̓̓!vO 3- H-14 or TI-810(WH-24)̓̓!v| 4- Dec LA-34 or LA-36̓̓!v͡ 5- Diablo 620̓̓!v/ 6- Diablo 630,1610,1620,1630 or 1640(WH-44)̓̓!v  7- MX-80 Serial̓̓!v9 8- Votrax Type 'n Talk̓̓!vo" 9- User-defined SERIAL printer̓̓!v̓!v5 Choose the number that corresponds to your printer :̓!_:_&o!0{ozg"_*_!*_! Ͱ}`!v& Bad choice. Choice [1..̓! =] :̓!_:_&o!0{ozg"_*_}2_:_&oV}2_\!}2^!^͏TTY!&!"^!vͽ You have selected ̓:_&ot"!v"an MX-80 Parallel, and Centronics̓̓!v̓!vE - Assure Centronics style parallel operation̓̓!}2^!^` LPT!&Í"!v~ an H/Z-25̓̓!}2^!}2^!}2^! }2^Í"!v an H-14 or a TI-810(WH-24)̓̓!}2^!}2^!}2^! }2^Í"!v!a DEC LA-34 or an LA-36̓̓!}2^!}2^!}2^Í"!vM! a Diablo 620̓̓!}2^!}2^!}2^! }2^!}2^Í"!vͬ!%a Diablo 630,1610,1620,1640 or a 1650̓̓!}2^!}2^!}2^! }2^!}2^Í"!v"an MX-80 with serial interface̓̓!}2^!}2^!}2^! }2^Í"!vL"a Votrax Type 'n Talk̓̓!}2^!}2^!}2^! }2^Í"j 6!|!!,"":^&o!Ņҏ$!v" Standard settings:̓̓!v̓!v" ̓!\:^&o! ͌̓ # baud̓̓:^&ou#!v<# Handshake on DTR̓̓Ä#!vf# Handshake on RTS̓̓Ä#Ä#r##H##:^&o!Ņ $:^&o#!v# Printer ready on low̓̓ $!v# Printer ready on high̓̓ $## $:^&ov$!v2$ ETX/ACK protocol̓̓Å$!vg$ XON/XOFF (DC1/DC3) protocol̓̓Å$Å$$>$s$$!v̓!vͼ$" Press RETURN to access Main Menu:̓!.v͐^a"_!}2^!}2_*_! Ņ$*_d%!}2^!^%TTY!&!vE% User Defined Printer̓̓!v̓7}2^="^@}2^C}2^:^&o!Ņґ%F}2^I}2^:^&o!}ҳ%:}2^!v%" Press RETURN to access Main Menu:̓!.v͐:^&o}2_:_&o*v]#.`:_&o*x]#.`!*v].`!*x].`!*v].`!*x].`:^&o!}:^&o!}}&!*v].`!*x].`!*v].`!*x].`:^&o!}:^&o!}}M'!*v].`!*x].`!*v].`!*x].`:^&o!}:^&o!}}ҽ'!*v].`!*x].`!*v].`!*x].`:^&o!}:^&o!}}-(!*v].`!*x].`!@*v].`!@*x].`:^&o!}ҋ(!*v].`!*x].`!*v].`!*x].`:^&o!ҷ(:^&o*^!O}2_(:^&o*^!O}2_:_&o*v].`:_&o*x].`!R}2_:_&o*v].`:_&o*x].`!U}2_:_&o*v].`:_&o*x].`!:_&o:_&o:_&o:^&oL!}2^!v)' *** Modem Configuration ***̓̓"!\!n͹!N͹͚!y͹͚!Y͹͚z!vN*? Standard Heath/Zenith Modem? (WH-13,WH-23,WH-33,WH-43) [Y/N] :̓!_:_&o!\cO*:_&o!y}:_&o!Y}}Ҳ*!}2^!"^!}2^!}2^&+7}2^="^@}2^C}2^:^&o!Ņ*F}2^!v+ Press RETURN to access Main Menu̓!.v͐!}2_!|^!^"_*_!Ͱ+:_&o@}2_!*_+"_#ͱ""`*_#"_*"`+""`|+!|^*_^*v]4*_.`!|^*_^*x]4*_.`u+!|^!^*v]4.`!|^!^*x]4.`!^!^"_*_!Ͱ҆,:_&o}2_!*_+"_#ͱ"$`*_#"_*$`+"$`|ʆ,!^*_^*v] *_.`!^*_^*x] *_.`8,!^!^*v] .`!^!^*x] .`:_&o*v]##.`:_&o*x]##.`V"_\*_*_^!a͔*_^!z܅}Z-!!vA! A!A*_^!vA*_*_^sV"`\!"`!`s:`&o!}*`!Ͱ}-!!vA! A!A*`+"`.:`&o! Ņ:`&o!Ņ}o:`&o!Ņ}.*`*`#:`&os*`#"`:`&o!}*`!Ͱ}X.!v! A!A*`+"`*`!(Ͱ:`&o! }}k-*`!*`s!v̓!v.* COMMAND LINE CONFIGURATION HELP̓̓!v̓!v"/9This sub-menu enables you to specify a command line which̓̓!vo/9will be invoked automatically upon a cold or a warm boot.̓̓!vͩ/&Select one of the following sequences:̓̓!v̓!v/"To change a COLD boot command line̓̓!v0 1) type: C (hit return)̓̓!vZ0. 2) wait for prompt: Cold Boot Command Line̓̓!vͥ07 3) type either i) a valid CP/M command (hit return)̓̓!v0? Aor ii) (hit return) removes current command line̓̓!v̓!v81"To change a WARM boot command line̓̓!vg1 1) type: W (hit return)̓̓!vͩ1. 2) wait for prompt: Warm Boot Command Line̓̓!v17 3) type either i) a valid CP/M command (hit return)̓̓!vG2? or ii) (hit return) removes current command line̓̓!v̓!v͔2/To EXIT back to main menu type: X (hit return)̓̓!v2:Press RETURN to access Command Line Configuration sub-menu̓̓!.v͐!v83. T*** Command Line Configuration ***̓̓!v̓!v̓!v̓!v͓3) ;C - Cold Boot Command Line = ̓!^̓̓!v3) ;W - Warm Boot Command Line = ̓!|^̓̓!v4" 4? - Brief Help message̓̓!v̓!vL4 pX - Exit̓̓!v̓!\!c͹!C͹͚!w͹͚!W͹͚!x͹͚!X͹͚!?͹͚z!v4# NSelection [C,W,? or X]:̓!_:_&o!\cOҩ4:_&oØ5!v25$ :Cold Boot Command Line :̓!^v!}2^6!vx5$ Warm Boot Command Line :̓!|^v!}2^6y66?9566656666666666666666666I55666666666656666666666666666666I556:_&o!x}:_&o!X}}2!}2`!^L6TTY]6:`&o}2`!^h6CRTz6:`&o#}2`!^ͅ6BATҘ6:`&o##}2`!^ͣ6UC1ҷ6:`&o###}2`!^6TTY6:`&o}2`!^6PTR6:`&o####}2`!^6UR17:`&o}2`!^7UR237:`&o }2`!^>7TTYO7:`&o}2`!^Z7PTPo7:`&o}2`!^z7UP1ҏ7:`&o }2`!^͚7UP2ү7:`&o0}2`!^ͺ7TTY7:`&o}2`!^7CRT7:`&o@}2`!^7LPT 8:`&o}2`!^8UL1+8:`&o}2`:`&o" `:`&o*v]#.`:`&o*x]#.`!* `܄"`!* `܄" `* `!}o|g!F}2`:`&o8!^͠8TTY!&8!^͵8CRT!&8!^8LPT!&8!^8UL1!&888888* `!0}o|g!F}2`:`&or9!^)9TTY!&Ã9!^>9PTP!&Ã9!^S9UP1!&Ã9!^h9UP2!&Ã9939H9]99* `! }o|g!F}2`:`&o9!^Ͳ9TTY!& :!^9PTR!& :!^9UR1!& :!^9UR2!& :9999 :* `!}o|g}2`:`&o{:!^2:TTY!&Ì:!^G:CRT!&Ì:!^\:BAT!&Ì:!^q:UC1!&Ì:':<:Q:f::!}2_!\!t͹!T͹͚!c͹͚!C͹͚!b͹͚!B͹͚!1͹͚z!v;, Console: [T(ty), C(rt), B(at) or 1(UC1)] :̓!`:`&o!\cO::`&oÕ;!^L;TTY!&&& Punch: [T(ty),P(tp),1(UP1),2(UP2)] :̓!`:`&o!\cO=:`&oë>!^b>TTY!&PTP!&UP1!&UP2!&>necessary during this procedure. Logical devices can be paired̓̓!vFto physical devices as follows:̓̓!vjF=CON: (console) = T(ty) Serial printer on serial port outlet A̓̓!v͸F: ?= C(rt) Video display terminal and keyboard̓̓!v G@ E= B(at) Batch pseudo-device, I/O thru RDR: & LST:̓̓!vUG5 = 1(UC1) Modem on serial port outlet B̓̓!vͦG=RDR: (reader) = T(ty) Serial printer on serial port outlet A̓̓!vG& += P(tr) not implemented̓̓!v)H5 := 1(UR1) Modem on serial port outlet B̓̓!vvH9 = 2(UR2) Video display terminal & keyboard̓̓!vH=PUN: (punch) = T(ty) Serial printer on serial port outlet A̓̓!vI& = P(tp) not implemented̓̓!vJI5 := 1(UP1) Modem on serial port outlet B̓̓!v͗I9 = 2(UP2) Video display terminal & keyboard̓̓!vI=LST: (list) = T(ty) Serial printer on serial port outlet A̓̓!v4J8 == C(rt) Video display terminal & keyboard̓̓!v͇J? D= L(pt) Parallel printer on parallel port outlet̓̓!vJ5 = 1(UL1) Modem on serial port outlet B̓̓!vK9Press RETURN to access the I/O Map Configuration sub-menu̓̓!.v͐!vgK( ECONFIGUR MAIN MENU HELP̓̓!v̓!vK

immediately. Also, all subsequent cold and warm boots will̓̓!vX? reflect these changes. Another configur session is required̓̓!vY to change the system again.̓̓!vZYANOTE - If you exit with the P option, you must first write-enable̓̓!v͂Y the system disk.̓̓!v̓!vY?Q - Make NO Changes: This exit choice nullifies any changes you̓̓!v3Z@ specified during this session. Both the memory and disk will̓̓!v\Z remain unchanged.̓̓!v̓!vͺZ@NOTE! If you exit with the P option, you must first write-enable̓̓!vZ the system disk.̓̓!v[$Press RETURN to access EXIT sub-menu̓̓!.v͐*͐u%"v](!fŅ\\!vy[ Incompatible Configur & CPM-85̓̓!vͯ[" This is Configur-85 Release: 2.2.̓!f!!̓!v\0 This version of Configur expects BIOS version :̓!f!!̓!vB\ The BIOS version number is :̓(!!̓\.!z]H"x]!}2^!}2^!}2^!}2_4+͗:^&o:^&o}o:^&o}o:_&o}Ҿ\͚Sþ\X^syr`|` W`a {`g`\c {`e {`f E Z-100 Rear Panel F fac ` ` ` ` ` { { { faac [] `i` ` ` $ ` y{x _ir y{x [i] eaad [] `i`{` ` ead G Printer Modem Printer Light Power Power Serial Serial Parallel Pen Plug Switch ^^ F `` G Plug your modem in here $ ` y{x y{x _ir [i] eaad [] `i`{` ` ead G Printer Modem Printer Light Power Power Serial Serial Parallel Pen Plug Switch ^^ F `` G Plug your printer in here $ ` _ir y{x y{x [i] eaad [] `i`{` ` ead G Printer Modem Printer Light Power Power Serial Serial Parallel Pen Plug Switch ^^ F `` G Plug your printer in here $x5EY NFpp pq pq pppY!Lp op pn qnY"Jpp qpnY#Ipplqpppp pp qpppp qnY#QBpp qp lpn lY%Wqlpp qpY&Uppp lqpnY'Qppp olqpY(Opp Y)Kppqppp qpnY*Mpn qpn p qppY+Kpp n pp pppY,Iqqp lqppp lpp ppY-Gqlpn lqppn oY.Eppp qpppY/Dpp qpdY0CopppGY& CP/M-85 System Configuration Utility Copyright (c) 1982 by Zenith Data Systemsy5G Press JReturn to see Main Menu:$*N<*iogÏiFim-jhjðj2k l @P$ k("%C(ԥ,/ 2_69< kV"Tn\!2i^#V"\nNtNt Vn*Tn!Ͱi*\n*Tn+))NtNt Vnj*Tn!ŅjNt*\n*Tn|j/g}/o#+))NtLoNt VnNtVnNt JnNtJnNt*ln#"ln*ln*hn^ͰPj!}2|n`j*hn*ln^}2|n:|n&oV}2n\:n&o!0͔:n&o!9܅}ҡj!}2nèj!}2n:n&oV}2n\:n&o}2nnNtNt n:nn&o:ikNtnNtIo:nn&o!0{ozgNtCoNt n7i}2nnjNtnNt nNtnNtNtNt n:nn&o!.ŅUklNtNt n!"n7i}2nn:nn&o:ik*n!܅ҩkNt*n.iLoNt n÷k!NtNt nNtn:nn&o!0{ozgNtnNt IoCoNt n*n#"n7i}2nnqkNtnNt nNtnNt!NtNt n:nn&o!EŅ0ll7i}2nn!"n:nn&o!+}[l7i}2nn|l:nn&o!-}|l!}2vn7i}2nn:nn&o:il*n! ͌:nn&o!0{ozg"n*n!Ͱҿl!"n7i}2nn|l*n!܅l*n.iNt nlNtsNt nNtnNtV"hn"jn\*hn^!Ņ n!"ln!NtNt pn!}2vn!}2tn7i}2nn:nn&o!+}vm7i=i@iCoNt pnöm:nn&o!-}Ҡm7i=is@iFoNt pnöm:nn&o=i@iCoNt pnCiNt xnNtxn!Ntn n:vn&mNtpnNtxnLoNt pn nNtpnNtxnIoNt pn!pn*jn!NtxnNtsn;n!}2^nBn!}2^n:^n&oy"QuFo}-o5o"QuFo}-o5o"QuFo}-o-o5o"QuFo}-o5o"QuFo}-o5o"QuFo}5o5o!*Qu!0oXobolovoFsärdr̀o͵o͕òoͦo͕òoͫp͕òogq͕o"}u"u"u"u*u*}u7ço?sʷo~w÷o*u}os!}uF#N?so s!uoOq!}uo!u~{p!uo!}u{pp/2|u!~uV=q#F#NZ`izWxGyOqp z_p2|upMT!|u%q7{_zWyOG:u,怰w,s,r,qs ?q_WO!}u2q:}u]qG:u]qO@yOq!rr!uV+N+F*u|eo:~u_rxDqxڮq¤qyڮq¤qzڮqzWyOxG?{_|g}oqA}oqA|gq{_ qq}o|g{_O!}u:u怱w#s#r#ss!!w>4!!}uq>r@>42}u>2~u!"u!Mr!"}u"u!w>!~u^+VOrxGy/O{/_z/WʚryO{_zWrp#r#s#qGÒrhr!}uìr7~G@rxr/<ssG#N#V#^yOzW{_rr{/_z/Wy/O++s+rɯ_WO###rQ###r*u"}u*u"u!uu6s !uu~+ +s~# 6s!~u~+"}u"u?ss}]q."u"u!"}u!"uͫp#s!"}u!V"u͵o>2u*}u"u*u"u"u"ugq͵os!u5‘s2}us!"u!"uͫp*u*}u?s~G]q=Ox怱w!9~w{_!9ͫri`"Qu{#t7tCo)t7tFo!9ͫr*Qu!9?oOo _!\t^#Vrtttttttu!u0uBui`#^#V#MD##^#V++V+^i`#^#V#DM^#V##^#V++V+^##^#V++V+^i`"Qu!9dr*Qu"Su"Uui`"Qu!9dr*Uu*Su*Qui`#^#V#MDs#r#s#ri`#^#V#MD^#Vs#r#s#rYPq#p#s#r`iV+^+V+^*}ʫu^#V#{ʧušu!w6#6#6#6!w6#6!##"!9"">2w!00"w!.v6# xu!"gv"bv"*w"%w>2fv2)w>2nv21w> 2v!v"kv!w".w!y"w!y"wm?wV"y}2y\:y&o}/wçy*y!Ņw!v̓*y to continue, ^C to abort? ̓!y!.vs:y&o!}ҧySôyV}2y\!^#V!:y&os!^#V!^#V4^#VͶ{y!^#V8^!ͰKz!^#V!^#V4^#V͍z!^#V!^}2z|z!^#V!^}2z!^#V!^#V4^#V͍z:z&o#ÐzV"{"{\*{;!s!*{s#r*{<~z*{;!sì{{*{@~Ҭ{*{<*{!^!}*{<^}os*{!^! }}2{:{&o*{<^}X{*{;!s:{&o*{8^!}}|{{*{<^*{;^}Ҭ{*{!! sù{V"{"{\!*{s#rP~{!^#V=!@~!!^#V8^!}|*@~!!܄s*@~^! }I|!! ܄"B~y|*@~^!}y|!! ܄"B~!!܄"B~?~|!^#V8^!}|*@~!!܄s*@~^!Ņҙ|?~!^#VA~|!^#V<!s?~!!^#V9^#V+"D~#ͱ"F~*D~#"D~*F~+"F~|(~!^#V"H~*H~?^!}Ҫ}*H~?!s*H~A^}/Ҫ}!*H~B܄"B~!!*H~܄s#r!^#V!ŅҪ}*H~A!s*H~A~}*@~!s*H~<!s*H~6!s#r߄?~~*@~*H~B*H~?^^s*H~?*H~?^#s*@~#"@~ }!^#V6!s#r߄:S~~V}2\!^#V"*?^!}Ҿ~!!*B܄s#r!!*܄s#r*?!s*B*?^:&os*?*?^#s!!s#r!^#V=!!!^#V8^!Ͱ3!^#V"!*9^#V+"#ͱ"*#"*+"|0*^}2:&o! }ґÁ*8^!}!:&o܄":&o! }!! ܄"&!:&o܄"*8^!}&:&o! }&!! ܄"*#"^À!!^#V9^#V+"#ͱ"*#"*+"|ʀ*^M~*#"Y&Þ*"*M"݀ͰҀ{ozg##*݀!*݀"Q.߀!*Q!߀߀߀߀߀N2PG>AyK#B:P"a*a"!9 *"! 9^#V!9Û"!9^#V!9 !"9* 6#±""!9ͯ*|ԁ؁*:_!9:_!~Gw @"""!9ͯ*|ԁ"*|ԁ}ԁH؁*#"*{z3؁*"!9DM! 9^#V"|”}_F:_!~ʔ!"9*Ê"!9! 9 w#©! 9*"!9! 9 /w#ʂ! 9*"!9! 9 w#! 9*c"q^#V#"o^#V#"m"k*q*o\*q*k*oͰ\*q*o{_zW*m^#V*k#)*m^#V"wq* H H*;~ڣwÐ6*8~w*~ w!c"ۃ>2݃ۃo&U!c">2zA͊z-r{/_z/WzQ'BeBedBe Bee!`!ͬ32768>0_0ʃ!AÀxrxz¥{¥xGûz/W{/_ Bz­xׄׄ !A҄û V"&"(\*(M*&o&"***"*!!܄",C}C-7?{_zW2}C-7?zW{_J~#z…ʭʑم}Š|҅!`iz}|҅Ê҅Êz{z҅Ê}҅|ʊ!`i×ó&}o&}o""w"w!y"w!y"wɯ2q"r"tYPzdMM>2q}2vX/!*w"""#+n&**ͬ*|Ć}o|gĆR{NH#zˆ:!2y,x/Gy/O>=*)), 33)%,  7S DIV 0 $ɯ2Sʸʸxa}y{/oz/g#{/_z/W!ɯO>Gz“ʦ{/_z/W}o|g#ɯo>gㆯo>g,>2!.B.Bx ~# xx/ + +~+ x%{q#{8RYi}-- i-]*wyH)xyupMDpɛ*=COPYRIGHT (C) 1980, DIGITAL RESEARCH DDT VERS 2.2$10 !~=W!xe ~#Xbxʇ {z~#o}o҃i.2_!fp+q*e2_2_!hp+q*g!jp+q*i!lp+q*k!np+q*m2_!pp+q*oÃO$*sy͏ , $  ͌ 9!z6 # L!zw͌j# X:z 0 ͘=N#Fy}80*z{¯#z+++ ¥ z#½# · 9!`͠ y9!rͷ y=!z{w# % w!P͠ y͓}*w#"͌ @.@<!Eͷ~P !ͷ’P͌Q!ͷªP}QxQ!ͷ͓G@Q! ͷ y͓Gþ!ͷ ͓Q!ͷ͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEËC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON# z8O!B N#N ¾SP.* |} !9":q!"28!"9:] !í 1͓ !" >- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢ ҫ ͐ =« f " ͓ ҫ ͐ ʻf " =ʻf "=« ý> 2͐ f "]=f =« *]}o"_  *]"a. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f f DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g. 2|2\  !]w# ʫ .&  0 6 #& .K !e K w# ʫ : U 6 #K 6AW w#] !e~H#~E#~X*}|́ "!́ ͐ !ʬ =« f kʫ j \͢F w# ͋ t ʫ : W& _& & O { `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =« f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  # ë «   Ͷ ͐ =« f xY |« }ҫ gA>S Ag}S S i |« }!w s#r:[ʔ _!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0 7   > >  ͢| } @ >. *_}o| , 0 ë ^#V#!Y ))))o P q s#r#!V4 !V6# ,® >2Vñ m ͅ m ͅ m ͅ « Vʫ ! XN!~  ! _^! ^#V~ x+ >= = !~  . !   #x f L L ͓ͅ ҆ *" !6ï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~x (#"!N#FW( *J>7Å*M|N+"M N:LHͅÅD Å >* *͓ b" . *"] !/~##ʁtZ*F#n!Is!^#V&&##&))::^#V#*^#V>+)x-8_e)*)þ))>+><7"9.Yͯ * M^2U :2:2ͳ:_³ͯ !6! @!!BH @@ABH B! "BHI$$BI$BI $ HI D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I $I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A"$$$I$$H!!! BH" !I B  $$!BD! $!BI D@"!$I$$H"!I$I$I$UUU$$A$ ; FILE DUMP PROGRAM, READS AN INPUT FILE AND PRINTS IN HEX ; ; COPYRIGHT (C) 1975, 1976, 1977, 1978 ; DIGITAL RESEARCH ; BOX 579, PACIFIC GROVE ; CALIFORNIA, 93950 ; ORG 100H BDOS EQU 0005H ;DOS ENTRY POINT CONS EQU 1 ;READ CONSOLE TYPEF EQU 2 ;TYPE FUNCTION PRINTF EQU 9 ;BUFFER PRINT ENTRY BRKF EQU 11 ;BREAK KEY FUNCTION (TRUE IF CHAR READY) OPENF EQU 15 ;FILE OPEN READF EQU 20 ;READ FUNCTION ; FCB EQU 5CH ;FILE CONTROL BLOCK ADDRESS BUFF EQU 80H ;INPUT DISK BUFFER ADDRESS ; ; NON GRAPHIC CHARACTERS CR EQU 0DH ;CARRIAGE RETURN LF EQU 0AH ;LINE FEED ; ; FILE CONTROL BLOCK DEFINITIONS FCBDN EQU FCB+0 ;DISK NAME FCBFN EQU FCB+1 ;FILE NAME FCBFT EQU FCB+9 ;DISK FILE TYPE (3 CHARACTERS) FCBRL EQU FCB+12 ;FILE'S CURRENT REEL NUMBER FCBRC EQU FCB+15 ;FILE'S RECORD COUNT (0 TO 128) FCBCR EQU FCB+32 ;CURRENT (NEXT) RECORD NUMBER (0 TO 127) FCBLN EQU FCB+33 ;FCB LENGTH ; ; SET UP STACK LXI H,0 DAD SP ; ENTRY STACK POINTER IN HL FROM THE CCP SHLD OLDSP ; SET SP TO LOCAL STACK AREA (RESTORED AT FINIS) LXI SP,STKTOP ; READ AND PRINT SUCCESSIVE BUFFERS CALL SETUP ;SET UP INPUT FILE CPI 255 ;255 IF FILE NOT PRESENT JNZ OPENOK ;SKIP IF OPEN IS OK ; ; FILE NOT THERE, GIVE ERROR MESSAGE AND RETURN LXI D,OPNMSG CALL ERR JMP FINIS ;TO RETURN ; OPENOK: ;OPEN OPERATION OK, SET BUFFER INDEX TO END MVI A,80H STA IBP ;SET BUFFER POINTER TO 80H ; HL CONTAINS NEXT ADDRESS TO PRINT LXI H,0 ;START WITH 0000 ; GLOOP: PUSH H ;SAVE LINE POSITION CALL GNB POP H ;RECALL LINE POSITION JC FINIS ;CARRY SET BY GNB IF END FILE MOV B,A ; PRINT HEX VALUES ; CHECK FOR LINE FOLD MOV A,L ANI 0FH ;CHECK LOW 4 BITS JNZ NONUM ; PRINT LINE NUMBER CALL CRLF ; ; CHECK FOR BREAK KEY CALL BREAK ; ACCUM LSB = 1 IF CHARACTER READY RRC ;INTO CARRY JC FINIS ;DON'T PRINT ANY MORE ; MOV A,H CALL PHEX MOV A,L CALL PHEX NONUM: INX H ;TO NEXT LINE NUMBER MVI A,' ' CALL PCHAR MOV A,B CALL PHEX JMP GLOOP ; FINIS: ; END OF DUMP, RETURN TO CCP ; (NOTE BTHAT A JMP TO 0000H REBOOTS) CALL CRLF LHLD OLDSP SPHL ; STACK POINTER CONTAINS CCP'S STACK LOCATION RET ;TO THE CCP ; ; ; SUBROUTINES ; BREAK: ;CHECK BREAK KEY (ACTUALLY ANY KEY WILL DO) PUSH H! PUSH D! PUSH B; ENVIRONMENT SAVED MVI C,BRKF CALL BDOS POP B! POP D! POP H; ENVIRONMENT RESTORED RET ; PCHAR: ;PRINT A CHARACTER PUSH H! PUSH D! PUSH B; SAVED MVI C,TYPEF MOV E,A CALL BDOS POP B! POP D! POP H; RESTORED RET ; CRLF: MVI A,CR CALL PCHAR MVI A,LF CALL PCHAR RET ; ; PNIB: ;PRINT NIBBLE IN REG A ANI 0FH ;LOW 4 BITS CPI 10 JNC P10 ; LESS THAN OR EQUAL TO 9 ADI '0' JMP PRN ; ; GREATER OR EQUAL TO 10 P10: ADI 'A' - 10 PRN: CALL PCHAR RET ; PHEX: ;PRINT HEX CHAR IN REG A PUSH PSW RRC RRC RRC RRC CALL PNIB ;PRINT NIBBLE POP PSW CALL PNIB RET ; ERR: ;PRINT ERROR MESSAGE ; D,E ADDRESSES MESSAGE ENDING WITH "$" MVI C,PRINTF ;PRINT BUFFER FUNCTION CALL BDOS RET ; ; GNB: ;GET NEXT BYTE LDA IBP CPI 80H JNZ G0 ; READ ANOTHER BUFFER ; ; CALL DISKR ORA A ;ZERO VALUE IF READ OK JZ G0 ;FOR ANOTHER BYTE ; END OF DATA, RETURN WITH CARRY SET FOR EOF STC RET ; G0: ;READ THE BYTE AT BUFF+REG A MOV E,A ;LS BYTE OF BUFFER INDEX MVI D,0 ;DOUBLE PRECISION INDEX TO DE INR A ;INDEX=INDEX+1 STA IBP ;BACK TO MEMORY ; POINTER IS INCREMENTED ; SAVE THE CURRENT FILE ADDRESS LXI H,BUFF DAD D ; ABSOLUTE CHARACTER ADDRESS IS IN HL MOV A,M ; BYTE IS IN THE ACCUMULATOR ORA A ;RESET CARRY BIT RET ; SETUP: ;SET UP FILE ; OPEN THE FILE FOR INPUT XRA A ;ZERO TO ACCUM STA FCBCR ;CLEAR CURRENT RECORD ; LXI D,FCB MVI C,OPENF CALL BDOS ; 255 IN ACCUM IF OPEN ERROR RET ; DISKR: ;READ DISK FILE RECORD PUSH H! PUSH D! PUSH B LXI D,FCB MVI C,READF CALL BDOS POP B! POP D! POP H RET ; ; FIXED MESSAGE AREA SIGNON: DB 'FILE DUMP VERSION 1.4$' OPNMSG: DB CR,LF,'NO INPUT FILE PRESENT ON DISK$' ; VARIABLE AREA IBP: DS 2 ;INPUT BUFFER POINTER OLDSP: DS 2 ;ENTRY SP VALUE FROM CCP ; ; STACK AREA DS 64 ;RESERVE 32 LEVEL STACK STKTOP: ; END !9"1W͜Q>2!͢QG}DrYQ|͏}͏#> ex͏#r* _> e> e ҉0Ë7e}} :³ʳ7_<2!~ɯ2|\\FILE DUMP VERSION 1.4$ NO INPUT FILE PRESENT ON DISK$!Y , <    *$A!6 # T!w $r# *`: 0 *A*! ~ ʰxkb))))_y‘BK{ͅ*!66!"80*{#z+++ #I Disk Utility Program Version 2.2.102 $Copyright 1980 @Heath/Zenith1  *NH~fl :~>2  _AʬBʻCZ d~>2 2 2 >2 2 2 >2 2 2 : :  _A[ f2A2 O;| ~2 : 6: C _AO[Z 2 !A2 O;|O ~2 : ! : ¨  : Aʸ: A½>2 : : ~:  S : O;|! ͹ ~2 !~2 #~2 #~2 !~2 : O;|! ͹ ~2 !~2 #~2 #~2 !~2 : ! : ! : ! : ! : ʣ: : ʠ: ï: ! M: (: P: >x2 !  2 h   : O;: ”2 2 : !=$" DM*}o|g#" ! : G ͮҎ" ͮҎ* " : O;: O* DMœ* * " * ͨҥ: <2 ! i=2 : 2 : O;: * " DM: Oœ: O: <2 * * " : V: 2  BK: O* DM" : 4: 4 ž# x4: ! V<2 * : <2 2 O: WP  : „  :    ×  7  7z{|}Ʌo$~#fo*N*N*N$*N6*N9*N<*N?>2 2 >2 :G!ͣŒ2 ͣŒͣŒ2 ͣ7âŒͣŒ2 C]>2 >2 2 |Vr>2 2 >2 |N—>2 ͣ‡â<    ɯ22"x*~!o$~2:ͽ:o$)~#N*"!4*#"y2íQ:Oz** ͣc!T)Incorrect version of the BIOS $ Do you want to: A copy and verify B copy only C verify only Z exit to operating system Selection: $$ Invalid Source Unit $ Invalid Destination Unit $ Source Unit: $ Destination Unit: $ Put source disk in drive . Put destination disk in dri ve . Press RETURN to begin: $ Drive not available in current configuration $ Place a bootable disk in drive A and type any character: $ Not enough memory $ Destination diskette is write protected $ Verification error. $ Verification finished. $ Copy finished. $ Operation aborted. $ Source and Destination cannot be the same drive. $ Media incompatible on diskettes. $ Drives incompatible for copy operation. $ Command line syntax error $ Unknown command line option $finished. $ ZZZ COPYRIGHT (C) 1979, DIGITAL RESEARCH DISK OR DIRECTORY FULL$FILE EXISTS, ERASE IT$NEW FILE$** FILE IS READ/ONLY **$"SYSTEM" FILE NOT ACCESSIBLE$BAK$$$BAK$$$-(Y/N)?$NO MEMORY$BREAK "$" AT $1mM"m +!8s~1m!f6 *M  *!M 1m! 6!6! 6: 2Ebͽ!e:d\::eH2 H҆ͽ:e2!:d2e:!2dû :!I¬!: :H2 ҮX:h2iҐ:!ʍ:!:!H:!H,!"! 6#~ F)ͷX:! X):i!h)9 e:!:h2jO>F L>!":i!jHҼ*"+M ~ ʼͲ!f6!h6!"! 6F!f6:h2k!iҠ:i2k:j2h:k!hҶ9 æ:h2j!!6:j2he:! >"Ͳ*"M ~2!O :! *+"!!6e*!M͛ /$^L:!@OL:! 2͑e:b:! L:h<2hb:! b:hO>!hw:! pX:! …!!6  LÊ!!6ûô:!ʛ͑:! ҩ OҸû:!R†!6G>!!!6 :2.t -? >!!6!6s, !6:xB!6OU2!SB!G6:҃!6:G҃*G& ~2!:G<2G_ Qқ=e  b:!-®! 6:!#¿͇;J:!:!!6Lv:!:Jv: *#"͎! 6:!B)! >w!"&*o"(R :!C:eR :!DKeX :!K\ͷX :!Lj^ :!Pš͎҇! 6F×͢җ:Ç :!T¨F :!U¾: 2 :!V͎"$DMͩ/ *oDMͩ : 2 :! (::H%^bF : ͎H :!Ay! 6*""&*o"(R͎an͢na! 6R :!F”͢ґ Ä :!J $:2$͢ :=2:<2!*& ~2!ü*""I*M*o/!:""&! 6R*I""ë :!M:H| ! 6>F ͛e: <2 O! Hqy d F : 2! 6*#s#r :!N ͢ *o/ Ҧ Ͷn! 6!"&R! 6o$ Î Ç :!S0 $͢- :2"+s#r!:* *& ~2!:<2 :!W> v :!X³ Z͎\ Ee ð :7/҃ E!76e ͕ :xƒ - ͷ*&"K(Kڰ *KM N͔*K"KҌ :!Z ͎  ͢ : :!  'v!gq:f *g&!lq:l $ !h4:l 1 !h6*lM :hB     !h55!mq:m :hO>H2ny} !m6 !o6:n!oښ *mM !o4‚ !pq:p ڪ >:p :p H:p H!qq*qM͛  ^W :q@2q*qMW   !sp+q*r !up+q *tDM !wp+q*v !zp+q*y2x!|p+q*{2x!~p+q*}2x!p+q*!p+q*!p+q*!p+q*2x!p+q*!6   >>! q* &!p+q*:7 e !p+q*DM  =? ) !p+q.*DMF -L *9"`!"b!h6!j6!|6.!=\ -x !e:dʥ *eM \R :xʥ @ *dM \, :x \͕ :x - V :e _ :f w : =e !e:d*eM =e : =e =͕ !]6:x>- !"!76!6!6!66*dM  *dM !6:8!*`*;DM \u 2xʻ>!xҨ- *`*;6:82*`"`:<2w!"`9`h*`*;~2*`#"`:*eM !b+!s{!f!6:!b*b*^DM =ͅ N- *b"b:<2)f!"b!q9bڀ*b*^:w*b#"b!q:6ڶZͅ ʱ- !66*6& :w:6<26!J6*b}:J<2Jm=? :x- : ;*dM .=\ -=ͨ ;: *eM =ͨ .M= -C!q:Y*M !q:a/>z!/H!q*MaҎ:_:!q:ҥ*My:!p+q!'"!6>**ͪ{2**ͪ"*! ͪ":!!6:0O  ú!p+q:/(*DMͩ:  : I N* *DM:aO>!Һ x!: ڦ> ʡ* +" >¡! 6: <2 =O! N͒:  O͒: ! 6:h!o$O* ͸ ! 6 !h6!: 2 3* & 6 : <2 =O! N͒*dM  :sGsu n>!6:<2=O! N͒!">!"͎/Ҵ*+">>!": *#"*""*!".+",*$"**o".!",!36:3{.*22*,**"0M ~ H3*0"**+"*+">23:2/k!36,*+s#rx:3x*0"*: “**"&*"+"(á*$#"&**#"(*"#""*$#"$*"+""*$+"$*#"!4qM*"*$: *(y"$DM}|C#~ *#"*&DMyxC 1*+":4?w+"$""ͷR: —*$"("҈!"&Ô""&*""&$mڸ*o"(**$"($"O26͛*"M :6w͢:6 !7q:*7M͒:7o$+͛ͪ*$M ~28Om:8 I͇͢u$oqo͛rP! 6!"&*$"(R͎ҔM͢ҡÔ($ҵ! 6R͇vͶ2!*!Mm$"*"M :!w͢:! e2!:! : /HH/Q:! @!!6 R!!6 :!KR$*& :!w:<2dn!:s+q*$";!>6:>/;oH*;#"(";:92=*=& *(M !::=2>/H:=<2=*(#"(æÀ:>*(+"(R:>!6$:2*o/*!My:<2=O!s Hq**DMͷ! 6: e!"*""?k*&"?*?+M ~2A :hHҏ *&"?(?:A ½8*#" ҽ*?M ~2AO *?"?ҕ!"*"*"^: 2B! 6F:B2 o(>&H6͛9!C6>!Ca R>:C<2C?! 6!"͇͢Ґq"ڊ͛Íq!!6 !!6 !6*!Ma2D*!M͒2!:D/!+w!6e2!͢!Eq!E:!:H:H!Fq*FM8 *FM   Oy2F :FY5>>:!02HO> /!";u*)))*) *H& "PҘ! 6+s#ré! 6"DM!>))덑o|g =±^#V) ^#V|g}o _{ozgi`N#Fogo&og_{_z#W H =ɩ LIBX$LIBCopyright 1982 @Heath/Zenith CP/M-85 Format Version 2.2.102 $ This program is used to initialize a disk. All information currently on the disk will be destroyed. Is that what you want? (y/n): $'d ! ^#V#*0}o|g*  "1 *NH~f :$>2xͺ :yC BYC:xP:~] 2~22 As[ڃ ê2җ ê:~A¤>22 :xʷ:~ jYC: ͏ êa{ OPTION NOT AVAILABLE $AOM|K"!~2! H "!~2#~27*N*N*N!*N$*N'*N**N3*N9*N<*N?:¬>D:xʹ:| @SD ìx2:>2:x:}  j1)2) x2:yN   "2M:k(:kP:>vx2* 6:ʠ:ʠ!Ͷ!:ʹ!:¹!Ͷ:::2N:!¼M 7&:OWg:!4:9:EE:E:Nx.* G:O:ʒxGyO:’:{’xGyOxy2#~#~##*͟ ^#V"j#^#V"l#F#~2O!py !G"h:OG GGw#:G:=xG=x2ny2o*j*hp :nw#:ow# w*lPO:ʒxGyO:’:{’x( |pPN 2N N 6NNNNNyNPN 2N N PNNNNNNN   @   ;@? 4 4@ 2F  *~ʝ   :y  ™ ͗ ڝ * H |g}o(*~&h"8 )=6H": >!g!"4 !"6 *4 DMW*6 DM_w *6 !H' Ž*4 #"4 #"6 *: +": |^M ڝ :@2G ͭ ڝ !"A 2< ] @ *C ͨ ڽ!ͨ ڝ * F *8 ' ڝ * H |2E S#' ҽ*A ' ʽ"A :< ( m ڝ !h - s#r!< 4:E ʽ4ým ڝ !P ~w#~wG Ù *? N#F##"? `i|:<  G <7!h W ~6#Š * :S 2S ڰ 2S !U 4>2V !U ~wG <7!S 42< |g}o * H #* H "C ͨ '   7@'    !@"2 !U ^#V*2 ' :  % * w*Hq#p#w#w#w###w#w#w#w#w#w#q#p*2 * F  s#rɯÞ 7 :F _͗͗*~w!A 0 *DM "4 > #"6 !"? >2< *4 DM*6 *? A 0 *6 H'  *4 #"4 !#"6 *? "? !< 5 !"? *~w͗W_go7 ? Will format partition assigned to drive ?: $ PARTION IS SMALLER THAN MINIMUM ALLOWABLE SIZE $ PARTITION IS LARGER THAN CP/M MAXIMUM SIZE -- ONLY 8 MEG USEABLE $~w͗WBADBLOCKSYSy2 2 " xʍ ڏ w#  y! ڤ O* - ~ʳ Ú ryO! 5š ON Iz/W{/_z bk !>2*͟ *͟ !#| /wW_gw7~#Ÿ {ozg C:G!ͻ x2"v2~ 2 ͸ :G*vͻʤ¥ͻ¥F2ÃN">2yÃD-2z^S82z^1C2zK2°2zS°:z2}ÃDn:z2|Ã0°:zD°2|>2{]ʔ ʔ,°ͻʤ å  ø (2.24"0x*0~!5o$~2/:.:/o$)~#N*0"2!44*0#"0 y2.Q:4Oz*2*0S82z!T)Incorrect version of the BIOS $ Which drive do you wish to use for this operation?: $ Which density? (S=single, D=double): $ Number of sides? (1=single, 2=double): $ Drive not available in current configuration. $ Put the disk you wish to be formatted in drive 0.$ Press RETURN to begin, anything else to abort. $ Unable to format this disk. It is write protected.$ Do you have more disks to format? (y/n): $ Place a bootable disk in drive A and press any character:$ Disk is write protected Unable to format this disk. $ ILLEGAL COMMAND SYNTAX $ ILLEGAL FORMAT OPTION $ DISK IS NOT OF TYPE SPECIFIED $D2Z?@List Version 2.102 $Copyright 1980 Heath/Zenith Data Systems1  Gͤ͘Ͱ:Ug:ʕskҎ>2Yo :]‹^<2]:U]!> w# !]~ ȯ2U!w# ¸  * !N*~# ʻ[~#_O ʹD 6H(<د2\PMF:G ̾*F"MN^>2TUo>2SL~-2OT’-ʹ2RC©-ʹ2W2XE¹د2Y77?!F~#w+6 ~#   7?7] ~#] >  7?~] # 7~# +]+7?7! :! 0_:" L{f0G{&o)T]))|i}7?7Zz:\*2h2|\<2|:Tʩ!H5ï!5\„!:Q<2Q~ _:SOb~ B %ʂ } Ytytt#ï2Q!O~#4wb 2P!G4~:[60+~ I61:Tk!H5!5>2V2Y!"\b *M"F2P:W=2W‚:\<Ę! 1"F"M:X2W:YU:Zw:Vk2Y7?ɯ2]<2Y!"7:Z!]~*p?̎# ~*ʀ?̎# :Zȯ2h2|͸͔2[\<=<_!] ~# Q!Z5:Yh![42h2|>?w# r͎ >?w# €͎>2Z!Z6\<4\<4ç!\#  ~# # :[G# <=j<_!]Ob :RG:QG:Rb !Q4=~_:SOb#5{a{ _!N* r;_O~#  ʖ ʖ[ʬr"y2[ʬ2V÷>2V!"7?7!] > w# \! ~#O~#:y@Gyx'.~#'. %e~#' %77?!]~ ?# 2!e~ >.~# L\<7¾* #}" f:U2Z2P<2Y!" > 2F>12G:\<Ę:X2W1 ]!" : 2 **>2  C !   ~#'. %e~#' %77?!]~ ?# 2 Page 1 1<G File not found$ Syntax error in command line$2P<2Y!" > 2F>12G:\<Ę:X2W1 ]!" : 2 **>2  C !   ~#'. %e~#' %77?!]~ ?# 2 Pa Place printer ON-LINE or press any character to abort $ USER BREAK ... ABORT (Y/N)? $ $@ COPYRIGHT (C) 1978, DIGITAL RESEARCH ERROR: $, LOAD ADDRESS $DISK READ$INVERTED LOAD ADDRESS$DISK WRITE$LOAD ADDRESS $ERROR ADDRESS $BYTES READ:$INVALID HEX DIGIT$CHECK SUM ERROR $FIRST ADDRESS $LAST ADDRESS $BYTES READ $RECORDS WRITTEN $HEXCANNOT OPEN SOURCE$COMNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$*!9"!e !" !" \!""͊: ƒde"\\\͊: ²d\͝: )d;! q* &f  ! q> ! : A O: 0O! q: O: O! p+q* |O* }O! p+q*  f! p+q* DMB! p+q)R* DMB1B* DM+;! p+q* i2 ! p+q* i2 ! p+q* i2 i2 !" p+q*! f!$ p+q*# i!& p+q*% i!( p+q*' i2 !* p+q*) f!/ s+p+q+p+q:/ =2/ X*+ *- w*+ #"+ *- #"- 1* #" ͖r*   ~!" ! ͸×* " x20 º*   DM":0 Ad*   6!" Ç!" : !"6 "8 ": }2< !"4 "= ! 6Y: !2 6=21 á:1 : r+s#r==_HL"4 " >6 ͪS* "6 =23 :1 =21 v=O* #" Y8  ͝҉* +"8 .!2 ʞR̀* "4 4 = ͝* #" çR*6 DM+R*8 DM+R*: DM+R*< M!? q=  ͝Kd*= ! ͸p!@ 6>!@ X*= }O!< *@ & w*= #"= !@ 4)!< 4\mad* }O!< :? wlR*4 DM+{R* DM+R 4 ͝*4 }¿= 4 ͝< N*4 #"4  å;*4 DM+: Y2A 0O> :A 0:A AO>&R̀:A A H.2B !2 w:B !D s+q*C &͍:D _og_{ozg^#V) _{ozgi`N#Fogo&og_{_z#W'ßCOPYRIGHT (C) DIGITAL RESEARCH, 1980 M1] ʑ?ʑ! __0 r))) O @|rr.g))å{u INVALID MEMORY SIZE$!$ʡ~/w/wʔ|g*"z|?¸>@G!>0w#w!4~:60+4~u!N#F! x, # =!v"z!w6!u#+w+wz >ZG}o|g"|! :m V p!"xp ~#c*|!:m  xä SYNCRONIZATION ERROR$ {°~#o}oҼüÅ`*zZ# :m ! ~ #* DM! x  w#!N#F! D!_>0w#w1!`4~:60+4*"e@u READY FOR "SYSGEN" OR "SAVE 00 CPM00.COM"$*|  CONSTRUCTING 00k CP/M vers 2.2$ , MVCPM207 VERSION 2.2.102 $}0A?!l~# ~? *+++!H~f!KF: x2h~ !i ~# hͦ!q:_  !p+q.*   !q*&!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q* KȎ؎м  Ƞ$  Z&u6t$u @洲3vu ztp油 䳪\u>ÀySt4t!t)$ @洠 률t2[䵨t䰨u6[2@wQ@,,,C\X &COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<2 !2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ ""͌#>?͌͘ =_.:;<> Oo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER.fP!yO#< Ty#O 321y_͸2y2ͽ:˜1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^: ! ~ 3#0 Wx x   G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧÆFILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: ! Â$$$ SUB .fP"C {2!"E 9" 1A 22!ty)K!G_^#V*C   ~E , &-AGMS  !ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$ :B A2 ! ~6  O͐  : E  B 2 >: b # : y! 4 5~yy 5 6y Ґ ^H @Oy H  H : – ͬ   #H : !  H ù  H  H $O͐ : 2 *C N#  x : 2 p & x ~+é 7 2 H ! >w _ : ! 5ͤ N k ͱ ¦ ͱ xʊ #N x : ! 2 ͤ ! 5™ #wO ~x½  p H    y< < ʑ  : !qMD # 2E > ! ^#V w#P :B O|^#V#"##"##"##"!O *!O *|!6ʝ 6>*w#w*w#w'û *! J * ""!N#F*^#V*~#foyx *{_zW+ * yx # *DM*s#r*s#ryOxG*0MD!!N: E G>O: \ S *C  :q n& ^#V> O^ "*}:*)= ":O:o"*C  *C !ͮ ~2~2ͦ :2ͮ : O:w:w |g}o *# ) :B O! yoxg*:B O }!N#F "*#*s#r^  ~!J  ! J *:o$*C ~i 6i w**{#z r+s{ozg**͕ **  , w͜ ͸ Ͳ ! !N#F$**O !~#:A #~$=2E k͌ : :/GyO>2!q*C " ͡  ʔ*J Ҕ^ :Oyʃ?|x | s-|N-# S:2E !~Яw > T   D ^ 6k -äPYy 5*{zBK5ڋ>*C w~#+w#w+ɯ2E 22 i  ^ *C :~w~͔͔# #  w ~>2!E 5T *C !"C  "C !w# F! w͌ x 2͢ *C  ~<wʃG:!ʎì 4~ʶ ¬:<ʶ$ ʶïZͻ   x >2>2ͻ :!Z2:E w ̈́ ͊ Ͳ  >2>2T *C G ͻ : w ̈́ n> 2;O ^ DM;}H> "*C  ::dd slO s#r:E ͊ :==»y==»*Ww# *" ͸ *:G#š" ͸ :!w4!i w: Z!E ~=26 2*C !!~~#~O~G#n,-.‹! w! yG!x͢.:E <ʄ! q!pQ:E <. ʄ$.:E <ʄ i 6}2E x N! ~态O>G~G!~G} *C !r#r#r ^ ͥ_y#x#{s+p+q-*C  ͥ!!q#p#w*:B O Y G }*MD "ã:!B w!>2*C ~=2u:B 2~2wE:A *C w>" !""2B !" !r QQQâ~?ͦ ~?r Q *"C Q- Q͜QüQr Q$Q*):B  " *)*)Q;*"E :;:A  2A QÓQÜQ*C }/_|/*W}_*"}o|g":ʑ*C 6:ʑw:2E* *E }DQ>2#4Ñ~ÑÑÑÌçÎÓØÑÑÞ1!"N@۱2 !>52!A-! *"L@{!"L@ÀAy2@>2@>y2y2`i"| n&!::!?:!Y"!:o&:}o&":G:OxGy2:!:!:!t:!>ʹ:::ӱʹ~2:2<Ӳ:@Ӵ:2* Ӱ۳+|^:Ӵͻ“:G:=!8=*±!~±~w> ͹2>~ӳ>Ӱ۵һ۰۰ 4Ӵvw# <ȯ2," *BIOS88 SYS`ALTCHARLOAD ERROR$     $%&'()*+ ,- ./ 01 !23"#  "b$@B B HH II$@DI ABI$"$H$H@$$I! H*  $H@@A I $D!!$I"BI"I"@$BIIH$$$$BBI$@BI!"$$A DI$@ A$@$E$@H! "!$$" @B$!!!DH$$"H @k@BHH  !$$A"D@ "A" "BHA " !$ D B I $ !$$ H@BD D$ HI DIA!$$$ $" "$D ! $"  $AB " BDD $$D!"DI$!$BH!"IB I$"D HD" " $"! <@H !BI " I  $I$I$DI$ !I$@"$"$! D $I$I"@B $$HB@H $@! H$"@HDD@ A (@'ßCOPYRIGHT (C) DIGITAL RESEARCH, 1980 M1] ʑ?ʑ! __0 r))) O @|rr.g))å{u INVALID MEMORY SIZE$!$ʡ~/w/wʔ|g*"z|?¸>@G!>0w#w!4~:60+4~u!N#F! x, # =!v"z!w6!u#+w+wz >ZG}o|g"|! :m V p!"xp ~#c*|!:m  xä SYNCRONIZATION ERROR$ {°~#o}oҼüÅ`*zZ# :m ! ~ #* DM! x  w#!N#F! D!_>0w#w1!`4~:60+4*"e@u READY FOR "SYSGEN" OR "SAVE 00 CPM00.COM"$*|  CONSTRUCTING 00k CP/M vers 2.2$ , MVCPM217 VERSION 2.2.102 $}0A?!l~# ~? *+++!H~f!KF: x2h~ !i ~# hͦ!q:_  !p+q.*   !q*&!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*@oȎ؎мZ &䮨@t殠殠䮨tu䮨tu hO=!9 Ÿ!6q!26[2@wQ@,,,C\X &COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<2 !2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ ""͌#>?͌͘ =_.:;<> Oo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER.fP!yO#< Ty#O 321y_͸2y2ͽ:˜1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^: ! ~ 3#0 Wx x   G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧÆFILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: ! Â$$$ SUB .fP"C {2!"E 9" 1A 22!ty)K!G_^#V*C   ~E , &-AGMS  !ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$ :B A2 ! ~6  O͐  : E  B 2 >: b # : y! 4 5~yy 5 6y Ґ ^H @Oy H  H : – ͬ   #H : !  H ù  H  H $O͐ : 2 *C N#  x : 2 p & x ~+é 7 2 H ! >w _ : ! 5ͤ N k ͱ ¦ ͱ xʊ #N x : ! 2 ͤ ! 5™ #wO ~x½  p H    y< < ʑ  : !qMD # 2E > ! ^#V w#P :B O|^#V#"##"##"##"!O *!O *|!6ʝ 6>*w#w*w#w'û *! J * ""!N#F*^#V*~#foyx *{_zW+ * yx # *DM*s#r*s#ryOxG*0MD!!N: E G>O: \ S *C  :q n& ^#V> O^ "*}:*)= ":O:o"*C  *C !ͮ ~2~2ͦ :2ͮ : O:w:w |g}o *# ) :B O! yoxg*:B O }!N#F "*#*s#r^  ~!J  ! J *:o$*C ~i 6i w**{#z r+s{ozg**͕ **  , w͜ ͸ Ͳ ! !N#F$**O !~#:A #~$=2E k͌ : :/GyO>2!q*C " ͡  ʔ*J Ҕ^ :Oyʃ?|x | s-|N-# S:2E !~Яw > T   D ^ 6k -äPYy 5*{zBK5ڋ>*C w~#+w#w+ɯ2E 22 i  ^ *C :~w~͔͔# #  w ~>2!E 5T *C !"C  "C !w# F! w͌ x 2͢ *C  ~<wʃG:!ʎì 4~ʶ ¬:<ʶ$ ʶïZͻ   x >2>2ͻ :!Z2:E w ̈́ ͊ Ͳ  >2>2T *C G ͻ : w ̈́ n> 2;O ^ DM;}H> "*C  ::dd slO s#r:E ͊ :==»y==»*Ww# *" ͸ *:G#š" ͸ :!w4!i w: Z!E ~=26 2*C !!~~#~O~G#n,-.‹! w! yG!x͢.:E <ʄ! q!pQ:E <. ʄ$.:E <ʄ i 6}2E x N! ~态O>G~G!~G} *C !r#r#r ^ ͥ_y#x#{s+p+q-*C  ͥ!!q#p#w*:B O Y G }*MD "ã:!B w!>2*C ~=2u:B 2~2wE:A *C w>" !""2B !" !r QQQâ~?ͦ ~?r Q *"C Q- Q͜QüQr Q$Q*):B  " *)*)Q;*"E :;:A  2A QÓQÜQ*C }/_|/*W}_*"}o|g":ʑ*C 6:ʑw:2E* *E }DQ>2#4H;HÜ;;;êíóø;;þ1!"N@* "J@* "H@>Ӯۮ@MӮ!|Ӯ}Ӯ !T@>52!AT@ !K*"L@T™!"L@ÀAy2@>2@>`i"]y2_`i"``i!:_?2b:]!c:^#:b!!*]"cT])))):b2_* |2}2>ӮۮGx=:_ Hw#K<ȯ2"*dBIOS88 SYSALTCHAR SYSLOAD ERROR$ ]d$$@B B HH II$@DI ABI$"$H$H@$$I! H*  $H@@A I $D!!$I"BI"I"@$BIIH$$$$BBI$@BI!"$$A DI$@ A$@$E$@H! "!$$" @B$!!!DH$$"H @k@BHH  !$$A"D@ "A" "BHA " !$ D B I $ !$$ H@BD D$ HI DIA!$$$ $" "$D ! $"  $AB " BDD $$D!"DI$!$BH!"IB I$"D HD" " $"! <@H !BI " I  $I$I$DI$ !I$@"$"$! 3 $I$I"@@$ A BH$$" @D HHA ' .(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE) COPYRIGHT (C) 1979, DIGITAL RESEARCH, PIP VERS 1.5$$$ SUB =.:,<> _[]INPIRDPTRUR1UR2RDROUTLPTUL1PRNLSTPTPUP1UP2PUNTTYCRTUC1CONNULEOFDISK READ ERROR$DISK WRITE ERROR$VERIFY ERROR$NOT A CHARACTER SINK$READER STOPPING $NOT A CHARACTER SOURCE$ABORTED$BAD PARAMETER$INVALID USER NUMBER$RECORD TOO LONG$INVALID DIGIT$END OF FILE, CTL-Z?$CHECKSUM ERROR$CORRECT ERROR, TYPE RETURN OR CTL-Z$INVALID FORMAT$HEX$$$$NO DIRECTORY SPACE$NO FILE$COM$START NOT FOUND$QUIT NOT FOUND$CANNOT CLOSE DESTINATION FILE$DESTINATION IS R/O, DELETE (Y/N)?$**NOT DELETED**$NOT FOUND$COPYING -$REQUIRES CP/M 2.0 OR NEWER FOR OPERATION.$UNRECOGNIZED DESTINATION$CANNOT WRITE$INVALID PIP FORMAT$CANNOT READ$INVALID SEPARATOR$1 :2L> ̈́M9 221@:2!o6+6+6!6#6!6#6:G*o .!N6:^*M^!K6!6!6+6' :$::=2K  :ʤ\:ҷ\x'Ͳ:!\͢  :͈'! Ͳ:$: $͈Ͳ!N6' :!Cwͯ !6:^͢c!6{:/>!/H{ͯ :<2Š ::=HҮͯ !6:Ҿ:2 !6::/H͈;!6:> !/>HHͯ :^!w:<2:0}:@E}:!S!W6: z!]6:cm!c6:_z!_6l ::,: HHҰͯ : 2ó:E:1:2v!q!*8!*6: >ͦ>ͦ!q:_  !p+q.*   !q*&!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*!p+q* !q*& *M *M !p+q*!!p+q*"!p+q*$!6  !kp+q*j> >ڪ Þ !qp+q/ *pDM9: :M2r:N!r !:r *r& N!r4 !6:͔: :ͳ.!ws+p+q+p+q:w=2wN *s*u w*s#"s*u#"u' !"*M^7 !x6:!xھ **DM͆ 2yʭ :yʗ ͯ *"*6:2x÷ *"!x4d !"/ !j}=2| !"*KM^'_ !z6:|!z1 * "}*}DM͆ ' ͯ *"!z4 :e !"͆ !z6:|!z '? 2*H#"H!{6:{ր!Ң *{& :{4 2!{4m *":ڹ ͯ !z4I '2!"!q: !4>!S :S! :2*M! ^#V͎ * :w*#" = = = = = ͯ  *M !6q  !6q  !6q  *& !6à  !6 à  !60à  *& !6  !6  !6  *& . 1 4 7 : = F P [ f q  :2!q: " *M n :c4 *M n :2!c:Q !c:2: !:cw>!n !5 Y : { !6!q:!lwҙ  â :0O !q:O| :O| !6:]2l:o'2o:n'2n:m'2m*mMͣ *nMͣ *oMͣ :]:   *}2D" * * *&"!q:UY: Y:ҩ: ʩ:_2ʘ:€!6<:<2!ژ!6 >!]Ҥ; !6:Q::H: !6*M : !6!q:a/>z!/H:_2:!q:A/>Z!/H8: 2::=O>m:W!Q} Hmd>9>!6:2*M!E ^#V͎ڗO **~2*#"m2m͖ 2m!6m!6m!6 m2mͯ m!62m!62m!62m!62m'2:2:TҒ:2!6*ME:2::Ҳ:<22ý: 2:} >ͯ :i:2:d*M:[ *M:>!(:=2%> >>!F!5+N! ~2!4<2T>>!b}*bMͭz:b2!b6:<2é>!`ҥ*`MͭҞ!`6!6> :é:(!q:!wO! ~2*& :w>!:!4!6>:N<2N!> *N& N2 !p+q!6!6+6 !6: S: M!6g8:N2M*M8p!6!6!6>!ڕ*&P 6!4z!6!6#6#6!6*M8:ھ:*͇g2ê::¿::,͡A<2O>*M8):[ͱ!N5!6ñ:5!6#6>!ڰ!6:<2O>/:!O!T *M͡H~K:¡!6[–ͱ!N5:2:2!4=:[¼ͱ4:!6:.2O8: :* ͇g:[ ͱ!N5!6:%:<2*6 * 6å!q!6> !d*&I :]>!4A>:<2O* :w:?†!6!q!6?!:ҠgÐ!q*&*~!6:22: :]Hں:A2O>: 2ͯ ÷:S:QHI:N<22: H@"2Í202O> c!6Í202O> ڍ*&O*& !sc*&P :w:·>!ұͯ :22:_!6=!6>'!E!4!p+q*0 !r+s+p+q*~$7*>*>H&>*#"*#"> 2:R͎:!6!6=2:ʙ!6:“H9Ž>!6-e!6ͻ2=2ʺ-é:>>"ͻ2:!!5ͻ2ͬ!\-:>>!p+q:,!6*DM9:<!6:z 2W!6D*&L :w:<2Ov*:>=20O> ڒ:0:AO>Ҥ::A }}Hͬ!wͻO`idͻV[2O>2:!X!6:!:=O!L NE!4 E E:/.*&L 6$L9k9.Xͯ *KM^020 :020:121'ͳ':²ͯ !G6!"!"7 *M^n/ :a/:H!6:ͯ !&62*">!b!ͯ >!`0ͯ !q:E:24J!46*}a!44EJ *KM^'́:‚ͯ !36'n::0:f9OY#9.3'ͳ.:020' 'ͳ'7 6'!j>A+!s!"@͓1!"<**"͓n "Dn"":!Q2҂:X!Wғä:ڤ*MEÓ:ұ@@:O2Mc;!6#6>!)*&P ~"::H:H:H:H"!6!4:_jYO jM*"S*" 3@bl*M1͓!""7 *M^͆ \͔!":͎H*#"ͧÝ/ :>͛9ͯ .*#":_!' !'6!36' :1/!aE*#">z?C9IͲÁ.!6> !ڇ*&' ~2 ʀ: y.*M!4Q>!қ:=2á:2:Ҭ\>!ҿ:=2K:2K!:!:K\: \!p+q͈*DM!  ::=H-\:N2O_og_{ozg^#V))) _{ozg^#V) d^#V|g}o n_{ozgO{ozgi`N#Fogo&og H ©=¨ɲw@PREL Version 2.102 $Copyright 1980 Heath/Zenith Data Systems1 !\v !\" !l vc"ci!v͚!"͚!͚!²!v!ýx"t!"!vW!"WxGyO!x!y#xx:t:uv"qzlll  HX0i!v͚!"͚!͚!²!v!ýx"t!"!vW!"WxGyO!x!y#x HX15"qzlll  HX09i!v͚!"͚!͚!²!v! PRE5W!"WxGyO!x!y#x HX1j"qzlll  Phase error$Cannot open input files$Cannot create output files$Disk I/O error on phase 2$~#"$*"*:*ڀ:͜w͜w͜+w͜*N#F#^#V{_zWZ dzk+++4g#4V+^#r+s+r+s5͜HEX FILES NOT MONOTONIC$*0 ڭW0 ھer"$56###**'DM+p+q+6#^#Vr+s7"j$5[4H###*jHl *j'DM+p+q+6!#^#Vr+sVWRITE ERROR$]͚] 6666#66*eK͞+SRr'+FÎr ͖ 8{ Ăy0 2͵ ^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#.¶66*>?w#> w#.7:77!a{   `OE!y6$ -7rBo&))T])))!yIANAANDANICMACMCCMPCPIDAADADDCRDCXENDEQUHLTINRINXIRPJMPLDALOWLXIMODMOVMVINOPNOTNULORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAXRIASEGCALLCSEGDSEGELSEENDMHIGHIRPCLDAXLHLDNAMEPAGEPCHLPUSHREPTSHLDSPHLSTAXXCHGXTHLENDIFEXITMEXTRNLOCALMACROSTKLNTITLEINPAGEMACLIBPUBLIC7 PF FPA A A* A A A(#&&#&2#/?&#' '( v'( %:P!@"<& #*)&# PP%27&#(&#  $ %*%"$  NZZ NCC POPEP M êPj !9DM>2T`i6#6`i^#Vr+sn! s! w#w͐! nѯg͐n} `i^#Vr+s! ^#Vr+s! n͐s! n}x>2TT! s#r! n&r! ^#Vr+s`i^#Vr+sns! 5>͐6͡>2T!ͤ#}2T!! ͤ}2tU#T"%TS"#T>2T>2qͧü!9J!9DM`i6! 6! 6! n&! n&`in&!" RESTORE version %d.%d%d !0 Y Copyright (c) 1982 Zenith Data Systems a !9Å ) Ô } Jáæ%8)=!9DM*T}˜ m p ! s#r͐|¯  ͐#| s `is`in} *Sn}? *Sv +| *S| *S| y  *S} |  *S}   ͂ *T}ʍ !92 QP!9DM`i6>#6>v2T͐, ͐, !T! / ! , *Tg!T##! s#r͐6Ë !9Ú Ë!9DM! w#w͐ ͐)Sw#w! ^#Vr+sê ! w#wT`is#r͐n} `i^#Vr+s ͐n} !t ͐n}[@ ͐͗ |( !t ͐6! ^#Vr+s͐t ! ^#Vr+s)S͐s#r͐n}=ʈ ͐n}ʈ ͐n}[ʈ `i^#Vr+s\ ͐n}=¾ ͐6`i^#Vr+s! ^#Vr+s)S͐s#r͐n}[ ͐n} `i^#Vr+sþ ͐n} `i^#Vr+s͐n} `i^#Vr+s `i^#Vr+s͐6͐t ͐͗ |3 !t `i^#Vr+s͐n} S `i^#Vr+s< `i^#Vr+s͐6! ^#Vr+s͐t ! 9Ï .KhKJ-!9DM! w#w͐  ͐ S6! ^#Vr+sß ! w#w͐  ͐ uU6! ^#Vr+s *tU&uU6*S`is#r͐| !Ø! w#w͐n}ʑ! 6͐#! s#r͐n&̀ |͐n&̓ ! s! n}E UʷAʙCʙDʙIʙFʙGʙHʙJʙKʙMʙNʙPʙTʙWʙXʙYʙZʙ͐#n}:! Invalid exception file specifications. ͆ ! 6#6ô͐##"S*Sn};5*Sn}5*S#"S*Sn! s*S6͐##͉ ! s#r*S! ns͐|x͐##"Sô!~æInvalid exception file specifications. ͆ ! 6#6͐#n}:!Invalid user option. ͆ ! 6#6Ö*tU&uU6͐##! s#r͐"S*Sn};-*Sn}-*S#"S*Sn! s*S6͐͌ ! s#r*S! ns͐|l͐"SÖ!rÈInvalid user option. ͆ ! 6#6! 6[! n! s! 6]! 6! 6#6! !Invalid option %s specified. ͆ ͐| ! n&S6c! 6[! n! s! 6]! 6! 6#6! !?]Invalid option %s specified. ͆ ͐`is#r͐n};ʎ͐n}ʎ`i^#Vr+sm ͐Ø!9çàK!The RESTORE utility complements the BACKUP utility. RESTORE ͤ!<extracts bindividual files from the backup file that BACKUP creates, ͤ!GÅand copies those files to their individual file names on the ͤ!ådestination media. ͤ!Command form: A>RESTORE {destfile},{destfile},...={sorcfile}ͤ![{x};{x};...] ͤ!WWhere {destfile} is the file name (and drive name if necessary) of ͤ!bí each of the individual files you are restoring from the backup file; ͤ!where {sorcfile} is the file name (and drive name if necessary) of ͤ!R the backup file from which you wish to restore individual files; and ͤ!]ãwhere {x} is an option that further defines the operation as shown: ͤ! *B Backup file directory [B] ͤ! CE Exception files [E:DONTSAVE.DOC,LEAVEIT.ASM,*.BAS] ͤ!%B #L List directory [L] ͤ!Mk $O Overwrite files [O] ͤ!vÏ Q Query user [Q] ͤ!ø $R Read only files [R] ͤ! !S System files [S] ͤ!  *U User numbers [U:0,...,15] ͤ!4 V Verify copies [V] ͤaJû-3ICQn,7J0xQ!9DM*S|y*S|©!áNot enough parameters specified. @Â*SC|¹Â*SF|!Invalid selection file specifications. @Â>2T`i!TI!`iL"'T#|`i!+R Can not open master backup file %s, @!^Ãinsert another disk and hit RETURN, @!îor hit any other key to abort. @O ! ! w#w!"͐R*T| !No files selected. @w! 6!"! w#w*T! s!U|6w! X! s#rzOw! n&U|cw͐[|tw*'T^Â!9ÔJK!9DM͐`is#r͐n}]͐n}`i^#Vr+sæ͐n}]͐6 !Invalid option ] specified. ͎!$S"S͐*S͑!$!93Ø !9DM>2T͐-n}͐-!& s#r͐&n},y͐&n}y!& ^#Vr+sV͐&n!( s͐&6`i͐-0!$ s#r͐&!( ns͐$|>2T!͐&!- s#r͐-n},!- ^#Vr+s@>2T!!)9L!9DM! 6͐n&|B! ng ?͐nѯg! sÖ͐n},W͐n}! n&m!ò! n&uU6͐n}Š!òäÖ!ò! ^#Vr+s ! ^#Vr+s!9JØ !9DM͐ ! s#r͐n}͐n}*͐n}?! ^#Vr+s͐n}I!>Backup file name can not be ambiguous. ;!*!T͐ |b!*͐ ! s#r͐n}.ʑ͐n}ʑ! ^#Vr+sn͐n}.!Extension on backup file specified. ;!Extention 000 will be assumed. ;! w#w͐$͐T60! ^#Vr+s!*!9!9DM! ^#Vr+s! ~#fon&A+s! ^#Vr+s6:`iw#w͐! ~#fo#͐n} —! ^#Vr+s! ~#fo#͐n&|g}os`i^#Vr+sp! ~#fo n} \! ^#Vr+s6.`iw#w͐\! ~#fo ͐n} !\! ^#Vr+s! ~#fo ͐n&|g}os`i^#Vr+s͐6e!9À=112J{Q!t9DM!"T*q`is#r͐! s#r͐|g}o! s#r͐! s#r`i~#fon} ͐)U͐)U~#fo͐|g}os#r+*S`i~#fo#t|ʤ! w#w͐ҡ͐n}!`i~#fo#͐#s`i~#fo-n&uUn}`i~#fo-n&`i~#fo#w|ʿ͐)U͐)U~#fo͐|g}os#r*T#"T͐)U͐)U~#fo͐}/o|/g|g}os#r͐)U͐)U~#fo͐}/o|/g|g}os#rO͐)U͐)U~#fo͐}/o|/g|g}os#r! ^#Vr+s͐! s#r͐|g}o! s#r͐! s#r! ^#Vr+s+͐)U͐)U~#fo͐}/o|/g|g}os#r! ~#fo#s#r*#"͐K(!Internal error, too many files z!}Î.!9C=11~Q!9DM! w#w*:`is#r`i~#fon}qÈ *S`i~#fo#=|s ! w#w͐ Y ͐~#fo! s#r͐~#fo|g}o! s#r͐! s#r͐ n}@ ͐)U~#fo͐|g}o|@ `i~#fo#͐ #s!@! ^#Vr+s@k^͐@͐^#Vr+s! ^#Vr+sÏ*#"͐ &p È Å *#"͐^#Vr+sS͐ Ï !9ç $hKJ %!9DM`iw#w! w#w͐ ! ~#fo#͐6 ! ^#Vr+sý ! w#w͐"!! ~#fo ͐6 ! ^#Vr+s ͐ ͛ ͐ #n}:!͐ ͐ n&͞ s͐ n&! s! n&|!! n&!*T}ʺ!!!õ!Invalid drive designation on backup file. ͡ !$! ~#fo! ns! ~#fo##s#r͐ n}"*T}"!! "Invalid filename. ͡ !$! w#w͐ n}|#͐ n}.|#͐ ͐ n&͞ s͐ n&ͤ |d"͐ n}?"! ~#fo#͐͐ ns! ^#Vr+s! ^#Vr+s͐"͐ n}."͐ n}"*T}"!""Invalid filename. ͡ `i6#6|#y#͐ n}*I#͐ #! ~#fo#͐6?! ^#Vr+s"͐ n}C#͐ n}.C#! ^#Vr+s #|#y#*T}o#!W#j#Invalid filename. ͡ `i6#6|#"͐|$͐ n}$! ^#Vr+s! w#w͐ n}$͐ ͐ n&͞ s͐ n&ͤ |#͐ n}?X$! ~#fo ͐͐ ns! ^#Vr+s! ^#Vr+s͐U$͐ n}U$*T}K$!3$F$Invalid filename. ͡ `i6#6$$͐ n}*™$͐ғ$! ~#fo ͐6?! ^#Vr+sc$$$*T}ʿ$!$ú$Invalid filename. ͡ `i6#6$â#͐|$!$!$!9!9DM! ~#fo*Ts%!9!9DM! n&|g}o! s! n& K%! n&~P%!! n} ʚ%<ʚ%>ʚ%?ʚ%.ʚ%,ʚ%;ʚ%:ʚ%=ʚ%*ʚ%[ʚ%]ʚ%_ʚ%ß%!!%=1$hKJP3I=34xQ!9DM`iͬ%*S|T&*S*Sn&ͯ%s*S#n}:&*Sn&A&*Sn&FF&!&;&Invalid drive designation. Ͳ%/)T&*Sn&`is!P w#w!J w#w͐Jҋ&͐J! 6?!J ^#Vr+sd&!J w#w͐JҺ&͐J! 60!J ^#Vr+sÓ&! 6!j !͵%`i!͵%!N s#r!,)!&'' Name Volumes Files Ͳ%!2'?' Date Ͳ%͐N)!j ! s#r͐`ins![ ͐͸%!![ ͻ%"'T>2T!ͩ%!H s#rz(͐H;%|(!R !H ~#fo'~#fo%!L w#w!J w#w͐J%(͐L ?!H ~#fo# ͐Jnѯg!L s#r!J ^#Vr+s'!L ~#fo#s#r͐L!H ~#fo##!J(`( %-.8s '%3dͲ%!R !H ~#fo%~#fo!(è( %4d G%s Ͳ%*'T%!P ^#Vr+s!j !͵%`i!͵%!J 6#6͐J͐P)`i!͵%!J ^#Vr+s(`i!͵%!N s#r!D'/)!9P)=1Jû3I=3xQ!9DM*S|)!f)È)Not enough parameters specified. >),*SA)| ),`i!TD)!`iG)"'T#|)`i!))Can not find master backup file %s. >),>2T!;)! s#rz5*!*-*Invalid backup file >),͐J)|g*!I*_*Invalid backup file. >),! ~#fo%~#fo! s#r! w#w! w#w͐*͐ ?! ~#fo# ͐nѯg! s#r! ^#Vr+sÏ*!*+ Filename User Start >)! +*+ End Size in >)!5+W+ Volume>)!b+Á+ Volume Kilobytes >)! 6#6͐;)! s#rz¨+ë,! ~#fon}º+ë,! ~#fo+~#fo! s#r͐)))! ~#fo+~#fo,! ^#Vr+s`i! ~#fo#D)! ~#fo%n&! ~#fo-n&! !?,Y, %-12s %2d '%3d>)͐! ~#fo&n&!|,Ö, %3d o%7d >)! ^#Vr+sÏ+͐#͐!,,%d file(s) on %d volume(s) >)*'TM),!9-xQÅ63JCQPI Q!9DM*'T! s#r*T! n}6-!A0͐,! n}2T,`i!T,*T}-*T&@`i!r-â- Insert backup master volume 1, %s,in drive %c ,!--and hit RETURN when ready.,E.*T&@`i*T&#!-. Insert backup volume %d, %s, in drive %c ,!%.@.and hit RETURN when ready.,- T.E.*T&+!%-!`i-! s#rzʇ.,0*T}O/`i!.þ. Can not open master backup file %s, ,*T&@!..insert another disk in drive %c ,!//and hit RETURN when ready, ,!(/G/or hit any other key to abort.,0`i!X/w/ Can not open backup file %s, ,*T&@!/î/insert another disk in drive %c ,!//and hit RETURN when ready, ,!/0or hit any other key to abort.,- )0*T&+}2T! -!A0T.! -͐"'T!A0!9Y06;JÀ@!9DM! w#w͐͐ .1͐@k^`is#r͐M0! s#rz§0 1͐|¶0!41͐P0! s#rz0!41͐|0 1!0 1Verify error, try RESTORE again (Y/N) ?S0V0|1 1Í0! ^#Vr+si0!41!9F1@Q!9DM!͐*'T@1#|s1!1!!*'TC1+|ʑ1!1`is#r͐|g}o|ʻ1`i~#fo@s#r͐1!91Ø ÈA!9DM!' w#w͐' 2͐'6!' ^#Vr+s1!) w#w͐1n}2͐1!$ s#r͐$n},J2͐$n}J2!$ ^#Vr+s'2͐$n!& s͐$6`i͐11|s2!2͐$!& ns`i!/ ~#fo1|ʫ2!) 6#6`in&+6͐$!1 s#r͐1n},2!1 ^#Vr+s2͐)2!+92OBßB)C!9DM͐2|3!͐2|3!! n&͐2|63!!I33J %!9DM! ~#fo0n&|3! ~#fo1n}3! ! ~#fo#@3! !33Invalid version of RESTORE for file %s C3!4! ~#fon}3! ~#fon}3!4! ~#fo#n&4! ~#fo#n&#4!4`iw#w͐҄4! ~#fo##͐n} T4Ä4x4! ~#fo##͐n&F3|x4!4`i^#Vr+s)4`iw#w͐4! ~#fo# ͐n} ¸444! ~#fo# ͐n&F3|4!4`i^#Vr+sÊ4!4!9!9DM! ~#fos#r! ^#Vr+s6͐|g}o P`is#r! ^#Vr+s͐ )0s`i~#fo ͉s#r! ^#Vr+s͐ )0s! ^#Vr+s6-͐|g}o`is#r! ^#Vr+s͐ )0s`i~#fo ͉s#r! ^#Vr+s͐0s! ^#Vr+s6-͐|g}o`is#r! ^#Vr+s͐ )0s`i~#fo ͉s#r͐|s6͐͐0sy6͐6 |6!9!9DM*T`is! 6#6͐|6͐T`in& 0s`in& s! ^#Vr+sÝ66!9"7ÝC3PERÿExQIJ,BJ@ÉFQvRFHÆR!a9DM͐6|>7!;`i! ~#fo#6! ~#fo-n&! 6`i6"S#|7͐6|7!;ç7*S6!`i7"S*tU&! 6! ~#fo-n&`i!77%s to user %d 7! ~#fo%n&+7|<8! ~#fo-n&! 6*S6`i 7*tU&! 6!;!! ~#fo'~#fo*'T 7*T! ~#fo&n&+˜8*'T7! ~#fo)~#foʾ;*tU&! 6!! *'T7+|:*'T7! s#r*'T7! s#r͐!#6! ~#fo!~#fo! s#r*'T7͐69*'T7! s#r͐¢9*T&#7|ƒ9! ~#fo-n&! 6*S6`i 7*tU&! 6!;!! *'T7+|Ÿ9::! ~#fo-n&! 6!͐͐7|¤:͐6|&:! ~#fo-n&! 6*S6`i 7*tU&! 6!;ä:*tU&! 6! ~#fo%n&+7|…:! ~#fo-n&! 6*S6*tU&! 6!;!! ~#fo'~#fo*'T 7*tU&! 6!! *'T7+|::8! ~#fo-n&! 6!! *S7+|ʻ;͐6|6;*S6`i 7*tU&! 6!;*tU&! 6! ~#fo%n&+7|œ;! ~#fo-n&! 6*S6`i 7*tU&! 6!;!! ~#fo'~#fo*'T 7[8! ~#fo-n&! 6*S6*tU&! 6!;!9$<,xQP3IJ@ÉFQvRFH!9DM*S}:*T&#<|i>! ~#fo-n&! <*S<*tU&! ! ~#fo-n&! <*S<*tU&! vJ@w#͒J.‚J͒J66͵JګJw#“J͵JâJ> w#­J.7:77?JILàK!y9DM! `iJ`iJ!9!9DM`iw#w! ^#Vr+sn}K`i^#Vr+sJ͐%K!97KÏOþO!9DM! n&1K|ͣdK! n&4K|ͣnKþO!9DM! n&kK|ʕK! n&ÚK! n&æK Q!9DM͐n}K! ^#Vr+sn&ͣKîK!9DM͐`is#r! ^#Vr+s! ^#Vr+sns{ LK͐L!9!9DM! n&0ͯEL! n&9ͯXLOL×PhK!i9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{ʀO`in}%jO! ! s#r! 6#6! s! s͐n}-L! ^#Vr+s! 4͐n&OL}M! RLM!! s#r! ^#Vr+sn`is{.KM! RL! s#r! 4! ^#Vr+sn`is`in&UL}DwMUʳMXʼMOMC NSWr#MͲ!_p+q!`6>!`6*`&*^*`&Y />!`4 >*]& ~ O!]49!a6:a*]& ~2bO>z*bM >!b/~,H~:H~*H~.H~>H~<H~=H*]& 6!]4T!]4!cq*a&Y :cw!a4!gr+s+p+q!h6>fr*d*f!is*d́"dPY! "f>!h#~Haͫo!h6:i0O͐!mr+s+p+q*lTZs#r*lڶ*l+s#r*jN#F+q#pÌ!nq!"o"q}2uo&"s* s:n*sDM2u:uqos*s"s*o͊O !v6>!vQ*v&w 6`i+46)A*:'ʓ:'O!) ~2vʍ:vO!w 6,]!v6>!v*v&w ~һ*vM !v4˜8AO͐:͐ͱ*##N!ͽ"* N#F*͠">!H% - *DM ͱͷDM  ͱ* N#F 9ͱ * ^#V))DM Tͱ* ~ *} *M!+s#r#4 !s+p+q!6!66:!ڄ !6!6>!r *&**&Y i !6!4+4A :} :!4- >!699 2¨ :!4: :2!6+6>! :O!9 DMi ͱ:!O!Y DMi :2:2͠!4 F :® )!6>!ګ ͠:O!9 DMi 8ͱ!6> !ڤ Å :2k ä  ͐:!O!Y DMi w !4C F :¿ >F : F :=229:Y= ;>9*&Y DM =2 I>!6:=28 :2:2 :!!29:Y T >:Y,e \>Ì !p+q*~:ʉ *N͐*#"o :͐!p+q!'"!6> **{2*́"PY! ">!+~H !6:0O͐à k͐͠Q" 8AO͐jͱͷDM͏ m  Z"l"!6>ʥ *}҆ *M ͱ*}x O͐} W͐ͱ !+s#r!+s#r#4D ͠:\ʹ :\=Oͳͩ !6!)6l :) :)=2) :] & !"}2\!h6?!j6?\:'C:'Cƀo&")!)6!"):)/)HҘ]!)6> !)ڎ*)&*)*)&*) y!)6 Ä:) 2):)<2)M*)#")/:)ҩ*)+")`*")#"]!*)!/H!")!"]*)) *)s#r!)6> !).*)&*)*)&*) w:)<2)*)) >w#6*)) w#6*)!) w#6*)%) w#6*)) N#F*)) q#p*)%) *) ~e *) * ~o&͞ *)%) q#p!)6* >!)6!)6>!)=:)!)w=*)&*)~2):)*)& *):)2):):*)!) *)) s, >X\:)“>!d!")>!)d!")!")*++!)a*)) ^#V")]*)")*)) ^#V")]!)6> !)T*)&*)~2)*)&*)~2)O;*)) ^#V")*)) *)) N#Fq#p*)) *)s#r*)#")!)6 J:)!)J!)6 :)<2)*)")҈q:tw͠ͱ!"))ҍ*)) ^#V")]͠.*)DM\ -°!\6:\ͣ:ͱ*}DM'ͫ*)%) N#F'ͫ*)!) N#F'k͐ͫ*)) N#FͫR͐/͐ *) ~IO͐NW͐ͫ8AO͐:͐ *) ~2)t(͐:)҃)͐*)#")Ã& \!"))\Ұ*)")]͠*)M! ^#V *) >*) w *) >*) w *) >*) w *) >*) w.*)DM\ -+!\6uͱ:)O! DMͱ*)#")Ù*))"):m w>.Yn -:YS:Z Hҧ!6> 2)½>!)6> !)*)&*)>2) :) .͐*)M͐:)<2)99:Y=/9&ͩ c,Hͩ 9 EHͺ i`N#Fog_og_ogDM!>))덑o|gҘ =†DM!>))ҭ =¥~ ³^#V) ½^#V|g}o _{ozgi`N#Fogo&og_{_z#WɁ copyright(c) 1977, digital research $Error On Line $SUBNo 'SUB' File Present$Disk Write Error$Command Buffer Overflow$Command Too Long$Parameter Error$Invalid Control Character$Directory Full$Cannot Close, Read/Only?$!9"!͇͊!p+q* ͊!p+q*͍2!p+q*͍2!p+q*͊!p+q*͍!p+q*͍!p+q*͍2!s+p+q+p+q:=2ʦ** w*#"*#"!p+q(+*DM*p*& 6:ep\:=ͧ!t6>!t%\= >!t6:t<2t=O! ~2u b:<2O>9b!60+~9b!60+4:uat:u_2u:uMʉSͧ!v6!"v!|6:|Ҁ!x6 2}:} Hk:} h:}$6 2}$*}M3:}02}O> ͧ3!z6ͭ:}"!}5́ͭ́3*yM"h:}^a A2}O>Vͧ^:}>*z& ~ !z4í!{q*v#"v͙dͧ*vv :{w:x<2xO>}|ͧ-!6]:ͧz2~e:~2O! 6*~& 6$>!~_z*~& w!~5Bx:yͧ*v+"vv ~_{ozg 001 $$$$ SUB+cCOPYRIGHT (C) 1978, DIGITAL RESEARCH o&)a{__> A> AH~A#XO****!*$*'!\:Z5ʮ·÷:Z2\! "Q>2N!N4~:W2T:[2Z*X"U:Z2\:SbNo>2O:T!O4Q!O^*U|#K &FNwy(*QDM:PG͏J͇:T(*Q"Qɯ2]1!/X:] \;<‹!tS2|\͹¼ ‘! DM\͹Nä!S!JS3 NA2Md|:MA2{H!qX3 H:M<2=!]S2P!8X!S3 NY@yN>2]!8S!S3 A2M<2=d|:MyNA2!S3 H:MҦ!]SN>2 *b ~#³*d ~#! #/w!P6:]Ϳ!8XN>dH!JS*"^!0"f!"`*`~ ~# /P*`~§ô*`6*f*`#s#r*f*^zr{Ҵ•*f"fc*`q#p*`%"`!S2]!"`*`~µ ~# :2:22:2:2:2:2*`*DM*`#*"f*f"f xU:2:222:2:2*`%"`!S d|7*"X *"d~2W ~2S"b##~2[~:[G:W*X>!32Tx2Z"U~#foCP/M-85 SYSGEN VER 2.2.102SOURCE DRIVE NAME (OR RETURN TO SKIP):SOURCE ON , THEN TYPE RETURNDESTINATION DRIVE NAME (OR RETURN TO REBOOT):DESTINATION ON , THEN TYPE RETURNCOPY SYSTEM FILES (Y/N):WRITE ERROR DURING SYSTEM FILES ERROR READING SYSTEM FILES FUNCTION COMPLETEINVALID DRIVE NAMEUNABLE TO SELECT DRIVENO SOURCE FILE ON DISKSOURCE FILE INCOMPLETEAME (OR RETURN TO REBOOT):DESTIN BIOS88 SYS BIOS85 SYSALTCHAR SYS     W Extended Submit Vers 2.0Xsub Already Present$Requires CP/M Version 2.0 or later$:y*###ƒ# yk   җ 4!~=ŐW!xʵ ~#èbx {~#o}où.xsubb!np+q*m2_!pp+q*o ]xsub*"-!/"*"+!""1 M*!"́!"* (xsub active)$|*y ʥ*"*7***x*́͋<͛ :%*=26͋!7^#6 #6 #6$ 8*7~O #w# !6:6=2% ͋*-"*$$$ SUBq:(=2(N *$*& w*$#"$*&#"&' !"N*M^7 !)6:!)ھ *N*DM͆ 2*ʭ :*ʗ ͯ *N"P*6:2)÷ *N"N!) $@BA$! A "!$""5P,22, Q&&Y""&`>>>a?bscdefghi>>j>kUUUUlm*nopqrsStuvwxyf<""P,22, Q&&Y""&[6 ?H6\&*2@]"`>>>a?bscdefghi>>j>kUUUUlm*nopqrsStuvwxyf<""P,22, Q&&Y""&[6 ?H6\&*2@]"`?$ p "|P,22, Q&&Y""&`>>>a?bscdefghi>>j>kUUUUlm*nopqrsStuvwxyf<`?+@2AQM?QAWZZW[^\$]/^6_[`$ p "| "; S<" = "<P,22, Q&&Y""&["> \"""&]"> ^"`>>>a?bscdefghi>>j>kUUUUlm*nopqrsStuvwxyf<:?_@"YZZY[}\#]+^&_?`$$$:  -  "<;"">""<""""="""""> [P,22, Q&&Y""&["\"""]"""&^$$,"", `>>>a?bscdefghi>>j>kUUUUlm*nopqrsStuvwxyf<""<""""!ͷ’P͌Q!ͷªP}QxQ!ͷ͓G@Q! ͷ y͓Gþ!ͷ ͓Q!ͷ5P,22, Q&&Y""&`>>>a?bscdefghi>>j>kUUUUlm*nopqrsStuvwxyf</?!@2M?WZZW[^\$]|^6_``>m,wzzw{=|\}~~}"""& "> " b$()B """;"> <$ p "|=" >@"#P,22, Q&&Y""&["]">"6*"`>>>a?bscdefghi>>j>kUUUUlm*nopqrsStuvwxyf< <$ p "|=" >@"#P,22, Q&&Y""&["]">"6*"`.":';+?-=/-:\;|=/?_\{]'_+{]|}}"  "<;8<0I"2*&"= "P,22, Q&&Y""&[ )\0I<"""]" `>>>a?bscdefghi>>j>kUUUUlm*nopqrsStuvwxyf<""<""""=">""P,22, Q&&Y""&["\"""]"`>>>a?bscdefghi>>j>kUUUUlm*nopqrsStuvwxyf<""<""""=">""P,22, Q&&Y""&["\"""]"`' TITLE 'FORMAT - CP/M-85 FORMAT UTILITY 19 SEP 83' FALSE EQU 0 TRUE EQU 1 ASM86 EQU FALSE ;** EXTRA PSEUDO OPS FOR USE WITH MAC ; RB MACRO A DS A ENDM RW MACRO A DS 2*A ENDM ;** ;* MACRO COMINP - Command line input ;* ;* Macro to bypass console prompts and read from command line ;* ;* Bill Earl 10/18/81 ;* ;* DATUM = address of desired input data ;* PROCED = place to continue after acquiring data ;* IGNOR = place to continue if no command line ;* COMINP MACRO DATUM, PROCED, IGNOR LDA COMLIN ;; is there a command line ANA A ;; JZ IGNOR ;; no, read from console LDA DATUM ;; yes, load it into A JMP PROCED ;; take it and run ENDM ;** ;* MACRO QUERY ;* ;* CHECKS TO SEE IF NO QUERY MODE, ;* IF SO, SKIPS OVER USER PROMPT ;* QUERY MACRO RESUME LDA NOQFLG ANA A JNZ RESUME ENDM ;** ;* MACRO TCHECK ;* ;* TYPE CHECK OF DISK ;* TCHECK MACRO DRT LOCAL TC1 LDA TFLG ANA A JZ TC1 CPI DRT TC1 JNZ TMMERR ENDM PAGE BIAS EQU 0 ;** CP/M-85 SYSTEM EQUATES ; ; OS VALUES CCPL EQU 0800H ;LENGTH OF CCP BDOSL EQU 0E00H ;LENGTH OF BDOS ; RESERVED LOCATIONS IN PAGE ZERO ORG BIAS BOOT RB 3 ;JUMP TO WARM START ENTRY IOBYTE RB 1 ;IOBYTE DFTDRV RB 1 ;CURRENT EFAULT DRIVE BDOS RB 3 ;JUMP TO BDOS INT1 RB 8 ;INTERRUPT LOCATION 1 INT2 RB 8 ;INTERRUPT LOCATION 2 INT3 RB 8 ;INTERRUPT LOCATION 3 INT4 RB 8 ;INTERRUPT LOCATION 4 INT5 RB 8 ;INTERRUPT LOCATION 5 INT6 RB 8 ;INTERRUPT LOCATION 6 (RESERVED) INT7 RB 8 ;INTERRUPT LOCATION 7 (USED BY DDT) BSCR RB 16 ;16 BYTE SCRATCH AREA FOR BIOS RB 12 ;12 BYTES NOT USED BUT RESERVED TFCB RB 36 ;TRANSIENT DEFAULT FCB TFCB2 EQU TFCB+16 ;TRANSIENT 2ND FILENAME TBUFF RB 128 ;DEFAULT DISK BUFFER TPA RB 0 ;START OF TRANSIENT PROGRAM AREA ; HEATH PAGE ZERO LOCATIONS IF ASM86 ORG OFFSET INT1+3 ENDIF IF NOT ASM86 ORG INT1+3 ENDIF TICCNT RW 2 ;32 BIT TIMER TIC COUNTER TIMEFLG RB 1 ;TIMER 2 FLAG (0=RUNNING , 1=TIME OUT) IF ASM86 ORG OFFSET INT2 ENDIF IF NOT ASM86 ORG INT2 ENDIF COMREG RB 0 ;BIOS88 COMMUNICATION REGION COMFUNC RB 1 ; BIOS FUNCTION VALUE = (#-CBOOT)/3 COMRA RB 1 ; (A) COMRBC RW 0 ; (BC) COMRC RB 1 ; (C) COMRB RB 1 ; (B) COMRDE RW 0 ; (DE) COMRE RB 1 ; (E) COMRD RB 1 ; (D) COMRHL RW 0 ; (HL) COMRL RB 1 ; (L) COMRH RB 1 ; (H) COMWHO RB 1 ;WHICH PROCESSOR IS RUNNING ; ZPSPPS5 = 8085 .; ZPSPPS8 = 8088 IF ASM86 ORG OFFSET INT4 + 3 ENDIF IF NOT ASM86 ORG INT4 + 3 ENDIF LPENHF RB 1 ;LIGHT PEN HIT FLAG (<>0 = HIT) LPENPOS RW 1 ;LIGHT PEN POSITION LPENHIT RB 1 ;LIGTH PEN HIT REGISTER IMAGE BDMAP EQU BSCR+00H ;DRIVE MAP (MAX OF 8 ENTRIES 0-7) IF ASM86 BBIOS EQU WORD PTR BSCR+0EH ;TRUE ADDRESS FOR START OF BIOS ENDIF IF NOT ASM86 BBIOS EQU BSCR+0EH ;TRUE ADDRESS FOR START OF BIOS ENDIF ; CP/M FUNCTIONS RESET EQU 0 ;SYSTEM RESET RDCON EQU 1 ;READ CONSOLE WRCON EQU 2 ;WRITE CONSOLE RDRDR EQU 3 ;READ READER WRPUN EQU 4 ;WRITE PUNCH WRLST EQU 5 ;WRITE LIST DCONIO EQU 6 ;DIRECT CONSOLE I/O (2) IOSTAT EQU 7 ;INTERROGATE I/O STATUS ASTAT EQU 8 ;ALTER I/O STATUS PRCONB EQU 9 ;PRINT CONSOLE BUFFER RDCONB EQU 10 ;READ CONSOLE BUFFER CCSTAT EQU 11 ;CHECK CONSOLE STATUS LDH EQU 12 ;LIFT DISK HEAD CPMVER EQU LDH ;GET CP/M VERSION (2) RDS EQU 13 ;RESET DISK SYSTEM SELDSK EQU 14 ;SELECT DISK OPEN EQU 15 ;OPEN FILE CLOSE EQU 16 ;CLOSE FILE S1ST EQU 17 ;SEARCH FIRST SNXT EQU 18 ;SEARCH NEXT DELETE EQU 19 ;DELETE FILE READ EQU 20 ;READ RECORD WRITE EQU 21 ;WRITE RECORD CREATE EQU 22 ;CREATE FILE RENAME EQU 23 ;RENAME FILE ILOG EQU 24 ;INTERROGATE LOGIN IDSK EQU 25 ;INTERROGATE DISK SETDMA EQU 26 ;SET DMA ADDRESS IALLOC EQU 27 ;INTERROGATE ALLOCATION WPD EQU 28 ;WRITE PROTECT DISK GROV EQU 29 ;GET READ/ONLY VECTOR SFA EQU 30 ;SET FILE ATTRIBUTES GADPB EQU 31 ;GET ADDR OF DPB SGUSR EQU 32 ;SET/GET USER CODE READRR EQU 33 ;READ RANDOM RECORD WRITERR EQU 34 ;WRITE RANDOM RECORD CFSIZE EQU 35 ;COMPUTE FILE SIZE SRR EQU 36 ;SET RANDOM RECORD RESDRV EQU 37 ;RESET DRIVE WRITERZ EQU 40 ;WRITE RANDOM WITH ZERO FILL ; BIOS ENTRY POINTS. ; GIVEN AS DISPLACEMENTS FROM WARM BOOT ENTRY POINT WHOSE ; ADDRESS IS USUALLY AT LOCATION BOOT+1. ; TO COMPUTE DISPLACEMENTS FROM VALUE STORED AT 'BBIOS' ; SUBTRACT 'CBOOT'. EG. DISPLACEMENT FOR WARM BOOT = WBOOT-CBOOT CBOOT EQU -0003H ;COLD BOOT WBOOT EQU 0000H ;WARM BOOT CONST EQU 0003H ;CONSOLE STATUS CONIN EQU 0006H ;CONSOLE INPUT CONOUT EQU 0009H ;CONSOLE OUTPUT LSTOUT EQU 000CH ;LIST OUTPUT PUNOUT EQU 000FH ;PUNCH OUTPUT RDRIN EQU 0012H ;READER INPUT HOME EQU 0015H ;HOME DISK SETDSK EQU 0018H ;SET (SELECT) DISK DRIVE SETTRK EQU 001BH ;SET TRACK NUMBER SETSEC EQU 001EH ;SET SECTOR NUMBER SDMA EQU 0021H ;SET DMA ADDRESS BREAD EQU 0024H ;READ SELECTED SECTOR BWRITE EQU 0027H ;WRITE SELECTED SECTOR BLSTST EQU 002AH ;CHECK LIST DEVICE STATUS BSECTRN EQU 002DH ;SECTOR TRANSLATE ROUTINE BFMT EQU 0030H ;FORMAT BRDTRK EQU 0033H ;READ TRACK BWRTRK EQU 0036H ;WRITE TRACK BWPC EQU 0039H ;WRITE PROTECT CHECK BCBD EQU 003CH ;CLEAR BUFFERS FOR DRIVE BPEEK EQU 003FH ;PEEK 8088 MEMORY FUNCTION BPOKE EQU 0042H ;POKE 8088 MEMORY FUNCTION ; BIOS WRITE TYPES BWRNOR EQU 0 ;NORMAL WRITE BWRDIR EQU 1 ;WRITE TO A DIRECTORY SECTOR BRWUA1 EQU 2 ;WRITE TO 1ST SECTOR OF UNALLOC BLOCK ; FILE CONTROL BLOCK ORG 0 FCBDN RB 1 ;DISK NAME FCBFN RB 8 ;FILE NAME FCBFNL EQU 8 ;FILE NAME LENGTH FCBFT RB 3 ;FILE TYPE FCBFTL EQU 3 ;FILE TYPE LENGTH FCBRO EQU FCBFT+0 ;R/O FLAG FCBROF EQU 10BB ; R/O FLAG VALUE FCBSYS EQU FCBFT+1 ;SYS FLAG FCBSYSF EQU 10FB ; SYS FLAG VALUE FCBARC EQU FCBFT+2 ;ARCHIVE FLAG FCBARCF EQU 10\B ; ARCHIVE FLAG VALUE FCBEX RB 1 ;EXTENT RB 1 FCBRWF RB 1 ;R/W FLAG FCBRWFF EQU 10(B ; R/W FLAG VALUE FCBRC RB 1 ;RECORD COUNT FCBDM RB 16 ;DISK ALLOCATION MAP FCBNR RB 1 ;NEXT RECORD TO BE READ OR WRITTEN FCBLS EQU 33 ;FCB LENGTH FOR SEQUENTIAL I/O FCBRR RB 3 ;RANDOM RECORD POINTER FCBLR EQU 36 ;FCB LENGTH FOR RANDOM I/O ;** CHARACTER I/O TABLE DEFINITIONS ; ORG 0 ; TABLE CIOTBL RB 0 CIOBP RB 1 ;BASE PORT CIOBR RW 1 ;BAUD RATE CIOF1 RB 1 ;FLAG BYTE 1 CIOF2 RB 1 ;FLAG BYTE 2 CIOIM RB 1 ;INPUT READY MASK CIOIPM RB 1 ;INPUT READY POLARITY MASK CIOOM RB 1 ;OUTPUT READY MASK CIOOPM RB 1 ;OUTPUT READY POLARITY MASK CIOECNT RB 1 ;# OF CHARACTERS BEFORE SENDING CIOECTR RB 1 ;CHARACTER COUNTER FOR SENDING CIONCHR RB 1 ;SEND NULLS AFTER THIS CHARACTER CIONCNT RB 1 ;# OF NULLS TO SEND CIONCTR RB 1 ;NULL COUNTER CIOVAL1 RB 1 ;DEVICE DEPENDANT VALUE 1 CIOVAL2 RB 1 ;DEVICE DEPENDANT VALUE 2 CIOVAL3 RB 1 ;DEVICE DEPENDANT VALUE 3 CIOVAL4 RB 1 ;DEVICE DEPNEDANT VALUE 4 CIOVAL5 RB 1 ;DEVICE DEPENDANT VALUE 5 CIOVAL6 RB 1 ;DEVICE DEPENDANT VALUE 6 CIOVAL7 RB 1 ;DEVICE DEPENDANT VALUE 7 CIOVAL8 RB 1 ;DEVICE DEPENDANT VALUE 8 CIOIN RW 1 ;ADDRESS OF DEVICE INIT ROUTINE CIOIS RW 1 ;ADDRESS OF INPUT INPUT STATUS ROUTINE CIOID RW 1 ;ADDRESS OF INPUT DATA ROUTINE CIOOS RW 1 ;ADDRESS OF INPUT OUTPUT STATUS ROUTINE CIOOD RW 1 ;ADDRESS OF OUTPUT DATA ROUTINE IF ASM86 CIOTBLL EQU OFFSET $-OFFSET CIOTBL ;LENGTH OF CIO TABLE ENDIF IF NOT ASM86 CIOTBLL EQU $-CIOTBL ;LENGTH OF CIO TABLE ENDIF ; FLAG BYTE 1 CIOSPI EQU 0+1B ;STRIP PARITY BIT ON INPUT CIOSPO EQU 0-10B ;STRIP PARITY BIT ON OUTPUT CIOMLI EQU 0100B ;MAP LOWER CASE ON INPUT CIOMLO EQU 00001000B ;MAP LOWER CASE ON OUTPUT CIOEAH EQU 00010000B ;USE / HANDSHAKING CIODCH EQU 0010-B ;USE / HANDSHAKING CIOFO EQU 010B ;FAST OUTPUT ; FLAG BYTE 2 CIOW4A EQU CIOEAH ; SENT, WAITING FOR CIOW4D EQU CIODCH ;WAITING FOR ;** DEFINITION OF LOCATIONS AT THE HEAD OF THE BIOS FOR CP/M-85 ; ; * * * N O T E * * * ; ; IF THE BIOS IS ALTERED, THEN THIS FILE MUST ALSO BE UPDATED. ; BVERSN EQU 102 ;VERSION # FOR CURRENT BIOS $; USE THIS EQUATE IN USER PROGRAMS ; THAT WISH TO KNOW VERSION # ; THEY WERE ASSEMBLED FOR BREVSN EQU ' ' ;REVISION LETTER BMO EQU 09 ;DATE BDY EQU 27 BYR EQU 83 NDRIVES EQU 6 ;MAXIMUM NUMBER OF DRIVE TABLES ; ORG 0048H ;SKIP BIOS JUMP VECTOR CODE BIOSVER RB 1 ;BIOS VERSION DEFIOB RB 1 ;DEFAULT I/O BYTE MODE RB 1 ;MODE FLAGS BYTE BSIZE RB 1 ;BIOS SIZE IN PAGES BEND RW 1 ;ENDING ADDR OF BIOS + 1 HECNT RW 1 ;HARD ERROR COUNT (SINCE COLD BOOT) SECNT RW 1 ;SOFT ERROR COUNT (SINCE COLD BOOT) NDISKS RB 1 ;NUMBER OF DISK POSSIBLE IN THIS BIOS ; AUTO EXEC COMMAND BUFFERS AUTOCBC RB 41 ;COLD BOOT AUTO COMMAND AUTOWBC RB 41 ;WARM BOOT AUTO COMMAND ; CHARACTER I/O TABLES CRTTBL RB CIOTBLL ;CRT: (KEYBOARD/DISPLAY) SERATBL RB CIOTBLL ;SERIAL PORT A SERBTBL RB CIOTBLL ;SERIAL PORT B PPRTTBL RB CIOTBLL ;PARALLEL PRINTER PORT DUMMYTBL RB CIOTBLL ;DUMMY UNIT ; DISK PARAMETER ENTRY TABLES DPEBASE RB 0 ;START OF DISK PARAMETER ENTRY TABLES ;** SOFTWARE BOOT CODE DEFINITIONS ; SBCSBC EQU 0 ;LOGICAL SECTOR # OF SBC ORG 0 SBCJMP RB 3 ;JUMP TO SOFTWARE BOOT CODE SBCVER RB 1 ;SOFTWARE BOOT CODE VERSION NUMBER SBCREV RB 1 ;SOFTWARE BOOT CODE REVISION NUMBER SBCDBS RB 27 ;DEFAULT BOOT STRING SBCBSA RB 3 ;SECTOR ADDR OF BAD SECTOR TABLE A SBCBSB RB 3 ;SECTOR ADDR OF BAD SECTOR TABLE B SBCSBA RB 3 ;SECTOR ADDR OF SUPER BLOCK A SBCSBB RB 3 ;SECTOR ADDR OF SUPER BLOCK B SBCSSZ RW 1 ;SECTOR SIZE SBCSPT RW 1 ;SECTORS PER TRACK SBCTPC RW 1 ;TRACKS PER CYLINDER SBCCPV RW 1 ;CYLINDERS PER VOLUME SBCSPS RW 1 ;SECTORS PER REGION SBCVSZ RB 3 ;VOLUME SIZE (SECTORS PER VOLUME) SBCNSL RB 1 ;NUMBER OF REGIONS - 1 SBCCSA RW 1 ;CHECKSUM: SUPER BLOCK A SBCCSB RW 1 ;CHECKSUM: SUPER BLOCK B SBCCBA RW 1 ;CHECKSUM: BAD SECTOR TABLE A SBCCBB RW 1 ;CHECKSUM: BAD SECTOR TABLE B SBCSDP RB 12 ;SET DRIVE PARAMETERS SBCFUS RB 3 ;FIRST USER SECTOR NUMBER SBCDATE RB 6 ;DATE PARTITIONED SBCCRC RW 1 ;CRC OF SBC (ASSUMIN SBCCRC=0) RB 39 ;RESERVED SBCLEN EQU 0080H ;SBC LENGTH ; SUPER BLOCK DEFINITIONS SPBNE EQU 16 ;NUMBER OF ENTRIES ORG 0 SPBPNL EQU 16 ;MAXIMUM LENGTH OF PARTITION NAME SPBPN RB SPBPNL ;PARTITION NAME SPBOSL EQU 10 ;MAXIMUM LENGTH OF OS NAME SPBOS RB SPBOSL ;OS NAME SPBFLG RB 1 ;FLAG BYTE SPBFSN RB 3 ;FIRST SECTOR # OF PARTITION ; (LOW,MID,HIGH) SPBPEL EQU 30 ;LENGTH OF ENTRY ; SUPER BLOCK FLAG BYTE SPBFPNF EQU 10B ;PARTITION NOT FORMATTED ; BAD SECTOR TABLE SBCBEL EQU 3 ;LENGTH OF ENTRY ;** Z207 EQUATES ; ; PORT ASSIGNMENTS FDBASE EQU 0B0H ;BASE PORT ADDRESS FDCMD EQU FDBASE ;1797 COMMAND REGISTER FDSTA EQU FDBASE ; %STATUS REGISTER FDTRK EQU FDBASE+1 ; $TRACK REGISTER FDSEC EQU FDBASE+2 ; %SECTOR REGISTER FDDAT EQU FDBASE+3 ; ,DATA REGISTER FDCON EQU FDBASE+4 ;DISK CONTROL PORT FDAS EQU FDBASE+5 ;AUX STATUS PORT ; COMMANDS FDCRST EQU 000H ;RESTORE FDCSEK EQU 010H ;SEEK FDCSTP EQU 020H ;STEP FDCSTI EQU 040H ;STEP IN FDCSTO EQU 060H ;STEP OUT FDCRDS EQU 080H ;READ SECTOR FDCWRS EQU 0A0H ;WRITE SECTOR FDCRDA EQU 0C0H ;READ ADDRESS FDCRDT EQU 0E0H ;READ TRACK FDCWRT EQU 0F0H ;WRITE TRACK FDCFI EQU 0D0H ;FORCE INTERRUPT ; TYPE 1 COMMAND FLAGS FDFUTR EQU 00010000B ;UPDATE TRACK REGISTER FDFHLB EQU 00001000B ;HEAD LOAD AT BEGINNING FDFVRF EQU 0E100B ;VERIFY FLAGS ; TYPE 1 COMMAND STEP RATE FLAGS FDFSRM EQU 011B ;STEP RATE MASK FDFS6 EQU 0"B ;STEP RATE 6(3) MS FDFS12 EQU 01B ; 12(6) FDFS20 EQU 010B ; 20(10) FDFS30 EQU 011B ; 30(15) ; TYPE 2&3 COMMAND FLAGS FDFMRF EQU 00010000B ;MULTIPLE RECORD FLAG FDFSLF EQU 00001000B ;SECTOR LENGTH FLAG FDFDLF EQU 0100B ;30 MS DELAY FDFSS1 EQU 010B ;SELECT SIDE 1 FDFDDM EQU 0(1B ;DELETED DATA MARK ; TYPE 4 COMMAND FLAGS FDFINI EQU 0+B ;TERMINATE WITH NO INTERRUPT FDFII0 EQU 0.1B ;NOT READY TO READY TRANSITION FDFII1 EQU 0/10B ;READY TO NOT READY TRANSITION FDFII2 EQU 0^100B ;INDEX PULSE FDFII3 EQU 00001000B ;IMMEDIATE INTERRUPT ; STATUS FLAGS FDSNRD EQU 10B ;NOT READY FDSWPV EQU 010*B ;WRITE PROTECT VIOLATION FDSHLD EQU 0010!B ;HEAD IS LOADED FDSRTE EQU 0010B ;RECORD TYPE FDSWTF EQU 0010B ;WRITE FAULT FDSSEK EQU 00010000B ;SEEK ERROR FDSRNF EQU 00010000B ;RECORD NOT FOUND FDSCRC EQU 00001000B ;CRC ERROR FDSTK0 EQU 0 100B ;FOUND TRACK 0 FDSLDT EQU 0100B ;LOST DATA FDSIND EQU 010B ;INDEX HOLE FDSDRQ EQU 010B ;DRQ FDSBSY EQU 01B ;BUSY ; INFO RETURNED BY A READ ADDRESS COMMAND FDRATRK EQU 0 ;TRACK FDRASID EQU 1 ;SIDE FDRASEC EQU 2 ;SECTOR FDRASL EQU 3 ;SECTOR LENGTH FDRACRC EQU 4 ;2 BYTE CRC FDRAL EQU 6 ;LENGTH OF READ ADDRESS INFO ; DISK HEADER SECTOR LENGTH VALUES FDSL128 EQU 0 ;SECTOR LENGTH 128 FDSL256 EQU 1 ;SECTOR LENGTH 256 FDSL512 EQU 2 ;SECTOR LENGTH 512 FDSL1K EQU 3 ;SECTOR LENGTH 1024 ; CONTROL REGISTER FLAGS CONDS EQU 0#11B ;DRIVE SELECT BITS CONDS8 EQU 0100B ;0=5 1/4" , 1=8" CONDSEN EQU 00001000B ;DRIVE SELECT ENABLE CONPC EQU 00010000B ;WRITE PRE-COMPENSATION ; 5 1/4" 0=YES , 1=NO ; 8" 0=ALL TRACKS , 1=TRACKS 44-76 CON5FS EQU 0010!B ;5 1/4" FAST STEP CONWE EQU 010*B ;ENABLE WAIT FOR DRQ OR IRQ CONSD EQU 10JB ;ENABLE SINGLE DENSITY ; AUXILARY STATUS REGISTER FLAGS ASIRQ EQU 0%1B ;1797 INTERRUPT REQUEST ASMO EQU 010B ;5 1/4" MOTOR ON AS96T EQU 00001000B ;5 1/4" DRIVES ARE 96TPI AS5PC EQU 00010000B ;5 1/4" DRIVES NEED WRITE PRE-COMPENSATION AS2S EQU 0108B ;SELECTED 8" DRIVE CONTAINS 2 SIDED MEDIA ASDRQ EQU 10|B ;1797 DRQ ; MISCELLANEOUS VALUES NTRKS37 EQU 40 ;# TRACKS SINGLE DENSITY 5 1/4" (48 TPI) NTRKD37 EQU 80 ;# TRACKS DOUBLE DENSITY 5 1/4" (96 TPI) NTRK837 EQU 77 ;NUMBER OF TRACKS 8" NSBT37 EQU 52 ;NUMBER OF CP/M RECORDS TO BE LOADED AT BOOT ;** Z217 EQUATES ; WINSPT EQU 18 ;# PHYSICAL SECTORS PER TRACK WICSZ EQU 512 ;CELL SIZE USED ;* PORT ASSIGNMENTS WIPBASE EQU 0AEH ;BASE PORT WIPCMD EQU WIPBASE+0 ; COMMAND WIPSTAT EQU WIPBASE+0 ; HARDWARE STATUS WIPRES EQU WIPBASE+1 ; RESET WIPINTA EQU WIPBASE+1 ; INTERRUPT ACKNOWLEDGE/HARDWARE STATUS ;* HARDWARE STATUS REGISTER WISINT EQU 10%B ;INTERRUPT PENDING WISBUSY EQU 010B ;BUSY WISBM EQU 0010bB ;BURST MODE WISTMA EQU 00010000B ;TMA IN PROGRESS WISERR EQU 00001000B ;ERROR WISIERR EQU 0)100B ;IMMEDIATE MODE ERROR WISPAUS EQU 010B ;PAUSED WISDONE EQU 01B ;DONE ;* DIRECT MODE COMMANDS WISETUP EQU 08H ;SETUP WIEXEC EQU 10H ;EXECUTE WIPAUS EQU 18H ;PAUSE WICONT EQU 20H ;CONTINUE ;* CONTROL BLOCK COMMANDS WIRECAL EQU 00H ;RECALIBRATE WISTAT EQU 01H ;STATUS WIWRL EQU 10H ;WRITE LOGICAL WIRDL EQU 11H ;READ LOGICAL WISEKL EQU 13H ;SEEK LOGICAL WIFMTD EQU 20H ;FORMAT DRIVE WIFMTT EQU 21H ;FORMAT TRACK WISDP EQU 22H ;SET DRIVE PARAMETERS WIWRA EQU 30H ;WRITE ABSOLUTE WIRDA EQU 31H ;READ ABSOLUTE WISEKA EQU 33H ;SEEK ABSOLUTE ;* FORMAT OF COMMANDS ; TYPE 0 & 1 ORG 0 WI01BLK RB 0 WI01OP RB 1 ;COMMAND OP CODE WI01DHS RB 1 ;BIT 7-5 -- DRIVE SELECT 4; 4-0 -- HIGH BYTE OF LOG SECTOR # WI01D EQU 1110'B ; DRIVE SELECT MASK WI01HS EQU 0001B ; HIGH BYTE OF LOG SECTOR # MASK WI01MS RB 1 ;MIDDLE BYTE OF LOGICAL SECTOR # WI01LS RB 1 ;LOW BYTE OF LOGICAL SECTOR # WI01SC RB 1 ;SECTOR COUNT WI01HT RB 1 ;HIGH BYTE OF DATA TMA ADDRESS WI01MT RB 1 ;MIDDLE BYTE OF DATA TMA ADDRESS WI01LT RB 1 ;LOW BYTE OF DATA TMA ADDRESS WI01HN RB 1 ;HIGH BYTE OF NEXT COMMAND ADDRESS WI01MN RB 1 ;MIDDLE BYTE OF NEXT COMMAND ADDRESS WI01LN RB 1 ;LOW BYTE OF NEXT COMMAND ADDRESS WI01FLG RB 1 ;FLAGS WI01EEC RB 1 ;ERROR CODE WI01EDH RB 1 ;BIT 7-5 -- DRIVE SELECT 1; 4-0 -- HIGHT BYTE OF LOG SECTOR # WI01ED EQU 1110.B ; ERROR DRIVE SELECT MASK WI01EHS EQU 0001B ; ERROR HIGH BYTE OF LOG SECTOR # MASK WI01EMS RB 1 ;ERROR MIDDLE BYTE OF LOGICAL SECTOR # WI01ELS RB 1 ;ERROR LOW BYTE OF LOGICAL SECTOR # IF ASM86 WI01BKL EQU OFFSET $ - OFFSET WI01BLK ENDIF IF NOT ASM86 WI01BKL EQU $-WI01BLK ENDIF IF WI01BKL NE 16 %: TYPE 0 & 1 COMMAND BLOCK IS WRONG LENGTH ENDIF ; TYPE 2 ORG 0 WI2BLK RB 0 WI2OP RB 1 ;COMMAND OP CODE WI2DH RB 1 ;BIT 7-5 -- DRIVE SELECT &; 2-0 -- (MAX) HEAD # WI2D EQU 1110"B ; DRIVE SELECT MASK WI2H EQU 0111B ; HEAD # MASK WI2HMC RB 1 ;HIGH BYTE OF MAX CYLINDER # WI2LMC RB 1 ;LOW BYTE OF MAX CYLINDER # WI2HRWC RB 1 ;HIGH BYTE OF RWC CYLINDER # WI2LRWC RB 1 ;LOW BYTE OF RWC CYLINDER # WI2HPC RB 1 ;HIGH BYTE OF PRE-COMP CYLINDER # WI2LPC RB 1 ;LOW BYTE OF PRE-COMP CYLINDER # WI2SR RB 1 ;STEP RATE (LSB = 20uS) WI2ECC RB 1 ;ECC SPAN WI2CSIF RB 1 ;BIT 6 -- CELL SIZE +; 4-0 -- INTERLEAVE FACTOR WI2CS EQU 010!B ; CELL SIZE MASK WI2CS5 EQU 09B ; CELL SIZE = 512 BYTES/LOG SECTOR WI2CS1K EQU 0108B ; CELL SIZE = 1024 BYTES/LOG SECTOR WI2IF EQU 0001B ; INTERLEAVE FACTOR MASK WI2FC RB 1 ;FILL CHARACTER WI2EEC RB 1 ;ERROR CODE WI2EHS RB 1 ;BIT 7-5 -- ERROR HEAD # ); 4-0 -- ERROR SECTOR # WI2EH EQU 1110&B ; ERROR HEAD # MASK WI2ES EQU 0001B ; ERROR SECTOR # MASK WI2EHC RB 1 ;ERROR HIGH BYTE OF CYLINDER # WI2ELC RB 1 ;ERROR LOW BYTE OF CYLINDER # IF ASM86 WI2BLKL EQU OFFSET $ - OFFSET WI2BLK ENDIF IF NOT ASM86 WI2BLKL EQU $-WI2BLK ENDIF IF WI2BLKL NE 16 %: TYPE 2 COMMAND BLOCK IS WRONG LENGTH ENDIF ; TYPE 3 ORG 0 WI3BLK RB 0 WI3OP RB 1 ;COMMAND OP CODE WI3DH RB 1 ;BIT 7-5 -- DRIVE SELECT ; 2-0 -- HEAD # WI3D EQU 1110"B ; DRIVE SELECT MASK WI3H EQU 0111B ; HEAD # MASK WI3HC RB 1 ;HIGH BYTE OF CYLINDER # WI3LC RB 1 ;LOW BYTE OF CYLINDER # WI3S RB 1 ;SECTOR # WI3HT RB 1 ;HIGH BYTE OF DATA TMA ADDRESS WI3MT RB 1 ;MIDDLE BYTE OF DATA TMA ADDRESS WI3LT RB 1 ;LOW BYTE OF DATA TMA ADDRESS WI3HN RB 1 ;HIGH BYTE OF NEXT COMMAND ADDRESS WI3MN RB 1 ;MIDDLE BYTE OF NEXT COMMAND ADDRESS WI3LN RB 1 ;LOW BYTE OF NEXT COMMAND ADDRESS WI3FLG RB 1 ;FLAGS WI3EEC RB 1 ;ERROR CODE WI3EHS RB 1 ;BIT 7-5 -- ERROR HEAD # ); 4-0 -- ERROR SECTOR # WI3EH EQU 1110&B ; ERROR HEAD # MASK WI3ES EQU 0001MB ; ERROR SECTOR # MASK WI3EHC RB 1 ;ERROR HIGH BYTE OF CYLINDER # WI3ELC RB 1 ;ERROR LOW BYTE OF CYLINDER # IF ASM86 WI3BLKL EQU OFFSET $ - OFFSET WI3BLK ENDIF IF NOT ASM86 WI3BLKL EQU $-WI3BLK ENDIF IF WI3BLKL NE 16 %: TYPE 3 COMMAND BLOCK IS WRONG LENGTH ENDIF ; COMMAND BLOCK FLAG BYTE WIFINTE EQU 10$B ;INTERRUPTS ENABLED WIFBM EQU 010'B ;USE BURST MODE TMA WIFIPCC EQU 00103B ;IGNORE PAUSE AND CONTINUE COMMANDS WIFIDR EQU 0$100B ;DISABLE RETRIES WIFDECC EQU 010B ;DISABLE ECC WIFCHN EQU 01B ;CHAIN NEXT COMMAND IMMEDIATELY ;* FORMAT OF STATUS RETURNED BY 01 COMMAND ORG 0 WISBLK RB 0 WISFLG RB 1 ;FLAG BYTE WISDR EQU 0*100B ; BIT 2 -- DRIVE READY WISACC EQU 010B ; 1 -- ACCESSED WISSC EQU 01B ; $0 -- SEEK COMPLETE WISHMC RB 1 ;HIGH BYTE OF MAX CYLINDER # WISLMC RB 1 ;LOW BYTE OF MAX CYLINDER # WISHRWC RB 1 ;HIGH BYTE OF RWC CYLINDER # WISLRWC RB 1 ;LOW BYTE OF RWC CYLINDER # WISHPC RB 1 ;HIGH BYTE OF PRE-COMP CYLINDER # WISLPC RB 1 ;LOW BYTE OF PRE-COMP CYLINDER # WISHCC RB 1 ;HIGH BYTE OF CURRENT CYLINDER # WISLCC RB 1 ;LOW BYTE OF CURRENT CYLINDER # WISSR RB 1 ;STEP RATE (LSB = 20uS) RB 1 ;RESERVED WISIF RB 1 ;INTERLEAVE FACTOR WISCS RB 1 ;CELL SIZE WISCS5 EQU 1 ; = 512 BYTES/LOG SECTOR WISCS1K EQU 2 ; = 1024 BYTES/LOG SECTOR WISMH RB 1 ;MAX HEAD # WISFC RB 1 ;FILL CHARACTER RB 1 ;RESERVED IF ASM86 WISBLKL EQU OFFSET $ - OFFSET WISBLK ENDIF IF NOT ASM86 WISBLKL EQU $-WISBLK ENDIF IF WISBLKL NE 16 %: STATUS BLOCK IS WRONG LENGTH ENDIF ;* ERROR CODES WIENE EQU 00H ;NO ERROR WIEDNR EQU 01H ;DRIVE NOT READY WIENSC EQU 02H ;NO SEEK COMPLETE WIENT0 EQU 03H ;NO TRACK 0 WIENI EQU 04H ;NO INDEX WIENDS EQU 05H ;NO DRIVE SELECT WIEHNF EQU 10H ;HEADER ADDRESS MARK NOT FOUND WIESEK EQU 11H ;SEEK ERROR (BAD CYLINDER # IN HEADER) WIESNF EQU 12H ;SECTOR NOT FOUND WIEECCH EQU 13H ;ECC ERROR IN HEADER WIEDNF EQU 14H ;DATA ADDRESS MARK NOT FOUND WIENECC EQU 15H ;NONCORRECTABLE ECC ERROR IN DATA FIELD WIEECC EQU 16H ;CORRECTABLE ECC ERROR IN DATA FIELD WIEWF EQU 17H ;WRITE FAULT WIEIOP EQU 20H ;ILLEGAL OP CODE WIEIDA EQU 21H ;ILLEGAL DISK ADDRESS WIEFMTP EQU 22H ;FORMAT PROTECTED WIEWRP EQU 23H ;WRITE PROTECTED WIEMISC EQU 30H ;MISCELLANEOUS ERROR WIEDIAG EQU 40H ;ERROR DURING DIAGNOSTIC WIEPNA EQU 80H ;PARTION NOT ASSIGNED WIESNWP EQU 81H ;SECTOR NOT WITHIN PARTITION ;* CP/M RELATED VALUES WIRPS EQU WICSZ/128 ;CP/M RECORDS PER SECTOR WIRPT EQU WIRPS*WINSPT ;CP/M RECORDS PER TRACK WINST EQU 1 ;# OF SYSTEM TRACKS WINSYS EQU WINST*WINSPT ;# SECTORS IN SYSTEM TRACK(S) WIMIN EQU 1024/WICSZ*64+WINSYS ;MINIMUM # USEABLE SECTORS WIMAX EQU 1024/WICSZ*8*1024+WINSYS ;MAX # USEABLE SECTORS ;** DISK PARAMETER TABLE EQUATES ; ; DISK PARAMETER ENTRY DESCRIPTION ORG 0 DPEXLT RW 1 ;SECTOR TRANSLATE TABLE ADDRESS RW 3 DPEDIRB RW 1 ;DIRECTORY BUFFER ADDRESS DPEDPB RW 1 ;DISK PARAMETER BLOCK ADDRESS DPECSV RW 1 ;CHECKSUM VECTOR ADDRESS DPEALV RW 1 ;ALLOCATION VECTOR ADDRESS DPEHTH RB 8 ;HEATH EXTENSIONS DPEL EQU 24 ;LENGTH OF DISK PARAMETER ENTRY ; HEATH EXTENSIONS DPEFLAG EQU DPEHTH+0 ;FLAGS DPETYPE EQU 1110$B ;BIT 7-5 = DEVICE TYPE DPENE EQU 0!B ; NON-EXISTENT DPEZ207 EQU 0010B ; Z207 DPEZ217 EQU 010B ; Z217 DPE48RO EQU 00010000B ;BIT 4 -- FOR Z207 ; 48 TPI MEDIA IN 96 TPI DRIVE (R/O) DPE96T EQU 00001000B ;BIT 3 -- 0=48 TPI DRIVE 1=96 TPI DRIVE DPEASGN EQU 00001000B ;BIT 3 -- FOR Z217 WINCHESTER DISK ; 0=UNASSIGNED A PARTITION ; $1=ASSIGNED A PARTITION DPET0SD EQU 06100B ;BIT 2 -- 1=TRACK 0 IS SINGLE DENSITY DPEDD EQU 0610B ;BIT 1 -- 0=SINGLE DENSITY 1=DOUBLE DPELSIO EQU 0110B ;BIT 1 -- Z217 LOGICAL SECTOR I/O DPE2S EQU 031B ;BIT 0 -- 0=SINGLE SIDED 1=DOUBLE DPEPRIM EQU 01B ;BIT 0 -- Z217 PRIMARY DPE FOR UNIT DPEUNIT EQU DPEHTH+1 ;UNIT SELECT VALUE DPERPS EQU DPEHTH+2 ;CP/M RECORDS PER PHYSICAL SECTOR DPERPAB EQU DPEHTH+3 ;CP/M RECORDS PER ALLOCATION BLOCK DPETRK EQU DPEHTH+4 ;TRACK COUNTER DPEUNK EQU 10B ; TRACK POSITION UNKNOWN DPELPB EQU DPEHTH+4 ;Z217 LOWER PARTITION BOUNDARY (LOG SECTOR #) DPESEK EQU DPEHTH+5 ;MOTOR SPEED AND SEEK SPEED ;BIT 3-0 = SEEK SPEED VALUE DPEFS EQU 010*B ;BIT 6 = FAST STEP FOR Z207 DPEMO EQU 10B ;BIT 7 = MOTOR UP TO SPEED FLAG ; 0=1 SEC 1=250 MSEC DPEUPB EQU DPEHTH+6 ;Z217 UPPER PARTITION BOUNDARY + 1 DPEFLG2 EQU DPEHTH+6 ;2ND FLAG BYTE DPEHLS EQU 06100B ;BIT 2 DRIVE HAS HEAD LOAD SELONOID DPEIMG EQU 0)10B ;BIT 1 IMAGINARY DRIVE DPE96TM EQU 01B ;BIT 0 0=48 TPI MEDIA 1=96 TPI MEDIA DPELUN EQU DPEHTH+7 ;LAST LOGICAL UNIT MOUNTED DPELOG EQU 11110000B ; CP/M LOGICAL DRIVE NAME FOR THIS ENTRY DPEREAL EQU 00001111B ; FOR IMAGINARY DRIVE, LOGICAL DRIVE NAME ; FOR CORRESPONDING REAL DRIVE DPEMNT EQU 00001111B ; FOR REAL DRIVE, LOGICAL DRIVE NAME FOR ; CURRENLY MOUNTED DISK DPEHL EQU 8 ;LENGTH OF HEATH EXTENSION ; DISK PARAMETER BLOCK ORG 0 DPBSPT RW 1 ;SECTORS PER TRACK DPBBSH RB 1 ;BLOCK SHIFT FACTOR DPBBLM RB 1 ;BLOCK MASK DPBEXM RB 1 ;EXTENT MASK DPBDSM RW 1 ;TOTAL # OF BLOCKS - 1 DPBDRM RW 1 ;# OF DIRECTORY ENTRIES - 1 DPBAL0 RB 1 ;INITIAL AL0 VALUE DPBAL1 RB 1 ;INITIAL AL1 VALUE DPBCKS RW 1 ;SIZE OF DIRECTORY CHECK VECTOR DPBOFF RW 1 ;NUMBER OF SYSTEM TRACKS DPBL EQU 15 ;LENGTH OF DISK PARAMETER BLOCK ;** HEATH CP/M DISK LABEL DEFINITIONS ; ; DISK LABELS ARE USED ON MOST DATA DISKS AND ; ON ALL SYSGEN'ED (BOSOTABLE) DISKS. ; TO MAINTAIN COMPATIBILITY WITH OLDER RELEASES OF CP/M, ; THE 5 1/4" HARD SECTOR AND 8" SOFT SECTOR FLOPPY DATA DISKS ; DO NOT USE LABELS. ; ; THE LABEL RESIDES ON THE 1ST SECTOR OF TRACK 0, SIDE 0. ; ; AT THE END OF THE LABEL IS A CHECKSUM. ; FOR VERSION # 0 OF THE LABEL, THE CHECKSUM IS CALCULATED ; BBY ADDING UP THE VALUES IN THE LABEL PRIOR TO THE CHECKSUM SLOT ; _A BYTE AT A TIME, THEN TAKING THE ONE'S COMPLEMENT OF THE SUM. ; LABVER EQU 0 ;CURRENT FORM # FOR LABEL LABBUF EQU 0 ;SLOT FOR JUMP INSTRUCTION AROUND LABEL BDTYPE EQU LABBUF+3 ;SLOT FOR DRIVE TYPE LABEL EQU LABBUF+4 LABTYP EQU LABEL+0 ;SLOT FOR LABEL TYPE LABHTH EQU LABTYP+1 ;SLOT FOR HEATH EXTENSIONS TO DPE LABDPB EQU LABHTH+DPEHL ;SLOT FOR DISK PARAMETER BLOCK LABCS EQU LABDPB+DPBL ;CHECKSUM LABLEN EQU LABCS-LABEL+1 ;LABEL LENGTH ;** ASCII CONTROL CHARACTER EQUATES ; CTLC EQU 003H ;CONTROL-C CTLQ EQU 011H ;CONTROL-Q CTLS EQU 013H ;CONTROL-S CTLZ EQU 01AH ;CONTROL-Z ACK EQU 006H ; BELL EQU 007H ;BELL CPMEOF EQU CTLZ ;ASCII FILE EOF MARK CPMEOM EQU '$' ;CP/M END-OF-MESSAGE SYMBOL CR EQU 00DH ;CARRIAGE RETURN ESC EQU 01BH ;ESCAPE ETX EQU CTLC ; DC1 EQU CTLQ ; DC3 EQU CTLS ; LF EQU 00AH ;LINE FEED NULL EQU 000H ;NULL PAGE ORG TPA START JMP FORMAT DB 'Copyright 1982 @Heath/Zenith' SIGNON DB CR,LF,'CP/M-85 Format Version 2.2.' DB BVERSN/100+'0',(BVERSN/10 MOD 10)+'0',(BVERSN MOD 10)+'0' DB CR,LF,'$' SIGNON1 DB CR,LF,'This program is used to initialize a disk.' DB CR,LF DB 'All information currently on the disk will be destroyed.' DB CR,LF DB 'Is that what you want? (y/n): $' DS 40 STACK EQU $ FORMAT: LXI SP,STACK MVI C,PRCONB ;PRINT ISSUE MESSAGE LXI D,SIGNON CALL BDOS LHLD BBIOS ;Q. CORRECT VERSION OF BIOS LXI D,BIOSVER DAD D MOV A,M CPI BVERSN JZ FMT00 ; BR IF YES MVI C,PRCONB LXI D,BADBIOS CALL BDOS JMP BOOT FMT00: LDA TBUFF CPI 0 JZ FMT0 ; NO COMMAND LINE MVI A,TRUE STA COMLIN ;YES THERE IS A COMMAND LINE CALL CLINT ;CALL COMMAND LINE INTERPRETER/WME FMT0: QUERY FMT2 MVI C,PRCONB ;print sign on message. Continue? LXI D,SIGNON1 CALL BDOS FMT1: MVI C,RDCON ;Read reply CALL BDOS CALL TOUPPER ;convert character to upper case CPI 'Y' JZ FMT2 ;Yes continue. JMP FMT5 FMT2: COMINP DRIVID,FMT2A0,FMT20A FMT20A: MVI C,PRCONB ;which drive are we using LXI D,WHICH CALL BDOS MVI C,RDCON ;Read Drive ID CALL BDOS FMT2A0: CALL TOUPPER STA DRIVID ;SAVE UPPERCASE TRANSLATED VALUE STA DRMSGA STA FPARTD CPI 'A' ;Range Check JC FMT2AA CPI 'Z'+1 JC FMT2A FMT2AA: CPI CTLC JZ FMT5 MVI C,PRCONB ;Error- out of range (A..Z) LXI D,ERRMSG CALL BDOS JMP FMT3B FMT2A: STA PROMPTA ;save drive letter in message CALL WKIND ;go determine drive type JNC FMT2AB ;BR IF VALID DRIVE TYPE MVI C,PRCONB LXI D,DRMSG CALL BDOS JMP FMT3B FMT2AB: LDA DRIVID ;KEEP TRACK IF SYSTEM DISK REMOVED CPI 'A' JNZ FMT3 MVI A,1 STA SYSDSK FMT3: CALL DISPATCH ;FORMAT DISK JC FMT9 FMT3B COMINP DRIVID,FMT5,FMT3BA ;EXIT IF SUBMIT JOB FMT3BA: MVI C,PRCONB LXI D,AMWMSG ;any more work CALL BDOS FMT4A MVI C,RDCON CALL BDOS CALL TOUPPER CPI 'Y' JZ FMT2 FMT5: LDA SYSDSK ;Q. WAS SYSTEM DISK INVOLVED ORA A JZ BOOT MVI C,PRCONB LXI D,LVEMSG CALL BDOS MVI C,RDCON CALL BDOS JMP BOOT FMT9: CALL FWPC ;Q. DISK WRITE PROTECTED LXI D,WPEMSG ORA A JNZ FMT9A ; BR IF YES LXI D,BMSG FMT9A: MVI C,PRCONB CALL BDOS JMP FMT3B TOUPPER CPI 061H ;is not lower case RC CPI '{' RNC SUI 020H RET ERRMSG: DB CR,LF,'OPTION NOT AVAILABLE',CR,LF,BELL,'$' PAGE ;** WKIND - DETERMINES DRIVE TYPE AND SELECTS UNIT ; WKIND: SUI 'A' ;GET CP/M DRIVE # MOV C,A CALL FSETDSK ;SELECT DRIVE MOV A,H ;Q. SELECT ERROR ORA L JZ WKERR ; BR IF NO DRIVE SHLD DPEPTR ;SAVE POINTER TO DPE XCHG LXI H ,DPEFLG2 ;IMAGINARY FLAG DAD D MOV A,M STA FLAG2 LXI H,DPEDPB ;GET DPB POINTER DAD D CALL HLIHL SHLD DPBPTR LXI H,DPEHTH ;GET HEATH FLAGS DAD D MOV A,M STA DRTYPE INX H ;GET UNIT SELECT MOV A,M STA AIOUNI ORA A ;CLEAR CARRY TO INDICATE NO ERROR RET WKERR: STC ;INDICATE ERROR RET ;** FSETDSK - GETS DISK TABLE POINTER IN (HL) ; ; ENTRY: (C)=CP/M DRIVE # ; EXIT: (HL)=POINTER (IF 0 THEN ERROR) ; USES: ALL ; FSETDSK: LHLD BBIOS LXI D,SETDSK-CBOOT DAD D MVI E,1 PCHL ;** FSETTRK - SET CP/M TRACK # ; ; ENTRY: (BC)=DESIRED CP/M TRACK # ; EXIT: NONE ; USES: ALL ; FSETTRK: LHLD BBIOS LXI D,SETTRK-CBOOT DAD D PCHL ;** FSETSEC - SET CP/M SECTOR # ; ; ENTRY: (BC)=DESIRED CP/M SECTOR # ; EXIT: NONE ; USES: ALL ; FSETSEC: LHLD BBIOS LXI D,SETSEC-CBOOT DAD D PCHL ;** FSETDMA - SET DMA ; ; ENTRY: (BC)=DMA ; EXIT: NONE ; USES: ALL ; FSETDMA: LHLD BBIOS LXI D,SDMA-CBOOT DAD D PCHL ;** FREAD - READ CP/M SECTOR ; ; ENTRY: NONE ; EXIT: (A)=ERROR STATUS ; USES: ALL ; FREAD: LHLD BBIOS LXI D,BREAD-CBOOT DAD D PCHL ;** FWRITE - WRITE CP/M SECTOR ; ; ENTRY: (C)=WRITE MODE ; EXIT: (A)=ERROR STATUS ; USES: ALL ; FWRITE: LHLD BBIOS LXI D,BWRITE-CBOOT DAD D PCHL ;** FFORMAT - FORMAT DISK ; ; ENTRY: (C)=VERIFY FLAG (0=NO , 1=YES) ; EXIT: (A)=STATUS BYTE ; USES: ALL ; FFORMAT: LHLD BBIOS LXI D,BFMT-CBOOT DAD D PCHL ;** FWRTRK - WRITE TRACK ; ; ENTRY: NONE ; EXIT: (A)=ERROR STATUS ; USES: ALL ; FWRTRK: LHLD BBIOS LXI D,BWRTRK-CBOOT DAD D PCHL ;** FWPC - WRITE PROTECT CHECK ; ; ENTRY: NONE ; EXIT: (A)=WRITE PROTECT STATUS (0=NO , 1=YES) ; USES: ALL ; FWPC: LHLD BBIOS LXI D,BWPC-CBOOT DAD D PCHL ;** FCBD - CLEAR BUFFER FOR DRIVE ; ; ENTRY: NONE ; EXIT: NONE ; USES: ALL ; FCBD: LHLD BBIOS LXI D,BCBD-CBOOT DAD D PCHL PAGE ; ; FORMAT H37. ; F37: LDA AIOUNI ;Q. 5 1/4" DRIVE ANI CONDS8 JNZ F370 ; BR IF NO MVI A,'D' ; YES - DENSITY IS DOUBLE JMP F3700A F370: COMINP CLIDENS,F3700A,F3700 F3700: MVI C,PRCONB LXI D,WDSDMSG CALL BDOS MVI C,RDCON CALL BDOS F3700A: CALL TOUPPER MVI B,0 CPI 'S' JZ F371 MVI B,DPEDD CPI 'D' JZ F371 MVI C,PRCONB LXI D,ERRMSG CALL BDOS JMP F370 F371: MOV A,B STA DENSITY LDA AIOUNI ;Q. 8" DRIVE ANI CONDS8 JZ F371A ; BR IF NOT MVI A,'2' ; YES - SAY DOUBLE SIDED (ACTUAL FORMAT WILL JMP F371A2 ; WORK OFF OF INDEX HOLE PLACEMENT) F371A: COMINP CLISIDS,F371AB,F371AA F371AA MVI C,PRCONB LXI D,WSMSG CALL BDOS MVI C,RDCON CALL BDOS F371AB CALL TOUPPER F371A2: MVI B,0 CPI '1' JZ F371B MVI B,DPE2S CPI '2' JZ F371B MVI C,PRCONB LXI D,ERRMSG CALL BDOS JMP F371A F371B: MOV A,B STA SIDES QUERY F372 MVI C,PRCONB ;ASK TO INSERT DISK LXI D,PROMPT CALL BDOS MVI C,PRCONB ;ASK IF READY LXI D,PROMPT1 CALL BDOS MVI C,RDCON CALL BDOS CPI CR JNZ F3748 ; BR IF NOT READY F372: CALL F377 ;FILL IN DPE & DPB XRA A ;CLEAR WORK VALUES STA TRACK MVI B,NTRK837 ;DETERMINE # CP/M TRACKS LDA AIOUNI ANI CONDS8 JNZ F3721 MVI B,NTRKS37 LDA DRTYPE ANI DPE96T JZ F3721 MVI B,NTRKD37 F3721: LDA SIDES CPI DPE2S MVI A,0 JNZ F3722 MOV A,B F3722: ADD B STA DSKTKS LHLD DPEPTR ;FORCE RESTORE BY SETTING TRACK POINTER LXI B,DPETRK ; TO UNKNOWN DAD B MVI M,DPEUNK ; IF 8" DRIVE AND TRACK 0 / SIDE 0 IS SINGLE DENSITY ; THEN FORMAT TRACK 0 / SIDE 0 LDA AIOUNI ;Q. 8" DRIVE ANI CONDS8 JZ F374 ; BR IF NOT LDA DRTYPE ;Q. CP/M TRACK 0 SINGLE DENSITY ANI DPET0SD JZ F374 ; BR IF NOT LXI H,F37STBL ;BUILD TRACK IMAGE CALL F378 CALL F375 ;FORMAT TRACK ORA A ;Q. ERROR JNZ F3749 ; BR IF ERROR ; FORMAT SURFACE(S). F374: LXI H,F37D2TB ;DETERMINE WHICH TABLE TO USE LDA AIOUNI ; TO BUILD TRACK IMAGE ANI CONDS8 JZ F3741 LXI H,F37STBL LDA DENSITY CPI DPEDD JNZ F3741 LXI H,F37DTBL F3741: CALL F378 ;BUILD TRACK IMAGE F3742: CALL F375 ;FORMAT TRACK ORA A ;Q. ERROR JZ F3743 ; BR IF NOT CPI FDSNRD ;IF NOT READY ERROR ON 8" DRIVE AND TRYING JNZ F3749 ; TO FORMAT DOUBLE SIDED, THEN SWITCH LDA AIOUNI ; TO SINGLE SIDED AND TRY AGAIN ANI CONDS8 JZ F3749 LDA TRACK CPI 1 JNZ F3749 LDA SIDES CPI DPE2S JNZ F3749 XRA A STA SIDES JMP F372 ; F3743: LDA TRACK ;Q. ALL TRACKS DONE LXI H,DSKTKS CMP M JNZ F3742 ; BR IF NOT ;* FORM LABEL AND WRITE IT TO TRACK 0 / SECTOR 1 / SIDE 0 CALL WRLAB JC F3749 ;BR IF ERROR ; ALL DONE. F3748: XRA A RET ;RETURN INDICATING NO ERRORS ; ERROR F3749: STC ;INDICATE ERROR RET ;** FORMAT TRACK ; F375: CALL F378Y ;SET TRACK/SIDE/SECTOR VALUES IN TRACK IMAGE LDA TRACK ;SET DESIRED CP/M TRACK # MOV C,A MVI B,0 CALL FSETTRK LXI B,BUFFER ;SET DMA CALL FSETDMA MVI C,1 ;FORMAT TRACK LDA FAST ORA A JZ F3751 MVI C,0 F3751: CALL FFORMAT ;FORMAT TRACK ORA A ;Q. ERROR RNZ ; RET IF ERROR LXI H,TRACK ;BUMP TRACK COUNTER INR M RET ;* FILL DPE & DPB F377: MVI B,0 ;DETERMINE WHICH TABLE TO USE LDA AIOUNI ANI CONDS8 JNZ F3771 LDA DRTYPE ANI DPE96T JZ F3772 MVI B,2 JMP F3772 F3771: MVI B,4 LDA DENSITY CPI DPEDD JNZ F3772 MVI B,6 F3772: LDA SIDES CPI DPE2S JNZ F3773 INR B F3773: MOV A,B MVI E,F37TBLL CALL MUL88 LXI D,F37TBL DAD D XCHG ;(DE)=TABLE ADDRESS LHLD DPEPTR LXI B,DPEHTH DAD B XCHG ;(DE)=DPE POINTER , (HL)=TABLE POINTER LDAX D ;DPE FLAG BYTE 1 ANI 0FFH-(DPE48RO+DPEDD+DPE2S) ORA M MOV B,A LDA DRTYPE MOV C,A LDA AIOUNI ; Q. 8" DRIVE ANI CONDS8 JZ F3773A ; BR IF NOT MOV A,B ANI NOT DPET0SD MOV B,A MOV A,C ANI NOT DPET0SD MOV C,A LDA DENSITY ; Q. DOUBLE DENSITY REQUESTED CPI DPEDD JNZ F3773A ; BR IF NOT LDA CLID0 ; Q. FORMAT TRACK 0 DOUBLE DENSITY CPI 0 JNZ F3773A ; BR IF YES MOV A,B ; SET FLAG FOR TRACK 0 SINGLE DENSITY ORI DPET0SD MOV B,A MOV A,C ORI DPET0SD MOV C,A F3773A: MOV A,B STAX D MOV A,C STA DRTYPE INX D ;CP/M RECORDS PER SECTOR INX D INX H MOV A,M STAX D INX D ;CP/M RECORDS PER ALLOCATION BLOCK INX H MOV A,M STAX D INX D ;MEDIA TPI INX D INX D INX H LDAX D ANI 0FFH-DPE96TM ORA M STAX D INX H ;FILL IN DPB XCHG LHLD DPBPTR XCHG MVI B,DPBL CALL MOVEIT RET ;* BUILD TRACK IMAGE F378: MOV E,M ;GET TRACK OFFSET INX H MOV D,M XCHG SHLD F37C XCHG INX H ;GET LENGTH OF SECTOR AMOUNT-2 MOV E,M INX H MOV D,M XCHG SHLD F37D XCHG INX H ;BUILD SKEW TABLE MOV B,M ; SKEW FACTOR INX H MOV A,M ; SPT STA DSKSPT MOV C,A PUSH H LXI H,F37SKEW CALL INTRLV POP D LXI H,BUFFER ;START OF TRACK IMAGE F378A2: INX D ;FILL IN FRONT END GAP LDAX D ;GET AMOUNT ORA A ;CHECK IF END OF FRONT END GAP INFO JZ F378A3 ; BR IF IT IS MOV B,A INX D LDAX D ;GET VALUE CALL F378X ;FILL JMP F378A2 F378A3: SHLD F37B ;SAVE START OF SECTORS PUSH D ;SAVE START OF SECTOR DESCRIPTORS LDA DSKSPT ;GET SECTORS PER TRACK MOV C,A F378B: POP D ;FILL IN FOR A SECTOR PUSH D F378C: INX D LDAX D ANA A JZ F378D ;BR IF END OF SECTOR DESCRIPTORS MOV B,A INX D LDAX D CALL F378X JMP F378C F378D: DCR C JNZ F378B POP B ;DISCARD ADDR OF SECTOR DESCRIPTORS F378E: INX D ;FILL REQUIRED GAP IV AMOUNT LDAX D MOV B,A INX D LDAX D CALL F378X F378F: INX D ;FILL OPTIONAL GAP IV AMOUNT LDAX D ANA A JZ F378G MOV B,A INX D LDAX D CALL F378X JMP F378F F378G: RET ; FILL AREA OF LENGTH (B) WITH VALUE (A) STARTING AT ADDRESS (HL) F378X: MOV M,A INX H DCR B JNZ F378X RET ; FILL IN TRACK/SIDE/SECTOR VALUES FOR THIS ITERATION IN TRACK IMAGE. F378Y: LDA TRACK ;CALCULATE PHYSICAL TRACK / SIDE VALUES MOV B,A MVI C,0 LDA SIDES CPI DPE2S JNZ F378Y1 MOV A,B ANA A RAR MOV B,A JNC F378Y1 MVI C,1 F378Y1: MOV A,B STA F37E MOV A,C STA F37F LHLD F37C XCHG LHLD F37B DAD D LXI B,F37SKEW ;(BC) = ADDR OF SKEW TABLE F378Y3: LDAX B ANA A RZ ;RET IF END OF SECTORS LDA F37E ;GET TRACK MOV M,A INX H LDA F37F ;GET SIDE MOV M,A INX H LDAX B ;GET SECTOR MOV M,A INX B XCHG LHLD F37D DAD D JMP F378Y3 F37B DS 2 ;ADDR OF 1ST SECTOR IN BUFFER F37C DS 2 ;OFFSET INTO 1ST SECTOR F37D DS 2 ;SIZE OF SECTOR - 2 F37E DS 1 ;PHYSICAL TRACK # F37F DS 1 ;PHYSICAL SIDE VALUECONTROL REG IMAGE F37SKEW DS 27 ;SKEW TABLE SPACE F37STBL DS 0 ;8" SINGLE DENSITY TRACK FORMAT TABLE DW 7 ;OFFSET INTO SECTOR AREA OF TRACK # DW 184 ;LENGTH OF SECTOR AREA MINUS 2 DB 1 ;INTERLEAVE FACTOR DB 26 ;SECTORS PER TRACK DB 40,0FFH ;TRACK HEADER GAP DB 6,0 DB 1,0FCH DB 26,0FFH DB 0 DB 6,0 ;SECTOR AREA (REPEAT FOR SPT) DB 1,0FEH DB 4,0 DB 1,0F7H DB 11,0FFH DB 6,0 DB 1,0FBH DB 128,0E5H DB 1,0F7H DB 27,0FFH DB 0 DB 24,0FFH ;REQUIRED GAP IV AMOUNT DB 255,0FFH ;OPTIONAL GAP IV AMOUNT DB 124,0FFH DB 0 F37DTBL DS 0 ;8" DOUBLE DENSITY 26x256 TRACK FORMAT TABLE DW 16 DW 368 DB 1,26 DB 80,04EH DB 12,0 DB 3,0F6H DB 1,0FCH DB 50,04EH DB 0 DB 12,0 DB 3,0F5H DB 1,0FEH DB 3,0 DB 1,1 DB 1,0F7H DB 22,04EH DB 12,0 DB 3,0F5H DB 1,0FBH DB 128,0E5H DB 128,0E5H DB 1,0F7H DB 54,04EH DB 0 DB 24,04EH DB 255,04EH DB 255,04EH DB 255,04EH DB 121,04EH DB 0 F37D2TB DS 0 ;5 1/4" DOUBLE DENSITY 8x512 TRACK FORMAT TABLE DW 16 DW 650 DB 1,8 DB 80,04EH DB 12,0 DB 3,0F6H DB 1,0FCH DB 50,04EH DB 0 DB 12,0 DB 3,0F5H DB 1,0FEH DB 3,0 DB 1,2 DB 1,0F7H DB 22,04EH DB 12,0 DB 3,0F5H DB 1,0FBH DB 128,0E5H DB 128,0E5H DB 128,0E5H DB 128,0E5H DB 1,0F7H DB 80,04EH DB 0 DB 24,04EH DB 255,04EH DB 255,04EH DB 255,04EH DB 255,04EH DB 15,04EH DB 0 ; H37 DISK DESCRIPTORS FOR LABEL. ; ; DB DENSITY/SIDES FLAGS ; DB CP/M RECORDS PER SECTOR ; DB CP/M RECORDS PER ALLOCATION BLOCK ; DB MEDIA TPI FLAG ; DW SECTORS PER TRACK ; DB BLOCK SHIFT FACTOR ; DB BLOCK MASK ; DB EXTENT MASK ; DW # OF BLOCKS - 1 ; DW # OF DIRECTORY ENTRIES - 1 ; DW AL1*256+AL0 ; DW LENGTH OF CHECKSUM VECTOR ; DW # OF SYSTEM TRACKS ; F37TBL DS 0 ;5 1/4" DOUBLE DENSITY (8x512)/SINGLE SIDED/48 TPI DB DPEDD,4,8,0 DW 32 DB 3,7,0 DW 151,127,00F0H,32,2 F37TBLL EQU $-F37TBL ;5 1/4" DOUBLE DENSITY (8x512)/DOUBLE SIDED/48 TPI DB DPEDD+DPE2S,4,16,0 DW 32 DB 4,15,1 DW 155,255,00F0H,64,2 ;5 1/4" DOUBLE DENSITY (8x512)/SINGLE SIDED/96 TPI DB DPEDD,4,16,DPE96TM DW 32 DB 4,15,1 DW 155,127,00C0H,32,2 ;5 1/4" DOUBLE DENSITY (8x512)/DOUBLE SIDED/96 TPI DB DPEDD+DPE2S,4,16,DPE96TM DW 32 DB 4,15,0 DW 315,255,00F0H,64,2 ;8" SINGLE DENSITY / SINGLE SIDED DB 0,1,8,0 DW 26 DB 3,7,0 DW 242,63 DB 0C0H,0 DW 16,2 ;8" SINGLE DENSITY / DOUBLE SIDED DB DPE2S,1,16,0 DW 26 DB 4,15,1 DW 246,127 DB 0C0H,0 DW 32,2 ;8" DOUBLE DENSITY / SINGLE SIDED DB DPEDD,2,16,0 DW 52 DB 4,15,1 DW 242,127 DB 0C0H,0 DW 32,2 ;8" DOUBLE DENSITY / DOUBLE SIDED DB DPEDD+DPE2S,2,16,0 DW 52 DB 4,15,0 DW 493,255 DB 0F0H,0 DW 64,2 PAGE ;** FORMAT Z217 ; F217: MVI C,SGUSR ;GET CURRENT USER CODE MVI E,0FFH CALL BDOS STA F217UC MVI C,SGUSR ;RESET USER CODE TO 31 MVI E,31 ; TO HIDE FILE CALL BDOS LHLD DPEPTR ;Q. PARTITION ASSIGNED LXI D,DPEFLAG DAD D MOV A,M ANI DPEASGN JZ F21799 ; BR IF NOT MVI C,PRCONB ;INFORM USER LXI D,FMTPART CALL BDOS QUERY F2171 MVI C,PRCONB ;ASK IF READY LXI D,PROMPT1 CALL BDOS MVI C,RDCON CALL BDOS CPI CR JNZ F21798 ; BR IF NOT F2171: CALL FCBD ;CLEAR BIOS BUFFERS FOR DRIVE CALL F21780 ;FILL IN DPB & CALC VALUES JC F21799 ; BR IF ERROR ;* COMPUTE # CP/M RECORDS TO CLEAR. ; (# CP/M RECORDS) = (# DIRECTORY ALLOCATION BLOCKS) SHL (BSH) + ; (# RECORDS FOR SYSTEM TRACK(S)) LHLD DPBPTRH ;GET # ALLOCATION BLOCKS FOR DIRECTORY LXI B,DPBAL0 DAD B CALL HLIHL MVI B,0 F2172: MOV A,H ANA A RAL MOV H,A MOV A,L RAL MOV L,A JNC F2172A INR B JMP F2172 F2172A: LHLD DPBPTR ;GET BLOCK SHIFT FACTOR LXI D,DPBBSH DAD D MOV A,M MVI H,0 ;(HL) = # ALLOCATION BLOCKS MOV L,B ; FOR DIRECTORY SHLD F217DAB ;SAVE FOR LATER F2172B: DAD H DCR A JNZ F2172B ;(HL) = # CP/M RECORDS FOR DIRECTORY LXI D,WINST*WIRPT ;(DE) = # CP/M RECORDS FOR SYSTEM TRK DAD D SHLD F217C1 ;(HL) = # CP/M RECORDS TO CLEAR ;* WRITE 0E5H TO ALL SECTORS TO BE CLEARED MVI A,0E5H ;FILL SECTOR BUFFER WITH 0E5H MVI B,128 LXI H,BUFFER CALL F378X LXI B,BUFFER ;SET DMA CALL FSETDMA LXI H,0 ;INIT TRACK # SHLD F217TRK LXI H,1 ;INIT SECTOR # SHLD F217SEC F21710: LHLD F217TRK ;SET TRACK MOV B,H MOV C,L CALL FSETTRK LHLD F217SEC ;SET SECTOR MOV B,H MOV C,L CALL FSETSEC MVI C,BWRNOR ;WRITE SECTOR CALL FWRITE ORA A ;Q. ERROR JNZ F21799 ; BR IF ERROR LHLD F217SEC ;GET CP/M SECTOR # JUST WRITTEN XCHG ;(DE)=CP/M SECTOR # LXI H,WIRPT CALL CPHLDE ;Q. JUST WROTE LAST SECTOR OF TRACK JNZ F21712 ; BR IF NO LXI D,0 ;RESET SECTOR # LHLD F217TRK ;INCREMENT TRACK # INX H SHLD F217TRK F21712: XCHG ;(HL)=SECTOR # INX H ;BUMP SECTOR # SHLD F217SEC LHLD F217C1 ;LOOP DCX H SHLD F217C1 MOV A,H ORA L JNZ F21710 ;* WRITE LABEL TO 1ST SECTOR OF DISK CALL WRLAB JC F21799 ;BR IF ERROR ;* BUILD A FILE WITH THE BAD SECTORS OF THIS PARTITION ALLOCATED ; TO THIS FILE SO THEY CAN'T BE USED. LDA PROMPTA ;GET DRIVE SUI 'A'-1 ;CONVERT TO 1-N STA F217FCB+FCBDN ;PLACE IN FCB CALL F217RDB ;READ IN BAD SECTOR TABLE JC F21799 ; BR IF ERROR LXI H,0 ;INIT LAST ALLOCATION BLOCK MARKED BAD SHLD F217LAB XRA A ;INIT ALLOCATION BLOCK COUNTER STA F217C2 F2175A: CALL F21750 ;GET NEXT ENTRY IN TABLE JZ F2175C ; BR IF NO MORE ENTRIES XCHG ;(DE)=BAD SECTOR # LHLD F217LB ;CHECK AGAINST SECTOR # FOR CALL SUBHLDE ; START OF PARTITION JC F2175A ; BR IF BAD SECTOR PRIOR TO START XCHG ;(DE)=BAD SECTOR DISPLACEMENT FROM ; {START OF PARTITTION LXI H,WINSYS ;(HL)=# SECTORS FOR SYSTEM TRACKS CALL SUBHLDE ;(HL)=BAD SECTOR DISPLACEMENT FROM ; <SYSTEM TRACKS JC F21799 ;ERROR IF BAD SECTOR IS WITHIN ; SYSTEM TRACKS XCHG ;(DE)=BAD SECTOR DISPLACEMENT LHLD DPBPTR ;CALCULATE ALLOCATION BLOCK # LXI B,DPBBSH ; AB = (DE) SHR (BSH-2) DAD B MOV B,M DCR B DCR B IF WICSZ NE 512 %: SECTOR SIZE NE 512 ENDIF XCHG CALL F21770 ;(HL)=ALLOCATION BLOCK # XCHG ;(DE)=ALLOCATION BLOCK # LHLD F217DAB ;(HL)=# AB'S FOR DIRECTORY XCHG ;(DE)=# AB'S FOR DIRECTORY L;(HL)=AB # OF BAD SECTOR CALL CPHLDE ;Q. BAD SECTOR WITHIN DIRECTORY JC F21799 ; BR IF YES XCHG ;(DE)=AB # OF BAD SECTOR LHLD DPBPTR LXI B,DPBDSM ;CHECK AGAINST MAX BLOCK # DAD B ; FOR THIS PARTITION CALL HLIHL MOV A,H STA F217H ;SAVE HIGH ORDER VALUE OF DSM INX H XCHG ;(DE)=MAX BLOCK # + 1 ;(HL)=BAD BLOCK # CALL CPHLDE JNC F2175A ; BR IF PAST END OF PARTITION XCHG ;(DE)=BAD BLOCK # LHLD F217LAB ;CHECK TO SEE IF SAME AS LAST BAD CALL CPHLDE ; BLOCK # JZ F2175A ; BR IF YES XCHG ;(HL)=BAD BLOCK # SHLD F217LAB ;SAVE AS LAST BAD BLOCK # XCHG ;(DE)=BAD BLOCK # ; ADD BAD BLOCK # TO DISK MAP FOR THE CURRENT DIRECTORY ENTRY. LDA F217C2 ;GET MAP COUNTER CPI 16 ;Q. MAP FULL JNZ F2175B ; BR IF NOT PUSH D ;DIRECTORY ENTRY FULL CALL F21760 ; WRITE IT TO DISK POP D JC F21799 ; BR IF ERROR XRA A ;ZERO MAP COUNTER F2175B: LXI H,F217MAP ;PLACE BAD BLOCK # INTO MAP CALL DADA MOV M,E INX H MOV M,D LXI H,F217C2 ;BUMP MAP COUNTER INR M LDA F217H ;CHECK DSM TO SEE IF SINGLE OR ORA A ; DOUBLE BYTE MAP VALUES JZ F2175A ; BR IF SINGLE (DSM <= 255) INR M JMP F2175A ; DONE BUILDING DIRECTORY ENTRIES BAD SECTORS. F2175C: CALL F21760 ;WRITE DIRECTORY ENTRY JC F21799 ; BR IF ERROR LXI H,F217FCB+FCBRO ;SET ATTRIBUTES TO R/O & SYS MOV A,M ORI FCBROF MOV M,A INX H MOV A,M ORI FCBSYSF MOV M,A MVI C,SFA LXI D,F217FCB CALL BDOS ;* JMP F21798 ;* GET NEXT ENTRY FOR BAD SECTOR TABLE. ; ; ENTRY: 'F217BSE'=TABLE POINTER ; EXIT: PSW/Z 0=ENTRY PRESET , 1=NO MORE ENTRIES ; (HL) = BAD SECTOR # ; USES: ALL ; F21750: LHLD F217BSE ;GET TABLE POINTER TO NEXT ENTRY MOV C,M ;GET LOW ORDER BYTE INX H MOV B,M ;GET MIDDLE ORDER BYTE INX H INX H ;HIGH ORDER BYTE IS NOT USED SHLD F217BSE ;SAVE TABLE POINTER FOR NEXT TIME MOV H,B ;MOVE BAD SECTOR # TO (HL) MOV L,C MOV A,H ;SET PSW/Z FLAG ORA L RET ;* WRITE DIRECTORY ENTRY TO DISK. ; ; ENTRY: 'F217C2'=MAP COUNTER ; 'F217FCB'=DIRECTORY ENTRY ; EXIT: 'F217C2'=MAP COUNTER ZEROED ; 'F217FCB'=DIRECTORY ENTRY UPDATED FOR NEXT EXTENT ; USES: ALL ; F21760: LDA F217C2 ;Q. MAP COUNTER = 0 ORA A RZ ; RET IF YES -- DIR ENTRY IS EMPTY MVI C,RDS ;RESET DISK SYSTEM CALL BDOS MVI C,CREATE ;MAKE FILE FOR THIS ENTRY LXI D,F217FCB CALL BDOS INR A ;CHECK FOR ERROR STC RZ ; RET IF ERROR MVI B,16 ;MOVE MAP TO FCB LXI H,F217MAP LXI D,F217FCB+FCBDM F21761: MOV A,M STAX D MVI M,0 INX H INX D DCR B JNZ F21761 LHLD DPBPTR ;SET EXTENT NUMBER BYTE LXI B,DPBEXM DAD B LDA F217FCB+FCBEX ADD M STA F217FCB+FCBEX CPI 32 ;EXTENT NUMBER > MAX JC F21762 ; BR IF NOT SUI 32 ; MAKE EXTENT # MODULUS 32 STA F217FCB+FCBEX LXI H,F217FCB+FCBRWF ; INC MODULE NUMBER INR M F21762: MVI A,128 ;SET RECORD COUNT TO FULL STA F217FCB+FCBRC LXI H,F217FCB+FCBRWF ;CLEAR 'FILE WRITE FLAG' MOV A,M ANI 0FFH-FCBRWFF MOV M,A MVI C,CLOSE ;CLOSE FILE LXI D,F217FCB CALL BDOS INR A ;CHECK FOR ERROR STC RZ ; RET IF ERROR LXI H,F217FCB+FCBEX ;SET EXTENT NUMBER FOR NEXT TIME INR M XRA A ;CLEAR MAP COUNTER STA F217C2 RET ;* ROUTINE TO DO POWER OF 2 DIVISION BY SHIFTING RIGHT. ; ENTRY: (B) = SHIFT COUNT ; (HL) = VALUE TO BE DIVIDED ; EXIT: (HL) = RESULT ; USES: A,F,B,H,L F21770: MOV A,H ANA A RAR MOV H,A MOV A,L RAR MOV L,A DCR B JNZ F21770 RET ;* CALCULATE DPE HEATH EXTENSIONS AND DISK PARAMETER BLOCK VALUES F21780: ; CALCULATE # SECTORS WITHIN PARTITION. LHLD DPEPTR ;GET LAST SECTOR # + 1 LXI B,DPEUPB DAD B CALL HLIHL INX H XCHG ;(DE) = LAST SECTOR # + 1 LHLD DPEPTR ;GET BEGINNING SECTOR # LXI B,DPETRK DAD B CALL HLIHL SHLD F217LB CALL SUBHLDE ;(HL) = # SECTORS IN PARTITION LXI D,WIMIN ;CHECK AGAINST MINIMUM ALLOWABLE CALL CPHLDE JNC F21781 ; BR IF >= MINIMUM MVI C,PRCONB ;PRINT ERROR MESSAGE IF < MINIMUM LXI D,MINMSG CALL BDOS STC ;INDICATE ERROR RET F21781: LXI D,WIMAX+1 ;CHECK AGAINST MAXIMUM USEABLE CALL CPHLDE JC F21782 ; BR IF <= MAXIMUM MVI C,PRCONB ;ISSUE WARNING MESSAGE LXI D,MAXMSG CALL BDOS LXI H,WIMAX ;ONLY ALLOW MAXIMUM USEABLE F21782: SHLD F217NS ;SAVE # SECTORS WITHIN PARTITION ; SEARCH PARAMETER TABLE TO FIND ENTRY THAT THE PARTITION'S # USEABLE ; SECTORS >= TABLE ENTRY'S # SECTORS. LXI H,F217TBL ;(HL) = TABLE POINTER F21783: MOV E,M ;GET # SECTORS FROM TABLE INX H MOV D,M PUSH H LHLD F217NS ;GET PARTITION'S # USEABLE SECTORS CALL CPHLDE ;COMPARE POP H JNC F21784 ; BR IF >= LXI D,F217TBLL-1 ;BUMP TO NEXT TABLE ENTRY DAD D JMP F21783 ;CHECK NEXT ENTRY ; PLACE INFO INTO THE HEATH EXTENSION AREA OF THE DRIVE'S ; DISK PARAMETER ENTRIES TABLE. F21784: XCHG ;(DE) = F217 TABLE POINTER LHLD DPEPTR ;(HL) = DISK PARAMETER ENTRY TABLE PTR LXI B,DPERPAB ;CP/M RECORDS PER ALLOCATION BLOCK DAD B INX D LDAX D MOV M,A ; PLACE INFO INTO THE DRIVE'S DISK PARAMETER BLOCK. LHLD DPBPTR ;(HL) = DISK PARAMETER BLOCK POINTER LXI B,WIRPT ;CP/M RECORDS PER TRACK  MOV M,C INX H MOV M,B INX D ;BLOCK SHIFT FACTOR INX H LDAX D MOV M,A INX D ;BLOCK MASK INX H LDAX D MOV M,A INX D ;EXTENT MASK INX H LDAX D MOV M,A INX D ;# DIRECTORY ENTRIES - 1 INX H INX H INX H LDAX D MOV M,A INX D INX H LDAX D MOV M,A INX D ;AL0 INX H LDAX D MOV M,A INX D ;AL1 INX H LDAX D MOV M,A XRA A ;CHECKSUM VECTOR LENGTH INX H MOV M,A INX H MOV M,A LXI B,WINST ;# OF SYSTEM TRACKS INX H MOV M,C INX H MOV M,B ; CALCULATE DISK PARAMETER BLOCK 'DSM' VALUE. ; DSM = ( [# USEABLE SECTORS] - [# SYSTEM SECTORS] ) / ; [# SECTORS PER ALLOCATION BLOCK] - 1 LHLD F217NS LXI D,-WINSYS DAD D XCHG LHLD DPBPTR LXI B,DPBBSH DAD B MOV B,M DCR B DCR B IF WICSZ NE 512 %: CELL SIZE IS NOT 512 -- DO NOT DCR TWICE ENDIF XCHG ;(DE) = POINTER INTO DPB F;(HL) = VALUE TO BE DIVIDED CALL F21770 XCHG ;(DE) = QUOTIENT ' ;(HL) = POINTER INTO DPB DCX D LXI B,DPBDSM-DPBBSH ;PLACE RESULT INTO DISK PARM BLOCK DAD B MOV M,E INX H MOV M,D XRA A ;INDICATE NO ERROR RET ;* NO ERROR F21798: XRA A JMP F217100 ;* ERROR F21799: STC ;* DONE FORMATTING Z217 F217100: PUSH PSW MVI C,SGUSR ;RESTORE USER CODE LDA F217UC MOV E,A CALL BDOS CALL FCBD ;CLEAR BIOS BUFFER FOR DRIVE POP PSW RET ;* READ IN BAD SECTOR TABLE F217RDB: CALL FCBD ;CLEAR BUFFERS LHLD DPEPTR ;INDICATE TO LOGICAL I/O LXI D,DPEFLAG DAD D MOV A,M ORI DPELSIO MOV M,A LXI B,0 ;READ SBC LXI D,1 LXI H,BUFFER CALL F217RD JC F217RDB9 ; BR IF ERROR LHLD BUFFER+SBCBSA ;GET LOGICAL SECTOR # OF BAD SEC TABLE MOV B,H ;COMPUTE TRACK # MOV C,L LXI D,WINSPT CALL C$DU66 SHLD F217TRK MVI A,WIRPS ;COMPUTE CP/M SECTOR # = PHYSICAL CALL C$MU86 ; SECTOR # * CP/M RECORDS PER INX H ; PHYSICAL SECTOR + 1 SHLD F217SEC LXI H,BUFFER ;SET BUFFER ADDRESS SHLD F217BSE MVI A,WIRPS*2 ;ASSUME TABLE WILL FIT IN STA F217C2 ; 2 PHYSICAL SECTORS F217RDB1: LHLD F217TRK ;GET TRACK # MOV B,H MOV C,L LHLD F217SEC ;GET CP/M SECTOR # XCHG LHLD F217BSE ;GET BUFFER FWA CALL F217RD ;READ 128 BYTES JC F217RDB9 ; BR IF ERROR LHLD F217SEC ;Q. END OF TRACK LXI D,WIRPT CALL CPHLDE JNZ F217RDB3 ; BR IF NOT LHLD F217TRK ;BUMP TRACK # INX H SHLD F217TRK LXI H,0 F217RDB3: INX H ;BUMP CP/M SECTOR # SHLD F217SEC LHLD F217BSE ;BUMP BUFFER ADDRESS LXI D,128 DAD D SHLD F217BSE LXI H,F217C2 ;LOOP AND READ DCR M JNZ F217RDB1 LXI H,BUFFER ;INIT BAD SECTOR TABLE ENTRY POINTER SHLD F217BSE XRA A ;INDICATE NO ERROR F217RDB9: PUSH PSW ;SAVE CARRY FLAG (ERROR INDICATOR) LHLD DPEPTR ;TURN OFF DOING LOGICAL SECTOR I/O FLAG LXI D,DPEFLAG DAD D MOV A,M ANI 0FFH-DPELSIO MOV M,A CALL FCBD ;CLEAR BUFFERS POP PSW ;RETRIEVE ERROR INDICATOR RET ;* READ CP/M SECTOR FROM DISK ; ; ENTRY: (BC) = TRACK # ; (DE) = CP/M SECTOR # (1 TO SPT) ; (HL) = BUFFER FWA ; EXIT: PSW/C 0=NO ERROR , 1=ERROR ; USES: ALL ; F217RD: PUSH H PUSH D CALL FSETTRK ;SET TRACK POP B ;SET CP/M SECTOR CALL FSETSEC POP B ;SET DMA CALL FSETDMA CALL FREAD ;READ SECTOR ORA A ;Q. ERROR RZ ; RET IF NO ERROR STC ;INDICATE ERROR OCCURRED RET ;* PARAMETER TABLE CONTAINING ; 1) HEATH EXTENSION VALUES ; 2) DISK PARAMETER BLOCK VALUES ; ; FORMAT OF TABLE: ; BYTE # DESCRIPTION ; - -@ ; 0-1 # SECTORS -- THIS ENTRY IS USED IF PARTITION'S ; # USEABLE SECTORS >= ; 2 %CP/M RECORDS PER ALLOCATION BLOCK ; 3 BLOCK SHIFT FACTOR ; 4 BLOCK MASK ; 5 8EXTENT MASK ; 6-7 # OF DIRECTORY ENTRIES - 1 ; 8 AL0 ; 9 ZAL1 ; F217TBL DS 0 DW 1024/WICSZ*4*1024+WINSYS+1 ;4 MEG < X <= 8 MEG DB 32,5,31,`1 DW 1023 DB 0FFH,000H F217TBLL EQU $-F217TBL ;TABLE ENTRY LENGTH DW 1024/WICSZ*1*1024+WINSYS+1 ;1 MEG < X <= 4 MEG DB 16,4,15,0 DW 511 DB 0FFH,000H DW 1024/WICSZ*512+WINSYS+1 ;512K < X <= 1 MEG DB 16,4,15,0 DW 255 DB 0F0H,000H DW 1024/WICSZ*256+WINSYS+1 ;256K < X <= 512K DB 16,4,15,1 DW 127 DB 0C0H,000H DW WIMIN ;MINIMUM <= X <= 256K DB 8,3,7,0 DW 63 DB 0C0H,000H FMTPART DB CR,LF,CR,LF,'Will format partition assigned to drive ' FPARTD DB '?:',CR,LF,CPMEOM MINMSG DB CR,LF,BELL,'PARTION IS SMALLER THAN MINIMUM ALLOWABLE ' DB 'SIZE',CR,LF,CPMEOM MAXMSG DB CR,LF,BELL,'PARTITION IS LARGER THAN CP/M MAXIMUM SIZE' DB ' -- ONLY 8 MEG USEABLE',CR,LF,CPMEOM F217NS DS 2 ;# USEABLE SECTORS F217TRK DS 2 ;TRACK # F217SEC DS 2 ;SECTOR # F217DAB DS 2 ;# DIRECTORY ALLOCATION BLOCKS F217C1 DS 2 ;LOOP COUNTER F217C2 DS 1 ;COUNTER F217BS DS 2 ;BAD SECTOR TABLE SECTOR # F217BSE DS 2 ;BAD SECTOR TABLE POINTER F217LAB DS 2 ;LAST ALLOCATION BLOCK MARKED BAD F217LB DS 2 ;PARTITION LOWER BOUND F217H DS 1 ;HIGH ORDER BYTE OF DSM F217UC DS 1 ;USER CODE F217FCB DB 0,'BADBLOCKSYS',0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 F217MAP DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 PAGE ; ; INTRLV -- CONSTRUCTS A SECTOR INTERLEAVE TABLE ; ; ENTRY: (B) = INTERLEAVE FACTOR ; (C) = SECTORS PER TRACK ; o (HL) = ADDR OF TABLE ; USES: ALL ; ; CONDITIONAL VARIABLE 'INTERACT' IF 1 ALLOWS INTERLEAVE FACTOR ; TO BE ENTERED FROM CONSOLE INSTEAD OF PASSED IN REG B. ; INTERACT EQU 0 INTRLV: MOV A,C ;SAVE SPT STA INTRLVA STA INTRLVB ;ALSO AS COUNTER SHLD INTRLVC ;SAVE ADDR OF TABLE INR C ;BUMP (C) FOR TEST & INITIALIZATION MOV A,B ;CHECK FOR VALID INTERLEAVE FACTOR ANA A JZ INTRLV1 ; BR IF ZERO -- INVALID CMP C JC INTRLV2 ; BR IF <= SPT -- VALID INTRLV1: MVI B,1 ;SET INTERLEAVE FACTOR TO 1 INTRLV2: XRA A ;INIT INTERLEAVE TABLE TO ZEROES INTRLV2A: MOV M,A INX H DCR C JNZ INTRLV2A IF INTERACT MVI C,PRINTF LXI D,INTRLVMSG CALL BDOS MVI C,RDCON CALL BDOS SUI '0' MOV B,A JMP INTRLV3 INTRLVMSG: DB 13,10,'ENTER INTERLEAVE FACTOR: $' ENDIF INTRLV3: MVI C,0 ;(C) = TABLE DISPLACEMENT MVI D,1 ;(D) = SECTOR # INTRLV4: MOV A,C LXI H,INTRLVA CMP M JC INTRLV5 SUB M ;MODULO SPT MOV C,A INTRLV5: LHLD INTRLVC CALL DADA MOV A,M ANA A JZ INTRLV6 INR C JMP INTRLV4 INTRLV6: MOV M,D INR D MOV A,C ADD B MOV C,A LXI H,INTRLVB DCR M JNZ INTRLV4 RET INTRLVA DS 1 ;SPT INTRLVB DS 1 ;LOOP COUNTER INTRLVC DS 2 ;ADDR OF TABLE PAGE ;C$DU66 -- UNSIGNED 16 / 16 DIVISION. ; ; (HL)=(BC)/(DE) ; ; ENTRY: (BC),(DE) PRESET ; EXIT: (HL) = RESULT ; (DE) = REMAINDER ; USES: ALL C$DU66: MOV A,D CMA MOV D,A MOV A,E CMA MOV E,A INX D MOV A,D ORA E JZ DU665 ;IF DIVIDE BY 0 XRA A ; SHIFT (DE) LEFT UNTIL: ; ; 1) DE > BL ; 2) OVERFLOW DU661: MOV H,D MOV L,E DAD B JNC DU662 ;IS TOO LARGE INR A MOV H,D MOV L,E DAD H XCHG JC DU661 ; (DE) OVERFLOWED PUT IT BACK XCHG DCR A ;REMOVE EXTRA COUNT ; READY TO START SUBTRACTING. (A)=LOOP COUNT DU662: MOV H,B ; (HL) = WORKING VALUE MOV L,C LXI B,0 ; (BC) = RESULT DU663: PUSH PSW DAD D JC DU664 ;IF SUBTRACT OK MOV A,L ;ADD BACK IN SUB E MOV L,A MOV A,H SBB D MOV H,A DU664: MOV A,C RAL MOV C,A MOV A,B RAL MOV B,A ; RIGHT SHIFT (DE) STC MOV A,D RAR MOV D,A MOV A,E RAR MOV E,A POP PSW DCR A JP DU663 ;IF NOT DONE DU665: XCHG ;(DE)=REMAINDER MOV H,B ;(HL)=RESULT MOV L,C RET ;C$MU86 -- 8 BY 16 BIT MULTIPLICATION ; ; ENTRY: (A) = MULTIPLIER ; (DE)= MULTIPLICAND ; EXIT: (HL)= RESULT ; 'Z' SET IF NOT OVERFLOW ; USES: A,F,H,L ; C$MU86: LXI H,0 ;(HL) = RESULT ACCUMULATOR PUSH B MOV B,H ;(B) = OVERFLOW FLAG MU860: ORA A ;CLEAR CARRY MU861: RAR JNC MU862 ;IF NOT TO ADD DAD D JNC MU862 ;NOT OVERFLOW INR B MU862: ORA A JZ MU863 ;IF DONE XCHG DAD H XCHG JNC MU861 ;LOOP IF NOT OVERFLOW INR B JMP MU860 MU863: ORA B ;SET *Z* FLAG IF NOT OVERFLOW POP B RET ; ; CPHLDE -- COMPARE (HL) TO (DE) ; ; USES: A,F ; CPHLDE: MOV A,H CMP D RNZ MOV A,L CMP E RET ; ; DADA -- ADD (A) TO (HL) ; ; USES: A,F,H,L ; DADA: ADD L MOV L,A RNC INR H RET ; ; DISPATCH - CALL APPROPRIATE FORMATTING ROUTINE ; DISPATCH: LDA DRTYPE RLC RLC RLC ANI DPETYPE SHR 5 ADD A LXI H,FMTRTN CALL DADA CALL HLIHL MOV A,H ORA L RZ PCHL ; ; HLIHL -- LOAD HL FROM SLOT POINTED TO BY HL ; ; USES: A,H,L ; HLIHL: MOV A,M INX H MOV H,M MOV L,A RET ; ;* WRLAB - FORM LABEL AND WRITE IT TO 1ST SECTOR OF DISK ; ; ENTRY: NONE ; EXIT: PSW/C = 0 IF NO ERROR , 1 IF ERROR ; USES: ALL ; WRLAB: MVI A,0E5H ;CLEAR 128 BYTES OF BUFFER TO 0E5H MVI B,128 LXI H,BUFFER CALL F378X MVI A,LABVER ;INSERT CURRENT FORM # STA BUFFER+LABTYP ; MOVE HEATH EXTENSIONS TO LABEL LHLD DPEPTR ;GET ADDR OF HEATH EXTENSIONS LXI D,DPEHTH DAD D ;(HL) = HEATH EXTENSIONS LXI D,BUFFER+LABHTH ;(DE) = LABEL AREA MVI B,DPEHL ;LENGTH OF HEATH EXTENSIONS CALL MOVEIT ; MOVE DPB TO LABEL LHLD DPBPTR LXI D,BUFFER+LABDPB MVI B,DPBL CALL MOVEIT ; XRA A ;CALCULATE CHECKSUM FOR LABEL LXI H,BUFFER+LABEL MVI B,LABLEN-1 WRLAB5: ADD M INX H DCR B JNZ WRLAB5 CMA MOV M,A ;PLACE CHECKSUM INTO LABEL ; WRITE LABEL TO DISK. LXI B,0 ;SET DESIRED CP/M TRACK # CALL FSETTRK LXI B,1 ;SET DESIRED CP/M SECTOR # CALL FSETSEC LXI B,BUFFER ;SET DMA CALL FSETDMA MVI C,BWRDIR ;WRITE SECTOR CALL FWRITE ORA A ;Q. ERROR RZ ; RET IF NO ERROR STC ;INDICATE ERROR RET ; ; MOVEIT -- MOVE BLOCK OF MEMORY ; ; ENTRY: (HL)=SOURCE ADDRESS ; (DE)=DESTINATION ADDRESS ; (B)=COUNT ; EXIT: NONE ; USES: ALL ; MOVEIT: MOV A,M STAX D INX H INX D DCR B JNZ MOVEIT RET ; ; SUBHLDE -- (HL)=(DE)-(HL) ; ; USES: A,F,H,L ; SUBHLDE: MOV A,E SUB L MOV L,A MOV A,D SBB H MOV H,A RET ;* ; TMMERR -TYPE MISMATCH ERROR ; TMMERR MVI C,PRCONB LXI D,MMERR CALL BDOS JMP BOOT ;*** ;* CLINT - COMMAND LINE INTERPRETER ;* BILL EARL 10/12/81 ;* ;* PARSES COMMAND LINE OPTIONS ;* BYPASSES USER PROMPT SECTION ;* SYNTAX ERRORS OR INVALID FIELDS ;* CAUSE ERROR MESSAGE AND EXIT FROM ;* PROGRAM ;* ;* ENTRY: ;* COMMAND LINE COUNT AT TBUFF ;* COMMAND LINE AT TBUFF + 1 ;* ;* EXIT: ;* COMMAND LINE COUNT = 0 ;* ;* USES: ALL REGISTERS ;* ;* CALLS: RDOPT, WKIND ;* CLINT LDA TBUFF ;BYTECOUNT MOV B,A ;BYTECOUNT IN B LXI H,TBUFF+1 ;ADDR OF START OF STRING CALL CSCAN ;FIND DEVICE NAME CPI TNAME ;IS IT A NAME? JNZ CLI0 ;NOT A NAME MOV A,B ;ACCUMULATOR <= BYTECOUNT STA TBUFF ;UPDATE BYTECOUNT SHLD CURSOR ;UPDATE STRING POINTER LDAX D ;GET DRIVE ID STA DRIVID ;STORE IT IN DRIVID JMP CLI1 ; ; DEVICE ERROR CLI0 LDAX D STA DRMSGA ;ERRONEOUS DRIVE NAME MVI C,PRCONB LXI D,DRMSGA ;DEVICE ERROR MESSAGE CALL BDOS CALL RDQUIT CLI1 CALL RDOPT ;READ FORMAT OPTIONS RET ;END OF COMMAND LINE INTERPRETER ;** ;* RDOPT - READ OPTIONS ;* BILL EARL 10/12/81 ;* ;* COMMAND LINE INTERPRETER ROUTINE TO FIND AND SET OPTIONS ;* ;* ENTRY: ;* POINTER TO COMMAND STRING AT CURSOR ;* LENGTH OF COMMAND STRING AT TBUFF ;* ;* EXIT: ;* ;* USES: ALL REGISTERS ;* ;* CALLS: CSCAN ;* RDOPT LDA TBUFF ;GET BYTECOUNT MOV B,A ;PUT IT IN B LHLD CURSOR ;GET STRING POINTER CALL CSCAN ; CPI TEOL ;END OF LINE? JZ RDEXIT ; CPI TLBR ;BEGINNING OF OPTIONS JNZ RDOP9 ;SYNTAX ERROR ; MAIN LOOP RDOP0 CALL CSCAN ;GET OPTION CPI TNAME ;IS IT VALID? JNZ RDOP9 ;SYNTAX ERROR ; DECODE SECTION RDOP1 LDAX D ;GET FIRST CHAR. CALL TOUPPER CPI 'F' ;FAST? JNZ RDOP2 ; FAST OPTION SELECTED STA FAST ;SET FAST FLAG JMP RDOP6 ;NEXT OPTION RDOP2 CPI 'N' ;NOQUERY? JNZ RDOP2A MVI A,TRUE STA NOQF{LG JMP RDOP6 RDOP2A CPI 'D' ;DOUBLE FACTOR? JNZ RDOP2B STA FACTOR ;SET FACTOR JMP RDOP4 ;GET PARAMETER RDOP2B CPI 'S' ;SINGLE FACTOR? JNZ RDOP2C STA FACTOR JMP RDOP4 RDOP2C CPI '1' ;ONE SIDE JNZ RDOP2D STA FACTOR JMP RDOP3 RDOP2D CPI '2' ;TWO SIDES JNZ RDOP10 STA FACTOR RDOP3 INX D ;IT BETTER BE SIDES! LDAX D ;GET NEXT CHAR CALL TOUPPER CPI 'S' ;IS IT SIDES JNZ RDOP10 ;OPTION ERROR. NOT SIDES LDA FACTOR STA CLISIDS ;STORE # OF SIDES JMP RDOP6 RDOP4 INX D ;NEXT CHAR LDAX D ;LOAD IT CPI 'D' ;DENSITY? JNZ RDOP5 ;BR IF NOT LDA FACTOR ;GET FACTOR STA CLIDENS ;PUT IT IN DENSITY BYTE JMP RDOP6 ;NEXT OPTION RDOP5 CPI '0' ;POSSIBLE TRACK 0 DOUBLE DENSITY JNZ RDOP10 ; BR IF NOT LDA FACTOR CPI 'D' JNZ RDOP10 STA CLIDENS MVI A,1 STA CLID0 ; ; END OF OPTION DECODE, GET NEXT OPTION ; RDOP6 INX D LDAX D ;LOOK AT NEXT CHAR CPI ']' ; JZ RDOP6A ; CPI ' ' ; JZ RDOP6A ; CPI ',' ; JNZ RDOP10 ;ERROR, EXTRA CHARACTERS RDOP6A CALL CSCAN ;LOOK FOR MORE CPI TRBR ;RIGHT BRACKET? JZ RDEXIT ; CPI TCOMMA ;IS IT A COMMA? JZ RDOP0 ; JMP RDOP9 ;SYNTAX ERROR; RDEXIT RET ;END OF READ OPTIONS ; ERROR HANDLING ; SYNTAX ERROR RDOP9 MVI C,PRCONB ; LXI D,SYNMSG ;SYNTAX ERROR MESSAGE CALL BDOS ; JMP RDQUIT ;FATAL ERROR ; ILLEGAL OPTION RDOP10 MVI C,PRCONB ; LXI D,OPTMSG ;OPTION ERROR MESSAGE CALL BDOS ; ; JMP RDQUIT ;FATAL ERROR RDQUIT JMP BOOT ;WARM BOOT ;*** CSCAN - Scanner for CP/M command lines ; ; CSCAN is called to get the next token from a CP/M ; command line. ; ; d Protocol CALL CSCAN ; ; Entry (HL) = addr of current position in string ; (B) = number of bytes to end of string ; ; Exit (HL) = updated to addr of byte after token ; (B) = updated to number of bytes left in string ; (DE) = addr of beginning of token ; (C) = length of token in bytes ; (A) = token type ; ; the token types are: ; TNAME - a name ; TEQUAL - an equal sign ; TLBR - an "[" ; TRBR - an "]" ; TCOMMA - a comma ; TEOL - the end of the command line ; TILG - an illegal token(ie anything else) ; ; Uses all registers ; ; Revision ; 10/14/81 dtp - new CSCAN XRA A ; Clear A to zero STA CSCSTA ; STATE = 0 STA CSCTSZ ; TOKSIZ = 0 SHLD CSCSTP ; Save string ptr ; ; Main processing loop ; (B = bytes left) CSC00 MOV A,B ; Test if bytes left is zero ANA A JZ CSC02 ; If bytes left is zero(char class is zero) ; Compute character class LHLD CSCSTP ; Get string ptr MOV A,M ; Get a byte from the string ANI 7FH ; Remove parity bit, if present LXI H,CSCCLT ; Get addr of class table ADD L ; Compute offset in table MOV L,A ; STORE IT IN L JNC CSC01 ; If no carry INR H ; Propagate carry CSC01 MOV A,M ; Get character class CSC02 STA CSCCLS ; Save class ; Compute addr of scan table entry given state and class LDA CSCSTA ; Get current state MVI E,CSCNCL ; Get number of classes CALL MUL88 ; Compute STATE*NCLASS LDA CSCCLS ; Get current class ADD L ; Compute STATE*NCLASS + CLASS MOV L,A ; STORE IT IN L JNC CSC03 ; If no carry INR H ; Propagate carry CSC03 DAD H ; Compute 2*(STATE*NCLASS + CLASS) LXI D,CSCSNT ; Get addr of scan table DAD D ; Compute addr of scan table entry ; Get scan table entry MOV A,M ; Get action (SCANTAB.ACT) INX H ; Point to second byte MOV C,M ; Get argument (SCANTAB.ARG) ; Decode and perform actions RAR ; Test to set token start JNC CSC04 ; If not LHLD CSCSTP ; Get string ptr SHLD CSCTKP ; TOKPTR = STRPTR CSC04 RAR ; Test to incr token size JNC CSC05 ; If not LXI H,CSCTSZ ; Get addr of TOKSIZ INR M ; TOKSIZ = TOKSIZ + 1 CSC05 RAR ; Test to incr string position JNC CSC06 ; If not LHLD CSCSTP ; Get string ptr INX H ; STRPTR = STRPTR + 1 SHLD CSCSTP ; Store string ptr DCR B ; BYTESLEFT = BYTESLEFT - 1 CSC06 ANI CSCAMK ; Isolate transition type JNZ CSC07 ; If "RETURN" transition ; "GOTO" transition MOV A,C ; Get SCANTAB.ARG STA CSCSTA ; STATE = SCANTAB.ARG JMP CSC00 ; Do forever ; "RETURN" transition CSC07 MOV D,C ; Save token type LDA CSCTSZ ; Get token size MOV C,A ; To proper reg MOV A,D ; Token type to proper reg LHLD CSCTKP ; Get token ptr XCHG ; To proper regs (DE) LHLD CSCSTP ; Get string ptr RET ; Return to caller ; Define the variables CSCSTA DS 1 ; STATE - the state of the finite state machine CSCCLS DS 1 ; CLASS - the class of the current character CSCSTP DS 2 ; STRPTR - ptr to current character in string CSCTKP DS 2 ; TOKPTR - ptr to token in string CSCTSZ DS 1 ; TOKSIZ - token size ; Define constants and tables TNAME EQU 1 ; Name token TEQUAL EQU 2 ; Equal sign token TLBR EQU 3 ; Left brace token TRBR EQU 4 ; Right brace token TCOMMA EQU 5 ; Comma token TEOL EQU 6 ; End-of-line token TILG EQU 7 ; Illegal type token CSCACR EQU 08H ; "RETURN" action CSCACG EQU 00H ; "GOTO" action CSCACS EQU 01H ; Set token start action CSCACA EQU 02H ; Increase token size action CSCACI EQU 04H ; Increase string ptr action CSCAMK EQU 01H ; Action mask CSCNST EQU 2 ; Number of states CSCNCL EQU 8 ; Number of character classes ; The character classes and the character class table CSCEOL EQU 0 ; End of line class CSCILG EQU 1 ; Illegal character class CSCEQU EQU 2 ; Equal sign class CSCLBR EQU 3 ; Left brace class CSCRBR EQU 4 ; Right brace class CSCBNK EQU 5 ; Blank/tab class CSCCOM EQU 6 ; Comma class CSCNAM EQU 7 ; Name class ; for each of the 128 characters, define which class in which it belongs CSCCLT DB CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG ; 00-07 DB CSCILG,CSCBNK,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG ; 08-15 DB CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG ; 16-23 DB CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG,CSCILG ; 24-31 DB CSCBNK,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM ; 32-39 DB CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCCOM,CSCNAM,CSCNAM,CSCNAM ; 40-47 DB CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM ; 48-55 DB CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCEQU,CSCNAM,CSCNAM ; 56-63 DB CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM ; 64-71 DB CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM ; 72-79 DB CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM ; 80-87 DB CSCNAM,CSCNAM,CSCNAM,CSCLBR,CSCNAM,CSCRBR,CSCNAM,CSCNAM ; 88-95 DB CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM ; 96-03 DB CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM ; 04-11 DB CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM ; 12-19 DB CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM,CSCNAM ; 20-27 ; The Scanner State table CSCSNT DB CSCACS+CSCACA+CSCACI+CSCACR,TEOL ; CSCEOL DB CSCACS+CSCACA+CSCACI+CSCACR,TILG ; CSCILG DB CSCACS+CSCACA+CSCACI+CSCACR,TEQUAL ; CSCEQU DB CSCACS+CSCACA+CSCACI+CSCACR,TLBR ; CSCLBR DB CSCACS+CSCACA+CSCACI+CSCACR,TRBR ; CSCRBR DB CSCACI+CSCACG,0 ; CSCBNK DB CSCACS+CSCACA+CSCACI+CSCACR,TCOMMA ; CSCCOM DB CSCACS+CSCACA+CSCACI+CSCACG,1 ; CSCNAM DB CSCACR,TNAME ; CSCEOL DB CSCACR,TNAME ; CSCILG DB CSCACR,TNAME ; CSCEQU DB CSCACR,TNAME ; CSCLBR DB CSCACR,TNAME ; CSCRBR DB CSCACR,TNAME ; CSCBNK DB CSCACR,TNAME ; CSCCOM DB CSCACA+CSCACI+CSCACG,1 ; CSCNAM *** MUL88 - Multiply 8X8 Unsigned * * MUL88 Multiplies a 8 bit value by a 8 bit value * to give a 16 bit result. * * ENTRY (A) = Multiplier * (E) = Multiplicand * * EXIT (HL) = result * * Uses A,D,E,H,L * * Revision * 10/15/81 dtp - converted form MUL86 MUL88 LXI H,0 ; Result = 0 MOV D,H ; Clear D to 0 ANA A ; CLEAR CARRY ; For each bit that is on in the multiplier, add the multiplicand ; raised to the appropriate power of two to the result. ; (Cy = 0) MUL00 RAR ; Look at next bit in multiplier JNC MUL01 ; If bit zero DAD D ; Add in current multiplicand MUL01 ORA A ; See if finished(any bits left) RZ ; If done XCHG ; Swap result and current multiplicand DAD H ; Mult multiplicand by 2 XCHG ; Put back in proper regs JMP MUL00 ; Continue PAGE BADBIOS DS 0 DB 'Incorrect version of the BIOS',CR,LF,CPMEOM WHICH DB CR,LF,CR,LF DB 'Which drive do you wish to use for this operation?' DB ': $' WDSDMSG: DB CR,LF,CR,LF DB 'Which density? (S=single, D=double): $' WSMSG: DB CR,LF,CR,LF DB 'Number of sides? (1=single, 2=double): $' DRMSG: DB CR,LF,BELL DB 'Drive ' DRMSGA DB ' ' DB ' not available in current configuration.' DB CR,LF,'$' PROMPT: DB CR,LF,CR,LF DB 'Put the disk you wish to be formatted in drive ' PROMPTA DB '0','.$' PROMPT1 DB CR,LF DB 'Press RETURN to begin, anything else to abort.',CR,LF,'$' WPMSG: DB CR,LF,BELL DB 'Unable to format this disk. It is write protected.$' AMWMSG: DB CR,LF DB 'Do you have more disks to format? (y/n): $' LVEMSG: DB CR,LF DB 'Place a bootable disk in drive A and press any character:' DB '$' WPEMSG DB CR,LF,'Disk is write protected' BMSG DB CR,LF,BELL,'Unable to format this disk.',CR,LF,'$' SYNMSG DB CR,LF,BELL,'ILLEGAL COMMAND SYNTAX',CR,LF,'$' OPTMSG DB CR,LF,BELL,'ILLEGAL FORMAT OPTION',CR,LF,'$' MMERR DB CR,LF,BELL,'DISK IS NOT OF TYPE SPECIFIED',CR,LF,'$' FMTRTN DS 0 DW 0 DW F37 DW F217 DW 0 DW 0 DW 0 DW 0 DW 0 CURSOR DW 0 ;COMMAND STRING INDEX COMLIN DB FALSE ;COMMAND LINE FLAG NOQFLG DB FALSE ;NO QUERY FLAG FACTOR DB 0 ;COMMAND STRING OPTION FACTOR (S,D,1,2) CLID0 DB 0 ;TRACK 0 DOUBLE DENSITY FLAG CLIDENS DB 'D' ;COMMAND STRING DENSITY RESULT CLISIDS DB '2' ;COMMAND STRING SIDES RESULT DRIVID DB 'Z' ;COMMAND LINE DRIVE ID SYSDSK DB 0 ;SYSTEM DISK INVOLVED FLAG TFLG DB 0 ;DISK TYPE CHECK. DEFAULT NO CARE. FAST DB 0 ;fast flag defaults to off DENSITY DB 0 ;density to be used DPEPTR DS 2 ;DISK PARAMETER ENTRIES POINTER DPBPTR DS 2 ;DISK PARAMETER BLOCK POINTER DSKTKS DS 1 ;number of tracks DSKSPT DS 1 ;SECTORS PER TRACK TRACK DS 1 ;TRACK COUNTER SIDES DS 1 ;# SIDES AIOUNI DS 1 DRTYPE DS 1 FLAG2 DS 1 BUFFER EQU $ END START PER TRACK TRACK DS 1 ;TRACK COUNTER SIDES DS