READ ME 5TURBO COM TURBO COMp !"#$%&TURBO MSG ()TURBO OVR *+TINST COM,-./0123456789:;TINST COMG<=>?@ABCDTINST DTA#EFGHITINST MSGJKLMLISTER PAS,NOPQRSCMDLIN PASTMC PAS3UVWXYZ[MC-MOD00INC\MC-MOD01INC]^MC-MOD02INC_`abMC-MOD03INC$cdefgppendix M of the TURBO PASCAL Reference Manual. Now, using your working copy, run TINST to install TURBO.COM for your terminal. Installation procedures are discussed in Chapter One and Appendix L. ******************************************* * * * Need help with TURBO? Please see * * Appendix N in your Reference Manual * * for answers to common questions. MC-MOD04INCFhijklmnopMC-MOD05INCXqrstuvwxyz{MC HLP%|}~MCDEMO MCS] * * * ******************************************* ------------------- Contents of the READ.ME File ---------------------------- 1. CORRECTIONS to the 3.0 Reference Manual [ All versions ] 2. OMMISSIONS from the 3.0 Reference Manual [ All versions ] 3. New FEATURES [ CP/M-80 ] 4. ADDITIONAL FILE LIST [ CP/M-80 ] ------------------- CORRECTIONS ----------- Page 253 - MOV AL,[BP-1] ------------------------ The correct statement is: MOV AL,[BP+4] Page 293 - TURBO-BCD will compile and run any program ----------------------------------------------------- Well - almost. The Real functions Sin, Cos, ArcTan, Ln, Exp, and Sqrt and the pre-declared constant Pi are not available in TURBOBCD. ------------------- OMISSIONS --------- User Written Error Handlers --------------------------- In Turbo Pascal 3.0 you may write your own error handler, which is called in case of an I/O or Run-time error. The procedure must have the following header: procedure Error(ErrNo, ErrAddr: Integer); The name of the procedure and its parameter Welcome to TURBO PASCAL Version 3.0! ------------------------------------ In spite of all efforts, some errors have found their way into the new TURBO 3.0 manual. This file contains all the necessary corrections and additions, and we apologize for any inconvenience this may cause you. Please make a working copy of your TURBO disk and store the ori- ginal in a safe place. For help making a backup copy, please refer to as are unim- portant, as long as it is a procedure with two value parameters of type Integer. The value passed in ErrNo is the error type and number. The most significant byte, i.e. "Hi(ErrNo)", contains the error type, and the least significant byte, i.e. "Lo(ErrNo)", contains the error number (see Appendix F or G in the Turbo Pascal Manual). The following error types are defined: 0 User Break (Ctrl-C). 1 I/OS-DOS) or OvrDrive (CP/M) standard proce- dures may be used to specify the drive and subdirectory in which overlay files reside. Please note that run-time error F0 indicates that your over- lay file is missing or is called recursively. (This error number is omitted from the Reference Manual but is included elsewhere in this file.) ------------------- TURBO PASCAL Version 3.0 error. 2 Run-time error. In case of a user interrupt (Ctrl-C), the low byte of "ErrNo" is always 1. "ErrAddr" contains the address (offset in Code Segment for 16 bit versions) of the error. To activate the error handler, assign its offset address to the standard variable "ErrorPtr", i.e. ErrorPtr:=Ofs(Error); { 16 bit } or ErrorPtr:=Addr(Error); { 8 bit } There are no limits to what an error handler may do. Typ CP/M-80 Additional File List In addition to the list of files mentioned in Chapter 1 of your TURBO Reference Manual, the following files are included on your TURBO disk: Sample programs --------------- LISTER PAS - simple program to list your Pascal source CMDLIN PAS - get parameters from the command line MC PAS - sample spreadsheet program - MAIN MODULE MC-MOD00 INC - sample spreadsheet program i- cally it will close all open files, output an error mes- sage, and call the Halt standard procedure to terminate the program. If an error handler returns, i.e. if it does not call Halt, or if an error occurs within an error handler, Turbo Pascal will itself output the error message and terminate the program. ------------------- NEW FEATURES OF CP/M-80 IMPLEMENTATION OF - INCLUDE MODULE 00 MC-MOD01 INC - sample spreadsheet program - INCLUDE MODULE 01 MC-MOD02 INC - sample spreadsheet program - INCLUDE MODULE 02 MC-MOD03 INC - sample spreadsheet program - INCLUDE MODULE 03 MC-MOD04 INC - sample spreadsheet program - INCLUDE MODULE 04 MC-MOD05 INC - sample spreadsheet program - INCLUDE MODULE 05 MC HLP - spreadsheet help file MCDEMO MCS - spreadsheet data file (not for use with TURBO-87) --------- TURBO 3.0 - AN OVERVIEW - ----------------------------------------- Inline ------ A constant identifier used in an INLINE statement does not always generate two bytes of code. Files ----- New FIB formats. Optional 4th parameter on Blockread/Write returns number of blocks actually read. SeekEoln function. SeekEof function. Misc. ----- Exit procedure - To exit the current block ------------------------------------------------------------  OvrDrive procedure - To specify the drive on which to find overlays ParamCount function - Gives number of characters in the command buffer ParamStr function - Gives the string of characters in the command line Overlays -------- Overlay files are opened and closed every time they are accessed. Therefore, there is never a need to specifically close an overlay file. The Y compiler directive is no longer supported. Instead, the OvrPath (M ͫCopyright (C) 1985 BORLAND IncBNo Terminal selectedP~7#~=  oͦlԅ!!"~#(}:$= +*!6!*!!:(2!6:(>2!!!:O::O:!*! !45(! +/ 0y09.> 8ͭ ?= u+-(>͇ 0ͭ ͇ 8 ?x ͈ , 78ƀ8ƀ8ox٨!دoGOW_gɷɷ|لg{ً_zيWyىOxوG|ٔg{ٛ_zٚWyٙOx٘Gxٸyٹzٺ{ٻ|ټx٨ xx( ?}ٽ }ցs <(s 7| = |٤g{٣_z٢Wy١Ox٠G| ͭ ͂ }x>( ͭ}ƀ/ƀo  -͂ }0͏-͂ ͏,}l˸ 8 5 ͘ x( - 8͂ - 8,͂ }l8;*!͘ ! >5ͭ͘ ͘ ͭ--- ( d!k6!{6``o&  :(͠|(  *"x2y( >28!"9!! og2"">~22!:05+:!Co&ͦͣ} [ (!e|ͧA8Q0G: x@!\w# (̓ ?(*( .( x_. _!h6# (?( *( ̓( w#>?> w#ͧ 8 !ɿ .,;:=?*[]<>{}a{ |͵};Ɛ'@'7||}>2Ͱ*Bک  "og"2>2!߂ ,,,-xGg?+2n*8t z~,->( x( ͙}. ͇͂ , ! >5,ͣ- o&0% ,͘  }gs }؉}颋.:}8c~I$I~L*ͣٷx˸ }0G,<} ,-(-͂ !>J0 ͙͘ o8 ͇ >( m.`1pF,t6|!wS<.z}[|%FXc~ur1}͇ٯx(<˸ 8 !~J 0/O!>t 8 =  o t͘ ͇ /o 0 ͏-͂ OT0 j oD,: ""*B"[Rv*"^#V#^#V#N#FO/o&9O/o&9!9(> (G!9 w#Eͻw}8( RB0 >( RrRR!+ ͱ R!+ ͱ s!+ ͱ s!+ ͱ s!# ͱ s!+ ͱ T]KB!z>j !I}袋.}8c~I$I~L! >ͭ͘ JØ oo ͘ = ͇ nf^VNF!DLT\I!!53!r1!͓!> x #-= o˸x͇(- }(x>8({ ,{ `iÄ!>( |s |́>)=|(DMbo˸88x(0 8> ́x(>-{(ay( z(>. ( {>E>+|(|Dg>-|/ 0:p# ~# +>0w#,-  60#~ S>))0 = | |́́DMgo>jB0 7?= H͓<z5b)b<z {0Gɯgo||}||/g}/o#}o&K[xAJSJDM!b"!6J"DM'd } * W _}8(8J`9{T]=o`9y .({ = ~> x0w#xG%͈ %͈ ZJDM%͈ = _~65+~hìx-Sx9?+{Η@}|{ { gZJDM0| ,7}o˸@ #yO!@9i&~8 (8~wPT] *  >( ͂ ͭ͘ }>( x‰ }} ˸T}ٕ(0D={ ,= ( ͓ 0%| , 7 ?(8ͭ x ͇ - s 8˸x ͐  ,-xG}s }مN 9s .>#n0͓ | = - nx ͈ ,-(-˸G,-s }ٕ?N @  #@w#@/w#@w#!9! E9!!9~(+Fͻ!"9!(#>2*"| >"2:( ͷ *w*6 !\$![ (ͧ( #:~CONTRMKBDLSTCAUXUSR>2j:*ˮ~1:*:(@q##p[* :(  ~* < >26"!"""~>2""v>2>"!"ˮ(!~8>~O6~*"nf}(HR0nf" ^VMDnfutqp*s#r*s#r"* vKB!1>( ~#fo{_"*R0RnfR0KqputsrNF( ^VNF^V*SutKqp R*R(~w~wnf ut"6#L*L*!""*NFy(* "*B0Cnf* [R*"*RS[s#r^#V""6#>O"w2x2*"!G"" 'z*"*>2"*"w(6(2(-()(6 (8 0 :(* y(~#+ (( 66 #6 #"*: y~o p .##~ͻ(.6w4._~ =*##55= *[R8*~#"= ͣ}== ͯ}͵}*#w+#~+>*~('l!0(ˮ]l!8ˮ!]~-#8~>27lˮw>O%7̄s #r%ͤ7̐ l ( (ˮ ql(ˮ ( l ˮ*O:~ ##~._q4((=ʦ==ʩ=ʬò*!G"""!\*: Os!~6go(\R*s#r_2x( s x(T]DMx(R0 U(͞O/o&9q# (!>F0#( ~ ( #]( ~ ( (#}(  i&T-a%ã}ͧo*!~6o&|:2!2}:__{ѯ2*|KB " z ^C User break+=  I/O Run-time error {͵, PC=*ͰNot enough memory Program aborted :m'=!*"*E!ze :4^q*##~6ͻ>2}*|(̈́|( ̈́6-#[RM8( G> A~#*(C! !TRUEFALSE!9N#Z~#( G~#> >    "~(lѻ(( !0 (ˮ!!>2S{:1:*6##ww#w$w#w:  ##N#F*B>2w#w#[s#r> "~ͯ*-w#ww##> ͯÂ""~>2:[R0 *4#4>2:[R> *4 #4(> lÅ :$E:#Eă-n-*-$:D=(2$E"'- *< "D<2D ?)!TURBO Pascal systeml5!Version 3.01A 5!CP/M-80, Z80 Copyright (C) 1983,84,85 ͅBORLAND Inc. )! Terminal: !S Include error messages-2#Eă-n-Y"{!"ͧ!?$Q$ /$8: z ?ogged drive:Aork file:1ain file:D-dit ompile un ave eecute ir uit compiler ptions Text: [&E*>22*f(/˦:G(##~++ :O x yD!ͻ Q*:G(##~._.͛g<]=<͛*##w ͯ +4 #4x>>2:G("ͯ"*nˮ*0 S[ѷR8@* N#F#s#r- 0})jS\*##w+ N#FB ͯr+s>2!T]>)j)0 0= ^R!#^*^#V#N#F#^#V>2ͱ:1:*6 #-Nw#Fwq#p#6#w#w#w"~Â>">!DM!":*B:!>(>2>">!"2(E+#[(E**EFree: շR;. bytes (Ͱ>-Ͱ>)= compile ->  5!!X#?:D@#emory @#om-file @#cn-file :D(]tart address:*DͰ (min ! Ͱ) nd address:*DͰ (max *Ͱ) ind run-time error uit ͧ!J$g$/$(#7^#VLWMECRSXDQOMCHSEFQ,$y$*(v*& +r++X#'#'''/'M'z'u$Y" Main file name~-@">2D -D!\$!%"}%% Work file name@">2E n-" -D!\$!%"}%!%"\%n-D*&E"BD"DD"~ʱ*w#wx(9* :O *-4 #4!*4 #4 *-N#Fq#pV+^Bq#pS[ѷR'* s#r$ s#rM <?*M!\  <( !\$>2>2M:>!(* \$\<(!4: [1ð\!(7"~> 2"S"Ns#FrB(Z#\: \<(?*"}K\! !*}#"}! x \* *>* 2""{_!"*"2D"6D":D"LDK*E%6 #"(E Loading -\ͻ&$Ͳ&WyGr<(.Cm{Km{B Ͳ&Wyw# File not foundU.%2 New File#!*(E File too bigͳ%2E"!e6B#6A#6K>:aD(,Workfile 1 not saved. Save2aD-/-!D\$ Saving \-*(E+6%͸&Gr!]l2aD<2D\Ͳ&*&E͸&Gr<(NWyGr~#GͲ& >Wyx xր> \Gr\! 6T] Directory  Disk fullU.͸&Ͳ&:DFAw#yA"4D?Ü.SB0 !dD6#w!dDBͣ/ !dDKCͣ/7=( !C ^#V7i/SB4#wi/BqB!ͣ!dD~#~͇/= < >^@ N#0O # >>O BqB!VD~ s6!"XD2ZDͣ;<:h88 !*ͣ1!ALine !ACol !:TD AInsert AOverwrite :[D AIndent:ND<*ZD(2ZD!ͣ0[XD*2D;ʆ7͆7[&E*2DRMDy(> 0BqB ! ͣ<>0*2D"XDÆ70G> |>0(-'11d1 12aD!]l2D%Ͳ&">>>2D~-Start address@"! ĸ-"DEnd address@"*< ĸ-"D *| "Enter PC@"͸-"Ͷ'!"y>2y Searching~-ï(*-/-Y-!D /-^-(%!%"\%!%"}%D$>2D3y$2y*" y*(E6#"yͶ':D=ʉ(= >C!OM>C!HN22y*D"y*D" y3yͻ&GrGr<9*!(*y"y*y7R8&*y"Gr3yGr! "9*!> Compiling 3y(  --> -~-,E:y  Compilation aborted" lines :yO):y Y*not foR8<00 D-: #V6#/0^ :eD>y 6 ~04J ~(~͇/#4 ͹1 - SB( (( ͹1_~ݾ04s~#͇/~8VÙ1~5+~ 1A>ɯ2`D12U=FindrD1=Replace withD=OptionsD1:hg%.ã>2`D112i/6">>#[4DsAt{R[2D"jD!DF6(C#~08:0 40_0.+ͧW U N G B { SlD*&E:_Dg(*(E_ *jD"jDf [(E;b3;b3tD:sDGf(=_0F(3~8und "( *y R #Code: [y*y+#*y #* yData: #>2$E9*0sGError &h@.:#E(f*B~(^ 80O#0#( ~# #: ~ (7 0![B 0  ( #Y*found2D:y(?>.%D!y $ Error found in above include fileY-( D!D U.* y*Disk or directory fullU."Run-time error position :$E(:D=(;=+Y-!D(!D3y >C!OM2*i-&ͣ*B"38T(3 K6F( 3~8386f̿;:`D4^ KlD ClDx E38f(*jD32͸3͋3^=Search string not found>͑3=[(E;8;"2DRt{"4D?@[&EsA*(E+sA08:A8 [a8{طf( Ϳ;?f(;ȾV( 30ɾkb)))qB(N a͋3x;N U=Replace (/): nfͣBqB  y !ͣBqB  y SB>ͧY( NƯ2$E:DO:sDO0f *jD>x(!DqB)A =Af F">=*BD[DD;6==Write block to fil"%+'%\!>O!VR-!Ͳ&ѷ( Program@"!>C!OM-(!\:D!!!2D!!Dir mask@"Gr:\( =_GrA2l,WyGrͲ&O<(RyO!ay ~ =!Wy  :h=0:  #~x> (> ( No file ~<2q{nf"o{#ͥ,*o{̈́,`iͥ,Bytes Remaining On X: R@.>k_Gr |,,( ͜,0:q{)New drive@" : ͧA Gr2_Gr (Y/N)? ͧY(N NeH5 -Ͳ&<("=Overwrite old \-,(Ͳ&*DD~6=*BDq&wD1D=Read block from fileH5 -Ͳ&< =\.>6*(E[*E RDM*nD7>!5*nDR!5"\%?%"DD*nD"BD*m{RDM![nD5û>6=i6*nD[BD"BD "DD>*BD͋3D76=i6*nD"BD "DD@=D7F(>#[4DsA&>t{R[2D"nD[BD;[DD8;0 *BDR"pDMD>KpDy/Ox/G[nD*BDF">*BD;"2D*6D[BD;8[DD;0*2D"6D*DD[BDR=MD@>*2D"BD"DD=D7!bDx7D7*4D"HD*2D"DDNF,>P!AS2e"f:\Gr<2\:E*- Y- ͨ$D!D$>2D:D%$:DD!D #*&E6 #"(E2aD2D2$E*B"&E\!>M!SG-2#EU.(!%"}%!%"\%\$*(E6#"&E!ͧ0 8 ))))o@@>:  x>.-!\0.:Dw0.>w0.6- not foundͲ&<͜'. Press   *(Er+sS{2VD<2WD!C"r{!ND?*&E͋3:dD=(!ͣ:dDG> x;//0.(!.z8 2aDW2$E!9D=Di/6SB2aD!$E6*4D{;0 A(>(*4D"FD*2D"BDF">*BDË3">*DDË3&͉7!t{;07)A">*(EË3!t{"4D?>#{;8!{"4D?6!TD~w6![Dfnã*2D͓A">*2D͓A"2D@=*2DͲA">*LD[&E;">*2D[LD;(ͲA[2D"2D:i ͲA*2DͲA͟7">*2D*LD:iG͓A͟78[LD;0͓A*LD[2D;">">*LD:iG͓A">:iOG*LD͓A"LDA*2D͓A"2D@)A=">:iGO*LDͲA"LDA*2DͲA*LD[&E;()A">*&E"2D"LD@=!t{"4D?F(͏7S7Ư2$E> 8͆7 FM:CAT:29*2DLD<:i=Þ;[r{Ⱦ(7:SD 02WD6 F( *FD;8 "FDN( *HD;8 "HD.A!{R(MDkb#!{6 ;͆7:h=*4DG#<*(E+RDMT]8 > A7MD> ;8 ;(8 #`i.A{R+MD{kb+y(6 ͣF(:%E2%E*>D"@D B*@DEB[>DR͠w"@D#m{R!Y{[>D*@DR( EB~">D[>D*@DR{ DCAB=">͓A"2D!t{"4D?@=29 *2D͓A;=">:cA>#[4DsAt{R*2D7>6 #6 *4D;"4D?*4D;">*:D;"2D*"2D@=>*4D;8 A8;8 A0#"4D*4D?>[4DկR0<2q{+;8+*2D͓A">*2D͓A"2D@=!t{"4D A8? A0;8 :q{ ># A8*2DͲAM::SD*4D"JD">*2DͲA"2D=!C"r{9!C"r{2SD"2D=F07*4D[JDRA6  07*4Dͧ?{6 ;(#yA!t{"4D?ʹ:">*2D͓A8 RMD;=&>*2D͓A                <>,[].*+-/$:=(){}^#' 8f9f9s9997778~8T8S7\7/8A88J77'7|9q7κ$UZZ7696ݵU4*T}712-2t{t{t{Y{Y{  =++>:( Z:i=͞;=A=>[4D;8~ (8 A8*UA A8%*2DͲAʹ7\7$;*4D *4D;8"4DUA?yAUA~ (qB†7͎;0Æ7͎;0Æ7:WD!i74 &oͣ*LDG( ͓A0<;;#[(ER#{+[&E> ;8 #+t{ ~Ϳ;:h=G<̓<͢<:NDG(~Ϳ;0; (:h=GF(̓<͢<>[4DsA#"hD;0+̓<͢<[hD;(~Ϳ;0; (m<~Ϳ;0  0@{<:(M>FF @[FD;87[HD;8!,FF ![BD;8[DD;(0 :Fl:FÅ:š> : 2VD:i=o&ͣ{{sq{*(E#"{$$$$"{* y"ygo2{2{2{2{2{2{2y2{2{"{"{qq+"Ty> 2{>2{>2{*&E"{"{!y6*yͤl**E+"w{T]B"s{"u{"{{ͩk!tE:y= xll"yrwoXn u tFn tFn(Po*o>1!vk!y:y(ltk:{(>~kyk!ehk>!~kyk>~kyk* ylk:yg.>yk!hk̀FR~.ͼr ! dk[y$l!l:{_$l*s{im"s{:{_lYkyk !ͣZ*2DSFDSHD!t{6~[BD; "FD[DD; "HD X6 #(eͿ;0[DD;0!"HD[BD;0!"FD>2QD6 #*4D?F07:WD=07 (w# Ϳ;0&==Line too long - CR inserted>!}R9=͆;=A6!ͣ;!ͣ<> !{s{+; {;PYsA>#MD*FD>"FD*HD>"HDi`#t{R:QDO0*2D>*2D!t{A(%~[FD; "BD[HD; "DDw##+> w**ER8&B =0A byte(s) left>=ERROR: Out of space>Ü.=*** INTERRUPTED>Ü. BU.0z[k!{ ~~k#:y= xl2{l*{*y*{"y!"{!9!3y$:y= '!{4y 6#3yGrGr<Ͷr\2{2{*y"{\mͨmn(*o*s{Wmimo 8ix\mx Wm !Wzy \m~# Wmͨm'"o\mTm*s{Wmͨm}O[Z{r(ERBһ>]T͍>S(Ex 8 G By(*BDp?"BD*DDp?"DD*LDp?"LD*2Dp?"2D*6Dp?"6D*:Dp?":D;طB [(ERMDx 8 G By(S(E[FDsAF("FDN[HDsA"HDt{:h=OR}88<2ND:h==2RDD72RD2ND6D7F*LD[&EsA"LD[2D;ʼ@8E[2D;( ͲAyB"LD6x :(:i=8 !ͣ c )A[2D;( ͓AyBx @:i=_yW81 F@0':WD8!(2WD*LDB͓A<"LDsq*LD :i_yO0͓A y "LD)A@ͷ@:WDo:i}(=(2WD*LD͓A"+sXoIr*ovk*{#R!l+älgSXnu2o>2{:{2{_(>2{~kvk!lgSXnVu(2o͒^2kEyk6nͼr)XR:W{ :\{ 0r m:\{`o^Qkͼr,*vk:b{= 2k&{~k2kyk###fu ~wRO*o Xnu iw+p+r+s*o6+p+:{( r+s~Ͷr+:{ͼrLxn*o:{*yW(!"{*{{*s{"{{~6+F+V+^+(#!l:{(%V+^+iR:\{2{*b{}2{l"{r+s+x(J~OF+~2{+V+^+"Z{iR*s{Wm~\m~+(\mWmWmͨm!l͝^2{2{jo!{~(2kf(2k i:{ͼr.pkXnbu "i:{ͼr.ѷR#lk2kRB> 2kR>2{n(:{~kyk@o($l:{˟~kyk:{:{gS2{2{n(Xnu(6Ykyk!lXnPu(U:{Ͷrr)gSXnu(2o!l6nͼr(:{ͼrHWm:{\mYkWmyk:{:{!{Ͷraag:\{ͼr!{^4!{:]{w*{>"vkn(XnTuͼr gS2{Ho>> o>( >< o>(2{goGi x (Ar!{~ 6>* o (6n XR*X{6n( 6nͼrJ++V+^ j>+ o(>- o(:2{4OA*s{*{*{:{:{:{!{4̀F2{2{2{"{"{S{|(R( lktk! hkM2k#^#V++~+(XR:W{ 7:\{8(@(98(6 0/2k)Uk*X{pk*b{lk2k2W{>2\{!"b{Uke2kR!{5:{(F*{:{ G2k>!vk!;hk2k" >!vk!-hk>*vk:{= 2k&*{|('[{R(:{( :{>~klkpk!#dk2k*o"s{"u{"{{*s{[{{R#^#V~( ++~+(~ͼrI*s{:{_Wmim\mWmWmͨmn(*s{}OwRXnDu> #:{ͼrK6n ~2{+V+^i"{>2{ͪOͼr{(0 $% }~kyk>/ o}VPo+F+V+^+V+^+++V+^+V+^+ʸWHoF+~+2W{V+^+H~+(AiR:W{ *:\{8f^FX:\{(* 8) $2k m+g mag?m:i{ħX+mQk(@o(@oPoz(tkpk>vk:\{(80r6:{O G(>*{"X{mgQk>2W{`o:\{Y m+g%mͧX:d{=(<(2k[2k*e{yk2k*o{lk2k:\{ x - ! # x 2ke. x  ! hk:\{  y*^{*{|[^{Rr,:\{(O 04 :{o '#000*`{| *m{~ !\{i{0 #r$2{:{:\{rC͗N"o2{ͿN:{(x=ͼrK:{! *b{:{ :{ l *{"{++~(+:{w+r+s+[Z{r+s+++ͪOXn$uͽOPP"QMQ͇QͧQQr$6nV+^"Z{iRXn*uoR*Z{*`{[^{R#|Ͷrbn(ojo}O*Z{"^{*b{|rͪrb"b{"`{>2\{6RXn6u:{:{!{4~2{*{*{!"{"{2{mP*{"b{"{"{:{2]{2{2{>2\{6RPXnu(O*{[{R8"{n(8ͪOOjoP*{in("oHo:{>2{mP2{"{n(:{PoXnur:{oXnuXn3ujoR*`{[^{|ͼr,V+^+V+^SX{iR2W{`of^FXeY!q !p7Y4Qk@oͲ^PohkY!7YY!!!YBYàZYͶr?!(!pQk@oy^Yͼr@!!Y!YY:\{ *^{SR*o{pkY!YPoY:\{_^#Vhkqp{jHoYr͔g7:\{8 0mg:\{ɯ=>2{n(ͬZsY8 ʺ[ͼrA!hkQmgͬZͬZag:\{8 ( 8rB :b{=g.yk!!s (!E ( !O:b{= !Nhkn(Po!:{hk:{G! hk!:{w(!:{(!2{hk>2{n( !hkô[Y8! ʿ[ͼrA!hkë[a!hkF===;;;}2\{6R oWm*s{͜mͨm"^{>2\{>2]{!"b{6RXn/uXnBu }O:\{80rD*Z{"^{>!>!02\{"b{6RXnn!Wmim:{\mWmͨmn(Po!{~42\{S^{"`{z!(#"b{6Rix ͪr3Xnbuͼr iͼr,orͪr4QͧQͪOͼr:\{ rWm*s{"Z{!\{~\m#ͨmi{~+2W{V+^+SX{V+^\{~+"y{*s{Ky{B #N#F ~ 6++~ @+~(;6+^+V*s{Kw{B Ͷr*#N#F ~ ++(~+(F+Nq+p}R2{2{YS"{dk*s{[u{R0I#N#F/!hk>j !x ~,() !hk@kë[a^x8 8rB n AͿ^*an y^x *n Qky^!x .tkx Qk!tkx!(!z (!' ( ! (!#hkn[Po!ÙZ!!"{:{ͼr#!hk*^{SRn mag%mͧX*{hkPoàZ!!Yͼr%Qk@oagQk@oy^n(Qkag:\{ :b{= rgYHo͏\Qk@oy^Qk@oy^!PohkHoͲ^@o͏\Qk:b{=g.@oy^yk!! ag:\{r"Hö́^*an y^Qkx (-n y^Qk!x (.tkQkx ( !tkQk@o͏\:b{=g.yk!x (!>Hoy^Qkn y^2kDM2k!Pohk 2ko&>Hoy^Qkn y^2k2k!Ho6n(6n ++V+^tkagPo Ho6n V+^iR agͤl*b{ͷe2kMh2k!9 oy^oHoy^PoHö́^Ho͝^n( !tk>2\{YͼrPoJJ:W{O*X{:\{ g!$ &:b{=g.yk! (>! (>**X{vkhk 2k! Uk(':{O( *^{[`{R(pkR#lk!Whk 2k2ks:b{=2k#r*X{ :b{=>" 2k}>2vk2k*yk:\{ 0 (mg!- ( !;(g!^hk:{ >**{vk:b{=2k&mgc\HoͲ^@oag:\{ ( :b{=> rQk@oag:\{ :b{= r! (!Hoy^!Qk@oy^.!IhkHoy^!]@oy^]*^{SR*o{tk!BY]@oy^]*^{SR*o{tk!{BY!!]]QkHoag:\{rHoy^!BYHoagQk@oag!eX]HoagQk@oy^Qk@o͝^!OÓ]! !!?hk!!!l!c!ZV! dkp^2ki`oy^2k m^+mͷe`oQk^x r^x r^x r^x ͼr ! hk^x ͼr!2ke.z_2\{!t"^{!"`{i"b{Dk>!*X{vkigr)͔g:{*{O G>!(>*vkG >vk2kg("6n .XR:W{>!(>*!{p*X{"{h(i(Vi(́iXnxͷe> 2\{!"b{-"^{-"`{h:{GX!{~O6n x_*{"{!{6*i:\{nmgQkf^*`{SR:i{ͼr,*k{| }0!()2k+=< }8 2k#<  jpk2k:{O(*m{[k{R#pk!Mhk*^{iR*b{| }=(.= 2k)$ 2k)]T):{g pk!hkh2k:\{ n)ho>2{| }=(E(Qk2(##(##^#VzͶr/.x 0ͼr/! hk Qkz_xͼr/y(ͼr,!Phk 6`x  ( ͼr/2k|g2k}o}_ ( ͼr/2k|g2k}o}_` 2\{!"b{+"^{-"`{>2{ir)ix rix ͼr j>j(ͼr,jx xGٯ|/g}/o#~-(+tox ( r{j6nFx+ 8V+^ F+N+V+^+~+ngNWz (+~~'(^(# f!Wz~^($#(6' B#~Ͷr7' #~' w# #~ͧͶr7@#w# #}ͪr8y= g:Wzo wo$(3hr0=a:{_,j(x 2k}/o|/g#2kxG2{x 0( 2kQkz x ! hk  x 2ke.x 2k z ! hkz (0#( 8 2kx Uk! hk 2kxͼr, {ȷyKr,*{|[{zRr,^}_9`^}_9`Y>j 5:{_j2{x 1yO~kyk tk!Nhk@k6n WiR*^{"{:\{G͔g \:\{0( ͼf*^{"{:\{GiR:\{Oͼr>mg*^{~ ͼr>*`{~ ͼr>*b{|ͼr>e.yk!9hkn E!hkn͝^x Oͼr,Xnbu! Qk͝^xŹͼr,!hkn(ohr0ͧE(. .()( ͤͪr9 ͪr8 F#~~k#y~k!Wz ~#~k>)>%>!{~kz>> >>>!~k}~k|G:y p#(=(*RͶrk:y([{= [{:y([{*s{7Rͪrc*y%%Rͪrb!{F(ˆl:{_!Wyp<ll*Ty#"Ty2{*yRͪrb"y:y=( ]k*{:{G(#^#VR8###+h&))DMT]+#s#r#s#r!{4:{G*{^#V#ͤlF#kF#k:y=[yR}2{)lg[{[TyR(l"Ty! !{Nˎ"WyGr3yGr=n ^Po#>+e~ke2k&e2kl&e2k}lge! hk!Ho^Pox(͠^ e e!"{e !Ho!Ͳ^PoñcHoͲ^@o!HoͲ^@oy^@oQky^Po!lhkHoͲ^n Ͳ^!>hkPo!e!~hkn! y^Po!< hk!e!eY !!!eͼr#hk!VV!^^eͶr?(!>!Erd{W{"{!9 *{d{W{"{!9 d{W{!9 z\m{*s{w+"s{ék~Srͪr:Ͳn͚n~a8{0 \m#~dr0*s{#wo~Srͪr:*u{[s{RWm*s{"u{*{{*w{"}{:{(\y2{*u{[}{R 2{=#^#V~(+~# ++F+H˸a8{0 y(dr8"{S{~2{*{[{:{m[ o~(~.#to>] o~.~)>:>;>,>.>(SLIN9^DELLIN>^DELAk]BLOCKREA[BLOCKWRIT\RANDOMIZe]MOV]FILLCHA]EXIC^HALI^PORO^STACKPTZ^FLUSȍYEXECUT`YCHAI[YSTҜ\VA]BDO5eBIOeCHdORcCOPBdLENGT#dPO4dCONCAcdSUCöcPREĹcUPCASdTRUNàcROUNĥcODcABScSQBcSQRgcSIlcCOqcARCTAvcL{cEXЀcINԅcFRAÊcRANDO͎dPARAMCOUN~dPARAMST҃dLcHcSWAcPT dIORESULԦdEOƫdEOLdSEEKEOƷdSEEKEOLμdFILESIZdFILEPOdKEYPRESSEcMEMAVAIdMAXAVAIdPORԡeSTACKPTҬeADDXeSIZEOeBDOSH5eBDO6eBIOSHeBIOeME >)>=>^ݾtonrnr nrnrn:{(r)nrnrororXndurXnBurq2{=2{~( ( ((({( ~* qF~$(!qx*~  ~) q} qq~ͧI(MR(GA(AU(;X(5V (/B@()C(#W(LK(D(F(RG(NP(Jr]q~+( -(ͼr]6!{~wq~,oq~hrͪr]02{q~hr0 q~:yͼr` -\Gr<ͶrZy$:y=( !Wy"{!y>!*s{[{S{R<|Ͷrc}o)|"{"{2{2y!"{:{2{:{dSEEKEOLdFILESIZdFILEPOdKEYPRESSE dMEMAVAIeMAXAVAIePORԿeSTACKPTeADDveSIZEOƝeBDOSHSeBDOTeBIOSHeBIOeMEx^FLUSȫYEXECUT~YCHAIyYSTҺ\VA"]BDOSeBIOeCH%dORdCOP`dLENGTAdPORdCONCAԁdSUCcPREcUPCAS7dTRUNþcROUNcODdABqcSQ`cSQRԅcSIΊcCOӏcARCTAΔcLΙcEXОcINԣcFRAècRANDOͬdPARAMCOUNԜdPARAMSTҡdLcHcSWAcPT+dIORESULdEOdEOLdSEEKEOdSEEKEOLdFILESIZdFILEPOdKEYPRESSE dMEMAVAIeMAXAVAIePORԿeSTACKPTeADDveSIZEOƝeBDOSHSeBDOTeBIOSHeBIOeME2{*p~#:{ͼr[*{"{*{"{!yq ( ( ( 8w#2{`qqq`q6*{#"{}(> :y(>I> > *{@.͠(. *** Abort compilation,ͼr  :y *{~#"{*{[{R80[{:{GGryGr !>S{*{~#"{ 2y:{2{:{2{*{#"{A[?_a{?Sr0:?||zr}DM!>))0 = BKgo>jB0 7?= ## ##+~qq2y( yR[{:y [&ER[{" y:y= 3yGr{q{ tEGETNItAHCtAER tAELOOBtXETtTYB  URT SLAF  NIXAM !I P tUPTUO tUPNI tOC tRT tBK tSL tUA tSU tELFUBtTPPAEHtTPRUCERtTPTSNOCtTPNINOCtTPTUONOCtTPTUOTSLtTPNIXUAtTPTUOXUAtTPNIRSUtTPTUORSUtTPRORRE tAERBC      ufuu are not allowed  can not be  constant  does not  expression  identifier  file  here Integer File Illegal  or Undefined  match  real String Textfile  out of range  variable  overflow  expected  type Invalid  pointer 01';' 02':' 03',' 04'(' 05')' 06'=' 07':=' 08'[' 09']' 10'.' 11'..' 12BEGIN 13DO 14END 15OF 17THEN 18TO DOWNTO 20Boolean 21  22  23  24  25  26  27  28Pointer 29Record 30SimpleuuuvPROGRAENFORWAREXTERNAPACKEARRAFILSERECORSTRINOABSOLUTTHEELSDUNTINONI.:LABECONSTYPVABEGIOVERLAPROCEDURFUNCTIOBEGIYSISWHILTREPEA.TFOMTCASUGOTVWIT0VINLINzVT#DOWNT+ANDIMOSHSHOXO<>< (IWRITELZWRITZREADLZREAZDELETH\INSERi\ASSIG%YRESEԛYREWRITŠYCLOSŽYERASSYRENAMHYSEEnYGETMEv]NEׁ]FREEME͖]DISPOSš]MAR˶]RELEASŻ]OVRDRIV]CRTINI^CRTEXI^GOTOXO]CLRSC$^CLREO*^NORMVIDE/^HIGHVIDE/^LOWVIDE4^IN 31Simple 32 33 34 35 36Type 37Untyped 40 label 41Unknown syntax error 42 in preceding definitions 43Duplicate label 44Type mismatch 45 46 and CASE selector 47Operand(s) operator 48 result 49  length 50 length 51 subrange base 52Lower bound > upper bound 53Reserved word 54 assignment 55 exceeds line 56Error in integer 57Error in 58 character in 60s 61 s ands 62Structureds 63s 64s and untypeds 65Untypeds &),HV]agqty Egmv"&^#V#{*N#F r+s!6#6q(6 #( {w#6x2q(#Q!\q(a!\\!Q  a{ 66I/O 67 s must be parameters 68 componentss 69dering of fields 70Set base 71 GOTO 72Label not within current block 73 FORWARD procedure(s) 74INLINE error 75 use of ABSOLUTE 90 not found 91Unexpected end of source 97Too many nested WITH's 98Memory 99Compilerd WITH's 98Memory 99Compiler ͫCopyright (C) 1985 BORLAND IncBNo Terminal selectedP~7#~= oͦkԄ!!"~#(}:$= +*!5!*!!:(2!5:(>2!!!:O::O:!*! !45(! +/ 0y0(!C"* *#s#r####g#s#r7!}!*!y 0&! ~#fo(:z <2z!f!z64!6">2{G:|2{x4!  ^C$qqqq1:2_ :_:@. '. !<.    7*"! *o"![K<!ѷ(  :{>> 2|TURBO COM TURBO.COM not found. Re-insert disk in drive X: and hit RETURN$ d!k5!{5__o&  :(͠|(  *"x2y( >28!"9!! og2"">~22 9/4*9 Co&ͦͣ} [ (!e{ͦA8Q0G: x@!\w# (͂ ?(*( .( w^. ^!h6# (?( *( ͂( w#>?> w#ͦ 8 !ɿ .,;:=?*[]<>{}a{ |ʹ}ͽƐ'@'7||}>2ͯ*Bڨ  "og"2>2! "/"""@2Б!12 2*"*"rKB*"!ے &),HV]agqty Egmv"&^#V#{*N#F r+s!6#6q(6 #( {w#6x2q(#Q!\q(a!\\!Q  a{ ""*B"[Ru*"^#V#^#V#N#FO/o&9O/o&9!9(> (G!9 w#Eͺw}8' RB0 >' RqRR!+ Ͱ R!+ Ͱ r!+ Ͱ r!+ Ͱ r!# Ͱ r!+ Ͱ T]KB!z> !I}袋.}8c~I$I~L! >ͬ͗ I× nn ͗ = ͆ nf^VNF!DLT\I!!53!r1!͒!> x #-= o˸x͆(- }(x>8(z ,z `iÃ!>' |r |̀>)=|(DMbo˸88x(0 8> ̀x(>-{(ay( z(>. ( {>E>+|(|Dg>-|/ 0:p# ~# +>0w#,-  60#}S>))0 = | |̀̀DMgo>jB0 7?= H͒<z5a)a<z {0Gɯgo||~}||/g}/o#}o&K[xAJSJDM!b"!6J"DM'd } ) W _}8(8J`9{T]=o`9y .(z = ~> x0w#xG%͇ %͇ ZJDM%͇ = _~65+~hìx-Sx9?+{Η@}|z z gZJDM0{ ,7}o˸? #yO!@9i&8 (8~wPT] ) >' ́ ͬ͗ }>' xˆ }} ˸T}ٕ(0D=z ,= ( ͒ 0%{ , 7 ?(8ͬ x ͆ - r 8˸x ͏  ,-xG}r }مM 9r .>#n0͒ { = - nx ͇ ,-(-˸G,-r }ٕ?M ?  #?w#?/w#?w#!9! E9!!9~(+Fͺ!"9!(#>2*"| >"2:( Ͷ *w*6 !\$![ (ͦ( #:~CONTRMKBDLSTCAUXUSR>2i:*ˮ~0:*:(@q##pZ* :(  ~* < >26"!"""~>2""v>2>"!"ˮ(!~8>~O6~*"9.> 8ͬ ?= u+-(>͆ 0ͬ ͆ 8 ?x ͇ , 78ƀ8ƀ8ox٨!دoGOW_gɷɷ|لg{ً_zيWyىOxوG|ٔg{ٛ_zٚWyٙOx٘Gxٸyٹzٺ{ٻ|ټx٨ xx( ?}ٽ }ցr <(r 7{ = |٤g{٣_z٢Wy١Ox٠G{ ͬ ́ }x>' ͬ}ƀ/ƀo -́ }0͎-́ ͎,}l˸ 8 4 ͗ x( - 8́ - 8,́ }l8;*!͗ ! >4ͬ͗ ͗ ͬ--- ́w(6(2(-()(6 (8 0 :(* y(~#+ (( 66 #6 #"*: y~o p .##~ͺ(.6w4._~ =*##55= *[R8*~#"= ͣ}== ͯ}͵}*#w+#~+>*~('k!0(ˮ]k!8ˮ!]~-#8~>27kˮw>O$6̃s #r$ͣ6̏ k ( (ˮ qk(ˮ ( k ˮ*O:~ ##~._q4((=ʦ==ʩ=ʬò* ,,,-xGg?+2n*8t z~,->' x' ͘}. ͆́ , ! >4,͢- o&0%,͗ }gr }؉}颋.:}8c~I$I~L*͢ٷx˸ }0G,<},-(-́ !>I0 ͗͘ o8 ͆ >' m.`1pF,t6|!wS<.z}[|%FXc~ur1}͆ٯx(<˸ 8 !~J 0.O!>s 8 =  n s͗ ͆ .n 0 ͎-́ OT0 j oD,:j:4^q*##~6ͺ>2}*|(̓|( ̓6-#[RM8( G> A~#*'C! !TRUEFALSE!9N#Y~#( G~#> >    "~(kѻ(( !0 (ˮ!!>2Sz:0:*6##ww#w$w#w:  ##N#F*B>2w#w#[s#r> "~ͮ*-w#ww##> ͮÁ""~>2:ZR0 *4#4>2:ZR> *4 #4(> COM="|*|D"z*z! !!V !t!t,"r*r"p!*p:ͣfzʝ!"n*p*n*p*nn&s*n#o!P!!Eʺ!͛͛ͺ*** FATAL ERROR: !:!ͪ ""**E"*""*"*""**E?"*"E"*"*" "!* Eʁ"** !}2È"!}2*&" * :ͣ!* !n&! }oE"* !!Ö"* * :ͣn&! E#* !*>22*f(/˦:G(##~++ :O x yC!ͺ Q*:G(##~._.͚f<\=<͚*##w ͮ +4 #4x >>2:G("ͮ"*nˮ*0 SZѷR8@* N#F#s#r, 0})jS\*##w+ N#FB ͮr+s>2!T]>)j)0 0= ]R!#]*^#V#N#F#^#V>2Ͱ:0:*6 #-Nw#Fwq#p#6#w#w#w"~Á>">!DM!":*B:!>(>2>">!"2 !n&+s"/+"6"8!;*6*o !;*8*ͺ "2"4!;*2*o !;*4*; "/*/*"-*-!ԟ!)^#V*-!ԟ!)^#V}o*-!ԟ!)^#V}o}21*1&")"+*+*"'!}2&!ԟ*&&)^#V*'͒E8$*&&!}2& $!ڟ*&&)^#V*+*E**)s#r" """$*$|#}oEz%*$*"!}2*"*"* *"!ԟ*&)^#V*!ԟ*&)^#V*}oE%*&!}2"~ʰ*w#wx(9* :O *-4 #4!*4 #4 *-N#Fq#pV+^Bq#pSZѷR&* s#r$ s#rL <?*L!\  <( !\$>2>2L:>!(* \$\<(!3: [1ð\!(7"~> 2"S"Ns#FrB(Z#\: \<(?*"}K\! !*}#"}! x \* *>) 2""{_!"*÷$!џ*&n&E;%!ڟ*&)^#V!ԟ*&)^#V#!ڟ*&)^#V*I#!ԟ*&)*s#r!џ*&!s""**"!}2!ԟ*&)^#V*͒E%*&!}2Ü%**"!}2 !ԟ* &)^#V*͒E&* &!}2 %**E"**E"!ڟ*&)^#V**" !ڟ* &)^#V**" * *s*d* * *d*s* *d!џ*&!s!џ* &!s""***d***d*G!* &}2*&*!nf}(HR0nf" ^VMDnfutqp*s#r*s#r"* uKB!0>' ~#fo{_"*R0RnfR0KqputsrNF( ^VNF^V*SutKqp R*R(~w~wnf ut"6#K*K*!""*NFy(* "*B0Cnf* [R*"*RS[s#r^#V""6#>O"w2x2*"!F"" &y*"*>2"*"ED'!!+)!s#r!!+)*!Rs#r!"J'!"*!Eʠ)!*+)^#V"}!*+)^#V"{*!R"*}"y*{"w*y*w!"**y*wf$*!m#*m*u*d*y*w*f$*y!q#*q*uͼ&E((*y!"y*y*w*f$*y!q#'*w*y*f$*w!o#*u*oͼ&E~(*w!R"w*w*y*f$*w!o#B(*y*w͸E(*y*w͒Eʩ(*y*w{%*y!"y*w!R"w*y*wE'*w*}R*{*yREC)*y*{!F"""!\*: Nr!~6go(\R*s#r_2x( s x(T]DMx(R0 U(͝O/o&9q# (!>F0#( ~ ( #]( ~ ( (#}(  i&T-a%â}ͦo*!~6o&|:2 2}:__zѯ2*|KB " z ^C User break+=  I/O Run-time error {ʹ, PC=*ͯNot enough memory Program aborted :ʎ'1!d!c$>,cE:)*!"!*+)*ys#r!*+)*{s#r*w"{Í)*}*wEʇ)*!"!*+)*}s#r!*+)*ws#r*y"}*}*{ͥEʍ'J'*!*!ͥ}oES**!E*!;M $$$SOWRK.$$$p!;o !}2:!!#!!#!ڟ!)^#V!ԟ!)^#V#!ԟ!)!ԟ!)^#V!s#r*!El*!"r**"!ڟ*)^#V**"***d*!"*!"**E*!"*!"*k*!R*}/o|/g#f$*k!"ĝ"Ɲ*Ɲ}oEQ3*Ɲͩ*ĝ͎ͫ*ĝ:! e.*ĝ:Ͳ#!k*ĝç3*#"*!Eʑ3*#"!"**o*!9!;!9*n&}25*5&""!"!}28!"!"!8!!!n&s!!8:ͣfz4"6!8*6U3s*6#3!8:!:͍E<4!}28z4!8!!!8!!8!n&#s!8!8:ͣU3s*I*8&}oE4*8&}2Ý*!*!:ͣR!*s#r*!!:ͣR!!E*s#r*Ý&}24#***d*k!"k*k*ͥ}2""""""!!)"!*"!+"!"!,* * !!,! !! E+!@! !!,! !"*!EB,!*!"*!"**"*!͸Ew,!"-!ڟ!)*I"Eʔ,!"!ڟ!)*I"Eʷ,*!"!ڟ!)*I"E,*!"!s*I"E,*!"!u*I*4&!E RBR5  RBR5  RBR5 RBx5MCtrl-*4&!@e.=! 6  R–5M! 6 R³5M! 6R5M! 6 R5M! 6R6M! 6*4&e.!*4&!EM6!:M(+128)=!!:!5!5:8*:ͣ*ͥEʕ6!}2͛!" Ü6!}2*&6!:!!*!*!ͥ}o*!͸}o}2*&*&e.!*&"E-*!"*!͒E+-!"-!"!}2:!"!"!"!ԟ!)!s#r!ԟ!)!s#r!ԟ!)!s#r*G!!џ!!s!џ!!s!џ!!s&!"k*G!*:&E-!;͓*!ͥE.!u*z*!R"*!ͥE,.!s*z*!R"*!ͥE\.!ڟ!)*z*!R"*!ͥEʌ.!ڟ!)*z*!R"*!ͥEʼ.!ڟ!)*z*!R"**G!*G!*G!*&}2*&"*"*0!͛" !ͩ!D !:*&e.=!*&́! ͑! ͑O!:ͣ!}oͥ6}o}oE6*&́! ͑! ͑OEʨ7!!!!n&+sͥ6E8*:*e.=**&! ͒E7*&͛"! " !ͩ!D V8͛!" !:ͣ!vzG8"͛!"! "!" *+8!ͩ!D i6*&́!$͑!0!9͛O}o}oE6*&! ͒E8͛*&4!ͪ! " *:*&e.=*i6E8! }28!ͩ!D Ä8 !"s#r*2!s}2""*"**0^#V͒E40*2n&Eʉ/**0^#Vo **3!ͺ *2!s**]!RE0*&E/MSeek read error͞!/**]E/MSeek write error͞!**o $0**o **3!; *0*s#r"*"*2n&E|0**0^#Vo **3!ͺ *Ͱ "}2"""**!/!*&R"ߞ*"*3*&**ߞ*!d*ߞ*EL1**0"M*!}2!ͩ!D *&! ]OEP9*&}2Æ9*&́!0!9͛!$͑OEz9͢6}9̈́8͛ *&ã:*m+"m*m!Eʸ9!"m͛!*" !V!!oV!!:!o:}2 * *I}oEM:*U! E!E:͛!<" *ͤ!Ͷ *U!R*͒EJ:.9* .}oEʢ:*U! E!Eʍ:͛!>" .*ͤ! Z:"P!"!:͛!ͪ! " !"m!! !!9!9!N:!!^#V!!/*3**ߞ!**ߞR!d*ߞ!"ߞ0"֞}2؞"ٞ"۞"ݞ*ݞ*ٞ!/!*؞&R*֞!"Ҟ*ݞ"Ԟ*۞*Ԟ3*؞&*Ҟd*Ԟ2!s*Ҟ*֞E/2*ݞ*Ԟ0^#V!!/*۞*Ҟ*Ԟ3!*֞*ҞR!d*Ԟ2!s*Ҟ!"Ҟü1"̞"Ξ"О*О}oE2*Оͩ!̝͎ͫ!̝:ͣ!E2!̝:!! e.!̝:! e.=Ͳ+k!ʝ!ȝ*ȝ!*ʝ*Ξ}oE2!̝:! e.!̝:! e.=Ͳ#!k*̞2@2o#!͒Eh;͛ ͛ͺ9*** WARNING: Unable to sort Terminal names - Press RETURN  ͛ mR"*!!s!ͩ!D *&! ͒Eʶ<*&́! !~͛OE<*&͛" *!*!n&#s**!n&*&sä<*&!*&!}o*:ͣ!}oE~<͛!"! "!" *!*!n&+sä<*&!*&}oEʤ!*n&n&͛"! "!i:!ͪ! " !ͩ!D *&*&! }oEʗ>!*n&n&}2ã>*&}2*&́!!n&͑!!n&͑OEV>*&͛" *&!!n&*s͔=!}2*&}oEG!:͛!ͪ! " *&EeG*+:͛!ͪ! "!i:!ͪ! " !+́@!u;!:M͠}2-!:M͠*&}oEG!}2!:M͠EG!:*+ G!!ȗ]OEʘH!!ȗ]OEH*+}*+!+IBÕH*+}n&!}2!=*&EsH*+}!s!:͛!ͪ! " *+!+@=ÕH*+}!s*+M=ßH!=!!ȗ]OElI!!ȗ]OEH*+~*+&!+IBiI*+~n&!}2!""""!}2X*&EP?*^#V͛!&! "!i:!ͪ! " *X&}oEG@!Zu;*&Er?G@!Z*!Y!X:=*Y&*&}oEʣ?!}2XD@*Y&E?**s#r*^#V**=E?!}2X?***L*Vs"J!*Jfzʲ@"F͛!_" *F#Ô@!*Jfz@"F͛!" *F#ý@"B"D*&EA!*D:ͣ=*&EGI*+~!s!:͛!ͪ! " *+&!+@=iI*+~!s*+&M=sI!=!!ȗ]OEJͨ=*+!+@*+:M͍EJ!=*+M*+M*+J!s*+I!s*+!s*+F!sJͨ=*+!+@ͨ=*+!+@*+=ͨ=*+J!!!H@ͨ=*+I!!!H@*+F=*+Fn&}oEʵJͨ=*+!!!>J*+!s#r=J!=!!ȗ]OEʂKͨ=*+M!+@*+Mfz7A"͛*D*n&4!ͪ! " *#A*D:ͣ!EʮA͛ͺ ( !*D:ͣfzʜA"͛*D*n&!&! " *#kA͛!"ͺ)  ͛! "!i:!ͪ! " !*B́!-͑f6}2!:M͍*&}o}oEB!:*DHB*&!-EHBM*D!?:͛!ͪ """*&EʇB*n&!EʀB!}2ÇB!}2!=*&}oEʶB!*sM*=qD*&EB*n&!EB!}2B!}2!=!}2*&EKC*&:M͠EgK*+S:M͍}2!=*&}oEPKͨ=*+S!+@dK*+SM=K*+SM!=ÉK!=!!ȗ]OEKͨ=*+u!+@*+u:M͠EKͨ=*+o!+@K*+oM=K!=!!ȗ]OE&Lͨ=*+i!+@)L=!!ȗ]OEʔLͨ=*+[!+@*+[:M͠E}Lͨ=*+a!+@ÑL*+aM=ÛL!=! !ȗ]OELͨ=*+|!!!H@ͨ=*+{!!!H@L!=!!ȗ]O**n&!͒}oE#C!}2KC*&}o*n&!}oEKC!}2*&E`C!*shC!*s*n&!EʷC*&EʑCM*!:͛!ͪ! " **@qD*&ECM*!:͛!ͪ! " *&*:M͠}oE+D*:͛!ͪ! "!i:!ͪ! " *+́@!@u;͛ !@:M͠*&}o}oEqD!@:*">*>"<*<:M͍EʪD*<6M÷E*<Fn&ED!e.!8DM000!*<^#Vk!8*<6*<:!8+:M͠}oE6Mͨ=*+K!!'!>9M=!!ȗ]O*+M:M͠}o!!ȗ]O*+u:M͠}o}oEʬMͨ=*+Y!!'!>ÿM*+Y!s#r=!!ȗ]O*+i:M͠}o!!ȗ]O*+[:M͠}o}oE2Nͨ=*+g!!'!>EN*+g!s#r=*-&!!fzqN"'͛ *'#VN!:͛!ͪ ͛ íON"h**h"**EN!"N*!EN*"KN!}2m!}2m*!EʧO͛Y^#Vs#r*—Q*ėi:*—W*ė[:*—]*ėa:*—c*ėg^#Vs#r*&ER! z *l&TURBO.**!"***!E"*! "W!*!02!:͛!ͪ !!2!:͛!ͪ "*W͛ !}2!e.!e.=MCopy=P!!W:! :=!W!_!W:p!_p!͒EXMFile !W:=M not found=͞!!_!:!!R3}oEYMYou cannot install !W:=M !2:͛!ͪ !ͩ!jD *j&́!͑!͑!͑! ͑OEO*j&RfO!͖NçORzO!͖NçOR”O*&}o}2&çO R§O͛ *m&!}2&!*~!""*~!*R!EO*#"!͔=!!!!:ͣ!s!n͔=!n!!!n:ͣ!s! ]!""*"!EgR!"*"+!*#"*"+*#" * +!#"**͒EP** +"* "P*"+"*"*+* R"*+*#"!*+fz[ with this program=͞!!M TINST.MSGo !!͒E|YM Message file M TINST.MSG=M not found=͞!*! "**!"*!E"!_.*&Y͛! "*&!!&!-"*&!!& !}2!!,fz[}2!*&)):!e.͠E[*&#!,fz[}2!*&))!n&!*&))!n&E [!*&))!n&!*&))!n&͒EZ!}2! XWͺY'[ [!*&)):!*&)):͍E [!}2! R"!*+fzIR"*+* ***"**͸E@R͛*#!&ͺ)  **͒**R!ͥ}oEʺQ! * ! ͤ!jͶ !j:!Q**RRQ!:!QRQ!n:!!:͛!ͪ **+E@R͛M!!:ͣR!ͪ *#Q͛ *#P͓N}oEʙP*&&"Ɨ!ȗP!ʗP!!}2l! !:p! !͒ER!  E!}2!}2! ]!}2!"*&ES= SWͺY"[*&#=Z*&#Z,[[[*&}2!}2!*&"͛*&!!&ͺ:  *W͛ͺ  !*&))!n&!E[!:͛!ͪ ͛! " \!!*&)):ͣfz\"͛!*&))*n&4!ͪ! " *#[!=:͛!ͪ !C!́!B͑!Q͑!-͑f6BRc\!}2\QRw\!}2\ARBҍ\0\\ -R\!*&))!e.!:͛!ͪ \!C:M͠E\!*&))!C:*&ͷY}!͔=KN͐N}oE S!}2lsW!}2*&EAS!"!=S͛ ͨ=!!! ]!!>*&E}S!}2lsW*+"*! ]}2*! ]#ESͨ=!!! ]!>*&ES!}2lsW*+"!}2!}2jUS=!}2*&ET!j͸E=6T! * ! ͤ!jͶ !=*&*&}oEiTF}2!}2!=!jrD~T!}2!}2!=!}2*&ENU! !ȗ]O! !ȗ]O}oEGU*Ɨ"͛ ͛ ͨ=͛ ͛ ! !ȗ]OEUͨ=*oE]!}2B^!}2B!"! e.!>!_!>͗WͯW!M1*!"!!,fz]}2A!*A&)):ͣ#}2@**@&!Eʦ]!}2B! X^!_!*A&))͗WͯW*@&M1**@&"*A&#[]!}2@!_!@͗WͯW!M1^^*B&=^!_!8͗WͯW!͆0*#"*8&}29*9&*!*!!"!"!_!͗WͯW!͆0!"*!R"!!,fzS_}2: Select terminal: Wait Sorting Definitions Change to: (Y/N)? y n Text file name: Command: Numeric entry expected Legal range is , please re-enter: Choose one of the following terminals: None of the above ( Max. 20 Characters ) Delete a definition ( Max. 20 Characters ) Which terminal? (Enter no. or ^Q to exit)1 TURBO Pascal installation menu. 2 Choose installation item from the following: 3 4 [S]creen installation | [C]ommand installation | [Q]uit 5 6 Enter S, C, or Q: 10 Duplicate definition. Error occurred between question 11 Commands starting with the same letter must have the same length. Error occurred between question 12 The total maximum length of commands are execeeded 13 -> 14 CURSOR MOVEMENTS: 20 Character left : Delete terminal? (Enter no. or ^Q to exit): Do you want to modify this definition before installation? Terminal type: Send an initialization string to the terminal? Initializaion defined as a command string? (No = a file) Send a reset string to the terminal Reset defined as a command? (No = a file) CURSOR LEAD-IN command: CURSOR POSITIONING COMMAND to send between line and column: CURSOR POSITIONING COMMAND to send after both line and column: Column first OFFSET to add to LINam from DOS 1. Type LISTER and enter a file name to print when prompted. 2. Specify a commandline parameter: A> LISTER filename } Const PageWidth = 80; PrintLength = 55; PathLength = 65; FormFeed = #12; VerticalTabLength = 3; Type WorkString = String[126]; FileName = String[PathLength]; Var CurRow : integer; MainFileName: FileName; MainFile: text; search1, search2, search3, E: OFFSET to add to COLUMN: Binary address Number of ASCII digits (2 or 3): CLEAR SCREEN command: Does CLEAR SCREEN also HOME cursor HOME command: DELETE LINE command: INSERT LINE command: ERASE TO END OF LINE command: START HIGHLIGHTING command: END HIGHLIGHTING command: Number of rows (lines) on your screen: Number of columns on your screen: Delay after CURSOR ADDRESS (0-255 ms): Delay after CLEAR, DELETE and INSERT (0-255 ms): search4: string[5]; Procedure Initialize; begin CurRow := 0; clrscr; search1 := '{$'+'I'; { So LISTER can list itself! } search2 := '{$'+'i'; search3 := '(*$'+'I'; search4 := '(*$'+'i'; end {initialize}; Function Open(var fp:text; name: Filename): boolean; begin Assign(fp,Name); {$I-} reset(fp); {$I+} If IOresult <> 0 then begin Open := False; close(fp); end else Open := True; end { Open }; Delay after ERASE TO END OF LINE and HIGHLIGHT (0-255 ms): Is this definition correct? Hardware dependent information Operating frequency of your microprocessor in MHz (for delays): pendent information Operating frequency of your microprocessor in MHz (for delays):  Procedure OpenMain; begin If ParamCount = 0 then begin Write('Enter filename: '); readln(MainFileName); end else begin MainFileName := ParamStr(1); end; If Not Open(MainFile,MainFileName) Then begin Writeln('ERROR -- File not found: ',MainFileName); Halt; end; end {Open Main}; Procedure VerticalTab; var i: integer; begin for i := 1 to VerticalTabLength do writeln(lst); end {vertical tab}; Proprogram SourceLister; { SOURCE LISTER DEMONSTRATION PROGRAM Version 1.00A This is a simple program to list your TURBO PASCAL source programs. PSEUDO CODE 1. Find Pascal source file to be listed 2. Initialize program variables 3. Open main source file 4. Process the file a. Read a character into line buffer until linebuffer full or eoln; b. Search line buffer for include file. c. If line contains include file command: Tcedure ProcessLine(PrintStr: WorkString); begin CurRow := Succ(CurRow); if length(PrintStr) > PageWidth then CurRow := Succ(CurRow); if CurRow > PrintLength Then begin Write(lst,FormFeed); VerticalTab; CurRow := 1; end; Writeln(lst,PrintStr); end {Process line}; Procedure ProcessFile; var LineBuffer: WorkString; Function IncludeIn(VAR CurStr: WorkString): Boolean; Var ChkChar: char; column: integer; begin hen process include file and extract command from line buffer Else print out the line buffer. d. Repeat step 4.a thru 4.c until eof(main file); INSTRUCTIONS 1. Compile and run the program using the TURBO.COM compiler. 2. Two ways to print a file a. Run from TURBO in memory: 1. Type "R" and enter a file name to print when prompted. 2. Specify a run-time parameter from the compiler options menu. b. Run the progr ChkChar := '-'; column := pos(search1,CurStr); if column <> 0 then chkchar := CurStr[column+3] else begin column := Pos(search3,CurStr); if column <> 0 then chkchar := CurStr[column+4] else begin column := Pos(search2,CurStr); if column <> 0 then chkchar := CurStr[column+3] else begin column := Pos(search4,CurStr); if column <> 0 then chkchar := CurStr[column+4] end; end; end; if ChkChar in ['+','-'] then IncludeIn := False Else IncludeIn := True; end { IncludeIn }; Procedure ProcessIncludeFile(VAR IncStr: WorkString); var NameStart, NameEnd: integer; IncludeFile: text; IncludeFileName: Filename; Function Parse(IncStr: WorkString): WorkString; begin NameStart := pos('$I',IncStr)+2; program CommandLine; { COMMANDLINE PARAMETERS DEMONSTRATION PROGRAM Version 1.00A This program gets parameters from the command line: INSTRUCTIONS 1. Load the TURBO compiler and compile to a .COM file 2. Quit the TURBO compiler and execute the program with parameters. Try: cmdlin abc def cmdlin Greetings from Frank Borland! cmdlin NOTE: For information about these functions, please refer to your TURBO 3 while IncStr[NameStart] = ' ' do NameStart := Succ(NameStart); NameEnd := NameStart; while (not (IncStr[NameEnd] in [' ','}','*'])) AND ((NameEnd - NameStart) <= PathLength) do NameEnd := Succ(NameEnd); NameEnd := Pred(NameEnd); Parse := copy(IncStr,NameStart,(NameEnd-NameStart+1)); end {Parse}; begin {Process include file} IncludeFileName := Parse(IncStr); If not Open(IncludeFile,IncludeFi.0 Reference Manual. } var i : integer; begin for i := 1 to ParamCount do writeln(ParamSTR(i)); end. 0 Reference Manual. } var i : integer; begin for i := 1 to ParamCount do writeln(ParamSTR(i)); end. leName) then begin LineBuffer := 'ERROR -- Include file not found: ' + IncludeFileName; ProcessLine(LineBuffer); end Else begin while not eof(IncludeFile) do begin Readln(IncludeFile,LineBuffer); ProcessLine(LineBuffer); end; close(IncludeFile); end; end {Process include file}; begin {Process File} VerticalTab; Writeln('Printing . . . '); while not eof(mainfprogram MicroCalc; { MICROCALC DEMONSTRATION PROGRAM Version 1.00A This program is Copyrighted by Borland International, Inc. 1983, 1984, 1985 and is hereby donated to the public domain for non-commercial use only. Dot commands are for the program lister: LISTT.PAS (available with our TURBO TUTOR): .PA, .CP20, etc... INSTRUCTIONS 1. Compile this program using the TURBO.COM compiler. a. Use the O command from the main menu to select Options. b.ile) do begin Readln(MainFile,LineBuffer); if IncludeIn(LineBuffer) then ProcessIncludeFile(LineBuffer) else ProcessLine(LineBuffer); end; close(MainFile); write(lst,FormFeed); end {Process File}; BEGIN Initialize; OpenMain; ProcessFile; END. e}; BEGIN Initialize; OpenMain; ProcessFile; END.  Select the C option to generate a .COM file. c. Select the Q option to Quit the Options menu. d. Select the M option to specify the Main file e. Type "MC" and hit f. Type C to compile the program to disk g. Type R to run the program 2. Exit the program by typing: /Q } {$R-,U-,V-,X-,A+,C-} const FXMax: Char = 'G'; { Maximum number of columns } FYMax = 21; { Maximum number of lines nd} {.PA} {*********************************************************************} {* START OF MAIN PROGRAM PROCEDURES *} {*********************************************************************} { Procedure Commands is activated from the main loop in this program } { when the user type a semicolon. Commands then activates a procedure} { which will execute the command. These procedures are located in the} { above modules. } type Anystring = string[255]; ScreenIndex = 'A'..'G'; Attributes = (Constant,Formula,Txt,OverWritten,Locked,Calculated); { The spreadsheet is made out of Cells every Cell is defined as } { the following record: } CellRec = record CellStatus: set of Attributes; { Status of cell (see type def.) } Contents: String[70]; { Contains a formula or some text } Value: Real; { Last calculated c } { For easy reference the source code module number is shown in a } { comment on the right following the procedure call. } procedure Commands; begin GotoXY(1,24); HighVideo; Write('/ restore, Quit, Load, Save, Recalculate, Print, Format, AutoCalc, Help '); Read(Kbd,Ch); Ch:=UpCase(Ch); case Ch of { In module } 'Q': Halt; 'F': Format; { 04 } 'S': ell value } DEC,FW: 0..20; { Decimals and Cell Whith } end; Cells = array[ScreenIndex,1..FYMax] of CellRec; const XPOS: array[ScreenIndex] of integer = (3,14,25,36,47,58,68); var Screen: Cells; { Definition of the spread sheet } FX: ScreenIndex; { Culumn of current cell } FY: Integer; { Line of current cell } Ch: Char; { Last read character Save; { 03 } 'L': Load; { 03 } 'H': Help; { 03 } 'R': Recalculate; { 05 } 'A': Auto; { 00 } '/': Update; { 01 } 'C': Clear; { 01 } 'P': Print; } MCFile: file of CellRec; { File to store sheets in } AutoCalc: boolean; { Recalculate after each entry? } { The following include files contain procedures used in MicroCalc. } { In the following source code there is a reference after each } { procedure call indicating in which module the procedure is located.} { If you want a printer listing of the following modules then you } { must let the include directives start in column one and the { 03 } end; Grid; { 01 } GotoCell(FX,FY); { 02 } end; { Procedure Hello says hello and activates the help procedure if the } { user presses anything but Return } procedure Wellcome; procedure Center(S: AnyString); var I: integer; begin for I:=1 to (80-Length(S)) div 2 do Write(' '); writeln(n use } { the TLIST program to generate a listing. } {$I MC-MOD00.INC Miscelaneous procedures } {$I MC-MOD01.INC Initialization procedures } {$I MC-MOD02.INC Commands to move between fields } {$I MC-MOD03.INC Commands to Load,Save,Print } {$I MC-MOD04.INC Evaluating an expression in a cell } {$I MC-MOD05.INC Reading a cell definition and Format commaS); end; begin { procedure Wellcome } ClrScr; GotoXY(1,9); Center('Welcome to MicroCalc. A Turbo demonstation program'); Center('Copyright 1983 by Borland International Inc. '); Center('Press any key for help or to start'); GotoXY(40,12); Read(Kbd,Ch); if Ch<>^M then Help; end; {.PA} {*********************************************************************} {* THIS IS WHERE THE PROGRAM STARTS EXECUTING *} {**************************************begin repeat GotoXY(X,23); Blink:=not Blink; if Blink then HighVideo else LowVideo; Write(S); Delay(175); until KeyPressed; end; LowVideo; end; procedure Auto; begin AutoCalc:=not AutoCalc; if AutoCalc then Flash(65,'AutoCalc: ON ',false) else Flash(65,'AutoCalc: OFF',false); end; then Flash(65,'AutoCalc: ON ',false) else Flash(65,'AutoCalc: OFF',false); end; *******************************} begin Init; { 01 } Wellcome; ClrScr; Grid; { 01 } GotoCell(FX,FY); repeat Read(Kbd,Ch); case Ch of ^E: MoveUp; { 02 } ^X,^J: MoveDown; { 02 } ^D,^M,^F: MoveRight; { 02 } ^S,^A: MoveLeft; {.PA} {*******************************************************************} {* SOURCE CODE MODULE: MC-MOD01 *} {* PURPOSE: Display grid and initialize all cells *} {* in the spread sheet. *} {*******************************************************************} procedure Grid; var I: integer; Count: Char; begin HighVideo; For Count:='A' to FXMax do begin GotoXY(XPos[Count],1); { 02 } '/': Commands; ^[: GetCell(FX,FY); { 04 } else if Ch in [' '..'~'] then GetCell(FX,FY); { 04 } end; until true=false; { (program stops in procedure Commands) } end.  { 02 } ^D,^M,^F: MoveRight; { 02 } ^S,^A: MoveLeft; Write(Count); end; GotoXY(1,2); for I:=1 to FYMax do writeln(I:2); LowVideo; if AutoCalc then Flash(65,'AutoCalc: ON' ,false) else Flash(65,'AutoCalc: OFF',false); Flash(33,' Type / for Commands',false); end; procedure Init; var I: ScreenIndex; J: Integer; LastName: string[2]; begin for I:='A' to FXMAX do begin for J:=1 to FYMAX do begin with Screen[I,J] do begin CellStatus:=[Txt]; Contents:=''; Value:=0; DEC:=2; { Default number of decimals } FW:=10; { Default field whith } end; end; end; AutoCalc:=True; FX:='A'; FY:=1; { First field in upper left corner } end; procedure Clear; begin HighVideo; GotoXY(1,24); ClrEol; Write('Clear this worksheet? (Y/N) '); repeat Read(Kbd,Ch) until Upcase(Ch) in ['Y','N']; Write(Upcase(Ch)); if UpCase(Ch)='Y' then begin ClrScr; Init; Grid; {.PA} {*******************************************************************} {* SOURCE CODE MODULE: MC-MOD00 *} {* PURPOSE: Micellaneous utilities an commands. *} {*******************************************************************} procedure Msg(S: AnyString); begin GotoXY(1,24); ClrEol; Write(S); end; procedure Flash(X: integer; S: AnyString; Blink: boolean); begin HighVideo; GotoXY(X,23); Write(S); if Blink then end; end; nd; end; FYMax then FY:=1; until (Screen[FX,FY].CellStatus*[OverWritten,Locked]=[]) or (FY=Start); if FY<>Start then GotoCell(FX,FY); end; {.CP20} procedure MoveUp; var Start: integer; begin LeaveCell(FX,FY); Start:=FY; repeat FY:=FY-1; if FY<1 then FY:=FYMax; until (Screen[FX,FY].CellStatus*[OverWritten,Locked]=[]) or (FY=Start); if FY<>Start then GotoCell(FX,FY); end; {.CP20} procedure MoveRight; var Start: ScreenIndex; begin LeaveCell(FX,FY); Start:=FX; r{.PA} {*******************************************************************} {* SOURCE CODE MODULE: MC-MOD02 *} {* PURPOSE: Display values in cells and move between *} {* cells in the spread sheet. *} {*******************************************************************} procedure FlashType; begin with Screen[FX,FY] do begin GotoXY(1,23); Write(FX,FY:2,' '); if Formula in CellStatus then writepeat FX:=Succ(FX); if FX>FXMax then begin FX:='A'; FY:=FY+1; if FY>FYMax then FY:=1; end; until (Screen[FX,FY].CellStatus*[OverWritten,Locked]=[]) or (FX=Start); if FX<>Start then GotoCell(FX,FY); end; {.CP20} procedure MoveLeft; var Start: ScreenIndex; begin LeaveCell(FX,FY); Start:=FX; repeat FX:=Pred(FX); if FX<'A' then begin FX:=FXMax; FY:=FY-1; if FY<1 then FY:=FYMax; end; until (Screen[FX,FY].e('Formula:') else if Constant in CellStatus then Write('Numeric ') else if Txt in CellStatus then Write('Text '); GotoXY(1,24); ClrEol; if Formula in CellStatus then Write(Contents); end; end; { The following procedures move between the Cells on the calc sheet.} { Each Cell has an associated record containing its X,Y coordinates } { and data. See the type definition for "Cell". } procedure GotoCell(GX: ScreenIndex; GY: integer); begin with ScreeCellStatus*[OverWritten,Locked]=[]) or (FX=Start); if FX<>Start then GotoCell(FX,FY); end; ellStatus*[OverWritten,Locked]=[]) or (FX=Start); if FX<>Start then GotoCell(FX,FY); end; CP20} procedure MoveLeft; var Start: ScreenIndex; begin LeaveCell(FX,FY); Start:=FX; repeat FX:=Pred(FX); if FX<'A' then begin FX:=FXMax; FY:=FY-1; if FY<1 then FY:=FYMax; end; until (Screen[FX,FY].n[GX,GY] do begin HighVideo; GotoXY(XPos[GX],GY+1); Write(' '); GotoXY(XPos[GX],GY+1); if Txt in CellStatus then Write(Contents) else begin if DEC>=0 then Write(Value:FW:DEC) else Write(Value:FW); end; FlashType; GotoXY(XPos[GX],GY+1); end; LowVideo; end; {.CP20} procedure LeaveCell(FX:ScreenIndex;FY: integer); begin with Screen[FX,FY] do begin GotoXY(XPos[FX],FY+1); LowVideo; if Txt in CellStatus then Write(Contents) else begin if DEC>=0 then Write(Value:FW:DEC) else Write(Value:FW); end; end; end; {.CP20} procedure Update; var UFX: ScreenIndex; UFY: integer; begin ClrScr; Grid; for UFX:='A' to FXMax do for UFY:=1 to FYMax do if Screen[UFX,UFY].Contents<>'' then LeaveCell(UFX,UFY); GotoCell(FX,FY); end; {.CP20} procedure MoveDown; var Start: integer; begin LeaveCell(FX,FY); Start:=FY; repeat FY:=FY+1; if FY>{.PA} {*******************************************************************} {* SOURCE CODE MODULE: MC-MOD03 *} {* PURPOSE: Read, Save and Print a spread sheet. *} {* Display on-line manual. *} {*******************************************************************} type String3 = string[3]; var FileName: string[14]; Line: string[100]; function Exist(FileN: AnyString): boolean; var F: file; begi Line:=''; for I:='A' to FXmax do begin with Screen[I,J] do begin while (Length(Line)0 then Str(Value:FW:DEC,P) else Str(Value:FW,P); Line:=Line+P; end; end else Line:=Line+Contents; end; { With } end; { One line } For Count:=1 n {$I-} assign(F,FileN); reset(F); {$I+} if IOResult<>0 then Exist:=false else Exist:=true; end; procedure GetFileName(var Line: AnyString; FileType:String3); begin Line:=''; repeat Read(Kbd,Ch); if Upcase(Ch) in ['A'..'Z',^M] then begin write(Upcase(Ch)); Line:=Line+Ch; end; until (Ch=^M) or (length(Line)=8); if Ch=^M then Delete(Line,Length(Line),1); if Line<>'' then Line:=Line+'.'+FileType; end; {.CP20} procedure Save;to LeftMargin do Write(MCFile,' '); writeln(MCFile,Line); end; { End Column } Grid; Close(MCFile); LowVideo; GotoCell(FX,FY); end; {.PA} procedure Help; var H: text; HelpFileName: string[14]; Line: string[80]; I,J: integer; Bold: boolean; begin if Exist('MC.HLP') then begin Assign(H,'MC.HLP'); Reset(H); while not Eof(H) do begin Readln(H,Line); ClrScr; I:=1; Bold:=false; LowVideo; repeat For J:=1 to Length( var I: screenIndex; J: integer; begin HighVideo; Msg('Save: Enter filename '); GetFileName(Filename,'MCS'); if FileName<>'' then begin Assign(MCFile,FileName); Rewrite(MCFile); for I:='A' to FXmax do begin for J:=1 to FYmax do write(MCfile,Screen[I,J]); end; Grid; Close(MCFile); LowVideo; GotoCell(FX,FY); end; end; {.CP30} procedure Load; begin HighVideo; Msg('Load: Enter filename '); GetFileName(Filename,'MCLine) do begin if Line[J]=^B then begin Bold:=not Bold; if Bold then HighVideo else LowVideo; end else write(Line[J]); end; Writeln; I:=I+1; Readln(H,Line); until Eof(H) or (I>23) or (Copy(Line,1,3)='.PA'); GotoXY(26,24); HighVideo; write('<<< Please press any key to continue >>>'); LowVideo; read(Kbd,Ch); end; GotoXY(20,24); HighVideo; write('<<< Please pS'); if (Filename<>'') then if (not exist(FileName)) then repeat Msg('File not Found: Enter another filename '); GetFileName(Filename,'MCS'); until exist(FileName) or (FileName=''); if FileName<>'' then begin ClrScr; Msg('Please Wait. Loading definition...'); Assign(MCFile,FileName); Reset(MCFile); for FX:='A' to FXmax do for FY:=1 to FYmax do read(MCFile,Screen[FX,FY]); FX:='A'; FY:=1; LowVideo; UpDate; end; GotoCell(FX,FY); endress to start MicroCalc >>>'); LowVideo; Readln(Ch); UpDate; end else { Help file did not exist } begin Msg('To get help the file MC.HLP must be on your disk. Press '); repeat Read(kbd,Ch) until Ch=^M; GotoCell(FX,FY); end; end; toCell(FX,FY); end; end; ; {.PA} procedure Print; var I: screenIndex; J,Count, LeftMargin: Integer; P: string[20]; MCFile: Text; begin HighVideo; Msg('Print: Enter filename "P" for Printer> '); GetFileName(Filename,'LST'); Msg('Left margin > '); Read(LeftMargin); if FileName='P.LST' then FileName:='Printer'; Msg('Printing to: ' + FileName + '....'); Assign(MCFile,FileName); Rewrite(MCFile); For Count:=1 to 5 do Writeln(MCFile); for J:=1 to FYmax do begin QR','SIN','COS', 'ARCTAN','LN','LOG','EXP','FACT'); var E,EE,L: Integer; { intermidiate variables } Found:Boolean; F: Real; Sf:StandardFunction; OldEFY, { Current cell } EFY, SumFY, Start:Integer; OldEFX, EFX, SumFX:ScreenIndex; CellSum: Real; f{.PA} {*******************************************************************} {* SOURCE CODE MODULE: MC-MOD04 *} {* PURPOSE: Evaluate formulas. *} {* Recalculate spread sheet. *} {* *} {* NOTE: This module contains recursive procedures *} {* and is for computer scientists only. *} {*******unction Fact(I: Integer): Real; begin if I > 0 then begin Fact:=I*Fact(I-1); end else Fact:=1; end { Fact }; {.PA} begin { Function Factor } if Ch in Numbers then begin Start:=Pos; repeat NextCh until not (Ch in Numbers); if Ch='.' then repeat NextCh until not (Ch in Numbers); if Ch='E' then begin NextCh; ************************************************************} var Form: Boolean; {$A-} procedure Evaluate(var IsFormula: Boolean; { True if formula} var Formula: AnyString; { Fomula to evaluate} var Value: Real; { Result of formula } var ErrPos: Integer);{ Position of error } const Numbers: set of Char = ['0'..'9']; EofLine = ^M; var Pos: Integer; { Current position in formula } Ch: Char; { repeat NextCh until not (Ch in Numbers); end; Val(Copy(Formula,Start,Pos-Start),F,ErrPos); end else if Ch='(' then begin NextCh; F:=Expression; if Ch=')' then NextCh else ErrPos:=Pos; end else if Ch in ['A'..'G'] then { Maybe a cell reference } begin EFX:=Ch; NextCh; if Ch in Numbers then Current character being scanned } EXY: string[3]; { Intermidiate string for conversion } { Procedure NextCh returns the next character in the formula } { The variable Pos contains the position ann Ch the character } procedure NextCh; begin repeat Pos:=Pos+1; if Pos<=Length(Formula) then Ch:=Formula[Pos] else Ch:=eofline; until Ch<>' '; end { NextCh }; function Expression: Real; var E: Real; Oprbegin F:=0; EXY:=Ch; NextCh; if Ch in Numbers then begin EXY:=EXY+Ch; NextCh; end; Val(EXY,EFY,ErrPos); IsFormula:=true; if (Constant in Screen[EFX,EFY].CellStatus) and not (Calculated in Screen[EFX,EFY].CellStatus) then begin Evaluate(Form,screen[EFX,EFY].contents,f,ErrPos); : Char; function SimpleExpression: Real; var S: Real; Opr: Char; function Term: Real; var T: Real; function SignedFactor: Real; function Factor: Real; type StandardFunction = (fabs,fsqrt,fsqr,fsin,fcos, farctan,fln,flog,fexp,ffact); StandardFunctionList = array[StandardFunction] of string[6]; const StandardFunctionNames: StandardFunctionList =('ABS','SQRT','S Screen[EFX,EFY].CellStatus:=Screen[EFX,EFY].CellStatus+[Calculated] end else if not (Txt in Screen[EFX,EFY].CellStatus) then F:=Screen[EFX,EFY].Value; if Ch='>' then begin OldEFX:=EFX; OldEFY:=EFY; NextCh; EFX:=Ch; NextCh; if Ch in Numbers then begin EXY:=Ch; NextCh; Found:=true; end; end; if not Found then ErrPos:=Pos; end; Factor:=F; end { function Factor}; {.PA} begin { SignedFactor } if Ch='-' then begin NextCh; SignedFactor:=-Factor; end else SignedFactor:=Factor; end { SignedFactor }; begin { Term } T:=SignedFactor; while Ch='^' do begin NextCh; t:=exp(ln(t)*Sign if Ch in Numbers then begin EXY:=EXY+Ch; NextCh; end; val(EXY,EFY,ErrPos); Cellsum:=0; for SumFY:=OldEFY to EFY do begin for SumFX:=OldEFX to EFX do begin F:=0; if (Constant in Screen[SumFX,SumFY].CellStatus) and edFactor); end; Term:=t; end { Term }; begin { SimpleExpression } s:=term; while Ch in ['*','/'] do begin Opr:=Ch; NextCh; case Opr of '*': s:=s*term; '/': s:=s/term; end; end; SimpleExpression:=s; end { SimpleExpression }; begin { Expression } E:=SimpleExpression; while Ch in ['+','-'] do begin Opr:=Ch; NextCh; case Opr of '+': e:=e+SimpleExpr not (Calculated in Screen[SumFX,SumFY].CellStatus) then begin Evaluate(Form,Screen[SumFX,SumFY].contents,f,errPos); Screen[SumFX,SumFY].CellStatus:= Screen[SumFX,SumFY].CellStatus+[Calculated]; end else if not (Txt in Screen[SumFX,SumFY].CellStatus) then F:=ScrEEn[SumFX,SumFY].Value; Cellsum:=Cellsum+f; ession; '-': e:=e-SimpleExpression; end; end; Expression:=E; end { Expression }; begin { procedure Evaluate } if Formula[1]='.' then Formula:='0'+Formula; if Formula[1]='+' then delete(Formula,1,1); IsFormula:=false; Pos:=0; NextCh; Value:=Expression; if Ch=EofLine then ErrPos:=0 else ErrPos:=Pos; end { Evaluate }; {.PA} procedure Recalculate; var RFX: ScreenIndex; RFY:integer; OldValue: real; Err: integer; begin LowVideo; Goto f:=Cellsum; end; end; end; end; end; end else begin found:=false; for sf:=fabs to ffact do if not found then begin l:=Length(StandardFunctionNames[sf]); if copy(Formula,Pos,l)=StandardFunctionNames[sf] then begin Pos:=Pos+l-1; NextCh; F:XY(1,24); ClrEol; Write('Calculating..'); for RFY:=1 to FYMax do begin for RFX:='A' to FXMax do begin with Screen[RFX,RFY] do begin if (Formula in CellStatus) then begin CellStatus:=CellStatus+[Calculated]; OldValue:=Value; Evaluate(Form,Contents,Value,Err); if OldValue<>Value then begin GotoXY(XPos[RFX],RFY+1); if (DEC>=0) then Write(Value:FW:DEC) else Write(Value=Factor; case sf of fabs: f:=abs(f); fsqrt: f:=sqrt(f); fsqr: f:=sqr(f); fsin: f:=sin(f); fcos: f:=cos(f); farctan: f:=arctan(f); fln : f:=ln(f); flog: f:=ln(f)/ln(10); fexp: f:=exp(f); ffact: f:=fact(trunc(f)); end; :FW); end; end; end; end; end; GotoCell(FX,FY); end; FW); end; end; end; end; end; GotoCell(FX,FY); end;  GotoX; end; end; ^S,^H: begin { Move cursor left } X:=X-1; if X<1 then X:=1; GotoX; end; ^F: begin { Move cursor to end of line } X:=Length(S)+1; GotoX; end; ^A: begin { Move cursor to beginning of line } X:=1; GotoX; end; #127: begin { Delete left char } X:=X-1; if (Length(S)>0) a{.PA} {*******************************************************************} {* SOURCE CODE MODULE: MC-MOD05 *} {* PURPOSE: Read the contents of a cell and update *} {* associated cells. *} {*******************************************************************} { Procedure GetLine will let the user type and/or edit a string of } { maximum length "MAX". The string will start at cursor position: } { nd (X>0) then begin Delete(S,X,1); Write(copy(S,X,Length(S)-X+1),' '); GotoX; if X<1 then X:=1; end else X:=1; end; ^V: InsertOn:= not InsertOn; {.PA} else begin if Ch in OkChars then begin if InsertOn then begin insert(Ch,S,X); Write(copy(S,X,Length(S)-X+1),' '); end else begin ColNO,LineNO. If ErrPos <> 0 then the cursor will jump to position } { ErrPos in the string. If the last parameter is "True" then all } { characters entered will be translated to upper case. } { If the user at anytimes types then the string returned } { contain $FF to indicate that editing was aborted. } procedure GetLine(var S: AnyString; { String to edit } ColNO,LineNO, { Where start line } write(Ch); if X=length(S) then S:=S+Ch else S[X]:=Ch; end; if Length(S)+1<=MAX then X:=X+1 else OkChars:=[]; { Line too Long } GotoX; end else if Length(S)+1<=Max then OkChars:= [' '..'}']; { Line ok again } end; end; until CH=^M; end; {.PA} procedure GetCell(FX: ScreenIndex;FY: Integer); var S: AnyString; NewStat: Set of Attributes; ErrorPosition: Integ MAX, { Max length } ErrPos: integer; { Where to begin } UpperCase:Boolean); { True if auto Upcase } var X: integer; InsertOn: boolean; OkChars: set of Char; procedure GotoX; begin GotoXY(X+ColNo-1,LineNo); end; begin OkChars:=[' '..'}']; InsertOn:=true; X:=1; GotoX; Write(S); if Length(S)=1 then X:=2; if ErrPos<>0 then X:=ErrPos; GotoX; repeat er; I: ScreenIndex; Result: Real; Abort: Boolean; IsForm: Boolean; { Procedure ClearCells clears the current cell and its associated } { cells. An associated cell is a cell overwritten by data from the } { current cell. The data can be text in which case the cell has the } { attribute "OverWritten". If the data is a result from an expression} { and the field with is larger tahn 11 then the cell is "Locked" } procedure ClearCells; begin Read(Kbd,Ch); if UpperCase then Ch:=UpCase(Ch); case Ch of ^[: begin S:=chr($FF); { abort editing } Ch:=^M; end; ^D: begin { Move cursor right } X:=X+1; if (X>length(S)+1) or (X>MAX) then X:=X-1; GotoX; end; ^G: begin { Delete right char } if X<=Length(S) then begin Delete(S,X,1); Write(copy(S,X,Length(S)-X+1),' '); I:=FX; repeat with Screen[I,FY] do begin GotoXY(XPos[I],FY+1); write(' '); I:=Succ(I); end; until ([OverWritten,Locked]*Screen[I,FY].CellStatus=[]); { Cell is not OVerWritten not Locked } end; {.CP20} { The new type of the cell is flashed at the bottom of the screen } { Notice that a constant of type array is used to indicate the type } procedure FlashType; begin HighVideo; GotoXY(5,23); LowVideo; end; } procedure UpdateCells; var Flength: Integer; begin Screen[FX,FY].Contents:=S; if Txt in NewStat {Screen[FX,FY].CellStatus} then begin I:=FX; FLength:=Length(S); repeat I:=Succ(I); with Screen[I,FY] do begin FLength:=Flength-11; if (Flength>0) then begin CellStatus:=[Overwritten,Txt]; Contents:=''; end else begin {.CP20} { Procedure GetFormula repeats calling the procedure GetLine and } { Evaluate until the line read by GetLine contains a valid formula. } { Evaluate returns an error position in the string evaluated. If } { this position is non zero GetLine is called. If the user types } { ESC in GetLine to abort the editing then the string returned from } { Getline will contain $FF and te original value of the cell will } { be restored later. if OverWritten in CellStatus then begin CellStatus:=[Txt]; GotoCell(I,FY);LeaveCell(I,FY); end; end; end; until (I=FXMax) or (Screen[I,FY].Contents<>''); Screen[FX,FY].CellStatus:=[Txt]; end else { string changed to formula or constant } begin { Event number two } I:=FX; repeat with Screen[I,FY] do begin if OverWritten in CellStatus then begin } procedure GetFormula; begin FlashType; repeat GetLine(S,1,24,70,ErrorPosition,True); if S<>Chr($FF) then begin Evaluate(IsForm,S,Result,ErrorPosition); if ErrorPosition<>0 then Flash(15,'Error at cursor'+^G,false) else Flash(15,' ',false); end; until (ErrorPosition=0) or (S=Chr($FF)); if IsForm then NewStat:=NewStat+[Formula]; end; {.CP20} { Procedure GetText calls the procedure GetLine with CellStatus:=[Txt]; Contents:=''; end; I:=Succ(I); end; until not (OverWritten in Screen[I,FY].CellStatus); with Screen[FX,FY] do begin CellStatus:=[Constant]; if IsForm then CellStatus:=CellStatus+[Formula]; Value:=Result; end; end; end; {.PA} { Procedure GetCell finnaly starts here. This procedure uses all } { all the above local procedures. First it initializes the temporaly } { v the current } { cells X,Y position as parameters. This means that text entering } { takes place direcly at the cells posion on the screen. } procedure GetText; begin FlashType; with Screen[FX,FY] do GetLine(S,XPos[FX],FY+1,70,ErrorPosition,False); end; {.CP20} { Procedure EditCell loads a copy of the current cells contents in } { in the variable S before calling either GetText or GetFormula. In } { this way no changes are made to the current cell. ariable "S" with the last read character. It then depending on } { this character calls GetFormula, GetText, or EditCell. } begin { procedure GetCell } S:=Ch; ErrorPosition:=0; Abort:=false; NewStat:=[]; if Ch in ['0'..'9','+','-','.','(',')'] then begin NewStat:=[Constant]; if not (Formula in Screen[FX,FY].CellStatus) then begin GotoXY(11,24); ClrEol; ClearCells; GetFormula; end else begin Flash(15,'Edit formula Y/N?',true) } procedure EditCell; begin with Screen[FX,FY] do begin S:=Contents; if Txt in CellStatus then GetText else GetFormula; end; end; {.PA} { Procedure UpdateCells is a little more complicated. Basically it } { makes sure to tag and untag cells which has been overwritten or } { cleared from data from another cell. It also updates the current } { with the new type and the contents which still is in the temporaly } { variable "S". ; repeat read(Kbd,Ch) until UpCase(CH) in ['Y','N']; Flash(15,' ',false); if UpCase(Ch)='Y' then EditCell Else Abort:=true; end; end else begin if Ch=^[ then begin NewStat:=(Screen[FX,FY].CellStatus)*[Txt,Constant]; EditCell; end else begin if formula in Screen[FX,FY].CellStatus then begin Flash(15,'Edit formula Y/N?',true); repeat read(Kbd,Ch) until UpCase(CH) in ['Y','N']; Flash(15,' INTRODUCTION MicroCalc is a tiny spread sheet program a la VisiCalc. It is provided with the TURBO-Pascal system as an example program. Since MicroCalc is only a demonstation program it has its limita- tions (which you may have fun eliminating): * You cannot copy formulas from one cell to others. * You cannot insert and delete lines or columns. In spite of its limitations MicroCalc does provide some interest- ing features among which are: * 11 digits float ',false); if UpCase(Ch)='Y' then EditCell Else Abort:=true; end else begin NewStat:=[Txt]; ClearCells; GetText; end; end; end; if not Abort then begin if S<>Chr($FF) then UpDateCells; GotoCell(FX,FY); if AutoCalc and (Constant in Screen[FX,FY].CellStatus) then Recalculate; if Txt in NewStat then begin GotoXY(3,FY+1); Clreol; For I:='A' to FXMax do LeaveCell(I,FY); end; ing point reals (Thanks to TURBO Pascal!) * Full set of mathematical functions (SIN,COS,LN,EXP etc.) * Built in line editor for text and formula editing. * Text can be entered across cells. * Once entered a formula is protected from accidental erasure. .PA In addition to this MicroCalc offers all the usual features of a spread sheet program: * Load a spread sheet from the disk. * Save a spread sheet on the disk. * Automatic recalculation after each entry. (May be d end; Flash(15,' ',False); GotoCell(FX,FY); end; {.PA} { Procedure Format is used to } procedure Format; var J,FW,DEC, FromLine,ToLine: integer; Lock: Boolean; procedure GetInt(var I: integer; Max: Integer); var S: string[8]; Err: Integer; Ch: Char; begin S:=''; repeat repeat Read(Kbd,Ch) until Ch in ['0'..'9','-',^M]; if Ch<>^M then begin Write(Ch); S:=S+Ch; Val(S,I,Err); isabled). * Print the spread sheet on the printer. * Clear the current spread sheet. The spread sheet is an electronic piece of paper on which you can enter text, numbers and formulas and have MicroCalc do calcula- tions automatically. The next page shows the electronic spread sheet. .PA ---------------------------------------------------------------- A B C D .... 1 22.00 2 1.00 3 2.00 4 3.00 5 28.00 . . A 5 Formula: (A1+A2+end; until (I>=Max) or (Ch=^M); if I>Max then I:=Max; end; begin HighVideo; Msg('Format: Enter number of decimals (Max 11): '); GetInt(DEC,11); Msg('Enter Cell whith remember if larger than 10 next column will lock: '); GetInt(FW,20); Msg('From which line in column '+FX+': '); GetInt(FromLine,FYMax); Msg('To which line in column '+FX+': '); GetInt(ToLine,FYMax); if FW>10 then Lock:=true else Lock:=False; for J:=FromLine to ToLine do begin Screen[FX,JA3+A4+A5) ----------------------------------------------------------------- In the example the next last line shows that the active cell is cell A5 and that A5 contains a formula: (A1+A2+A3+A4) which means that the numbers in A1,A2,A3 and A4 should be added and placed in A5. The formula can be abbreviated to: (A1>A4) meaning: add all cells from A1 to A4. .PA You move the cursor around just like you do in the TURBO editor: (Up) ].DEC:=DEC; Screen[FX,J].FW:=FW; with Screen[Succ(FX),J] do begin if Lock then begin CellStatus:=CellStatus+[Locked,Txt]; Contents:=''; end else CellStatus:=CellStatus-[Locked]; end; end; NormVideo; UpDate; GotoCell(FX,FY); end; Video; UpDate; GotoCell(FX,FY); end;  Ctrl-E (Left) Ctrl-S Ctrl-G (Right) Ctrl-X (Down) A cell may contain a number, a formula or some text. The type of of the cell and its coordinates are shown in the bottom left corner of the screen: A 5 Formula: (Means that the current cell is A5 and that it contains a formula) A 1 Text (Cell A1 contains text) A 2 Numeric (Cell A2 contains a numbe try MicroCalc now you may use the /L command and load the file: CALCDEMO. r and no cell references) .PA Summary of MicroCalc Cells are denoted A1 through G21 giving a total of 147 cells. Summary of standard functions and operators: SIN, COS, ARCT, ABS, FACT, EXP, LN, +,-,/,* Futhermore the operator '>' can be used to denote a range of cells to add. Entering data To enter data in any field move the cursor to the cell and enter the data. MicroCalc automatically determines if the field is numeric or a a text field. When moving beP To: B. Osss S: string[8]; Err: Integer; Ch: Char; b  From: O. P. Timistt (B3) kjhlkjfdsahfsdalkjhfksjhdafkjldshfalkjdsaf skajfs 034909 D As you requested I have compiled a sales budget for our three major E products covering next yetween fields: ^S,^D,^E,^X move left right up and down. When editing a field ^S,^D moves left and right. ^A,^F moves to beginning/end of line. DEL,^G deletes left or right character. ESC makes it possible to regret changes and to edit an existing cell. .PA Summary of commands / will restore the screen Q will Quit MicroCalc L will Load a spread sheet from the disk. S will Save a spread sheet on the disk. R war by quaters. I have assumed an increase d > of 20% every quater for Super A and 10 pct for Super B and C. 1;r;r;r;r;r;r; A Product 1. Quater 2. Quater 3. Quater 4. Quater Year Totalal C -------------------------------------------------------  Super Adfskjdfskjlkjljlsafjfshdkljhfdsjfhkjfdkljfakljakjhkjlhfds  Super Bl{kjdl{kds{lkdjs{lksdjf{ldksfaj{lkdjsfl{kdjf{lkdjfill Recalculate P will Print the spread sheet. F makes it possible to change the output format for numbers. A switches Autocalc ON and OFF Note: to use scientific notation use the the F command and enter minus one -1 for the number of decimals. .PA EXAMPLES The following are examples of valid cell formulas: A1+(B2-C7) subtract cell C7 from B2 and add the result to cell A1 (A1>A23) the sum of cells: A1,A2,A3..A23 l{kdjf{lkjfd  Super C A -------------------------------------------------------  Year total B =====================================================  22 B To simulate sales just change the numbers for the first quater.  (A1>A19)(A1>B5) the sum of cells: A1..A5 and B1..B5 The formulas may be as complicated as you want:  SIN(A1)*COS(A2)/((1.2*A8)+LN(FACT(A8)+8.9E-3))+(C1>C5) To edit an existing formula or text simply move to the cell and press ESC, make your changes and press . If you make a mistake you may press ESC again, the old value of the cell will then be restored. To try MicroCalc now you may use the /L command and load the file: CALCDEMO.  kjdsflkdjsalkdjfsklj{fdlkjfsdflk{dfl{kjdfkljsdkljsfkljsflkjsdkljfsdlkj 3 2354 (C3+A3+C3) 22 33 23 # (B12*1.2)efff # (B13*1.1)efffJ # (B14*1.1)A 435 # (C12>C14) 335  (A8)+A4 23 54 45dskdklfklfkldsalkdsfdklklfdlkfd13332 34 43 34 43 43 2 !330fllkfdasklfkskfld !23308 !220000 45 # (B12>B14) 34 4 32 543 45 345 3254 3 435 34 34 34 23 325 400 23 23 4 # (C12*1.2)Ez> # (C13*1.1): ף^ # (C14*1.1) 3332 11 33 35 (C3>C6) 32 23YT 435 # (D12>D14)ףK 34 43 34 34 32 54 543 (A1) 43 2 Year totalj k; 223 324 253 23 3454 2342CAFkUSLLEC )䵱FMUS )䶱FE )䷱F # (B12>E12) jFMUS jFE jFEDLO Skƈ/$1 # (B13>E13)jȱ jʱEj̱1EMANNOITCNUFDRADNATS ~j|U # (B14>E14)SILNOITCNUFDRADNATS   CAFF XEF X94L FLF ATCRAF j1TGNELFooMELLECETAD # (F12>F14)LECTIDEooDXETTEGooC jC jL@  jAMj   l|{dsfa{dsf{l|dsa{lds{lfd{lkfd 32 32 23 43 # (D12*1.2)tAMjjjF FooOETNECooOMOCLLEWooMDNAMMOC oJAMROF!FjF)ooBLECTEG?SACREPPU kOPRRE NLOCjFoo>NILTEGoo=TALUCLACERAOPRRE LUMROFFLUMROFSI kooc1TAULAVE k+ROFo oo+NIRPoo)AOLoo )VAS-PYTEL Foo(MANELIFTEGELIFF^ k'SIXE ed # (D13*1.1)>lt # (D14*1.1)F7Aj 435 # (E12>E14)*i 3 43 34 IL ĵMANELIF  GNIRTSoo& oo&HGIREVOMoow%UEVOMoo$WODEVO ooG$TADPU#FjF)ooY#LECEVAEL"GjG) ECOTOGoo !PYTHSALFoox AELCooI ooIRGooiTUA&NILB kFjooSA ooSM k*LACOTUA 0 +LIFCM j۸ F )޸F ߸EER 43 32 23 32 543 435CS )j OPX -)    LLEC P