IMD 1.18: 15/07/2013 8:36:00 turbo pascal 3.01a   D@`  @o! #@%`')+-/1 3@5`79;=?A C@E`GIKMOQ S@U`WY[]_a c@e`gikmoq s@u`wy{} @` @ ` @ `  @ ` @ ` ǀ ɠ @ ` ׀ ٠  @` O!Aa   !Aa!!#A%a')+-//3A5a79;=?A!CEaGIKMOQ!OUWY[]_/OeagikmqsAuawy{}!Aa!Aa!Aa!A!Aaǁɡ!Aa!Aa@`  @o! #@%`')+-/1 3@5`79;=?A C@E`GIKMOQ S@U`WY[]_a c@e`gikmoq s@u`wy{} @` @ ` @ `  @ ` @ ` ǀ ɠ @ ` ׀ ٠  @` O!Aa   !Aa!!#A%a')+-//3A5a79;=?A!CEaGIKMOQ!OUWY[]_/OeagikmqsAuawy{}!Aa!Aa!Aa!A!Aaǁɡ!Aa!AaREAD ME %TURBO COMTURBO-87COM`TURBOBCDCOMTURBO MSGTINST COMuTINST MSG1TINST DTA:HILB PASDTEST PASPBCD PASSLISTER PASVCMDLIN PASaDIRECT PASc EXTERNALDOChDOSFCALLDOClINTRPTCLDOCoCALC PASrCALCDEMOMCS.CALC HLPCALCMAINPASACCESS3 BOX*  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 necessary cor- rections and additions, and we apologize for any inconvenience this may cause you. At the end of this file, you will find a summary of the new features introduced in version 3.0 and a list of additional files present on your TURBO disk. ******************************************* *  * * Need help with TURBO? Please see * * Appendix N in your Reference Manual * * for answers to common questions. * * *  ******************************************* -------------------  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.00 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 parameters 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/O 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. Typi- 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. ------------------- OVERVIEW OF NEW FEATURES OF TURBO 3.0  ------------------------------------- A program that was written using TURBO 2.0 may behave differently using TURBO 3.0: - TURBO no longer does a ClrScr when your program first begins. - TURBO no longer does a GoToXY(1, 25) when your program terminates. - The use of file handles now necessitates closing all files -- even if they were not modified. You should also place a "FILES = 20" statement in your CONFIG.SYS file. Note that DOS always uses five file handles (standard input, output, error, auxillary, standard printer). Please refer to your DOS technical reference manual for more information about DOS file handles. - The handling of some logical devices has been changed to conform with standard Pascal and with TURBO's handling of other files: 1. A read statement using the logical device TRM is now buffered and terminates with a . 2. The KBD device is not buffered. For this reason, look-ahead functions (EOF, EOLN, readln) used on the KBD device will al- ways "wait" for a key to be pressed. TINST Installation ------------------ TINST now allows you to install a pathname which is used by TURBO when loading the error message file (TURBO.MSG). IBM PC Implementation only -------------------------- In the screen installation, after choosing your display type, the following question will appear:  Does your screen blink when the text scrolls? (Y/N): If the screen is "snowy" in the TURBO editor, answer "Y" to this question. Chain and Execute ----------------- Heap preserved during Chain (MS/PC-DOS & CP/M-86).  Chain and Execute no longer set a flag in the command line parameter. Inline ------ A constant identifier used in an INLINE statement does not always generate two bytes of code. Files ----- Append procedure (MS/PC-DOS). Full DOS path-name supported (MS/PC-DOS). I/O re-direction (MS/PC-DOS). New FIB formats. Optional parameter on text file declaration sets buffer size (MS/PC-DOS & CP/M-86). Optional parameter on Reset/ReWrite sets record size for untyped files (MS/PC-DOS). Optional 4th parameter on Blockread/Write sets block size. Read and ReadLn work with array of char (MS/PC-DOS & CP/M-86). Seek procedure may take Real argument (MS/PC-DOS). SeekEoln function. SeekEof function. Truncate procedure (MS/PC-DOS). Misc. ----- ChDir procedure (MS/PC-DOS).   Command line parameters on Options menu (MS/PC-DOS and CP/M-86). Delay procedure independent of processor speed (PC-DOS). Exit procedure. Extended graphics procedures & functions (see page 309 in manual for overview).  GetDir procedure (MS/PC-DOS). MkDir procedure (MS/PC-DOS). Multiple EXTERNAL subprograms in one file (MS/PC-DOS & CP/M-86). Optional parameter on Halt to return error code (PC/MS-DOS). OvrPath procedure (MS/PC-DOS). OvrDrive procedure (CP/M). ParamCount function. ParamStr function. RmDir procedure (MS/PC-DOS). Runs overlays in Memory mode (MS/PC-DOS & CP/M-86) Turtlegraphics procedures, functions, and constants (see page 309-310 in manual for overview). Overlays -------- Overlays can be run in Memory mode (MS/PC-DOS & CP/M-86). 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 (MS-DOS) or OvrDrive (CP/M) standard proce- dures may be used to specify the drive and subdirectory in which overlay files reside.  ------------------- TURBO PASCAL Version 3.0  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: ACCESS3 BOX - for TOOLBOX users only: ACCESS.BOX update  Sample programs --------------- LISTER PAS - simple program to list your Pascal source CMDLIN PAS - get parameters from the command line DIRECT PAS - demonstrates TURBO directory procedures INTRPTCL DOC  - get the time from DOS DOSFCALL DOC - get the date from DOS EXTERNAL DOC - sample program using externals  CALC PAS - sample spreadsheet program CALC HLP - spreadsheet help file CALCMAIN PAS - extra program for compiling spreadsheet if ne- cessary (please see note inside CALCMAIN.PAS) IBM PC Implementation of TURBO only ----------------------------------- TURTLE PAS - demonstrates Turtlegraphics  ART PAS - sample graphics program COLOR PAS - sample color program SOUND PAS - sample sound program WINDOW PAS - demonstrates windowing Special versions of TURBO ------------------------- These files will only be present on your disk if you have TURBO with one (or both) of our extended real number packages.  TURBO with 8087 Support ----------------------- TURBO-87 COM - TURBO PASCAL compiler with 8087 support HILB PAS - demonstrates increased speed and precision of TURBO-87 TEST PAS - demonstrates increased speed and precision of TURBO-87 TURBO with BCD Reals --------------------  TURBOBCD COM - TURBO PASCAL compiler with BCD reals BCD PAS - demonstrates increased precision of TURBOBCD  -------------------------------------------------------------- Q)ͫCopyright (C) 1985 BORLAND Inc T0No Terminal selectedP.' tC.PLXuËCKu.&2P2 XHur!.PSr.[XPSPSPS[XÜPSPS[Xûm릻} dPSQRVW..FFGG..#..,.=_^ZY[Xÿ2.t.OOK2.v t0.G u[_)PQYX%;u;&E&]P X[S>r3$ȋ >t%s > &=st +%6&=T`njhjQRȋӋČӃ_3hZYw 33SP&u&5njT&&E&E&E6 &<&D6&<&DÑ[_[S& &Ur3$ >njsW&&]s6 6&&\&D&D& &U&E&]<t&=&E&]& &U&&&]ȋӡ &E&]njKVuQhjJt1&&\&L&T&&])&E&]3É>hjW3_3333>t&=ČӃ3+jr;sȋ[h&j&U[&=>h>j3>>pu2>qu+tȀu tq&p%Ltpp u qq>ru<u2XZPRt5>ruLwt L<uLXXZPXZP 2=tt2tGU!]VQ6XZ<t FFY^Yr^QV6XZ9uFF^Y빋6XZ t >FF3P>XZ3&=&r3p^`b_~ Â#+CSQRWV2P^_ZY[SQRWVLU^.C t^] _.u Ȏ+شJ.DT.DV..LQV[^Y><.D> t 8:>H.DJ t DFV3&l&n& &Pt & &Ptr\ 3ft>8JD ô01 tú7 %  M Not enough memory$Incorrect DOS version$ Program aborted $P8D3l&n&XPuL6T9PV[. t53ҋ tSB[;t +NOJu^.;uPRVt2 tGW t:t \t\GFF.FG u=t_^Zr).B2Ί2Yr?Tr>늲V[RSt L[YSЊ t[+L3ҿ. 2G3.< t< uGI.< t< tGI+tCJuғÈ>[YXSQ#>[ZXEESPY>W2-+v G& :t󑻔CG&:t_&52>[GS38t08ur!>&r>38t->&ù@X62;vBF,D[ڋ_[ڋ+[Y_㑌[_^;sNO[XUPWSPحȭЭPP^XÜWU~ ë«XƫXثXX[];sòv;|;òh+r=r;jròI[XSrLtL&r<tÏdd#3^À>^u Ê^ [XSdRZd-f u RR6f\Zs ^C User Break0w  I/O Run-time error , PC=f Program aborted  yP[ËSQNJ݊2XXظbȸ6؉ y-C2'd 2+sut0C3?$ uCP3X0r% ru rsRZr2s tÊ-uCQYr -u=u-u[& 2A+^. 2A+Z62C6?:v6Ag[2+L6 G[262+ t'y6 A6 AGEtH 9uH -sH !vH wH rH Ë6 2G62Fڊ;v t u:ZYQd62F6 r&62+AV^NOAG&ddXrH62+v;v3҇6&d[62Dd62G6 2F3+r@ tBQWV^_Yt@GJu3&d[&S>WPHB>>6%W[S>WPH u>lP[Xud6\26@6@[6:t22AG u tòp[Z Q t2uY **t2u[ 36Ñ[XS*r2A6sCËFF6| 6D"22$[22 ;tNOG3t5 @3}Hu u3 @_  Q# A# 6G" t3 6"t@ "2܊ȀË$;øu;u@ ;øu;uH  t3> uދ:vއ׈*Ȁ(r߉>&>06΀r 3r ߊ2 t uus^uTÆއ*s6Ҁ u׊2,ruƀuu333À26 to tq233ҿG- u ߊ2s &Nuu͑ƀu  tɑ26 u333 t*;u ;u:&r *&Nu -tOs*&r;u ;u:&ƀu uYr r[333s[É3Հ倈.΀6>WVQY^_WVQY^_WVQY^_WVQY^_R3ZyRZƀtt:u t ;u;u: u33Ê yڸ u xy x3_Yڹ33 Sr!|Et*s2< r ЊRZ uy < r [ŀt-j t yYKy t.It@ux, uðE++ yٰ-/ s:  tF0CË]U u00FFuPR,MZXuQvYhìx-Sx9?+{Η@ uÀ΀QRSPYYYYs uÀ^_ZY[WVǀuπ*r< s t33øËڋ tǀuXSQR[_S;uDv5W} _s&>t &EEL&E&E^"2d6d&E$t&e&M>^u>^uPtD&€t&E>s&E&]&]&] tYB&33&Mr+s33QʋиB&Z&u&<tFBu B&f&E@&E&E&E&E Ïd6d&}u&U&+U t B&*@&3 븏d6d&}@u!Ïd6d&E$u&&E&vt&>s^ù !QS.:t [YFCYY<:u.._CONTRMKBDLSTCAUXUSRINPOUTERR&=u-=t<3ɲRU IZr&È^<u^Ïd8&dd>&Eu^&ddD&dd>&E@u^&d2d8&:WPX t_&d2._~r~_~`2<t9<t5<tC<t+<t'<t5<tC< tE< r:tъ'C s'Cxl Ku묊< r&Cu t uU CCbÊ&rrPX&r>>^uu&E uh$u&]&;] r_&]&C&]?W<u`;br  `C`<uL<uLL"_&E&M &Eðô?&&M&Ubs3&] u&@&]&] WSD[<t"&e< vCtS)[< v&e?_r?t^W&e_[&[St$r s&&Ý[S}tW(_r[S32WSQY[< t<t&e_C&_&[S2WQzY< t<t &e__ [<t&e< t< uG< u&e>>^u?&Mu&]&C&]&;] t%Pttt &M&+Mt@&&U&Ur;t^ t(<v I QxY[XSo[XSQWX+v S QPY[˻SQ@Y[CÒ[YEESQA[YS% u% TRUEFALSECC6*v2S QY[62C t 6SQY[CZ[.2C .SQY[C  d6d&Et RZ:t<t< w t &e3@322d6dQ8Y>^uQ Y>^u&MÏd6d@&3Rd6d&ELd> &}u^&d?@[^S>^uA>&&&Mr!;t#>?u t&M+3à^3ҏd_6d&MʋиB&QRY[r;u;t^[SD& u@ [SB&33f&MO[S[SB&33FPRB&337Y[PRӸB&(ZX&MI[Sht3۹!sË؋Ñ[_SM[_SJ?@dZ^_P>Y>^u ;t^&d?@d[XZ^_SQ _&&d&}tO&}tR&eZ&&`s^3&Mt3 t>?u P+ʎ3X@^Ïd6dAU s^Ïd_6dVU W_r־} ÏdZ6d t(:u,Ar<s܀>t ;r÷9:d6ddX6d uu@:\G^s3ۊ t FC&u&ûT)3ۏd6dPuBS=U Zr0ظB3r$?T*>ۋ&R\ "^!/Licensed Material. Program Property of BORLAND.w޸Ў.+£>-s >3£@B>-@=rHX3@&BPX PuX ty:TV3LNPR('ۢd&--------------------------------------- TURBO Pascal system ,Version 3.01A MS-DOS Copyright (C) 1983,84,85h BORLAND Inc. --------------------------------------- Terminal: U Include error messages!&t `&Bp,S>tb  PX/,r1.d u: ڊ<t< uCÀ?Mogged drive: GAKw ctive directory: G2Ҿ Q ork file: ; ain file: V # dit ompile un ave ir uit compiler ptions Text: V+TFree: X+V bytes ucompile ->  ø-P8Ԡ'yemory jom-file Ycn-file >'t?minimum cde segment size: JL1 (max c* ) minimum ata segment size: N (max - ) mnimum free dynamic memory: P  mximum free dynamic memory: Rs n&O command line arameters: ^ (V ) ind run-time error uit 0 PX/Osi.dPX (Y/N)? <u.:t .<uL3A*4W0M[0Eu=C5Rd9S2D2O-Q:M7C7H7O7D38Ih8A8P8F5Q0XTURBO.MSG.PAS.COM.BAK.CHN\*.**.* Main file name +t M  ^n1C Work file nameuB  c ^i1\1% TSV] ^[ӋXCVRQ5 d Loading 0 =e$ՋYZr-+ʴ?r$;tuO>OC&\K&^&X File not foundJ0 _<t1 New File Sm[ Invalid directory File too bigVK3@3>ct2 t/rWorkfile E b not saved. Savecpuc 5 Saving  H0 AeӴVeӴ<3ɺr/TV+A@r;ucAӴVe Disk full or invalid directory path Dir mask XAӾeF<*t0't>'taStack/Heap: JLcHStack/Heap: P32 (minimum) R (maximum) P& (X3ҹعG bytes) paragraphs3PъX0r r  rs  CEnter PCuf&am Searching+)V Compiling>at@ --> euI>ar>bt Aπ>bu## RCompilation aborted lines >bu8>atRun-time error position not found >bu >bu$Run-time error position found^Error 3b&tm:<td< r,0C,0C:bt C< uC: < t2< s(<t*:F< s:u < tFF< uFC%>tD.B Error found in above include file>t LZK'''[Minimum Code Segment sizet wc*ãL&Minimum Data Segment size\t B-ãNMinimum Stack Segment size&t PMaximum Stack Segment sizetRParameters((;<tCGÀ>u%>uCt\1^i1%þ<uC0'atataM0À>`u>'t6>'u,'Please Quit TURBO to run .COM file(D3ۊ<tFC&&A & Running 6DP&&ffTVc%`[ȴL̀>u>u]%>%txþ:u tFGø:T^K1\10eW^LVCTS:S{ t[3ù33VWdQ3ɾ";2+TsTu t0Au u0A3X+vAOȰ dy_^@B'd e2< r :uCC A:GG u5?\t0\GGЀ@r=t t Gr*\Gt 2< vQW;_Yt CGr"+,/;<=>[]{|}*?>0Vh^2ҿe3Ɋ tGt<.u<\u3 t uO. 2t F.Gþee þea[/ʬʋ2\OFF0U^P.C tltlÀ>ltlŋދËދ3n!@@J @> Értxa.kʶ2VVSV VC]U[TC= tY 9uG_s-tՀr c`=SRUc`s>tPXCSI[Qz <t< s;CS T[ uSTn[ tt tU.CuvuS3ۈxPCXu[PX< r<PP^5X@/XñQS[Y.F t,QSC*s#P.*"uFCuX[YtXȵu>txzH.>j8r *Line Col >t~Insert mOverwrite >t [Indent:t`طT;zu3u<>T+t u B ut R[ zoPXt uÃ0t1'd 2+r0<0u t: ڋC7CRSV^[Zsmu<u<u D:sDZ<uD:tCD<uSu<-uy<t <t<t<u3눀>t~ЊD:r  rDCD:s]tWD tLK? s'  ,]0Find "Replace with rOptions.>jϳ| CJ+ڋډ~VInTp/ upC<0r<:s,0P .Z£Nnwptn(u~~u ;nr K;pst ŠstRS[Zrrb t uYuAtS[rr@uC;V>t(tptgORZrtJB뢋~rD[((uP2 Search string not foundF+ VJ;rSS [+ںJډ ([ËTVK<0r<:r u$dQ谽Yu dQ蘽Y t r;ts Write block to filet=er%> S Overwrite old eWEtGq?  Read block from filet=e s%R File e_ not foundaSVX+Sˋ?. X[?+ȉE\FCtӋ?rE+ڋ$? Is%?rrىt rese?rىt C>tCRU [J+ڋډ?SrB;ڋtr;s r+ډA[W Aً?rQ[YW>u4rrB;rt;str+sˇSQ Y[rt|ut>tMtJ2rrMtCXJV sVJ$ AC;r >  r"   rS[סx;Tta3ɋ;xt A.k,:u S [6x3.kn |[r;xs[ Ëx;tSy[sx3.k3 [.k,ȋx ux 9 ).k,ȋx ux ̋xT;tL TxJ>u^c` [S[v J_>titrdrUs\o<~V2 0 0;V߷s-CJ+ڇڋS[ CËKJrCrsj?rCr%r:S[KJrrKJrsCIfË+ðsGKCr15rO_)S+JnrfsCr >GuCMr눋rPvS6CCrUVCX>t-vvR ZuS5[S ;tC[9J?wSS?Zr+ڋ[u`&s2KK /ȵr .kw;ڇrÊ< t?Hr1@r,rËKJr݉ne< tu3s(s~2xItxrËVksV.:ks&:tS[;VsB,PXٰ K;Ttr:uC< u C;Vr..j&. tqC;Vs< tu..j̀>tSC|[B;|s9;|tC;Vs< t< s@P_XuՊC;Vs  < u~À>t+>t;rr;ts ;r;s >tn>tT>tZ>lt>ts t u.>u.kȊط gy飳J;ru 6;tu 6< u^ FtmC;Vs;ts S[;rs*Ţ Fub>t:sy< tFu C;Vsg.Line too long - CR inserted>} v y I:uK;uú;sCˋCJ+S*ÊȵstY6J t;u6r;u6tCFuN ËX+r5+s-SG[WARNING:  byte(s) leftOERROR: Out of space1%<ug*** INTERRUPTEDSQrVRR+ڋ[U+sRdZYA[V tY[ڋrRrtGtx<x1&nnpp;v+SSVB+ڋ[Z tlJV|St[t úJ.jȊ+ڊ*r!:r*.jȢ}>txT;vxع;urG;tAx. t 3.k-;rIIA u;sSA uT.kȊЊ*Šr=u >u`*s.*v'xRS[uxZʈÈËxI.k,Њ*ŠsxZ.:kttxx.ko6C. t:tFßP:sXÇt;rىt;rىSڻ+tˋC\ [;r.j*ËV+v؎ u͋ËË >TKK;v8uCrËSK+K˺K tR[ [$ic>u;PSQRLZY[XÀ>t\ DCAB                <>,[].*+-/$:=(){}^#\' IJJJ K2KHHHII[IMHWH2ICIICHHHJlHE2̊̾GGJGƮ_DU=vH>AAA&>ar>`t>ub46>au >arD>au` >ar02`VCãD>+ãJ>B>C>A>OюɎٹBG>>>./;CCTE>I3 6T*>at wT*T)T)øT*@D;c33DT*ô<3ɺۮrɣ?>auش@T)轮r;urDW*W*&%F;LsL&EH;NsN&EP&E ;RsR&E @?T*+JPQW*DYXr;u32Ӑu(3u 2tU3)3C.3>au t t P6/.*.%.6.....--r->I=./ R-3a -FH[F;LsLq.CCH;NsN`.CCP>asJ+F+HJPB.XCC;RsR3.[X>t $..6/PSQ>au@؃@;Jcb+@D ;r Rx-,cZY[XIs">Ir>Iu>Iu UF]É>I[.b3 tI->u +TG4Z&6K,610G <uj<u<u<u<u<t soY+[C, +n+@@+n+,3+.>Ix.&---F0t|063-Z.B0uD)- u-  --u:-Cu--+06--y--' ]RF20]F//GtnàT<r<sz=<uT,.X-h+f@P.V-Y>T u uz/u/QYI/Q(Z: 2d*/,<uNk,/U6Z3QP-)-X;PEZPG/c /XYtPj/XY+t2w*G,<u\,6Z.V,/:W葵.tPQ.Au蔵X臵.t. 蟵V:Y*C+<u$(Z*s͊2) t 2)u< u0' t '񸣆))) >Zt))':T,;V|;X-66+ ,6++Z.B]RF]F.(-GȕPXO--Gu3Ҋ t<.uG<\u3 t;I\2.0 00EE (( (C *Q)aP6?666666n6>aua+3>at<3ɺ\?38,p66PDXsOy)YZU+ t22(]F+‰;r(,gt>at >?蕧n?Xann+(''âr2Q*Xu,)A*66.93,uqSQ6.!p+[uQ*Y+tQ u,+t -R .pnY]RFNZ t2Y[+t+9)>ru9+SQp-Y[>Ts >T/0]URF^&İFZ+]X>st-F^2NFF>suK*ߐuFNe&;+*u.~+>sLn++F^C+F-'66UF>rt^6+GFN t]Q6oS.R([6O.p2Q6.MMFKM6VKM6Fu.']YS[Y'%U>u%'%2%v͊%u$$U2أPrPXrX+&]UvF{b8X->ruR]UP'MX>T u-:>Tu!+Z$ZHఱ$w$]p$,P!X>T u\$ V$] uK$D$$)]NU't'uv;)"=)XO6{"2Ƈ::C0ٸ=eZش?:Z :E$F>٣X]F(>T rZË.;.t&n~t~u݃62+6HIpvQU(]YZ>pt>u3>u!>u b)b b^2+FFRF-63Q% &.%YA't]6'K'ue>Kq&uFVA(!u !S' "X"!'̕t &ӕt P' XӉp& ut&puƀ>Tr>TwC.;.tYn~uF~u~tF^6W2BU.;.t(n~uNNNO66:u]6DF*9t6&&Dt,t'jt"ttt2tWt tI$ù*%u n.Rb$3%uMq&3QY6RX+V@bPA2&tQW&&}YRVZ[bZXXT#%uRqPP66llq%lZlUXXqTq#ntk&%t";lrl%t;t%At>6m%t%%qPqXqJ%tЀ>qt%$ېÀ>qt:%$ې$u1%sXV F+@ZRVT"%u'"6""VTUZ"D$u0=$u*>Tr >TwzDRVTZLR"Ë.$# u"e$ 1 1[$CZT!'$uIS!5"!X@P!!#[t\$3҈TXV t@Z!Wu%QS z3G#A ZX:~,;}4t~t.d>T sgZ6.;.tD^ t6G6o(XP^CN*uyGPlbuX[CW "ېt  [#t C"t/@u%!u!t!u"jt.'":F}H~u+FFs 6 " Lh!%u[6CR[C66 6!*/[XCm6!-tm" Xz ) M>Nu>T sTP^" XP:,(!ɑ X:,F!* Y+ȋ."6.G86|Q6e^Y.G6.w>Zwc[X+HHtl[KK_ !3Q3Q Atu|~YQYR6e u.r2[Z+HH R67 2[Z+HHY6AQPX t2R ېZt;Y[6QKKR%Zt tE> 2)@ېt Y[KKt:.=(F:Hc&P>aA)>T>Mu &OP&2Ut!*c X&*t >~tu*Eu%uPt JFY[3ɰ+ tI-t>w t uUE/uX+UN uQUNnQ uo>TrM >T s >Tu tR`>Tu&Z̰F>Tu?y*4v[)HZ  [-\>dtkYtfh]FMN2+uYtH?R]F t F*F2 t F À>Tt>Tr >Tw6>T s>Tu>Ou>Mt >TrO6X+PZXPMX>T s>Tu t>Mt&_>OuJ/)^~jO ^>T u u7L ->Tu u!P>T u uH :Tuu t.V:nt,u  t;VuàT<tS< s5<u @t'<s!<s<s>Xu .h~ uTds:uFG,(>N)_&u6P<[XPcXV,)) ))PX?Do' t'x#Z-L »opS>Tu.Vvj+>Tu Z-Lcu [p ppS9[ZT,2.|& M(& T(&+!&&!&& &\tGtÀ>Tr>Tw T3ð2truuyA"z)`)Ttr t r+OB.V~ u.X~ uZ uఱ$2u&Z̰$m$ t:$ t N$>ZwK$suvq$>t[t Mø">utc">t_"%2t 0"r%uujAB"0"20"`u$u>I=,t=)u 5&q}|Vr r$B rg6uQY u)'uPQY3 uO u 5A%t% t% t % tu%>uX<M&''>#P&.VuXPX([((c(PS~G%qe[XtSPW>T u>Zt f])))POHsc&Z̰)dh X@(Gf>]:,&Z̰P9X0>Tz"( uuQ Y t,uQY3 t t Q&Z̰Y t <3T t t >ZuQHg>T u>ZtY_ tc I`  P4SX .&P(>TuS.VjXP>Tu1 X뾸۸M_PzX>TulFe\% oM|g 235u3a   yp!S grSX? VXdg PVKJZXGl!q#aY LE>PX tYz t tHi s+H t' ! u o "MT ~tut 1 r]uvPQvPwPwP2vPQvPwPwPQDYttZSQ)66Z/[ r.Ge0 .2 tCCt CCtCC.v (/QLZ/ t:, RP^Ujh4vlNhQS$YtÀ/SQd6z u u  9ZM[.?s4t ~ u .?t대u.?T/ t C/hQYtÀ /SQ6aZ[S.?u u  [.?w#t tun뤸 t/.?u t /p3u(%c t /9 4- 6n x t u     r Àug RP u u7 *u% u u q $ O  u ur u u[^  ru Y;t u [Y:,u:t. t* t$,u>t>t ;tu, u u QR ZYÀ urtb  U HQ u.Gu.G  S 8u'.Gu.Gt .W85'- .Gt .Gt .W] .Gt Y(t%t tEttt t)uT< r>ZwTb< t <t<t<u.V.Tu>n9<1>h.V~ ">.X~ >Z >ఱ  3 uF  uZl | v p u M Q Y23ùu(^6G VT u3=w LEtP Xt TuM ]t?QY u:.,QAuy YQ:, Y<tb39u_3ù unF< Pj>lX37u 33ұ34Ou. u3 u ø  t%!+ P_ t X PBX uñ @HP5X 8 2. 2"  % ø|  q   cVPaXSEcE7V1 M, 2$q ui Q   u  s~L øa&W&\&PY0#X߸''P@X?붸'(P*X?  똸G} Zy e |W &sZO  t uF,)-  )؀>Ot>Otr W u nFM)Zkc[б ðP{ } BXNttGtrt3 ܑuW.P  JX2ZT <uVX VXPMO3Ê2KyS㋏Q XY[uM=t .OPU+ãPO]>Tu u-bV >Tux tá>Ou>Mt6PX>tX+ tPQhYX t>MtF_>Ou:>Tud fZHh.X.V#:d, u$;f|;h~-+fZPfu Z)P) t=uH-.h+f@ Z=t8=u+=u =us b>MtU MM>TuI ul 3À>Tu(8 u#U)6N6P XPN3À>Tu$ u.V8POM3àOMu 9P5hP t ]Et tL::t^ 6>Mt͡P@t P@u x ÀÀ>Ot>O&t.À>Or+P>Mux ttPXtw8Q)>Ot>OtrW>T rE>Or>Mt>Zwc>ZwP>Zw2À>Tu rK>T t>Tt>T rC>Or>Mt>ZwQ>ZwPP,>Ttk>T t>Tu&Z̰\ 8.VZ&f>T r"tVH;Xt@X "d) Yt I ,RRZt 6J2t u>t 63Ë>I=-tB=+uBG t t JKuùu?N r^0 uFFFnջ: t MFC3Ë>I<'t<^t<#ug:<^t"<#t4<'uBG e7<'uG='u߈CG H74@GCGSQ菈Y[8u:2 <$t7s3HGs蟁t PP,X>t PX>t PWXS>at+D& ;ftt u@[bȀ>ar.+t#@?D~r;tɡá+HHS+[À>at;rS+D&[QWV6>A;t6;r+΋ONF66DAA;Cu^_YÀ>arlPSQRUB?33N~PR.;.At6B?V*~F8@?8~ɃġAB?YZ}]ZY[Xþ]Mю+&]Mَюٹًп]MQَюٹYË.MF.Ë.MMF.á+lиR\.KKMMFTu.3ûlFNFPn\QMMKKFYø3PBX ;trsSv: uyX.:2M^M:FKu.>>uN3ۋ>I$rt uGC::> u:tS[r..>:.3HÊ:2.;t4nF t<tF:u:u+;uҊF+[..S2:. 2 AtIË.[.?CCS: 2Au.tS.[ 5CCCË>r +>I=[tE=(uDG=.8>I=]t1=.u0G=)$:;,.( )=^>I:uGk tt>t)rjbZDPFË>I< v<{t=(*t >I3?:R}$t.*u =*)u<}uZSQR z{`SK_=OyZ.3026[G tSQR>[>u+EG<tC< tG ? uCEE06+24?<tC< tG,< uC0>.x9ZY[;2r,Q?.qxYs3 u@6ã2tPSQR My>tI =y 8y褬m| t1Fy *** Abort compilation\tʹ y ZY[XINTEGER CHAR REALBOOLEAN BYTE  TRUE FALSE MAXINT!I PI_BUFLENhHEAPPTRDOUTPUT8INPUT $CON$TRM(KBD,LST0AUX4USRrCBREAKCONSTPTRCONINPTRCONOUTPTR LSTOUTPTR AUXOUTPTR AUXINPTR USROUTPTR "USRINPTR\ERRORPTR         L&4x!4G[oӐGɑ2_PROGRAMENDFORWARDEXTERNALPACKEDARRAYFILESETRECORDSTRINGOFABSOLUTETHENELSEDOUNTILNOTNILTEXT..:=LABELCONSTTYPEVARBEGINOVERLAY PROCEDUREFUNCTIONBEGINgIFhWHILEhREPEAThFORiCASEiGOTOjWITHkINLINEkTO}AIDOWNTO~IAMEMMEMW*/AND%#MODDIV SHLSHR+--+OR XOR53=t<>u>=}<=~> <(|IN=;WRITELNQqWRITEUqREADLNEpREADIpDELETEsINSERT:sGOTOXY+tASSIGNnRESET~oREWRITEoAPPENDfoCLOSEoERASE+oRENAME oSEEKFoLONGSEEKFoNEWHtMARKtRELEASEtGETMEMjtDISPOSEtFREEMEMtSTRosVALs BLOCKREADr BLOCKWRITErCHDIRrMKDIRrRMDIRrGETDIRrOVRPATHs RANDOMIZEBtMOVEtFILLCHARtEXITtHALTtPORTW.uPORT2uFLUSHoTRUNCATEoEXECUTE8oCHAIN3oINTR uMSDOSuCRTINITPuCRTEXITUuCLRSCRZuCLREOL_u HIGHVIDEOdu NORMVIDEOduLOWVIDEOiuINSLINEnuDELLINEsuDELAYyuCHR }ORD}COPY/}LENGTH}POS!}CONCATP}SUCC|PRED|UPCASE~TRUNC|ROUND|ODD|ABS_|SQRJ|SQRTo|SINt|COSy|ARCTAN~|LN|EXP|RANDOMw}INT|FRAC| PARAMCOUNTf}PARAMSTRl}LO|HI|SWAP|IORESULT}EOF}EOLN}SEEKEOF}SEEKEOLN}FILESIZE} LONGFILESIZE}FILEPOS} LONGFILEPOS} KEYPRESSED|MAXAVAIL}MEMAVAIL}PORTW~PORT~ADDR}PTR~OFS%~SEGU~SIZEOF~~DSEG~CSEG~SSEG~$ͫCopyright (C) 1985 BORLAND IncN*No Terminal selectedP.' tC.PLXuËCKu.&2P2 XHur!.PSr.[XPSPSPS[XÜPSPS[Xûm릻} dPSQRVW..FFGG..#..,.=_^ZY[Xÿ2.t.OOK2.v t0.G u[_)PQYX%;u;&E&]P X[S>r3$ȋ >t%s > &=st +%6&=T`njhjQRȋӋČӃ_3hZYw 33SP&u&5njT&&E&E&E6 &<&D6&<&DÑ[_[S& &Ur3$ >njsW&&]s6 6&&\&D&D& &U&E&]<t&=&E&]& &U&&&]ȋӡ &E&]njKVuQhjJt1&&\&L&T&&])&E&]3É>hjW3_3333>t&=ČӃ3+jr;sȋ[h&j&U[&=>h>j3>>pu2>qu+tȀu tq&p%Ltpp u qq>ru<u2XZPRt5 >ruLwt L<uLXXZPXZP 2=tt2tGU!]VQ6XZ<t FFY^Yr^QV6XZ9uFF^Y빋6XZ t >FF3P&>XZ3&=&r3p^`b_~ Â#+CSQRWV2P^_ZY[SQRWVLU^.C t^] _.u Ȏ+شJ.DT.DV..LQV[^Y&><.D> t 8:>H.DJ t DFV3&l&n& &Pt & &Ptr\ 3ft>8JDô01 tú7 %  M Not enough memory$Incorrect DOS version$ Program aborted $P8qDj3l&n&XPuL6T4PV[. t53ҋ tSB[;t +NOJu^.;uPRVt2 tGW t:t \t\GFF.FG u=t_^Zr).B2Ί2Yr?Tr>늲V[VSt L[YSЊ t[+L3ҿ. 2G3.< t< uGI.< t< tGI+tCJuғÈ>[YXSQ&>[ZXEEESP\ Y>W2-+v G& :t󑻔CG&:t_&52>[HS38t18ur">& r>38t->&ù@X62;vBF,@[ڋ_[ڋ+[Y_㑌[_^;sNO[XUPWSPحȭЭPP^XÜWU~ ë«XƫXثXX[];sòv;|;òh+r=r;jròI[XSrLtL&r<tÏdd#3^À>^uÊ^ [XSdRZd-f u RR6f\Zs^C User Break0w  I/O Run-time error , PC=f Program aborted  yP[ËSQNJ݊2XXظbȸ6؉ y-C2'd 2+sut0C3?$ uCP/X0r% ru rsRZr2s tÊ-uCQYr -u=u-u[& 2A+^. 2A+Z62C6?:v6Ag[2+L6 G[262+ t'y6 A6 AGEtH 9uH -sH !vH wH rH Ë6 2G62Fڊ;v t u:ZYQd62F6 r&62+AV^NOAG&ddXrH62+v;v3҇6&d[62Dd62G6 2F3+r@ tBQWV^_Yt@GJu3&d[&S>WPHB>>6%W[S>WPH u>lP[Xud6\26@6@[6:t22AG u tòp[Z Q t2uY **t2u[ 36Ñ[XS*r2A6sCËFF6| 6D"22$[22 ;tNOG3t5 @3}Hu u3 @_  Q# A# 6G" t3 6"t@ "2܊ȀË$ ;øu;u@ ;øu;uH 5h!?5h!?d3?@v:k :@?$@[&u&u&u&5[.w.w.w.7^X[YZ_&&]&M&U>u  uòXW6D 6D6\ 6D 6d6D 6L6D 6t6D6\6D6D 6\[YQS>@t3u3@tH uH sH vH wH rH 6Dț6\6D,P6\6D46\Û> .Û>&.Û>&.[66D/_6_X[YZ6RQSP6D6\..0..&6d..06D>u>t6t ..0ț@t u ut6\6D>@u8ћ>Atɛt ..&t6\6D>&Au6\ò6D 6\Ûɛ>&.N>&u.&Nu ..:ɛɛٝtSQR>@t0Fmtɛ-=+%ɛ..Dɛ 6K0F$0FuZYs>>}$d>t*s2 :rЊ uy <v[>t-v u. ycUy t.StJux6 uËE1+ yٰ-$d /+s  tF0C2؀?5rx K?:r1GÊ-uCQYr-u 33қzr.Vɘ J <.uICtÊ<0r<:r,0Á|4[Y6QS>t33X6[]_S;uDv5W} _s&>t &EEL&E&E^"2d6d&E$t&e&M>^u>^uPtD&7t&E>s&E&]&]&] tYB&33&Mr+s33QʋиB&Z&u&<tFBu B&&E@&E&E&E&E Ïd6d&}u&U&+U t B&{@&3q븏d6d&}@u"Ïd6d&E$u&&E&vt&>+s^ù FQSV.:t [YFCYY<:u.._CONTRMKBDLSTCAUXUSRINPOUTERR&=u-=t<3ɲRU Zr&È^<u^Ïd8&dd>&Eu^&ddD&dd>&E@u^&d2d8&:WPX t?_&d2._~r~_~`2<t9<t5<tC<t+<t'<t5<tC< tE< r:tъ'C s'Cx Ku묊< r&Cu t u CCbÊ&rrPXX&r>>^uu&E uh$u&]&;] r_&]&C&]?W<u`;br `C`<uL<uLL"_&E&M &Eðô?&&M&Us3&] u&@&]&] WSD[<t"&e< vCtS)[< v&e?_r?t^W&e_[&[Styr s&&Ý[S}tW_r[S32WSQY[< t<t&e_C&_&[S2WQyY< t<t &e__ Z<t&e< t< uF< u&e>>^u?&Mu&]&C&]&;] t%Pttt &M& +Mt@&&U&Ur;t^ tx<v I QxY[XSo[XSQXT+v S QPY[˻SQ@Y[CÒ[YEEESQ[YS u  TRUEFALSECC6*v2S QY[62C t 6SQY[CZ[.2C .SQY[C  d6d&Et RZ:t<t< w t &e3@32 2d6dQ8Y>^uQY>^u&MÏd6d@&3d6d&EHd>&}u^&d?@[^S>^uA>&&&M>r!;t#>?u t&M+3à^3ҏd_6d&MʋиB&QRY[r;u;t^[SD& u@ [SB&33&MO[S[SB&33PRB&33Y[PRӸB&uZX&MI[Sjt3۹!sË؋[_SM[_SJ?@dZ^_P>Y>^u ;t^&d?@d[XZ^_SQ _&&d&}tO&}tR&eZ&&s^3&Mt3 t>?u P+ʎ3X@^Ïd6dAU _s^Ïd_6dVU W9_r־} Ïd6d t(:uQ,Ar<s>t ;r÷9:dj6ddX6d u@:\Gs3ۊ t FC&u&û$3ۏd6dPuBS=U lZr0ظB3_r$?%O>I&R\ "^!/Licensed Material. Program Property of BORLAND.ÐЎ.+£F-s F3£HJF-@=rH`3H&JPX PuX tD\^3TVXZ0/Ul=s--------------------------------------- TURBO Pascal system B)Version 3.01A MS-DOS  8087 Math support Copyright (C) 1983,84,85 BORLAND Inc. --------------------------------------- Terminal: UP Include error messages!.t `&J9'S>tb   PX*,r1.d u: ߊ<t< uCÀ?ogged drive: ~Aw ctive directory: G2ҾV Q ork file: ; ain file: V # dit ompile un ave ir uit compiler ptions Text: ^+\Free: `+^ bytes ucompile ->  ø(Po٠/yemory jom-file Ycn-file >/t?minimum cde segment size: JTh (max % ) minimum ata segment size: V" (max 5 ) mnimum free dynamic memory: X  mximum free dynamic memory: Z n&O command line arameters: ^ 0V ) ind run-time error uit 0 CP8X*Osi.dP X (Y/N)? <u.:t .<uL.A.WR+M$+E>8C0R-4S,D-O(Q4M2C2H2O2D2I13A^3P3F0Q*XTURBO.MSG.PAS.COM.BAK.CHN\*.**.*5 Main file name +t M  f7,C Work file nameuB  c f2,d,% \SV] ^[Ӌ`C^RQ5 Loading 0 =m[ڋYZr-+ʴ?Nr$;tuO>6OC&dK&f]X ?File not foundJ0 _<t61 New File S[ Invalid directory File too big^K3@3>kt2 t/Workfile E not saved. Savekpuk l Saving    + Am$ٴVmٴ<3ɺ r/\^+A@r;ukAشVm  Disk full or invalid directory path Dir mask XxؾmF<*t0/t>/tStack/Heap: RLStack/Heap: X3i (minimum)  ZG (maximum) P&2 (X3ҹعG bytes)6 paragraphs3P ׊X0r r  rs  CEnter PCuf&i Searching+) Compiling>itw --> mu>ir>jt A%Հ>ju#ZWR9Compilation aborted lines >ju8>itRun-time error position not found >ju >ju$Run-time error position foundError 3j.tmD<td< r,0C,0C:jt C< uCM: < t2< s(<t*DF< s:u < tFF< uFC->tD.B Error found in above include file>t LbK///Minimum Code Segment sizet w%ãT]Minimum Data Segment size\t B5ãV(Minimum Stack Segment size&t XMaximum Stack Segment sizetZParameters00;<tCGÀ>u%>uCtd,f2,-þ<u +/ititi+À>hu>/t6>/u,,'Please Quit TURBO to run .COM file0L3<tFC&&A & Running 6LP&&ff\^k-hʹLQр>u>u]->-txþ:u tFGøD\f,dv,*mW^L^C\Sx5S{ t[3ù33VWlQ3ɾ52+TsTu t0Au u0A3X+vAOȰ ly_^@B'd mi< r :uCC A:GG u5?\t0\GGЀ@r=t t Gr*\Gt 2< vQW6_Yt CGr"+,/;<=>[]{|}*?+Vh^2ҿm3Ɋ tGt<.u<\u3 t uO. 2t F.Gþmm þma[f&Ь"Ћ2\OFF0U^P.C ttttÀ>tttʋދËދ3v!@@R @F Éz|a.kʶL2^^S^ ^K&P[\C= tY 9uG_s-tՀr khp8SRkhs>tPXCSI[QzW<t< s;CSN[ uSOn[ tt =P. CuvuS3ۈxPCXu[PX< r<PP^5X@/XñQS[Y.F t,QSC*s#P.*"uFCuX[YtXȵu>txH .>j8r *Line Col >t~Insert mOverwrite >t [Indent:t`طT;u3u<>\+t u B ut R[ oPXt uÃ0t1'd 2+r0<0u t+: ڋC7CRSV^[Zsmu<u<u D:sDZ<uD:tCD<uSu<-u<t <t<t<u3눀>t~ЊD:rrDCD:s]tWD tLK? s^  ,]0Find "Replace with rOptions.>jϳ| CR+ڋډ^Iv\x/ upC<0r<:s,0P .Z£Nwxtv(uu ;vr K;xst ŠstRS[Zrrb t uYuAtS[rr@uC;^>t(tptgORZrtJB뢋rD[((uP2 Search string not foundF+ ^J;rSS [+ںRډ ([Ë\^K<0r<:r u$dQYu dQY At z;|s Write block to filet=mJƋr%>AS Overwrite old mWEt~źq? Read block from filet=mCœs%R File m_R not foundaS^`+SˋG. X[G+ȉMdmAC|ӋGzM+ڋ$G Is%Gzzى| zeseGzى| C>tCRU [R+ڋډGSzB;ڋ|r;s  z+ډI[W IًGzQ[YW>u4zzB;r|;s|z+sˇSQ Y[z||u|>tMtJ2zzM|CXRV s^R$ AC;r Ê>  r"   rS[ס;\ta3ɋ;t A.k,:u S [63.kn |[r;s[ Ë;tSy[s3.k3 [.k,ȋ u 9 ).k,ȋ u ̋\;tL \R>u^kh [S[v R_>titrd;Ps\o<~V2 0 0;Vs-CR+ڇڋS[ CËKRrCrsj?rCr%r:S[KRrrKRrsCIf+ðsOKCr15rO_)S+RnrfsCr >OuCMr눋rP~S6KK;PVKX>t-~vR ZuS5[S ;tC[9R ?wSS?Zr+ڋ[u`&s2KK /r .kw;ڇrÊ< t?Hr1@r,rËKRr݉ne< tu3s(s~2ItxrË^ks^.:ks&:tS[;^sB,PXٰ K;\tr:uC< u C;^r..j&. tqC;^s< tu..j̀>tSC[B;s9;tC;^s< t< s@P_XuՊC;^s< u~À>t+>t;zr;|s ;r;s >tn>tT>tZ>tt>t6s t u.>u.kȊط gyڸR;zu 6;|u 6< u^ FtmC;^s;|s S[;zs*Ţ Fub>t:sy< tFu C;^sg.Line too long - CR inserted>} v y Q:uK;uú;sCˋCR+S*ÊȵstY6R t;u6z;u6|CFuN Ë`+r5+s-SG[WARNING:  byte(s) leftOERROR: Out of space1%<ug*** INTERRUPTEDSQr^RR+ڋ[U+sRdZYA[^ tY[ڋzRz|G|<1&vvxx;v+SS^B+ڋ[Z tlJ^|St[t úR.jȊ+ڊ*r!:r*.jȢ}>t\;vع;urG;tA. t 3.k-;rIIAWu;sSA uT.kȊЊ*Šr=u >u`*s.*v'RS[uZʈÈËI.k,Њ*ŠsZ.:ktt.ko6K. t:tFßP:sXÇt;rىt;rىSڻ+tˋC\ [;r.j*Ë^+v؎ u͋ËË >\KK;v8uCrËSK+K˺K tR[ [$頸隸>urPSQRLZY[XÀ>t蓳 DCAB                <>,[].*+-/$:=(){}^#\' D[E[EmEEECTCCCVD$DC CC D}D CBByE5CSLJǍǍǿBBEBw(?8p?Cd<^ir>ht>ub46>iu >irD>iuh >ir02h^CãLF+ãR>J>K>I>O\юɎٹDG>>>]./;CC\M>Q3 6%&>it w%$$ø%@L;c33L%ô<3ɺrɣG>iuش@$r;urL % %&%N;TsT&EP;VsV&EX&E ;ZsZ&E @G%+聳PQ %LYXr;u32u( 3u 2t\303J.3>iu t t P66.1.,.6%.".....-y->Q=./ Y-3a -NP[N;TsTx.CCP;VsVg.CCX>isR+N+PRPI.XCC;ZsZ:.[X> t +..6/PSQ>iu@؃@;Rcb+@L ;r R-,cZY[XQs">Qr>Qu>Qu UF]É>Q[.j3 tQ->u +\O>bF&6R,680 <uj<u<u<u<u<t {sY+[C, +v+@@+v+,3+.>Q.&--.M0t063-a.I0uJ)- u----uD-Cu--+06--z--% ]ZF30]F//thà\<r<st=<uT,.`-p+n@P.^-Y>\ u u{/u/QYI/Q(Z:2e*/,<uNl,/]6b3QP-)-X;XEbPH/c /XYtPk/XY+t2x*H,<u\,6b.^,/DWƺ.tPR.uɺX輺.t. Ժ^DY*C+<u$(b*s͊2) t 2)u< u.' t !ݽ)))) >bt))':\,;^|;`-66+#,6++].B]ZF]F.+-ȕPXO.-u3Ҋ t<.uG<\u3 tCE\2.0 00EE (( (C *T)iP6G666666v6>iui+3>it<3ɺH\G3;,B66P@X{K|)YZU+ t25(]F+‰;r(,9t>it >GȬvGXivv+(''âz2Q*Xu,)D*66.53 ,uqSQ6.s+-uQ*Y+tQ u,+t -Z .xnY]ZFNb t2Y[+t+<)>zu9+SQx-Y[>\s >\+0]UZF^&İFb+]X>{t-F^2NFF>{uK*uFNh&>+*u.~+>{Lq++F^C+F-'66UF>zt^6+GFN݃ t]Q6oS.Z([6O.x2Q6.MMFKM6VKM6Fu.']YS[Y*%U>u%'%2%v͊%u$$U2أPzPXzX+,]UvFwb8X->zuR]UP'UX>\ u-:>\u!+b$bHఱ$z$]t$,P!X>\ u_$ Y$] uN$G$$)]NU't'uv>)"@)XO6"2ƇDD +ٸ=m6Zش?D%Z DH$F> X]F(>\ rbË.;.t&n~t~u݃62+6DIxvQU(]Yb>xt>u3>u!>u b)b b^2+FFZF)63Q%&.%YA't]6'N'ue>}Kt&uFVA,!u !S'!#X"! 't &t P' XӉx& ut&u &ϋ$>xuƀ>\r>\wC.;.tYn~uF~u~tF^6W2BU.;.t(n~uNNNO66:u]6DF*9t6)&‹Dt,t'jt"ttt2tWt tE$ù-%u n.Ze$3%ɋuMt&3QY6Z`+^@bPA5&tQZ&&}YZ^b[bbX`\#%؋uRyPP66tty%tbt]XXy\t#ntk)%|t";trt%t;t%At>6p%t%%yPyXyM%tЀ>yt%$À>yt=%$$ԋu1%s`^ F+@bZ^\"%u' "6""^\]b"G$ϋu0@$u*>\r >\wvDZ^\bLU"Ë.$u H$u +-$Lb\""Ë.>#ߋu"h$ 1 1^$Cb\!*$uIS!8"!X@P!!$[t_$3҈\`^ t@b![u%QS v3J# ZX:z,;}4t~t.`>\ scZ6.;.tD^ t6G6o(XP^CN*u|GPoeuX[CZ "t^#t F"Xt/Fu%!u!t!u"Vu>\ s\Pa" XP:,+! X:,I! Y+ȋ.%6.G<6Q6eaY.G6.w>bwg[X+HHto[KKb !3Q3Q tu|~YQYR6h u.r2[Z+HHR6: 2[Z+HHY6AQPX t2R Zt;Y[6QKKRZt tE>.)@t Y[KKw:.=(F:Hf&P>aG)>\>Uu &WX&2]t$_ X&*t >tu*Hu%uXt JFY[3ɰ+ tI-t>w t uXH/uX.UN uQUNnQ uo>\rM >\ s >\u wR`>\u&b̰F>\u?}.4ya )Lb  ^1_>ltnYtih]FMN2+uYtK?U]F t F-F5 t F !À>\t>\r >\w6>\ s>\u>Wu>Ut >\rO6X+PZXPMX>\ s>\u t>Ut)_>WuM5) a~rR a>\ u u7O ->\u u!P>\ u uL  :\uu t.^:nt{,u  t;^uà\<tS< s5<u @t'<s!<s<s>`u .p~ u\ls:uFG ,+>V)_O!u\6P?^XPfXY## $$PX?D"" tV"t#b-L»jjS>\u.^yr+>\u b-Lfu [jjjS9[Z\,2.T!#X!#!!!!!!_tMtÀ>\r>\w \3ð2truuuAv)\)\tr t r+KB.^~ u.`~ ub uఱh2u&b̰; t t >bwvuvt>t^t Pø>ut>t(2t r%uufA2]u$u>Q=,t=)u t}|Vr r B rj9uQY u)*uSQY3 uR u 8D tv tA t t% AuX?!!!>#P!.^uXPX>##F##PS~C%uh[XtSP[>\ u>btf$K$O$POKvc&b̰`$gh [@+JfA] =/&b̰P9X3>\v"( uuQ Y t,uQY3 t t Q&b̰Y t <7\ t t >buQKj>\ u>btYb tf L` P7SX 1&P+>\uS.^rXP >\u1 X뾸۸M_P~X>\ulBi`) oQj 238u3a |s!S jvS[C YXgk P V NJZXJl!q#aY LE>PX tUz t tDi s'L t' ! u r %PT ~tut 1 r]upPqPqP{rP2pPqPqP{rPQYttZSQ)66Z/[ r.G70 .2 tCCt CCtCC.q $/QLZ/ t:, ZVTfbYrnl~zpQVYtÀ/SQd6z u u  9ZM[.?s4t  u .?t대u.?P/ t ?/hQYtÀ/SQ6aZ[S.?u u  [.?w#t tuq뤸 t/.?u t /su(%c t /9 4- 6k u t u     r Àuj RP u u7 *u% u u t ' R  u uu u u_a  ru Y;t u [Y:,u:t. t* t$,u>t>t ;tq, u u QR ZYÀ urte  X HQ u.Gu.G  S 8u'.Gu.Gt .W89'1 .Gt .Gt .W` .Gt Y(t%t tKttt t}) u\< r>bw\b< t <t<t<u.^.\u>n9<->l.^~ >.`~ >b >ఱ  3 uL  u qo  y s m u J Q Y23ùu(^6G ^\ u3=w LCtP Xt QuM Zt?QY u:$,Quv YQ: , Y9t_36uY3ù unF< Pg8iX3~ u 33ұ31!u. u3 u ø  t!~ P_ t X SZPBX uñ @HP5X 5 2+ 2  % ø| n   `ZP^XPBgB4P.G) /!k uc Q  + u   syF ø! !!PY&#X߸r""P@X?붸""P*X?  똸Gz  Zv b vT #mZL  t uF,)*  )؀>Wt>Wtr  T u nFC)bh`Xб ðPx z ?XVttEtpt3 uW.P  GX2b\ <u^` ^`XUW3Ê2KyS㋏Q XY[uU= t .WXU+ãXW]>\u u-b^ >\uu tá>Wu>Ut6PX>tX+ tPQbYX t>UtC_>Wu7>\ul nbHp.`.^ :l, u$;n|;p~-+nbXnu b)X) t=uH-+p+n@ b=t6=u)=u =u p a>UtT LU>\uH uk 3À>\u(7 u#])6V6XXXV3À>\u$ u.^8XWU3àWUu 8X4hX t ]Et tL::t^ 6>Ut͡X@t X@u x ÀÀ>Wt>W&t.À>Wr+X>Uuw ttPXtv8S)>Wt>WtrV>\ rE>Wr>Ut>bwc>bwX >bw2À>\u q^>\ t>\t>\ rC>Wr>Ut>bwQ>bwXX,>\t븆>\ t>\u&b̰[7.^b&n >\ r"t^H;`t@` "\) Qt A %RKZt .J+t u63Ë>Q=-tB=+uBG t t JQuùuEN r^6 uFFFFnջD t MFC3Ë>Q<'t<^t<#ugD<^t"<#t4<'uBG ^7<'uG='u߈CG A74@GCGSQÍY[8uD2 <$t7s3HGsφt PP,X>t PX>t PWXS>it+L& ;ftt u9[bȀ>ir.+t#@GL)r;tɡá+HHS+[À>it;rS+L&[QWV6>I;t6;r+΋ONF66DII;Ku^_YÀ>irlPSQRUBG33~PR.;.It6BGVZFB@GBEɃġIBGYZ*]ZY[XþeUю+&eUَюٹًпeUQَюٹYË.MF.Ë.MMF.á+eиZd.KKMMF\u.3ûtFVFXndQMMKKFYø3PBX EtksLo: uyX.D2M^MDFKu.>>uN3ۋ>Qrt uGCDD> u:tS[r..>:.3HÊD2.;t4nF t<tF:u:u+EuҊF+[..S2D. 2 AtIË.[.?CCSD 2Au.tS.[5CCCË>r+>Q=[tE=(uDG=.8>Q=]t1=.u0G=)$:;,.( )=^>Q:uGk tt>t)kc[SI?Ë>Q< v<{t=(*t >Q3?:R}$t.*u =*)u<}uZSQR 誀`SD_=~Z83:<@[G tSQR>[>u+ MO<tC< tG ? uCME:@+<>?<tC< tG,< uC:>8}9ZY[;<r,Q?8}Ys3 u@@ã<tPSQR }~>tI m~ h~蝬蝁 t1v~ *** Abort compilationUtʹ N~ ZY[XINTEGER CHAR REALBOOLEAN BYTE  TRUE FALSE MAXINT-DT! @ PI_BUFLENhHEAPPTRDOUTPUT8INPUT$CON$TRM(KBD,LST0AUX4USRrCBREAKCONSTPTRCONINPTRCONOUTPTR LSTOUTPTR AUXOUTPTR AUXINPTR USROUTPTR "USRINPTR\ERRORPTR         L&4z#6I]qXȌ1PROGRAMENDFORWARDEXTERNALPACKEDARRAYFILESETRECORDSTRINGOFABSOLUTETHENELSEDOUNTILNOTNILTEXT..:=LABELCONSTTYPEVARBEGINOVERLAY PROCEDUREFUNCTIONBEGINbIFNcWHILEcREPEATcFORcCASEdGOTOeWITHeINLINEsfTO}AIDOWNTO~IAMEMMEMW*/AND%#MODDIV SHLSHR+--+OR XOR53=t<>u>=}<=~> <(|IN=;WRITELNlWRITE"lREADLNkREADkDELETEmINSERTnGOTOXYnASSIGNiRESETKjREWRITEPjAPPEND3jCLOSEjERASEiRENAMEiSEEKjLONGSEEKjNEWoMARK_oRELEASEdoGETMEM7oDISPOSEUoFREEMEMZoSTRr3$ȋ >t%s > &=st +%6&=T`njhjQRȋӋČӃ_3hZYw 33SP&u&5njT&&E&E&E6 &<&D6&<&DÑ[_[S& &Ur3$ >njsW&&]s6 6&&\&D&D& &U&E&]<t&=&E&]& &U&&&]ȋӡ &E&]njKVuQhjJt1&&\&L&T&&])&E&]3É>hjW3 _3333>t&=ČӃ3+jr;sȋ[h&j&U[&=>h>j3>>pu2>qu+tȀu tq&p%Ltpp u qq>ru<u 2XZPRt5>ruLwt L<uLXXZPXZP 2=tt2tGU!]VQ6XZ<t FFY^Yr^QV6XZ9uFF^Y빋6XZ t >FF3PR>XZ3&=&r3p^`b_~ Â#+CSQRWV2P^_ZY[SQRWVLU^.C t^] _.u Ȏ+شJ.DT.DV..LQV[^YR><.D> t 8:>H.DJ t DFV3&l&n& &Pt & &Ptr\ 3ft>8JDô01 tú7 %  M Not enough memory$Incorrect DOS version$ Program aborted $P8D3l&n&XPuL6T9PV[. t53ҋ tSB[;t +NOJu^.;uPRVt2 tGW t:t \t\GFF.FG u=t_^Zr).B2Ί2Yr?Tr>늲V[ZSt L[YSЊ t[+L3ҿ. 2G3.< t< uGI.< t< tGI+tCJuғÈ>[YXSQ)>[ZXEEEESPkY>W2-+v G& :t󑻔CG&:t_&52>[IS38t28ur#>&r>38t->&ù@X62;vBF,<[ڋ_[ڋ+[Y_㑌[_^;sNO[XUPWSPحȭЭPP^XÜWU~ ë«XƫXثXX[];sòv;|;òh+r=r;jròI[XSrLtL&r<tÏdd#3^À>^uÊ^ [XSdRZd-f u RR6f\Zs^C User Break0w I/O Run-time error , PC=f Program aborted  yP[ËSQNJ݊2XXظbȸ6؉ y-C2'd 2+sut0C3?$ uCP+X0r% ru rsRZr2s tÊ-uCQYr -u=u-u[& 2A+^. 2A+Z62C6?:v6Ag[2+L6 G[262+ t'y6 A6 AGEtH 9uH -sH !vH wH rH Ë6 2G62Fڊ;v t u:ZYQd62F6 r&62+AV^NOAG&dd~XrH62+v;v3҇6&d[62Dd62G6 2F3+r@ tBQWV^_Yt@GJu3&d[&S>WPHB>>6%W[S>WPH u>lP[Xud6\26@6@[6:t22AG u tòp[Z Q t2uY **t2u[ 36Ñ[XS*r2A 6sCËFF6| 6D"22$[22 ;tNOG3t5 @3}Hu u3 @_  Q# A# 6G" t3 6"t@ "2܊ȀË$;øu;u@ ;øu;uH Ê$ t u ؁2ĜCӝW x'_s)yE /_sW /_3%tuP3W׹ _FG tBQRWV жd3۬%u tÊ؈%G t ,dr^_ZYBO V3E uJrX% ,?v x 22È3%tuPW6.>26,*4GW2 +C,* ۉ0_-^VF-_36.\;r50>*6,/s2ҋ0>*6,' Н>24s1.4wxE u  u>2X2%Ԁ@* 2tE%ĈE 2tE ĈE Ë*tFWV߇؇<v 3*2 t +ȋss s^_ù Ȫe &E u+ 2t&EȀ&e$t&EG3ۊE uJ uB3tGAɃFAG+t sNO+sGOE uwC*vyGG3 ֈ&=PsWG &'s&E_Ï8 DDDDEEEE&888uuuu5&8[ 66666[Z 6%6P2Xy"Āt%t:u R WGG_EEEE6% t@Ey.K;w6 FF.+sӓ.+sIu d'6$t >6 G^^ t6FF=ws &>&d t_6<#t <@tG3<#t<@uGt6QW 26:vt*Fu*_YQW:_Y u6<#t<@t<*t<$t <+t <-tG><73۲ 2<+t<-u$<#t<@u0<*u<$u#tGt6<.t<,u2 t 0u:x<rSa[:><72u u ;tŠ: y2*** x_t 6gut6E$u ;t6E-&: y602txF uN06uÀ t6*G t:6<+u ;t'6-!<-u ;u6 <.t<,u u6GuË36 x9t4@ x*Ɂ wR^!ƃyָ[Y Q؁P  X KDv2F[ _S;uDv5W} _s&>Ft &EEL&E&E ^"2Fd6d&E$t&e&M>^u>^uPtD&€t&E>Fs&E&]&]&] tYB&33&Mr+s33QʋиB&Z&u&<tFBu B&`&E@&E&E&E&E Ïd6d&}u&U&+U t B&$@&3븏d6d&}@u#Ïd6d&E$u&&E&vt&>s^ù QS.:t [YFCYY<:u.._CONTRMKBDLSTCAUXUSRINPOUTERR&=u-=Ft<3ɲRU CZr&È^<u^Ïd@8B&dd>@B&Eu^&dd@DB&dd>@B&E@u^&d2d@8B&:WPX t_&d2._~r~_~`2<t9<t5<tC<t+<t'<t5<tC< tE< r:tъ'C s'Cxf Ku< r&Cu t uO CCbÊ&rrPX&r>@>^uu&E uh$u&]&;] r_&]&C&]?W<u`;br `C`<uL<uLL"_&E&M &Eðô?&&M&U\s3&] u&@&]&] WSD[<t"&e< vCtS)[< v&e?_r?t^W&e_[&[St&r s&&Ý[S}tWH(_r[S32WSQY[< t<t&e_C&_&[S2WQxY< t<t &e__ Y<t&e< t< uE< u&e>@>^u?&Mu&]&C&]&;] t%Pttt &M&+Mt@&&U&Ur;t^ t <v I QxY[XSo[XSQWX+v S QPY[˻SQ@Y[CÒ[YHEEEESQ[YS% u% TRUEFALSECC6*v2S QY[62C t 6SQY[CZ[.2C .SQY[C  d6d&Et RZ:t<t< w t &e3@322Fd6dQ8Y>^uQY>^u&MÏd6d@&3Dd6d&EDd>@B&}u^&dF?F@[^S>^uA>@&F&&Mr!;t#>F?u t&M+3àG^3ҏd_6d&MʋиB&QRY[r;u;t^g[SD&s u@ [SB&33X&MO[S~[SB&338PRB&33)Y[PRӸB&ZX&MI[S9t3۹!sË؋Ñ[_SM[_SJF?F@dZ^_P>Y>^u ;tG^&dF?F@d[XZ^_SQ _&&d&}tO&}tR&eZ&F&RsG^3&Mt3 t>F?u P+ʎ3X@^Ïd6dAU s^Ïd_6dVU W_r־} ÏdT6d t(:u,Ar<s݀>t ;r÷9:d6ddX6d ug@:\GPs3ۊ t FC&u&ûb(3ۏd6dPuBS=U Zr0ظB3r$?b)>܋&R\ "^!/Licensed Material. Program Property of BORLAND.i߸3Ў.+£r-s r3£tvr-@=rH3t&vPX PuuX tr3\[ۢ--------------------------------------- TURBO Pascal system ?Version 3.01A MS-DOS BCD real support fCopyright (C) 1983,84,85G BORLAND Inc. --------------------------------------- Terminal: U Include error messages!Zt `&v+S>tb  PX.,r1.d u: ۊ<t< uCÀ?,ogged  drive: &A*w ctive directory: G2Ҿ Q ork file: ; ain file: V # dit ompile un ave ir uit compiler ptions Text: +Free: + bytes ucompile ->   ø-Pՠ[yemory jom-file Ycn-file >[t?minimum cde segment size: J (max q) ) minimum ata segment size:  (max a ) mnimum free dynamic memory:   mximum free dynamic memory: R n&O command line arameters: ^ \V ) ind run-time error uit 0 PX/Osi.dPX (Y/N)? k<u.:t .<uL3AK3W/M|/EOC&K&X File not foundJ0 _<t1 New File SL[ Invalid directory File too bigK3@3>t2 t/QWorkfile E A not saved. Savepu  Saving  i/ AԴVԴ<3ɺr/+A@r;uAԴVy Disk full or invalid directory path dDir mask X ԾF<*t0[t>[t@Stack/Heap: ~LB'Stack/Heap: 3 (minimum)  (maximum) P& (X3ҹعG bytes) paragraphs3PҊX0r r  rs  CoEnter PCuf&L Searching+)5 Compiling>t --> u(>r>t A3Ѐ>u#RCompilation aborted lines >u8>tRun-time error position not found >u >u$dRun-time error position found=Error 3Ztmr<td< r,0C,0C:t C< uC: < t2< s(<t*rF< s:u < tFF< uFCY>)tD.B& Error found in above include file>t LK[[[:Minimum Code Segment sizet wq)ãMinimum Data Segment size\t BaãMinimum Stack Segment size&t Maximum Stack Segment sizetvParameters\\;<tCGÀ>u%>uCt00Yþ<ud/[ttn/3À>u>[t6>[u,'Please Quit TURBO to run .COM file\x3ۊ<tFC&&A &l Running 6x P&&ffY:ɴL̀>u>u]Y>Ytxþ:u tFGørl00?/W^LCS9S{ tq[3ù33VWQ3ɾC:2+TsTu t0Au u0A3X+vAOȰ 󪾘y_^@B'd < r :uCC A:GG u5?\t0\GGЀ@r=t t Gr*\Gt 2< vQW:_Yt CGr"+,/;<=>[]{|}*?_/Vh^2ҿ3Ɋ tGt<.u<\u3 t uO. 2t F.Gþ þa[ˬˋ2\OFF0U^P.C ttÀ>tsƋދËދ3!@@~" /@r Éa.k2S w~Td[C= tY 9uG_s-tՀr tPXCSI[Qz<t< s;CSAS[ uS Tn[ tt T.CuvuS3ۈxPCXu[PX< r<PP^5X@/XñQS[Y.F t,QSC*s#P.*"uFCuX[YtXȵu>txH.>j8r *Line Col >t~Insert mOverwrite >t [Indent:t`طT;u3u<>+t u B ut R[ oPXt uÃ0t1'd 2+r0<0u t: ڋC7CRSV^[Zsmu<u<u D:sDZ<uD:tCD<uSu<-uX<t <t<t<u3눀>t~ЊD:rrDCD:s]tWD tLK? s  ,]0Find "Replace with rOptions".>jϳ| C~+ڋډI#/ upC<0r<:s,0P .Z£NMwt(uu ;r K;st ŠstRS[Zrrb t uYuAtS[rr@uC;>t(tptgORZrtJB뢋rD[((uP2 Search string not foundF+ J;rSS [+ں~ډ ([ËK<0r<:r u$dQ菾Yu dQwY t ;s Write block to filet=r%>S Overwrite old WEt<3s$% Unable to create &6xP [6PV+ʃvA@tr*+tIu#=sBError closing file^XA=Disk full޴>&/q1? Read block from filet=s%R File _ not foundaS+Sˋs. X[s+ȉyECӋsy+ڋ$s Is%sى es  esى C>tCRU [~+ڋډsSB;ڋr;s +ډu[W uًsQ[YW>u4B;r;s+sˇSQ Y[|u>tMtJ2MCX~V s~$ AC;r Ê>  r"   rS[ס;ta3ɋ;t A.k,:u S [63.kn |[r;s[ Ë;tSy[s3.k3 [.k,ȋ u 9 ).k,ȋ u ̋;tL ~>u^ [S[v ~_>titrdTs\o<~V2 0 0;V辸s-C~+ڇڋS[ CËK~rCrsj?rCr%r:S[K~rrK~rsCIfË+ðs{KCr15rO_)S+~nrfsCr >{uCMr눋rPS6wwTVwX>t-vR ZuS5[S ;tC[9~?wSS?Zr+ڋ[u`&s2KK /觶r .kw;ڇrÊ< t?Hr1@r,rËK~r݉ne< tu3s(s~2ItxrËks.:ks&:tS[;sB,PXٰ K;tr:uC< u C;r..j&. tqC;s< tu..j̀>tSC[B;s9;tC;s< t< s@P_XuՊC;s< u~À>t+>t;r;s ;r;s >tn>tT>tZ>t>t޴s t u.>u.kȊط gy邴~;u 6;u 6< u^ FtmC;s;s S[;s*Ţ Fub>t:sy< tFu C;sg.Line too long - CR inserted>} v y }:uK;uú;sCˋC~+S*ÊȵstY6~ t;u6;u6CFuN Ë+r5+s-SG[WARNING:  byte(s) leftOERROR: Out of space1%<ug*** INTERRUPTEDSQrRR+ڋ[U+sRdZYA[ tY[ڋRG<1&;v+SSB+ڋ[Z tlJ|St[t ú~.jȊ+ڊ*r!:r*.jȢ}>t;vع;urG;tA. t 3.k-;rIIAu;sSA uT.kȊЊ*Šr=u >u`*s.*v'RS[uZʈÈËI.k,Њ*ŠsZ.:ktt.ko6w. t:tFßP:sXÇt;rىt;rىSڻ+tˋC\ [;r.j*Ë+v؎ u͋ËË >KK;v8uCrËSK+K˺K t! R[ [$HB>uPSQRLZY[XÀ>t; DCAB                <>,[].*+-/$:=(){}^#\' IIII+JSJGGG%HH|HnGxGSHdHHdG4G>GIGfS8˫GFIFŀCv<ʗG_@@@&>r>t>ub46>u >rD>u >rB12Cãxr+ã~>v>w>u>O쏌юɎٹ4G>>> 폹./;CCy>}3 #"$%&'()-/+! 1D7 b)R>t wb)b(b(øb)@x;c33xb)ô<3ɺ3躯rɣs>uش@b(蜯r;urxe)e)&%z;s&E|;s&E&E ;s&E @sb)+)PQe)xYXr;u325u(U3u E3t3x3.3>u 1t 1t P6~.y.t.6m.j.g.d.+V.-L./B.->}=./ -3a . z|[z;s.CC|;s.CC>s~+z+|~P.XCC;s.[X>'t s..6F0PSQ>u @؃@;~cb+@x ;r R-,cZY[X}s">}r>}u>}u UF]É>}[.84 t}->)u +{l&6,6 0 <uj<u<u<u<u<t Y +[C)- 6,C, @@;,+-3*,V.>}.&#A.>.I.0t063*..0uP) . u . ..--ur-Cu--+_06- ---+ ]Fu0]F80I/tbà<r<sn=<uT-.-+@P.-Y> u u/u 0QYI/Q)Z:2*/,<uN,/63QP2.)`-X;EP/cM/XYtP/XY+t2*,<u\\,6.--F/rWl.tP.uoXb.t"/ zrY[*C*,<u$:(*s͊2) t 21*u< u4' t r*)))) >t))':,;|;-66+_,6++.B]F]FV.g-ȕPXO>.O-u33Ҋ t<.uG<\u3 to9\(2(.0 00EE )) )CH*)P6s6666666>u+3>t<3ɺ3\s3w,Ґ6 6P4X?)YZU+ t2q(]F +‰ ;r(S,ɐt>t >sdsX +('' â2Q2+Xu,**6  6.)3E,uqSQ6.+uQB*Y,tQ u@,,t - .nY]FN t2Y[+t.,x)>u9+SQ-Y[>s >0]UF^&#İF+]X  >t-F^2NFF>uK*AuFN&z+*Iu.~+>L+Y+F^C +F-R'66  UF>t^6+G#FN݃ t]Q6oS.([6O.2Q6.MMFKM6VKM6Fu.;" (]YS[Yf%U>#uZ%'R%2#D%v͊%u1%+%U#2أPPXX+2]UvFkb8X->uR]UP'X> u- :>u!+%Hఱ7%$]x%,P!X> u$ $] u$$$)]N#  U*(t"(uvz)"|)XO6 "2Ƈrrd/ٸ=ҤZش?ryZ r$F>訤X]F1)> rË.;. t&n~t~u݃62+68IvQU(]Y>t>u3>u!>#u b)b b^2+FFF63Q%L&.%YA(t]6''yue>qK&uFVA[!uuƀ>r>wC.;.tYn~uF~u~tF^6W2BU.;.t(n~uNNNO66:u]6DFt*9t6e&RDt,t'jt"ttt2tWt t9$ùi%u n.$3&YuM&3QY6+@bPAq&tQ&&}Y[bX $%huRPP  66%XX#ntke% t";r%t;t9&At>6%t%&PX%t>t%%=À>ty%$=$du1%s F+@"?%u'"67#""$_u0|$vu*>r >wjDL"Ë.@$u $u  -$L^"Ë.> $ou"$ 1 1$C)"f$uIS!t"!!X@P!!=$[t$!!3҈ t@!u%QS j3#y NZX:n,;}t4t~t.T> sWZ6 .;.tD^ t6G6o (XP^CN*uGPuX[C "=t#1t '+"t/qu%!u!t!uT"̑t.',##:FmH~e+F Fs ?6 )I"<h="u[6 CR[C6 6 6  "/[XC6 !t" X!)B >u> s[P" IXP:,g!+ X:,!x HY+ȋ.a6 .GNk6 Q6eY.G6 .w>w[X +HHt[KK !3Q3Q tu?|~YQYR6 0!u.r2[Z +HHKR6 v0!\2[Z +HH"Y6 AQPX t2RL =Zt;!Y[6 QKKR4 Zt tE>")@ =t Y[KK:.=&(F:#H &P>ar)>>u &:&2㠉t`S X&*t -1 >t<t33SQu =>u*u %$uTt  JFY[3ɰ+ItI-At>w t u/$uXjUN uMQUNnQ uo>rM > s >u R`>u&̰F>u?24){  `>tYth]FMN2+uYt?]F t ZFiFq t FN ]À>t>r >wt6> s>u>u%>t &+>rO6 X+ %PZXPMX>#  s>u t>te_>uY`)O~ > u u7 ->u u!P> u uP\ :uu t.:nto,u  t;uà<tS< s5<u @t'<s!<s<s>u .~ us:uFG,g>)_%u6P{XPX:(( ))PX?9XD}& t&h#-L'»+o1oS>u.+>u -Lu [Co=o7oS9[Z,2.%['% b'%1 %% %%%txtÀ>r>w 3ð2truuiA!@j)P)tr t r+?B.~ u.~ u衎 uఱ#2u&̰#s# t@# t T#>wQ#Tuv#>tt ø!>-uti!>te!d2t 6!Pr%uuZAH!16!(26!u$u>}=,t=)u C%}|Vr rB ruuQY u)fuQY3 u u t %t$ t$ t $ t}$}uX{[%#&+&>~#P&T.u0XP7X:'i''q'PS~7%[XtSP> u>tfk(((POc&̰(h @gfR}]ykC&PY9Xo>j"D( uuQ Y t,uQY3 t t Q&̰Y t <f t t >uQC> u>tYe ti `L PsSX m&Pg>uS.:XPE>u1- X뾸۸M_PX>ul6- o$ 23tuR3a !S S4G Xo PEVG?JZXl!q#aY LE><P6X tIz t t8i sP t' ! u  aT ~tut7 1 r]uNuPuPDvPvP2NuPuPDvPvPQTYttZSQ)6 6Z/[ r.GǑ0 .2 tCCt CCtCC.v /QLZ / t:, ZX f]rp~tQYtÀ/SQd6 z u u N 9,ZM[.?s4t ^P u .?t0대u.?D/ t 3/hQJYtÀ/SQ6 aZ[S.?u u  [.?w#t tu뤸 t/.?u t /u(%c t /94- 6  t u  ,  r $Àu RP$ u u7 *u% u u  c   u u u uc  ru& Y ;tO u [Y:,u:t. t* t$,u>t>t ;te, u u QR ZYÀ urt  HQ u.Gu.G  S 8u'.Gu.GtU .W8h'` .Gt5 .Gt) .W .Gt Y(t%t tQttt tq)5u< r>wb< t <t<t<u..u>n9<!>.~ >.~ $ > >ఱ  3> uR  u&      u  Q0 Y23ùu(^6G  u3=w LltP5 Xt9 + uM t?QY u:,Qu YQ:, Yot3luS3ùunF< P2X3u 33ұ3gu. u3 u øJ  t P t# X #PX uñ  @HPxX _ 2U 2Is ?i % ø| < $ ^PXkhQ _} uu{c Q P  E K~k øo%e%j%P?#X ߸&&PX?붸&)'PzX?  똸G plZ  KZ  t uFs|) } d)؀>t>trnT  u nF(\)б ðP X#ttIttt3 >uW.P  XX2䣎 <u 3Ê2KyS㋏Q XY[u=t .U+ã#]>u u-b >u tá%>u%>t&6 PX>%t%X+  tPQ7YX t>tT_>uH>u H.$.1:, u$;|;~-+u )) t=uH-<+@ =t:=u-=u = u  n>ta Y>uU ux 3À>u(D u#)66X3À>u$$ u.83àu EAh t ]Et &tL::#t^6>t͡@t @u x ÀÀ>t>&t.À>r+>u ttPXt8O)>t>trc> rE>r>t>wc>w+>w2À>u ~> t>t> rC>r>t>wQ>w,>t8> t>u&̰hD.&> r"tH;t@ "!) t  ,RRZt J2t u>t 63Ë>}=-tB=+uBG t t JWuùuKN r^< u FFFFFnջr t MFC3Ë>}<'t<^t<#ugr<^t"<#t4<'uBG 7<'uG='u߈CG} 74@GCGSQ'Y[8ur2 <$t7s3HGs/$t PP,X$>%t PX%>&t PWX&S>t+x&  ;ft  t u[bȀ>r.+t#@sxr;t`ɡá +HHS+ [À>t;rS+x&[QWV6>u;% t6;r+΋ONF66Duu;wu^_YÀ>rlPSQRUBs33~PR.;.ut6BsV~Fp@sp~]ɃġuBsYZ~]ZY[Xþ$ю+&$$َюٹًпQَюٹYË.MF.Ë.MMF.á+и.KKMMFu.3ûFFnQMMKKFYø3PBX st#s': uyX.r2M^MrFKu.>">uN3ۋ>}rt uGCrr>" u :tS[r. . >":.3HÊr2.;t4nF t<tF:u:u+suҊF+[..S2r. 2 AtIË.[.?CCSr 2Au.tS.[5CCCË >r+>}=[tE=(uDG=.8>}=]t1=.u0G=)$:;,.( )=^>}:uGkTL DtHt>t8)# vË>}< v<{t=(*t >}3?:R}$t.*u =*)u<}uZSQR  |)`譮S&_=&yZf13hjn)[G tSQR>"x[>)u+y{<tC< tG ? uC"yEhn+jl?<tC< tG,< uCh)1>f'y9ZY[;jr,Q?fyYs3 u@nãjtPSQR y>)tI y yU| t1y *** Abort compilation toʹ y ZY[XINTEGER CHAR REALBOOLEAN BYTE  TRUE FALSE MAXINT_BUFLENhHEAPPTRDOUTPUT8INPUT$CON$TRM(KBD,LST0AUX4USRrCBREAKCONSTPTRCONINPTRCONOUTPTR LSTOUTPTR AUXOUTPTR AUXINPTR USROUTPTR "USRINPTR\ERRORPTR        L&4j{&9Mau5+XPROGRAMENDFORWARDEXTERNALPACKEDARRAYFILESETRECORDSTRINGOFABSOLUTETHENELSEDOUNTILNOTNILTEXT..:=LABELCONSTTYPEVARBEGINOVERLAY PROCEDUREFUNCTIONBEGIN(gIFgWHILEgREPEAThFOR4hCASE iGOTO"jWITHKjINLINEjTO}AIDOWNTO~IAMEMMEMW*/AND%#MODDIV SHLSHR+--+OR XOR53=t<>u>=}<=~> <(|IN=;WRITELNpWRITEpREADLNvoREADzoDELETEMrINSERTkrGOTOXY\sASSIGN+nRESETnREWRITEnAPPENDnCLOSE oERASE\nRENAMEQnSEEKwnLONGSEEKwnNEWysMARKsRELEASEsGETMEMsDISPOSEsFREEMEMsSTRrVAL s BLOCKREADq BLOCKWRITEqCHDIR rMKDIRrRMDIRrGETDIR!rOVRPATHAr RANDOMIZEssMOVEsFILLCHARsEXITtHALTtPORTW_tPORTctFLUSHoTRUNCATEnEXECUTEinCHAINdnINTR>tMSDOS5tCRTINITtCRTEXITtCLRSCRtCLREOLt HIGHVIDEOt NORMVIDEOtLOWVIDEOtINSLINEtDELLINEtDELAYtCHR*|ORD$|COPYN|LENGTH0|POS@|CONCATo|SUCC{PRED{UPCASE@~TRUNC{ROUN& D{ODD|ABS{SQR{FORM}RANDOM|INT{FRAC{ PARAMCOUNT|PARAMSTR|LO{HI{SWAP|IORESULT|EOF|EOLN|SEEKEOF|SEEKEOLN|FILESIZE| LONGFILESIZE|FILEPOS| LONGFILEPOS| KEYPRESSED|MAXAVAIL}MEMAVAIL|PORTW}PORT}ADDR }PTR!}OFS7}SEGg}SIZEOF}DSEG}CSEG}SSEG} 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 16PROCEDURE FUNCTION 17THEN 18TO DOWNTO 20Boolean 21  22  23  24  25  26  27  28Pointer 29Record 30Simple 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 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 76Overlays forwarded 77Overlays in direct mode 90 not found 91Unexpected end of source 92Unable to create overlay 93 compiler directive 96Nested include 97Too many nested WITH's 98Memory 99Compiler(ͫCopyright (C) 1985 BORLAND IncRD/No Terminal selectedP23.' tC.PJXuËCKu.&2P2 XHur!.PSr.[XPSPSPS[XÜPSPS[Xûm릻} dPSQRVW..FFGG..#..,.=_^ZY[Xÿ2.t.OOK2.v t0.G u[_)PQYX%;u;&E&]P X[S>r3$ȋ >t%s > &=st +%6&=T`njhjQRȋӋČӃ_3hZYw 33SP&u&5njT&&E&E&E6 &<&D6&<&DÑ[_[S& &Ur3$ >njsW&&]s6 6&&\&D&D& &U&E&]<t&=&E&]& &U&&&]ȋӡ &E&]njKVuQhjJt1&&\&L&T&&])&E&]3É>hjW3' _3333>t&=ČӃ3+jr;sȋ[h&j&U[&=>h>j3>>pu2>qu+tȀu tq&p%Ltpp u qq>ru<u2XZPRt5>ruLwt L<uLXXZPXZP 2=tt2tGU!]VQ6XZ<t FFY^Yr^QV6XZ9uFF^Y빋6XZ t >FF3P>XZ3&;&3p^r`b_~ Â#+CSQRWV2P^_ZY[SQRWVLU^.C t^] _.u Ȏ+شJ.DT.DV..LQV]^Y><.D> t 8:>H.DJ t DFV3&l&n& &Pt & &Ptr\ 3ft>8JD ô03 tú5 #  K Not enough memory$Incorrect DOS version$ Program aborted $P8rDk3l&n&XPuL6T 9PV[. t53ҋ tSB[;t +NOJu^.;uPRVt2 tGW t:t \t\GFF.FG u=t_^Zr).B2Ί2Yr?Tr>늲V[RSt L[YSЊ t[+L3ҿ. 2G3.< t< uGI.< t< tGI+tCJuғÈ>[YXSQ#>[ZXEESPY>W2-+v G& :t󑻔CG&:t_&52>[GS38t08ur!>&r>38t->&ù@X62;vBF,F[ڋ_[ڋ+[Y_㑌[_^;sNO[XUPWSPحȭЭPP^XÜWU~ ë«XƫXثXX[];sòv;|;òh+r=r;jròI[XSrLtL&r<tÏdd#3^À>^u^ [XSdRZd-f u RR6f\Zs ^C User Break0w  I/O Run-time error , PC=f Program aborted  yP[ËSQNJ݊2XXظbȸ6؉ y-C2'd 2+sut0C3?$ uCP3X0r% ru rsRZr2s tÊ-uCQYr -u=u-u[& 2A+^. 2A+Z62C6?:v6Ag[2+L6 G[262+ t'y6 A6 AGEtH 9uH -sH !vH wH rH Ë6 2G62Fڊ;v t u:ZYQd62F6 r&62+AV^NOAG&ddXnH62+v;v3҇6&d[62Dd62G6 2F3+r@ tBQWV^_Yt@GJu3&d[&S>WPHB>>6%W[S>WPH>wP[Xud6\26@6@[6:t22AG u tòt[Z Q t2uY **t2u[ 36Ñ[XS*r2A6s( CËFF6| 6D"22$[22 ;tNOG3t5 @3}Hu u3 @_  Q# A# 6G" t3 6"t@ "2܊ȀË$;u;u@ ;øu;uH  t3> uދ:vއ׈*Ȁ(r߉>&>06΀r 3Ҁr ߊ2 t uus^uTÆއ*s6Ҁ u׊2,ruƀuu333À26 to tq233ҿG- u ߊ2s &Nuu͑ƀu tɑ26 u333 t*;u ;u:&r *&Nu -tOs*&r;u ;u:&ƀu uYr r[333s[É3Հ倈.΀6>WVQY^_WVQY^_WVQY^_WVQY^_R3ZyRZƀtt:u t ;u;u: u33Ê yڸ u xy x3_Yڹ33 Sr!Et*s2< r ЊRZ uy < r [ŀt-j t yYKy t.It@ux, uðE++ yٰ-/ s:  tF0CË]U u00FFuÊPR,MZXuQvYhì) x-Sx9?+{Η@ uÀ΀QRSPYYYYs uÀ^_ZY[WVǀuπ*r< s t33øËڋ tǀuXSQR[ _S;uDv5W} _?s&>t &EEL&E&E^"2d6d&E$us&M>^ujP>^u`PtD&€t&E>s&E&]&]&] t B&33&E@&E&E&E&E &eÏd6d&}u&U&+U t B&|@&3r벏d6d&}@u Ïd6d&E$u&&E&vt&>,s^ù E!QSU.:t [YFCYY<:u.._CONTRMKBDLSTCAUXUSRINPOUTERR&=u-=t<3ɲRU Zr&È^<u^Ïd8&dd>&Eu^&ddD&dd>&E@u^&d2d8&:WPX t>_&d2._~r~_~`2<t9<t5<tC<t+<t'<t5<tC< tE< r:tъ'C s'x Ku묊< rCu t u CCb>>^uu&E uh$u&]&;] r_&]&C&]?W<u`;br `C`<uL<uLL"_&E&M &Eðô?&&M&Us3&] u&@&]&] WSD[<t"&e< vCtS)[< v&e?_r?t^W&e_[&[Str s&&Ý[S}tW_r[S32WSQY[< t<t&e_C&_&[S2WQ|Y< t<t &e__ ]<t&e< t< uI< u&e>>^u?&Mu&]&C&]&;] t%Pttt &M&+Mt@&&U&U4r;t^ t<v I QxY[XSo[XSQXi+v S QPY[˻SQ@Y[CÒ[YEESQ[YS% u% TRUEFALSECC6*v2S QY[62C t 6SQY[CZ[.2C .SQY[C  d6d&Et RZ:t<t< w t &e3@32o2d6dQ8Y>^uQY>^u&MÏd6d@&3d6d&Ead>&}u^&d?@[^S>^u$>&&&MXr;t^3ҏd_6d&MиB&QR(Y[r;u;t^.[SD& u@ [SB&33&ME[S+[SB&33PRB&33Y[PRB&ZX[St3۹!sË؋Ñ[_St[_Sq?@dZ^_P>Y>^u ;t^&d?@d[XZ^_SQ _&&d&}t4&}tR&eZ&&s^3&}t3&u^Ïd6dAU s^Ïd2_6dVU W_r־} Ïd6d t(:u,Ar<sX݀>t ;Ir÷9:d6ddX6d u@:\Gs3ۊ t FC&u&û(3ۏd6dPuBS=U Zr0ظB3r$?)>܋&R:\ "^!&@0a9L)JCOMUU.ۉFF]UURۉFF]UU~WALLs3]UU]UULLP~GY+}.AFQ~FW~F&2p_&YItF]UUI=t+0%*** FATAL ERROR: ~3|]QUUF;F| FFFFF]UUF;F FFFFF]UU~N=HP~&E2= tHY# u~WPq~W~_&2= t~W~&2H_&]UUL~ ? (Y/N): (~* F2=YtYes6)F2=NtNo u2 ]UU0123456789ABCDEFFFFFFPY+~1IFQFWF%.,2_CFFYAtN~W~]lUU~W~&EL~&EN]UU~WFP~X&;ELu~&EN2 u2~W~&EL~W~OWYy~&ENFP~-Y;wF2 u$WSeek read errorPI6FP~Y;"WSeek write errorP~WF$~WF~W~OW~F&EL]UU~W~&EN2 u(~W~&ELoy~W~OWCc~Yރ]UULL~WFPP`PF2Y+F~W~WF2_OW~ W LLFPFP݋F;F|T~W~&ELPP~OW~ FW ZLLPF+FP܋FF]UULL ~WFPP LLPF2Y+PFP8F~W~ W~WF2_OWFI~&ENF;F|^~W~&ELPP~ FW~OW LLPF+FP~&ENFF]UU~ ~ 4u~ > =ݸP Pݸ PHLߍWڋ=tHP;FtHY# u3~Wݸ Pݸ PB@Pޱ<] UU~4u:~j~~W~3ݸ P~(@PޱG]UUUvU^6G@^6G^6G=tG^6G@^6G^6G^6Ŀ W^6G^6Ŀ W^6zW^6G^6z2FF2]yFFF 2䈆yPyHY+}&AwQwW /L_yYItwy܍~ u y7yWP@ފy2@yyݗW L_yľ 8Py2Y uy2䈆~WFFP~ 2Y+_&~WFP~ ^ Y+_&2 ] UUF2乀=|= ~!= |= ~=|=~ =|=~*~WCtrl-F2P@YPܱ= t~W= t~Ww=t~WY= t~W}9=t~W]h~WF2乀PJڊF2=~W~(+128)&۱ڍ~W~ٱ]UUUvU^6&bۋ^6;G$}FPFF2 ]UvUyUvvU^6Oً^6W^6Ջ^6G=tHP^6G=}HY#P^6G=~HY#FF2 ] ~W^6G2P^6G2P.׿(^6׍~W~؋^6G2Pٱ؋^6G2P۸ ۸ }P~d=tHY P SL4Y ui^6G2P]۸ i۸ c3u F2HF Lum^6&W^6&׋FPٱ؋^6G2= u5 ^6G2P) Pֿ(^6oPՍ~0PY+~3IFQP PPYAtN(V^6_չ (LUP^6G2P=ڸ$Iڸ0P9F4Y u]UvU^6G2= uԁ^6G2P} Pԋ^6&W^6&֋^6G2Pױֹ vLu ^6G(s^6|d]L~&WL\ָF*(?~LlԊF2bP~ uF2GʈF*BF29P ٸ0P9ٸ$u K F*2+ ]'UU&UvUsUvvUBUvvvUUvvvvU^6GH^6G^6G=t^6Ge*Prӹ Ӎ~W Ӎ~W~ԍ~ՈF.F.2 ]+.FFFF_W^6WFF_kѹ9L^6Fk}Աԍ_pԱu F@F9XL_JԱԋ^6Fk,Աu FHFF;F~W^6Fk>ы^6FkW^6Fk ы^6FkWЋF@FFHFF;FF;F|>nыFPFPF;F>RыFPFP]LLF>0ыFPFP]^6WPYF ЃQHڋF?u FOF~WFNj^6WHѸF^6W4u|F =t<PЋ^6WWꍾ_lЋ^6W-^6;Gu'FF~FkW_rr~WPFPy^6WHиPFY+}WAFQF- =t>P'Ћ^6W~FkYItF~WFF2 ]~fѸU PϹRL4uU{r_9*** WARNING: Unable to sort Terminal names - Press RETURN:I[C&+:]WUUVUvUL~W_&(~ΊF2= u F2PӸ P~uEF2P~W~&2@_&~W~&2_WF2_&F2=tHPF2PY;tHY P~=HY# u:2PX PNPD+~W~&2H_&/F2=tHP^6G2Y# u ^6G(~]UvU^6Oϸ>FP-PFP^6ϸl]UvUF;F}HPF;F~HY#F F 2 ]UvULL~du ~&2~&~~ W~D~WF=tH_&]UvU]̋^6@W~W]UvU 0̋^6 WW^6 θ PkR]UvU ˋ^6lWl]UvUPFY+}AFQYItF]UvUL?^6Zm͸\ Pˋ^6G2 uE~&2z^6A2P P^6͸ Pt[˿(~*Jˋ^6G2PF2= tHY# u~&2䗋^6A2F F2FF2Pϋ^6G2ϋ^6G2uߊF2P~WF2P^6G2Y;tH_&]UvUSF^6G2 u9~ V&P Pr^6˸ PV=ʊF24u# ɍ~W^6G2 uɍ~W~ W~W~WF2P^6G2Y# u FF2 uD~ F&eL~ &PFPFP@u F >ɋFPFPpF24u-Xދ^6M˸^6ʸK7L~ &PFPFP4u ȋFPFPWF] UvULL~ &2Feȍ~WFPFPFP7~ F&] UvULLPFY+}AFQݸ_PYItFPFY+}AFQQݸPw^YItF]UvUT^6G2 uP~zY+}@AFQܹǁ~F&2Pe PYItF~x'=m (ǸP~UY+}3AFQ}~F&2P߸ PvYItFOܸPu2) V9ܸ P_ߋ^6ȸ߸ PC*ǹ.L~WFP˸-˹ 7F~O, P^6G2Y#4u~W~ȱ6F2=-t)~W}ۋ^6Oȸ>]UvU^6G2 u~ &2=t FF ō~W[F24u#~ &~Wǹ^6G2 u~ &2=t FF ō~WF^6G2 uSF2P~ &2=uHY# u F)F24P~ &2=tHY# uFF2 u ~ & ~ &~ &2=tQF2 u~Wڋ^6tƸݸ PŹb~WFPF2 u~Wً^6#mƸ\ݸ Pċ^6G2P~I_Y# u9~n.Ƹݸ P܋^6Ƹݸ PnUĹ ËFHP ÍXW /čXP^6G24Y u~WXű] UvU~W~ǀz!u~6W|~&EF2 u~WPg ~WF000P~&ƱD~6W~ǀō~)~džƍ~~njƱ~ǀqP~fYFFP~džNYP~@YF~&2 u~F&EG~F&EH~F&EG~F&EHXX]UvU~WP~W~&E}~&E~~&EF]UvU^6@W^6 ‹^6@=uHW6File Containing messages for this program is not foundPa߹d^6@WeP^6W C^6W 0^6W ^6W ^6ZW ^6lW{^6m2,^6G ^6lWT^6m2^6G ^6#W- ^6tW ^6MW p^6W ]^6W]UvU 7^6 W^6G^6G24uDՋ^6 ظ PX?^6G2 u>Ջ^6 ظ P&؋^6ظ P 蚿HP# 茿^6W^6n!ˆF^6Xn P^6G2Y u=^6G^6'=u^6 W^6/P^6uP^6u$Ⱦ^6W^6"WHPn^6G2=tH^6G 苾^6W^6G2 uP^6GӋ^6tQ@׸ P蔾b=^6"WHP1%(&^6G^6"W, PP^6uP^6u$诽^6W^62WHPU^6G2=tH^6G r^6W^6G2 uP^6Gҋ^6t8'ָ P{b$^62WHP &^6G^62W ׼PP^6u谼kb觼^6WHP^6膾蜾-u_ yP^6Wz芾^6Whx^6V^6U^6G^6Rb^6WHPb^6WHP ڻ^6W7Ȼ迻^6VWPPP蠻[藻^6UWPPP x^6RW^6R24u*TeK^6WPPP^6G # P9P^6ub事^6YWHP^6Y׼tu^6_詼迼P^6G 蚺^6W^6G24u$x3bo^6_WHPc^6_WaqAD ^6_WBR "PG P7P^6uzb⹋^6WHP^6׻tu$费ob諹^6- {WHP^6{W蝻譻} qPP^6Oau$JbA^6uWHP5 &)P^6u|b^6gWHP^6g׺芻u$ʸb^6mWHP^6mW賺ú蓸 臸P P^6ewuQ`W^6WPPP90^6WPPPd P4P^6P^6蕺Y# u+зeǷ^6WWP'PPd P^6臼虽P^6Y{葹.Y#PP^6ZlP^6OeY#Y u+:e1^6eWP'PP^6eP^6P^6uڸ荹Y#PP^6蹻˼P^6g譸ø`Y#Y u+蘶Se菶^6sWP'PP,^6sbeF2 ]UvULLPY+}AFQ`etYItFMˋ^6g@O27F]UvUoUvvU|UvvvU^6GF^6G^6G^6;G ^6G^6G=|^6G^6G m^6G]LF^6G=uz艵lʋ^6$q(3ʍ~@`F2P-93- 'uF2=tӴPF=t軴P.=t^6G24^6G= t ԴF2 ]F cLLP>P҉F>PnY+=F@F *~W LLP~ 蹷PM҈F FW LLPFݵ茷P ҈F^6FF=(FFHPnY@FFH~@FFH@FF;FuFnHFFFFHFFPFHnY+FFH~@FPFHY+}AFQPFHY+}fAFQFHnPFnYF^6G^6G;F~-"ȋ^6G@P_) $F;FuHPF^6+G=}HY uN^6W^6G䲋^6r̋^6 ʲ^6W^6 ^舴JF^6+G=t^6W~3]=t^6WF;ENj^6JFPFHY;|'P^6̳{Y+YItFYItFu 螱L4u F2 ]~W~[gʍ~覱=u ~蘱AKFF~=tHFFF2 u   gW L4u FF2 uF 谰P藰Re莰~WP~2PP)F2 u OFHFFP~Y;tHFFP~@Y;tV#e~WP~PPF2 u FHFFF ͯFF2 u 貯 Wi裯.~WF்~rɍ ί w~WF2PF2Y u3 TLFF A~W3 WFF P:FF2 u P~P P~ӳY u~W 貮m P~膳蘴u*聮<xľhWPPP WZ P~=Ou8 /ľhW  P0~WF=G~Ǎ 5F2 u]ҭ~WP,FP~0WľhWhW 蕯迯ľhWF2_&EľhWF2_&EľdW"`芯ľdW2Jtľd WB4^ľdWR2_&E0ľdWU2_&E1ľdWV2_&E2ľdWS2_&E3ľdWT2_&E4ľdW&E5ľd7WY踮ľd=W_袮. ̮ľdCW{茮趮ľdIW~w衮ľde&EOľdQWuUľdWWg?iľd]Wm)Sľds&EcF2 u~U2 ]©TURBO.UU64FF]UU64%FF]UU菫cWFP8W08o^輫]UUUcW8W|89(膫]UU!FP~NSb]UUF?WPPCopyP`W`¬)軬魱⬿W`觬7ĿW=u2W荪螬File `x覭苬 not found蕭PЬXȹ[LW?I赬WW(4uHW/@You cannot install ` : with this program!P\ǿcW TINST.MSGؼ&c =u@W躩˫ Message file  TINST.MSGŬ誫 not found贬Pwǡ PY% VWF2 ]UUVUvU_ P^6G2P-Ph^6G2Pq*9]LLFP,Y+}AFQF2ǀ譪P\uF2@P,Y+}AFQF22PF22Y;tF22PF22Y;u+F* PeKF2ǀF2ǀ荪uFӧ P0ƧYItF+YItF XXXXF2 ]UUUFPF2YF觼F2P: 詧RFPl 萧F22PY;t&Vi`C PiPjPF2ǀ萪Y+}HAFQ ̦F2F2Ps͸虿 PYItFƻ@胨rЦ.yL~WP萫B蜫Q薫-萫 Ϋx=Bt F=Qt F=A|=Z~m=-t6F2ǀWP(i姸Ծ //~ϧ肨uF2ǀW~謧֧F2]UU 莥LL4u F8F6~W P膧VW~WFLLcP:LLyPPǡ66P,Y+}AFQF2ǀ觨@F6PF2Y=F֤ PƤWF2ǀW諤LLP蟤LLPF2Paǡ6PF2Y6YItFgFkW~W[LLxPOLLPPXF2 ]UUYUvULW~WLL!PLL7PPš6@6F2FF2]PYPY46袣W4W蒣LLP膣LLPP}Ÿ64-4P,Y+}AFQF2W DL_F22=F2W_FFPF22Y;~)F2FW עL_F@FYItFd]UUUvULLFFP~舤7Y;~h~F&2=tI~WFP賦~W~&2@_&~W~9_W~F&2_&F@F]LLPY+}AFQ-2AYItF/WPPY+}OAFQ轡cWFP/W^Ź/W/WͶ/芣yźԡYItF譶貺jP藶 P轹褡]UUL(W~d脡F2zFF2= |F2P@YFF2P/貤=u$)8F2P/Ѣ荤FF]UUeUvUF=t F9=(t F(=0t F=9t FFF]艵莹蝠耵腹蔠w|苠FPF2YF LLFPY=u4BGV LLFP3PP %4+^ԟLF2P8=t F2@FB=t+F2=/  F2HF,Fôȸן=t,@FF2=,3 aLu]UUADLT TINST.DTAP蝡B TINST.MSGP苡COIC=71+ % ]Wu͞WWPPP]UU]#F2=tH2=t=t =t PY+}AQ]bqYItcWPW1P5Y+}1AQ᝿cW2QᗍW[YIt趝P0P5Y+}HAQIJ2P褶) 2Qᗍ`O蛶誝YIt育臶薝?P(KWw2PC0P5REQ?q9 u2P0P5$u/W2Qᗍ辞螊2.m22P2=tHY 2P诡軡赡腢P24Y# uU蚱蟵讜葱薵襜NcWPW6L(蔞Lu EJYk>W~.F=uHP>=tHY uP>]UUFPY+}AFQ]bqYItF-FFFF%FP昿W~WFPFP PѺP Y+}6AFQFC2= }F׭C2PYItF軭@xg P԰軘_ǭ~կ覘 O~W涹 A~Wٵ~-CuE~W P芗~W~W~谛|W~WFPFP P貺]ùԗ8˗Lu輗cW P@W]cWePiWF 莗]腗WWPPPpf ]LL =tV2=t =:=t c)y&W.Unknown Video devicePlA=t %-=t Lؖ=t ĖWf uC3_1 TURBO Pascal installation menu. 2 Choose installation item from the following: 3 4 [S]creen type | [C]ommand installation | [M]sg file path | [Q]uit 5 6 Enter S, C, M 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 21 Alternative 22 Character right 23 Word left  24 Word right 25 Line up 26 Line down 27 0  Scroll down 28 Scroll up 29 Page up 30 Page down  31 To left on line 32 To right on line 33 To top of page 34 To bottom of page 35 To top of file 36 To end of file 37 To begining of block 38 To end of block 39 To last cursor position 15 INSERT & DELETE: 40 Insert mode on/off  41 Insert line 42 Delete line 43 Delete to end of line 44 Delete right word 45 Delete character under cursor 46 Delete left character 47 Alternative 16 BLOCK COMMANDS: 48 Mark block begin 49 Mark block end 50 Mark single word 51 Hide/display block 52 Copy block 53 Move block 54 Delete block  55 Read block from disk 56 Write block to disk 17 MISC. EDITING COMMANDS: 57 End edit  58 Tab 59 Auto tab on/off 60 Restore line 61 Find 62 Find & replace 63 Repeat last find 64 Control character prefix 101 Nothing ^Q: Quit, ^R: Last page, ^C: Next page, : 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): 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 LINE: 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): 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): 200 Choose one of the following displays: 201 Which display? (Enter no. or ^Q to exit): 202 Default display mode 203 Monochrome display 204 Color display 80x25 205 Color display 40x25 206 b/w display 80x25 207 b/w display 40x25 208 Does your screen b1 link when the text scrools 210 MSG file path and name (eg. A:\TURBO.MSG)  ADDS 20/25/300PY  KPY ADDS 40/600PY  KMlPYADDS Viewpoint-1A0AY  KPYADM 3A= )(P= Ampex D80= )(TER(=ANSI;1mmP[;HBeehive (DM1, DM10) F000 EHKPFKBeehive (Euro FT-10)F EKLMPF DEC RainbowP[;HHazeltine 1500~~~~~~~P~HP 150 &s1A&jS &s0A&jR &a00c00YJ&d@&dHKLMQ&acYIBM DisplaywriterY L33IPQPY Kaypro +88 4 and 10= /-C1B1REP=Lear-Siegler ADM-20= )(TERP=Lear-Siegler ADM-31= *)(TERP=Liberty= )(TERP= Morrow MDT-20= )(TERP=Northstar Advantage= LMP=Otrona AttacheP[2 ;HQume= )(TERP= RC-855 (ITT)  P Soroc IQ-120 (and up= *)(TP=Soroc new models= *)(TERP=SSM-UB300;002J1;17U0UKLMP;Tandberg TDV 2215P Teletex 3000= )(T-ERP=Televideo 912/920/92= )(TERP=Texas Instrument PrommP[;H Visual 200Y v34xLMPYWyse WY-100/200/300= )(TERP=Zenith, Victor 900000Cur[, Morrow Y0 EqpKLMPPYKLMprogram HilbDemo87; { TURBO-87 DEMONSTRATION PROGRAM Version 1.00A This program demonstrates the increased speed and precision of the TURBO-87 compiler: -------------------------------------------------- From: Pascal Programs for Scientists and Engineers Alan R. Miller, Sybex n x n inverse hilbert matrix solution is 1 1 1 1 1 double precision version -------------------------------------------------- The program performs simultaneous solution by Gauss-Jordan elimination. INSTRUCTIONS 1. Compile the program using the TURBO-87.COM compiler. 2. Type Ctrl-C to interrupt the program. } CONST maxr = 10; maxc = 10; TYPE ary = ARRAY[1..maxr] OF real; arys = ARRAY[1..maxc] OF real; ary2s = ARRAY[1..maxr, 1..maxc] OF real; VAR y : arys; coef : arys; a, b : ary2s; n, m, i, j : integer; error : boolean; PROCEDURE gaussj (VAR b3  : ary2s; (* square matrix of coefficients *) y : arys; (* constant vector *) VAR coef : arys; (* solution vector *) ncol : integer; (* order of matrix *) VAR error: boolean); (* true if matrix singular *) (* Gauss Jordan matrix inversion and solution *) (* Adapted from McCormick *) (* Feb 8, 81 *) (* B(N,N) coefficient matrix, becomes inverse *) (* Y(N) original constant vector *) (* W(N,M) constant vector(s) become solution vector *) (* DETERM is the determinant *) (* ERROR = 1 if singular *) (* INDEX(N,3) *) (* NV is number of constant vectors *) LABEL  99,98; VAR w : ARRAY[1..maxc, 1..maxc] OF real; index: ARRAY[1..maxc, 1..3] OF integer; i, j, k, l, nv, irow, icol, n, l1 : integer; determ, pivot, hold, sum, t, ab, big: real; PROCEDURE swap(VAR a, b: real); VAR hold: real;  BEGIN (* swap *) hold := a; a := b; b := hold END (* procedure swap *); BEGIN (* Gauss-Jordan main program *) error := false; nv := 1 (* single constant vector *); n := ncol; FOR i := 1 TO n DO BEGIN w[i, 1] := y[i] (* copy constant vector *); index[i, 3] := 0 END; determ := 1.0; FOR i := 1 TO n DO BEGIN (* search for largest element *) big := 0.0; FOR j := 1 TO n DO BEGIN IF index[j, 3] <> 1 THEN  BEGIN FOR k := 1 TO n DO BEGIN IF index[k, 3] > 1 THEN  BEGIN writeln(' ERROR: matrix singular'); error := true;  GOTO 98 (* abort *) END; IF index[k, 3] < 1 THEN IF abs(b[j, k]) > big THEN BEGIN irow := j; icol := k;  big := abs(b[j, k]) END END (* k loop *) END  END (* j loop *); index[icol, 3] := index[icol, 3] + 1; index[i, 1] := irow; index[i, 2] := icol; (* interchange rows to put pivot on diagonal *) IF irow <> icol THEN BEGIN determ := - determ; FOR l := 1 TO n DO swap(b[irow, l], b[icol, l]); IF nv > 0 THEN FOR l := 1 TO nv DO swap(w[irow, l], w[icol, l]) END; (* if irow <> icol *) (* divide pivot row by pivot column *) pivot := b[icol, icol]; determ := determ * pivot; b[icol, icol] := 1.0; FOR l := 1 TO n DO b[icol, l] := b[icol, l] / pivot;  IF nv > 0 THEN FOR l := 1 TO nv DO w[icol, l] := w[icol, l] / pivot; (* reduce nonpivot rows *)  FOR l1 := 1 TO n DO BEGIN IF l1 <> icol THEN BEGIN t := b[l1, icol];  b[l1, icol] := 0.0; FOR l := 1 TO n DO b[l1, l] := b[l1, l] - b[icol, l] * t;  IF nv > 0 THEN FOR l := 1 TO nv DO w[l1, l] := w[l1, l] - w[icol, l] * t;  END (* IF l1 <> icol *) END END (* i loop *); 98: IF error THEN GOTO 99; (* interchange columns *) 4  FOR i := 1 TO n DO BEGIN l := n - i + 1; IF index[l, 1] <> index[l, 2] THEN BEGIN irow := index[l, 1]; icol := index[l, 2]; FOR k := 1 TO n DO swap(b[k, irow], b[k, icol])  END (* if index *) END (* i loop *); FOR k := 1 TO n DO IF index[k, 3] <> 1 THEN BEGIN writeln(' ERROR: matrix singular'); error := true; GOTO 99 (* abort *) END; FOR i := 1 TO n DO coef[i] := w[i, 1]; 99: END (* procedure gaussj *); PROCEDURE get_data(VAR a : ary2s; VAR y : arys;  VAR n, m : integer); (* setup n-by-n hilbert matrix *) VAR i, j : integer; BEGIN FOR i := 1 TO n DO  BEGIN a[n,i] := 1.0/(n + i - 1); a[i,n] := a[n,i] END; a[n,n] := 1.0/(2*n -1); FOR i := 1 TO n DO  BEGIN y[i] := 0.0; FOR j := 1 TO n DO y[i] := y[i] + a[i,j] END; writeln; IF n < 7 THEN  BEGIN FOR i:= 1 TO n DO BEGIN FOR j:= 1 TO m DO write( a[i,j] :7:5, ' ');  writeln( ' : ', y[i] :7:5) END; writeln END (* if n<7 *) END (* procedure get_data *); PROCEDURE write_data; (* print out the answers *) VAR i : integer; BEGIN FOR i := 1 TO m DO write( coef[i] :13:9); writeln; END (* write_data *); BEGIN (* main program *) a[1,1] := 1.0; n := 2; m := n; REPEAT get_data (a, y, n, m); FOR i := 1 TO n DO FOR j := 1 TO n DO b[i,j] := a[i,j] (* setup work array *); gaussj (b, y, coef, n, error); IF not error THEN write_data; n := n+1; m := n UNTIL n > maxr; END. {$C-} program test; { TURBO-87 DEMONSTRATION PROGRAM Version 1.00A This program demonstrates the speed and precision advantages of the TURBO-87 compiler. INSTRUCTIONS 1. Compile and run this program using the TURBO.COM compiler. 2. Compile and run this program using the TURBO-87.COM compiler and compare the results with (1) above. } var Terms : integer; Answer: char; procedure GetTerms(var Count : integer); begin ClrScr; Writeln('This program demonstrates the speed and precision advantages'); Writeln('of the TURBO-87 compiler.'); Writeln; Write('Please tell me how many terms you want to add: '); HighVideo; readln(Count); Writeln; end; (* GetCount *) procedure DisplayResults(Count : integer); var Number, Sum : real; Index : integer; function InvSquare(arg: real): real; begin InvSquare := 1 / Sqr(arg) end; (* InvSquare *) begin Write('Calculating: 1/1 + 1/4 +... + 1/',Count,'*',Count,' = '); Sum := 0; for Index := 1 to Count do begin Number := Index; Sum := Sum + InvSquare(Number) end; Writeln(Sum:1:20); Writeln; LowVideo; end; (* DisplayResults *) begin LowVideo; repeat GetTerms(Terms); DisplayResults(Terms); Write('Type to quit, any other key to continue...'); Read(KBD, Answer); until Answer in [#27, ^C]; end. 5 Program PrecisionDemo; { BCD DEMONSTRATION PROGRAM Version 1.00A This program demonstrates the increase in precision gained by using TURBOBCD. Monetary calculations done in floating point lose precision because there is no precise binary representation for any power of 1/10 (.1, .01, etc). Binary coded decimals perform all calculations in decimal and thus are more precise for financial applications. INSTRUCTIONS 1. Compile and run this program using TURBOBCD.COM. Note that the results are all zero. 2. Compile and run this program using TURBO.COM and compare the results with (1) above. } Begin ClrScr; WriteLn('Each of the following calculations should result in zero:'); Writeln; WriteLn('(((1234.99 - 1235.0) * 10000.0) + 100.0) * 100000.0 = ', ((1234.99-1235.0)*10000.0+100.0)*100000.0:1:20); WriteLn('((1/5) * 5) - 1 = ', 1/5*5-1:1:20); WriteLn('1.34 + 1.66 - 3.0 = ', 1.34+1.66-3.0:1:20); End. program 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: Then 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 program 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,  search4: string[5]; Procedure Initialize; begin CurRow := 0; clrscr; search1 := '{$'+'I'; { So LISTER can list itself! } search2 := '{$'+'i'; search3 := '(*$'+'I'; search4 := '(*$'+'i'; end {initialize}; Fu6 nction 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 }; 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}; Procedure 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  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;  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,IncludeFileName) 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(mainf7 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. 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.0 Reference Manual. } var i : integer; begin for i := 1 to ParamCount do writeln(ParamSTR(i)); end. Program DirectoryExamples; { DIRECTORY PROCEDURES DEMONSTRATION PROGRAM Version 1.00A This program demonstrates the use of TURBO 3.0 directory procedures. PSEUDO CODE 1. Get the current drive and directory 2. Repeat Execute the selected TURBO directory procedure until the user types "Q" or "0" INSTRUCTIONS 1. Compile this program using the TURBO.COM compiler. 2. Manipulate the directory commands by selecting the menu options. 3. Type "Q" or "0" to exit the program. } Var Path: String[64]; Ch: Char; Begin ch := '1'; { initialize loop variable } Repeat  if Upcase(ch) IN ['1', 'M', '2', 'R', '3', 'C', '0', 'Q'] then begin ClrScr; GetDir(0,Path); { Get the current directory of the current drive. Note that 0 for the first variable means the current  drive, not A:. 1 means A: and so on. This is contrary to the manual } WriteLn('Current directory is ',Path); Writeln; WriteLn('Choose option: '); WriteLn(' 1: Make a directory'); WriteLn(' 2: Remove a directory'); WriteLn(' 3: Change the current directory');  WriteLn(' 0: Quit'); Writeln; Write('Option: '); Read(Kbd,Ch); {$I-}  Case Upcase(Ch) Of '1','M': Begin WriteLn('Make'); Write('Make what directory? '); Readln(path); MkDir(Path); End; '2','R': Begin WriteLn('Remove'); Write('Remove what directory? '); 8  Readln(path); RmDir(Path); End; '3','C': Begin  WriteLn('Change'); Writeln; Write('Change to what directory? ');  Readln(path); ChDir(Path); End; '0','Q': WriteLn('Quit');  Else End; { case } {$I+} If IOResult<>0 Then begin Write('*** Error: ', path); delay(3000); end; end { if } else read(kbd, ch) Until Upcase(Ch) In ['0','Q', #27]; End.  ; * WARNING WARNING WARNING WARNING WARNING WARNING WARNING * ; Please do not try to use external procedures ; unless you are familiar with assembly language. ; ; IMPORTANT: Externals must be written in assembly language. ; ; The following example translates a string to upper case. ; ; Place the following code in a file: "STU.ASM" ; CODE SEGMENT  ASSUME CS:CODE STU PROC NEAR PUSH BP ; SAVE ENVIRONMENT MOV  BP,SP ; MANUAL PAGE 189 LES DI,[BP+4] ; GET PARAMETER MOV CL,ES:[DI] INC CL L1: DEC CL JZ L2 INC DI CMP ES:BYTE PTR[DI],'a' JB L1 CMP ES:BYTE PTR[DI],'z' JA L1 SUB ES:BYTE PTR[DI],20H JMP SHORT L1 L2: MOV SP,BP ; RESTORE ENVIRONMENT POP BP ; MANUAL PAGE 190 RET 4 STU ENDP CODE ENDS END ; Now exit to PC-DOS and type: ; ; ASM STU ; LINK STU ; EXE2BIN STU.EXE STU.COM ; ; IGNORE MINOR ERRORS FROM ASM AND LINK To use, write the following program: type AnyString = string[255]; var S: AnyString; I: integer; procedure STU(var S: AnyString); external 'STU.COM'; begin readln(S); STU(S); writeln(S); end. ; The above external procedure is only an example. You ; can achieve the same result in Turbo-Pascal: ; ; procedure STU(var S: AnyString); ; var ; I: integer; ; begin ; for I:=1 to Length(S) do S[I]:=Upcase(S[I]); ; end; ; {* WARNING WARNING WARNING WARNING WARNING WARNING WARNING Do not try to use the MsDos function call unless you are very familiar with the operating system and have technical information available to you! The following program uses the MsDos command in Turbo to retrieve the system date. This is achieved via DOS function call 42 (or 2A hex). The function call is placed in the AH register according to the technical reference manual. Type in the following code. The o9 nly output is the date at the top of your screen.*} program GetDate; type DateStr = string[10]; function Date: DateStr; type regpack = record ax,bx,cx,dx,bp,si,di,ds,es,flags: integer; end; var recpack:  regpack; {record for MsDos call} month,day: string[2]; year: string[4]; dx,cx:  integer; begin with recpack do begin ax := $2a shl 8; end; MsDos(recpack); { call function } with recpack do begin str(cx,year); {convert to string} str(dx mod 256,day);  { " } str(dx shr 8,month); { " } end; date := month+'/'+day+'/'+year; end; begin writeln(date); end.{* WARNING WARNING WARNING WARNING WARNING WARNING WARNING In order to use the Intr procedure in Turbo Pascal you must be familiar with interrupts and have access to a technical reference manual. The following program uses the Intr function in Turbo to get the time. Registers have to be set correctly according to the DOS technical reference manual before the function is called. The program simply returns the time in a string at the top of the screen.*} program TimeInterrupt; type TimeString = string[8]; function time: TimeString; type regpack = record ax,bx,cx,dx,bp,si,di,ds,es,flags: integer; end; var recpack: regpack; {assign record} ah,al,ch,cl,dh: byte; hour,min,sec: string[2]; begin ah := $2c; {initialize correct registers} with recpack do begin ax := ah shl 8 + al; end; intr($21,recpack); {call interrupt} with recpack do begin str(cx shr 8,hour); {convert to string} str(cx mod 256,min);  { " } str(dx shr 8,sec); { " } end; time := hour+':'+min+':'+sec; end; begin  writeln(time); end.program MicroCalc; { MICROCALC DEMONSTRATION PROGRAM Version 1.00A This program 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. If a memory overflow occurs, compile the program: CALCMAIN.PAS which will include this program. 2. Exit the program by typing: /Q  Here is a note to the compiler: } {$R-,U-,V-,X-,C-} const FXMax: Char = 'G'; { Maximum number of columns in spread sheet } FYMax = 21; { Maximum number of lines in spread sheet } type : Anystring = string[70]; SheetIndex = '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 cell value } DEC,FW: 0..20; { Decimals and Cell Whith } end; Cells = array[SheetIndex,1..FYMax] of CellRec; const XPOS: array[SheetIndex] of integer = (3,14,25,36,47,58,68); var Sheet: Cells; { Definition of the spread sheet } FX:  SheetIndex; { Culumn of current cell } FY: Integer; { Line of current cell } Ch: Char; { Last read character } MCFile: file of CellRec; { File to store sheets in } AutoCalc: boolean; { Recalculate after each entry? } { For easy reference the procedures and functions are grouped in mo-} { dules called MC-MOD00 through MC-MOD05. } {.PA} {*******************************************************************} {* SOURCE CODE MODULE: MC-MOD00  *} {* PURPOSE: Micellaneous utilities and 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 begin repeat GotoXY(X,23); Blink:=not Blink; if Blink then HighVideo else LowVideo; Write(S); Delay(175);  until KeyPressed; end; LowVideo; end; procedure IBMCh(var Ch: Char); begin case Ch of 'H': Ch:=^E; 'P': Ch:=^X; 'M': Ch:=^D; 'K': Ch:=^S; 'S': Ch:=#127; 'R': Ch:=^V; 'G', 'I', 'O', 'Q': Ch:=#00; end; end; procedure Auto; begin AutoCalc:=not AutoCalc; if AutoCalc then Flash(60,'AutoCalc: ON ',false)  else Flash(60,'AutoCalc: OFF',false); end; {.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); Write(Count); end; GotoXY(1,2); for I:=1 to FYMax do writeln(I:2);  LowVideo; if AutoCalc then Flash(60,'AutoCalc: ON' ,false) else Flash(60,'AutoCalc: OFF',false); Flash(33,' Type / for Commands',false); end; procedure Init; var I: SheetIndex; J: Integer; LastName: string[2]; begin for I:='A' to FXMAX do begin for J:=1 to FYMAX do begin with Sheet[I,J] do begin CellStatus:=[Txt]; ; Contents:=''; Value:=0; DEC:=2; { Default number of decimals } FW:=10; { Default field width } 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; end; end; {.PA} {*******************************************************************} {* SOURCE CODE MODULE: MC-MOD02 *} {* PURPOSE: Display values in cells and move between *} {* cells in the spread sheet. *} {*******************************************************************} procedure FlashType; begin with Sheet[FX,FY] do begin GotoXY(1,23);  Write(FX,FY:2,' '); if Formula in CellStatus then write('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: SheetIndex; GY: integer); begin with Sheet[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:SheetIndex;FY: integer); begin with Sheet[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: SheetIndex; UFY: integer; begin ClrScr; Grid; for UFX:='A' to FXMax do for UFY:=1 to FYMax do if Sheet[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>FYMax then FY:=1; until (Sheet[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 (Sheet[FX,FY].CellStatus*[OverWritten,Locked]=[]) or (FY=Start); if FY<>Start then GotoCell(FX,FY); end; {.CP20} procedure MoveRight; var Start: SheetIndex; begin LeaveCell(FX,FY); Start:=FX; repeat FX:=Succ(FX); if FX>FXMax then begin FX:='A'; FY:=FY+1; if FY>FYMax then FY:=1; end; until (Sheet[FX,FY].CellStatus*[OverWritten,Locked]=[]) or (FX=Sta< rt); if FX<>Start then GotoCell(FX,FY); end; {.CP20} procedure MoveLeft; var Start: SheetIndex; 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 (Sheet[FX,FY].CellStatus*[OverWritten,Locked]=[]) or (FX=Start); if FX<>Start then GotoCell(FX,FY); end; {.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; begin {$I-} assign(F,FileN); reset(F); {$I+} if IOResult<>0 then Exist:=false else  begin Exist:=true; close(F); end; 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; var I: SheetIndex; 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,Sheet[I,J]); end;  Grid; Close(MCFile); LowVideo; GotoCell(FX,FY); end; end; {.CP30} procedure Load; begin HighVideo; Msg('Load: Enter filename '); GetFileName(Filename,'MCS'); 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,Sheet[FX,FY]); FX:='A'; FY:=1; LowVideo; UpDate; end; GotoCell(FX,FY); end; {.PA} procedure Print; var I: SheetIndex; 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 Line:=''; for I:='A' to FXmax do begin with Sheet[I,J] do begin while (Length(Line)0 the= n 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 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; Line: string[80]; J: integer; Bold: boolean; begin if Exist('CALC.HLP') then begin Assign(H,'CALC.HLP'); Reset(H); while not Eof(H) do begin ClrScr; Bold:=false; LowVideo; Readln(H,Line); repeat  Write(' '); For J:=1 to Length(Line) do begin if Line[J]=^B then begin  Bold:=not Bold; if Bold then HighVideo else LowVideo; end else write(Line[J]); end;  Writeln; Readln(H,Line); until Eof(H) 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 press to start MicroCalc >>>'); LowVideo; Readln(Ch); UpDate; end else { Help file did not exist } begin Msg('To get help the file CALC.HLP must be on your disk. Press '); repeat Read(kbd,Ch) until Ch=^M; GotoCell(FX,FY); end; end; {.PA} {*******************************************************************} {* SOURCE CODE MODULE: MC-MOD04 *} {* PURPOSE: Evaluate formulas.  *} {* Recalculate spread sheet. *} {*  *} {* NOTE: This module contains recursive procedures *} {*******************************************************************} 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; { 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; Opr: 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[Stand> ardFunction] of string[6]; const StandardFunctionNames: StandardFunctionList =('ABS','SQRT','SQR','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:SheetIndex; CellSum: Real; function 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; 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 begin  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 Sheet[EFX,EFY].CellStatus) and not (Calculated in Sheet[EFX,EFY].CellStatus) then begin Evaluate(Form,Sheet[EFX,EFY].contents,f,ErrPos); Sheet[EFX,EFY].CellStatus:=Sheet[EFX,EFY].CellStatus+[Calculated] end else if not (Txt in Sheet[EFX,EFY].CellStatus) then F:=Sheet[EFX,EFY].Value; if Ch='>' then begin OldEFX:=EFX; OldEFY:=EFY; NextCh; EFX:=Ch; NextCh; if Ch in Numbers then begin EXY:=Ch; NextCh; 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 Sheet[SumFX,SumFY].CellStatus) and not (Calculated in Sheet[SumFX,SumFY].CellStatus) then begin Evaluate(Form,Sheet[SumFX,? SumFY].contents,f,errPos); Sheet[SumFX,SumFY].CellStatus:= Sheet[SumFX,SumFY].CellStatus+[Calculated]; end else if not (Txt in Sheet[SumFX,SumFY].CellStatus) then  F:=Sheet[SumFX,SumFY].Value; Cellsum:=Cellsum+f; 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:=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; 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)*SignedFactor); 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+SimpleExpression; '-': 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: SheetIndex; RFY:integer; OldValue: real; Err: integer; begin LowVideo; GotoXY(1,24); ClrEol; Write('Calculating..'); for RFY:=1 to FYMax do begin for RFX:='A' to FXMax do begin with Sheet[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 G@ otoXY(XPos[RFX],RFY+1); if (DEC>=0) then Write(Value:FW:DEC) else Write(Value:FW); end;  end; end; end; end; GotoCell(FX,FY); end; {.PA} {*******************************************************************} {* SOURCE CODE MODULE: MC-MOD05 *} {* PURPOSE: Read the contents of a cell and update *} {* associated cells. *} {*******************************************************************} procedure GetLine(var S: AnyString; { String to edit }  ColNO,LineNO, { Where start line } 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 Read(Kbd,Ch); if KeyPressed then begin  Read(kbd,Ch); IBMCh(Ch); end; 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),' '); 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) and (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 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: SheetIndex;FY: Integer); var S: AnyString; NewStat: Set of AttribA utes; ErrorPosition: Integer; I: SheetIndex; 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 I:=FX; repeat with Sheet[I,FY] do begin GotoXY(XPos[I],FY+1);  write(' '); I:=Succ(I); end; until ([OverWritten,Locked]*Sheet[I,FY].CellStatus=[]); { Cell is not OVerWritten not Locked } end; {.CP20} { The new type of the cell is flashed at the bottom of the Sheet } { Notice that a constant of type array is used to indicate the type } procedure FlashType; begin HighVideo; GotoXY(5,23); LowVideo; end; {.CP20} 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 the current } { cells X,Y position as parameters. This means that text entering } { takes place direcly at the cells position on the Sheet. } procedure GetText; begin FlashType; with Sheet[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. } procedure EditCell; begin with Sheet[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". } procedure UpdateCells; var Flength: Integer;  begin Sheet[FX,FY].Contents:=S; if Txt in NewStat {Sheet[FX,FY].CellStatus} then begin I:=FX; FLength:=Length(S); repeat I:=Succ(I); with Sheet[I,FY] do begin FLength:=Flength-11;  if (Flength>0) then begin CellStatus:=[Overwritten,Txt]; Contents:=''; end else begin if OverWritten in CellStatus then begin CellStatus:=[Txt];  GotoCell(I,FY);LeaveCell(I,FY); end; end; end; until (I=FXMax) or (Sheet[I,FY].CB ontents<>''); Sheet[FX,FY].CellStatus:=[Txt]; end else { string changed to formula or constant } begin { Event number two } I:=FX; repeat with Sheet[I,FY] do begin if OverWritten in CellStatus then begin CellStatus:=[Txt]; Contents:=''; end; I:=Succ(I); end; until not (OverWritten in Sheet[I,FY].CellStatus); with Sheet[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 } { variable "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 Sheet[FX,FY].CellStatus) then begin GotoXY(11,24); ClrEol; ClearCells; GetFormula; end else begin Flash(15,'Edit formula Y/N?',true); 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:=(Sheet[FX,FY].CellStatus)*[Txt,Constant]; EditCell; end else begin if formula in Sheet[FX,FY].CellStatus then begin Flash(15,'Edit formula Y/N?',true); repeat read(Kbd,Ch) until UpCase(CH) in ['Y','N'];  Flash(15,' ',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 Sheet[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; 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); 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 begiC n Sheet[FX,J].DEC:=DEC; Sheet[FX,J].FW:=FW; with Sheet[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; {.PA} {*********************************************************************} {* START OF MAIN PROGRAM PROCEDURES *} {*********************************************************************} { Procedure Commands is activated from the main loop in this program } { when the user types a slash (/). a procedure activates a procedure} { which will execute the command. These procedures are located in the} { above modules. } { 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': Save; { 03 } 'L': Load; { 03 } 'H': Help; { 03 } 'R': Recalculate; { 05 } 'A': Auto;  { 00 } '/': Update; { 01 } 'C': Clear;  { 01 } 'P': Print; { 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 Welcome; procedure Center(S: AnyString); var I: integer; begin for I:=1 to (80-Length(S)) div 2 do Write(' '); writeln(S); end; begin { procedure Wellcome } ClrScr; GotoXY(1,9); Center('Welcome to MicroCalc. A Turbo demonstation program'); 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 Init; { 01 } Welcome; ClrScr; Grid; { 01 } GotoCell(FX,FY); repeat Read(Kbd,Ch); if KeyPressed then begin read(kbd,Ch); IBMCh(Ch); end; case Ch of ^E: MoveUp;  { 02 } ^X,^J: MoveDown; { 02 } ^D,^M,^F: MoveRight;D  { 02 } ^S,^A: MoveLeft; { 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. 5 This is MicroCalc an electronic spreadsheet program.    Item one  Item Two  Item Three  Item Four  Item Five  ----------------------  Total  ======================  E If you want to play with this sample spread sheet then press Ctrl-X  D to move the cursor down to Item One. Then press Ctrl-D to move the  E cursor to the first figure in column B. Now enter another number and C press RETURN. The Total and the figures in the other examples will D now change accordingly. On the IBM-PC you may also use the arrows.   # To get some help you may press: /H F If you want to make your own spread sheet use the command /C to Clear ? this work sheet. Later on use the command /S to save your own.    !148 !2533 !322@ !4222 !52   #(B4>B8)p  E           3^2   4 With MicroCalc you can mix text and numbers any way - you please to make almost any screen layout.  2 MicroCalc supports floating point numbers with 11 1 significant digits, SIN, COS, LN and much more.    This is an example: SIN(2.3)*LN(B10)-100 =  Item Four/Total*100 =IN(2.3)*LN(B10)-100 =  LN(Item Three)/Total=j>                        LN(B10))F @                    # (B7/B10*100)0-10))TUUUU # (LN(B6)/B10))}[H                     (G9)DG                  IN(2.3)*LN(B10)-10000)j E       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 can not copy formulas from one cell to others. * You can not insert and delete lines or columns. In spite of its limitations MicroCalc does provide some interest- ing features among which are: * 11 digits floating 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 acH cidental 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 disabled). * 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+A3+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)  Ctrl-E (Left) Ctrl-S Ctrl-G (Right) Ctrl-X  (Down) ---> On the IBM-PC you may also use the arrows. <--- A cell may contain a number, a formula or some text. The type 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 number 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: ABS, SQRT, SQR, SIN, COS, ARCTAN, LN, LOG, EXP, FACT +,-,*,/, ^ to raise to any power e.g. 2^3 = 8 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 between 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. ^V (or Ins on the PC) changes between insert-/overwrite mode. 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 will 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 I  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 (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 use the /L command to <--  --> load the file: CALCDEMO. <-- { Compile this file if you get the error message: "Compiler overflow" when compiling the file CALC.PAS. When developing programs it is a good idea to split the program into several include files, and then have a small main file containing the  global variables and Include directives for the different source code modules.You may want to spit the file CALC.PAS into such modules. If you want to edit the file CALC.PAS then select it as Work file using the W command. The calc demo prorgam CALC.PAS is now included: } {$ICALC.PAS} { If you have more than 128K RAM it is possible to have the following in RAM at the same time: Compiler and Editor CALC.PAS Object code generated for CALC.PAS Data area for CALC.PAS } (***********************************************************) (* *) (* TURBO-access version 3.00 (MS-DOS) *) (* *) (*  ACCESS module *) (* *) (*  TURBO Pascal 3.00 or higher *) (* *) (*  Copyright (C) 1984,85 by *) (* BORLAND Int. *) (*  *) (***********************************************************) { This module is provided as an update for TURBO TOOLBOX programmers. Use ACCESS.BOX when compiling with TURBO 2.0. Use ACCESS3.BOX when compiling with TURBO 3.0. For information about TURBO TOOLBOX, please refer to the product descriptions in the back of your Version 3.0 Reference Manual. } (*$A+,I-,R-*) type TaStr64 = string[64]; DataFile = record  case Integer of 0 : (F : file; FirstFree, J  NumberFree, Int1, Int2, NumRec : Integer); 1 : (Fil2 : array[1..12] of Byte; TaName : array[1..64] of Char);  end; TaKeyStr = string[MaxKeyLen]; TaItem = record DataRef,PageRef : Integer;  Key : TaKeyStr; end; TaPage = record ItemsOnPage : 0..PageSize;  BckwPageRef : Integer; ItemArray : array[1..PageSize] of TaItem; end; TaPagePtr =  ^TaPage; TaSearchStep = record PageRef,ItemArrIndex : Integer; end; TaPath = array[1..MaxHeight] of TaSearchStep; IndexFile = record DataF : DataFile;  AllowDuplKeys : Boolean; KeyL,RR,PP : Integer; Path : TaPath;  end; IndexFilePtr = ^IndexFile; TaStackRec = record Page : TaPage; IndexFPtr : IndexFilePtr; PageRef : Integer; Updated : Boolean; end; TaStackRecPtr = ^TaStackRec; TaPageStack = array[1..PageStackSize] of TaStackRec; TaPageMap = array[1..PageStackSize] of Integer;  TaRecordBuffer = record case Integer of 0 : (Page : TaStackRec);  1 : (R : array[1..MaxDataRecSize] of Byte); 2 : (I : Integer); end; var IOstatus : Integer; OK : Boolean; TaRecBuf : TaRecordBuffer; TaPageStk : TaPageStack; TaPgMap : TaPageMap; procedure TaIOcheck(var DatF : DataFile; R : Integer); var I : Integer; begin if IOstatus <> 0 then with DatF do  begin Writeln; Writeln('TURBO-access I/O error ',IOstatus); Write('File '); I := 0; while Ord(TaName[I]) <> 0 do begin Write(TaName[I]); I := Succ(I); end; Writeln(' Record ',R); Writeln('Program aborted'); Halt; end; end; procedure GetRec(var DatF : DataFile; R : Integer;  var Buffer ); begin Seek(DatF.F,R); BlockRead(DatF.F,Buffer,1); IOstatus := IOresult; TaIOcheck(DatF,R); end; procedure PutRec(var DatF : DataFile; R : Integer; var Buffer  ); begin Seek(DatF.F,R); BlockWrite(DatF.F,Buffer,1); IOstatus := IOresult; TaIOcheck(DatF,R); end; procedure MakeFile(var DatF : DataFile; FName : TaStr64; RecLen : Integer); begin  Assign(DatF.F,FName); IOstatus := IOresult; TaIOcheck(DatF, 0); Rewrite(DatF.F,RecLen); IOstatus := IOresult; if IOstatus = $F1 then OK := false else begin TaIOcheck(DatF,0); DatF.FirstFree := -1; DatF.NumberFree := 0; DatF.Int1 := 0; DatF.Int2 := 0; Move(DatF.FirstFree,TaRecBuf,8); PutRec(DatF,0,TaRecBuf); DatF.NumRec := 1; OK := true; end; end; procedure OpenFile(var DatF : DataFile; FName : TaStr64;K  RecLen : Integer); begin Assign(DatF.F,FName); IOstatus := IOresult; TaIOcheck(DatF,0); Reset(DatF.F,RecLen); IOstatus := IOresult; if IOstatus = 1 then OK := false else begin TaIOcheck(DatF,0); GetRec(DatF,0,TaRecBuf); Move(TaRecBuf,DatF.FirstFree,8); DatF.NumRec := FileSize(DatF.F); OK := true; end; end; procedure CloseFile(var DatF : DataFile); begin DatF.Int2 := DatF.NumRec; Move(DatF.FirstFree,TaRecBuf,8); PutRec(DatF,0,TaRecBuf); Close(DatF.F); IOstatus := IOresult; TaIOcheck(DatF,0); end; procedure NewRec(var DatF : DataFile; var R : Integer ); begin if DatF.FirstFree = -1 then begin R := DatF.NumRec; DatF.NumRec := Succ(DatF.NumRec) end else begin R := DatF.FirstFree; GetRec(DatF,R,TaRecBuf); DatF.FirstFree := TaRecBuf.I; DatF.NumberFree := DatF.NumberFree - 1; end; end; procedure AddRec(var DatF : DataFile;  var R : Integer; var Buffer ); begin NewRec(DatF,R); PutRec(DatF,R,Buffer); end;  procedure DeleteRec(var DatF : DataFile; R : Integer); begin TaRecBuf.I := DatF.FirstFree; PutRec(DatF,R,TaRecBuf); DatF.FirstFree := R; DatF.NumberFree := DatF.NumberFree + 1; end; function FileLen(var DatF : DataFile) : Integer; begin FileLen := DatF.NumRec; end; function UsedRecs(var DatF : DataFile) : Integer; begin UsedRecs := DatF.NumRec - DatF.NumberFree - 1; end; procedure InitIndex; var I : Integer; begin for I := 1 to PageStackSize do begin TaPageStk[I].IndexFPtr := nil; TaPageStk[I].Updated := false; TaPgMap[I] := I; end; end; procedure TaPack(var Page : TaPage; KeyL : Integer); var I : Integer; P : array[0..MaxInt] of Byte absolute Page; begin if KeyL <> MaxKeyLen then for I := 1 to PageSize do Move(Page.ItemArray[I],P[(I - 1) * (KeyL + 5) + 3],KeyL + 5); end; procedure TaUnpack(var Page : TaPage; KeyL : Integer); var I : Integer; P : array[0..MaxInt] of Byte absolute Page; begin if KeyL <> MaxKeyLen then for I := PageSize downto 1 do Move(P[(I - 1) * (KeyL + 5) + 3],Page.ItemArray[I],KeyL + 5); end; procedure MakeIndex(var IdxF : IndexFile;  FName : TaStr64; KeyLen, S : Integer); var K : Integer;  begin K := (KeyLen + 5)*PageSize + 3; MakeFile(IdxF.DataF,FName,K); IdxF.AllowDuplKeys := S <> 0; IdxF.KeyL := KeyLen; IdxF.RR := 0; IdxF.PP := 0; end; procedure OpenIndex(var IdxF : IndexFile; FName : TaStr64; KeyLen, S : Integer); var K : Integer; begin K := (KeyLen + 5) * PageSize + 3; OpenFile(IdxF.DataF,FName,K); IdxF.AllowDuplKeys := S <> 0; IdxF.KeyL := KeyLen; IdxF.RR := IdxF.DataF.Int1; IdxF.PP := 0; end; procedure CloseIndex(var IdxF : IndexFile); var I : Integer; begin for I := 1 to PageStackSize do with TaPageStk[I] do if IndexFPtr = Addr(IdxF) then begin IndexFPtr := nil; L  if Updated then begin TaPack(Page,IdxF.KeyL); PutRec(IdxF.DataF,PageRef,Page); Updated := false; end; end; IdxF.DataF.Int1 := IdxF.RR; CloseFile(IdxF.DataF); end; procedure TaLast(I : Integer); var J,K : Integer; begin J := 1; while (TaPgMap[J] <> I) and (J < PageStackSize) do J := J + 1; for K := J to PageStackSize - 1 do TaPgMap[K] := TaPgMap[K + 1]; TaPgMap[PageStackSize] := I; end; procedure TaGetPage(var IdxF : IndexFile; R : Integer; var PgPtr : TaPagePtr); var I : Integer; Found : Boolean; begin I := 0; repeat I := I + 1; with TaPageStk[I] do Found := (IndexFPtr = Addr(IdxF)) and (PageRef = R); until Found or (I = PageStackSize); if not Found then begin I := TaPgMap[1]; with TaPageStk[I] do begin if Updated then begin TaPack(Page,IndexFPtr^.KeyL); PutRec(IndexFPtr^.DataF,PageRef,Page); end; GetRec(IdxF.DataF,R,Page); TaUnpack(Page,IdxF.KeyL); IndexFPtr := Addr(IdxF); PageRef := R; Updated := false; end; end; TaLast(I); PgPtr := Addr(TaPageStk[I]); end; procedure TaNewPage(var IdxF : IndexFile; var R : Integer; var PgPtr : TaPagePtr); var I : Integer; begin I := TaPgMap[1]; with TaPageStk[I] do begin if Updated then begin TaPack(Page,IndexFPtr^.KeyL); PutRec(IndexFPtr^.DataF,PageRef,Page); end; NewRec(IdxF.DataF,R); IndexFPtr := Addr(IdxF); PageRef := R; Updated := false; end; TaLast(I); PgPtr := Addr(TaPageStk[I]); end; procedure TaUpdatePage(PgPtr : TaPagePtr); var P : TaStackRecPtr absolute PgPtr; begin P^.Updated := true; end; procedure TaReturnPage(var PgPtr : TaPagePtr); var P : TaStackRecPtr absolute PgPtr; begin with P^ do begin DeleteRec(IndexFPtr^.DataF,PageRef); IndexFPtr := nil; Updated := false; end; end; procedure TaXKey(var K; KeyL : Integer); var Key : TaKeyStr absolute K; begin if Ord(Key[0]) > KeyL then Key[0] := Chr(KeyL); end; function TaCompKeys(var K1, K2; DR1, DR2 : Integer;  Dup : Boolean ) : Integer; var Key1 : TaKeyStr absolute K1; Key2 : TaKeyStr absolute K2; begin if Key1 = Key2 then if Dup then TaCompKeys := DR1 - DR2 else TaCompKeys := 0 else if Key1 > Key2 then TaCompKeys := 1 else TaCompKeys := - 1; end; procedure ClearKey(var IdxF : IndexFile); begin IdxF.PP := 0; end;