TDG92Jade DD S Sided B Density Format@+ 'V z0*:*:*:":":": bkE0::2:0ů2: ë::$1 : O0y1y 1y@1::=2:6aÙÞãuèø1>C>! b>C!A:2:p21# -͙ͣ͞u :-(<2*"v!!":O>((y((y(ypp>O(C >C:p:x:qA2$> >C^#V!>C>C>C>$>C_~#fo>C>y2y2Czʳ n&! $>C*>C>!i:22pq>C:$:x2́!y2o&))))! "{ F$>!(!o>C!# $ ͉͑! !1~*>Ci>C͑!*e}*s#rɯ*w#w* ^#VX     ? 60K CP/M 2.2E CCP/BDOS LOAD ERRO ! Bios: Write Error on AJade DD GT !Mt(ɔ|K!I Ł!5!"(KF `!4!vt*"z!U!4@K(F *#w Ձ`:=#!4*6!4<ɯ2*z8*x8*v8*t~:#~˾+v:͑@!~2*^#V*:G: = : /G:O*t*v [t"tSv*x [tKv"tSvCx*z{!y"t:/G:O:#˶!y78>@ɯ*t ہ*v*x*z#~@w+:##F F ~2 #F ɯ<#*z~ #~+(v*z"F:*@@@@@{At^<Px>Щ *v:p_!S^#V?2$Ez " ?" #?:uw" Q?2s<2u"  ?>2x??( ? @([:qݾ!2=:#ݶ2!$e7[@:soC2%g:!0 2"W|ݖ !@l~>2x|(;~߲[(8 o:!  Do:![- :"[:s8 >¹>ݦ:%8 48P:"w2#:%w:s͝72 :u΁!*>ۀw#"y2xp(ɯ2 :u!B*>ۀ~#"y2xp(!]>G@x 2x"y (:w !@: ܁<2  ͝ " ([&ϯ<:!2#.$ -([[yw>2x*! #:1w>w:q/_:#7  SD ˟9 Jade DD WP!É1pV>!!B!>ۀw#z $ v2xv!|"U> S@P  "9 :+938::r$::ȯ2: COM$$$ SUB:2+9*9#r$|>2:G29*9#r$|>2:G29*9DIR LIST]TYPEaUSERDFU GO ERA 5SAVEREN |GET JUMPگ21wy_H 2*y2\(z>/*/2*:Է )1wͪAͱF6ַ( 8 >1ͱ0ͱj2\:׷l| ͔A"F2B2 >( 2_H!ׯw6!>Ӽ8 =Ful> ܙܥܫܱ"C{2!"E9"1A߯22!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 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:!ʎ0b~#fo: !׶No Fil> ͱ> _a>(ͱ ͪ~ͱ~#  _2<!*~6z>_ Fև!\ֶ2>2a{_:*շ(Ez(;:=2 /!P!6#5z#(>:ͱ!2:2L>>ͱ [!F#~aw6!"Y ļ>ͪ*[~!8ͱ#տ2: 8=_.:;<>[Y o$! ~+ H(+!~ (#0 0Wy8 88Oy!Ґ^H@Oy H H: –ͬ  #H: ! ߾ Hù H H $O͐: 2 *CN# x: 2 p&x~+é7ݯ2 H! >w_: ! ߾5ͤNkͱ¦ͱxʊ#Nx: ߷! ߖ2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>:! ^#V w#P:BO|^#V#"##"##"##"!$ì 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<ʄ4 ~ (-H()08 80#OzW{_W{_}!9~ɯ2:\>=!\־!ԯ2,S[( @G:(:\wx2p23. 3T#6SY:Է(#* 6?Zw?Z#6 :<2!  # ### >!~ -,(A(S SYS(Wx2'̟(g=`O> ͼբ J{ ͪ | xͼ  > ͼ (> ͱx 0 >.ͱ . 6?# AllͼY:ͪׯGʹ=>2,2("YO*!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*(Pi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!B߾w!>2*C~=2u:B2~2wE:A*C߶w>"!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C68 aͪ>2!6!~8 =w4!9~ ( ( (  > x (={!5 6>P ͼʋ>o&M(:2,S()SY|(+! #< 'Delete FileͼY‹=M:!,= (#"Y G!~(p p2͟{_HÎ2|:A߾#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# ,2:ʑw:2E**E}DQ>2'KSF NS.SID0F "SV.DASF DV.TRKpTF yS.SEEKTF lS.DSID1TF _S.SSIDWF DV.CTLF K.EXIT{WF CS.DNRTF S.DCTLUF (TM.SAWATF S.SOUTE S.SINF S.STEPTF S.HOMEF S.SDEN+WF DF.DTDF S.DTSTF DF.T1DF S.DDENF S.CTLSF HOME.DF ERR.CTUF R.RTRY<RSTAT COM)6INSTALL OVR#$%&PIP COM: "2MBASIC COM JFMT COM DUMP COM(JCOPY COMCCP COMDDT COM& !VINSTALL OVRa'()*+,-INSTALL MSGX./0123MINSTALLCOM245672INSTALL DAT89:;<=>?INSTALL DAT@AINSTALL SPCBMP COMCDEFGHIJ  *3 Copyright (c) 1979, Digital Research??CON:RDR:PUN:LST:DEV:VAL:USR:DSK:TTY:CRT:BAT:UC1:TTY:PTR:UR1:UR2:TTY:PTP:UP1:UP2:TTY:CRT:LPT:UL1:R/OR/WSYSDIRR/O R/W SYS DIR ** Aborted **Active User :Active Files: Drive Characteristics65536: 128 Byte Record CapacityKilobyte Drive Capacity32 Byte Directory EntriesChecked Directory EntriesRecords/ ExtentRecords/ BlockSectors/ TrackReserved Tracks is Temp R/O Disk: d:=R/OSet Indicator: d:filename.typ $R/O $R/W $SYS $DIRDisk S0<%  "LaMP.COM$ INSTALL.MSG"#$% 89:;<! N Fatal Error (M MP COM MP OVRKLMNOPQRMP OVRSTUVWXYZMP OVRQ[\]^_`MP HLPabcdefghMP HLPijklmnopMP HLP:qrstMP80 2uvwxMP40 4yz{|SPENCER }AAVOL3 DOC~D COM MBASIC COM;_CCP DOCCCP DOCCCP DOCb$Otatus : DSK: d:DSK:User Status : USR:Iobyte Assign: =Bad DelimiterInvalid AssignmentBad Delimiter: Bytes Remaining On R/, Space: Invalid File Indicator** Too Many Files **File Not Found Size Recs Bytes Ext Acc65536 set to R/O Invalid Disk AssignmentWrong CP/M Version (Requires 2.0)!9"2!T OË!]6:\:] Hr3 Ë:\ʀË͇ /ҋͺ *2!"q*"&L ͐ ͐ ͐!$p+q*#~*#N͐*##"#÷!&p+q͠*%DMͱ O O!(q*(&4PqCCP MACCCP MACCCP MACCCP MAC WASH COM(L!*p+q*)O2'!,p+q*+O2'O2'O!.p+q*-LRRLR\LR" O!/q*/& L!1p+q*0#L~*##N!ͽ͞"T!Vq*VMͳ!Xp+q!W* >Wr#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!a48 ,!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*͠"< 0@(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$$4ABORTED$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 (8221@: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*dr!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 **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> @û[())BxD(8tFB\BaC& BM^CR"JC Y! gChCmCC<"" KCKK,O;L#$ X)WR6Y5YsR:QQjXV@XSS5R'XHKHUH')'-6=77 &67l88IrGgEvHGGH"G[EaEl(A)m)) #P&P)P#TTT P PP;LMRk~3<F^bcNBTSUTϫLOSONԚLEAҒINSNDBV+V,V-O HRAL̶OMMOθHAIιATI͆EFSTҭEFINԮEFSNǯEFDB̰EƘELETŪNāLSŢRASŦDIԧRROҨRRX O/QO҂IELILERIOTωO TωOSUEEX0 +,l "}*}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  *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ͯ $NPUԅƋNSTNNMILEԈINűOASEPRINԞLISԟPOISԓO O0EEFTO1ERGOKI2KS3KD4IDEXԃUL̖AMEהOUԝΕPEοCTPTIOκUOKřRINԑOEEEAćUΊESTORŌETURΎE͏ESUMũSEIGHTNENUͬESEANDOMIZŻTOАWAХAVPCTEGQI TRTRINGPACEYSTEͽROΣROFƤABHEA SINSAARPTIDTȡAIԗHILŴENĵRITŷO۾yy||PF<2(z{m)()A)t+m+,-($$S&&S(*s**+(NEXT without FORSyntax errorRETURN without GOSUBOut of DATAIllegal function ca4! y in Ok Break!9~#X  J N#F#i`zl ͺB J | *|<ʍ :  C=96543>7@?2C: * "   *" 2 2 |< "  * ÏB{K2*` :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!÷: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ͬ!\(llOverflowOut of memoryUndefined line numberSubscript out of rangeDuplicate DefinitionDivision by zeroIllegal directType mismatchOut of string spaceString too longString formula too complexCan't continueUndefined user functionNo RESUMERESUME without errorUnprintable errorMissing operandLine buffer overflow??FOR Without NEXT??WHILE without WENDWEND without WHILEFIELD overflowInternal errorBad file numberFile not foundBad file modeFile already open?Disk I/O errorFile already 8 " * |< " " * |! * * 5wY2IA!{DF 2H K >(_#K * ~?e !F EͺBVA X|<0>v@2QIA!; :*ڸ > @I 2 } 2 *  ͺB " :X ʘ >Iژ <=ʘ ͮ~ (" %R͖[" 1ʦ#4"}: R*l " * ͥA" t##s#r# w# ysͥ!6"*" (B*"* "Ø *bk~####~ ҭ ڭï#s#råB¿ *DM~#+##~#foͺ /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:[ w-:>>!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:ͯ !&6,nexists??Disk fullInput past endBad record numberBad file name?Direct statement in fileToo many files pP8^M^@:s<B`i~#fo??2_ 2^ ;~"= F:^ ~?>dCSG#O# # #^SyTO>ÇU#B>!AO ^#V#Of#y(~.ft!>f>[2_ [á+11>2_ YY>[?~.c:0:_ ~ʏ.>[ͮ}[|[~.ͮ:] »* |>»}e. ҃È[! ! ~[#=cʐâ&H> > [ Á#[:%J+>2^ 2_ U~|F~#[1!@}O|G!>: y +=2_ [#Cq:0q.q~ Ң ʢ ʢ> :_ <3=3+~ ʮ ʮ ʮ#>d2 8B" :] L! (" !9J  +V+^##* ͺB" ͶA* *B N(~'qA)(QZ~>rA)(͒'OG+¿ b$* "* 3zD3ĕA" !9" ~:¿ #~#{ #^#V": >[@͇0>]@ցL҂O! FJADE Computer Products Double D - Format 8" Version 2.2 Release 2j1H^ Ͳ>2>M23*:¶::¶:2! ! "2':! aʶ>U2 Ͳ̓>AD Ͳpm Ͳ! 2' Ͳ Ͳͷ:I:J1!*2!*3!X*4!p*5!*6!**!*'!*+!2* Ͳÿ/:2$>2 F|>2 L|gH >2$:!2 F|gc! >R22%:Mʋ>AÎ͎:'O:2$:!2 (( F|gL|gF|g:2$>2 F|>2 L|:%R>  I_ ' --0 Format Utility 2j - Jade Double D 05/25/82 -- $ Select Drive to be Formatted: $ Formatting Drive : Double Density 8" 16(512) $ Reading System Tracks from Drive a: $ Writing System Tracks $ Not a Valid Selection $ --- f u n c t i o n s l i s t -----012-OT :&:og,'wJ1  $~#$D_>44Dump V2.08 AS OF 02-Jan-80 CP/M V$: o&ç ڍ |Ą{0_>̈́4.$: o&̈́4 $4 *$>2+128og"!s# y 7>!N #~a {  w ! !\!s# y/::w:A2-:] kx~# `!@`åx?GÐ #Æͅʠ# 7!@zö.g!@zVALIDATEک!@zGROUP !@zG N#F#~: x n!:b ,*` #2b SBR~#o&"d >2c e<2c d G("` !~ x 0?<=:b Ҡ ڠ*d š###^#VQ+&!d :c 2] ;(&C AOGCAGx3w:b *` *ͺB#Ҧ > 2 ͷ#`i F "  "!>:yHG+ȸ#"<֌W8B" >W2:'͎ Ͳͷ4}2! Ͳͷ4}2">2:IO!J~w# !J:IO&n# `)T])):"G: x<2 >% Ͳ:2$:!2  F|>2 :"R|gʢ H ~# x^:**^:**^:* Ͳ>UU: O:$O2:2>LÁ>O: y2"!"O!:WR>ʚ Ͳ*N#"yɧG>O* DM $--- 1. FORMAT Double Density 8" 16(512) 2. FORMAT Single Density 8" 3. FORMAT Standard 3740 8" 4. READ System Tracks Image 5. WRITE System Tracks Image 6. SELECT Tracks to Format (optional) --0 a> JFMT B: Performs Functions 1,4,a,5 on B: --u $ Input First Track (in Decimal) $ Input Last Track (in Decimal) $ Enter Function Number: $ Read System fr4G !@zPARMS!@/z3HELP<!@LzOMAP !@bzhTRACK ڀ!@{z}T gÐ~!#Ã:̓ñ0 ?))) O Ú͖}"."A"z-͖̓}"A*.|}"."A*!@zSECTOR,!@'z)S R͖̓}"0"2"@MzN-v͖̓}"2*0p"0"2`*@zÊEDITp`4 Edit - $!  s# y¥ >ڐ!! ! zWRITE! zSTOP!0LH(G* #^#V*ͺB;* ͺBC! ͺBC>͖GtE͖G(|BzjPYҦ" : :_  ~GʋB+K x,Ì  <2~ʺzw<þ* * "~#####   B,* ¿ |" 2 " Ø ~,+B+'Ct tEE3>2f;O+VAʯ*>**,;ʨʡ͖0͖E6 * 4*|* ::G<:?:G<:[ ?=VAEf*|% ~!::    !" # $ % & '()*+,-./0123456789 :!;"<#=$>%?&@'A(B)C*D+E,F-G.H/I0J"*Ͳͷ:I:JA  Ͳ2&O|:&/L 3Jade DD S Sided S Density Format?'"Jade DD D Sided S Density Format(=]om Drive: $ Transfer Incomplete $ Format Track Error $ System Tracks not Loaded $QFORMAT!S!(ۀ>ۀ>ۀ>ۀ>ۀ>ۀ>ۀۀ>ۀ~#ۀ>ۀ> ۀ>ۀ>ۀ>ۀ>ۀ>ۀ>5!ۀ>#ê 8_ O)))) "}&.")OAƐ'@'_:8:8,*~8,! s# yz >!! "}ң.:!ʳ}*w):<25!"̓Ð:g.*4 Disk Write Error$4 Attempt to force write?$,l>!! :!:"Y.*V4 Disk Write Error$:-O. *0"?*08 *.% .'2>:>ʪ4 Disk Read Error: Drive $ø4 Drive $:-A>4: Track $*.̈́4, Sector $*0͎̈́ *9 4 (Group G<:!:G:[ !VAҨ!/Ý9zA*|b::W:o @¡m2go"B#PPK48͈)IC͙E ?Redo from start #~ʿ "Ö: ¹ !E* ͼO!W #K^">2>2 ͗E~,T2 XB;E: p>?@> @IC6,+>2 8~+(¯#ʿ "(ʕ)––ʺ,¿ ~,>2 : =xG+~,ʀ+6,* 2 ? '2Jade DD S Sided D Density Format2 '2Jade DD D Sided D Density Format2 '2Jade DD S Sided B Density Format@+ '"Jade DD D Sided B Density Format@,FORMAT!D!2Pۀ>Nۀ>ۀ>ۀ>ۀۀ>ۀ~#ۀ>ۀ>ۀ>N ۀ>ۀ>ۀ>ۀ>ۀ>ۀ>N!ۀ>#ã )  * !+",#-$.%/&0 '1 (2FORMAT!B!Tۀ>N ۀ>ۀ>ۀ>ۀۀ>ۀ~#ۀ>ۀ>ۀ>N ۀ>ۀ>ۀ>ۀ>ۀ>ۀ>(ۀ>N!ۀ>#î 0$4(8 ,<ۀ>ۀ>ۀ>N ۀ>ۀ>ۀ><X $*9̈́4, $::8:984H)$) *2*0:#"0i*A*.#".*?"0i * "0*"2`ò6# > w# r | .ʗw# 7yʢ#  w# ¤!\jڱ)e!ͅCOM!" \.>#y „, ]) *"*" !"4* : !"6)4 V T $*4̈́4 $*4% *6: 8 .'ě vC : 5 *6##"6*z/W{/_#"6* M *6#"6* !"6*4#*b "4:84 Successful validation drive $:-A>4:$4 ?Error - Track $*4̈́4, Sector $*6̈́)>28DM* .0  >   4^C$͖̓}"9 *9*,2;A `:;<2;! * *9: )=G :;_* * "."A: | * n&"0"2BK* .0"0"2!"9: ڷ * .0*0 *0E* ~# * *.z/W{/_*  : G |g}o  "9 4 N Dump file $4Track t{-u} Sector s{-e} Read specified sectors $4Group g Read CP/M group $4VALIDATE # Read every sector on disk $4MAP !Display allocation map $4PARMS OPrint disk parameters $4Track t Sector s EDIT Edit disk sectors $4d:  Select disk $4HELP N Print this $4 ?Drive select error$4 ?Input error$4 ?Bad  Tyà9-Jun-79 >2( } >2p Ҝ!"$*"&*4^#S^#S~#2~#2^#S^#S^#S>42>2 >2!!"$Y>c|P^#VS&>0c"$>cK$>!cR>$c>'c!R#!\# :r2(>02(*#:<+_*{(#[+""!7?7@.Jade DD SidedBK80)xɯ<)KB0 @(" * +" ( Writing trac:t 2 2 (.* &h: ͎ ! 4:u : ( :t !| : <8͉ : OU:! w5͸ :q 8͉ : OU:! w5͸  :q 8*v [ *} >O[ >0cDM"n U!U$U'Kn : (: >  : : 0>O[ >0cDM"n U!U$U*Kn : (: >  : : 0! ѯ2 2 Kv : Kx  Kz ͩ ĭ : 7>2 : c+ R)$L! yw(Q( ?Compar( ?Rea( ?Writ( DM!  x  `o"!"9"4 Group allocation map drive $:-A>4: $*4 $~ډ 40$*9#"9Î 41$*#"*ڧ r 4 $ #o )a 4 $*9̈́4 Groups remaining on disk out of $*̈́4 $:-_:-OT *?DM.* *?DM.! }a >2 !" *" 4*" ^" #^" #~2 #~2 #^" #~2 2 #n&" "2 2 !" " ">42 >2 w ."   ^#V#"^}sector number$4 ?Bad track number$4 ?Bad group number (greater than $* ̈́4)$4 ?No file by that name on drive $:-A>>:>4 ?Disk read error$ 4 ?Error in file name$4 ?Address error$Ð4 ?Error, hex inpu+t only $5) $ $k number$ A (greater than $* ̈́4)$4 ?No file by that name on dri>$7B0 =|}/o|/g#( 0~>~#0_F~#O~#c*o~#|  {0} (&- ( 8G(> 1 (Jcopy V2.04 as of 17-Jan-81 ^,A:A2:A2( Options: "D": Specify source, target disks "A": Copy all tracks "O": Copy operating system tracks "F": Copy files "R": Toggle read verification "W": Toggle write verification "E": Exit to CP/M (insert system disk first) Source is , target is Read veri4U}error at: M % "* #" ͉ ( on drive:s A>(track* &h(, sectori&h2s OUɯOF_ (yF F( ^C Aborte    !) "* #+ $, %-&.'/ (0)o +"-$/& 1( * !,#.%0' 2!"#$%&'( )*+, -./0123456789:;< =>?@Gͺ#V#"~#fo" .0" " ^#V" #~2 #~2 #~2 #^#V" #^#V" #^#V" #^#V" #^#V" #~2 #~2 #~2 * +* ": <2 _* * }ʟ * +" * #" : _ i`" {]T= z/W{/_  *#"* #"* #" 4 Disk Parameters Drive $:-A>4: Sectors per track: $* ̈́4-$*̈́4 File tracks on disk: $* ̈́4-$* ̈́4 Sectors per group: $* &̈́4 Groups on disk: 0-$* ̈́4 Directory entries on disk: $*  '%/<''#(g%! <%ͣ%҄%#4/.%Ä%G~_#~W#~Oܯ%hcGyo%JTeoxP%2 )zWyOg%x\Eʄ%! wb%b%x! %F#~怩O' 4/~_#~W#~O! ~/woG}_}W}O%CZQ% o-yOzW{_xG%$cCu͍M r5͒' &1rS&(>2 '!%7''!%7͹&'͡'$͒'.M'y2&"&PX!M%!u&! ~#ʩ&Wyҍ&O|g}oxGʡ&x Gz&CZQO'!,'͒'/.M'44+~2&+~2&+~2&AOW_2&}o|gxG>?&2&7y<=(efy is O, Write verify is O Selection:r !I!J ~#foDAOFRWEZq:NV(?Illegal command (Source drive:͢2(Target drive:͢2r A?(?Bad drive i7~: G: ( (sys tracks are incompatibl!t 6: 2u ~: G: ( (sys tracks are incompatibl!t 6: =2u ~: 2t : 2u :/2:/2&Fl:(.N& ":(.N& ":a :OU! ):a :OU! )* +[ "q ͩ 7?(?Disks differ in siz7: (@:t :( JADE disk8{_#zW#yO++4ͣ%#'p#4>-55>{4N#F#* /}o|g@5" p#=-5{4w1_cƤ~@zZrN vH Tʚ;@B''d Gg" կ5)))) 6y= 660:6 %655!''!z5'<6A)!$>2 ͒'xʊ6U6/c%y(r6)S(|" " (6' &S&8;S&: ҿ6h6')Ɓ6$!67JS&': 6b%/'|Yt&wz^Pc|u~r1'* ̈́4 Maximum directory entries: $* !z{* & ))̈́4 Allocation vector: $* }8: چ|84 Extent mask: $: 84 OS/Reserved tracks on disk: $* ̈́4 OS sectors: $* &̈́4 First CP/M sector: $* &̈́4 Physical sector size: $!: =̈́: E4 Disk parameter header: $* 4 Disk parameter block: $* 4 Sector translation table: $* 4 Allocation vector: $*: 4 Check vector: $*4 $#|8}84 Commands: $':&x'> Å%{_zWyO)xG:&2&y&! 5&b%>.! N#G.xq'}! Gxp'ƀwʧ&#(w+͒'/b% b%(x/G$! 4/: : /<! Op#6J%'F+ ! ~w'og)) '* ||Ü'* * (" `i" ! ^#V#N#F# (:] Gw#(! ~7w?##wy7O! (G(! (  xʒ'!'͒'y! ym(#x+y+z+{z|''}'! ( ʒ'!'͒'O! y#j(+³(͖(›'* (A(!v5;(t+K)($: 2 : ͏):, format with* &h( sectors on track ( Copying tracks*t &h(*u &h(, sectors* h(*q h( !" ": !t w:u 0:OU( Copy complete:* h( error(s) were detecte* Sv Sz Sx : (o&Sz  Sx ! "} *+R}2| :a * " : (5:t ! ((!(!: ! 2(! 0(! ( !. @(" * +" ( Reading trac:t 2 2 (.* &h: d ! 4:u : ( :t !| : <8:a * " : (5:t ! ((!(!: ! 2(! 0(! ( !.<n(S&'~#'=S&($7RO!%'=7Ã)͒'!77!7'!7Ȇw#O (S&:7<27!7O $({YOO6+F6!74~֫•7w M%!7 (w+w+wy75Jʙ9v" GSљ e͘w>ROhFhiuh!O8$: w"~S&')$S()8$$͒''$': 682 !W86: 2 "~Ie&X4#]I'7''7÷&͒'(6': ڞ8QY͹&!$!86!O8 J;xn{/|t1}=Z}~L~l+B,82\ FCڿ O#~:808C8.*9O6" 60k CCP for Jade-DD 04/17/82!.=P  "9 :+938::r$::ȯ2: COM$$$ SUB:2+9*9#r$|>2:G29*9#r$|>2:G29*9DIR LIST]TYPEaUSERDFU GO ERA 5SAVEREN |GET JUMPگ21wy_H 2*y2\(z>/*/2*:Է )1wͪAͱFַ( 8 >1ͱ0ͱj2\:׷b~#fo: !׶No Fil> ͱ> _a>(j =Ful>[:A| ͔A"F2B2 >( 2_H!ׯw6!>Ӽ8 :+938::r$::ȯ2: COM$$$ SUB:2+9*9#r$|>2:G29*9#r$|>2:G29*9DIR LIST]TYPEaUSERDFU GO ERA 5SAVEREN |GET JUMPگ21wy_H 2*y2\(z>/*/2*:Է )1wͪAͱFַ( 8 >1ͱ0ͱj2\:׷b~#fo: !׶No Fil> ͱ> _a>(  * ZCPR - A Z80 Replacement for the CP/M CCP A Documentation on ZCPR - A Z80 Replacement for the CP/M CCP  +ZCPR is a Group Project By the CCP-GROUP:  RLC - Richard Conn FJW - Frank Wancho  KBP - Keith Peterson RGF - Ron Fowler  ZCPR Documentation By RLC  Table of Contents  ----- -- -- Introduction 0SP) which is designed to run as part of CP/M on Z80-based microcomputers. In most cases it is upward-compatible with the original CP/M Version 2.2 CCP. ZCPR, however, provides many extensions to the CP/M CCP. Included in1 these extensions are the following features:  _. The TYPE function can be made to page or not page its output at the user's discretion  Y. A LIST function is available which sends its output to the CP/M LST: Device and dMͱ ͪ~ͱ~#  _2<!*~6z>_ Fև!\ֶ2>2a{_:*շ(Ez(;:=2 /!P!6#5z#(>:ͱ!2:2L>>ͱ [!F#~aw6!"Y ļ>ͪ*[~!8ͱ#տ2: 8=_.:;<>[Y o$! ~+ H(+!~ (#0 0Wy8 88Oy! ~ (-H()08 80#OzW{_W{_}!9~ɯ2=n !*}<C" * " 2v@IA!@ X | >^@@@VA* | * " <2>2 8! (* B,8 * ͺB( (>2 82 `i C * ͺBC `i" ~,ëC~A[?,B,D+,BB,,B*,Dg"+fDB,fD+¿ !NͺBA}_|WA*  ͺBA"l ",B**l {_zW7D2 " 8" F ^#V#* ͺB ~#~#D': D! '$ ((S( E####N#F#^#Vi`: D* D*:]  r+s$fm . 2 Part A: Installation Instructions 4  ZCPR Integration Example 5  Setting the ZCPR Inline Options  8  /REL, BASE, CPRLOC, RAS, SUBA, CLEVEL3 8  Customization Symbols  8  NLINES, WIDE, PGDFLT 8  (PGDFLG, MAXUSR, SYSFLG, SOFLG, SUPRES,  DEFUSR, SPRMPT, CPRMPT, NUMBASE, 9 4oes NOT page  d. The DIR command has been extended to allow the dis- play of the system files or all files  M. The ERA command now prints out the names of the files it is erasing  . The current user number may be included as part of the command prompt; if the user is under a number other than 0, the prompt is of the form 'du>' (like 'A2>' or 'B10>'), and, if the user is under 0, the prompt may be 'd>' or 'd0>' as per his choice W:\>=!\־!ԯ2,S[( @G:(:\wx2p23. 3T#6SY:Է(#* 6?Zw?Z#6 :<2!  # ### >!~ -,(A(S SYS(Wx2'̟(g=`O> ͼբ J{ ͪ | xͼ  > ͼ (> ͱx 0 >.ͱ . 6?# AllͼY:ͪׯGʹ=>2,2("Yͪ>2!6!~8 =w4!9~ ( ( (  > x ^#V#̀((E"i`Ü" * ~, ͂DuG~#N#F|G^#N#F{zد< #CE?Ý'5jE5jE͖0͖ExGG~# FN#F͋EokG F! w#s#r+"P#~ ʬEʬEE"x,E E+~ ʹE#y͋E >*n " >2] ( ͺB"n ~ #͖ExG( @ `AE* * /O #ͺB)F" #  F*l " !* !p *n ͺBGFF!B " * " * * ͺBʈF~###;FF_dF* ~#fo* ʫF" ##^#V#" dF* ͺBG~###;N#F# ªF" N #* ͺBʫFFů#^#V#DM* ͺB`iͺB`i(A  SECTFLG, FENCE  10  Patching SUBMIT.COM <10 Part B: Usage Instructions and Explanation of  Commands 11  !The ZCPR Command Hierarchy Search 11  The ZCPR-Resident Commands  14  DIR, ERA  14  LIST, TYPE, SAVE  15  REN, USER, DFU8h D . The SUBMIT facility has been changed in two basic ways:  S - the prompt changes to 'du$' or 'd$' when the SUBMIT command is printed  - the $$$.SUB is executed from drive A: (note that the original SUBMIT problem now exists, but the new SUB.COM facility corrects it); the CCP-GROUP definition of an Indirect Command File now applies, and this definition is thaBt any sequence of commands which may be issued from the conso J(={!5 6>P ͼʋ>o&M(:2,S()SY|(+! #< 'Delete FileͼY‹=M:!,= (#"Y G!~(p p2͟{_HÎ2|( 2_H!ׯw6!>Ӽ8}+F+N+n& PY+DM* ͨAq#pi`+9F* :͈)~*  ͈E|G{G* cGcG!E~#N#Fo,- lG͈)* ͖GPYN* ͺB”GG " *n +F+N+ͺB"n vuGW~vͪG#^#V>͈E * sEB( B,B)G GͶGH > {͈E_G* w#HG͐HO>~*Hx F#F#fh DM͋EokG|GE͐HH~͕HͩI"H=O~GCͪGv_#~#foFr~.pB)Cͼ>ʼH B,͈)B,* B)uG&v{GG=O>x~#F#fh GN#^,Xe  16  JUMP, GO, GET 17  ZCPR Error Messages A18 Part C: ZCPR Command Levels and How to Use Them 19  Page 1  * ZCPR - A Z80 Replacement for the CP/M CCP A Documentation on ZCPR - A Z80 Replacement for the CP/M CCP K ZCPR is a replacement for the CP/M Console Command Processor (CC<{le is also a valid sequence of commands for execution from an Indirect Command File; hence, the sequence:  DIR  B:  DIR  A: may be issued from either the console or an Indirect Command File, and the results of the execution of this sequence are the same. Basically, this says that Indirect Command Files are upward-compatible to the console inp ut (but not necessarily that mk the contents of an Indirect Command File may be issued at the console without modification).  Page 2  * ZCPR - A Z80 Replacement for the CP/M CCP  ]. A command-search hierarchy is now implemented which is executed roughly as follows:  w - the user's command is checked against the CPR- resident commands and executed immediately if a match is found   - failing that, thnt for the CP/M CCP  Part A  Installation Instructions In order to install ZCPR on a target microcomputer (must be currently running CP/M 2.2), the user must know two basic things:  21) Where his CCP is currently running in memory  2) Where his CCP is located in the SYSGEN image, or, for systems which don't support SYSGEN (such as P&T CP/M 2.2 for the TRS-80 Model II), where his CCP is located on  ntegration is the placement of the new ZCPR onto disk in the proper place so that it will be loaded with the rest of CP/M on cold boot and executed properly. To find the original CCP, you typically have to locate it by its appearance. It is probably stored contiguously on disk, so, once it is found, a sequential overwrite is all that is required. Probability is extremely high that it is stored contiguously in the SYSGEN image. The CCP starts with two (2) and ONLY0 ssion.  2. Assemble ZCPR with MAC (or equivalent). This assembler is required because of the MACROs used. Only the resultant HEX file is required.  v3. Assuming that you can use SYSGEN, obtain a SYSGEN image of your current CP/M system and save it on disk.  4. Load the SYSGEN image into memory with DDT (or equivalent). Once loaded, verify that the original CCP is at the IMAGE address found above and compute the integrae current user number on the current disk is scanned for the COM file; the COM file is loaded and executed if found  - failing that, a default user number (initially 0 but can be reset with the DFU CPR-resident command) on the cur- rent disk is scanned for the COM file; the COM file is loaded and executed if found  - finally, failing that, the default user number on disk A: is scanned for the COM file; the COM file is loaded and executedtdisk and how to place the new ZCPR on top of it The first question is answered relatively easily. A pro- gram, known as either BDOSLOC or BDLOC (for BDOS Locator), is provided with ZCPR. You should assemble this program for your particular computer (change the base ORG if you are running non- ORG-0 CP/M) and execute it. Upon execution, it will provide you with the base address of (1) the BDOS and (2) the CCP for your particular system. BDOSLOC has work$ TWO jump instructions followed by a buffer area (possibly containing an initial command and/or the Digital Research copyright notice). The Digital Research manuals show the CCP to reside at address 980H in the SYSGEN image, but this may vary with system. To find this image, use DDT or some other such debugger, load the SYSGEN image you can get via SYSGEN, and examine memory starting at around 900H for the two (and ONLY two) jumps described above. If yo4z+tion offset using the DDT H command:  s H, The second number displayed gives you the OFFSET value required for step 5.  5. Integrate ZCPR into your SYSGEN image via DDT's I and ROFFSET commands. Use IZCPR.HEX (or the name of your version of ZCPR) to load the FCB and ROFFSET (where OFFSET was computed in step 4) to load the ZCPR.HEX file into memory at tGhe proper location. Check to see that ZCPR is indeed properly l;e if found or an error message (COMMAND?, when COMMAND was the user's command name) is printed  . The numeric argument for the SAVE command can be specified in hexadecimal so that the user may employ the values presented by tools such as DDT exactly as they are given  . A GET command which loads a file at a specified memory address and a JUMP command which "calls" the subroutine at a specified memory address have been added; a GO command which Xed correctly for all systems tested so far, but there is always a chance that it may NOT work for some non-tested system. For the time being, assume that it works correctly and record the starting base page address of your CCP. The second question is not answered nearly so easily. If you have the ability to SYSGEN your system, it is much easier (commonly) than if you do not. You must, after assembling the ZCPR properly, integrate it into the sysgen (or(u find an area with more than two jumps (a group of them), you are probably looking at the BIOS and should go lower for the CCP. The CCP will probably start on an even page or half-page address (like 900H, 980H, 1100H, etc).  Page 4  * ZCPR - A Z80 Replacement for the CP/M CCP Now that the location of the CCP has been found, record this address for later. You are now ready for the integration of ZCP82oaded by examining the SYSGEN IMAGE area.  6. Place the new system on disk by running SYSGEN and NOT loading the system from disk (use the memory image). For further clarification of the above process, the following is a sample terminal session which outlines the steps taken.  ZCPR Integration Example B>; Sample terminal session for integrating ZCPR B>sysgen SYSGEN VER 2.2 SOURCE DRIVE NAME (OR RETURN TO SKIP)b  R "calls" the subroutine at 100H (subset of the JUMP capability) has also been added This document provides the user of ZCPR with the following information:  $Part A: Installation Instructions  9Part B: Usage Instructions and Explanation of Commands  0Part C: ZCPR Command Levels and How to Use Them  Page 3   ZCPR - A Z80 Replacemee disk) image of CP/M. This can be done by obtaining a SYSGEN image of your system, scanning it via a debugger such as DDT to find the offset for the CCP, reading the new CPR in on top of the old one, and finally running SYSGEN again to place the resultant system on disk. If you DO NOT have SYSGEN capability, a Disk Utility program is required to locate the CCP on disk and then write the new ZCPR on top of the old one. The net result of this i,R into your system. To do this, perform the following steps using the information of the page address of the CCP (obtained from BDOSLOC and called CPRLOC within ZCPR) and the SYSGEN image address of the CCP (called IMAGE for reference in this document).  1. Edit ZCPR and set the CPRLOC equate to the value obtained from above. Also set any flags and values as you desire (see the section on ZCPR Customization below). When satisfied, end the edit se<QSOURCE ON B, THEN TYPE RETURN <-- I hit the RETURN key here FUNCTION COMPLETE / DESTINATION DRIVE NAME (OR RETURN TO REBOOT) <-- and here B>save 44 cpm56.com <-- We now have a SYSGEN image of CP/M  to work with  Page 5  ZCPR - A Z80 Replacement for the CP/M CCP B>xdir XDIR Version 2.6 User Number: 0, Double Density File Attributes: No ]Sn-System Filename.Typ Size K Filename.Typ Size K Filename.Typ Size K -- --- ------ -- --- ------ -- --- ------ !TEXTWRK.-12 0 CPR .DOC 8 EE687 .TXT 4 CPR .AQM 34 TFS .HLP 6 EE687PRE.TXT 4 CPR .ASM 50 CONTENTS.T01 6 SW1 .TXT 10 CPR .BAK 4 CONTENTS.T02 z 4 SW2 .TXT 2 CPM56 .COM 12 CONTENTS.T03 4 B: 30 Entries & 22 Files -- 338K Bytes Rema ˋ  Page 6  * ZCPR - A Z80 Replacement for the CP/M CCP  B>ddt cpm56.com M<-- Now to integrate! DDT VERS 2.0 NEXT PC 2D00 0100 -h1100,bd00 +<-- Compute offset for new CPR CE00 5400 <-- Offset is 5400H -icpr.hex <-- Init FCB -r5400 @ <-- Read in new CPR with offset NEXT PC 2D00 0000 -^C <-- Done! B>sysgen  )an equate which masks out selected ZCPR  - command functions for security purposes on  1 Remote Access Systems such as Bulletin Boards;  - the masked out functions currently include  5 SAVE, ERA, REN, JUMP, GO, and GET; set RAS to TRUE  9 to mask these out or FALSE to leave them in SUBA .This is an equate which determines the drive  - onto which ZCPR will look for an executing  Indirect C 0=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ͷ ining File Data: 14 Files -- 154K Bytes Displayed B>bdosloc <-- Now to locate the CCP's address The Base Page Address of this system's BDOS is C5 The Base Page Address of this system's CCP is BD <-- This is it B>ddt cpm56.com <-- Now to find the CCP in the SYSGEN image DDT VERS 2.0 NEXT PC 2D00 0100 -d900,90f <-- Start looking around here 0900 31 80 E7 3E 06 3C 3C FE 1B CA 00 C2 DA 11 E7 D6 1..>.<<......... -da00,a0f 0A00 31 00 01 01 01 0C C5 CD ȃ <-- Now to SYSGEN onto disk SYSGEN VER 2.2 SOURCE DRIVE NAME (OR RETURN TO SKIP) <-- Use memory image DESTINATION DRIVE NAME (OR RETURN TO REBOOT)b <-- onto B: DESTINATION ON B, THEN TYPE RETURN FUNCTION COMPLETE DESTINATION DRIVE4 NAME (OR RETURN TO REBOOT) <-- Done for now B>$  Page 7  - ZCPR - A Z80 Replacement for the CP/M CCP $'ommand File. If the basic philosophy  2 of the Indirect Command File described above is  1 to be maintained, this symbol should be set to  3 TRUE (look on drive A: for the $$$.SUB file); if  3 not, this symbol should be set to FALSE (look on  0 the default drive from the $$$.SUB file). To  / review, the basic philosophy of the Indirect  0 Command File is that any sequence of commands   4 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# 1 0F E4 21 00 BE 11 00 04 1..N.!..... -db00,b0f 0B00 31 00 01 01 01 11 C5 CD 0F E4 21 00 C0 11 00 02 1..N.!..... -db80,b8f 0B80 31 00 01 01 09 01 CD A8 00 21 00 D2 11 00 C2 0E 1.. !......  -- Detail Left Out -- -d1100 k <-- I found it at 1100H; note the 2 JMP's 1100 C3 FF BD C3 FB BD 50 10 20 20 20 20 20 20 20 20 ......P. 8 1110 20 20 20 20 20 20 20 20 00 00 00 00 00 00 00 00  ..< 1120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...   Setting the ZCPR Inline Options The following are the four basic options available to the user under ZCPR for customization of his package. Option Name Function REL 3 Configures CPRLOC (CPRLOC equ 0) for integration  2 via MOVCPM rather than the DDT/SYSGEN technique  2 outlined above; set to TRUE for MOVCPM integra-  6 tion or FALSE for DDT/SYSGEN integration BASE Base address of your C (p.which may be issued from the console (within  3 reason, which means NOT to erase a $$$.SUB file)  - may also be issued from within an Indirect  3 Command File, and the resultant execution should  p be identical (same functions performed). CLEVEL3 This equate enables or disables extended Command  0 Level 3 Processing. If set to TRUE, extended  5 Command Level 3 Processing is enabled and the user  8^z8O!B N#N ¾SP.* |} !9":q!"ed cpr.asm {edit ZCPR here and place CPRLOC=BD00H}#  +-- Detail Left Out -- B>mac cpr $pz sz < <-- Now to assemble the CPR CP/M MACRO ASSEM 2.0 C4F0 ) <-- Note that CPR MUST end before BDOS  -begins! 014H USE FACTOR END OF ASSEMBLY [P/M system; standard CP/M  2 has a base of 0, but some CP/M systems (such as  3 for the TRS-80 Model I and Heath/Zenith H89/Z89)  1 start physical RAM memory at a higher address;  4 equate BASE to the starting RAM memory address of  P your system CPRLOC This is the starting address of ZCPR; set the  1 second CPRLOC equate to the address you obtain   from BDOSLOC RAS This is ,7 command line is automatically capitalized, the  / terminating zero is placed at the end of the  3 buffer, and the internal CIBPTR is set correctly  " (see later for more information).  Page 8  * ZCPR - A Z80 Replacement for the CP/M CCP  sCustomization Symbols The following symbols are provided for further customization of ZCPR to a user' <IO!b q!vz͒q.?*!9"8"͉Z*" +*'/7?v"*2:EI SPHLDI XCHGPCHLXTHLRET HLT CMC STC CMA DAA RAR RAL RRC RLC NOP CPI ORI XRI ANI SBI IN SUI OUT ACI ADI CALLJMP LDA STA LHLDSHLDMOV ADD ADC SUB SBB ANA XRA ORA CMP INR DCR MVI LXI STAXINX DAD LDAXDCX RST PSW POP PUSHNZZ NCC POPEP M B C D E H L M A B D H SP PSW ??= M!Eâê ö  - Ð f  "J*"!"!"2O!" "]""!1!++""M>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. |)*)þ))>+><7"9.Yͯ * M^2U :2:2ͳ:_³ͯ !6! @!!BH @@ABH B! "BHI$$BI$BI $ HI f D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I u$I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A" 2*">!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 0 & 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  !  # B$$$I$$H!!! BH" !I B  $$!BD! $!BI D@"!$I$$H"!I$I$I$UUU$$A$ / `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =« f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  # $: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͈* 4  ë «   Ͷ ͐ =« 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!~    (DM!  ::=H-\:N2O_og_{ozg^#V))) _{ozg^#V) d^#V|g}o n_{ozgO{ozgi`N#Fogo&og H ©=¨'r+s+p+q*~$7*>*>H&>*#"*#"> 2:R͎:!6!6=2:ʙ!6:“H9Ž>!6-e!6ͻ2=2ʺ-é:>>"ͻ2:!!5ͻ2ͬ!\ 8 ! _^! ^#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_  , <   pXHk`H  KF  LF  xI # zI(|@cFHFIlIFvIFIFIFIFIFIFIFP 0UcIbJQ :I\b^Q 0Tea5I\5Id5ISe| 55Ia5I\5Ib57A7AIT"aS}RR} T#>>l|9D  `W"IT Ƙg| Ƙg TT ASTyDA塈TSyUFA@圖 AC堎@TyBCSBC E@SA;y:IbEQ ^bTyTyAyGAQbT @TyU D0A;y:z^Q ^BՀB孉Ty  ~CCan't Open Message File: `vKFHKFRKF\KFfKF4pKFzKF?D IB@EKCLbLJGHE GI 4BQBCByUyA;y:z p\ݺpbTcTS\@TyyTyTyWUTyVRUTyTyyTyWQeTTyU [c[b@%A圊|AQdTyyCy@[B0TeCBd)BbeBC E@c}BAye0QBdUyBbcQy}UyBAyBCByQ5T0c}0Td:b{Sd} A Ayr|0 2@bl 59=  0Te: In DispklKeylist ... # entries = Dispkl terminated normally@)PARMSRGCHSCNblock ./0123672  (FtHME GOE4GQREHGSTE\GUmFGWXEpGYZFG[\FG]^FG_`$FGwIIyI0I{DIBFCF@EAFDEEEFETE1F;F E F F F $FEFOFcFFF>FLA&H&E&X&P&Iͻͼsea shells bsea  not assigned error in test 8NWgz%,    DDDDD PTiTgW uSIhUg WfR OM@|-fS zRg| QS zRf g TiQ&Ui} z g}@AfTAR]yTB&@|LATAIeQ&Q^ AVױ UQ&;<=zQ&QEd|Q&;<=zQ&QXd|wRRQ^;<=zQ^Rd|RQ=AXס]yTQ&;<=zQ&QH;<=zQHA֮VP=TU;<=zU~U\IT\Q \Iz UcSbIQ&UTc}   u  v }E  NE PE  }E  }E  }E  }F  }F  }F  }$F Zc.Fd1F V;F e1F f;F gEF hOF aYFicF  Uj8H lBHmEHnHHqPHpLHojH rTHq\H ,):f  0vFHJ\`X^VR=ZNT"b /156,32.-0)7QT"3 UX6QTT T66IzQ633389Q8!*+3 333337Ud95Q 533 3 3 3 5Td}_     U  5\Ta3Ib RxQ T#TQ=T"2 <3DPb   tC4DZC2DTIz6TTTT8QT#IT#T"6dSU6uSU'\u'R0V65''UTc6a5I\5Ib'W5:I5:I\d5 <0Ud g>eIq|eT>fQ0Q9UTd}$! h ITd| pXbTd| \ݠYbTd|>eT >fQ0Q9 QAQZUTd}|U I&I'UTdZ|30iIh   i Dž R Td} IZbTd6A>bbTIz}Qa QzQ aUaQ2} Uc>c>T >>c}  VaUcV c}cVUBdAyyc}0Ade& AAA Ayb~yTbU5z&5z5UWT5IU5J&Ub0aT}Ts%Kt%LuIQY&zI , QN'z&' QRDUR\a&T"0TTTT}aSb}R 0TgTgQ0:zTjR RaRj:i ] 7 0:za aT:i ] 7 0:za} k gI T}|Th gI:z T}  Q ^IcTbUd^bIQ0b}< <,Ln  kpTj l TTTTQ"XQTTTIz}  VV= zS4 zS+ VV# hS   iS   Uj } z zT zT zlSlSa Q$ S M G     SELEdE(QT__%TlT_UZ__ TyTyTyUZ_!_"T"yT"yT"yUZ_#_$T$yT$yUX_&_'T&yT_%_%A_ _U_kmnR\EZT#T_TQTT%B_w_A________ _ m  & #!% &_"$! &$_$ yk l%_%}e!5"Q!5 & _ k!T_ _CV 'B #' p P=T<hSU A Q6 TTB i  V j VA ִyVc} TN jSU [U Py 9Ʀy 8y I8y A A!W  ' " %$`6gT_Th Qw Al\ݺPipj VB_nAk U Vm y VA V y U3A/_SVzV E E B B g}33 3C6C(_3 3U733CVפ6@37U3 zU3z3I23z13z3I 3I23 z13 z9P 5I_T_5IQ}5z53U3 z13 z5IQ23 zU3 z23 z5IQ13 zU3z5IQ 5IQO3zQ73z3J5|.5:I3 dz3 z|5:I3dz3z5:I3 dz3 z_5IQ}5z53#U3z5IQ 5IQO3zQ73 0mI zIe@%dDIIDzT3z@dQ iDIe z55Ig@ J2Q5:z@J2 QRDz|QCDzQ5:z@JfQ7O5:z5(|F@ 5:z|;@5:z@ 5:zQ5:z| Q5:z@5:z@ 5:zQ5:z@%dDIIeI5 ֯5 Ih5 5  g@J2QCQRDzQ Dz@*JfQ7O5:z5(|F@45:z|;@/5:z@45:zQ5:z| Q5:z@/5:z@45:zQ5:z@9dDIIDzI5 ֯ 5 I5z5 5 5 I cTd cBU}UTeQ 3^BU}Ve^ 7^BU}: :[=  VV? {S7 VV/ {S' ! TlT z mS   z}`SgRͫ;{S4A0{S)A%{S{S{SSSUgTg|RDQT#ATAT TheSSh|*Tf$iU ʶg y Xc gy Sh}  RD]T#UcUXed{SUAyTybTUXyBe{SUAyTy}  ABa} pTiSh AiBa}B yC CUTh  bBaU}`A g VAAyVP=Bc} pP=dT%iSU AXB h VA ִy $z3J5|.5:I3dz3z|5:I3dz3z5:I3dz3z5z53"9 3IU3IU 3J3JY3dz3z3dz3z TcT{yQU3UcAAUAAUe3c3 3 e3c}37{6yUzQ9zQUUR JQ0AAJQ0ױ#Tz}}CbDcBbTAac}TbTe&bSDc^cAdUeS}`Q^ XXV6CiA 6C|6D X  AȤAȪU6@iA 6@|6@ X  AȤAȪU3yA3z3yA3zɮAA8@Ij 8@ Q 8@ z }8@8@z 4) 5         cSVUȲdyV0TdQ T^Dz}e jg A裺 Vy> z>h I \SX>Y{i>f>\f I \SSAXuVe TdQNAD   z^D_ IIzQ,IzIIIIz} VeAg jAg}=0U\eSyTyTySyTdQ4^Di>l j  k  i l A U}}fYgQQsUU h V y Ȥ  ȫ yT0de~V>g&%, ^ ?~?z>@?T~&T>g&L,IB  Rg|2 AlSSg|"ViU kbyi ky Sg} &*.E(EE VcA0Q&AZQ'A6ZdC CCd}A֐AAc|W0yCyyCCyAaA0|-|2AA|%dAACyCCy|Q(A0} T"'tTaZ=W6Zֻ0T6ZֻT6Z{6Zy5A\ 5AR5Q)5A} TZQ*VcT 5AXנQ+ZZc6ZCd6ZeCCe}yCyCeW05AVTyUAֻ0 Td%Ad|A AA } AAbCaX}BoQ!QTjTk^m   TlWAm }AABC  B_n n AnU _m CgmU}TUnT cT}D A Bh}0UZyCbyTyU{dUT[TaQ-7AT"AfBi Aj UY i _UlA_UZyCdyyTyP=_Tk eAn AP _SUUɲmyUUZyCdyyTyAyP= A yV P=¼ il}#TbQA Q4SbA%Ba}T   UXyBayTy (8@ ǪVg Q6 ^CmvAr6 ^E6 ^E6 ^EI |6 ^B6 ^B 6 ^BIT zi I |6 ^D X   IȤ I   I}x^ X P fSV gSV W gT3d{SV hSVU DZi{y ?  Vc} D^cTiTzQ zACe n[)fTd3TQ]Q BQ QBI*Q(DQ)$c}CQEVUTI j UiQ TbDc} @UV۱efg ֮Th: f{SV}fTh:1A jSVU Vʱkfy ky i , V} >ciT:iTecT>g 8K--L)bUN2J!(1XO2^/b12H;n0x5TQ?|Q ?|^?|]?| ?|\?|Q ?|Q?|Q?|Q?|VT>g Qa Q g Q9 Q0ׂ Q7Xf>g Qa Q g Q9 Q0ׂ Q7f?|_WT>Q0Zf>Q0Wf>Q0fRT?|/WT>Q0Qdf>Q0^f>Q0fRT?~z0dIeTfBAICfQtUBf}>U\g \>y y Tyy|U\gS yT yT yS y yTy f}TTbcdCbBc} c!Ap?A\ݾ?:yDp?D\ݾ?Bc}c C bBc} cAdCTz| CAY dCa}TAc" |eV0CByCBCy| adT0&5A%Q,%&ר&b&5At'tTaZ T6Zy},,d   pTha j[ y AZj Iy Jy Ky C y AZA  ZeUcdTf+gzzzeVdzyCCzc} VTcTdTzhTUe[TQ]Q C b}Q[VUTIi T ǢUcQTd b} 0eTdCUa}Urx@e"Wr<T       tE`IQTIzUTTTQ5f5IQ_I^^U_T_0fǪA_eekeqffI^5f5I}^^BeYfz0A_IQ:Q CfǪfY^5f5IBe}^^Q_I^BfAfǪfY^}?)VQ                    FZMIDILHHKXHTHLH4JBH.FEHRNPNcFIFFIYFXI@NPH\HLEFOF6N8HLCNLN`HjHtHFNGINQo+oT*j9lQk kTByCCyl}7B7y7G7 ,?&H,E^BJ$|N3V Ȥeb|i3!V|]3'V|Q3 V|EQ&? ?|:3%V|. Q Q^? @?| Q ?|3V Ȥeb}\ z EdAcUb-&^eBCQ~-SCDCDAE.b}  ^Cd3&/$|J2VcXc|\c|^c| J2]c^cc|,3$$X\JQ6c| JQ5cccc Ec9^@dJ2fT3zT3z@ dQ iDIe z@dDIIDz@*dJ2#DIeQ Dz@/dDIIDzT3z|e@dQ iDIe z@dQ iDI zIe@ dQ iD <zBc}cCBc}b CBcUb} @j SVU e VTk \ T ^Dz }f>[|U>i >\i>h >\h g 8> z JUT zTk \ A  ^DI   ^D }}|>>g >\g 1U z> zTk \ A  ^DI   ^D }}}]% ThTiTk \ \Tf[] A AՐA k:yg \ A A}  A Ak :y f|  A:y}\  A:y Vk U Ȳd ycTj U?  AAep?\ݿ?  AAep?\ݿ?  AAe Af AI A T?T?}Tl\*A ^D^DI  IT? J? }T?} j}i UV?Tf FAep?\ݿ?Tl\*A^D^DI  IT? J? }T?}T?T?Tz^#PXmwA~                1F;FFdNcFFNNEFNTNVNNEFN^NIOFKE4JFFFIE$FXN0d0o o 3o3o ZT  TTQX2VQUQ2V^VQ2VQWQ2VQ XU2TQX2VQUQ2V^VQ2VQWQ2VQ XUT0հQX2VQUQ2V^VQ2VQWQ2VQ XU] |J77I>?}z>bbT&>牀 I|>b| >c>Vb}T?T?Tz^#PXmwA~                1F;FFdNcFFNNEFNTNVNNEFN^NIOFKE4JFFFIE$FXN0d0o o 3o3o ZT  TTQX2VQUQ2V^VQ2VQWQ2VQ XU2TQX2VQUQ2V^VQ2VQWQ2VQ XUT0հQX2VQUQ2V^VQ2VQWQ2VQ XU] ,+bfjRj{*La%<Yw / J f  ! 0 D Q l  < T d  . = i jndhv1CYy1Efq4G-hO!/K 2 !!#!W!j!!!!!""&#&.&J&c&|&&&&''*'N'u'''''((E(](((() ))<)Z)))))*&*D*n****+"+9+`+u++YN Microsoft Install Version 1.00 (C) Copyright Microsoft Corporation 1981 The Install program modifies a Microsoft product to take full advant 0more)Install complete(Linking code)(Checking references)(Allocating virtual screen)(Opening Installation files) (Verifying)(Collecting data)(Updating file)(Building map file)(Writing to Product)Code Patch File InvalidA Insert Install disk in current drive, Press any key when readyList of terminals invalidProduct file not found Product file not correct typeA Insert Install disk in current drive, Press any key when readyInstall Spec file Invalid#Cannot deallocate unalloc  TTT2VQ UQ2VQVQ2VQ WU]TTTQE2ܮTVQTWQTXQTYQYZU]T2VQUQ2VQVQ2V[WQ2V[XQTTR ,eTg Q3 A 3 ^B } QRN [}2VQXQ2VQYQ2V[WQ2V[X^2VQ XU]TUVQo -UWQUXQR }UVUQ UXQYXUUVUQ UVQo -UWQUXQUVUQ UYR }UVTQ UXQ&YYU]TYTVQTWQTXQYYUXTVQTWQYXUWTVQTWQTXQT\QY]UVTVQ'TWQ$TXQTZQY]U]TTVQTWQTYQR   $age of a terminal's capabilities. Install uses a file that describes many terminals. If your terminal is not in that file, you may define your own terminal by answering a series of questions. A manual describing your terminal will help you answer the questions. Press RETURN after each of your answers. Press control-C, at any time to abort install. (Data is available for these terminals: The program will ask you questions about your terminal. A prompt will indicate what type of answer is 4ated spaceAllocate size clobbered Corrupt mmtypbad rgbszAloc size Bad arena #Cannot allocate byte sizeMemory space exhausted Linkage Error!Invalid Error NumberUnexpected End of File'Maximum size of installed code exceededUnresolved referencesInvalid external referenceUnresolved Parms referenceUnresolved references:Disk I/O Error* Fixup value exceeds size of code block: Invalid SymbolIllegal TCD data pointerUnexpected End of File,Wrong number of graphics chars or input ke 8[}TYQYZU]TTTQQ U3ZQ V8UQV8UQ W8UQW8UQ X3ZTYQTZQT[QT\QT]QY^UT QYǰQcR R}RUTTTaS})b00bT TQ Qb}TTTǰITRN  Tc IRU}0Q 33I bT}0bT>}33I3 3 I*x2Tx)w.b>B|]T>d>\dRd>c>\cRc bIb|>e>\eReI澾}} TcTzb % ||3b|3b|3b| 3b|3b3  ( needed: (I) for Integer (number keys only) (Y/N) for Yes or No (Answer Y or N.) (S) for Sequence of character(s). Special keys can be coded with a prefix character. Type &M at any time to see the menu of the prefixes. Press RETURN to accept the proposed answer to each question. To change the proposed answer, backspace over the answer and type a new answer. 8Enter name of product file. (Change Disks if necessary)Put disk with 4 on it into current drive Press any key when r 8oysIllegal Input KeyIllegal screen definition Fatal Error The following list summarizes the strings that use your terminal's capabilities. You may continue selecting any one item to modify until the complete list is acceptable. r The following list shows the strings that will be used to generate graphics characters on your terminal. The following list shows strings sent by special keys which will generate the different screen functions on your terminal. { Enter number WbIaS}/c>b>\SQ Rb >d >aI\aS}/Ycc} Tz3I3IZ*c)e*2:d)*2fcf2dUUX66I55I|UY-K-K9I=*c)e*2:d)*2f99I|66I55IU55I-T#U66I xwce7f77I>,"8CQX[foI?|A?|AQdQ0?A^Q0?_Ae|y>P=A?|mA>>P=|bdba|Z|VQ`bQ`a|JQ?>?|@A^XA^:y|/AAQ:y| A>IP=|Q?>?>?Vc~0  ,eady.M Enter number corresponding to system. Just press RETURN to see more items. Abort Install? (Y/N)Answer too longIllegal use of &, ^, or ','Answer too lowAnswer too high'Attempted to validate with invalid type. Answer must be all numbers%Answer must be all numbers or letters Answer Y for YES or N for NOAnswer out of rangeYou may either proceed through each question sequentially, or you may just change selected items from a menu. Do you want to go sequentially (Y/N)?( <;corresponding to capability (I) Just press RETURN to see more items. Enter 0 when finished with this list. Enter number corresponding to graphics character (I). Just press RETURN to see more items. Enter 0 when finished with this list.z Enter number corresponding to function (I). Just press RETURN to see more items. Enter 0 when finished with this list.U The following questions pertain to graphic characters that may be displayed. You can assign special keys to screen functions. Thes>e special keys are optional because there is already a control key defined to provide each function listed. If you wish to accept the default, just press RETURN. For example, the default for LEFT DIR KEY is control-S. If, in addition, you want the left arrow key to move the cursor left, you must type the sequence of characters produced by the left arrow key in response to the question regarding the LEFT DIR KEY. (Just pressing the left arrow will enter this sequence of characters.) To deficreen when they start a reverse video field, and write another blank to the screen when they end the reverse video field. If your terminal has reverse video and does this, type N. Does your terminal have non-destructive reverse video (Y/N)5What sequence of characters begins reverse video (S)9What sequence of characters begins a major highlight (S)7What sequence of characters ends a major highlight (S)9What sequence of characters begins a minor highlight (S)7What sequence of characters end )1Your answers are too long; you must change themYour input keys are ambiguous. No two functions may share the same string and no string may be the same as the prefix to another string.0 What sequence(s) of characters (S) represent What character (S) generates Number of rows2How many rows (lines) does your terminal have (I)Number of columns7How many character columns does your terminal have (I) Terminal name%What is the name of your terminal (S) What character sequence will ?0 Test of turning on Highlight. %The above line will turn to Highlightwhen you press RETURN. Test of turning off Highlight. Highlight will be turned off on%the above line when you press RETURN.Test of turning off the cursor If the cursor can be turned off,it should be off.Test of turning on the cursorThe cursor should now be on.'Test of turning the keyboard click off.$If keyboard click can be turned off,it should be off.Press the space bar to test. Keyboard click should now be on.(ne more than one key to do the same function, separate the definitions by a comma (but no spaces).  Clear Screenclear the screen (S)Position CursorGraphics9What sequence of characters will begin graphics mode (S)7What sequence of characters will end graphics mode (S)Initialize MultiplanSome terminals have properties that must be set before Multiplan can run. If your terminal can set wrap-around mode, then enter the corresponding sequence of characters. If you set more than one prs a minor highlight (S)8What sequence of characters turns off reverse video (S)>What sequence of characters will start cursor positioning (S)<What sequence of characters will end cursor positioning (S)+Each row and column on the screen can be addressed for cursor positioning. If the position of the upper left hand corner is row 1, column 1, answer Y. If the position of the upper left hand corner is row 0, column 0, answer N. Is the upper left corner of the screen row 1, column 1 (Y/N)%Is$Begin Graphics ModeEnd Graphics Mode There are two prefix characters: ^ is for coding control characters. & is for the following characters: &E - escape &R - return &^ - ^ &N - newline &T - tab && - & &F - formfeed &B - backspace &, - , &X - rubout &Dxxx - 3 digit decimal (less than 256) &Oxxx - 3 digit octal (less than 0400) &Hxx - 2 digit hex &P&Hxx- pause xx (hex) milliseconds &Iy&Dxxx - pad character 'y', xxx times &Y - Used to code a Y after a control-C 4The bell will sound for each key struck.Test of graphics characters.(If the terminal has graphics characters,$the border of the box is continuous,&there are two down marks pointing into#the box on the top line, and two upmarks on the bottom line.$Press control-C if this test failed.Can not open map file%Block Load Addr Relocation OffsetRelocation Offsets:*You may wish to change disks at this time. File not found: 0 Insert correct disk, Press any key when ready Soperty, you may need to generate a pause between each character sequence. Use the &P or &I to generate a pause. (type &M to review their use). What sequence of characters should be used to initialize your terminal? (S)Reset MultiplanOWhat character sequence will reset the terminal after Multiplan completes? (S)Erase to End of Lineerase to the end of a line (S)Clear to End of Display"clear to end of screen display (S) Reverse Video7What sequence of characters will end reverse video (S) the row position given first (Y/N)How is the row number modified? 1. Send without modification 2. Send as an integer (Field width is variable.) 3. Send as a 2 place decimal 4. Send as a 3 place decimal 5. Add a value before sending 6. If the number is greater than a test value, add a value 7. If the number is less or equal to a test value, add a value Select one of the above functions to be applied to the row number. (I)EWhat sequence of characters separates the ro(J. You may now select one or more screen tests from the following list. If a message does not appear or part of the test fails, press control-C to exit. During the tests, control-C will not abort the program. Possible terminal tests are: 1. Cursor positioning 2. Clearing the screen 3. Multiplan initialization 4. Function keys 5. Reverse video 6. Cursor and keyclick options 7. Sounding the bell 8. Graphics characters 9. All of the above Which test would you like to8 Keyboard Click Onturn on the keyboard click (S)Keyboard Click Offturn off the keyboard click (S) Cursor onturn on the cursor (S) Cursor offturn off the cursor (S) Sound Bellsound the bell (S)dDoes your terminal require a special sequence of characters to turn off reverse video (Y/N)Input TranslationThe next question is about your terminal's reverse video capability. If your terminal does not have reverse video, type N. Some terminals will write a blank character to the sw and column numbers (S)What value is added (I)What is the test value (I)How is the column number modified? 1. Send without modification 2. Send as an integer (Field width is variable.) 3. Send as a 2 place decimal 4. Send as a 3 place decimal 5. Add a value before sending 6. If the number is greater than a test value, add a value 7. If the number is less or equal to a test value, add a value Select one of the above functions to be applied to the column number. (I,$ run (I)? Enter 0 when you are through testing.Test of cursor positioningThe X should be in the upper left-hand corner.upper right-hand corner.lower left-hand corner.lower right-hand corner.Test of Clear the screen.The screen should be empty.'If there is only one line of E's at the"top of the screen, the sequence of%characters to initialize the terminalmust set wrap-around mode.&Verify the assignment of terminal keysby pressing special keys.Press RETURN to continue to next test<f  !-4>HNNNNNNN[aaaaaaamm|uuu &&&288888IOOO[m|kqq]cc:@@@+11W]lu~Vd  -    Gy/O "æ*" C ʦ""" æx~# $ xw+ / x s#: |})=I )T #=O }o|g||GMzW!z>y >S))ҁ =y |x怴gD|OzGKzW!>))}o|gҶ =£ | x怴gzy怲WȯzW{_ |g}o|g}o|g}o p  p Lv 6 p < Sp p  p p ͸y2 yO! ^#V|¦    error -- undefined system call $!: ʴ ++æ) è xC / $ ø ": _!Ä*s#r#*D|  }1 } YY  error - old version of CP/M, CP/M 2.0 required. $o&6 !r" 2 q#p#<2  |-F ʑ !  w# ¤  ¶6 #     q#p#: <2   2ͮ' ] !s!r!s#s#s!fZ *C q :A2m *)""!""*#*C !fʷ **#") s#r*"*"Ï**Y "*"**Y "#0 MACRELCRFPRNhY,V|$]`K4 a`p8Z,HIĉhi H8ĉiQ HIK* р)Iq hY,V|$]`K4 a`p8Z,HIĉhi H8ĉiQ HIK* р2ͮ' ] !s!r!s#s#s!fZ *C q :A2m *)""!""*#*C !fʷ **#") s#r*"*"Ï**Y "*"**Y "#acS!~#"o&^$V*N#"*N#<F#"O* N#FæO* æ##O*  ^#V^#Væ5!5O*  ^#Væ*æ*^#Væ*^æ͸QAO ^#Væ͸dIO ^æSxTOææ"^#VæaÛaO* s#r[qòqO*  ^#Vs#ræ"æ*s#ræ*sæs#ræsæs#ræ~O*gs#r#6#xwæ~!I w*_^#Vz= !"!Ä"^#V+" "*"*"1yʦæ{   illegal system instruction encountered $x€ ~ ͨAڀҀ_#~:€#~€ ê €~ʪ#^ ~#^ @_* _ x ^#*   *  * êͱ#s#r~M !m €:€ͮ<ʘ*6*æX:MP.OVRͱ#s#r€:€ͮ<ʥ ! ~ڞ<ʤ*6*æҀ*6ͺ<ʞê*€<ʘê" yM 2\~K $#"* C <  error - load address too low $""*""**)*Y """ *)*Y ""*6++"**)"*s#r#*s#r#####*++":*#)"!f **s#r#"*s#r#*)"!5*s#r**G*C k9  intersecting segments- unable to load program $ LY "J!Pxʛ ^#V#^#V*Jr+s~*+F/ #MQY`dov|, U4H "æ͸͸|g}æ͸)ֆO|æ͸;֐O|g}æ͸R֖O|æ͸æ͸æ͸=æ͸=æC ڮʮæ"W*~#2U~#2V"#:V?o&"[:Uo"Y*WC *[*WC *Y*WY *N #"æ*[*#"J*^#V#"*WC J:U_:V?W*"æ:V@ʺæ͸fֲOv͸t֥O* x/Gy/O ++#~2G+~2**Y *+++r+s*"xw+xw+r+s!w*_^#Vz*"!6!"*6*##^#V"^#Vj#~+: ~ͨAҖ <2\##~K #*, ]͜ ~#> .– ~#*F e͜ ~– \ _* :\q @w#6:# 6.# !] ~?ʒ # „ i * i +~.ʹ ʹ _® >?ͨ#  >  » !]6?!^ w# Ҁ! s#rê!":Ҁ*3!x3}*:#":~, *:æҀyMxʪ!w ii,m6m,U*žM!í!í!í!í!í!í!í!æ!  ~ù">2y!  "~#fo"7*!^#(\`cknvy};rtvxz|~DH **s#r#*s#r**)s#r#*s#rq!"* "Sʟ **DM*""*)"x **s#r#"*S"ʻ ***Y }* 6#6#=*|*%**)^#Vs#r#*)s#r>2!"* * !Ä*N#F#"fx |fx ͉q̀͑w#͍͑:¥!">=2*~#"INSTALL OVR8 +" !N* ^#V*^#~W#"*"!9{PO*+F+~x C1æ*~2++V+^"~!ʤw*_^#Vz˜!"!1Ä"^#V+" *"*"^#V*"!:++æ͸yO xI yO r+sæ͸4O æ͸CֽO* ^#V"r+sæ+ææ)æY æ æ æ æyI æ)æA æ` æ͏ "ææææz/W{/_æz/W{/_æ{æ͸*"" x/Vr+s2#  : #~+:7~ͨAii<##n.P #n! w!w!!w#w#w~ͨ ʓ!.ʔ*ʘ?‘>2#n>2>?ŸÔa_!"  40 _0æH 7æxWxGfʯ^z@ʀ~# xqïzzijz{zijz ʤs#ç#^ x‡è {a{ _xʦ >$!s  $KTe w)y){)})=)))))/45?5// 5)5)G8)2)&(3)z3)))4)4)0J5U5m5;6C<7)))))=)))))/45?5/= / 5)5)G8)2)&(3)z3)))4)4)0J5U5m5;6C<7)))))=))))*/45?5/ / 5*5 *G8*2*&(3(#,5+,G8/,27,&(39,z3;,%,(,4=,4?,0J5U5m5;6C<7A,C,E,G,I,N<L,P,T,V,X,/45?5/#/ 5Z,5b,G8e,2m,&(3o,z3q,\,_,4s,4u,0J5U5m5;6C<7y,{,},,,=,,,,,/45?5/##/ 5,5,G8,2,&(3,z3,,,4,4,0J5U5m5;6C<7,80J5U5m5;6C<7.....>?...../45?5/%/ 5.5.G8.2/&(3 /z3 /..4/4/0J5U5m5;6C<7/////=/ /#/&/)//45?5/g%/ 5+/53/G86/2?/&(3B/z3E/-/0/4G/4I/0J5U5m5;6C<7K/M/O/Q/S/=V/Y/\/_/b//45?5/n%/ 5 nw|*3<AFKPUZs 8QV[`mr{ %27@IR_hy$->GPUZ_din $).3Lejot*/49FKT]fs| "+8AR[dinsx} ).38=BG`y~ %>CHMZ_hqz*z3** *4*4 *0J5U5m5;6C<7$*&*(***,*=/*4*9*;*=*/45?5/ / 5?*5I*G8M*2U*&(3W*z3Y*C*F*4[*4]*0J5U5m5;6C<7a*c*e*j*o*=r*w*|*~**/45?5/$!/ 5*5*G8*2*`&(3*z3***4*4*0J5U5m5;6C<7*****N<*****,T,,,,=,,,,,/45?5/p#/ 5,5,G8,2,&(3,z3,,,4,4,0J5U5m5;6C<7,----= -----/45?5/#/ 5-5$-G8(-20-&(32-z34--!-48-4=-0J5U5m5;6C<7A-E-I-N-S-=V-[-`-e-j-/45?5/ $/ 5l-5v-G8z-2-&(3<{d/5l/G8o/2w/&(3y/z3{/f/i/4}/4/0J5U5m5;6C<7/////=//////45?5/%/ 5/CADBVSUTJHWQ@ N LMRPCADBF AK       K       K       K       K       }[O CADBP Q RS[CADBK [[?7hK[>2l[>2[>5l5hJP ]][##]P Y#9[#0P##P*= # J)(vPPEY FGy7x6vy6Ky5x5qpJP= /]##P= GP+<= TG0G4 }N:_~44#####"##~2#N#~~ʙXNWY{kʑ^ʖoͩoNNN_^ xͩʟ½ ¬ &*28AIQYchpszVinflag("')#":9e#"́****:_:::2l[>2h[>5l[>5hP )][##P Y $frgchScre.;pchRealCpchScree3~jucomp166usub16?du66HsetsptabinversemupdateCuwgrflagf40rm1xc2*icolumnDrm5Krm4Pr79Uctrlsoutcharchroutouttrans*}*##"* grflagPARMSintostgrfon*}!"* intostPARMSgrflaggrfoff"7S*##^*##V"\&{P8(%2>'2}2H>O2}2}2+"#"*"!"*4*X~#"X!Z5*T~#"T!dq #q#w :!Fx~# |}}o|g||GMzW!z>'>S))/ ='|x怴gD|OzGKzW!>))}o|gd =Q|tx怴gzy怲W #,259<?DM[]_acegikmoqsu &)-037:AFNU\cgjquxm",1`gRGCHSCNPARMS}setsptchroutPKYicolumn(pchScreepchRealCucom K    K    Z   P CADBH CADBP CADBH CADBA)0@0P##P*=  )(P= T,G0G4G4G0P= >T.2.0G0G4G4G0P= TkjkjP+= 1.1T><.2.0G0G4G4G0YP+= $%1.1T><.2.0G0G4G4G0YP~~~][##~(y #(36;FR`dvlintost|usub16/BNsmu66YrgchScrehPARMSicolumnirowrm1xc1mcolrm1xc2rm5rm4r79f40pchBufctrls~*intostPARMS*intostPARMS#*intostPARMS readyco5 **:_rgchScrepchScreeusub16du66icolumn readyco!A**z6 #**! rgch8p16rgchScreusub16du66=intostwmu66movbaupdateCuX> y2S*FN"Ty(*X.*ZxB *~_/*X*T2S &)2@CPIpchScree 6updateCuLintost#,Foutchar=PARMSVbinverseSP !q#p*"y2x6{6y,**:_}*""a+"#_:{ "v+" :Ž*^*^**:¢*"*#"*:¿* *"x *~_*#2 !+++-`cdefusaxkjmlvwqxkjmlvwqxkjmlvwqjghefonkdDLH@\P`AGHEFCD@6PEAGHEFCD= E;[0= HJY FGK9][#JHJYKFGK!43KJPC P,P `` %][##P*= t/kjyPEF RS-d@dPePKX Y  +][##P f $][##P= v][##  *##" PARMS inflag  !"inflag8 2G ͩXNG*,\ScrepchScreeupdateCuintostrm1xc1PARMSHy """""*"Sx6* ͞:_*"*"-:_*"*"xw* **"*"͞n!N#F*"***x ^#{:_* &*039BFIMQ`dgkqt~ucomp16!mu66\pchScreemovbargchScregrfongrfoffoutcharicolumn>XmcolzpchBufsetspt<#" +{*#""*4QTWZ^jmqw{~ rgchScre8pchScree<Nintostsetatr'0outcharusub16?du66HupdateCugrfonouttranspchRealC grfoffPARMSicolumnDdbinverseJ7 y*"D"Fy**J*D*L*D*R*F*R $+17=pchScreeupdateCu!.:intost'4@PARMSHbinverseC *~t*~Ucy2*F^"y8*>*xR *~_?**2!q#p*"y2x™{™yFC**:_}*""K+"#_:{ "+" :*^W*^W%**:**#"*:"**"x? *~_,*#2#" +^{*#"y*""yž*******#-069BPSY`dnsyz#F##N:##o oO ~yO #K:G#~#NK#^#~7AQY_ex{$)/videoinvideooutpchScree4ucomp16grflagD >7tforII6>F/.{z2!O "[^6#V6#zCC~#] /{*}+c:q#*s#r#w#>[* }P*###s#r#w>]{ʽ>O*ҥ0~¯>w#" x•>O*0~> w#" x½{/f/i/{2-x&>O*0 ~_:-w#" N , , t @@ABCDEGIJKLMNOPQRS      TempHL!TempDE#TempSPtrAvideoin$ ""***TempHLTempDE TempSPtrvideoout *}|`o`pchScree *&}opchScreereadxco.M>!< |/0t#  + INSTALL.SPC INSTALL.DAT!-4>HNNNNNNN[aaaaaaamm|uuu &&&288888IOOO[m|kqq]cc:@@@+11W]lu~\Vd  -       &/=@HM[| pchScreeFk)3y updateCu&\ DX intost3<V#outcharM:setatrrgchScreusub16icolumndu66pchRealCimgrfonbouttransfgrfoffqPARMSbinverse{< *(*#",w{2z*}{+#~g#F##N:z##\ \O ~yO #8:zG#~#N8#^#k$.>FLRehqxvideoinvideooutpchScree!ucomp16grflag1 :<2> "*#~!"):?HOY\`e{$videoinvideoout* pchScreeRr '!readxcoltbad0ltbad03ltbad1ltbad13tforII.C '"!"#!9"A1?*#*!F TempHL!TempDE#TempSPtrAvideoin$ ""***TempHLTempDE TempSPtrvideoout *}|`o`pchScree *&}opchScreereadxco.M>!< |/$4acS!~#"o&^$V*N#"*N#<F#"O* N#FæO* æ##O*  ^#V^#Væ5!5O*  ^#Væ*æ*^#Væ*^æ͸QAO ^#Væ͸dIO ^æSxTOææ"^#VæaÛaO* s#r[qòqO*  ^#Vs#ræ"æ*s#ræ*sæs#ræsæs#ræ~O*!2>curtemp > :curtemp#y*~A ˿w#z videoinvideooutpchScree >videoin >videooutN *|gPD|OzGKzW!>))}o|g5 ="|Ex怴gzy怲W 18>pchScreereadyco#> !w"videoinpchScreevideooutD- """*ͮ"Uxʞ !N#F**ʹP*"*")P*"*"xʞ *+s #"!""""videoinpchScreevideooutltbad0"ltbad03%ltbad1(ltbad13+D% """*ͮ"Uxʞ !N#F**ʹ*"*")}gxo*"*"xʞ *"*"!N#F**ʹr*|}xͮ  !,17;>DHKOScgjnu}setsptvideoin$Vvideooutucomp16! y:)(= tforII"(8u "æ͸͸|g}æ͸)ֆO|æ͸;֐O|g}æ͸R֖O|æ͸æ͸æ͸=æ͸=æC ڮʮæ"W*~#2U~#2V"#:V?o&"[:Uo"Y*WC *[*WC *Y*WY *N #"æ*[*#"J*^#V#"*WC J:U_:V?W*"æ:V@ʺæ͸fֲOv͸t֥O* x/Gy/O ++#~2G+~2**Y *+++r+s*"xw+xw+r+s!w*_^#Vz*"!6!"*6*##^#V"^#V  )"*"!N#F**ʹr*|}xͮ  !,17;>DHKOScgjnu}setsptvideoin$_videooutmu66\ucomp16("&PL}!90) setsptpchScree&mu66*}*##" grflagPARMSgrfon !" grflag grfoffYɎ< <*;*#}P13.$3."?w{2*}{+#~,}0gxosetsptpchScreey:)(= tforII"setsptvideoin$_videooutmu66\ucomp16("&PL}!90) setsptpchScree&mu66*}*##" grflagPARMSgrfon !" grflag grfoffYɎ< <*;*#}P13.$3."?w{2*}{+#~,<+" !N* ^#V*^#~W#"*"!9{PO*+F+~x C1æ*~2++V+^"~!ʤw*_^#Vz˜!"!1Ä"^#V+" *"*"^#V*"!:++æ͸yO xI yO r+sæ͸4O æ͸CֽO* ^#V"r+sæ+ææ)æY æ æ æ æyI æ)æA æ` æ͏ "ææææz/W{/_æz/W{/_æ{æ͸*"" x/Gy/O "æ*" C ʦ""" æx~# $ xw+ / x s#: |})=I )T #=O }o|g||GMzW!z>y >S))ҁ =y |x怴gD|OzGKzW!>))}o|gҶ =£ | x怴gzy怲WȯzW{_ |g}o|g}o|g}o; ͵ æzĔ ͠ ͗ æxWxG l ^za @8 ~l # x) l zĔ zs za {l zs z a s#d ͠ #^ xD ͗ t {a{ _zĔ xʒ ͠ Æ ͗ æ!yʝ ʚ ï Ͳ æ͑ æͣ æͦ æ͎ æͩ æx ^#{Ĕ ͠ ͗ 9 _{:a:*@*?:?;*)@%T9o zo W{_*@*@p~ʦG~2ʦ~#0ʦ~#0O{͟æ:®w#w0w#0"0w#0"÷*Y }wæ~#  æw#  æuiæ=æMæý]t v&o&%pæ!y!w# |͉æ:2:2æ:NҦAjO>NO!~w ʦw ʦ#ö>A2!$ æ"næ!$   ##s#r w#6JJ*r ##~#foN#F*v  ^#V s#r w*r ^#V##~d*v  ~###w#6*r ^#V##~!œ*p "| *r T] £*v F##NñG^#VOp#6#q#6*r  ~6++^#V]͉*r  ~>(>-*| w#"| *r  ~===b==M&*| *p C & *r ^#V Kѷ¬-¬+~ì*| 6$#"| *r  6#6*r  ^#V*v  N#F*| G*p -ʌ(¬]¬*p {OT] ʪw#ß+*p ~(>)ʺ> Y *r  s++~!ڜw*v  ^#Vz!œ*r  ~##NG =y0B/M, CP/M 2.0 required. $  MICROSOFT MULTIPLAN  Version 1.04 (C) Copyright Microsoft Corporation 1981$*,!,N#F# xʥ!~#~# Ò!*,!,^#V#",",*Y ",*,Y " '*,!,^#V#",͏ KB* '*," '*,5"" '*,*,<&*,MD*,*,$ ! xM" #^#V#* '+r+s"x ^#V#* '+r+s5"o&6 !+")+2)q#p#<2) p"-"F" ʅ" "! ʹ" ʹ"w# ˜" " ª""6 # ¹" " "" # "q#p#:)<2) " ""}])6FVj % D 9 g <  ~ ~  BF>͸y2s yO! ^#V!:s ʀ ++æ)͑ t xC Ҧ / $ Ä ":s _!Ä*s#r#*D|gs#r#6#xwæ~! w*_^#Vz !"!Ä"^#V+" "*"*"1yʦæ͝ x4 ~ ~ʝ \A44_#~:4#~4 ^ 4~^#^– ~#^ʖ @_  _o xʶ ^# è   ^~ 2 e#s#r"# Rͼ4:4H`P*!$ >2Pæ%t \Moy?!!:PL7>2\t >2\t >2\t !~w{!~G ҟ/<Nwy+’22! ͩ!::2I'~4Q~w']!~+ ͐ >HGy'!FwxQ!~P#7'w#3~4~?Q+6!'#R!7>O'#f~w!>'?w#‚!P~w#™B —ɷOT] >O+Gw+yWB~w+ !>:$GO AH5*p *r  N 5Ü*r  N   ͠ 6Kt y2z "t ! V#nڊ{{<}y_ÛY}}{=_{=! V#nyBM~ *t w#6.#w#6E#+y-/?\# L>  j!]6?!^ ̈́w# „̓4! s#r^!"̓4*ͩ͞!x}ʴ*#"~, *æ̓4yx^'G!OxG~G@#yQx@w6#w!+w+@ͥ!$Qͥ!T|ʋnQu!6 h#~+w!'w#® «:aG!~OxG~G@yQxAwȱ6#w!~#""x2!#**:7 G>'w#'~?w:"GQN4yOxG>_!͓x ­ʞҭ!~˜+}x2 nͣ1t !9" AM"r >+V+^=ºgxѻyѻl?hD` )"x ^#V+z?O*r w!y~#fo ###<  6#6!?*x * "v }]|]goÜN#yҺwy{ʭ+ÜN#^P*v ͣ|w##*v  ^#V r+sM w##My*v  ^#V r+s"~ "|  ~#~=*~ ~#~=8*)Y ")")" *u))*)Y ""*6++")*)*g))"'*)**)s#r#*)s#r#####*)++"):)ʻ%*)#))")!)H(ʓ%N* *)*)s#r#")*)s#r#*))")!)5y%*)s#r*g)*)*)C &%  intersecting segments- unable to load program $O 'Y " '!W&[<&*)+,/ #x ^#V#^#V* 'r+s<&'''#'''2'9'<'B'E'H'K'R'U'X'['^'i'l'o'u'y'}'''''''''''''''''''''('''':(A(E(M(P(X([(_(d(l(p(t(x((((((((((((++++++++++++ T!w ,6,*ͪXRͩ!a!a!a!a!a!a!a!æ! ~ym">2yҧ! Ð"~#fo"7*!^#Vr+s2#  : #~+:~\A<##". #"! w!w!!w#w#w~\ G!.H*L?E>2#">2>?SHa_!" MP OVR  #p*%@w#!z|#}!O!yM+@Q">2P.+xG,*|h!""z=!!>^#V#DM<ڜ`i ¹>@2 y񇇇ww+z“!""|2>\>\!f!~FAM2)!"*)*)!Ä#s x/(*)N#F#")H(x ^(H(x k(S(b(s(w#o(s(:(‡(͒!"(>=2(*(~#"(!(ͬ(!((ͬ(Fwp# ¬(vX@CUSUB16S@SDU66f@RMU66R@#OPENFTcOK@READFJT@CLOSEFS@FNLOADmZ OPENMP80 /x FCBS1 FCBS2 FCBCNT FCBCUR !FCBRND $FCBSIZT \DEFF1 l error - no load file present $ error - loader file format error $ error - invalid load file $ error - no data file present $ error - data file format error $ error - invalid data file $ error - dat/:0:0:02l[>2hc[>5lc[>5hty2=3*/F83">3 tB3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j"0S) 88fdHrbi%0Y\~9y>wsO <   ! $ J$R$""8#H$ # rUcaV,Ax T *zUvxT*zTvVa}.rU3x7T;*z|$-Xo ,UQdu/w0oTe&)J5e&UUTf&UdTtTsU}Z&X&8 NXo    V$ \ݺ`_$p_$ֳ_R`TTb\AcZAZAQUXAP"(a file format error $ RCFUNCHV GSFUNCU RVFUNC REFUNCU SEFUNC OPFUNCX CLFUNCW DLFUNCU RSFUNCV WSFUNCp` MFFUNC Z RNFUNC LVFUNCX CDFUNCNY SDFUNC GAFUNC WPFUNC GVFUNC FAFUNC GPFUNC UCFUNC !RRFUNCKP 02$,-///00111222^34 4!44*0*/z,6 #,*/-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3L3R3X3Z3\324G 4Xʬ3G**4}ʬ3:4_~ʒ3ʒ3#####À3##~24#N#~~3Xʬ3WY{33Ҽ33343ʬ3ʬ3ʬ3_ü3 xc343l34 4*04##"*4.4lg24[CADBH4P LMh [CADB!"*4">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3$>3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j !-37:>ADHLU[^behmv 4Db+dBAUc$'*U׬*r*x8ed\Adgc((ey}T_77a}+eB_bc*x*SSTTa&dׯ} Ve&cT5,(օ*h $g  A}   d e fc}j TcTk RMP5R cT+Al[圖`d'$hi   [[eTTTTS$Te$$US!eTdTTTTTg T0QjT/ j U__>_TSTd g e}$ȳ(R :T_iQ@_i_z_}4s-eeAv t&wx&Dzu+&Ta&*BAx}%(US Ua-* -Ê- - -͋2"/*//T-/V-"/*//:}0_P/ek!i-"g-"i-*/͊-"/+^~#--͌1-L..|.-$..---;....~##ʾ.2m-~#"k-ү-_͌1:m-=*k-Ð--րO!n- ^#V.Gxʥ- -*g-~-.*g-^_͌1#"g-å-*g-4#4å-*g-~`w#~`wå-.O.^xʥ-͌1 .*g-F#Np+qå-.O.Gy*g-Nҥ-ywå-*g-~..*g-wå-.0!.~c._͌1q.# yV.X͌1å-# yʥ-~[..0!.~[..0!.~[.*g-~GOxwå-.O.Gy*g-Nڥ-ywå-*k-~#"k-!m-5*g-~#"g-!.d.q .#q#w .:.!.B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3(G%,/8;?DIORVY\`cjow~  (KUZ"/47<GJOZftxCVbm|QXaouPi3K7 DS"y(t  '+.28;EILPSWflsyv#oA~*. &)2@CPI 6L#,F=XZ\^`V:v8rUS  'b\AcyXAyUyTUUCBA &Pw:M`x q    . D X g           &:#@$ "p! " "" ##!$"t!$#r!!#""D$ B$A!"##"J$H$ %Ta! :RRT}*'VUW!2G(2FTv+2@p2EToT1%/QPQ*QX/QPQ6"YQb]//QPQb\:aT#Q */QPQAQ\Ta0/QPQBQף3I }Q !QBQBQ [*QR+ Fɽ4x~# /|}}o|g||GMzW!z>:/>S))B/ =:/|x怴gD|OzGKzW!>))}o|gw/ =d/|ʇ/x怴gzy怲Wɒ//W*/}µ/*/##"/*/͊-ɹ///!+++-*/}/!"/*/͊-//*0##^*0##V"}0\&{P60(#020>'20/}20F0>O20/}20/}20+!/"0#"0*/"0!/"0*0Ê-u0000 [?7h[P*0Ê-00"000"/:0010"/81*0*/*//*//:}0_P-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*B3͊-*>3-2=3B3Xb$j">3-y3*B3͊-3*D3͊-x,3 */~_ͷ03*,#|+/8=FBETZagwd]p /lt( &)/6:DIOU[cm#1RV\bhnu{Au O2._kx ,eq~#`iqx}?C8<G( $'.5<HQTWZko x}eq~#`iqx}?C8<G(<WUQC(WU/QPQ'Q!&!"bU!$aQb Qca!%QdaWT@6XeFfEgyy f!U\ *'VUW@f3eUTh "A AAhA 1} g  , &AffTPAyTTTATTT-@T6X_++Me+Lf+Jg+Kh+Ei+Fj+A_*X*_&*_' *_( _)RkSlQ@mSn _Q+yRS_|A(_)(_|*T _ _ k l| _ k l__"+G_$T_!T_ _ע_,:,_%_}_ U_%_  UT_#"U#+GUU_! +Ay!}yT_RS_|y&___|eTA _ 뇳,_}__T_$_#먳#} _$m#n| _ ףȳC}g_) mnTITD)0-*(()*&&(* #)))|y m n kl&(%*HRɀR̀X*%R'(%R%R&)%RȀ4'R&(%!!xuQ#UTQ V* _< _&|S+ATQ WTQ Q X**'}}__ _ TB! ײ_*(%R̀* _%Q     "!"A!#8#""" #" $0$" !#"".$" ""#@$D$B$"R$ T U WYY@2y+y 7AeJyLy@T!y!yeA)AfA)yA<y a  !UT !UT ! ! !UT !UT0T!yd A)AB#y !cW.XYc !@T@DeTf@J@2+RoT/,5Ie @D00h IVh>g|BTg2+eDBuAq)AfBUehLgBI ! Ak h KgD;jTi / ( I  I I? |,|(|$| |||+&,:| %&#/ղe$.ղba./ճc1aA#0AdABWL1U/ :}Tqr'*+TTT.r/q$)K)JTu#x*T)L)Ma*Tb*aT*x}*x)E')F*+'*T&)K)Jt&$s%T$%r'+$*U&t&Q$ײs%T$%r)@pc+'*U&)G)Ft&Q>#ײs%T#%q)G될+'*U/t&#s%T#%q*+'#U)@Q$)@)Er+)@*T'TaT'״u$)E'r۰)GQ>#qQ>#q+')GT*T3)L)Ma*xTb*aT}*x*)F*x#0 @~ UH ($    @| V R!   RUT  T;73FK  | ;nB~*6z XIXzUf|N XU= ,TTdeIk6Iu6Jx *fWi~'f /f i~ X'o   e W |2  |  UUd WUeyIi~ *ՁfUi~'fUi~~!#U~w J VF__' 5IQ }_* 5}' 5I췜 Q(* 5I췛 Q) ,*6@*}Tj_ _+GQ? ____b^(%*RˀR̀*)%Rʀ(%VU_Q *+A TVTQ V*Q V* __! _}_T μ}%:}ּ~.!&:52붆RˀR̀* _LQ *}otTTUT /2Mc2Fd( g: c}2J+2Ee(2Lײfowo%+()!!TP%UT\$T Q?3I! 0gk3i(%BTkB |EVWfk~3IkL| IQ Q_?} 멵g   @3DAIeQdzU@D@ @DAeTT@T cT !MZx*I!*x}065Id5J e IQ e}|f6yT(Ǥ(7y(vz(vU@0 0Ii T e0j i e j}e|Dg65 I5 J  U- AEURv!U D- fAEU9XUmIJ Tm2zzKL Tm+zz- f e /,5K׵l  AEdeccae}Taz IQ 88Ha| caQ,?@D |2'Ee|+'Fe.$b)F*q+'*TTab- Sv}*C_HSzv c  ( n  1 |          '     '                       !"^"8#"!""""" "# #"!" ""~!"""!!"##" $.$&"!\"!"I!&5*}I}IQ: JI}5'a7b770 Q7b|Ic:5׾?Q. IIQ.}f YIcaI JDZa|}!&a J! 4zd oUe6Iu6JxIi~ V(%$2"%0 (|% )|# ,| -| '|( V7I 2 V %|+ AlVi ! %0WiU!Vi g,T f~bV XIXzTf~L'~DWif  |'f| 6|WiU~  |*fWi|Wif|Wi*Յ|'fWi| V) Tw%Vv|!9| )_h~uA)U~b -U~Y~ [5Ƹ T  ZQ(Q- ?    1 գ9 5Ɛ  T| T嬆 Q@lUmQ1zGlmTQ0 > ? TQ. ? jT#Q0 > ?}QE ?TQ- lQ+ ?^0^:0 ?|25Ɛ mT  k|kTz| Q*k| !k取IQ- k IQ(Q)| [Q%Q ?hk +.Q# Q# *U%i!j!f Ut!pWf h  h g.0XQ *| UQ U* T#UQ W+XQ | UQ Uݫ U+Uݫ|WQ .ZQ e eA )AATU@1QT1pzz1\zz$.z!x!|!R@T sR QT$Ae$Afih R%c h%sTjIQ Rj hIQRIQg Q` Q` a#` #^Yh [%d%O Q`% JQ  Q %szQ ei}h ,KW X$!~!! Ts$Tr&tT'V%QTrUrUsTrQtQ,(Vע'Vׅ(V;)bTw5UcwUwTQ bc %RU$QaRU$Q aQYUT>BLVk{(kI}|\I I!&a|Ia|?I}Q >cQ }aI=|Q< <IQ }~(*վ?Qz_P5fo 512Th  j IQ@l_^ K^fQ:?Q ? I  IRz56 z JQ UTw  Eg|5 KgQ  zk I . M ZI D I5n mT5 6 z Ni  פ Ng z| 6 J6 Ig  5 @Lg fQ z~5,o 5cQ(zQ cQ)zծQ(5׮Q)5Q(bQ z5c:Q Q)0I=.MZfTg '} DTg| gDg ZIh8.w* z*xT#Wi((v~((vpWy { AeIAy6AIu Jx|/C{W'*T^h ,UTy6 Iu6 JxI'y0Vg d|*d|d| Ug5Q 5de!1Vf22e} . X'TU /LcTb6IdIQ@h iK df Q 5:zi/J5ֱ d/KUTgUTv/K Geo 0! tTd }0Tl6Id6Je5n3"7yT3*_3!mUzJhy tsrt38hD'1(ǓTT!UQ(iD ״DyTzUUl:ǓTQ"i IQ Qd  5 TzTyU}Qj|Q j  " h. ZQ *  0eT5g A! AdA)s%-sBWLU%Ue}TG%UC$U>hLiBI !# Aj h Ki fT j: f}T yT0 e d eb| eפ.T#0AdTQ+?| TQ-?ay ^ 0;<=zU HeH`Q@dAcQ0cy![&Z&T&Y&V&TT%'Q  $U#T0cT&babQ 0*%'aS},,aTo v")2;@ENWur04Sq'/7I_    $   0bT >}T I>T} UT@c!>e>fQeQfT}U Q 0f?}UTQAQZUTQaQzUTQ0Q9UTUTQ QUTR!R!R!Q.Q_UT5A a}  $^^P n-?$C`}      ""!!! #!#$\""""")Eu)Fxts4(4,4(321/@, 12ޣ '}DdeI'}Ie| eTe$@1Q cI=.zg DZ+ Ih Q 5 I|5Q=o yU g}TDeIIh5 I!}TT!1V%5+T#Q 12+* ,dTe1cI fKd6I6Iz zLd}o0TdTeIk6Iu6Jx*fWi 'f iIk QnJm*'ǐ VWi!o 'o!To/.Zo'!o)!R8Q% V U"#h T"#h o(Q"# !;?|Rh|Rh| RhRh!K 2.*4" @|~?=~:?~5B~0 X  <QjT5z >iQ  5yT&y  |#& Ȥ$ &tz & tU &U$TU  F ؙT #|/{kTUk3%Ɛ yATTk Ay Q$ASyUTbTcQ7:Ib}SbTcQ7bTTI7Ic}'*'դ'7z'xQ7z 7cI}IQIdI c71& :Iz}05d*eUIXz T#*x0Ty*'LaTUYa+12סQTUy5*d+* +oIzUX J+cTT7IeAd TdTc5h5A *A *xP= *T#T5*q Q *!1Vb22a}%!o!o!o0Eo 0Fo@!3;!!!H!o!o0E-0F!!-!T4IJ.`q'= %         A!##"&8#"#""" "#" ""<$.$"6###  mIncLnLcB !Aj c KnI BIB!Ak! Bj,? @ A@aQ ? AFVl A a-? dg ~R >f@fO j5w3u1-oK95416-85:<4">V􌂿Ԙ887JVdAzBy~AՅ:yQQ%Q)Az:y|0 BVe|Q XVeIQ k """#"""" QcI$$J$cIJIcQ?dK))L)dKLKdR*yQ*yQ Q?0 5eSe-R*ytAp(Ad%BsfLgBI 'Ah f KgB%$*Q`& ǧQ@*y &*{z& tI*y Q`Q`R*y *Q*y &UT&tGQP| X#J glS          #A!#"#*###&(#&##"" " "<$ "#HPTh_uTy-mTkw(o S_UjUvx5 Q(U**I_~*x_Q ~ ~'Q'uy 8z)z(zVbeSf}}z@IQ52T TyUyIQ5+I;z:Q9dQ0z Q1zUP=Uy}d;Q0}yT 叛| 3Ƙ UdgTb f*IQ0*x}*ITd *I?*x}*IQ.*x /b*x}*I  -*x}*h*IQQE;Tc*xTe*I+Ue*x*IT*h*I^*xIQ0c}ׁbQ@R xT ?@QT z U -o ,o N [!Rb          .#""D$@$#B$"#,#<$.$""0$"#"8##6# "0&e-.d}&'Utu &g'd-&'f- U-&e &T' &c'fe''Tc} tu PTh-gTj\8Y4!f ,A Uh|K-U XgXf Xjf}Ti Ui j T "\ Z ' |  ' 3  z T$5AAd$[ 5:AP=} @hQXhIVj eTT T,.f.gV ,  ,A,ֻ yI FQUT  @ k  0d2"KeALfAP=d}0@d/eWT@TQ@,,dA@@e/W.c,!AFV6Q a|QR?>QC Te|>i>nTePh Q Q? 55Ha|u Q QR? Qصa Q? QC? Q@صa|Q|p.2>^Ij  IaQ(?|XTQ-?Qa\e|Q"?>eRR ac:y|667I?| Q,VdAz~x0,?Q-Q+?-? cIJQ KLQ>|QR?>II Q:?I창IJQ> QC(#y _(x)wm3a~! !!R>_~Qk@U%0, ~2A^bSg ll)QwGR )@g} T2^W )yRk| OE !HAkCx Q@)Ec*)yUy1*I  b~}*I*IQQQא*J b~[*x*I*x}*_*IQ(3Q ?Q\Tg!lVbWP=~'VumEr1l!j!Ii> Tl}Q?1^߾?y yyTh ƀkJj*xIQ }*IQ)STf|Tg"^(M+ x*Ix|'QUg*IUy QQ  Q6Q8?|l 5Q?b|X'Vu|Q>?|MQV?:n*I*I5*xI?}*xz|&! 66HU~Uy6HxQ?Q?Q??Tj|%)h,*I=!|3<|Q4?QIQa| Q  a|$|IzzJzzIJ )w~>_>lPeQQ? !hQz|TzQz| 1UzTH| 1bzQ:Q? TzQ>z| /yzT| /zQ? Q  ~xR)yQ)y~i)Q njw GR @@ yRy#Fc>e Fd>l@{:VVֳezx Q x)QwQ)yU ~|QbTfQ>iTg  UzUFz?I 8 I| hQ_YT3 ~UxSo 5.Th_RS}R~,TTmUhUlTm7j6k2n0_T_U_|Um6j7k0n2_U20_0_!eT y A~T y A~A븖LbIfB !Ag b Kf!oi*.*Tl*Ȼ i' f.'*$Th B #5 T#5*@ ! V%YT_%1p$1\ݐ _'I_L;g Iʴ/c X d IA_/yT ȻT/Acz' ȻA)첮UxTheU P=~eU P=~0.-Tl,o ,T1QRϡUT_8u & '-'T2b2b$AE2b}T /ax2装*A>f@f .","* &V|Ac潽|aIa}/)dLaIxB*a| 00a2eaKxAI*a}vT TccV}2ֳb 2c$r$TeTeV dV}@Sy,e/',yA@@f  @TU,ye}T `SySg.i ,I .y AFVj B A A@ U T  h Bg .y i} SySyT@JGm$_    @? ? ?P *YN* ~|lVgTbl!fif X g i}d}bTy|. Q zVx|xRyQyU ~>|:VϘ)Q njw GRGQ@Ex @@ yW& GQ@ Ex|PA8 RyT QbQrTQf取Qb QfUy|! |Ec EdIbIxIz|L9Ƹ)Q|<>my y*yI@[TUh|!>b*ǫ*){z*KaQ@)wy~/R؍*U0*z*v/*YU*)7XxQ )y@$1TQ-?QQ"?d 5I5II.eIIeIddk*IQQ%*J 'deg@*JfTgQh5 i hjf   Q? ? zWQ  ? ?zY TgQcQ?dQRUTeQcQ>d뜐*JUg*xQ>dQc*I52!֤ TfTcQfTdQ@f QQ??zTbTc*I/ *xI+Ub*xTc*I05*x Tc*I^*IQ0c5*x}5`f>Ay>Ay>Ay>Ay}0JIIJ LKKLT>>쳿? ???U TefxqVcVdIIJJKLǢLKգKKBLL;IJǢ4JIա-:z,C5WUUh ~I Q Th -*!eTs%2!Tr$0A B늲$r}%s}Tosrv UTo! QQ@ @VTUWTb!@3Xv%(E1%(@+$c(F$r$(G TU$r}r|$(F $(GTU}U!UUT  !Iz\\!Ic!brz"; D_ /M $#$""8#$,$$#"#"" #$$" "$ 1!Q1o3 .dVdA-}-U'a'bU-VcA 'c}Ab}-c-d&'%<           "!4$6$2$" "\"""#"##"! #" "#"#!.$0$#"# #8#! ""~!""^"!H$:$Q3(Ca(!Zo*!v! .)bTwUwQ T"#a>b>c!/d)#5Bդ 5DbIQa|JL\a5C !!Uo o5CUTo#UTo5BoQ.!+YU$Uo"#UTo-a5BUTo -&'#cIbQVz딱aT)#J#L Q()Su!0954;7%/ @90'A@@f'u0'!Tu9'SS9<0A@AT*2{Ry62yU SsTfI5J/3 *o Ih!UfXc b W K z z J z10TuNWS<8G02@7'쳆"1%AFV @g% s1%01%B'T.7'%SSA0Tt@fRa6e!!Ǒ*&&,( @8U&tTt8U&R8$U8Sb'S0'cA@b@%S1%cAFVdA+%#SSb&!&EBCTo062hTi2y5AdIe3Tg!!f*g @''@ T fTQ-?Q e f|Td\ T:Qz}TURMP촆 TQQ 5UTe2c1SAA!2פ|: )  |!쵉) ! A@@bc}5Q녱Q7BaIQQ T_IzU坊Q 3@%o s,RMP| ,URSLRVCb%C\T_r>rzTRTQ 淗Q+嫊Q52c1A!Tdc}h,Q*5/UUwTw5URRMP촉UQRMP嫉Q5#UpQ쭪TbTa\?pQI1\)Q:pQ}\}5UURMPUbB  #y#@[#B #C#Bc##Ba#B#Cb}#Ay #D#Q?U#y##Ba7Q#y}:M#B#y#DQ=Q# b}B^#(~         "$##$""F$""#""W$.6BIa.I[d/eIIbKKc% JJLL eda}U.zK/z.zM0z.z.W$d6Bo2/eKbzMczcbQ? QTQ zz.UT gTe:I< IKc KMdhTf:I Iz I0UkAUTy|T | I;U|/Tl%s~Th'u~   || xvt/wo us5Bv5Dt5Cx*YTtWx|*Y*x&T&QQ V5BXZQT0T2Y4 J_ { !"$$$$"$#""`$y6By6Cy6DyATATAAAA ATAQ TU@${eB{f6C{gTT T     ֣Q TURQ?eUQTQ>;(f)4A )KK)URT|KKzf},ղd-aT%!kWU-ǬJ>e|!jI Ij f ?2*x @@|VeQ"?Q" z| 3, V 62*2T#*y  c 0 S!!!oQR?!!'cQC?/!(X0JfQ UTo dTT! % /2yT%TAhIXz 6 e*  *x* 3)z y UV0!!$?U+!%?)oTw+!.UTTMZ!vQ:6o "!&SoQ;,WUa,WTo>;73. +'# @||1V|*.U|$, |- (IQ(v}Q=w(Ko#}q$&M^     #:#""#"".$#"&#"$ (#"$!$#""##$$$#""""$$$$ $$$$0$#$PTQTU@UTRbRRR Q\UQTQooc01^Q*עײxo+o*o)o(o'o3%Q3$QRo#o"Ta\6XQTb:X}3V}3Q?o ooX6o,tvo oo o!sooo2o2w2o2o2o o2o2ob2 2uT;R֬1Rdc%!&IeI IIT QTd}R2STURQ!!01^$HI  h} g}Ut.  T_Tv)_*_'_JIjLKkJInLK_J lL mT_  VV   QQ?Q 5,-Us5 QޤU_T_Ih J~Ki L~ I K~ IUT_ KUT_T f UT|TUT~T g UT| TUT~i w xT_IK ִd)A%/AcIBL_0ALQ9~)*e~A/AA)_U_AUTyAT_5*  T__|QTswxuBnIVILU_L_|ILV LT_Z_T=A_y_4--T +TQ@QfUQ>TQS55Q>>eQ?T5:z}(g )+ A K K ) 뺩| K K z g}-ղd,뱠'#WUT,׬,,T +T QQ?Qg Q# i ,ղh  iAQ h}}-e-,ժTQTQ>7(f)0A %K\)URT|KKzf},ղdSǬT+T Q?Qh  Q?i  e, 멊Q }},f,j- TQ>TQP55Q?e T5ez}(g )' A  Kp ) ǩ| K K  "#"<$#" TQ TQ?Q 'Ec'Fdqv# #'@p T Vc(('G T('Gd'E'F$T >cQQ TzVUA%AA&Q+UT^):#$#$"#####H$F$ """"$#""(#&#>$#! """"""#J$$Tc5aUUTz1/WzTz2zTb&d5Xe5X7KzLz6fAPKJAJǡ9Jȡ1IJzKzMzAFFTAVTUc|?|;LMWTJɡ*J]͡"OLzJHEAE CUc}IUtTs5xT*z1/W*zT*Q*װ*!+TT!*!)!(!'!T3%Q3$QR!#!"Tb\6XQTX3V}3Q?T.!+&(-!! !!%!!!!2װ)2װ!2װ!2װ,2װ!!2װ!2װ'2װ2'2ׯ1Rc0!&IdIIc}pTURMPU쳚QVTb\Q5 QT}q T>U}T%0TTd!-/2R/Q@5Q5! !Q@@@ed}ƧU8:p0?do"`W*IT Ɩg|g (#/AcI VzVy| VzyUȻT1Ij_y_A)_BIC_| VA_)*UAI.Á g~f~[~)~wxuTsBjt       " "B$"D$$@$#"#"<$"#"#$""UoU,#cTb:IIJKLc}PTkTl'_%_-_/6~ThiNJIH|P*_(_&_Q>UiQUh  Th\ Y!!T j UUo /Uw| 0մb2մdu'~r/6 Q~cTk U''fs%~> T%'%f8 z g}-ղdUT׬ T+T pjkhT UT| UT ,i j k h}hQ@ _g-gTxQsuQ>tVTQQ>TUTg5G 55| 55G5 T(h )R A G ( K! K KH z| K K z| K K K z| 84# h})eTf-8   | ,e}+THR ,ժxQsTuQ>tVQTQ>T(i )S A H# K Σ K z| K K|! K K K z| K֣ K3 i})  z2*zTb&4aIAYXzTUVU%TUz}Q?a T3az}TooTo#o"SooToSo yT*yT*T6 U62Q(^\o$TooXoTo Vo!Uoo0o0uT'y0owo Uo&0ov0o!+o -UQdo%RL$3YNp&n !   # "<$ $T$V$,%R$ # "#X$%aIQ\,VQ*T_Iz/U,p5\T_o)oz.0VTWTo 'o6 Sx+uTt|OD,,4\ݺ`xURRMPU Sx5QSx|UtUv TvTt6T+uSxTt/T} TT #TU#DT#A塍TqQTTqU#F6#A#@圖#A##CbRQ z TrQx( Ir Jx2c0Kbc}0d!Tce:AE e}d}!f!&AFg VA@be ge}f}!bTc! Td!A !AeT}}@LlBO$IA_2n AUKjlIIj j >m@m  h'j hV ~Uk~Vk~ \k~Ik~VkIzzJzzIQ QzQz| IzKz|Xk|VkIfJi Ph f  hQ Q?Q TzQn|vz Q? TzQ>z| zJL|^뉐 QfQ?hQz|$IJIfQfKLK hQ?hTiT Qif T Q@i hz z| l j~ k >b >c >d Ie(WUoUsTs  (V$j f g (V j h i? ? ? z Qz@y,"'&-(W)PIzzKz"z__ j}oj HIk J9KlL- h ! A1 Ai AQ+ BW LQ4 }μ }W j}DCIQ5&7|21 CIp __T__Q X_U___CI;C_SCIVQX__TzVWU"_ XCI>mQdm!!- xCI*xzD*kx*xQ.*6xS(, @Ue!D+RX @* Eg+R V  T z V۫U3fe}]Q:Q 0VTcT#T'#aIdQ\5BbIcQ "P.z       ":#$ #""#$ #aT+Q +U-,VTW쯧Tt('z)'zb7Ac16X6XQd7A dT7}**x|(bɬȬǬʫɫȫ*ʠ*Wx|*ǡx6*Xu'Nv'Ow'GT'FQ?'@T'EQ*TTT믯xu7MXo 'Jo 'GT <96TTT-,VUW#a5Bb5CcT+Q TQ TQ>Q 6Xdzz*vwTQa#bT ++UQ 7cA5CQ--,VTW5CUT@Dg5Af *f *q T+0e j   Vj AU2 y}TgTh :  Az}WTQ> T-k 0# A  K K  KI z k}Th F  Ig |6 T 2 ` T2`   I?z z}Uo0VaUdV d}dVUBeAyyd}@Aef%AA  yb~ 0UTjUnmA..Ah Bk Lf d B I ,A_Kfd WTmA(.Ai Bl Lg e B I,3geW Tn UTT V V UTVT WWUII  UTWT U+UUf g.UT>>=| ,),Iy(U(V4,)֡.,*&&-"(U %,,)yU1,eT)eK|(V1./ !)P=T@&-, '(W+(U(V3&+֡-&),%'!(U %&&+yU/&u+eP=|(V/! 1.+tTT&qz- ^            "# <$$B$$$$# " "# D$@$$$$$$#$#  TURMPUQTRcRRRQ\QTQouRooooo+T\T_&2&z Uo 0IUiI IdK KeTgfh 3Jf Lg#֐J J֐*֐L LօU ib h}7V $TTkSb,f2~+,gAFVA@dB*SBBbUh2Bi? 7Th| Th EjA Uz X|* W  0V-V 0V-V%Q|QQ8 Q Lm n| mn0VTmT#AF/|X, f.cA LlA Kec}5U.פUk|+Q6Q:r ^A@Tm T#믢뫅매Qf~ .g Kb A L hA .פ4 g}$ ef5 {  #c5Bdc#dT++U 7ATU#aT+Q Tt6XbAUTcKJWLMYQ(볯\SUTETTFT#a'K'J'Eb'ET'AXVQQ UT5BUTU@L'Mb'Fc d: b}'FT'GQ][Q?Q TMUTU `+\QTt7+g   z *h *UT 'i( z) z+ox6*Xu A' E'y'y F'y'y-,VTW#a5Bb'K'Jc+d\QT'AXVע T'G'FנQ('EQ'FQ?Q TTT\'L'Mef'Fg4} UT TUTT 5Cb5BaYTbWa|YaTQQ UUutv#w#aW1ۡQ 1Q)x#c5Ba5CbW1ۡ'Q)TQ> Q>Q d6:z}*Ux*xTc6bQ?IIUzIz}(\e  & 0% #<%#$ .%$:#,%#R$##""#6%":%"8%F%H%" Tg/URSLRVCkTooToToTooTo5QTtTxTlUR 7Q&*0cdTQE^Ul|.QE2Ay)Q?^Td})R}2@t2Bx)f0w0)0/U^ g)-TTo1h .- AFj VoUPiI IfK KgUwTlh h~% Ij J~ Kk L~7 QTwTl  ֱmT_T_Wn ! '!R ' V>!_X_L_IV!R_:)_nA T*VT!(!_|>1A_L 0B*A)oAQbT_zT#T 5BT5CW5DU5E5D5B֡#5CQQ #o5Bt5Cx5Do 5Eu5Ba>bQQ Tc7z#I6#5CUTv5DUTw (UT )UT@6IeTg6fe fb} T_)X_(-- 7V坌Q=~zQiTkQ>jTl6    6I/ Ǵb.ǴdT, m cA0A_BWL m}b}T# ճm eA1L .m([fT h: e}*d`][Q(TTUT'FUUTTUV'EUT6xXuTUTWT"T6*-,VTWUbc+7dA  AcTb}bec+%7,  | 9> VV}+6X6XQ}+oH plNS[`ejou      "!"""""!%! !! % &nUx'i)j(k%l62.5^TaTcToUmlR %dTRRHPURe TxQ U0SQ |kQeTfMUg V_J,%da0cUa/$/b| cUTb|.UTb f e}8 A@f i j I J K L\ i} h}.16S3 ToXu'No'Oo g~' AcTgTf>eQ }+Ug>ed^Q0f>e}Ty yU0Te$)wIdTTz^)w?}-(aaI^)}-v)5 )(w)()-)(* (*v&tQx}*(xp>8m                A!@%@$:%"B$""$6%"8%D$>% ##H%F%$"" ""$,%"!" "#5oQQ?_2!~_!V%*_TxTU xډ f6Xףf`TM6TRRMPT>RR4-Q-e-#I: T6JjVׅ|VׅQe}תU6Q!#@21TTS2f@A@ 5Ab>d12@ T&e21 5Ag>iTk QUkXi   #,lmhAFj j 'hm} Z $#aIcQ\T_##z5BaIbQQ\$QX'5C5DUTU.UopS_2a12_C1t_Q UzXCI lQ D_CIUbIJ\KLVIInKK_ICzIj <JQ LQ?Q 6}d}( e T}ǡd} c*Q |Ͽ} |TRRPRQ  eTUy(: m c0A&0Aֵ_R QT_7A g 7 h*n ` nT} f f}}Ū(-(`^&Tg),Q +ʰj  hQ VUi VTQ Vװ }^k   Ag, lTmR ^'&װQ +) WTQ Q X( nj L _(9T_A0Aֵ_R T__ޣIQ }Q n }^ }s }[뇰 F\T,Qc!!VTW3VUUTUThUU mU}笫t62.5^ vs u wUTxoTT%-2XaabTcTeMbQȠQ$ Q 1*|@Ue|,d1QPUTe`dUdQ *T#c}dQ 1*}Q 1*QaV+abbg ji|Vb  TiQj gf5}-t'o /w  V~^.(UT_T_Q hQ b  oVb  o!!c5A1!AdB%To.(UbILbA_B !~)X_b [_b~[UT_)R ZW_5}yW_U_!b)IT췖*T_IV_T_Q/L)66IT1z\T|.(c \T&)0dȻz|?d_}) Q#2/Rh__}Q*_QQ?TU  [_b~%~&TLTTTm)T_|U_| .(c..((X|5}.(|뒤| ) |랤"[ QUTU T2oI^}~Qc o Qc v2I BFI%N+W\TZd|WdVdUd2JQ;2J^\2JQD[\2JENU\YX]Ts2aI^V>Q;NIQ;|FTcIA! K   W|&ccIQAbIQ }%Us21y}%U؍21ATUQUTUQ?UTW+ۡ Q +ۢUTAb*$$'I}bQ ^}RV%!RY%!R\%QD!!!0^!g ,9R_% A'Z \ A3 A | A3 A Rc%Rf% K^ g}QB+2^Tk k&/ hRi% AEV A@ Rn%^},a'_/TK__}Tc+Tb:2A(AdB_IL_An'_AzTTT0mLAdA_U___L:2?<A1(A_B#_ImA_U}T_}}O}F-f(5A@l@_@T IRq%ȰRv%@^f}!e-xAFVA@_Ry%-BfNA@R~%'_A  l @.@2 eT1*Tf [Q$KQR79 77 9S!S! Q*Tv/1TQ*1"8Ơ8R * [SS T1T\,V8ưaTTTeTQe1fTfT fT֬ z@z   56U5 5 6 6 U[55 6 T STv/1TQ*33S"(/BT^""UqSTq0r& &&   &% & @$"& &"D$%"#""&""&,%B$ #"QQ?c5 Q TU &!;&tIb^!V%.dTo ( o  />|!5^}#CQ:5KQ/ S^&t}&te-F T W |~^}5o oTab QQ@a}&taQ?5aTQ5&tI"(6+3l10i.-,+*)('&%@"|ZQVz^Qaz6}10cT&tQ-z^RxsoTwST%z6}Q510@5To uTo$'*'D G #LR||Xu|Wu|Wo | Xo |YuZuTQ o o uy@%zQ&T@AeTf! ^ Q;IQ; ?>g}yTzy To 5}.(d!Ah , !,a \V VT&)0cgȻ W T z g yUȻ AcIQ }I ;| TIQ;T>yyU QIWyU3cT3yU 3cT3Vv#qr        " "!>$:#$8# ##$##"## ]cDT=Xc7R 6}Q Rhdd}QQ?1xQ 1\bWQOYb8R%_mAF__ m_}լ^e}Ti .RQWR%5 AU Q;QSQT5 JQ 5 J^| Q;QS4QHQV?R%*}Sj .0QWR% Q;3 X_AR%QAEQ F^}QE^0WQI3I3II>} % R%sTU) R%wTU p jA솩QCR%$R%*Յ xR%*TU& tR%&TU|G D I1?IR%R% R QTj h jT IQ;Q;>}B IR%R%I'BL  j h TR%E AQ;>}^TA)!B#! A&Ae_B I%A_B #Tr'RB T AhU P=} T y A A(G@(GQ Q(Fh IU g(TMeVf I JTe| K L4Tf| ( *)f Ie Kf I J K  L456}1100V"&tIC F3OR|.$&t^5%AM|Uo To 5:^55aW Q V^5ocaQDXvVoTo$*G  L R |WvWoXoYvZv5Yb*ecx%25%Q( s*xId%25(`l.e:)PONMLKJIHG<dDEX^|[*VI촏%sz|tQ)b|d*IQ.*JQ. *x*xQ:.|L3|H|D;)wS|;*xH)wUR|)*x*IQ.S*I*IQ,Q)t)wS~C*x%)25%)Q) sTwYbTcTe*xIdk((:7;<4/^ |.*VI촖IbTe|<TS*IQ,}Te|)Ue|#S4Q.%IQ2f0,A@@TT_z| "@ef}0 6}' Yc[QSQ cLUDXc>R 6}Q Rhee}QQ?1xQ  1UT TkTl]a T \ f3XjTa&! z y z yUU Q a>dIQLUTeh3 )i UT QHUT QTUT  QT=U    iz) U U V ( TW 4 z)w|  z)w%aIQ\II7B 109h TeTf U)/'dT'Uo  Ie''f| I Ie'f| I Ie(#^ TUT '?FPW\mDT`x %"% ""  %%%&%""".##" 6#",##".$"""" @Q*yVeV eTTeTR* *2QEְ*2fghT YQ(Q-?YQ$?!f取 T f   IQ(Q)? 2zQ R2*yQ@@*|=U |-Q "*@Q R**{dRR*Te[Q$*yR*QQ@RT7*x 9UP=U@Tw*XlTi*~ *G 3@: 4**||:*@w|*@|*Fe*F(N(GQ(yR4 6Ifr~t %%%%%%%%%%&5Ƙ 5Ơ  5:Wa  }    T\,  HbQ@ z 5ƨ YQ Y\Q@bTUTab5Ɛ 5ư  TdbTUd5  aTQU, ITUbWY XU   HcQU,TV,z  5ƘTT뭣Ub5  cTU,ֺc 5Ƙ U݈R T 5R |8*I*x}*I뢅}*  ^UXWVcbV!QR%sz! 7U!%szQC  !7UoTa*IQ*xIQ@a}0Ta*I ^ Q0a}1&%a*xIgd}*xT%szTeW-b3 AcI>>3 Abs>럈}%s}}TQ(ZQ()w%bRU %csvQ,U%%25Q,%sz}U%25%s%sQ)&|Q(,Q)0*xQVzQ zSQcaQ bTab}6}10dQ"T8'"Dk   '!&!"& "&& "R$  eu: Bg Y085Id5J e IQ e}fIQ ef}T_XXzg  8yT*QYǤ*7y*xzXxU @AefIYUI TI B3yTo Ig.eAAe WJ?K?XQyUeI I}[yUB~ !  !! !!!$!D%F%""B%H%""#$##"""#"D$@$B$#"#$:#""#_ TRRSLT첍Q UV 3QQTxtswRJ%TbQ?)6I_RR%Q 6Ik kIfJKjKg LT_Wn!: -6 A20 Ah Bn L_ B /Tv!R m B I!Am jD)|IFIyRQ3: 4|"Q`:Iw|I| Q`QC~]~Le~=*x~ yR @Q*y*EeW52U2fTz*gT TRV* iT TR(GS|Th IIlIIz}| gRI T z' .|_I*Q|Rk IUT zTj I(+|IIQ)TzUj IQ$ o I IQ. ,IVR*yQ@@*g%.Yݺ Ah 倖 Q*yRR x x,q\QU叚\, TaTUa5Rc%5Roh| 5R?^Q$ 受T\,  HQ@aV:Q?Q@ z 5Ơ Tb[ 5Ơ}JIVFUUT@ TdTeTUd5Ɛ |gK  HQED@|@<|<''u|3+u$x|-'+ '+Ր*$'u|*냅'+*$*x|**x.d,0Ve22d2"2U*Q')22'T)"UV+'UU/RMP| /URSLRVCe'-Q*b&.QcT_5.zTQUdbQTTzV}QTc.02QT5.dQ` ?&.ק&w.T#)&Q &)*)tzU@02.Qe'TUTs.R$.Q *.yTyV%.dTo ( o  />|!5^}#CQ:5KQ/ S^&t}&te-F T W |~^}5o oTab QQ@a}&taQ?5aTQ5&tI"(6+3l10i.-,+*)('&%@"|ZQVz^Qaz6}10cT&tQ-z^RxsoTwST%z6}Q510@5To uTo$'*'D G #LR||Xu|Wu|Wo | Xo |YuZu=eO* 1EE0g33!44W:>q? @LE N S W Z Z [ \ ] U^ ^ `aVjjl m m^mmwM{K7798!49e99!4 5 B6 l5 6 l5!:!8<![<!y<!y<"=="="=">">#*A#A#!4#A#4C#F$I%J%J%K&1G&I&I&I'M(L)CN*9O*IP*zP*P*P+YQ+oR+R+R+R,U,eU,U-V.jW.X.6X.{X/X/cY/Y/Y0Ld1d1Ze2e2f2f2f2g 2]g3g3h3-i3ui3j4n4np5q5np6s7s87t9v:M{;>l>څ>>?Q@@l@ƍA]@BYJC{D|E}Ez~E~!There are three ways to use HELP:!$1. You may press the "?" key at any$time during your work. The helptext that appears will apply tothe command you were using when you pressed "?". When you resume !(by pressing "R"), your work will!be exactly as you left it.2. You may view information onspecial topics right now by selecting one of the topics listed at thebottom of the screen. Type the!first letter of th$u do less typing. You can&!use the editing commands any time!$you are entering or changing values,$text, or formulas.&If you need to: Here is what you do:&Delete proposedresponse: Just type the replacement. Multiplan will auto-matically delete theproposed response.Append to proposed#response: To expand proposed#cell references, just type a colon (:) or otheroperator; in otherinstances pressthe Character orWord Right key andtypethe rest 4 absolute value of the! number n. ATAN(n) arctangent of n inradians.!COS(n) cosine of the angle n!given in radians."COLUMN() current column number."#DOLLAR(n) the text string showing#the value n in $ format.EXP(n) e to the power n.$FALSE() the logical value False.$$FIXED(n,m) the text containing n in$ Fix format with m decimals.  m=0 is the same as Intformat.#IF(f,a,b) Returns a if f is True,#otherwise returns b.INDEX(vector,n) Returns the nthe desired word.!%3. You may familiarize yourself with% all the available information by "paging through the help text right"now. Select "Next" (press "N")"Previous" or "Start" page.%If you need information on a specific%#command, highlight the command name##on the proper menu (using the space#bar) and press "?". Applications %The following table provides an index%to the commands and helptopics which apply to common questions. %If you need to: You should consult:%$ent({of thetext.#Insert new text: Type the text. It#will be inserted in front of the highlighted cursor.Move the cursor ifnecessary beforetyping."Delete some text: Use backspace to"delete in front of the cursor. Use the delete keyto delete what is highlighted. Move the highlightas necessary before deletion. %Replace some text:Just delete the old%text and type thenew.$Move highlight: Use Character/Word$Left/Right keys (seeunder Keyboard).FORMULAS8element in the vector.$INDEX(area,n,m) Returns the value in$the nth row and mth columnof the rectangular area.$INT(n) the largest integer that$ is less than or equal ton.%ISERROR(n) Returns True if (and only%if) n is an error value.%ISNA(n) Returns True if (and only%if) n is an #N/A value.$LEN(t) the length of the text t$in characters.&LN(n) the base e logarithm of n.&$LOG10(n) the base 10 logarithm of$n.#LOOKUP(n,area) works as follows: If#$the area  er data: *Value, Lock, Help$Keyboardenter text: Alpha use menus: / Help Commands enter arguments tocommands: ( Help Editing edit text or %formulas: n Help Editing, Edit,%Alpha do calculations: Help Formulas use mathematical or financial functions: )Help Formulasmove through the%sheet: Help Commands, Goto%create headings: Format (Continuous), Window Split Titles use data in inactive sheets: Xternaldefine or delete,0"Formulas are recipes for producing"values. The table of functions%that may be used in formulas is shown%below. Other parts of formulas"are described following the table."$The following functions operate on a$set of values either given asarguments or contained in areasreferenced by the arguments:%AND(list) Returns True if (and only% if) all values are True, otherwise returns False.&AVERAGE(list) = SUM(list)/COUNT(list).&%COUNT(list) number of values that are% given expl<is higher than wide, n will$#be looked up in the first column of#the area. If n is less than the$first cell in the first row, #N/A is$#returned. Otherwise Multiplan scans#$for the row that in the first column$!contains the greatest number less! or equal to n. The result is the value in the last column of the$same row. For areas wider than high,$"rows and columns are interchanged."%MID(t,n,m) characters n through m of%the text value t. MOD(n,m) the remainder of the integer division n//m.!NA() returns the #N/A (not!available) value.NOT(f) the opposite of theTrue/False flag f.PI() the value of pi. (3.1416...) !REPT(t,n) the text t repeated n!times."ROUND(n,m) n rounded to m decimal"places.#ROW() the current row number.##SIGN(n) Returns -1 if n<0, 0 if#n=0, 1 otherwise.#SIN(n) the sine of the angle n#specified in radians.!SQRT(n) the square root of n.!$TAN(n) the tangent of the angle$n.#TRUE() the logispecial names%$that incorporate absolute row and/or$#column numbers and that are used to##refer to particular cells or groups#$of cells. A reference may be used to$!get the value from the referenced! cell. Absolute references may be &entered simply by using direction keys&"followed by the Reference key (@)." RnCm (e.g., R2C3) refers to a single cell. Rn refers to all of row n."Cn refers to all of column n.""Rn:m refers to rows n through m"(short for Rn:Rm.)%Cn:m ref ented with a#vector (a rectangular collection of# cells of width or height =1), it $will be automatically intersected by$$the current row or column, whichever$"is perpendicular to the vector, to"obtain a single value.%The following three operators operate%on groups (sets) of cells:&(space) intersection of two areas, the&collection of cells thatbelong to both operands.%, union of the two areas; cells%that belong to either operand.%: range operator: the smallest%r0beused to move from field tofield. See "Editing" for other useful tips. %4. You may use the Cancel key at%any time to return to the mainmenu.$5. Press RETURN. The command is$now carried out.%Press "?" for additional information.%ALPHA Used to enter or edit alpha text terminated by RETURN. An emptystring of characters may not beentered with this command. ALPHA/VALUE If an Alpha or Value command isterminated with a direction keyor any other key cal value True.##VALUE(t) The text t must contain# the representation of anumeric constant. The value ofthat constant is returned.%Formulas are made by combining values%$(text and numbers) and references to$%other cells with the usual arithmetic%operations and other functions.!Numeric values are stored with 14!"digits of precision (mantissa) and"&a decimal exponent ranging from -64 to&+62. Numeric constants may be typed as integers (123), decimal &fractions (123.001), or in exers to columns n through m%(short for Cn:Cm.)%Relative references are measured from% the cell containing the formula. They can be entered using thedirection keys. The forms are:&R[-n], R[+n] are the nth row above and&below the active cell.$C[-n], C[+n] are the nth column left$and right of the active cell.(the + sign may be omitted)!R is the row containing the!active cell (i.e., R[0]).$C is the column containing the$active cell (i.e., C[0]).#and combinations o$ectangular collection ofcells that includes all cellsin either operand.For example, R1C1:R2C2 is therectangle with R1C1 as itsupper left corner and R2C2 asits lower right corner.COMMAND OVERVIEW%The Multiplan worksheet consists of a%"grid of up to 63 columns in width,"&and 255 rows in length. The screen has&one or more "windows" into"the worksheet, and an area showing"#command, message, and status lines.#$The message line suggests the action$to be taken or explains error4that moves thecursor, Multiplan will respond!with ALPHA/VALUE, ready to accept!!another alpha or value entry. The!$first character typed will determine$the type of entry. The#characters 0 through 9, =, +, -, (,#and " select VALUE; allother characters select ALPHA.%This process may be repeated to enter%a sequence of text or values.!If the text is too long, an error!#message will result. Note also that#%double quotes may not be used in text%strings.BLANK Blanks out conEponential&"notation (123.001E3). The exponent"!sign (E) may be typed in upper or!$lower case. Percentages may be typed$#in, followed by percent sign (12%).#%Text-valued constants are enclosed in% double quotes (the constants may not themselves contain quotes)."Multiplan may produce error values"that will propagate through theoperations. These are:&#N/A not available: a special value&that may be created using theNA() function and that will bepropagated by arithmetic ope7f the above, e.g.#R[-2]C.Names may be defined to be any!absolute reference (with the Name! command). A name may be used anywhere an%absolute reference can be used. Names% must start with a letter and may %contain letters, digits, periods, and%!underline characters. They may be!%entered by pressing the Reference key%$(@) and stepping through the list of$#defined names using the directional#keys.The operators in formulas are:+ arithmetic addition- subtraction(s when they occur. The status line "displays coordinates of the active"!cell, its contents, percentage of!&storage remaining, and worksheet name.&$There is a highlighted "active cell"$#on the worksheet. The highlight can#be moved around by pressing the&direction keys. The same keys are also&"used for scrolling the contents of"$windows. The Home key may be used to$go to row 1 column 1 quickly.#The command menu offers a choice of#$commands. To get going, you need to:$"1. Select an a8#tents of specified cell(s).&The parameter must describe an area of&the sheet. Check if all names$have been defined and also check the$!use of parentheses and operators.!&For more information select "Formulas"&(F) on the Help Menu.COPY#Replicates cell contents into other#cells. A variety of sources anddestinations is provided.%Overlapping copying is not permitted.% The from: and to: area must have compatible shape. COPY FROM $Copies contents and format of a c prations. ##NAME? result of an undefined name# reference. %#NUM! result of overflow or illegal%use of arithmetic functione.g. sqrt(-1).&#DIV/0! result of an attempt to divide&by 0.##REF! relative reference reaching#outside the sheet or referenceto a deleted area. #NULL! intersection of disjoint areas, e.g. R1 R2.!#VALUE! use of text value where a!number is needed or viceversa.Use of references in illegalcontexts when a value isneeded.%Absolute references are Z* multiplication/ division%^ exponentiation. Calculated by%the rule: a^b = exp(ln(a)*b)for exponents that are notintegral numbers.% percent, same as /100&& text string concatenation. The&formula "$"&"1.00" will yield:"$1.00"."<, <=, =, >=, >, <> are comparison"operators: less, less orequal, equal, greater orequal, greater, and not equal.To be used for comparing numbers only. &The operators require single values as&operands. If pres,hctive cell. The"direction keys may be used.Thesame keys also scroll theworksheet in the window.#2. Select a command. There are#two ways to do this. You canmove the highlight to acommand word using the spaceor backspace keys and thenpress RETURN. Or, type thefirst letter of the commandword.A new and more specificcommand menu or the parameterfields with the proposedresponses will be displayed.%3. Specify the parameters of the%command. The TAB key may <&ell$&or group of cells to another location.&Parameters are:&1. Description of a cell or the group&of cells to be copied.!2. Area to be filled with single!source cell, or upper left cell where the source group should be !copied. Copy from a source into a!similarly shaped target area isalso permitted. COPY RIGHT &Used to make a row of identical values&or formulas. Parameters are:&1. Number of copies to be made to the&right of the "source".Total number of ident+qical cellswill be this number +1 (the original). #2. This parameter (the "source" of# copying), is usually left as the !active cell which is the proposed!response. A vertical group ("vector") may be copied instead to create a matrix. COPY DOWN $Used to fill a column with identical$$values or formulas. Parameters are:$%1. Number of copies to be made below% the "source". #2. This is the source of the copy,#usually left as the active cell!which is the proposed xEditing.FORMAT$Presents four options for formatting$cells as described below:FORMAT DEFAULT CELLS!Used to change the format for all!cells that have the "Def"%property. The desired format (as well%as alignment) is described%under the Format Cells command below.% FORMAT CELLS $Sets a specific format and alignment$for one or more cells. Just#typing "FC" shows the properties of# the active cell. Parameters are: 1. Cell or group of cells to be formatted. 2 js preserved.&$Widen column to display entire text,$or use Format Cells (Continuous%format) to run text into next column.%$Numbers too wide to be displayed are$indicated by # signs. Widen#column(s) to display entire number.#Parameters are:$1. Width of column in characters. A$"D" will cause the columns touse the "default width" (SeeFormat Default width).#2.3.Range of columns to be changed.#FORMAT DEFAULT%Used to set formatting for cells with%"Default" formatting, 0usted.$Name definitions are adjustedaccordingly. Parameters are:"1. Number of new blank rows to be" inserted. "2. The new space will be inserted" before the contents of this row. %3.4.These parameters are usually left%with the proposed values.They may be used to limit theinsertion to between thespecified columns. INSERT COLUMN $Inserts entire columns in the sheet,$$or partial columns between specified$!rows. Columns to the right of the!%space inserted move right. ReferUresponse. A!horizontal group ("vector")may be copied instead to form amatrix.DELETEDeletes all or parts of rows or"columns. Space is closed up, hence""cells to the right of or below the"deleted area will move. DELETE ROWS $Deletes all or part of row(s); space$#will be closed up; formulas, names,#and references are adjusted.$To delete the active row, just press$RETURN.&Effects of deletions on references and&formulas, as well as on$structures of rows and columns, m. Alignment. Choices are:"Def Aligns as specified in the"Format Default command.Ctr Centers cell entries#Gen (General) Aligns text left,#numbers right."Left Aligns cell entries to the"left."Right Aligns cell entries to the"right. - Do not change alignment. 3. Format. Choices are:"Def Format as specified in the"Format Default command."Cont Continues long text across"column border, if next cellempty and also formatted"Cont".&Exp $ width&for columns that have "Default" width,&!and for other formatting options.!FORMAT DEFAULT WIDTH#Used to change the width of columns#that have "Default" width.$Initially all columns have "Default"$width.FORMAT OPTIONS&"comma" option: when selected, numbers&will be displayed withcommas separating every thirddigit before the decimalpoint. This affects only fixed,integer, percent and dollarformats."formulas" option: the formulasthemselves will be show4Dences%$affected by insertions are adjusted.$Name definitions are adjustedaccordingly. Parameters are:%1. Number of new blank columns to be%created.%2. The new space will be inserted to% the left of the contents of this column.%3.4.These parameters are usually left%with the proposed values.They may be used to limit theinsertion to between thespecified rows.LOCKUsed to protect specified cellcontents and formulas fromunintentional change by other commands. TheIust$be carefully considered.The parameters are: 1. Number of rows to be deleted 2. First row to be deleted$3.4.These two parameters are usually$"left as proposed. They may be used" to limit the deletion to a range of columns. Cells below the range will move up to occupy the deleted space.DELETE COLUMNS!Deletes all or part of column(s);!"space will be closed up; formulas,"#names, and references are adjusted.#Parameters are:#1. Number of columns to be deleted#2. N (Scientific notation) Displays&numbers as a decimal times apower of ten. Number of digitsas specified in "# of decimals." %Fix Rounds to and displays number%of decimals specifiedin "# of decimals" field.%Gen (General) Displays numbers in%the most appropriate formconsidering the size of thecell and of the number. Int Numbers will be shown as integers after rounding.%$ Displays numbers with leading%dollar sign and 2 decimalplaces (negative numbersen(n, notthe numerical values of theformulas. All field widths will be automatically doubled to accommodate the formulaswhen this option is turned on.GOTO%Used to move cell pointer over sheet.% GOTO ROW-COL Moves cell pointer directly to!specified row and column. If cell!&requested is already visible window is& not moved. "Otherwise window is shifted to the"specified cell. GOTO NAME "Moves cell pointer directly to the" upper left corner of named area. &The direc8 Lock Cells command can also unlock cells. In a worksheet the next unlocked non-blank cell can be easilylocated by a special key (see Keyboard). Note that values imported from$external sheets may be unlocked only$by the eXternal Copy command. LOCK CELLS #Used to protect specific cells from#%unintentional change. Parameters are:% 1. Cell or group of cells to be locked (unlocked)."2. Shows current state (Locked or"!Unlocked) of current cell. Use to!specify desired state. > First column to be deleted$3.4.These two parameters are usually$left as proposed. They may beused to limit the deletion to arange of rows. Cells to the!right of the range will move left!to occupy the deleted space.EDITPuts contents of active cell on command line for editing. Edited value is reassigned to cell when RETURN is pressed.&When editing formulas, check carefully&before pressing RETURN.#Use the Alpha command to edit text.#Press "E" now to see section on+closed in parentheses).$* (Bar Graph) Displays as many$asterisks as the value of thenumber.%% (percent) Displays the number%times 100 followed by a percent sign. - Do not change format.$4. Number of decimals. This is used$in the Exp, Fix and % formatsabove. FORMAT WIDTH #Sets width (3 to 32 characters) for# specified column(s). Multiplan's initial default width is 10 characters. #Text (words) are cut off at edge of#&column, but cell content i,\tion keys may be used to step&through the directory of names. GOTO WINDOW "Moves worksheet so that the active" cell is at the upper left corner of the designated window.INSERT#Used to insert new blank cells into# the sheet. Existing cells may be %moved to make room for the new cells.% INSERT ROW $Inserts entire blank rows across the$"sheet, or portions of rows between"#specified columns. Rows below added#"rows(s) are moved down. References"$affected by insertions are adj<r LOCK FORMULAS $If confirmed, all cells in the sheet$"that contain text or formulas will"#be locked. This may be a convenient#first step in creating a locked&sheet. You may, however, wish to leave&certain text strings unlockedor lock some important numbers.MOVE"Used to move whole rows or columns"from one place to another.MOVE ROW"Moves whole rows from one place to" another in the sheet. References %affected by the move are adjusted, as%are definitions of names.Parameters are:1. First row to be moved.&2. Moved rows will appear in front of&the contents of this row.$3. Number of consecutive rows to be$moved. MOVE COLUMN %Moves whole columns from one place to% another in the sheet. References %affected by the move are adjusted, as%are definitions of names.Parameters are:1. First column to be moved.$2. Moved columns will appear to the$left of the contents of thiscolumn.$3. Number of consecutive columns to$ be mom theworksheet more than once themaximum change in a particularportion of the worksheet may be calculated. ITERCNT(): returns #N/A duringnormal recalculation and the!iteration count (starting with 1)!during iteration.&"completion test at" option: specifies&the location of a formulafor completion test. Iterationwill end when this formula evaluates to TRUE. If the option field is empty, the formulaDELTA()<0.001 will be used.PRINT$Used for printing of worksheet qf output,$#and printing of formulas instead of#%their values. After RETURN, Multiplan%!will resume the Print command for!$the selection of the Printer or File$to be used. The options are:"1. Description of the rectangular"group of cells that is to be!printed (if not the whole sheet.)!%2. Arbitrary text may be sent to the%printer using this parameter.3. A printout of the formulas(instead of the values of the formulas) "can be obtained by selecting "Yes""for the "formulas" opti0 rmats. All#special format files will be merged#"into the active sheet, rather than"loaded as a whole. The filename must conform to the %general rules of the Operating System%of the machine you use. Only$worksheets saved in Multiplan may be$loaded by TRANSFER LOAD.$To create new worksheets, there must$"be space available on the disk and"%the disk must not be write-protected.% TRANSFER SAVE %Saves a copy of the current worksheet%&as a disk file from which it can later&be loaoved. NAME&Used to name a cell or group of cells.&!The names may be used in formulas!&or in other commands. The name command&is also useful for inspectingthe existing definitions. Theparameters are:"1. Name to be defined. Names must"start with a letter and may!contain letters, digits, periods,!and underline characters. To review names already defined, "use directional keys (right arrow:"next name, left arrow: previousname).&2. Definition of the cell(s) that the&1s. The$%menu command Printer starts printing.%&File prints printable output on a disk&file; Margins sets margins to%be used; and Options defines the part%&of the worksheet to be printed, allows&&insertion of a control line at the top&!of the output, or prints formulas!instead of their values.&Time required to print depends on size&of the sheet and the speed of the printer. &As many columns are printed across the&"page as will fit. Leftover columns"$begin a new page. When all rows $on."4. The printing of row and column"numbers may be requested or suppressed. QUIT&Ends Multiplan session when confirmed.&This command will not save the"active sheet. Use Transfer Save to"!save worksheet before using Quit.!SORT&You can sort any part of the worksheet& using this command. The sort key %may be any designated column. Rows of%%the worksheet will be exchanged until%#the values in the Key column are in#!the selected order. Both text and! numeric values are allowed4ded with Transfer Load.#The parameter is the "filename". If# the filename already exists, the #message, "Overwrite existing file?"#$will ask for confirmation to replace$!that file with the new worksheet.!$See TRANSFER OPTIONS for information$on special file formats.TRANSFER CLEAR After confirmation, the sheet is cleared. Columns are set to 10&characters wide, default format is set& to General. "Sheet name is set to TEMP, with no"depending or supporting sheets.TRANSname is to refer to. Absolute references may be entered by use "of direction keys. Groups of cells" are formed using a colon (:) for ""ranges" or by using comma (,) for" "unions". OPTIONS$This command lets you turn on or off$various optional features of Multiplan. #"recalc" option: controls how often#formula recalculations areperformed. "Yes" causes recalculation whenever a cell is changed.!This may take some time on a busy!sheet. To get quicker response turn the option have$been printed, the next set of!columns will begin on a new page.! PRINT Printer Starts printing on the printer. PRINT FILE %Directs printed output to a disk file%instead of a printer."If a file of the same name exists," Multiplan will ask permission to #replace it. Output to the file will#start immediately.%The parameter is the name of the file%!to which output is to be printed.! PRINT MARGINS Used to set page dimensions for$printed output. After the RETURN(B. Text !values will be ordered before any!!numerical values. Empty cells are!always sorted last.$To create multi-level sorts, sort on$the last key first, and proceed#backward sorting on the other keys.#The parameters are:1. The key column number.%2.3.These parameters can restrict the%sort to a range of consecutiverows.$4. Sort order. ">" means ascending,$"<" means descending values.TRANSFER&The subcommands of TRANSFER affect the&entire active worksheet orsaved8aFER DELETE#Removes worksheet from file system.#TRANSFER OPTIONS%Modifies the context of the following%TRANSFER operations:!The setup argument may be used to!#specify the directory or disk drive#for saving and loading files.&The file "mode" may be used to set the&desired file format for the#following Loads and Stores. This is# important for data exchange with $other programs. "Normal mode" should$be selected for all files thatare not used for interchange.#"Symbolic" off and press the Recalc key (!)!when you desire to see up-to-date!results.#"mute" option: silences the audible#alarm.!"iteration" option: when "Yes" is!selected, the recalculation ofworksheets with circular!references will be repeated until! a completion test (see below) is satisfied. The following special "functions may be used in iterative" worksheets: DELTA(): returns the maximum"change in the values of cells from"one iteration to another. Byreferring to DELTA() fr key$%is pressed, Multiplan will resume the%&Print command for the selection of the&#Printer or the File to be used. The#parameters are:%1. Left margin (in print positions.)% 2. Top margin (in print lines.) "3. Width of printable area on the"page (in print positions.)#4. Height of printable area on the#page (in print lines.)%5. Height of pages (in print lines.)% PRINT OPTIONS %The options allow part of a worksheet%to be printed, the insertion of$a control line at the top o,L worksheets. TRANSFER LOAD #Loads a worksheet from a disk file.#"The parameter is the "filename" of"!the file. Spell and punctuate the! filename exactly as it was saved with Transfer Save.!The direction keys may be used to!!display the file directory on the!screen#and then select a file by pointing.##Data may be automatically copied to#&the loaded sheet from other supporting&!sheets. See XTERNAL COPY for more! information. Use TRANSFER OPTIONS to specifyspecial file fo<{ mode is used for loading#and saving of worksheets in the%symbolic SYLK format. In "Other" mode%#VisiCalc (TM VisiCorp) format files#may be loaded.Great care should be taken to%distinguish files that have different%formats!TRANSFER RENAME&Renames active sheet. Offers to update&%references to the sheet on supporting%&and depending sheets. The parameter is&the desired new name.VALUECan be used to enter a value orformula in the active cell. The#command is complete9d when RETURN is#pressed. A directional key or#any other key that moves the cursor#will also terminate the value%and move to the appropriate new cell.%Multiplan will respond!with ALPHA/VALUE, ready to accept!another alpha or value entry.#This feature is described under the#Alpha command.&The following simplifications are also& available: $Numbers may be entered directly. The$Value command is entered auto-#matically when the leading digit is#typed.%The characters =, +, { will split the"$titles so that the current cell will$be at the upper left corner of&of the data area in the active window.& WINDOW BORDER $Used to border or to remove a border$from a window.#Note that borders occupy one screen#$position on each side of the window,$#thus reducing the display area by 2#"screen lines and 2 screen columns." WINDOW CLOSE #This command removes the designated#window from the screen. WINDOW LINK !This command can set or break the!!links for Rcial&properties: a permanent record#of the copy parameters will be kept#!with the active sheet. Every time!%the sheet is loaded, the copying will%be repeated so that the most$up-to-date information on the source$"sheets - the "supporting" sheets -"$can be imported to the active sheet.$$Whenever sheet relationships change,$$the supporting sheets may be updated$%with a "receipt" showing which sheets%$"depend" on them. These lists may be$ inspected using the XTERNAL LIST command described be0ZL has a home key, that key will&move the cell pointer to R1C1.Action:  Key to use:up arrow CTRL-Edown arrow CTRL-Xleft arrow CTRL-Sright arrow  CTRL-Dcancel CTRL-C"return,enter RETURN, CTRL-M"%backspace  BACKSPACE, CTRL-H%"delete DELETE, CTRL-Y" tab \ TAB, CTRL-I, CTRL-Acharacter left CTRL-Kcharacter right CTRL-Lword left  CTRL-Oword right --, (, and " will%also start the Value command.#At the beginning of the formula and#after entering an operator, a&relative reference can be entered just&by pressing the direction keys$to move the highlight to the cell to$be referenced. The reference&may be changed to Absolute by pressing&the Reference (@) key.WINDOW%This command is used to control size,%!number, and display of "windows",!%which are subdivisions of the screen.%WINDOW SPLIT HORIZONTAL&Splits active win synchronized scrolling.!Parameters are:%1.2.These parameters define a pair of%windows. In most cases theproposed values are acceptable.Note that linking of windowsthat are not "neighbors" is not permitted. #3. The parameter shows the current#!state of linking, and may be used!to change the linking. The direction of linking follows the direction of window splits.XTERNAL!This group of commands deals with!!references to inactive (external)! worksheets. XTERNAL COPY$low.#The imported data will be locked on#"the sheets. When a cell containing"!imported data is highlighted, the!status line will show:%[source sheet name source area name]%%Linking may be changed or broken only%by redefining the target area&or deleting the target area definition&in the XTERNAL COPY command. XTERNAL LIST $The relationships between the active$"worksheet and other worksheets are" displayed: %"Sheets supporting" shows sheet names%"and possibly a substitu4 CTRL-Preference @help ?next window @ ;, CTRL-W%next unlocked cell LINE FEED, CTRL-F%recalculate !home CTRL-Qend  CTRL-Z#page up  CTRL-R up-arrow#%page down  CTRL-R down-arrow%%page left  CTRL-R left-arrow%&page right CTRL-R right-arrow&"NOTE: These additional keys can be"$used on a Zenith/Heath h19 terminal.$$The numbers on the alternate key pad$&can be entered by usdow across the screen&at the row indicated. The new&window will occupy the space below the&row selected, and may be#linked with the original window for#synchronized scrolling in thehorizontal direction.WINDOW SPLIT VERTICAL&Splits active window vertically at the& column specified. The new window &may be linked with original window for&synchronized scrollingin the vertical direction.WINDOW SPLIT TITLES Splits active window into 2 or 4 windows which scroll together.7 %Copies data from an external sheet to%the active sheet. Optionally,#a permanent link may be established# between the active sheet and the $source of the data. The Name command$may be used immediately after!the copy to create a name for the!target area that is related tothe name of the source%("filename.areaname".) The parameters%are:&1. External sheet name. The direction& keys may be used to step through names of the supporting sheets.!2. Name of the source area to be!!(te name for"%worksheets which support (export data%to) the active sheet;%"Sheets depending on" lists filenames%!of sheets which depend on (import! data from) the active worksheet. &Press any key to return to the display&of the active sheet. XTERNAL USE Sets a substitute name for a$supporting sheet using the following$ parameters: #1. New sheet name to be used. This# name should not be used in other substitutions."2. Sheet name currently in use in" existing links. All8ing the shift key.&Action: M Key to use:character left ICcharacter right DCword left  ILword right DLpage up  f1page down  f2page left  f3page right f4end f5cancel eraserecalculate bluehelp redreference ~ white"NOTE: These additional keys can be"used on an ANSI terminal.$The numbers on the alternate key pad$&can be ent #This command is used to hold column#titles or row headings in place$while cells are scrolled. Parameters$are:%1. Number of rows to become a window%across the top of the screen.!2. Number of columns to become a!!window at the left of the screen.!#The remaining display space becomes#%the active window which is linked for%#horizontal movement with the window##above it, and for vertical movement#with the window to its left.Note that the acceptance of the"proposed parameterscopied on the external sheet. The! direction keys will step through !the permanently copied names from!thesheet defined by the first parameter. &3. Target area on the active sheet. A&permanent link (see below) may be broken by deleting the target area definition. 4. Link option. If "No" link is "selected, the copy will be carried"out and the command will"terminate. If "Yes" is selected, a" permanent link is established as described below.&Linked copies have a number of spe,p copies using this name - whether a real sheet name or just a formal or "dummy" name - will henceforth refer tothe first parameter.KEYBOARD%If you have a Zenith/Heath h19, ANSI,%Televideo 910/912/920/925/950,ADM 3A/31/42 ,Xerox 820/860,"Hazeltine Esprit, TRS-80 Model-II,"or DEC VT-100 please see the notes below about the use of special keys. !If your terminal has an up, down,!left,$and right arrow key, then those keys$$will move the cell pointer. If your$&terminal<Iered by using the shift key.&AKP is the Alternate Key Pad.Action: a Key to use: character left 7 on the AKP character right 9 on the AKP word left  1 on the AKP word right Z3 on the AKP $NOTE: The following keys are used on$the TRS-80 Model-II.Action:  Key to use:cancel eschome cF1next unlocked cell F2$NOTE: The following keys are used on$the Xerox 820.Action:  Key to use:help helpcancel Kesc$NOTE: The following keys are used on$the Xerox 860.Action:  Key to use:up arrow RVRSE-LINEdown arrow LINEleft arrow RVRSE-CHARright arrow CHARhelp helpcancel rSTOP$NOTE: The following keys are used on$Televideo 910/912/920, andADM-3A/31/42 terminals.Action:  Key to use:backspace  CTRL-Ucharacterf&8  8 PP67496`6'l)-e#NULL!#DIV/0!#VALUE!#REF!#NAME?#NUM!#N/A' 5r4+-^*/,&:<>=0123456789-."+(=RrCc $KbJ%)-z//5}; ;<AEH EHEF!HIJJP SWW Y\] _a P'AP'B "CP'GP'I! J#P'L#P'N'P'I*P'Q,P'I.!S0T0@U0'@V09' @W0'X0!P'Z0P'a4 D:P'c:P'd>#eAF$fAEAgAkA@lA4'@mA/'#nAP'pA@qC' @rC'0those sMicrosoft Versi1.04 Total Bytes :s coleinnon-Shapes areas do match: ing: by EALPHA/VALUE: text Disk fuller s recalculate: Readline MP system disk: GoMoves Quit Sort HELP: Resume Start Next PreviousApplications s s board s: Down : : s Ds GO: -col : s sMOVErefer S recalcmuteiterationcompletitest at: er sQUIT:sa] left CTRL-Vcharacter right CTRL-B$NOTE: The following keys are used on$!Televideo 910+/925/950 terminals.!Action:  Key to use:backspace CTRL-Bcharacter left CTRL-Ucharacter right CTRL-J$NOTE: The following keys are used on$the Hazeltine Esprit.Action:  Key to use:backspace  CTRL-Uword left  CTRL-Vword right JCTRL-B$NOTE: The following keys are used on$the DEC VT-100 terminal2[]dpP`rbf>864(+-=>^/*&:<,<<> VDCGLR-DCEFG$*%-"##""## '() TEMP&F6B$ $sC"#\C"#tC"SC#hC #wC,"#iC#^C?#jC#xC,"#]C#^CkC@yC' #uC"#{C"#hC #fA+"#iA#^A?#\C"#|C"#jC#fA."#]A#^A&~C #C$ #C$ #C$ #C$ #C$ C  C3$`rC'`C'%C@C%' CX$&C#P'C#vF##uC"#\C"#]4(%#^4*%@_4'#vF#F@F'0F 4ndorder: > <: Load Clear s Re: BEXTERNAL: List sstartats# ss# ss: Def -code: Def % -# decimalsD: s S commassǽd(efault)through status: UnS:Ţer:: toppage S: areasetup-col s E CLEAR:S mode: Normal Other: Titleswith edES : ěcode: %ǽSORT by DOWN bLOADRENAMSAV: Eat at TITLES: J-O-V-Z-^-c-f-l-p-w-~-----------------------s.Action: Q Key to use:character left PF 1character right PF 2word left  PF 3word right PF 43 f4end f5cancel eraserecalculate bluehelp redreference ~ white"NOTE: These additional keys can be"used on an ANSI terminal.$The numbers on the alternate key pad$&can be ent a >* MP.HLPiID;PMP F;WF;K;E;F;F;R;CNN;N;ENU;F;LNE;F;S;E;NL;NB;;Y;X;P;S;R;C;K;E;G;D;K;F/%%%%%&ERRORCHOOSELOOKUPNAINDEXLOOKUP @CBH%ACt#`1D' 1i@DDc5W@XB1#`uCrqDQx Qb@5g0D0316BcwT(7#UBWs8DDA%rFBGE"6addXRVB(6i""@P(%1SF/F@F'2SF3F@FF'@F)' #nF#F##uF"@F'#\F"@F'#hF#jFsheetformulacelllockprintrowoptionlinkmarginscommandalignmentavailablemultiplandependsupportkeysavechangeeditdefineenterfilecolumnwindownumbernamewidthformatreferencecopycannottoillegalfromofselectnotdeletebeforehorizontaltoogroupdirectionblankverticaltransfersymbolicorusemanyinsteadhelpconfirmbetweenlengthinsertvaluesplitonerrorclosecharsalphaingwritexternalo8T.. .....(.+.0.9.>.F.N.V.X.[._.f.j.q.x.~........................//// /"/$/+/0/6/A/N/c/g/m/t////////////0 0000080=0K0h0n0~000000000011 11-11141;1F1S1\1e1k1}11112222 2+2-2325272E2I2V2X2Z2c2g2h2p2{222222222222222223 33333%343?3B3J3U3X3f3m3n3q3s3u33333333333333333333333444444!4#4+4-4144474;4?4D4G4I4O4S4W4Y4_4d4i4q4"""""" " """##### """ AA A1b'v`A#XP@B@cfw#gXdF!6t9V 32h5=AiFuA1?yi&&$VdYd u"Apyc&yI@ABV#sA$!5b71@xS3E%5q?P'8CPe@?vsq$9ATyg @IPS(Wiu@333332%A  " "&(*,   "$& FH!&K-M27O>P CR Y  ^ fYl[LqLv`b  Vclt }  17o!,rderefaultrightleftedin Cont Exp Fix Gen Int $ *Ctr Gen: Yes Nos No s No s s % Free:slnllongdtextparameterOverexist?Circular s unresolvǁDisk sPress any redraw screenInsufficient memoryY is a d workerror: line read sField has wordsis longsssa text (no double quotes)a a , d fda , s view directorya type letterwill fitƂmay be dY retry access <?##""$"TRUEFALSECOUNTIFISNAISERRORSUMAVERAGEMINMAXROWCOLUMNNANPVSTDEVDOLLARFIXEDSINCOSTANATANPISQRTEXPLNLOG10ABSINTSIGNROUNDLOOKUPINDEXREPTMIDLENVALUEANDORNOTMODITERCNTDELTA ``*`! "% "-"1"59@C("GI"M@T@Z%^%b %f %k "n %s%w"z"  "" $  @@@@@@` ` `pp #`pp #``"alsD: s S commassthroughstatus: UnS# sŢ# ser:toppage setupr-c seE CLEAR:S s Quit Sort HELP: Resume Start Next PreviousApplications s s board s: Down : : s Ds GO: -col : s sMOVErefer S recalcmuteiterationcompletitest at: er sQUIT:sa :&M  M ((67^966'l)-e#NULL!#DIV/0!#VALUE!#REF!#NAME?#NUM!#N/A'254+-^*/,&:<>=0123456789-."+(=RrCc l,ML-15s77:x= =>CGJ*G0G7H?JKLLR UYY [^_ ac P'AP'B "CP'GP'I! C#P'K#P'M'P'I*P'P,P'I.!C0R0@S0'@T0' @U0&'V0!P'X0P'_4 C:P'a:P'b>#cAF$dAEAeA#CA#dA"#fA#\A?#CA#dA"#[A 0r those sVer 1.04 Bytes:coleinnon-Shapes areas do match: ing: by EALPHA/VALUE: text Disk fuller s recalculate: Readline MP system disk: Del Form Go Ins Move Opt Quit Sort XternHELP: Resume Start Next Previous Applications s s board s: Down : : s Ds GO: -col : s sMOVErefer S recalcmuteiterationcompletitest at: er sQUIT:sandorder: > <: Lo  2[]dpP`rbf>864(+-=>^/*&:<,<<> VDCGLR-DCEFG$*%-"##""## '() TEMP&F6B $@#\ACA@gA'@hA&'#iAP'kA@lC.' @mC' $CC"#ZC"#nC"CC#CC#pC"#fC#\C?#CC#qC"#[C#\CCC@rC' #CC"#tC"#uC#CC"#vC"#wC&CC #CC$ #yC $ #zC$ #{C$ #|C$ CC }C$`mC'`~C'%C@CN' }CX$&C#P'C#CF##oC"#ZC"#[4(%#\4*%@]4'#CF#F 4Lad Clear s Re: BEXTERNAL: List sstartatssalign: Def C G L R -code: Def % -# decimalsD: s S commassthroughstatus: UnS:# sŢ# ser:toppage setupr-c seE CLEAR:S mode: Normal Other: Titlewith ed˙S align: C Gen L Rcode: %SORT by DOWNbǗnamLOAD filRENAMSAV: # s# ssǽd(efault): S: areaEEǽat at TITLES: # s^-c-j-n-r-w-z--------   a >* MP.HLPiID;PMP F;WF;K;E;F;F;R;CNN;N;ENU;F;LNE;F;S;E;NL;NB;;Y;X;P;S;R;C;K;E;G;D;K;F/%%%%%&ERRORCHOOSELOOKUPNAINDEXLOOKUP @CBH%ACt#`1D' 1i@DDc5W@XB1#`uCrqDQx Qb@5g0D0316BcwT(7#UBWs8DDA%rFBGE"6addXRVB(6i""@P (@F'0CF1F F@F'2CF3F@F'@F&' #iF#CF##CF "@F'#CF "@F'#CF #wFsheetformulacelllockprintrowoptionlinkmarginscommandalignmentavailablemultiplandependsupportkeysavechangeeditdefineenterfilecolumnwindownumbernamewidthformatreferencecopycannottoillegalfromofselectnotdeletebeforehorizontaltoogroupdirectionblankverticaltransfersymbolicorusemanyinsteadhelpconfirmbetweenlengthinsertvaluesplitonerrorclosecharsa 8---------------.......#.&.,.2.<.?.D.M.R.Z.b.j.l.o.s.z.~......................./ / ///$/+/,///1/3/:/?/E/P/]/r/v/|////////////0 000 0%0(0A0F0T0j0p000000000000000111!1,191B1K1Q1c1m1{11 2 2 22222$2&24282E2G2I2R2V2^2i2n2x2222222222222222223!3,3/373B3E3L3M3O3Q3`3d3g3l3p3u3z3}333333333333333333333444 4444#4&4*4,4.444;4B4D4R4V4Z4\4a4j4n4u4|44444  AA A1b'v`A#XP@B@cfw#gXdF!6t9V 32h5=AiFuA1?yi&&$VdYd u"Apyc&yI@ABV#sA$!5b71@xS3E%5q?P'8CPe@?vsq$9ATyg @IPS(Wiu@333332%A    !#%  .5>   DFH#J*L-2N6O ;Q @  E IWRYNWN\^eDk`r  .;DV _  "j&') ,lphaingwritexternalorderefaultrightleftedin Cont Exp Fix Gen Int $ *Ctr Gen: Yes Nos No s No s s %:slnllongdtextparameterOverexist?Circular s unresolvǁDisk sPress any redraw screenInsufficient memoryY is a d workerror: line read sField has wordsis long(s)(s)(s)a text (no double quotes)a a , d fda (arfdirectory)a type letterwill fitƂmay be dY retry access <""""" " """##### """##""$"TRUEFALSECOUNTIFISNAISERRORSUMAVERAGEMINMAXROWCOLUMNNANPVSTDEVDOLLARFIXEDSINCOSTANATANPISQRTEXPLNLOG10ABSINTSIGNROUNDLOOKUPINDEXREPTMIDLENVALUEANDORNOTMODITERCNTDELTA ``*`! "% "-"1"59@C("GI"M@T@Z%^%b %f %k "n %s%w"z" !P!e "" $ @@@@@@` ` `pp #`pp #``"+mode: Normal Other: Titlewith ed˙S align: C Gen L Rcode: %SORT by DOWNbǗnamLOAD filRENAMSAV: # s# ssǽd(efault): S: areaEEǽat at TITLES: # s^-c-j-n-r-w-z--!? (rN'sP@'TRANr 5 lprrrr *s  *  @ s H0H <, rGj6QsQs <,?s&@3-"!"Lock Move 8  NwOptions Print Quit S F6B >(P6!  volume 3 : LJanuaryLFebruaryLMarchLAprilLMayLJuneLJulyLAugustL SeptemberLOctoberLNovemberLDecember!! F,F,E:E:! F,E:! F,E:! F,E:!!0!9"*gACI CP/M Disk Directory :]2 C!] 6?# <>?2h:\U<@2:A_##~2###^#V#^#V"#)"#~#ng)/o%#!:ʰ))=å")))""2*))))!""*#DM!s# y\'++NOT FOUND$\B*#"*!o*$"#͵ ~ʕ!"*^#V|ʕ*# t*"F #u#͊x~# Ê͊:<2**!s#r*"*"*::"!""*^#V|4ͨ*)!! F> gcnz     #%+e#Io/W1k)Ou8]7q /U{S=Cw5[DIW};a1!$!4*^#V|G͡*))*^#V|G͡*)T])*^#V|G͡v*"*)|/g}/o#4(|o}gHit any key to continue listing:vg | ]> }]~&o))))G:O:= *!)d|}> }  | }g g *"͓>K}*͓g Files (*͓g entries) : yg[in matched files] gusing *͓>K}g of total *͓gK capacityv: 5*|/G}/O* ͓g Directory entries and *|/G}/O* ͓gK Byt!! DSalesDCostD Gross ProfitsdMaterialdLabordOverheadd Total Costs LJanuaryLFebruaryLMarchLAprilLMayLJuneLJulyLAugustL SeptemberLOctoberLNovemberLDecember!! F,F,E:E:! F,E:! F,E:! F,E:!!(!8Yes available on Drive :}g: 5 21*|g}o:4=!o)"!"!**|""""ͨ**|‰}ʐ**|ž}ʥd*U*U}o"^#V"*^#V* t*"*^#V* t*"**|}*^#V*^#V*!s#r*!s#r|g}o~}# ]~t}#hg _ - ڜ |ē{0} ~w#÷5  ! ! F,E:! F,E:! F,E:! F,E:! F,E:! F,E:! F,E1: Dp D@ E D@ --F- %`@barfo:! F,E:@!,!<"">!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")*)) *)) 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 *) >*)" B,8~,: ‘2 *|@PVWG"B: W?:,+͚EO: y!e E..+q, +: B*|ïª#~# #^#V" ‘BB(+ͶA:$" * ~Wڿ " z~" _:] +G!yxVzeQszs! :] === N#FV#N#FV#! N#F#N#FKG* A)'96^(^xdd!-* .E^y2^ x:] Wx z ! N#F* m)A(" " 'm)!:^ O ~#foA(2] "0!:G@ #T]~!# !~!!!y_4!: >2 I![@!2 X!: >2 T!> 'F{[!~#_'FX!p!2 Ú C0:?+̀! 5 5*d Ö0:b O ʱ! H¼!>&{:c !!!#~ (~#!:c ! !.!D!E!!{"*` Ú #&"T]ͺB!; E!}* ͺB8"`i" g"͍[~vg"͍[B, (: : $ PXʹ",ʛ"BKʹ"B,ʹ"B,¿ z`iͺB" !ͺB^{#V"~#+"#"*: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͐"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"$" A)!'a)(" " a)'a)÷& .C ڀOyұͼB,͈)*  } A)>2  N#fi-++<'Z(}/o|/g""4]^{#V##s#r "| 2 *+#~##^#V$#O: yʜ#^#0#0#zg#Ç#-# > ڰ#IA!#E͇00+-#Undefined line -####N#F>!#*` +p+q+w: #BBBABSBE: * * ͺB ~0ڿ ҿ 2 <2 ~$#$Î@$g"8$!@$EIC#~ $"7/7Random number seed (0-65529)d$*" ‰$#~#Y #^#V" y~ʢ$n$o$o$n$o$t$** "8+t$$B,+$": 2 2 !z5($('x:"͠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:'ƀo&")!)6!"):)/)HҘ]!)6> !)ڎ*)&*)*)&*) y!)6 Ä:) 2):)<2)M*)#")/:)ҩ*)+")`*")#"]!*)!/H!")!"]*)) *)s#r!"?ͱ !+s#r!+s#r#4D ͠:\ʹ :\=Oͳͩ !6!)6l :) :)=2) :] & !"}2\!h6?!j6?\:'C:'ƀo&")!)6!"):)/)HҘ]!)6> !)ڎ*)&*)*)&*) y!)6 Ä:) 2):)<2)M*)#")/:)ҩ*)+")`*")#"]!*)!/H!")!"]*)) *)s#r!"( :] 7(z[+{*xF6{o|PA{o|2 8:] " " LͶA!9D(:] * ~)kB,* B,!2D ʯ2] !9;(!9.,:] G:D Od}!F O`g* * B)>" : OͶAO/2 '!%7''!%7͹&'͡'$͒'.M'y2&"&PX!M%!u&! ~#ʩ&Wyҍ&O|g}oxGʡ&x Gz&CZQO'!,'͒'/.M'44+~2&+~2&+~2&AOW_2&}o|gxG>?&2&7y<=" )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""",K2 * ͵+¿ ( * ͺB(tEE* T]##N#F! `* +" |2 !O w# x[*#| B>2 G8~¿ #~¿ #/I 2v+ʷB, ʸÿ  22 22/<(z 22B, +{>2͖[!"N#F#x} *|̊AN#F#ͺB| " ͇0~ n > @͇ !X } VA. ~ >#} X 2 ͖[Ú #~ ک _ڽ _.ʽ t!ҽ : < > >2 { !Ö <~ #~# ̸)"<':&x'> Å%{_zWyO)xG:&2&y&! 5&b%>.! N#G.xq'}! Gxp'ƀwʧ&#(w+͒'/b% b%(x/G$! 4/: : /<! Op#6J%'F+ ! ~w'og)) '* ||Ü'* * (" `i" ! ^#V#N#F# (:] Gw#(! ~7w?##wy7O! (G(! (  xʒ'!'͒'y! ym(#x+y+z+{z|''}'! ( ʒ'!'͒'O! y#j(+³(͖(›'* (A(!v5;(t+K)($: 2 : ͏):#B# )))|/g}/o))! : 2)͏)" >2] S(aj()^) (̓)x#(! FÄ%* ̓)|Uæ' ^)!" " >>.) GOW_(#(g)>%|ܖ%ܯ%z< ͒')')ø') )! ~: ~͏)6{yJ%! ~*(m) *O+~+ *!*))m)y(#(+6H*! >s,+,2 +! ~5#K*!xp*>);)l* ;=^*|G<+yÂ*|Gz()a)'V+Ä/|))0+DM!>)*)ҿ* *=±*|*x8+*a)'a)S&x))a)'| 0+#k0,0.1+60{1+6${+p2 ! 6 '* * 2 1E~t1:T10T1 #~E1>DGC1" `i" #~+ʻ1-ʒ10OxGһ1#~y1`xE°1y d1>2 1|d1è1d1" `i" '#W3: 1111h460 (͏4+~0 2. (=2>"w#6+.26-/</ 02:#p#w#6! #zҾ2[3`4z<4'5{i'=<40s2p#6! #: ~ x2*x2+2-+$0¶2#Ҷ2++wʬ2y2ʶ26%b32~5͐(2͖0+6%S(2͒'3 3_x<4S4͏# #~:909C9.9x&ҿ 2~V9%$!#xA_! V+z2] : =:r9~(e:3e:2 : 2 9*  " * ͺBʸ9o«9«94:>&* ͺB:] -;#:~#:~>## ;^#0Q: N:!(B!; E:.C/2.C:[ VA6!W > @> @*|lA:xA2ɯ2[ :=@A*A*A0CBAͺB~ +ëA*l  >>ƕo>Ag9*++"  A6FAA* ͺB:G!^#V#BͧR*hC2 2 2 w#w#" *+" 2 2 : IB! 6#BB(7!7(!7w#w#w2 og" " *l : tB" B* " " ͧR*++" ##!p "n $v@ͯgo" 2 "D " " 2 * |}~B##~: ÿ *B`iҦ+" + +7>{_zW}o|g=+*|G7+|))Ooyg))* <+|̓)æ'*g{o,)8+! ~w! ~G+N 8(Ҡ+/<#Fwx+ +F+N9#(! G>w2 ! s,: 2 x+H,,4/͟,,>J,! `,G: ,! Vwz# +x+b%! ͧ,,x,! wb%: +,! ~++w! 4#0,4/+6& ! P,>!  2W,# V,~/w! Oyw#j,qڊ,NsY+,u, W~w+”,Í,! Ñ,~w# ©,͒': b%C'-q,GH,͟,x ,,+! {,,L} #H4L4{4`2_y/3/3{_x63<4S4G3<4y4O<4GO͏4R3* =<4Pi2^)ѯh3͒'73y/OzWO/33/< {4/>M,Ҹ4>M,p#=¯4! '4$>͏)'5?{4(/#$W^#V#::\ DMʧ&ʗ; ::;;w#_;q#p;#OͶA##" q#:\ y];: O_;q#p#S*=M;BKAA" +6ͺBz;W* ^) ++s#r#;GO~#^#V#ͺB;S*=DMœ;:] DM););); * 7~#O G#w;G# <#;x=;=2* !@ć0> @!X  ~#Q=#<s=!=>==(n=<k=>@VA"<~ >#^@@@VA* | * " <2>2 8! (* B,8 * ͺB( (>2 82 `i C * ͺBC `i" ~,ëC~A[?,B,D+,BB,,B*,Dg"+fDB,fD+¿ !NͺBA}_|WA*  ͺBA"l ",B**l {_zW7D2 " 8" F ^#V#* ͺB ~#~#D': D! '$ ((S( E####N#F#^#Vi`: D* D*:]  r+s# : A-,! (ò,: $-2 !'`- ! (`-t+ ! (>h-t-t+! ͅ-=A-`-`-`-! 5b%! >5=m->! N#F#=z->! p+q+=‹-: /@'44/-!- qA>?,?ڿ->?,: <=,! ͩ,!& ͧ,x­-! 5­-b%y2 +, ~q+-A(+~/wt+4/b%̀)$>2 `h))~& -D.+D.+/..eV.Eu.ln.Ln.qn.Q>Ž.~%.#.!.dʎ.D¥..ډ/¥._{_./©.̸'!&2) ¥..D. #å...A)m){'-#{_#zW#yO++4ͣ%#'p#4>-55>{4N#F#* /}o|g@5" p#=-5{4w1_cƤ~@zZrN vH Tʚ;@B''d Gg" կ5)))) 6y= 660:6 %655!''!z5'<6A)!$>2 ͒'xʊ6U6/c%y(r6)S(|" " (6' &S&8;S&: ҿ6h6')Ɓ6$!67JS&': 6b%/'|Yt&wz^Pc|u~r1'*#( >ܱ= =#~<<} VA9<~>\ >~8= >ͱ=)=>\@~*A `= `=`= `=>@A=w >#>=6H<*Aʡ= =ʣ= == = s=_=>_= >+s= ~7ʧ&#~+w#ó=y=>@s= o&DM#ͨAw >#s=x+~ >=} VAz @]A> z: N>2 F#N#fix>X~#\? n> ]>C>\?@_W?W~#!?#>&ʼ?ʚ?+>{>+~#.>_ʰ?\Y>r>$>*r>x#>~$> >#W)?~#.>#>, ?z@W>~#>.r># #8^#V#̀((E"i`Ü" * ~, ͂DuG~#N#F|G^#N#F{zد< #CE?Ý'5jE5jE͖0͖ExGG~# FN#F͋EokG F! w#s#r+"P#~ ʬEʬEE"x,E E+~ ʹE#y͋E >*n " >2] ( ͺB"n ~ #͖ExG( @ `AE* * /O #ͺB)F" #  F*l " !* !p *n ͺBGFF!B " * " * * ͺBʈF~###;FF_dF* ~#fo* ʫF" ##^#V#" dF* ͺBG~###;N#F# ªF" N #* ͺBʫFFů#^#V#DM* ͺB`iͺB`i# =&-2 *$2[ > $> $! w0=0{0(O0! {0(* |l0*ͺB!" !"!6 EE))1ó01ʡ06+'06-͸'#60: W:] D2<2(1'5! F : _ 0x*0{0Aq 1E 1D 10#n(S&'~#'=S&($7RO!%'=7Ã)͒'!77!7'!7Ȇw#O (S&:7<27!7O $({YOO6+F6!74~֫•7w M%!7 (w+w+wy75Jʙ9v" GSљ e͘w>ROhFhiuh!O8$: w"~S&')$S()8$$͒''$': 682 !W86: 2 "~Ie&X4#]I'7''7÷&͒'(6': ڞ8QY͹&!$!86!O8 J;xn{/|t1}=Z}~L~l+B,82\ FCڿ O#~:808C8.*9O#,[)?~##>'?T]^###xG#z+I?xI?~-D?I?>Wʥ?Cxz͗0E+7ʁ?2 ;~?,¿ ~#N#fi_xx>à??@;>VA{Gï?~#@Ò??>?ʥ?͈)* A!HE* h?@?z>+@*|T:ʎ@.@=:=2i@ B@> @:3@ _@h@:<:_@!@h@<2Oɯ2:> i@> i@2:'F­@:[ ʿ@=2[ >@ @> @:[ ²@ @:G:[ @VA@<2[ O*|)A6Vҧ&#<}+F+N+n& PY+DM* ͨAq#pi`+9F* :͈)~*  ͈E|G{G* cGcG!E~#N#Fo,- lG͈)* ͖GPYN* ͺB”GG " *n +F+N+ͺB"n vuGW~vͪG#^#V>͈E * sEB( B,B)G GͶGH > {͈E_G* w#HG͐HO>~*Hx F#F#fh DM͋EokG|GE͐HH~͕HͩI"H=O~GCͪGv_#~#foFr~.pB)Cͼ>ʼH B,͈)B,* B)uG&v{GG=O>x~#F#fh GN#^$$#V$I I#Iѯx<#IIB(8͈)#^#V* ͺBSItE(B, ~ͩI͵uGG!&y~<چIyH #^#fk GN#~#foyw# žI)ʷIB, B)* * cxG6F* * c>?@> @I@BJ6Jp2 @7JVA!:<:>\2JI@>+1J~@I+@I@VA!X 2O J:XJ>\@2yJ0C7 K J |JIJ0CIšJI@> @>*J¤J>#1J½J6VA!X } I IxJ!X "ayq#@ I2[ > @@J I$ Q*% 46!W { !QB͚E.ɷw#QmW3Q:2+]QB,BR¿ 22!6"B:2*""*#|<ˆQ"6Vژ ™Q2 ÝQ<R**  ͺBQͿUw#ҠQ" : S[͡##" !~26(B:2: N:} àͯ͐TöBBA3Q+ RQÿ 26Vژ <ʖ *% 4Ø *|B 5Q+QRB,P[BA& #͖[>T* *ͺBQ~#TcRT:–RR=}R~,~# RůsRѯOʜ – ! ~#fo" !"[| G~, BABS8͈)O*[ "[*$ X +Y* ͺB! s#r#w,Y2[O– ! ^#V~,+¿ {ʫ +s#r! w#w! ~#fo!ͺBŒYYBK>!)ҟY)#àY))ҮY ҭY#=•Y}_}la)Y#x"[! "[!& "[!}o|gͺBYbk:[8ZͺB ZUZDM*[*[͌Z"[PYTZ}o|g*[#"[YUZDM*[*[͌Z"[PYZ2*[! ~#foͺBs#r{Z:ʈZ!Z!# /U~# xZDMZʮ Z! w!% V6 ZzwZʮ Z! ~!Z! ^#V! s#rDMZZͺ$0s particular tastes and hardware facilities. Option Name Function NLINES Number of lines on the user's CRT for paging WIDE 0This equate is used to select a narrow or wide  4 display under the DIR command; if WIDE is equated  . to TRUE, each file name is separated by two  3 spaces, a FENCE, and two more spaces; if WIDE is  3 equated to FALSE, each file name is separated by   one space, a FENCE, and $BJ: QAw!W >2 ;2 " ]$͇K337K " ** gK¿ ͇K²K" *" ##^#V#~#fo"'{KA3à* "à!9~#›K ËKN#F`iͺB ËK >2 8;(("  ͶA!9 +" &LB(8s#r#~,L KB)" >!=&L=&L=&L!9DM!1L* * * à2 2 ~NL2 #+3Q!" +LB,,Lg"" +LB,ʢLBABLBLNB,¿ 2 #`i" LT]" ͺBN*+#~#ʋM#^#V"L:LL+L$ ͺBڮ q#s#rR78͈)͵uGF~O#^#VʘS*ͺBqS* ͺBqSY* * ͺBڬSy FuG#s#r#^#V#^#Vy҆SGOԢSʝS~#ÍSܢS> åS½Sx͈EEZSB$B( ~,SOʖ OB)}͈ET*ATw# SͯEB6Vڢ TOʖ !$ ~QT#~FT`iU+T>O #~'PY!$ 6%Vʓ TѯÐ <ʱ !" ^#Vr+sOT PY¶T!T`i>U!$ ~ZT%V&TOʜ !#T! ~+nxOʜ ! ~v*~C$$B" #[>YRS[öB ** ͺB!8}o|g!W8}o|g J[  [ [ ** ͺB!W8}o|g!8}o|g „[ Z[ Z[*|<: A*+6*\~9Q} !L^"" * ^#V"A"##^#V".A##^#V"@##^#V"o@!"22Z 2 2 2!"!" !p "n ! "B *"l >2!\"\:\\<2\!~"\\F#~+w##K\+6"\!\/\+6""\#/\p\\6S\Mʔ\F¿ B:ʳ\z{2ø\"l +\B/Ä\B:" ø\+*l +"l +:!["2<s#r#$4 Qone more space PGDFLT This is the Paging Default flag for the TYPE  . command; if PGDFLT is set to TRUE, the TYPE  . command will page its output by default and  / the P option on the TYPE command (see below)  3 will prohibit paging; if PGDFLT is set to FALSE,  / the TYPE command will NOT page its output by  b default and the P option will enable paging PGDFLG This sets the option character in$vL>2 8^MyO:>2 +M~(1MzM~(8zJMyO:] Wr9zBK!mM RM 2 ~(1M QM+L(„MB)LB,M* * ͺBMN#~w##; M;M* " ÒM* ͺBMy_xW `i" * ͺBN#~w##;N#F# M;MM* * ͺB,N~###;$NdN_N* ͺBʎN~###;N#F# +N" N #* ͺB,NUNů#^#V#* ͺB*ͺB+++tE(6F* DM* * }o|g" * " ͨA`i+" : N* DM* 4"͡>2 : R:2XQ2 2 * DM* " * #* * " $0ZDM$~WT4~O#V p(Uzw w+s#r#6#6DM! {zV|Uw*T]" N#F+q#p###6 V%V=V>w+w!%ͿU7?*$ 6#67uG~ʨ #^#fk_tVN#~:xV++@ʨ y@ڨ Ҩ  #V~.¢VͰV7ÎV#V2z ʨ ڨ > ðVʩV> VéVQV<ʙ ! w# VB$( *  DM=\#""" {ozgA|g}o(]|<]!{ozgA"l "" " *A}o|g!]E͇0!]E!E" VA!u "å[ Owned by Microsoft Bytes freeBASIC Rev. 5.03 [CP/M Version] Copyright 1977, 78, 79 (C) by Microsoft Created: 21-Aug-79 = Ҩ  #V~.¢VͰV7ÎV#V2z ʨ ڨ > ðVʩV> VéVQV<ʙ ! w# VB$8 the command  / line for the TYPE command (the 'P' mentioned  3 above); if the user wishes to change this option  o character, he need only change this equate MAXUSR This is the largest user number recognized by  2 the USER command; if the user wishes to protect  0 the higher user areas, he may set this symbol  1 to the highest area normally accessable; 15 is   the largest permitted value f$ ͺBO `i" * |*+ʠҦ `ià;O+ʋO{O͖0͖E* #^#V [Or+s+5E+ʋO;pOB,+>,@8O>"@E>"@^O*|ʵO~µOZ}o|gҵO> @+|ªOVAï#OѻO– B,`i"+# _:ڜ !N#F O!& >>>L͈E* D(G>>>uG<#N#fi2] ;(E ,dPZdPͼO8͈)W_6Vڢ wPgP"ŒPG{,xŒPPX6VP!X Oz"yP P PO{,y)Q6VP P{ P,> PPPP)Q6VґP"P Q6V Q P, Q Q6V Q$ABSQV:!<´ uG~ʖ #N#F OUWIUWR– B,# B,{ʜ _O¥ zQVY" ڡW{¡W!~ ¡W6B#6A#6S"# w# ¬Wqq%V~W<ʱ W.@ ·X:[ W:X> @@VA§X~*6?# $,$<6Por MAXUSR SYSFLG This is the option character for the DIR command  0 line which is used to specify that DIR search  2 All Files (both $SYS and $DIR) for its display;  o the distributed default for this is 'A' SOFLG This is the option character for the DIR command  0 line which is used to specify that DIR search  3 ONLY the $SYS files for its display; the distri-   buted default for this is '%t%eIS' SUPRES Set SUPRES to TRUE to suppress printing the user  1 number when the user is under User Number 0 or  1 set SUPRES to FALSE to ALWAYS display the User  1 Number with the CPR prompt; with SUPRES set to  0 TRUE, a user on B: in user 0 sees 'B>' as the  2 prompt, but with SUPRES set to FALSE, a user on  & B: in user 0 sees 'B0>' as the prompt  Page%ault  U value is 'S' FENCE This is the character printed to separate entries  8 in a directory listing; it's default value is '|'  Patching SUBMIT.COM SUBMIT.COM may be patched to run with ZCPR by the following procedure (this is recommended if the user does not have SUB.COM). This patch simply makes it always place the $$$.SUB file on Drive A:. 6Illustrative terminal session follows: A>ddt b:su% in further detail.  1. If the command is of the form 'COMMAND' and NOT 'd:COMMAND', the CPR-resident command list is searched for a match. If the match is found, the CPR-resident command is immediately processed. If the match is not found or the command is of the form 'd:COMMAND', the next step is taken. Note that the 'd:COMMAND' form is good for executing a command COM file which has the same name as a CPR-resident command (such as SAVE %0ded as described above and executed. If not, ZCPR prints the command name as an error message and returns to command input mode, aborting the SUBMIT file if COMMAND came from it. In all cases of the search above, if COMMAND.COM is found, after it is loaded into memory, ZCPR resets the user to his original disk drive and user number. Hence, the files referenced by the user by default are obtained from this environment. To illustrate this comman% 9  * ZCPR - A Z80 Replacement for the CP/M CCP ? DEFUSR This is the CPR-default user number which is  0 searched in the command hierarchy for the COM  1 files (distributed as 0); the DFU changes this  0 temporarily until a Warm Boot or Cold Boot is  1 done, at which time the search reverts to this  M value SPRMPT This is the CPR prompt character which indicates   that %:bmit.com DDT VERS 2.0 NEXT PC 0600 0100 -s5bb <-- Patch is at 5BB Hex 05BB 00 1 <-- Change 0 (default drive) to 1 (drive A:) 05BC 24 . <-- That's it! -d5b0 5cf <-- See change 05B0 00 00 00 00 00 00 30 30 31 20 24 01 24 24 24 20 ......001 $.$$$ 05C0 20 20 20 20 53 55& 42 00 00 00 1A 1A 1A 1A 1A 1A SUB... -^C A <-- Done A>save 5 newsubmt.com <-- Save new SUBMIT.COM file  Pa%$ or DIR).  2. If the command is of the form 'd:COMMAND', disk drive 'd:' is temporarily logged in for the purpose of the command search. Otherwise, the currently logged-in drive is used.  3. Now the file named COMMAND.COM is searched for. If found, it is loaded into memory starting at 100H and executed. If not, proceed to step 4.  \4. Now that the first search for COMMAND.COM has failed, the CPR checks to see %4}d hierarchy search, consider the following examples: Example 1: DEFUSR equ 0 {default user number is 0} B10> i <-- User is on Drive B:, User Number 10 B10>ASM TEST.BBZ <-- User wishes to assemble TEST.ASM in  W Drive B:, User 10 <-- At this point, ZCPR looks on B:/10 for ASM.COM, fails,  5looks on B:/0, fails, and finally looks on A:/0; it  Rfinds ASM.COM here and goes back to B:/10 for the file Example 2: DEFUSR e%+a SUBMIT file is in execution; by default  0 it is set to '$', so prompts like 'A$' appear  d during SUBMIT file execution CPRMPT This is the CPR prompt character which indicates  3 that the CPR is awaiting a user console command;  / by default it is set to '>', so prompts like  j 'A>' appear during user input to the CPR NUMBASE This is the escape character used by those   commands which requi%ge 10  * ZCPR - A Z80 Replacement for the CP/M CCP  Part B  Usage Instructions and Explanation of Commands The following instructions are written with the assumption that the reader is quite familiar with how to use CP/M 2.2 and its CCP. ZCPR is written as a logical extension of the CP/9M 2.2 CCP philosophy and should be addressed as such.  .The ZCPR Command Hierarchy Search Th%(oif the user is under the current Default User Number. The Default User Number may be that set by the DEFUSR equate in the CPR or that set by the user via the DFU command. DEFUSR is in effect if DFU has not been issued since the last Warm or Cold Boot, and DFU is in effect if it was issued since the last Warm or Cold Boot. If the user is NOT under the current Default User Number, ZCPR temporarily logs him into it and searches the directory. If COMMAND.COM is fou%8qu 0 and DFU issued B10> <-- User is on Drive B:, User Number 10 B10>DFU 5 <-- User Selects User 5 as default B10>ASM TEST.BBZ <-- As above <-- At this point, ZCPR looks on B:/10 for ASM.COM, fails,  4look on B:/5, fails, and finally looks on A:/5; it  Yfails here also and prints ASM? as an error message Example 3: DEFUSR equ 0 B> b <-- User is on Drive B:, User Number 0 B>ASM TEST.BBZ <-- As above <-- At this po% re a DECIMAL number as  , an argument; placing this character after  + the number argument switches the base to  4 HEXADECIMAL; for example, 'SAVE 15 MYFILE' can be  . expressed as 'SAVE FH MYFILE' if NUMBASE is  ` set to 'H' (the default) SECTFLG This character constant is the suffix option for  1 the SAVE command which specifies that sectors,  . as opposed to pages, are to be saved; the def%e first, and most basic thing, to learn about ZCPR is the order in which is searches for a COM file for execution or a file specified by the GET command. Under the CP/M 2.2 CCP, if the specified COM file command was not found on the current drive in the current user area, the CCP aborted with an error message. ZCPR, however, continues searching from this point a maximum of two more levels. This command hierarchy search was outlined above and is described here %,dnd, it is loaded as described above and executed. If not, ZCPR proceeds to the next step.  Page 11  * ZCPR - A Z80 Replacement for the CP/M CCP  5. The user is now in the Default User Number, and at this point, ZCPR checks to see if the user is on disk drive A:. If not, it temporarily logs into A: and searches the default user number of A: for COMMAND.COM. If found, it is  loa%<G-int, ZCPR looks on B:/0 for ASM.COM, fails,  Vlooks on A:/0, fails, and prints error message Example 4: DEFUSR equ 0 A10> <-- User is on Drive A:, User Number 10 A10>ASM TEST.AAZ <-- As above, but file on A: <-- At this point, ZCPR looks on A:/10 for ASM.COM, fails,  .looks on A:/0, fails, and prints error message  Page 12  + ZCPR - A Z80 Replacement for the CP/M CCP && Another Example:  For example, if the user is logged into Drive B: in User Area 10, the Default User Number is 0, and the following COM files are present as indicated --   WM.COM on Drive A: in User 0  * MBASIC.COM on Drive A: in User 0 and on  Drive B: in User 0  / TEST.COM on Drive B: in User 10 and Drive B:  Hin User 0 then the following happens when the following comma&- Page 13  * ZCPR - A Z80 Replacement for the CP/M CCP  The ZCPR-Resident Commands The following pages describe the ZCPR-Resident Commands. These are commands located within ZCPR itself which are executed from within ZCPR. The phrases and refer to ambiguous file name annd unambigous file name as per the CP/M convention. Command: DIR Function: To Display a listing of th& )Sorry for this problem! The ERASE command (to be given to SIG/M by RLC in the near future) is a solution to this problem.  Page 14  * ZCPR - A Z80 Replacement for the CP/M CCP n Command: LIST Function: To Print the specified file on the CP/M LST: device Forms: LIST  m<-- Print the file (no paging) Customization Variables: -None- Examples: LIST TEST.TXT &0ied part of the TPA.  Page 15  * ZCPR - A Z80 Replacement for the CP/M CCP Command: REN Function: To Change the name of a disk file Forms: REN = Customization Variables: RAS Examples: REN NEWFILE.TXT=OLDFILE.TXT Notes: If already exists, the message 'DTelete File?' will be printed and the user may respond with Y or y to delete &nds are issued from the console (or Indirect Command File): B10>WM TEST2.TXT \ \ \__ File to be edited \ \__ Invoke the WM.COM file (Word Master editor) \__ User is on Drive B: in User Area 10 Results:  ZCPR searches B: User 10, B: User 0, and A: User 0 for WM.COM; it finds WM.COM in A: User 0, loads it, logs the user back into B: User 10, and executes it. B10>MBASIC \ \__ Invoke the MBASIC.COM file (MBASIC Interpreter) \__ &8e names of the files on disk Forms: DIR  , <-- Displays $DIR files DIR S , <-- Displays $SYS files DIR A <-- Displays both $DIR and $SYS files Customization Variables: WIDE SYSFLG SOFLG FENCE Examples: DIR *.ASM , <-- All $DIR .ASM files DIR *.COM S , <-- All $SYS .COM files DIR *.COM A W <-- All .COM files Notes: If a file is scanned for and no such name exist&$\ <-- Print TEST.TXT on LST: Notes: If the file has a $SYS attribute, it will be found as well as those with $DIR attributes. Command: TYPE Function: To Print the specified file on the CP/M CON: device Forms: TYPE  =<-- Print the file with the paging deflt TYPE P *<-- Print the file with the paging deflt  anegated Customization Variables: NLINES PGDFLT PGDFLG Examples: TYPE &4Tthe current and then rename to . Command: USER Function: To Change the current user number Forms: USER <-- in DEC USER H <-- in HEX Customization Variables: -None- Examples: USER 15 USER FH USER 0 USER <-- Same as USER 0 Notes: -None- Command: DFU Function: To Temporarily Change the default user number for the &8User is on Drive B: in User Area 10 Results:  ZCPR searches B: User 10 and B: User 0 for MBASIC.COM; it finds MBASIC.COM in B: User 0, so it doesn't bother to look on A: User 0. MBASIC.COM is then loaded and executed as described in the previous example. B10>TEST \ \__ Invgoke the TEST.COM file (TEST program) \__ User is on Drive B: in User Area 10 Results:  JZCPR searches B: User 10 for TEST.COM; it finds TEST.COM in B:& s on disk, the 'No Files' message will appear. However, if a file is scanned for and the name exists as a $SYS file and $DIR files are being scanned for, no file name is displayed but the 'No Files' message does NOT appear. For example, if TEST.COM is a $SYS file and 'DIR TEST.COM' is issued, no message appears. If 'DIR TEXT.COM' is issued and TEXT.COM does not exist on disk, the 'No Files' message is displayed. Command: ERA Function: To Erase the &(bTEST.TXT TYPE TEST.TXT P Notes: When the display pauses during paging, type any char to continue or ^C to abort. ^S also works. Command: SAVE Function: To Copy the TPA starting at 100H to disk Forms: SAVE <-- in DEC SAVE H <-- in HEX SAVE S <-- Number of sectors SAVE H S <-- Number of sectors Cust&8  <-- in DEC DFU H <-- in HEX Customization Variables: -None- Examples: DFU 15  DFU FH W DFU 0 DFU <-- Same as DFU 0 Notes: See above for explanation.  Page 16  * ZCPR - A Z80 Replacement for the CP/M CCP  Comm& { User 0, so it doesn't bother to look further (if it had, it would have found TEST.COM in B: User 0). TEST.COM is then loaded and executed as described above. B10>TEST2 \ \__ Invoke the TEST2.COM file (TEST2 program) \__ Use5r is on Drive B: in User Area 10 Results:  ZCPR searches B: User 10, B: User 0, and A: User 0 for TEST2.COM; it doesn't find it, so it issues the error message 'TEST2?', which says it couldn't find TEST2.COM.  &:specified $R/W files from disk Forms: ERA  v <-- Erase both $DIR and $SYS files Customization Variables: WIDE FENCE Examples: ERA *.ASM ) <-- Erase all .ASM files ERA *.* <-- Erase all files Notes: If a $R/O file is encountered, a BDOS error message will be displayed and the procedure is stopped. The user is unsure at this time as to which files have been erased and which have not and should check. &,omization Variables: NUMBASE RAS Examples: SAVE 15 MYFILE.TXT <-- 15 pages saved SAVE FH MYFILE.TXT <-- 15 pages saved SAVE 10H MYFILE.TXT S <-- 16 sectors (8 pages) saved Notes: If the file name to be saved already exists, then SAVE will exit with the message 'Delete File?'; if the user REALLY wants to save under this name, he may then type Y or y and the current file will be deleted and then recreated containing the specif&<uand: JUMP Function: To "call" the subroutine at the specified page address Forms: JUMP
<--
in HEX Customization Variables: NUMBASE RAS Examples: JUMP E000 or JUMP E000H <-- Jump to E000H JUMP <-- Jump to 000H JUMP 0 <-- Jump to 000H Notes: JUMP performs a subroutine "call", so the called routine may return to the ZCPR by either a RET or a Warm Boot. Command: GO 'f'X Function: To "call" the subroutine starting at 100H Forms: GO  d <-- Execute reentrant at 100H Customization Variables: RAS Examples: GO *.ASM  <-- Assuming XDIR is loaded,  gives directory of *.ASM Notes: This command is identical in function to JUMP 100H; JUMP, however, leaves the address as the first entry in CP/M BASE + 80H (the input line buffer), while GO has no such addres'ter input is  4required (Y or y for yes and anything else for no)  `with NO to end the line Full From SAVE, means that there is not enough space on  disk  3From GET or command load by CPR, means that there  1is not enough space in memory Delete File?  :From REN or SAVE, means that the file specified already  8exists on disk and the user may type Y or y to delete  it and proceed with th' is set to point to CIBUFF (the first character of the command line). Command Level 3 is an extended concept to Command Levels 1 and 2 which is specifically supported by ZCPR Version 1.0 and beyond. This command level allows a transient program to place a command line into CIBUFF and the character count into CBUFF and have this command line executed by ZCPR. Once control is trans- ferred to ZCPR to execute the command line, the transient program which placed '0V this number, but the user may select a flag of his choice. This flag is one byte long, and the high-order nybble (4 bits) contains the user number and the low-order nybble contains the disk number to process the command from. F The User/Disk Flag is to be passed to ZCPR in the C Register.  4. When ready, transfer control to ZCPR to process the command by JMPing to the base address of ZCPR. The first JMP in the JMP Table given above is at this address.'[s. Command: GET Function: To load a file from disk into memory starting at the  specified page Forms: GET
<--
in HEX Customization Variables: NUMBASE RAS Examples: GET 8000 TEST.80 h <-- Load TEST.80 starting at 8000H GET 100 TEST.80 or GET 100H TEST.80 <-- Load TEST.80  ' starting at 100H GET 0 TEST.80 +<-- Load TEST.80 starting at 000H Notes:'oe REN or SAVE function  Page 18  * ZCPR - A Z80 Replacement for the CP/M CCP  Part C  ZCPR Command Levels and How to Use Them ZCPR Version 1.0 and beyond supports three distinct command levels in its implementation. Each level constitutes a different way to issue a command for ZCPR to process. Comman'$/the command line loses control and the command is executed exactly as though it had been typed by the user at his console terminal. In order for a transient program to utilize the Command Level 3 facility, this program MUST do the following:  1. Locate the ZCPR. Since the ZCPR is ALWAYS 2K bytes in size and located directly under the BDOS, the transient can locate the ZCPR by examining the BDOS entry page address at location 7 and subtrac'4\ At this time, ZCPR will log in the user and disk in the User/Disk Flag and process the Command Level 3 Command Line."  Page 20  * ZCPR - A Z80 Replacement for the CP/M CCP The following is a sample program which illustrates the steps outlined above: ; ; Demonstration of Command Level 3 Facility by RLC ; udflag equ 4 ' GET searches for the specified file according to the same command hierarchy search employed by the ZCPR command scanner. Hence, if the user is on B:/10 and the file is on A:/0 with the current default user number at 0, GET Cwill search from B:/10 to B:/0 to A:/0 in looking for the file.  Page 17  * ZCPR - A Z80 Replacement for the CP/M CCP   ZCPR Error Messages 'd Levels 1 and 2 are common to all implementations of CP/M and CP/ZM from CP/M Version 1.4. Command Level 1 is that command level in which the command is issued by the user from his console terminal. The prompt 'd>' or 'du>' appears on the terminal, and the user is allowed to enter the command with editing from the terminal. Command Level 2 is that command level in which the command is entered from an executing $$$.SUB file. In both cases, the command '(Vpting 8 from this number (8 pages = 2K bytes). The resulting number is the base page address of ZCPR.  2. Store the command line in CIBUFF and the character count in CBUFF. Knowing the base page address of ZCPR, the following information is useful in doing this:  Page 19  * ZCPR - A Z80 Replacement for the CP/M CCP  ' ORG CPRLOC ;Base Address of ZCPR  '8Y ;Address of User/Disk Flag bdos equ 5 ;Address of BDOS Entry Point  org 100h  $lxi d,prmpt ;Print User Prompt  !mvi c,9 ;PRINT function  call bdos  &lhld bdos+1 ;Get address of BDOS  *mov a,h ;High-Order Address in A  .sui 8 ;A=High-Order Address of CPR  $mov h,a ;HL=Address of CPR  mvi l,0  /shld cpr ;Save address in buffer ' v The following are the error messages issued by ZCPR and their meanings. Message Meaning ? 9 Printed after a command or an argument means that such  Swas invalid No File From DIR, this means that DIR did not locate any files  kAlso from ERA with the same meaning All? Issued in response ERA *.*, asks the user is he really  1wants to erase all the files. Unlike under the  $original CP/M 2.2 CCP, single charac'^is stored in the internal ZCPR buffer called CIBUFF (Command Input BUFFer). Under both Command Levels 1 and 2, the command is placed into this buffer, the characters of the command line are capitalized, a character count which indicates the number of characters in the command line is stored in CBUFF (the byte before CIBUFF), an ending binary 0 is placed after the last character in the command line, and the internal pointer CIBPTR (Command Input Buffer PoinTeR) ',; JMP CPR ;Enter ZCPR and Execute Default Cmd  JMP CPR1 ;Enter ZCPR and Don't Execute MBUFF: DB BUFLEN ;Size of CIBUFF in bytes CBUFF: DS 1 ] ;Number of Bytes in Command Line CIBUFF: DS BUFLEN ;Buffer for Command Line   DS 1 < ;Buffer for Ending 0 (set by ZCPR) CIBPTR: DS 2 ' ;Address of CIBUFF (set by ZCPR)  :3. Obtain the User/Disk Flag. Location 4 contains '<5 lxi d,6 ;Point to command line buffer  3dad d ;HL points to command line buffer  xchg #;DE points to command line buffer  *mvi c,10 ;READLN into this buffer  call bdos  %lhld cpr ;Get Address of CPR  %lda udflag ;Get User/Disk Flag  mov c,a ; ... in C  pchl e;Run Command Line cpr: ds 2 ;CPR Address buffer prmpt: db 'User Command? ((*G$'  Enjoy using ZCPR!  -- RLC  Page 21 )FThe User/Disk Flag is to be passed to ZCPR in the C Register.  4. When ready, transfer control to ZCPR to process the command by JMPing to the base address of ZCPR. The first JMP in the JMP Table given above is at this address.(h page 62 TITLE ZCPR Version 1.0 04/17/82 .Z80 CSEG db 0dh,"60k CCP for Jade-DD 04/17/82",1ah ; CP/M Z80 Command Processor Replacement (CPR) Version 1.0 ; CCPZ CREATED AND CUSTOMIZED FOR ARIES-II BY RLC ; FURTHER MODIFIED BY RGF AS V2.0 ; FURTHER MODIFIED BY RLC AS V2.1 ; FURTHER MODIFIED BY KBP AS V2.2 ; FURTHER MODIFIED BY RLC AS V2.4 (V2.3 skipped) ; FURTHER MODIFIED BY RLC AS V2.5 ; FURTHER MODIFIED BY RLC AS V2.6 ; FURTHUR MODIFIED BY SBB AS V2.7 ; FURTHER MODIFIED BY RLC AS ( IR DIRPR FILLQ ; 5B ERA ; 5C LIST ; 5D TYPE PAGER ; 5E SAVE ; 5F REN ; 5G USER ; 5H DFU ; 5I JUMP ; 5J GO ; 5K COM CALLPROG ERRLOG ERRJMP ; 5L GET MEMLOAD PRNLE ; FALSE EQU 0 TRUE EQU NOT FALSE ; CUSTOMIZATION EQUATES ; The following equates may be used to customize this CPR for the user's ; system and integration technique. The following constants are provided: ; BASE - Base Address of user's CP/M system (normally 0 f(0Image ;CPRR EQU 0980H ; LOAD ADDRESS FOR CCP IMAGE - STANDARD CP/M ;CPRR EQU 1100H ; LOAD ADDRESS FOR MORROW DESIGNS CPRR EQU 3D80H ; LOAD ADDRESS FOR Jade "FORMAT" PROGRAM RAS EQU FALSE ;TRUE IF CPR IS FOR A REMOTE-ACCESS SYSTEM ; The following is presented as an option, but is not generally user-customiz- ; able. A basic design choice had to be made in the design of ZCPR concerning ; the execution of SUBMIT files. The original CCP had a problem in this sense ; in that it ALWAYS loo((V2.8 ; FURTHER MODIFIED BY RLC AS V2.9 ; FURTHER MODIFIED BY RLC AS V3.0 ; FURTHER MODIFIED BY RLC AS V3.1 ; FURTHER MODIFIED BY RLC AS V4.0 ; modified by BHK for M80 assembler and COM-file loading ; ZCPR VERSION 1.0 CREATED FROM CCPZ VERSION 4.0 BY RLC IN ; A COORDINATED EFFORT WITH CCP-GROUP ; ZCPR is a group effort by CCP-GROUP, whose active membership involved ; in this project consists of the following: ; RLC - Richard Conn ; RGF - Ron Fowler ; KBP - Keith Peterson ; FJW - Frank($or DR version) ; This equate allows easy modification by non-standard CP/M (eg,H89) ; CPRLOC - Base Page Address of CPR; this value can be obtained by running ; the BDOSLOC program on your system, or by setting the ; MSIZE and BIOSEX equates to the system memory size in ; K-bytes and the "extra" memory required by your BIOS ; in K-bytes. BIOSEX is zero if your BIOS is normal size, ; and can be negative if your BIOS is in PROM or in ; non-contiguous (4ked for the SUBMIT file from drive A: and the SUBMIT ; program itself (SUBMIT.COM) would place the $$$.SUB file on the currently ; logged-in drive, so when the user was logged into B: and he issued a SUBMIT ; command, the $$$.SUB was placed on B: and did not execute because the CCP ; looked for it on A: and never found it. ; After much debate it was decided to have ZCPR perform the same type of ; function as CCP (look for the $$$.SUB file on A:), but the problem with ; SUBMIT.COM still exists. Hence((a Wancho ; The following individual also provided a contribution: ; SBB - Steve Bogolub ; ;** Structure Notes ** ; This CPR is divided into a number of major sections. The following ; is an outline of these sections and the names of the major routines ; located therein. ; Section Function/Routines ; ------- --- ; -- Opening Comments, Equates, and Macro Definitions ; 0 JMP Table into CPR ; 1 Buffers ; 2 CPR Starting Modules ; CPR1 CPR RE((-memory. ; RAS - Remote-Access System; setting this equate to TRUE disables ; certain CPR commands that are considered harmful in a Remote- ; Access environment; use under Remote-Access Systems (RBBS) for ; security purposes ; CPRR - Address of CCP in "FORMAT" or "MOVCPM" image BASE EQU 0 ;BASE OF CP/M SYSTEM (SET FOR STANDARD CP/M) ; The value of CPRLOC may be set in one ; of two ways. The first way is to set MSIZE and BIOSEX ; as described above using the following three(8, RGF designed SuperSUB and RLC took his ; SuperSUB and designed SUB from it; both programs are set up to allow the ; selection at assembly time of creating the $$$.SUB on the logged-in drive ; or on drive A:. ; A final definition of the Indirect Command File ($$$.SUB or SUBMIT ; File) is presented as follows: ; "An Indirect Command File is one which contains ; a series of commands exactly as they would be ; entered from a CP/M Console. The SUBMIT Command ; (or SUB Command) reads this files( (NSTRT RSTCPR RCPRNL ; PRNNF ; 3 Utilities ; CRLF CONOUT CONIN LCOUT LSTOUT ; READF READ BDOSB PRINTC PRINT ; GETDRV DEFDMA DMASET RESET BDOSJP ; LOGIN OPENF OPEN GRBDOS CLOSE ; SEARF SEAR1 SEARN SUBKIL DELETE ; RESETUSR GETUSR SETUSR ; 4 CPR Utilities ; SETUD SETU0D UCASE REDBUF CNVBUF ; BREAK USRNUM ERROR SDELM ADVAN ; SBLANK ADDAH NUMBER NUMERR HEXNUM ; DIRPTR SLOGIN DLOGIN COMLOG SCANER ; CMDSER ; 5 CPR-Resident Commands and Functions ; 5A D(,O lines: MSIZE EQU 60 ;SIZE OF MEM IN K-BYTES CPRLOC EQU 3400H+(MSIZE-20)*1024 ;CPR ORIGIN ; The following gives the required offset to load the CPR into the ; CP/M SYSGEN Image. ; Note that this ; value conforms with the standard value presented in the CP/M reference ; manuals, but it may not necessarily conform with the location of the ; CCP in >YOUR< CP/M system; several systems (Morrow Designs, P&T, Heath ; Org-0 to name a few) have the CCP located at a non-standard address in ; the SYSGEN (<W and transforms ; it for processing by the ZCPR (the $$$.SUB File). ; ZCPR will then execute the commands indicated ; EXACTLY as if they were typed at the Console." ; Hence, to permit this to happen, the $$$.SUB file must always ; be present on a specific drive, and A: is the choice for said drive. ; With this facility engaged as such, Indirect Command Files like: ; DIR ; A: ; DIR ; can be executed, even though the currently logged-in drive is changed ; during execution. If the $$$.SUB ))file was present on the currently ; logged-in drive, the above series of commands would not work since the ; ZCPR would be looking for $$$.SUB on the logged-in drive, and switching ; logged-in drives without moving the $$$.SUB file as well would cause ; processing to abort. SUBA equ TRUE ; Set to TRUE to have $$$.SUB always on A: ; Set to FALSE to have $$$.SUB on the logged-in drive ; The following flag enables extended processing for user-program supplied ; command lines. This is for Comma)0 ;DEFAULT USER NUMBER FOR COM FILES SPRMPT EQU ':' ;CPR PROMPT INDICATING SUBMIT COMMAND CPRMPT EQU '>' ;CPR PROMPT INDICATING USER COMMAND NUMBASE EQU 'H' ;CHARACTER USED TO SWITCH FROM DEFAULT ; NUMBER BASE SECTFLG EQU 'S' ;OPTION CHAGR FOR SAVE COMMAND TO SAVE SECTORS ; END OF CUSTOMIZATION SECTION ;--- CR EQU 0DH LF EQU 0AH TAB EQU 09H WBOOT EQU BASE+0000H ;CP/M WARM BOOT ADDRESS UDFLAG EQU BASE+0004H ;USER NUM IN HIGH ) e user programs (such as SYNONYM3) attempt to use the default ; command facility. Under the original CPR, it was necessary to initialize ; the pointer after the reserved space for the command buffer to point to ; the first byte of the command buffer. Under Version 4.x of ZCPR, this is ; no longer the case. The CIBPTR (Command Input Buffer PoinTeR) is located ; to be compatable with such programs (provided they determine the buffer ; length from the byte at MBUFF [CPRLOC + 6]), but under Version 4.x)0 store the pointer to CIBUFF in CIBPTR; ZCPR will do this for ; the calling program if CLEVEL3 is made TRUE. ; WARNING: The command line must NOT exceed BUFLEN characters in length. ; For user programs which load this command, the value of BUFLEN can be ; obtained by examining the byte at MBUFF (CPRLOC + 6). BUFLEN EQU 80 ;MAXIMUM BUFFER LENGTH MBUFF: DEFB BUFLEN ;MAXIMUM BUFFER LENGTH CBUFF: DEFB 0 ;NUMBER OF VALID CHARS IN COMMAND LINE CIBUFF: DEFB '  ';DEFAULT (COLD BOOT) COMM)nd Level 3 of ZCPR. Under the CCPZ Version ; 4.0 philosophy, three command levels exist: ; (1) that command issued by the user from his console at the '>' prompt ; (2) that command issued by a $$$.SUB file at the '$' prompt ; (3) that command issued by a user program by placing the command into ; CIBUFF and setting the character count in CBUFF ; Setting CLEVEL3 to TRUE enables extended processing of the third level of ; ZCPR command. All the user program need do is to store the command line and )NYBBLE, DISK IN LOW BDOS EQU BASE+0005H ;BDOS FUNCTION CALL ENTRY PT TFCB EQU BASE+005CH ;DEFAULT FCB BUFFER TBUFF EQU BASE+0080H ;DEFAULT DISK I/O BUFFER TPA EQU BASE+0100H ;BASE OF TPA ;--o ; MEMORY IMAGE LOADER - PLACES IMAGE OF ZCPR IN MEMORY TO OVERLAY ; D.R'S CCP IN MOVCPM. (BHK 3/15/82) ; TO USE IT: ; MOVCPM XX * ; GET CPM WITH OLD CCP IN MEM ; ZCPR ; OVERLAY OLD CCP ; GENSYS ; OR WHATEVER YOU DO TO WRITE SYS TRAC)$B of ZCPR ; this is no longer necessary. ZCPR Version 4.x automatically initializes ; this buffer pointer in all cases. ENTRY: JP CPR ; Process potential default command JP CPR1 ; Do NOT process potential default command ;**** Section 1 **** ; BUFFERS ET AL ; INPUT COMMAND LINE AND DEFAULT COMMAND ; The command line to be executed is stored here. This command line ; is generated in one of three ways: ; (1) by the user entering it through the BDOS READLN function at ; the du> prompt [u)4AND CIBUF: DEFB 0 ;COMMAND STRING TERMINATOR DEFS BUFLEN-($-CIBUFF)+1;TOTAL IS 'BUFLEN' BYTES CIBPTR: DEFW CIBUFF ;POINTER TO COMMAND INPUT BUFFER CIPTR: DEFW CIBUF ;CURRENT POINTER DEFS 26 ;STACK AREA STACK EQU $ ;TOP OF STACK ; FILE TYPE FOR COMMAND COMMSG: DEFB 'COM' ; SUBMIT FILE CONTROL BLOCK SUBFCB: IF SUBA ;IF $$$.SUB ON A: DEFB 1 ;DISK NAME SET TO DEFAULT TO DRIVE A: ENDIF IF NOT SUBA ;IF $$$.SUB ON CURRENT DRIVE DEFB 0 ;DISK NAME SET TO DEFAULT TO CURRENT )#; set the character count; ZCPR will initialize the pointers properly, store ; the ending zero properly, and capitalize the command line for processing. ; Once the command line is properly stored, the user executes the command line ; by reentering the ZCPR through CPRLOC [NOTE: The C register MUST contain ; a valid User/Disk Flag (see location 4) at this time.] CLEVEL3 equ TRUE ;ENABLE COMMAND LEVEL 3 PROCESSING ; ;*** TERMINAL AND 'TYPE' CUSTOMIZATION EQUATES NLINES EQU 24 ;NUMBER OF)K ; - FOLLOWING IS SIMPLE LOADER TO PLACE OBJECT INTO RAM STARTING AT "CPRR" imove: ld hl,i$beg ;start of zcpr image ld de,CPRR ;where movcpm puts the CCP ld bc,pleng ;how much to move ldir ;move image ret ;back to old CCP i$beg equ $ ;$-- ;**** Section 0 **** .PHASE CPRLOC ; ENTRY POINTS INTO ZCPR ; If the ZCPR is entered at location CPRLOC (at the JMP to CPR), then ; the default command in CIBUFF)(+ser input from keyboard] ; (2) by the SUBMIT File Facility placing it there from a $$$.SUB ; file ; (3) by an external program or user placing the required command ; into this buffer ; In all cases, the command line is placed into the buffer starting at ; CIBUFF. This command line is terminated by the last character (NOT Carriage ; Return), and a character count of all characters in the command line ; up to and including the last character is placed into location CBUFF ; (immediately before the )8DRIVE ENDIF DEFB '$$$' ;FILE NAME DEFB ' ' DEFB 'SUB' ;FILE TYPE DEFB 0 ;EXTENT NUMBER DEFB 0 ;S1 SUBFS2: DEFS 1 ;S2 SUBFRC: DEFS 1 ;RECORD COUNT DEFS 16 ;DISK GROUP MAP SUBFCR: DEFS 1 ;CURRENT RECORD NUMBER ; COMMAND FILE CONTROL BLOCK FCBDN: DEFS 1 ;DISK NAME FCBFN: DEFS 8 ;FILE NAME FCBFT: DEFS 3 ;FILE TYPE DEFS 1 ;EXTENT NUMBER DEFS 2 ;S1 AND S2 DEFS 1 ;RECORD COUNT FCBDM: DEFS 16 ;DISK GROUP MAP FCBCR: DEFS 1 ;CURRENT RECORD NUMBER ; OTHER BUFF) , LINES ON CRT SCREEN WIDE EQU TRUE ;TRUE IF WIDE DIR DISPLAY FENCE EQU '|' ;SEP CHAR BETWEEN DIR FILES PGDFLT EQU FALSE ;SET TO TRUE TO ENABLE PAGING BY DEFAULT PGDFLG EQU 'P' ;FOR TYPE COMMAND: PAGE OR NOT (DEP ON PGDFLT) ; THIS FLAG REVERSES THE DEFAULT EFFECT MAXUSR EQU 15 ;MAXIMUM USER NUMBER ACCESSABLE SYSFLG EQU 'A' ;FOR DIR COMMAND: LIST $SYS AND $DIR SOFLG EQU 'S' ;FOR DIR COMMAND: LIST $SYS FILES ONLY SUPRES EQU TRUE ;SUPRESSES USER # REPORT FOR USER 0 DEFUSR EQU )' will be processed. If the ZCPR is entered ; at location CPRLOC+3 (at the JMP to CPR1), then the default command in ; CIBUFF will NOT be processed. ; NOTE: Entry into ZCPR in this way is permitted under ZCPR Version 4.0, ; but in order for this to work, CIBUFF and CBUFF MUST be initialized properly ; AND the C register MUST contain a valid User/Disk Flag (see Location 4: the ; most significant nybble contains the User Number and the least significant ; nybble contains the Disk Number). ; Som),.command line at CIBUFF). The placed command line ; is then parsed, interpreted, and the indicated command is executed. ; If CLEVEL3 is permitted, a terminating zero is placed after the command ; (otherwise the user program has to place this zero) and the CIBPTR is ; properly initialized (otherwise the user program has to init this ptr). ; If the command is placed by a user program, entering at CPRLOC is enough ; to have the command processed. Again, under CCPZ Version 4.0, it is not ; necessary to )<]ERS PAGCNT: DEFB NLINES-2 ;LINES LEFT ON PAGE CHRCNT: DEFB 0 ;CHAR COUNT FOR TYPE QMCNT: DEFB 0 ;QUESTION MARK COUNT FOR FCB TOKEN SCANNER ; CPR BUILT-IN COMMAND TABLE NCHARS EQU 4 ;NUMBER OF CHARS/COMMAND ; CPR COMMAND NAME TABLE ; EACH TABLE ENTRY IS COMPOSED OF THE 4-BYTE COMMAND AND 2-BYTE ADDRESS CMDTBL: DEFB 'DIR ' DEFW DIR DEFB 'LIST' DEFW LIST DEFB 'TYPE' DEFW TYPE DEFB 'USER' DEFW USER DEFB 'DFU ' DEFW DFU IF NOT RAS ;FOR NON-RAS DEFB 'GO **' DEFW GO DEFB 'ERA ' DEFW ERA DEFB 'SAVE' DEFW SAVE DEFB 'REN ' DEFW REN DEFB 'GET ' DEFW GET DEFB 'JUMP' DEFW JUMP ENDIF NCMNDS EQU ($-CMDTBL)/(NCHARS+2) ;**** Section 2 **** ; CPR STARTING POINTS ; START CPR AND DON'T PROCESS DEFAULT COMMAND STORED CPR1: XOR A ;SET NO DEFAULT COMMAND LD (CBUFF),A ; START CPR AND POSSIBLY PROCESS DEFAULT COMMAND ; NOTE ON MODIFICATION BY RGF: BDOS RETURNS 0FFH IN ; ACCUMULATOR WHENEVER IT LOGS IN A DIRECTORY, IF AN*OM IT PUSH AF ;SAVE IT LD A,'1' ;OUTPUT 10'S DIGIT CALL CONOUT POP AF RS00: ADD A,'0' ;OUTPUT 1'S DIGIT (CONVERT TO ASCII) CALL CONOUT ; READ INPUT LINE FROM USER OR $$$.SUB RS000: CALL REDBUF ;INPUT COMMAND LINE FROM USER (OR $$$.SUB) ; PROCESS INPUT LINE RS1: IF CLEVEL3 ;IF THIRD COMMAND LEVEL IS PERMITTED CALL CNVBUF ;CAPITALIZE COMMAND LINE, PLACE ENDING 0, ; AND SET CIBPTR VALUE ENDIF CALL DEFDMA ;SET TBUFF TO DMA ADDRESS CALL GETDRV ;GET DEFAULT DRIVE NUMBER* i POP AF ;GET CHAR ; OUTPUT CHAR IN REG A TO LIST DEVICE LSTOUT: PUSH BC LD C,05H JR OUTPUT LC1: POP AF ;GET CHAR PUSH AF CALL CONOUT ;OUTPUT TO CON: POP AF CP LF ;CHECK FOR PAGING JP Z,PAGER RET READF: LD DE,FCBDN ;FALL THRU TO READ READ: LD C,14H ;FALL THRU TO BDOSB ; CALL BDOS AND SAVE BC BDOSB: PUSH BC CALL BDOS POP BC OR A RET ; PRINT STRING (ENDING IN 0) PTED TO BY RET ADR;START WITH PRINTC: PUSH AF ;SAVE FLAGS CALL CRLF ;NEW LINE POP *0,20H ;SET USER NUMBER TO VALUE IN E (GET IF E=FFH) JR BDOSJP ;MORE SPACE SAVING ; END OF BDOS FUNCTIONS ;**** Section 4 **** ; CPR UTILITIES ; SET USER/DISK FLAG TO CURRENT USER AND DEFAULT DISK SETUD: CALL GETUSR ;GET NUMBER OF CURRENT USER ADD A,A ;PLACE IT IN HIGH NYBBLE ADD A,A ADD A,A ADD A,A LD HL,TDRIVE ;MASK IN DEFAULT DRIVE NUMBER (LOW NYBBLE) OR (HL) ;MASK IN LD (UDFLAG),A ;SET USER/DISK NUMBER RET ; SET USER/DISK FLAG TO USER 0 AND DEFAULT DISK SETU0D:*Y ; FILE NAME CONTAINS A '$' IN IT. THIS IS NOW USED AS ; A CLUE TO DETERMINE WHETHER OR NOT TO DO A SEARCH ; FOR SUBMIT FILE, IN ORDER TO ELIMINATE WASTEFUL SEARCHES. CPR: LD SP,STACK ;RESET STACK PUSH BC LD A,C ;C=USER/DISK NUMBER (SEE LOC 4) RRA ;EXTRACT USER NUMBER RRA RRA RRA AND 0FH LD E,A ;SET USER NUMBER CALL SETUSR CALL RESET ;RESET DISK SYSTEM LD (RNGSUB),A ;SAVE SUBMIT CLUE FROM DRIVE A: POP BC LD A,C ;C=USER/DISK NUMBER (SEE LOC 4) AND 0FH ;EXTRACT DE*C LD (TDRIVE),A ;SET IT CALL SCANER ;PARSE COMMAND NAME FROM COMMAND LINE CALL NZ,ERROR ;ERROR IF COMMAND NAME CONTAINS A '?' LD DE,RSTCPR ;PUT RETURN ADDRESS OF COMMAND PUSH DE ;ON THE STACK LD A,(TEMPDR) ;IS COMMAND OF FORM 'D:COMMAND'? OR A ;NZ=YES JP NZ,COM ; IMMEDIATELY CALL CMDSER ;SCAN FOR CPR-RESIDENT COMMAND JP NZ,COM ;NOT CPR-RESIDENT LD A,(HL) ;FOUND IT: GET LOW-ORDER PART INC HL ;GET HIGH-ORDER PART LD H,(HL) ;STORE HIGH LD L,A ;STORE LOW JP (HL) ;EXECUTE*$AF PRINT: EX (SP),HL ;GET PTR TO STRING PUSH AF ;SAVE FLAGS CALL PRIN1 ;PRINT STRING POP AF ;GET FLAGS EX (SP),HL ;RESTORE HL AND RET ADR RET ; PRINT STRING (ENDING IN 0) PTED TO BY HL PRIN1: LD A,(HL) ;GET NEXT BYTE CALL CONOUT ;PRINT CHAR LD A,(HL) ;GET NEXT BYTE AGAIN FOR TEST INC HL ;PT TO NEXT BYTE OR A ;SET FLAGS RET Z ;DONE IF ZERO RET M ;DONE IF MSB SET JR PRIN1 ; BDOS FUNCTION ROUTINES ; RETURN NUMBER OF CURRENT DISK IN A GETDRV: LD C,19H J*4 TDRIVE EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION LD A,0 ;2ND BYTE (IMMEDIATE ARG) IS TDRIVE LD (UDFLAG),A ;SET USER/DISK NUMBER RET ; CONVERT CHAR IN A TO UPPER CASE UCASE: CP 61H ;LOWER-CASE A RET C CP 7BH ;GREATER THAN LOWER-CASE Z? RET NC AND 5FH ;CAPITALIZE RET ; INPUT NEXT COMMAND TO CPR ; This routine determines if a SUBMIT file is being processed ; and extracts the command line from it if so or from the user's console REDBUF: LD A,(RNGSUB) ;SUBMIT FILE CURR*FAULT DISK DRIVE LD (TDRIVE),A ;SET IT JR Z,NOLOG ;SKIP IF 0...ALREADY LOGGED CALL LOGIN ;LOG IN DEFAULT DISK IF NOT SUBA ;IF $$$.SUB IS ON CURRENT DRIVE LD (RNGSUB),A ;BDOS '$' CLUE ENDIF NOLOG: LD DE,SUBFCB ;CHECK FOR $$$.SUB ON CURRENT DISK RNGSUB EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION LD A,0 ;2ND BYTE (IMMEDIATE ARG) IS THE RNGSUB FLAG OR A ;SET FLAGS ON CLUE CPL ;PREPARE FOR COMING 'CMA' CALL NZ,SEAR1 CPL ;0FFH IS RETURNED IF NO $$$.SUB, SO COMPLEMENT LD (*i CPR ROUTINE ; ENTRY POINT FOR RESTARTING CPR AND LOGGING IN DEFAULT DRIVE RSTCPR: CALL DLOGIN ;LOG IN DEFAULT DRIVE ; ENTRY POINT FOR RESTARTING CPR WITHOUT LOGGING IN DEFAULT DRIVE RCPRNL: CALL SCANER ;EXTRACT NEXT TOKEN FROM COMMAND LINE LD A,(FCBFN) ;GET FIRST CHAR OF TOKEN SUB ' ' ;ANY CHAR? LD HL,TEMPDR OR (HL) JP NZ,ERROR JR RESTRT ; No File Error Message PRNNF: CALL PRINTC ;NO FILE MESSAGE DEFB 'No Fil','e'+80H RET ;**** Section 3 **** ; I/O UTILITIES ; *(BR BDOSJP ; SET 80H AS DMA ADDRESS DEFDMA: LD DE,TBUFF ;80H=TBUFF DMASET: LD C,1AH JR BDOSJP RESET: LD C,0DH BDOSJP: JP BDOS LOGIN: LD E,A LD C,0EH JR BDOSJP ;SAVE SOME CODE SPACE OPENF: XOR A LD (FCBCR),A LD DE,FCBDN ;FALL THRU TO OPEN OPEN: LD C,0FH ;FALL THRU TO GRBDOS GRBDOS: CALL BDOS INC A ;SET ZERO FLAG FOR ERROR RETURN RET CLOSE: LD C,10H JR GRBDOS SEARF: LD DE,FCBDN ;SPECIFY FCB SEAR1: LD C,11H JR GRBDOS SEARN: LD C,12H JR GRBDOS ; CHECK FO*8WENTLY IN EXECUTION? OR A ;0=NO JR Z,RB1 ;GET LINE FROM CONSOLE IF NOT LD DE,SUBFCB ;OPEN $$$.SUB PUSH DE ;SAVE DE CALL OPEN POP DE ;RESTORE DE JR Z,RB1 ;ERASE $$$.SUB IF END OF FILE AND GET CMND LD A,(SUBFRC) ;GET VALUE OF LAST RECORD IN FILE DEC A ;PT TO NEXT TO LAST RECORD LD (SUBFCR),A ;SAVE NEW VALUE OF LAST RECORD IN $$$.SUB CALL READ ;DE=SUBFCB JR NZ,RB1 ;ABORT $$$.SUB IF ERROR IN READING LAST REC LD DE,CBUFF ;COPY LAST RECORD (NEXT SUBMIT CMND) TO CBUFF LD HL,TBUFF* RNGSUB),A ;SET FLAG (0=NO $$$.SUB) LD A,(CBUFF) ;EXECUTE DEFAULT COMMAND? OR A ;0=NO JR NZ,RS1 ; PROMPT USER AND INPUT COMMAND LINE FROM HIM RESTRT: LD SP,STACK ;RESET STACK ; PRINT PROMPT (DU>) CALL CRLF ;PRINT PROMPT CALL GETDRV ;CURRENT DRIVE IS PART OF PROMPT ADD A,'A' ;CONVERT TO ASCII A-P CALL CONOUT CALL GETUSR ;GET USER NUMBER IF SUPRES ;IF SUPPRESSING USR # REPORT FOR USR 0 OR A JR Z,RS000 ENDIF CP 10 ;USER < 10? JR C,RS00 SUB 10 ;SUBTRACT 10 FR*6OUTPUT CHAR IN REG A TO CONSOLE AND DON'T CHANGE BC ; OUTPUT CRLF: LD A,CR CALL CONOUT LD A,LF ;FALL THRU TO CONOUT CONOUT: PUSH BC LD C,02H OUTPUT: LD E,A PUSH HL CALL BDOS POP HL POP BC RET CONIN: LD C,01H ;GET CHAR FROM CON: WITH ECHO CALL BDOSB JP UCASE ;CAPITALIZE LCOUT: PUSH AF ;OUTPUT CHAR TO CON: OR LST: DEP ON PRFLG PRFLG EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION LD A,0 ;2ND BYTE (IMMEDIATE ARG) IS THE PRINT FLAG OR A ;0=TYPE JR Z,LC1 *,GR SUBMIT FILE IN EXECUTION AND ABORT IT IF SO SUBKIL: LD HL,RNGSUB ;CHECK FOR SUBMIT FILE IN EXECUTION LD A,(HL) OR A ;0=NO RET Z LD (HL),0 ;ABORT SUBMIT FILE LD DE,SUBFCB ;DELETE $$$.SUB DELETE: LD C,13H JR BDOSJP ;SAVE MORE SPACE ; RESET USER NUMBER IF CHANGED RESETUSR: TMPUSR EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION LD A,0 ;2ND BYTE (IMMEDIATE ARG) IS TMPUSR LD E,A ;PLACE IN E JR SETUSR ;THEN GO SET USER GETUSR: LD E,0FFH ;GET CURRENT USER NUMBER SETUSR: LD C*< ; FROM TBUFF LD BC,BUFLEN ;NUMBER OF BYTES LDIR LD HL,SUBFS2 ;PT TO S2 OF $$$.SUB FCB LD (HL),0 ;SET S2 TO ZERO INC HL ;PT TO RECORD COUNT DEC (HL) ;DECREMENT RECORD COUNT OF $$$.SUB LD DE,SUBFCB ;CLOSE $$$.SUB CALL CLOSE JR Z,RB1 ;ABORT $$$.SUB IF ERROR LD A,SPRMPT ;PRINT SUBMIT PROMPT CALL CONOUT LD HL,CIBUFF ;PRINT COMMAND LINE FROM $$$.SUB CALL PRIN1 CALL BREAK ;CHECK FOR ABORT (ANY CHAR) IF CLEVEL3 ;IF THIRD COMMAND LEVEL IS PERMITTED RET Z ;IF (NO ABO+ +RT), RETURN TO CALLER AND RUN ENDIF IF NOT CLEVEL3 ;IF THIRD COMMAND LEVEL IS NOT PERMITTED JR Z,CNVBUF ;IF (NO ABORT), CAPITALIZE COMMAND ENDIF CALL SUBKIL ;KILL $$$.SUB IF ABORT JP RESTRT ;RESTART CPR ; INPUT COMMAND LINE FROM USER CONSOLE RB1: CALL SUBKIL ;ERASE $$$.SUB IF PRESENT CALL SETUD ;SET USER AND DISK LD A,CPRMPT ;PRINT PROMPT CALL CONOUT LD C,0AH ;READ COMMAND LINE FROM USER LD DE,MBUFF CALL BDOS IF CLEVEL3 ;IF THIRD COMMAND LEVEL IS PERMITT+4ROR IF < JR C,ERROR RET Z ;=DELIMITER CP '=' ;'='=DELIMITER RET Z CP 5FH ;UNDERSCORE=DELIMITER RET Z CP '.' ;'.'=DELIMITER RET Z CP ':' ;':'=DELIMITER RET Z CP ';' ;';'=DELIMITER RET Z CP '<' ;'<'=DELIMITER RET Z CP '>' ;'>'=DELIMITER RET ; ADVANCE INPUT PTR TO FIRST NON-BLANK AND FALL THROUGH TO SBLANK ADVAN: LD DE,(CIBPTR) ; SKIP STRING PTED TO BY DE (STRING ENDS IN 0) UNTIL END OF STRING ; OR NON-BLANK ENCOUNTERED (BEGINNING OF TOKEN) SBLAN+ UR FROM COMMAND LINE ; RETURN WITH VALUE IN REG A; ALL REGISTERS MAY BE AFFECTED HEXNUM: CALL SCANER ;PARSE NUMBER AND PLACE IN FCBFN HNUM0: LD HL,FCBFN ;PT TO TOKEN FOR CONVERSION LD DE,0 ;DE=ACCUMULATED VALUE LD B,11 ;B=CHAR COUNT HNUM1: LD A,(HL) ;GET CHAR CP ' ' ;DONE? JR Z,HNUM3 ;RETURN IF SO CP NUMBASE ;DONE IF NUMBASE SUFFIX JR Z,HNUM3 SUB '0' ;CONVERT TO BINARY JR C,NUMERR ;RETURN AND DONE IF ERROR CP 10 ;0-9? JR C,HNUM2 SUB 7 ;A-F? CP 10H ;ERROR? JR NC,N+0 RET ;ABORT IF SAME ; EXTRACT TOKEN FROM COMMAND LINE AND PLACE IT INTO FCBDN; ; FORMAT FCBDN FCB IF TOKEN RESEMBLES FILE NAME AND TYPE (FILENAME.TYP); ; ON INPUT, CIBPTR PTS TO CHAR AT WHICH TO START SCAN; ; ON OUTPUT, CIBPTR PTS TO CHAR AT WHICH TO CONTINUE AND ZERO FLAG IS RESET ; IF '?' IS IN TOKEN ; ENTRY POINTS: ; SCANER - LOAD TOKEN INTO FIRST FCB ; SCANX - LOAD TOKEN INTO FCB PTED TO BY HL SCANER: LD HL,FCBDN ;POINT TO FCBDN SCANX: XOR A ;SET TEMPORARY DRIVE NUMBER TO D+ED JP SETU0D ;SET CURRENT DISK NUMBER IN LOWER PARAMS ENDIF IF NOT CLEVEL3 ;IF THIRD COMMAND LEVEL IS NOT PERMITTED CALL SETU0D ;SET CURRENT DISK NUMBER IF LOWER PARAMS ; AND FALL THRU TO CNVBUF ENDIF ; CAPITALIZE STRING (ENDING IN 0) IN CBUFF AND SET PTR FOR PARSING CNVBUF: LD HL,CBUFF ;PT TO USER'S COMMAND LD B,(HL) ;CHAR COUNT IN B INC B ;ADD 1 IN CASE OF ZERO CB1: INC HL ;PT TO 1ST VALID CHAR LD A,(HL) ;CAPITALIZE COMMAND CHAR CALL UCASE LD (HL),A DJNZ CB1 ;CONT+K: LD A,(DE) OR A RET Z CP ' ' RET NZ INC DE JR SBLANK ; ADD A TO HL (HL=HL+A) ADDAH: ADD A,L LD L,A RET NC INC H RET ; EXTRACT DECIMAL NUMBER FROM COMMAND LINE ; RETURN WITH VALUE IN REG A;ALL REGISTERS MAY BE AFFECTED NUMBER: CALL SCANER ;PARSE NUMBER AND PLACE IN FCBFN LD HL,FCBFN+10 ;PT TO END OF TOKEN FOR CONVERSION LD B,11 ;11 CHARS MAX ; CHECK FOR SUFFIX FOR HEXADECIMAL NUMBER NUMS: LD A,(HL) ;GET CHARS FROM END, SEARCHING FOR SUFFIX DEC HL ;BACK UP+$ UMERR HNUM2: INC HL ;PT TO NEXT CHAR LD C,A ;DIGIT IN C LD A,D ;GET ACCUMULATED VALUE RLCA ;EXCHANGE NYBBLES RLCA RLCA RLCA AND 0F0H ;MASK OUT LOW NYBBLE LD D,A LD A,E ;SWITCH LOW-ORDER NYBBLES RLCA RLCA RLCA RLCA LD E,A ;HIGH NYBBLE OF E=NEW HIGH OF E, ; LOW NYBBLE OF E=NEW LOW OF D AND 0FH ;GET NEW LOW OF D OR D ;MASK IN HIGH OF D LD D,A ;NEW HIGH BYTE IN D LD A,E AND 0F0H ;MASK OUT LOW OF E OR C ;MASK IN NEW LOW LD E,A ;NEW LOW BYTE IN E +4EFAULT LD (TEMPDR),A CALL ADVAN ;SKIP TO NON-BLANK OR END OF LINE LD (CIPTR),DE ;SET PTR TO NON-BLANK OR END OF LINE LD A,(DE) ;END OF LINE? OR A ;0=YES JR Z,SCAN2 SBC A,'A'-1 ;CONVERT POSSIBLE DRIVE SPEC TO NUMBER LD B,A ;STORE NUMBER (A:=0, B:=1, ETC) IN B INC DE ;PT TO NEXT CHAR LD A,(DE) ;SEE IF IT IS A COLON (:) CP ':' JR Z,SCAN3 ;YES, WE HAVE A DRIVE SPEC DEC DE ;NO, BACK UP PTR TO FIRST NON-BLANK CHAR SCAN2: LD A,(TDRIVE) ;SET 1ST BYTE OF FCBDN AS DEFAULT DRIVE L+6INUE TO END OF COMMAND LINE CB2: LD (HL),0 ;STORE ENDING LD HL,CIBUFF ;SET COMMAND LINE PTR TO 1ST CHAR LD (CIBPTR),HL RET ; CHECK FOR ANY CHAR FROM USER CONSOLE;RET W/ZERO SET IF NONE BREAK: PUSH DE ;SAVE DE LD C,11 ;CSTS CHECK CALL BDOSB CALL NZ,CONIN ;GET INPUT CHAR BRKBK: POP DE RET ; GET THE REQUESTED USER NUMBER FROM THE COMMAND LINE AND VALIDATE IT. USRNUM: CALL NUMBER CP MAXUSR+1 RET C ; INVALID COMMAND -- PRINT IT ERROR: CALL CRLF ;NEW LINE LD HL+m CP ' ' ;SPACE? JR NZ,NUMS1 ;CHECK FOR SUFFIX DJNZ NUMS ;COUNT DOWN JR NUM0 ;BY DEFAULT, PROCESS NUMS1: CP NUMBASE ;CHECK AGAINST BASE SWITCH FLAG JR Z,HNUM0 ; PROCESS DECIMAL NUMBER NUM0: LD HL,FCBFN ;PT TO BEGINNING OF TOKEN LD BC,1100H ;C=ACCUMULATED VALUE, B=CHAR COUNT ; (C=0, B=11) NUM1: LD A,(HL) ;GET CHAR CP ' ' ;DONE IF JR Z,NUM2 INC HL ;PT TO NEXT CHAR SUB '0' ;CONVERT TO BINARY (ASCII 0-9 TO BINARY) CP 10 ;ERROR IF >= 10 JR NC,NUMERR LD D,A ;DIGI+( DJNZ HNUM1 ;COUNT DOWN ; RETURN FROM HEXNUM HNUM3: EX DE,HL ;RETURNED VALUE IN HL LD A,L ;LOW-ORDER BYTE IN A RET ; PT TO DIRECTORY ENTRY IN TBUFF WHOSE OFFSET IS SPECIFIED BY A AND C DIRPTR: LD HL,TBUFF ;PT TO TEMP BUFFER ADD A,C ;PT TO 1ST BYTE OF DIR ENTRY CALL ADDAH ;PT TO DESIRED BYTE IN DIR ENTRY LD A,(HL) ;GET DESIRED BYTE RET ; CHECK FOR SPECIFIED DRIVE AND LOG IT IN IF NOT DEFAULT SLOGIN: XOR A ;SET FCBDN FOR DEFAULT DRIVE LD (FCBDN),A CALL COMLOG ;CHEC+8D (HL),A JR SCAN4 SCAN3: LD A,B ;WE HAVE A DRIVE SPEC LD (TEMPDR),A ;SET TEMPORARY DRIVE LD (HL),B ;SET 1ST BYTE OF FCBDN AS SPECIFIED DRIVE INC DE ;PT TO BYTE AFTER ':' ; EXTRACT FILENAME FROM POSSIBLE FILENAME.TYP SCAN4: XOR A ;A=0 LD (QMCNT),A ;INIT COUNT OF NUMBER OF QUESTION MARKS IN FCB LD B,8 ;MAX OF 8 CHARS IN FILE NAME CALL SCANF ;FILL FCB FILE NAME ; EXTRACT FILE TYPE FROM POSSIBLE FILENAME.TYP LD B,3 ;PREPARE TO EXTRACT TYPE CP '.' ;IF (DE) DELIMITER IS A '.'+ =,(CIPTR) ;PT TO BEGINNING OF COMMAND LINE ERR2: LD A,(HL) ;GET CHAR CP ' '+1 ;SIMPLE '?' IF OR LESS JR C,ERR1 PUSH HL ;SAVE PTR TO ERROR COMMAND CHAR CALL CONOUT ;PRINT COMMAND CHAR POP HL ;GET PTR INC HL ;PT TO NEXT JR ERR2 ;CONTINUE ERR1: CALL PRINT ;PRINT '?' DEFB '?'+80H CALL SUBKIL ;TERMINATE ACTIVE $$$.SUB IF ANY JP RESTRT ;RESTART CPR ; CHECK TO SEE IF DE PTS TO DELIMITER; IF SO, RET W/ZERO FLAG SET SDELM: LD A,(DE) OR A ;0=DELIMITER RET Z CP ' ' ;ER+T IN D LD A,C ;NEW VALUE = OLD VALUE * 10 RLCA RLCA RLCA ADD A,C ;CHECK FOR RANGE ERROR JR C,NUMERR ADD A,C ;CHECK FOR RANGE ERROR JR C,NUMERR ADD A,D ;NEW VALUE = OLD VALUE * 10 + DIGIT JR C,NUMERR ;CHECK FOR RANGE ERROR LD C,A ;SET NEW VALUE DJNZ NUM1 ;COUNT DOWN ; RETURN FROM NUMBER NUM2: LD A,C ;GET ACCUMULATED VALUE RET ; NUMBER ERROR ROUTINE FOR SPACE CONSERVATION NUMERR: JP ERROR ;USE ERROR ROUTINE - THIS IS RELATIVE PT ; EXTRACT HEXADECIMAL NUMBE+,K DRIVE RET Z JR DLOG5 ;DO LOGIN OTHERWISE ; CHECK FOR SPECIFIED DRIVE AND LOG IN DEFAULT DRIVE IF SPECIFIED<>DEFAULT DLOGIN: CALL COMLOG ;CHECK DRIVE RET Z ;ABORT IF SAME LD A,(TDRIVE) ;LOG IN DEFAULT DRIVE DLOG5: JP LOGIN ; ROUTINE COMMON TO BOTH LOGIN ROUTINES; ON EXIT, Z SET MEANS ABORT COMLOG: TEMPDR EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION LD A,0 ;2ND BYTE (IMMEDIATE ARG) IS TEMPDR OR A ;0=NO RET Z DEC A ;COMPARE IT AGAINST DEFAULT LD HL,TDRIVE CP (HL) +<, WE HAVE A TYPE JR NZ,SCAN15 ;FILL FILE TYPE BYTES WITH INC DE ;PT TO CHAR IN COMMAND LINE AFTER '.' CALL SCANF ;FILL FCB FILE TYPE JR SCAN16 ;SKIP TO NEXT PROCESSING SCAN15: CALL SCANF4 ;SPACE FILL ; FILL IN EX, S1, S2, AND RC WITH ZEROES SCAN16: LD B,4 ;4 BYTES SCAN17: INC HL ;PT TO NEXT BYTE IN FCBDN LD (HL),0 DJNZ SCAN17 ; SCAN COMPLETE -- DE PTS TO DELIMITER BYTE AFTER TOKEN LD (CIBPTR),DE ; SET ZERO FLAG TO INDICATE PRESENCE OF '?' IN FILENAME.TYP LD A,(Q,,MCNT) ;GET NUMBER OF QUESTION MARKS OR A ;SET ZERO FLAG TO INDICATE ANY '?' RET ; SCANF -- SCAN TOKEN PTED TO BY DE FOR A MAX OF B BYTES; PLACE IT INTO ; FILE NAME FIELD PTED TO BY HL; EXPAND AND INTERPRET WILD CARDS OF ; '*' AND '?'; ON EXIT, DE PTS TO TERMINATING DELIMITER SCANF: CALL SDELM ;DONE IF DELIMITER ENCOUNTERED - FILL JR Z,SCANF4 INC HL ;PT TO NEXT BYTE IN FCBDN CP '*' ;IS (DE) A WILD CARD? JR NZ,SCANF1 ;CONTINUE IF NOT LD (HL),'?' ;PLACE '?' IN FCBDN AND ,SMS4: INC HL ;SKIP ADDRESS INC HL DEC C ;DECREMENT TABLE ENTRY NUMBER JR NZ,CMS1 INC C ;CLEAR ZERO FLAG RET ;COMMAND IS DISK-RESIDENT (ZERO FLAG CLEAR) ;**** Section 5 **** ; CPR-Resident Commands ;Section 5A ;Command: DIR ;Function: To display a directory of the files on disk ;Forms: ; DIR Displays the DIR files ; DIR S Displays the SYS files ; DIR A Display both DIR and SYS files DIR: LD A,80H ;SET SYSTEM BIT EXAMINATION PUSH AF CALL SCANER ;EXTRACT, +1 ;POINTER TO IN-THE-CODE BUFFER SYSTST CP 0 JR NZ,DIR10 POP DE ;GET ENTRY COUNT (= COUNTER) LD A,E ;ADD 1 TO IT INC E PUSH DE ;SAVE IT AND 03H ;OUTPUT IF 4 ENTRIES PRINTED IN LINE PUSH AF JR NZ,DIR4 CALL CRLF ;NEW LINE JR DIR5 DIR4: CALL PRINT IF WIDE DEFB ' ' ;2 SPACES DEFB FENCE ;THEN FENCE CHAR DEFB ' ',' '+80H ;THEN 2 MORE SPACES ENDIF IF NOT WIDE DEFB ' ' ;SPACE DEFB FENCE ;THEN FENCE CHAR DEFB ' '+80H ;THEN SPACE ENDIF DIR5: ,0 B,A ;NO SYS-ONLY OPT TO DIRPR CALL DIRPR ;PRINT DIRECTORY OF ERASED FILES LD DE,FCBDN ;DELETE FILE SPECIFIED CALL DELETE RET ;REENTER CPR ENDIF ;RAS ;Section 5C ;Command: LIST ;Function: Print out specified file on the LST: Device ;Forms: ; LIST Print file (NO Paging) LIST: LD A,0FFH ;TURN ON PRINTER FLAG JR TYPE0 ;Section 5D ;Command: TYPE ;Function: Print out specified file on the CON: Device ;Forms: ; TYPE Print file ; TYPE P Print file with pag,DON'T ADVANCE DE IF SO CALL SCQ ;SCANNER COUNT QUESTION MARKS JR SCANF2 SCANF1: LD (HL),A ;STORE FILENAME CHAR IN FCBDN INC DE ;PT TO NEXT CHAR IN COMMAND LINE CP '?' ;CHECK FOR QUESTION MARK (WILD) CALL Z,SCQ ;SCANNER COUNT QUESTION MARKS SCANF2: DJNZ SCANF ;DECREMENT CHAR COUNT UNTIL 8 ELAPSED SCANF3: CALL SDELM ;8 CHARS OR MORE - SKIP UNTIL DELIMITER RET Z ;ZERO FLAG SET IF DELIMITER FOUND INC DE ;PT TO NEXT CHAR IN COMMAND LINE JR SCANF3 ; FILL MEMORY POINTED TO BY HL WIT,0 POSSIBLE D:FILENAME.TYP TOKEN CALL SLOGIN ;LOG IN DRIVE IF NECESSARY LD HL,FCBFN ;MAKE FCB WILD (ALL '?') IF NO FILENAME.TYP LD A,(HL) ;GET FIRST CHAR OF FILENAME.TYP CP ' ' ;IF , ALL WILD CALL Z,FILLQ CALL ADVAN ;LOOK AT NEXT INPUT CHAR LD B,0 ;SYS TOKEN DEFAULT JR Z,DIR2 ;JUMP; THERE ISN'T ONE CP SYSFLG ;SYSTEM FLAG SPECIFIER? JR Z,GOTSYS ;GOT SYSTEM SPECIFIER CP SOFLG ;SYS ONLY? JR NZ,DIR2 LD B,80H ;FLAG SYS ONLY GOTSYS: INC DE LD (CIBPTR),DE CP SOFLG ;SYS O,$LD B,01H ;PT TO 1ST BYTE OF FILE NAME DIR6: LD A,B ;A=OFFSET CALL DIRPTR ;HL NOW PTS TO 1ST BYTE OF FILE NAME AND 7FH ;MASK OUT MSB CP ' ' ;NO FILE NAME? JR NZ,DIR8 ;PRINT FILE NAME IF PRESENT POP AF PUSH AF CP 03H JR NZ,DIR7 LD A,09H ;PT TO 1ST BYTE OF FILE TYPE CALL DIRPTR ;HL NOW PTS TO 1ST BYTE OF FILE TYPE AND 7FH ;MASK OUT MSB CP ' ' ;NO FILE TYPE? JR Z,DIR9 ;CONTINUE IF SO DIR7: LD A,' ' ;OUTPUT DIR8: CALL CONOUT ;PRINT CHAR INC B ;INCR CHAR COUNT L,4ing flag TYPE: XOR A ;TURN OFF PRINTER FLAG ; ENTRY POINT FOR CPR LIST FUNCTION (LIST) TYPE0: LD (PRFLG),A ;SET FLAG CALL SCANER ;EXTRACT FILENAME.TYP TOKEN JP NZ,ERROR ;ERROR IF ANY QUESTION MARKS CALL ADVAN ;GET PGDFLG IF IT'S THERE LD (PGFLG),A ;SAVE IT AS A FLAG JR Z,NOSLAS ;JUMP IF INPUT ENDED INC DE ;PUT NEW BUF POINTER EX DE,HL LD (CIBPTR),HL NOSLAS: CALL SLOGIN ;LOG IN SELECTED DISK IF ANY CALL OPENF ;OPEN SELECTED FILE JP Z,TYPE4 ;ABORT IF ERROR CALL CRLF ;,-H SPACES FOR B BYTES SCANF4: INC HL ;PT TO NEXT BYTE IN FCBDN LD (HL),' ' ;FILL FILENAME PART WITH DJNZ SCANF4 RET ; INCREMENT QUESTION MARK COUNT FOR SCANNER ; THIS ROUTINE INCREMENTS THE COUNT OF THE NUMBER OF QUESTION MARKS IN ; THE CURRENT FCB ENTRY SCQ: LD A,(QMCNT) ;GET COUNT INC A ;INCREMENT LD (QMCNT),A ;PUT COUNT RET ; CMDTBL (COMMAND TABLE) SCANNER ; ON RETURN, HL PTS TO ADDRESS OF COMMAND IF CPR-RESIDENT ; ON RETURN, ZERO FLAG SET MEANS CPR-RESIDENT,qNLY SPEC? JR Z,DIR2 ;THEN LEAVE BIT SPEC UNCHAGNED POP AF ;GET FLAG XOR A ;SET NO SYSTEM BIT EXAMINATION PUSH AF DIR2: POP AF ;GET FLAG DIR2A: ;DROP INTO DIRPR TO PRINT DIRECTORY ; THEN RESTART CPR ; DIRECTORY PRINT ROUTINE; ON ENTRY, MSB OF A IS 1 (80H) IF SYSTEM FILES EXCL DIRPR: LD D,A ;STORE SYSTEM FLAG IN D LD E,0 ;SET COLUMN COUNTER TO ZERO PUSH DE ;SAVE COLUMN COUNTER (E) AND SYSTEM FLAG (D) LD A,B ;SYS ONLY SPECIFIER LD (SYSTST),A CALL SEARF ;SEARCH FOR SPECI,(D A,B CP 12 ;END OF FILENAME.TYP? JR NC,DIR9 ;CONTINUE IF SO CP 09H ;END IF FILENAME ONLY? JR NZ,DIR6 ;PRINT TYP IF SO LD A,'.' ;PRINT DOT BETWEEN FILE NAME AND TYPE CALL CONOUT JR DIR6 DIR9: POP AF DIR10: CALL BREAK ;CHECK FOR ABORT JR NZ,DIR11 CALL SEARN ;SEARCH FOR NEXT FILE JR DIR3 ;CONTINUE DIR11: POP DE ;RESTORE STACK RET ; FILL FCB @HL WITH '?' FILLQ: LD B,11 ;NUMBER OF CHARS IN FN & FT FQLP: LD (HL),'?' ;STORE '?' INC HL DJNZ FQLP RET ;Section 5B ,8NEW LINE LD A,NLINES-1 ;SET LINE COUNT LD (PAGCNT),A LD HL,CHRCNT ;SET CHAR POSITION/COUNT LD (HL),0FFH ;EMPTY LINE LD B,0 ;SET TAB CHAR COUNTER TYPE1: LD HL,CHRCNT ;PT TO CHAR POSITION/COUNT LD A,(HL) ;END OF BUFFER? CP 80H JR C,TYPE2 PUSH HL ;READ NEXT BLOCK CALL READF POP HL JR NZ,TYPE3 ;ERROR? XOR A ;RESET COUNT LD (HL),A TYPE2: INC (HL) ;INCREMENT CHAR COUNT LD HL,TBUFF ;PT TO BUFFER CALL ADDAH ;COMPUTE ADDRESS OF NEXT CHAR FROM OFFSET LD A,(HL) ;GET NEXT CHA,  COMMAND CMDSER: LD HL,CMDTBL ;PT TO COMMAND TABLE LD C,NCMNDS ;SET COMMAND COUNTER CMS1: LD DE,FCBFN ;PT TO STORED COMMAND NAME LD B,NCHARS ;NUMBER OF CHARS/COMMAND (8 MAX) CMS2: LD A,(DE) ;COMPARE AGAINST TABLE ENTRY CP (HL) JR NZ,CMS3 ;NO MATCH INC DE ;PT TO NEXT CHAR INC HL DJNZ CMS2 ;COUNT DOWN LD A,(DE) ;NEXT CHAR IN INPUT COMMAND MUST BE CP ' ' JR NZ,CMS4 RET ;COMMAND IS CPR-RESIDENT (ZERO FLAG SET) CMS3: INC HL ;SKIP TO NEXT COMMAND TABLE ENTRY DJNZ CMS3 C,NFIED FILE (FIRST OCCURRANCE) CALL Z,PRNNF ;PRINT NO FILE MSG;REG A NOT CHANGED ; ENTRY SELECTION LOOP; ON ENTRY, A=OFFSET FROM SEARF OR SEARN DIR3: JR Z,DIR11 ;DONE IF ZERO FLAG SET DEC A ;ADJUST TO RETURNED VALUE RRCA ;CONVERT NUMBER TO OFFSET INTO TBUFF RRCA RRCA AND 60H LD C,A ;OFFSET INTO TBUFF IN C (C=OFFSET TO ENTRY) LD A,10 ;ADD 10 TO PT TO SYSTEM FILE ATTRIBUTE BIT CALL DIRPTR POP DE ;GET SYSTEM BIT MASK FROM D PUSH DE AND D ;MASK FOR SYSTEM BIT SYSTST EQU $,,3 ;Command: ERA ;Function: Erase files ;Forms: ; ERA Erase Specified files and print their names IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ERA: CALL SCANER ;PARSE FILE SPECIFICATION CP 11 ;ALL WILD (ALL FILES = 11 '?')? JR NZ,ERA1 ;IF NOT, THEN DO ERASES CALL PRINTC DEFB 'All','?'+80H CALL CONIN ;GET REPLY CP 'Y' ;YES? JP NZ,RESTRT ;RESTART CPR IF NOT CALL CRLF ;NEW LINE ERA1: CALL SLOGIN ;LOG IN SELECTED DISK IF ANY XOR A ;PRINT ALL FILES (EXAMINE SYSTEM BIT) LD,<R AND 7FH ;MASK OUT MSB CP 1AH ;END OF FILE (^Z)? RET Z ;RESTART CPR IF SO ; OUTPUT CHAR TO CON: OR LST: DEVICE WITH TABULATION CP CR ;RESET TAB COUNT? JR Z,TABRST CP LF ;RESET TAB COUNT? JR Z,TABRST CP TAB ;TAB? JR Z,LTAB CALL LCOUT ;OUTPUT CHAR INC B ;INCREMENT CHAR COUNT JR TYPE2L TABRST: CALL LCOUT ;OUTPUT OR LD B,0 ;RESET TAB COUNTER JR TYPE2L LTAB: LD A,' ' ; CALL LCOUT INC B ;INCR POS COUNT LD A,B AND 7 JR NZ,LTAB ; CONTINUE PR-<-OCESSING TYPE2L: CALL BREAK ;CHECK FOR ABORT JR Z,TYPE1 ;CONTINUE IF NO CHAR CP 'C'-'@' ;^C? RET Z ;RESTART IF SO JR TYPE1 TYPE3: DEC A ;NO ERROR? RET Z ;RESTART CPR TYPE4: JP ERRLOG ; PAGING ROUTINES ; PAGER COUNTS DOWN LINES AND PAUSES FOR INPUT (DIRECT) IF COUNT EXPIRES ; PAGSET SETS LINES/PAGE COUNT PAGER: PUSH HL LD HL,PAGCNT ;COUNT DOWN DEC (HL) JR NZ,PGBAK ;JUMP IF NOT END OF PAGE LD (HL),NLINES-2 ;REFILL COUNTER PGFLG EQU $+1 ;POINTER TO IN-THE-CODE BUFF-E2 DEC HL ;COUNT DOWN ON SECTORS PUSH HL ;SAVE PTR TO BLOCK TO SAVE LD HL,128 ;128 BYTES PER SECTOR ADD HL,DE ;PT TO NEXT SECTOR PUSH HL ;SAVE ON STACK CALL DMASET ;SET DMA ADDRESS FOR WRITE (ADDRESS IN DE) LD DE,FCBDN ;WRITE SECTOR LD C,15H ;BDOS WRITE SECTOR CALL BDOSB ;SAVE BC POP DE ;GET PTR TO NEXT SECTOR IN DE POP HL ;GET SECTOR COUNT JR NZ,SAVE3 ;WRITE ERROR? JR SAVE1 ;CONTINUE SAVE2: LD DE,FCBDN ;CLOSE SAVED FILE CALL CLOSE INC A ;ERROR? JR NZ,SAVE4 SAV- UR LD (HL),B JR NZ,REN4 REN2: LD (HL),B XOR A LD (FCBDN),A ;SET DEFAULT DRIVE LD DE,FCBDN ;RENAME FILE LD C,17H ;BDOS RENAME FCT CALL GRBDOS RET NZ REN3: CALL PRNNF ;PRINT NO FILE MSG REN4: JP ERRLOG ENDIF ;RAS ;Section 5G ;Command: USER ;Function: Change current USER number ;Forms: ; USER Select specified user number; is in DEC USER: CALL USRNUM ;EXTRACT USER NUMBER FROM COMMAND LINE LD E,A ;PLACE USER NUMBER IN E CALL SETUSR ;SET SPECIFIED USER RST-0DULT DRIVE CALL SETU0D ;SET DRIVE WITH USER 0 CALL LOGIN ;LOG IN DRIVE JP RCPRNL ;RESTART CPR COM1: LD A,(FCBFT) ;FILE TYPE MUST BE BLANK CP ' ' JP NZ,ERROR LD HL,COMMSG ;PLACE DEFAULT FILE TYPE (COM) INTO FCB LD DE,FCBFT ;COPY INTO FILE TYPE LD BC,3 ;3 BYTES LDIR LD HL,TPA ;SET EXECUTION/LOAD ADDRESS PUSH HL ;SAVE FOR EXECUTION CALL MEMLOAD ;LOAD MEMORY WITH FILE SPECIFIED IN CMD LINE POP HL ;GET EXECUTION ADDRESS RET NZ ;RETURN (ABORT) IF LOAD ERROR ; CALLPROG IS T-9ER PGFLG LD A,0 ;0 MAY BE CHANGED BY PGFLG EQUATE CP PGDFLG ;PAGE DEFAULT OVERRIDE OPTION WANTED? IF PGDFLT ;IF PAGING IS DEFAULT JR Z,PGBAK ; PGDFLG MEANS NO PAGING, PLEASE ELSE ;IF PAGING NOT DEFAULT JR NZ,PGBAK ; PGDFLG MEANS PLEASE PAGINATE ENDIF CALL CONIN ;GET CHAR TO CONTINUE CP 'C'-'@' ;^C JP Z,RSTCPR ;RESTART CPR PGBAK: POP HL ;RESTORE HL RET ;Section 5E ;Command: SAVE ;Function: To save the contents of the TPA onto disk as a file ;Forms: ; SAVE Select Default User Number; is in DEC DFU: CALL USRNUM ;GET USER NUMBER LD (DFUSR),A ;PUT IT AWAY JR RSTJMP ;RESTART CPR (NO DEFAULT LOGIN) ;Section 5I ;Command: JUMP ;Function: To Call the program (subroutine) at the specified address ; without loading from disk ;Forms: ; JUMP Call at ; is in H-4HE ENTRY POINT FOR THE EXECUTION OF THE LOADED ; PROGRAM;ON ENTRY TO THIS ROUTINE, HL MUST CONTAIN THE EXECUTION ; ADDRESS OF THE PROGRAM (SUBROUTINE) TO EXECUTE CALLPROG:LD (EXECADR),HL ;PERFORM IN-LINE CODE MODIFICATION CALL DLOGIN ;LOG IN DEFAULT DRIVE CALL SCANER ;SEARCH COMMAND LINE FOR NEXT TOKEN LD HL,TEMPDR ;SAVE PTR TO DRIVE SPEC PUSH HL LD A,(HL) ;SET DRIVE SPEC LD (FCBDN),A LD HL,FCBDN+10H ;PT TO 2ND FILE NAME CALL SCANX ;SCAN FOR IT AND LOAD IT INTO FCBDN+16 POP HL-6ber of Pages> ; Save specified number of pages (start at 100H) ; from TPA into specified file; is in DEC ; SAVE S ; Like SAVE above, but numeric argument specifies ; number of sectors rather than pages IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM SAVE: CALL NUMBER ;EXTRACT NUMBER FROM COMMAND LINE LD L,A ;HL=PAGE COUNT LD H,0 PUSH HL ;SAVE PAGE COUNT CALL EXTEST ;TEST FOR EXISTENCE OF FILE AND ABORT IF SO LD C,16H ;B-DE ;GET PTR TO FCB CP 'Y' ;KEY ON YES JP NZ,RSTCPR ;RESTART IF NO PUSH DE ;SAVE PTR TO FCB CALL DELETE ;DELETE FILE POP DE ;GET PTR TO FCB RET ENDIF ;RAS ;Section 5F ;Command: REN ;Function: To change the name of an existing file ;Forms: ; REN = Perform function IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM REN: CALL EXTEST ;TEST FOR FILE EXISTENCE AND RETURN ; IF FILE DOESN'T EXIST; ABORT IF IT DOES LD A,(TEMPDR) ;SAVE CURRENT DEFAULT DISK PUSH AF-(EX IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM JUMP: CALL HEXNUM ;GET LOAD ADDRESS IN HL JR CALLPROG ;PERFORM CALL ENDIF ;RAS ;Section 5J ;Command: GO ;Function: To Call the program in the TPA without loading ; loading from disk. Same as JUMP 100H, but much ; more convenient, especially when used with ; parameters for programs like STAT. Also can be ; allowed on remote-access systems with no problems. ;Form: ; GO IF NOT RAS ;-81 ;SET UP DRIVE SPECS LD A,(HL) LD (FCBDM),A XOR A LD (FCBCR),A LD DE,TFCB ;COPY TO DEFAULT FCB LD HL,FCBDN ;FROM FCBDN LD BC,33 ;SET UP DEFAULT FCB LDIR LD HL,CIBUFF COM4: LD A,(HL) ;SKIP TO END OF 2ND FILE NAME OR A ;END OF LINE? JR Z,COM5 CP ' ' ;END OF TOKEN? JR Z,COM5 INC HL JR COM4 ; LOAD COMMAND LINE INTO TBUFF COM5: LD B,0 ;SET CHAR COUNT LD DE,TBUFF+1 ;PT TO CHAR POS COM6: LD A,(HL) ;COPY COMMAND LINE TO TBUFF LD (DE),A OR A ;DONE IF ZERO JR Z,- ODOS MAKE FILE CALL GRBDOS POP HL ;GET PAGE COUNT JR Z,SAVE3 ;ERROR? XOR A ;SET RECORD COUNT FIELD OF NEW FILE'S FCB LD (FCBCR),A CALL ADVAN ;LOOK FOR 'S' FOR SECTOR OPTION INC DE ;PT TO AFTER 'S' TOKEN CP SECTFLG JR Z,SAVE0 DEC DE ;NO 'S' TOKEN, SO BACK UP ADD HL,HL ;DOUBLE IT FOR HL=SECTOR (128 BYTES) COUNT SAVE0: LD (CIBPTR),DE ;SET PTR TO BAD TOKEN OR AFTER GOOD TOKEN LD DE,TPA ;PT TO START OF SAVE AREA (TPA) SAVE1: LD A,H ;DONE WITH SAVE? OR L ;HL=0 IF SO JR Z,SAV- ;SAVE ON STACK REN0: LD HL,FCBDN ;SAVE NEW FILE NAME LD DE,FCBDM LD BC,16 ;16 BYTES LDIR CALL ADVAN ;ADVANCE CIBPTR CP '=' ;'=' OK JR NZ,REN4 REN1: EX DE,HL ;PT TO CHAR AFTER '=' IN HL INC HL LD (CIBPTR),HL ;SAVE PTR TO OLD FILE NAME CALL SCANER ;EXTRACT FILENAME.TYP TOKEN JR NZ,REN4 ;ERROR IF ANY '?' POP AF ;GET OLD DEFAULT DRIVE LD B,A ;SAVE IT LD HL,TEMPDR ;COMPARE IT AGAINST CURRENT DEFAULT DRIVE LD A,(HL) ;MATCH? OR A JR Z,REN2 CP B ;CHECK FOR DRIVE ERRO-,ONLY IF RAS GO: LD HL,TPA ;Always to TPA JR CALLPROG ;Perform call ENDIF ;END OF GO FOR RAS ;Section 5K ;Command: COM file processing ;Function: To load the specified COM file from disk and execute it ;Forms: ; COM: LD A,(FCBFN) ;ANY COMMAND? CP ' ' ;' ' MEANS COMMAND WAS 'D:' TO SWITCH JR NZ,COM1 ;NOT , SO MUST BE TRANSIENT OR ERROR LD A,(TEMPDR) ;LOOK FOR DRIVE SPEC OR A ;IF ZERO, JUST BLANK JP Z,RCPRNL DEC A ;ADJUST FOR LOG IN LD (TDRIVE),A ;SET DEFA-<COM7 INC B ;INCR CHAR COUNT INC HL ;PT TO NEXT INC DE JR COM6 ; RUN LOADED TRANSIENT PROGRAM COM7: LD A,B ;SAVE CHAR COUNT LD (TBUFF),A CALL CRLF ;NEW LINE CALL DEFDMA ;SET DMA TO 0080 CALL SETUD ;SET USER/DISK ; EXECUTION (CALL) OF PROGRAM (SUBROUTINE) OCCURS HERE EXECADR EQU $+1 ;CHANGE ADDRESS FOR IN-LINE CODE MODIFICATION CALL TPA ;CALL TRANSIENT CALL DEFDMA ;SET DMA TO 0080, IN CASE ;PROG CHANGED IT ON US CALL SETU0D ;SET USER 0/DISK CALL LOGIN ;LOGIN DI..+SK JP RESTRT ;RESTART CPR ; TRANSIENT LOAD ERROR COM8: POP HL ;CLEAR RETURN ADDRESS CALL RESETUSR ;RESET CURRENT USER NUMBER ; RESET MUST BE DONE BEFORE LOGIN ERRLOG: CALL DLOGIN ;LOG IN DEFAULT DISK ERRJMP: JP ERROR ;Section 5L ;Command: GET ;Function: To load the specified file from disk to the specified address ;Forms: ; GET Load the specified file at the specified page; ; is in HEX IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM GET: CALL HEXNUM ;GET LOAD.INALLY SELECTED MLA0: LD HL,TEMPDR ;GET DRIVE FROM CURRENT COMMAND XOR A ;A=0 OR (HL) JP NZ,COM8 ;ERROR IF ALREADY DISK A: LD (HL),1 ;SELECT DRIVE A: JR MLA ; FILE FOUND -- PROCEED WITH LOAD MLA1: LOADADR EQU $+1 ;MEMORY LOAD ADDRESS (IN-LINE CODE MOD) LD HL,TPA ;SET START ADDRESS OF MEMORY LOAD ML2: LD A,ENTRY/256-1 ;GET HIGH-ORDER ADR OF JUST BELOW CPR CP H ;ARE WE GOING TO OVERWRITE THE CPR? JR C,PRNLE ;ERROR IF SO PUSH HL ;SAVE ADDRESS OF NEXT SECTOR EX DE,HL ;... 1%1 e:] 0:e 0!%] 0??r?2h2|\ ++ Not Found ++ä MICRO RESOURCES DIRECTORY "WASH UTILITY" Ver 1.3   Command Function  ------- --  V View file at Console   (any key aborts)  #L Print file to List Device  #P Send file to Punch Device  #C Copy file to another Disk  R Rename file   ^.0pce ++  =  Replace ?  Ym  t  ++ Destination Directory Full ++m*+*F   x  ++ No Memory Available for Copy Buffer ++mi`"J 2O !"L *F "H *H   *H "H *L #"L *J  >2O *F "H *L |z +"L *H "H    ++ Disk or Directory Full or error on Write ++m:O  m ++ Destination Close Error ++m New Drive ?  mA<2\> 2]2ez{}o|g~#. ADDRESS IN HL PUSH HL ;SAVE ADDRESS CALL SCANER ;GET FILE NAME POP HL ;RESTORE ADDRESS JR NZ,ERRJMP ;MUST BE UNAMBIGUOUS ; FALL THRU TO MEMLOAD ENDIF ;RAS ; LOAD MEMORY WITH THE FILE WHOSE NAME IS SPECIFIED IN THE COMMAND LINE ; ON INPUT, HL CONTAINS STARTING ADDRESS TO LOAD MEMLOAD:CALL MLOAD ;USER MEMORY LOAD SUBROUTINE PUSH AF ;SAVE RETURN STATUS CALL RESETUSR ;RESET USER NUMBER POP AF ;GET RETURN STATUS RET ; MEMORY LOAD SUBROUTINE ; EXIT POINTS ARE A SIMP.. IN DE CALL DMASET ;SET DMA ADDRESS FOR LOAD LD DE,FCBDN ;READ NEXT SECTOR CALL READ POP HL ;GET ADDRESS OF NEXT SECTOR JR NZ,ML3 ;READ ERROR OR EOF? LD DE,128 ;MOVE 128 BYTES PER SECTOR ADD HL,DE ;PT TO NEXT SECTOR IN HL JR ML2 ML3: DEC A ;LOAD COMPLETE RET Z ;OK IF ZERO, ELSE FALL THRU TO PRNLE ; LOAD ERROR PRNLE: CALL PRINTC DEFB 'Ful','l'+80H LD A,1 ;SET NON-ZERO TO INDICATE ERROR OR A ;SET FLAG RET PLENG EQU $-ENTRY ; LENGTH OF ZCPR FOR LOADER MOVE .$^D Delete file  X Exit to CP/M  !B Backup one file in List  "S Restart on another Drive  sp or cr Forward to next file in List H or anything else Display this help message !P "> O! :\:  "> \*> "D "F \ ʕ!P "@  "B *B *@  F  P *B  "B *D T*@  "@ "B *D T!P ".> *>    "> :@2 X: XX1.XXX :  m mBXʤRʧ.4 ~_#  `_ _D =D :D ;D D 7#F Nwy#P Full or error on Write ++m:O  m ++ Destination Close Error ++m New Drive ?  mA<2\> 2]2ez{}o|g~#" ~_#  `_/H "@ "B *D T!P "> *>    "> :@2 X: XX1.XXX :  m mBXʤRʧ.qLE RETURN WITH THE ZERO FLAG SET IF NO ERROR, ; A SIMPLE RETURN WITH THE ZERO FLAG RESET (NZ) IF MEMORY FULL, OR A JMP TO ; COM8 IF COM FILE NOT FOUND MLOAD: LD (LOADADR),HL ;SET LOAD ADDRESS CALL GETUSR ;GET CURRENT USER NUMBER LD (TMPUSR),A ;SAVE IT FOR LATER LD (TSELUSR),A ;TEMP USER TO SELECT ; MLA is a reentry point for a non-standard CP/M Modification ; This is the return point for when the .COM (or GET) file is not found the ; first time, Drive A: is selected for a second attempt .s.DEPHASE END imove 4WMP HLPabcdefghMP HLPijklmnopMP HLP:qrstMP80 2uvwxMP40 4yz{|SPENCER }AAVOL3 DOC~D COM MBASIC COM;_CCP DOCCCP DOCCCP DOCb.(+VʗLʤPʩC>Sʵ e*> \ U Beginning of List *D  ">  < *>  "> Û *> *D › End of List !P "> Û*>     New Name ?   !! Fm#~ w! 6# 6 #!! N#  i&6   d.=w# d d.=*!  X X.Xw#B! 6#] !  G>w# l: 2  !  ! 6#‘  ++ Name Already Exists ++ *>  !   m ++ Not Found ++m.8. B MLA: CALL SLOGIN ;LOG IN SPECIFIED DRIVE IF ANY CALL OPENF ;OPEN COMMAND.COM FILE JR NZ,MLA1 ;FILE FOUND - LOAD IT ; ERROR ROUTINE TO SELECT USER 0 IF ALL ELSE FAILS DFUSR EQU $+1 ;MARK IN-THE-CODE VARIABLE LD A,DEFUSR ;GET DEFAULT USER TSELUSR EQU $+1 ;MARK IN-THE-CODE VARIABLE CP DEFUSR ;SAME? JR Z,MLA0 ;JUMP IF LD (TSELUSR),A ;ELSE PUT DOWN NEW ONE LD E,A CALL SETUSR ;GO SET NEW USER NUMBER JR MLA ;AND TRY AGAIN ; ERROR ROUTINE TO SELECT DRIVE A: IF DEFAULT WAS ORIG..,%*>     5 ++ Not Found ++m Deleted*>  "> *D f Q"D P m*> m List Emptyä >ë>ë>2N *>    ! 6#  ++ File Cannot Be Opened ++m2  m!~m_:N O #*>    ! 6#T2 !!   £ ++ Source File Cannot Be Opened ++m Destination Drive ?  A<2 G:  ++ Cannot Select Same Disk as Sour.</./// /0///$/4///(/8/ //,/<0000 00000$04000(080 00,0<1W111 10111$14111(181 11,1<2222 20222$24222(282 22,2<3E333 30333$34333(383 33,3<4444 40444$44444(484 44,4<5s555 50555$54555(585 55,5<6666 60666$64666(686 66,6<7a777 70777$74777(787 77,7<8888 80888$84888(888 88,8<9999 90999$94999(989 99,9<:::: :0:::$:4:::(:8: ::,:<; ;;; ;0;;;$;4;;;(;8; ;;,;<<<<< <0<<<$<4<<<(<8< <<,<<=;=== =0===$=4===(=8= ==,=<>>>> >0>>>$>4>>>(>8> >>,><?)??? ?0???$?4???(?8? ??,?<@@@@ @0@@@$@4@@@(@8@ @@,@<AlAAA A0AAA$A4AAA(A8A AA,A<BBBB B0BBB$B4BBB(B8B BB,B<C~CCC C0CCC$C4CCC(C8C CC,C<DDDD D0DDD$D4DDD(D8D DD,D<EHEEE E0EEE$E4EEE(E8E EE,E<FFFF F0FFF$F4FFF(F8F FF,F<GZGGG G0GGG$G4GGG(G8G GG,G<HHHH H0HHH$H4HHH(H8H HH,H<I$III I0III$I4III(I8I II,I<JJJJ J0JJJ$J4JJJ(J8J JJ,J<K6KKK K0KKK$K4KKK(K8K KK,K<LLLL L0LLL$L4LLL(L8L LL,L<L