From 2c74a136605f22d62bf074e88c525ff4252028d4 Mon Sep 17 00:00:00 2001 From: davidly Date: Sun, 30 Jun 2024 15:28:49 -0700 Subject: [PATCH] Turbo Pascal v2 + cleanup --- Borland Turbo Pascal v1/DT.BAK | 10 - Borland Turbo Pascal v1/TIMEDIFF.BAK | 105 -- Borland Turbo Pascal v1/m.bat | 3 + Borland Turbo Pascal v2/ART.PAS | 153 ++ Borland Turbo Pascal v2/CALC.HLP | 144 ++ Borland Turbo Pascal v2/CALC.PAS | 1259 +++++++++++++++++ Borland Turbo Pascal v2/CALCDEMO.MCS | Bin 0 -> 11760 bytes Borland Turbo Pascal v2/CALCMAIN.PAS | 28 + Borland Turbo Pascal v2/COLOR.PAS | 133 ++ Borland Turbo Pascal v2/DOSFCALL.DOC | 48 + .../DOS_GT.PAS | 22 +- Borland Turbo Pascal v2/E.PAS | 42 + Borland Turbo Pascal v2/EXTERNAL.DOC | 89 ++ Borland Turbo Pascal v2/INTRPTCL.DOC | 47 + Borland Turbo Pascal v2/READ.ME | 26 + Borland Turbo Pascal v2/SIEVE.PAS | 31 + Borland Turbo Pascal v2/SOUND.PAS | 76 + Borland Turbo Pascal v2/TIMEUTIL.PAS | 65 + Borland Turbo Pascal v2/TINST.COM | Bin 0 -> 28479 bytes Borland Turbo Pascal v2/TINST.MSG | 129 ++ Borland Turbo Pascal v2/TLIST.COM | Bin 0 -> 17271 bytes Borland Turbo Pascal v2/TTT.PAS | 287 ++++ Borland Turbo Pascal v2/TURBO.COM | Bin 0 -> 36480 bytes Borland Turbo Pascal v2/TURBO.MSG | 105 ++ Borland Turbo Pascal v2/WINDOW.PAS | 112 ++ Borland Turbo Pascal v2/m.bat | 3 + 26 files changed, 2790 insertions(+), 127 deletions(-) delete mode 100644 Borland Turbo Pascal v1/DT.BAK delete mode 100644 Borland Turbo Pascal v1/TIMEDIFF.BAK create mode 100644 Borland Turbo Pascal v1/m.bat create mode 100644 Borland Turbo Pascal v2/ART.PAS create mode 100644 Borland Turbo Pascal v2/CALC.HLP create mode 100644 Borland Turbo Pascal v2/CALC.PAS create mode 100644 Borland Turbo Pascal v2/CALCDEMO.MCS create mode 100644 Borland Turbo Pascal v2/CALCMAIN.PAS create mode 100644 Borland Turbo Pascal v2/COLOR.PAS create mode 100644 Borland Turbo Pascal v2/DOSFCALL.DOC rename Borland Turbo Pascal v1/OUTCHAR.BAK => Borland Turbo Pascal v2/DOS_GT.PAS (54%) create mode 100644 Borland Turbo Pascal v2/E.PAS create mode 100644 Borland Turbo Pascal v2/EXTERNAL.DOC create mode 100644 Borland Turbo Pascal v2/INTRPTCL.DOC create mode 100644 Borland Turbo Pascal v2/READ.ME create mode 100644 Borland Turbo Pascal v2/SIEVE.PAS create mode 100644 Borland Turbo Pascal v2/SOUND.PAS create mode 100644 Borland Turbo Pascal v2/TIMEUTIL.PAS create mode 100644 Borland Turbo Pascal v2/TINST.COM create mode 100644 Borland Turbo Pascal v2/TINST.MSG create mode 100644 Borland Turbo Pascal v2/TLIST.COM create mode 100644 Borland Turbo Pascal v2/TTT.PAS create mode 100644 Borland Turbo Pascal v2/TURBO.COM create mode 100644 Borland Turbo Pascal v2/TURBO.MSG create mode 100644 Borland Turbo Pascal v2/WINDOW.PAS create mode 100644 Borland Turbo Pascal v2/m.bat diff --git a/Borland Turbo Pascal v1/DT.BAK b/Borland Turbo Pascal v1/DT.BAK deleted file mode 100644 index 90bf26e..0000000 --- a/Borland Turbo Pascal v1/DT.BAK +++ /dev/null @@ -1,10 +0,0 @@ -program dt; - -var - h, m, s, s100: word; - -begin - GetTime( h, m, s, s100 ); - Write( 'time: ' ); - Write( h, ':', m, s, s100 ); -end. \ No newline at end of file diff --git a/Borland Turbo Pascal v1/TIMEDIFF.BAK b/Borland Turbo Pascal v1/TIMEDIFF.BAK deleted file mode 100644 index 336776e..0000000 --- a/Borland Turbo Pascal v1/TIMEDIFF.BAK +++ /dev/null @@ -1,105 +0,0 @@ -program TimeDifference; - -type -timetype = record h, m, s, l : integer; end; - -regpack = record - ax,bx,cx,dx,bp,si,di,ds,es,flags: integer; - end; - -var - ta, tb, tdiff: timetype; - i, j, x: integer; - sh, sm, ss, sl: string[2]; - -procedure time_difference( var tStart, tEnd, tDiff : timetype ); -begin - if ( tEnd.l >= tStart.l ) then - tDiff.l := tEnd.l - tStart.l - else - begin - tDiff.l := 100 + tEnd.l - tStart.l; - tStart.s := tStart.s + 1; - end; - - if ( tEnd.s >= tStart.s ) then - tDiff.s := tEnd.s - tStart.s - else - begin - tDiff.s := 60 + tEnd.s - tStart.s; - tStart.m := tStart.m + 1; - end; - - if ( tend.m >= tStart.m ) then - tDiff.m := tEnd.m - tStart.m - else - begin - tDiff.m := 60 + tEnd.m - tStart.m; - tStart.h := tStart.h + 1; - end; - if ( tEnd.h >= tStart.h ) then - tDiff.h := tEnd.h - tStart.h - else - tDiff.h := 12 - tEnd.h - tStart.h; -end; - -procedure get_time( var tt : timetype ); -var - recpack: regpack; {assign record} - ah,al,ch,cl,dh: byte; - -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 - tt.h := cx shr 8; - tt.m := cx mod 256; - tt.s := dx shr 8; - tt.l := dx mod 256; - end; -end; - -procedure print_time( var t: timetype ); - -var sval : string[2]; - -begin - if ( t.h < 10 ) then write( '0' ); - write( t.h, ':' ); - if ( t.m < 10 ) then write( '0' ); - write( t.m, ':' ); - if ( t.s < 10 ) then write( '0' ); - write( t.s, '.' ); - if ( t.l < 10 ) then write( '0' ); - write( t.l ); -end; - -begin - get_time( ta ); - - write( 'start time: ' ); - print_time( ta ); - writeln; - - for j := 1 to 300 do - for i := 1 to 30000 do - x := i * 4 * 4 + x; - - get_time( tb ); - write( 'end time: ' ); - print_time( tb ); - writeln; - - time_difference( ta, tb, tdiff ); - write( 'difference: ' ); - print_time( tdiff ); - writeln; - - writeln( 'done' ); -end. - \ No newline at end of file diff --git a/Borland Turbo Pascal v1/m.bat b/Borland Turbo Pascal v1/m.bat new file mode 100644 index 0000000..c5ad3b6 --- /dev/null +++ b/Borland Turbo Pascal v1/m.bat @@ -0,0 +1,3 @@ +rem there are no command-line tools for turbo pascal. Run the app and compile from within. + + diff --git a/Borland Turbo Pascal v2/ART.PAS b/Borland Turbo Pascal v2/ART.PAS new file mode 100644 index 0000000..692ed22 --- /dev/null +++ b/Borland Turbo Pascal v2/ART.PAS @@ -0,0 +1,153 @@ + +const + Memory = 150; + +var + Line: array [1..Memory] of record + LX1,LY1: integer; + LX2,LY2: integer; + LColor: integer; + end; + X1,X2,Y1,Y2, + CurrentLine, + ColorCount, + IncrementCount, + DeltaX1,DeltaY1,DeltaX2,DeltaY2, + I,Color: integer; + Ch: char; + + +procedure Check; +var + Ch: char; +begin + writeln('This program will only work if you have the color graphics adapter installed'); + write('Continue Y/N '); + repeat read (Kbd,Ch) until Upcase(Ch) in ['Y','N']; + if Upcase(Ch)='N' then Halt; +end; + + + +procedure Init; +begin + for I:=1 to Memory do + with Line[I] do + begin + LX1:=0; LX2:=0; + LY1:=0; LY2:=0; + end; + X1:=0; Y1:=0; X2:=0; Y2:=0; + CurrentLine:=1; + ColorCount:=0; + IncrementCount:=0; + Ch:=' '; +end; + +procedure AdjustX(var X,DeltaX: integer); +var + TestX: integer; +begin + TestX:=X+DeltaX; + if (TestX<1) or (TestX>320) then + begin + TestX:=X; + DeltaX:=-DeltaX; + end; + X:=TestX; +end; + +procedure AdjustY(var Y,DeltaY: integer); +var + TestY: integer; +begin + TestY:=Y+DeltaY; + if (TestY<1) or (TestY>190) then + begin + TestY:=Y; + DeltaY:=-DeltaY; + end; + Y:=TestY; +end; + +procedure SelectNewColor; +begin + Color:=Random(3)+1; + ColorCount:=5*(1+Random(10)); +end; + +procedure SelectNewDeltaValues; +begin + DeltaX1:=Random(7)-3; + DeltaX2:=Random(7)-3; + DeltaY1:=Random(7)-3; + DeltaY2:=Random(7)-3; + IncrementCount:=4*(1+Random(9)); +end; + + +procedure SaveCurrentLine; +begin + with Line[CurrentLine] do + begin + LX1:=X1; + LY1:=Y1; + LX2:=X2; + LY2:=Y2; + LColor:=Color; + end; +end; + + +procedure Regenerate; +var + I: integer; +begin + NoSound; + GraphColorMode; Palette(2); + for I:=1 to Memory do with Line[I] do Draw(LX1,LY1,LX2,LY2,LColor); + gotoxy(1,25); + write('Press any key to continue, ESC to stop'); + read(Kbd,Ch); +end; + +begin + Check; + Init; + GraphColorMode; + Palette(2); + Color:=2; + gotoxy(1,25); + write('Press any key to regenerate, ESC to stop'); + repeat + with Line[CurrentLine] do Draw(LX1,LY1,LX2,LY2,0); + + if ColorCount=0 then SelectNewColor; + if IncrementCount=0 then SelectNewDeltaValues; + + AdjustX(X1,DeltaX1); AdjustX(X2,DeltaX2); + AdjustY(Y1,DeltaY1); AdjustY(Y2,DeltaY2); + + Draw(X1,Y1,X2,Y2,Color); + + SaveCurrentLine; + + CurrentLine:=Succ(CurrentLine); + if CurrentLine>Memory then CurrentLine:=1; + ColorCount:=Pred(ColorCount); IncrementCount:=Pred(IncrementCount); + + if KeyPressed then + begin + read(Kbd,Ch); + if Ch<>#27 then + begin + Regenerate; + gotoxy(1,25); + write('Press any key to regenerate, ESC to stop'); + end; + end; + until Ch=#27; + TextMode; +end. + + \ No newline at end of file diff --git a/Borland Turbo Pascal v2/CALC.HLP b/Borland Turbo Pascal v2/CALC.HLP new file mode 100644 index 0000000..9e1d2a1 --- /dev/null +++ b/Borland Turbo Pascal v2/CALC.HLP @@ -0,0 +1,144 @@ + 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 accidental erasure. +.PA + + +In addition to this MicroCalc offers all the usual features of a +spread sheet program: + + + * Load a spread sheet from the disk. + * Save a spread sheet on the disk. + * Automatic recalculation after each entry. (May be 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 + + 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. <-- + + + \ No newline at end of file diff --git a/Borland Turbo Pascal v2/CALC.PAS b/Borland Turbo Pascal v2/CALC.PAS new file mode 100644 index 0000000..fc10933 --- /dev/null +++ b/Borland Turbo Pascal v2/CALC.PAS @@ -0,0 +1,1259 @@ + + +{ This program is hereby donated to the public domain } +{ for non commercial use only } + +{Here is a note to the compiler: } +{$R-,U-,V-,X-,C-} + +program MicroCalc; + +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=Start); + 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 Exist:=true; +end; + + +procedure GetFileName(var Line: AnyString; FileType:String3); +begin + Line:=''; + repeat + Read(Kbd,Ch); + if Upcase(Ch) in ['A'..'Z',^M] then + begin + write(Upcase(Ch)); + Line:=Line+Ch; + end; + until (Ch=^M) or (length(Line)=8); + if Ch=^M then Delete(Line,Length(Line),1); + if Line<>'' then Line:=Line+'.'+FileType; +end; + +{.CP20} + +procedure Save; +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 then Str(Value:FW:DEC,P) else Str(Value:FW,P); + Line:=Line+P; + end; + end else Line:=Line+Contents; + end; { With } + end; { One line } + For Count:=1 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[StandardFunction] 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 + GotoXY(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 Attributes; + 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].Contents<>''); + 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 + begin + 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; { 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. + + \ No newline at end of file diff --git a/Borland Turbo Pascal v2/CALCDEMO.MCS b/Borland Turbo Pascal v2/CALCDEMO.MCS new file mode 100644 index 0000000000000000000000000000000000000000..70aa48c60f48e1807984d4064a3f925cf330bc8d GIT binary patch literal 11760 zcmeHMPj4GV6n88Of?Ej=E#iWBC>Ohmo!CyGRBEa0rZiIOpvDzQm5_$@#NKvy$C}x# zlLHceg%DqZ55QMId>1ZUdg8#vyqUEfyIGsf?u)ciyo%!W%)HU zwjRaa3-KPl9xpC?!8N1=?c^}okK<&brX^fgTX(CagP`SbHqIr8_bD0~!)z$zi%_Zx z2TVIrcvCY?<&U(yVi;VL4d-u?eDQj0UE(af1b@WYHujo)@x!&+&h6Oi7cczIOliFO zZlkeyUEG=Pr+AHeJ+9D_bq4Rg=C@O)0Q_OfZ%XJX2kY5CZ-pKBLf3j{&6}=C}f@HZ83zY)m}BB2xtZ{Ox@n zl|KFo^%+%FFc=8wD>!xp^RaA$fv~X(o@i^T;9BiGugM7VtAVn6o_%bi&3x$EJ=<5C zaJ1jvgx2BFCLFYl0o}mrV_7V*^qmMtd|raSYt#N*cjaLfdq?vt)vJy2t%G){S=%mG zYTMgzH-gdp5b}HXtRLJmozg8MngS0gn7+WYtmP2&|EbIq%YFOD^I!hDhy2#ywV4!O zU(ui6?B~A}_Btm@Z@*Q&an8sW7+Cq^0>+A1N}r#zo)4(c8#Nxi{qV*%S7OSJ>s9Xe z`^exuiyI-XZ}Xhk74|2SfzA58n4I=)vgRRX4VW0nf?YF&Lex3OKAdly(7B5*pztsGw L{Y#CPb$$N>)>46V literal 0 HcmV?d00001 diff --git a/Borland Turbo Pascal v2/CALCMAIN.PAS b/Borland Turbo Pascal v2/CALCMAIN.PAS new file mode 100644 index 0000000..db57bfc --- /dev/null +++ b/Borland Turbo Pascal v2/CALCMAIN.PAS @@ -0,0 +1,28 @@ +{ 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 + +} + + \ No newline at end of file diff --git a/Borland Turbo Pascal v2/COLOR.PAS b/Borland Turbo Pascal v2/COLOR.PAS new file mode 100644 index 0000000..d5aa5ce --- /dev/null +++ b/Borland Turbo Pascal v2/COLOR.PAS @@ -0,0 +1,133 @@ +program ColorDemo; + +type + AnyString = string[40]; + + +procedure Check; +var + Ch: char; +begin + writeln('This program will only work if you have the color graphics adapter installed'); + write('Continue Y/N '); + repeat read (Kbd,Ch) until Upcase(Ch) in ['Y','N']; + if Upcase(Ch)='N' then Halt; +end; + + + +procedure PaletteDemo; +var + Ch: Char; + PaletteNumber, Background: integer; + PaletteChange: boolean; + + procedure DrawBoxes; + var + Y: integer; + begin + for Y:=1 to 24 do Draw(10,10*8+Y,320,10*8+Y,1); + for Y:=1 to 24 do Draw(10,13*8+Y,320,13*8+Y,2); + for Y:=1 to 24 do Draw(10,16*8+Y,320,16*8+Y,3); + end {DrawBoxes}; + + procedure Msg(X,Y: integer; S: AnyString); + { write the string S at X,Y } + begin + GotoXY(X,Y); + Write(S); + end {Msg}; + + procedure Help; + begin { write the help text} + Msg(1,1,' TURBO COLOR DEMO '); + Msg(1,3,'Procedures used:'); + Msg(1,6,' To make background: '); + Msg(1,7,' To select a palette: '); + Msg(1,9,'Colors in selected palette are:'); + Msg(1,12,'1'); + Msg(1,15,'2'); + Msg(1,18,'3'); + Msg(1,21,'Use arrows to change palette number'); + Msg(1,22,'or press B to change Background'); + GotoXY(1,25); + write('Press ESC twice to exit'); + end {Help}; + + + procedure Update; + begin + GotoXY(22,6); write('GraphBackground(',Background,') '); + GotoXY(22,7); write('Palette(',PaletteNumber,')'); + GraphBackground(Background); + Palette(PaletteNumber); + if PaletteChange then + begin + GotoXY(1,21); + writeln('Use arrows to change palette number '); + write('Press B to change Background '); + end else + begin + GotoXY(1,21); + writeln('Use arrows to change background number'); + write('or press P to change Palette '); + end; + end {Update}; + +begin {PaletteDemo} + GraphColorMode; + BackGround:=0; + PaletteNumber:=0; + GraphBackground(BackGround); + Palette(PaletteNumber); + DrawBoxes; + Help; + Update; + repeat + repeat read(Kbd,Ch) until Ch in ['P','p','B','b',#27]; + case Upcase(Ch) of + 'P': PaletteChange:=true; + 'B': PaletteChange:=false; + #27: begin + read(Kbd,Ch); + case Ch of + 'P': begin + if PaletteChange then + begin + PaletteNumber:=PaletteNumber-1; + if PaletteNumber<0 then PaletteNumber:=0; + end else + begin + Background:=BackGround-1; + if BackGround<0 then BackGround:=0; + end; + end; + 'H': begin + if PaletteChange then + begin + PaletteNumber:=PaletteNumber+1; + if PaletteNumber>3 then PaletteNumber:=3; + end else + begin + Background:=BackGround+1; + if BackGround>15 then BackGround:=15; + end; + end; + end; + end; + end; + Update; + until Ch=#27; +end {Palettedemo}; + + + +begin {Main program} + Check; + PaletteDemo; + TextMode; +end. + + + + \ No newline at end of file diff --git a/Borland Turbo Pascal v2/DOSFCALL.DOC b/Borland Turbo Pascal v2/DOSFCALL.DOC new file mode 100644 index 0000000..6b7596a --- /dev/null +++ b/Borland Turbo Pascal v2/DOSFCALL.DOC @@ -0,0 +1,48 @@ +{* 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 only 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,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. \ No newline at end of file diff --git a/Borland Turbo Pascal v1/OUTCHAR.BAK b/Borland Turbo Pascal v2/DOS_GT.PAS similarity index 54% rename from Borland Turbo Pascal v1/OUTCHAR.BAK rename to Borland Turbo Pascal v2/DOS_GT.PAS index a3190d7..6272014 100644 --- a/Borland Turbo Pascal v1/OUTCHAR.BAK +++ b/Borland Turbo Pascal v2/DOS_GT.PAS @@ -1,29 +1,27 @@ -program outchar; - type regpack = record ax,bx,cx,dx,bp,si,di,ds,es,flags: integer; end; -procedure oc( var c : char ); +procedure get_time( var tt : timetype ); var recpack: regpack; ah,al,ch,cl,dh: byte; begin - ah := $8; + ah := $2c; with recpack do begin ax := ah shl 8 + al; - dh := 87; {c;} end; intr( $21, recpack ); - + with recpack do + begin + tt.h := cx shr 8; + tt.m := cx mod 256; + tt.s := dx shr 8; + tt.l := dx mod 256; + end; end; -var c : char; -begin { outchar } - c := 'W'; - oc( c ); -end. { outchar } - \ No newline at end of file + diff --git a/Borland Turbo Pascal v2/E.PAS b/Borland Turbo Pascal v2/E.PAS new file mode 100644 index 0000000..9290430 --- /dev/null +++ b/Borland Turbo Pascal v2/E.PAS @@ -0,0 +1,42 @@ +program e; + +const + DIGITS = 200; + +type + arrayType = array[ 0..DIGITS ] of integer; + +var + high, n, x : integer; + a : arrayType; + +begin + high := DIGITS; + x := 0; + + n := high - 1; + while n > 0 do begin + a[ n ] := 1; + n := n - 1; + end; + + a[ 1 ] := 2; + a[ 0 ] := 0; + + while high > 9 do begin + high := high - 1; + n := high; + while 0 <> n do begin + a[ n ] := x MOD n; + x := 10 * a[ n - 1 ] + x DIV n; + n := n - 1; + end; + + Write( x ); + end; + + writeln; + writeln( 'done' ); +end. + + \ No newline at end of file diff --git a/Borland Turbo Pascal v2/EXTERNAL.DOC b/Borland Turbo Pascal v2/EXTERNAL.DOC new file mode 100644 index 0000000..1f83023 --- /dev/null +++ b/Borland Turbo Pascal v2/EXTERNAL.DOC @@ -0,0 +1,89 @@ + +; * 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; +; +; So why bother ????? + + + \ No newline at end of file diff --git a/Borland Turbo Pascal v2/INTRPTCL.DOC b/Borland Turbo Pascal v2/INTRPTCL.DOC new file mode 100644 index 0000000..1ead8d8 --- /dev/null +++ b/Borland Turbo Pascal v2/INTRPTCL.DOC @@ -0,0 +1,47 @@ +{* 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,di,si,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. \ No newline at end of file diff --git a/Borland Turbo Pascal v2/READ.ME b/Borland Turbo Pascal v2/READ.ME new file mode 100644 index 0000000..ee625d3 --- /dev/null +++ b/Borland Turbo Pascal v2/READ.ME @@ -0,0 +1,26 @@ + RUN-TIME ERRORS IN OVERLAYS + --------------------------- + + + Run-time errors occurring in overlays are found as usual, +and an address is issued by the error handling system. This +address, however, is an address within the overlay area, and +there is no way of knowing which overlay subprogram was actually +active when the error occurred. + Run-time errors in overlays can therefore not always be +readily found with the Options menu's 'Find run-time error' +facility. What 'Find run-time error' will point out is the first +occurrence of code at the specified address. This, of course, may +be the place of the error, but the error may as well occur in a +subsequent subprogram within the same overlay group. + This it not a serious limitation, however, as the type of +error and the way it occurs most often will indicate to you in +which subprogram the error happened. The way to locate the error +precisely is then to place the suspected subprogram as the first +subprogram of the overlay group. 'Find run-time error' will then +work. + THE BEST THING TO DO IS NOT TO PLACE SUBPROGRAMS IN OVERLAYS +UNTIL THEY HAVE BEEN FULLY DEBUGGED! + + + \ No newline at end of file diff --git a/Borland Turbo Pascal v2/SIEVE.PAS b/Borland Turbo Pascal v2/SIEVE.PAS new file mode 100644 index 0000000..12729cf --- /dev/null +++ b/Borland Turbo Pascal v2/SIEVE.PAS @@ -0,0 +1,31 @@ +program sieve; + +const + size = 8190; + +type + flagType = array[ 0..size ] of boolean; + +var + i, k, prime, count, iter : integer; + flags : flagType; + +begin + for iter := 1 to 10 do begin + count := 0; + for i := 0 to size do flags[ i ] := true; + for i := 0 to size do begin + if flags[ i ] then begin + prime := i + i + 3; + k := i + prime; + while k <= size do begin + flags[ k ] := false; + k := k + prime; + end; + count := count + 1; + end; + end; + end; + + writeln( 'count of primes: ', count ); +end. \ No newline at end of file diff --git a/Borland Turbo Pascal v2/SOUND.PAS b/Borland Turbo Pascal v2/SOUND.PAS new file mode 100644 index 0000000..845930a --- /dev/null +++ b/Borland Turbo Pascal v2/SOUND.PAS @@ -0,0 +1,76 @@ +program SoundDemo; + + +type + NoteRecord = record + C,CF,D,DF,E,F,FF,G,GF,A,AF,B: integer; + end; + +Const + Notes: NoteRecord = + (C:1;CF:2;D:3;DF:4;E:5;F:6;FF:7;G:8;GF:9;A:10;AF:11;B:12); + + +procedure Play(Octave,Note,Duration: integer); + +{ Play Note in Octave Duration milliseconds } +{ Frequency computed by first computing C in } +{ Octave then increasing frequency by Note-1 } +{ times the twelfth root of 2. (1.059463994) } +{ } +{ If Duration is zero Note will be played } +{ until you activate procedure NoSound } + +var + Frequency: real; + I: integer; +begin + Frequency:=32.625; + { Compute C in Octave } + for I:=1 to Octave do Frequency:=Frequency*2; + { Increase frequency Note-1 times } + for I:=1 to Note-1 do Frequency:=Frequency*1.059463094; + if Duration<>0 then + begin + Sound(Round(Frequency)); + Delay(Duration); + NoSound; + end else Sound(Round(Frequency)); +end; + + +procedure SoftAlarm; +{ Play the notes G and D in octave three 7 times } +{ each with a duration of 70 milliseconds. } +var + I: integer; +begin + for I:=1 to 7 do with Notes do + begin + Play(4,G,70); + Play(4,D,70); + end; + Delay(1000); +end; + + +procedure Sirene; +var + Frequency: integer; +begin + for Frequency:= 500 to 2000 do begin Delay(1); Sound(Frequency); end; + for Frequency:=2000 downto 500 do begin Delay(1); Sound(Frequency); end; +end; + + +begin + writeln('Press any key to Stop'); + repeat SoftAlarm until KeyPressed; + read(Kbd); + writeln('Press any key to Stop'); + repeat Sirene until KeyPressed; + NoSound; +end. + + + \ No newline at end of file diff --git a/Borland Turbo Pascal v2/TIMEUTIL.PAS b/Borland Turbo Pascal v2/TIMEUTIL.PAS new file mode 100644 index 0000000..2a7c17e --- /dev/null +++ b/Borland Turbo Pascal v2/TIMEUTIL.PAS @@ -0,0 +1,65 @@ +type + timetype = record h, m, s, l : integer; end; + +procedure time_difference( var tStart, tEnd, tDiff : timetype ); +var + startSecond, startMinute, startHour : integer; + +begin { time_difference } + startSecond := tStart.s; + startMinute := tStart.m; + startHour := tStart.h; + + tDiff.l := tEnd.l - tStart.l; + if ( tDiff.l < 0 ) then + begin + tDiff.l := tDiff.l + 100; + startSecond := startSecond + 1; + end; + + tDiff.s := tEnd.s - startSecond; + if ( tDiff.s < 0 ) then + begin + tDiff.s := tDiff.s + 60; + startMinute := startMinute + 1; + end; + + tDiff.m := tEnd.m - startMinute; + if ( tDiff.m < 0 ) then + begin + tDiff.m := tDiff.m + 60; + startHour := startHour + 1; + end; + + tDiff.h := tEnd.h - startHour; + if ( tDiff.h < 0 ) then + tDiff.h := tDiff.h + 12; +end; + +procedure print_time_part( num : integer ); +begin + if ( num < 10 ) then write( '0' ); + write( num ); +end; + +procedure print_time( var t: timetype ); +begin + print_time_part( t.h ); + write( ':' ); + print_time_part( t.m ); + write( ':' ); + print_time_part( t.s ); + write( '.' ); + print_time_part( t.l ); +end; + +procedure print_elapsed_time( var timeStart, timeEnd: timetype ); +var + timeDiff: timetype; +begin + time_difference( timeStart, timeEnd, timeDiff ); + write( 'elapsed time: ' ); + print_time( timeDiff ); + writeln; +end; + \ No newline at end of file diff --git a/Borland Turbo Pascal v2/TINST.COM b/Borland Turbo Pascal v2/TINST.COM new file mode 100644 index 0000000000000000000000000000000000000000..d784648a476a39d17b71b15354dd7f72d2028265 GIT binary patch literal 28479 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 XE4{jde>*_Jue(7EN$e2l;Q#&~sqfJ{ literal 0 HcmV?d00001 diff --git a/Borland Turbo Pascal v2/TINST.MSG b/Borland Turbo Pascal v2/TINST.MSG new file mode 100644 index 0000000..75ec0a4 --- /dev/null +++ b/Borland Turbo Pascal v2/TINST.MSG @@ -0,0 +1,129 @@ +1 TURBO Pascal installation menu. +2 Choose installation item from the following: +3 +4 [S]creen installation | [C]ommand installation | [Q]uit +5 +6 Enter S, C, or Q: +10 Duplicate definition. Error occurred between question +11 Commands starting with the same letter must have the same length. + Error occurred between question +12 The total maximum length of commands are execeeded +13 -> + + +14 CURSOR MOVEMENTS: + +20 Character left +21 Alternative +22 Character right +23 Word left +24 Word right +25 Line up +26 Line down +27 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 + \ No newline at end of file diff --git a/Borland Turbo Pascal v2/TLIST.COM b/Borland Turbo Pascal v2/TLIST.COM new file mode 100644 index 0000000000000000000000000000000000000000..469cdf0a887b9d15dc0bdbe0c1cf5f4f7b866451 GIT binary patch literal 17271 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 t then + begin + if ( ( ( t = board[1] ) and ( t = board[2] ) ) or + ( ( t = board[3] ) and ( t = board[6] ) ) ) then + p := t; + end; + + if pieceBlank = p then + begin + t := board[1]; + if ( t = board[4] ) and ( t = board[7] ) then + p := t + else + begin + t := board[2]; + if ( t = board[5] ) and ( t = board[8] ) then + p := t + else + begin + t := board[3]; + if ( t = board[4] ) and ( t = board[5] ) then + p := t + else + begin + t := board[6]; + if ( t = board[7] ) and ( t = board[8] ) then + p := t + else + begin + t := board[4]; + if ( ( ( t = board[0] ) and ( t = board[8] ) ) or + ( ( t = board[2] ) and ( t = board[6] ) ) ) then + p := t + end; + end; + end; + end; + end; + + lookForWinner := p; +end; + +function winner2( move: integer ) : integer; +var + x : integer; +begin + case move of + 0: begin + x := board[ 0 ]; + if not ( ( ( x = board[1] ) and ( x = board[2] ) ) or + ( ( x = board[3] ) and ( x = board[6] ) ) or + ( ( x = board[4] ) and ( x = board[8] ) ) ) + then x := PieceBlank; + end; + 1: begin + x := board[ 1 ]; + if not ( ( ( x = board[0] ) and ( x = board[2] ) ) or + ( ( x = board[4] ) and ( x = board[7] ) ) ) + then x := PieceBlank; + end; + 2: begin + x := board[ 2 ]; + if not ( ( ( x = board[0] ) and ( x = board[1] ) ) or + ( ( x = board[5] ) and ( x = board[8] ) ) or + ( ( x = board[4] ) and ( x = board[6] ) ) ) + then x := PieceBlank; + end; + 3: begin + x := board[ 3 ]; + if not ( ( ( x = board[4] ) and ( x = board[5] ) ) or + ( ( x = board[0] ) and ( x = board[6] ) ) ) + then x := PieceBlank; + end; + 4: begin + x := board[ 4 ]; + if not ( ( ( x = board[0] ) and ( x = board[8] ) ) or + ( ( x = board[2] ) and ( x = board[6] ) ) or + ( ( x = board[1] ) and ( x = board[7] ) ) or + ( ( x = board[3] ) and ( x = board[5] ) ) ) + then x := PieceBlank; + end; + 5: begin + x := board[ 5 ]; + if not ( ( ( x = board[3] ) and ( x = board[4] ) ) or + ( ( x = board[2] ) and ( x = board[8] ) ) ) + then x := PieceBlank; + end; + 6: begin + x := board[ 6 ]; + if not ( ( ( x = board[7] ) and ( x = board[8] ) ) or + ( ( x = board[0] ) and ( x = board[3] ) ) or + ( ( x = board[4] ) and ( x = board[2] ) ) ) + then x := PieceBlank; + end; + 7: begin + x := board[ 7 ]; + if not ( ( ( x = board[6] ) and ( x = board[8] ) ) or + ( ( x = board[1] ) and ( x = board[4] ) ) ) + then x := PieceBlank; + end; + 8: begin + x := board[ 8 ]; + if not ( ( ( x = board[6] ) and ( x = board[7] ) ) or + ( ( x = board[2] ) and ( x = board[5] ) ) or + ( ( x = board[0] ) and ( x = board[4] ) ) ) + then x := PieceBlank; + end; + end; + + winner2 := x; +end; + +function minmax( alpha: integer; beta: integer; depth: integer; move: integer ): integer; +var + p, value, pieceMove, score : integer; +begin + evaluated := evaluated + 1; + value := scoreInvalid; + if depth >= 4 then + begin + { p := lookForWinner; } { this is much slower } + p := winner2( move ); + if p <> pieceBlank then + begin + if p = pieceX then + value := scoreWin + else + value := scoreLose + end + else if depth = 8 then + value := scoreTie; + end; + + if value = scoreInvalid then + begin + if Odd( depth ) then + begin + value := scoreMin; + pieceMove := pieceX; + end + else + begin + value := scoreMax; + pieceMove := pieceO; + end; + + p := 0; + repeat + if board[ p ] = pieceBlank then + begin + board[ p ] := pieceMove; + score := minmax( alpha, beta, depth + 1, p ); + board[ p ] := pieceBlank; + + if Odd( depth ) then + begin + if ( score > value ) then + begin + value := score; + if ( value = scoreWin ) or ( value >= beta ) then p := 10 + else if ( value > alpha ) then alpha := value; + end; + end + else + begin + if ( score < value ) then + begin + value := score; + if ( value = scoreLose ) or ( value <= alpha ) then p := 10 + else if ( value < beta ) then beta := value; + end; + end; + end; + p := p + 1; + until p > 8; + end; + + minmax := value; +end; + +procedure runit( move : integer ); +var + score: integer; +begin + board[move] := pieceX; + score := minmax( scoreMin, scoreMax, 0, move ); + board[move] := pieceBlank; +end; + +function Trim( intext : CommandString ): CommandString; +var FirstPos, LastPos: integer; +begin + FirstPos := 1; + while ( FirstPos <= Length( intext ) ) and ( intext[FirstPos] = #32 ) do + FirstPos := FirstPos + 1; + + LastPos := Length( intext ); + while ( LastPos >= 1 ) and ( intext[LastPos] = #32 ) do + LastPos := LastPos - 1; + + Trim := Copy( intext, FirstPos, LastPos - FirstPos + 1 ); +end; + +var + i, loops, errpos: integer; + strArg : CommandString; + cmdTail : CommandString absolute Cseg : $80; +begin + loops := Iterations; + + { not available on TP v1 + if 0 <> Length( ParamStr( 1 ) ) then Val( ParamStr( 1 ), loops, errpos ); + } + + if Length( cmdTail ) > 0 then + begin + { trim the space at the start that's always there } + strArg := Trim( cmdTail ); + Val( strArg, loops, errpos ); + end; + + for i := 0 to 8 do + board[i] := pieceBlank; + + WriteLn( 'begin' ); + get_time( timeStart ); + + for i := 1 to loops do + begin + evaluated := 0; { once per loop to prevent overflow } + runit( 0 ); + runit( 1 ); + runit( 4 ); + end; + + get_time( timeEnd ); + print_elapsed_time( timeStart, timeEnd ); + + WriteLn( 'moves evaluated: ', evaluated ); + WriteLn( 'iterations: ', loops ); +end. diff --git a/Borland Turbo Pascal v2/TURBO.COM b/Borland Turbo Pascal v2/TURBO.COM new file mode 100644 index 0000000000000000000000000000000000000000..acb3ea141026a7ed505a7b9017497b8396f85fa5 GIT binary patch literal 36480 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 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 \ No newline at end of file diff --git a/Borland Turbo Pascal v2/WINDOW.PAS b/Borland Turbo Pascal v2/WINDOW.PAS new file mode 100644 index 0000000..f440c29 --- /dev/null +++ b/Borland Turbo Pascal v2/WINDOW.PAS @@ -0,0 +1,112 @@ +program TestWindow; +{$C-} + +const + Windows = 3; + Wtab : array[1..Windows,1..5] of Integer + = (( 5, 2, 35, 11, 1), { X0,Y0,X1,Y1,LineNo } + (45, 2, 75, 11, 1), + ( 5, 15, 75, 23, 1) + ); +type + String255 = String[255]; + +var + i : Integer; + Ch : Char; + + + procedure Frame(UpperLeftX, UpperLeftY, LowerRightX, LowerRightY: Integer); + var + i: Integer; + begin + GotoXY(UpperLeftX, UpperLeftY); Write(chr(218)); + for i:=UpperLeftX+1 to LowerRightX-1 do Write(chr(196)); + Write(chr(191)); + for i:=UpperLeftY+1 to LowerRightY-1 do + begin + GotoXY(UpperLeftX , i); Write(chr(179)); + GotoXY(LowerRightX, i); Write(chr(179)); + end; + GotoXY(UpperLeftX, LowerRightY); + Write(chr(192)); + for i:=UpperLeftX+1 to LowerRightX-1 do Write(chr(196)); + Write(chr(217)); + end { Frame }; + + + function RanStr(Len: Integer): String255; + var + S: String255; + i: Integer; + begin + S[0]:=Chr(Len); + for Len:=1 to Len do + begin + repeat i:=Random(255) until not (Chr(I) in[^@,^G,^H,^J,^M]); + S[Len]:=Chr(i); + end; + RanStr:=S; + end { RanStr }; + + + procedure SelectWindow(Win: Integer); + begin + Window(Wtab[Win,1], Wtab[Win,2], Wtab[Win,3], Wtab[Win,4]) + end { SelectWindow }; + + + procedure Window1; + begin + LowVideo; + SelectWindow(1); + GotoXY(1,1); + DelLine; + GotoXY(1, Wtab[1,4]-Wtab[1,2]+1); + Write('Line ', Wtab[1,5]:5,' ',chr(219),' ',RanStr(15)); + Wtab[1,5]:=Succ(Wtab[1,5]); + NormVideo; + end { Window1 }; + + procedure Window2; + begin + LowVideo; + SelectWindow(2); + GotoXY(1,1); + DelLine; + GotoXY(1, Wtab[2,4]-Wtab[2,2]+1); + Write('Line ', Wtab[2,5]:5,' ',chr(219),' ',RanStr(15)); + Wtab[2,5]:=Succ(Wtab[2,5]); + NormVideo; + end { Window2 }; + + + procedure Window3; + begin + LowVideo; + SelectWindow(3); + GotoXY(1,1); + InsLine; + WriteLn('Line ', Wtab[3,5]:5,' ',chr(219),' ',RanStr(55)); + Wtab[3,5]:=Succ(Wtab[3,5]); + NormVideo; + end { Window3 }; + +begin + GotoXY(15,25); + Write('TURBO PASCAL Window Demo - Press any key to stop'); + + for i:=1 to Windows do + Frame(Wtab[i,1]-1, Wtab[i,2]-1, Wtab[i,3]+1, Wtab[i,4]+1); + + repeat + Window1; + Window2; + Window3; + until KeyPressed; + Read(KBD, Ch); + Window(1,1,80,25); + GotoXY(1,24); + +end. + \ No newline at end of file diff --git a/Borland Turbo Pascal v2/m.bat b/Borland Turbo Pascal v2/m.bat new file mode 100644 index 0000000..c5ad3b6 --- /dev/null +++ b/Borland Turbo Pascal v2/m.bat @@ -0,0 +1,3 @@ +rem there are no command-line tools for turbo pascal. Run the app and compile from within. + +