home *** CD-ROM | disk | FTP | other *** search
/ Hacker Chronicles 2 / HACKER2.BIN / 157.GLOBAL.PAS < prev    next >
Pascal/Delphi Source File  |  1989-03-17  |  19KB  |  439 lines

  1. {----------------------------------------------------------------------------}
  2. {-                                                                          -}
  3. {-    These constant, types, variables and procedures are ones used         -}
  4. {-    throughout the program.                                               -}
  5. {-                                                                          -}
  6. {-    NOTE: To use the DOSCrt unit instead of the Crt unit, define DOSCrt   -}
  7. {-          in the O/C/C menu option. This unit, while slower, will work    -}
  8. {-          with the Cordata LP-300 laser printer.                          -}
  9. {-                                                                          -}
  10. {----------------------------------------------------------------------------}
  11.  
  12. UNIT Global;
  13.  
  14. INTERFACE
  15. USES
  16.    DOS,
  17.    Printer,
  18. {$IFDEF DOSCrt}
  19.    DOSCrt,
  20. {$ELSE}
  21.    Crt,
  22. {$ENDIF}
  23. {----------------------------------------------------------------------------}
  24. {---   Define real data types dependent upon whether an 8087 is present   ---}
  25. {----------------------------------------------------------------------------}
  26.    Extended_Reals,
  27.    Graph,
  28.    DrawGraf,
  29.    TextOps;
  30.  
  31.  
  32. CONST
  33. {$IFDEF DOSCrt}
  34.    {$IFOPT N+}
  35.       VersionNumber = '3.09A-JF';
  36.    {$ELSE}
  37.       VersionNumber = '3.09AN-JF';
  38.    {$ENDIF}
  39. {$ELSE}
  40.    {$IFOPT N+}
  41.       VersionNumber = '3.09-JF';
  42.    {$ELSE}
  43.       VersionNumber = '3.09N-JF';
  44.    {$ENDIF}
  45. {$ENDIF}
  46.  
  47. {----------------------------------------------------------------------------}
  48. {---   Version 'A' uses the DOSCrt unit. While slower than the Crt unit   ---}
  49. {---   otherwise used, this unit is compatible with the Cordata LP-300    ---}
  50. {---   laser printers. NOTE: these routines do NOT seem to work on        ---}
  51. {---   Monichrome monitors.                                               ---}
  52. {----------------------------------------------------------------------------}
  53. {---   Version 'N' does NOT use the 80x87 numeric coprocessor. This is    ---}
  54. {---   for machines not equipped with such, and is much slower than the   ---}
  55. {---   80x87 versions, and much less accurate.                            ---}
  56. {----------------------------------------------------------------------------}
  57. {    Version 3.02 modified 11 Mar 88. (?)                                    }
  58. {       1: Support for MODAS data files added since SPS BASIC formats        }
  59. {          numbers in a manner incompatible with Turbo Pascal.               }
  60. {                                                                            }
  61. {    Version 3.03 modified 22 Mar 88.                                        }
  62. {       1: Time delay added in CreateWaveform;                               }
  63. {       2: Exit to System changed to ESC key.                                }
  64. {                                                                            }
  65. {    Version 3.04 modified 25 Mar 88.                                        }
  66. {       1: Support for DOSCrt unit added;                                    }
  67. {       2: Screen title position corrected in graph printouts.               }
  68. {                                                                            }
  69. {    Version 3.05 modified 15 Apr 88.                                        }
  70. {       1: Changes made to DrawGraph routine to allow untyped pointers       }
  71. {          to arrays to be passed, instead of declaring new types in the     }
  72. {          calling program;                                                  }
  73. {       2: Main body of program cleaned up and main menu reorganized;        }
  74. {       3: "Import DDT file" option deleted from FileIO menu. This filetype  }
  75. {          is no longer to be used; instead the Tektronix SPD "standard"     }
  76. {          waveform will be used in all future DDT programs. Support will    }
  77. {          be added for this filetype at a later date. (All FFT files will   }
  78. {          be of this type, once implemented.)                               }
  79. {                                                                            }
  80. {    Version 3.06 modified 15 Jun 88.                                        }
  81. {       (This was the version initially released to the public, after        }
  82. {        publication of my Technical Memorandum.)                            }
  83. {       1: Arithmetic overflow in Create Waveform options corrected.         }
  84. {       2: New version number for no 8087 installed added                    }
  85. {          ("N" in VersionNumber).                                           }
  86. {       3: Header added with author and program name, version number,        }
  87. {          and TM number (HDL-TM_88-7) for documentation.                    }
  88. {                                                                            }
  89. {    Version 3.07 modified 30 Jun 88.                                        }
  90. {       1. ReadText added to UNIT GraphText. This allows text to be read     }
  91. {          from the keyboard and echoed to a graphics screen.                }
  92. {       2: Redundancy of Graphics initialization routine and variables       }
  93. {          removed from the main body of the program.                        }
  94. {----------------------------------------------------------------------------}
  95.  
  96.  
  97.  
  98. {----------------------------------------------------------------------------}
  99. {---     Definition of main data types                                    ---}
  100. {----------------------------------------------------------------------------}
  101. CONST
  102.    TNArraySize   = 2048;                         { max number of data points }
  103.  
  104.  
  105. TYPE
  106.    TNVectorArray = ARRAY [0..TNArraySize] OF REAL;
  107.    TNVectorPtr   = ^TNVectorArray;
  108.  
  109. VAR
  110.    time          : TNVectorPtr;                      { time axis information }
  111.    ampl          : TNVectorPtr;              { amplitude of time domain data }
  112.    freq          : TNVectorPtr;                 { frequency axis information }
  113.    mag           : TNVectorPtr;              { magnitude of freq domain data }
  114.    phase         : TNVectorPtr;                  { phase of freq domain data }
  115.  
  116.  
  117. {----------------------------------------------------------------------------}
  118. {---  Default options; change these from the advanced options menu.       ---}
  119. {----------------------------------------------------------------------------}
  120. CONST
  121.    BackColor   : BYTE    = Blue;         { Background color on color monitor }
  122.    DrawColor   : BYTE    = 7;             { Drawing color for color monitors }
  123.    ForeColor   : BYTE    = LightGreen;   { Foreground color on color monitor }
  124.    NoPrinter   : BOOLEAN = true;            { Printer connected to computer? }
  125.    SerialPort  : BYTE    = 0;                    { Comm. port for digitizer. }
  126.    SPLINE      : BOOLEAN = true;           { Cubic Spline or Linear Interp.? }
  127.    DefaultDataDir : string[64] = 'c:';         { Default data disk/directory }
  128.    DefaultOptions = 'FFT.cfg';                    { File for default options }
  129.  
  130.  
  131. {----------------------------------------------------------------------------}
  132. {---         System constants                                             ---}
  133. {----------------------------------------------------------------------------}
  134. CONST
  135.    blank        = '     ';                          { Blank string for info  }
  136.    MaxInfo      = 15;                        { Max num of info lines in file }
  137.    PI           = 3.141592979431152;               { PI, in double precision }
  138.    precision    = 15;                             { Precision of output file }
  139.    StartColumn  = 20;                                   { Left edge of menus }
  140.    TNNearlyZero = 1e-15;                { anything smaller than this is zero }
  141.  
  142.  
  143. {----------------------------------------------------------------------------}
  144. {---     Valid powers-of-two for interpolation routines                   ---}
  145. {----------------------------------------------------------------------------}
  146. CONST
  147.    MinPower   = 9;                        { Min power of 2 to interpolate to }
  148.    MinP_Less1 = 8;                        { MinPower - 1                     }
  149.    MaxPower   = 12;                       { Max power of 2 to interpolate to }
  150.    Pow2 : ARRAY [MinP_Less1..MaxPower] OF INTEGER
  151.               = (256,512,1024,2048,4096);                          { 2^power }
  152. {----------------------------------------------------------------------------}
  153.  
  154.  
  155. TYPE
  156.    InfoArray    = ARRAY [1..MaxInfo] OF string;  { Desriptive info in file }
  157.  
  158. VAR
  159.    ACCEPT       : BOOLEAN;             { Interpolated data acceptable?     }
  160.    Choice       : CHAR;                { temporary variable                }
  161.    HeapTop      : ^BYTE;               { Marks top of dynamic memory.      }
  162.    i            : INTEGER;             { Counter variable.                 }
  163.    info         : InfoArray;           { Array of information stored at    }
  164.                                        { End of data files.                }
  165.    NumPoints    : INTEGER;             { Number of points read.            }
  166.    NumFreqs     : INTEGER;             { Number of distinct frequencies.   }
  167.    ORIG         : BOOLEAN;             { Original Data?                    }
  168.    OutArrayX    : TNVectorPtr;         { Temporary output ptr to TNVector. }
  169.    OutArrayY    : TNVectorPtr;         { Temporary output ptr to TNVector. }
  170.    TempXPtr     : TNVectorPtr;         { Temporary pointer to TNVector.    }
  171.    TempYPtr     : TNVectorPtr;         { Temporary pointer to TNVector.    }
  172.    TRANS        : BOOLEAN;             { Data Translated by FFT?           }
  173.    XMaxTemp     : INTEGER;             { Used in window definitions        }
  174.    YMaxTemp     : INTEGER;             { Used in window definitions        }
  175.  
  176. {----------------------------------------------------------------------------}
  177.  
  178. PROCEDURE Initialize_Variables;
  179.  
  180.  
  181.  
  182. {----------------------------------------------------------------------------}
  183. {-                                                                          -}
  184. {-    ClearWindow is to clear a portion of the screen, from text            -}
  185. {-    coordinates (XMin,YMin) in the upper left, to (XMax,YMax) in the      -}
  186. {-    lower right.                                                          -}
  187. {-                                                                          -}
  188. {----------------------------------------------------------------------------}
  189.  
  190. PROCEDURE ClearWindow ( XMin : BYTE;        { first column to be erased }
  191.                         YMin : BYTE;        { last  column to be erased }
  192.                         XMax : BYTE;        { first row    to be erased }
  193.                         YMax : BYTE         { last  row    to be erased }
  194.                       );
  195.  
  196.  
  197. {----------------------------------------------------------------------------}
  198. {-                                                                          -}
  199. {-    Procedure Buzzer sounds a warning buzzer when an incorrect response   -}
  200. {-    is given by the user.                                                 -}
  201. {-                                                                          -}
  202. {----------------------------------------------------------------------------}
  203.  
  204. PROCEDURE Buzzer;
  205.  
  206.  
  207. {----------------------------------------------------------------------------}
  208. {-                                                                          -}
  209. {-    MainMenu display the main system menu at the center of the screen.    -}
  210. {-                                                                          -}
  211. {----------------------------------------------------------------------------}
  212.  
  213. PROCEDURE MainMenu;
  214.  
  215.  
  216. {----------------------------------------------------------------------------}
  217. {-                                                                          -}
  218. {-    Function EXIST determines if the specified filename already exists.   -}
  219. {-                                                                          -}
  220. {----------------------------------------------------------------------------}
  221.  
  222. FUNCTION EXIST (filename : string) : BOOLEAN;
  223.  
  224.  
  225. {----------------------------------------------------------------------------}
  226. {-                                                                          -}
  227. {-    PrintErrorMsg prints the string s starting at text coordinates        -}
  228. {-    (x,y). The message is surrounded by an error box. If wait is true,    -}
  229. {-    then a char response ,resp, may be read before returning control      -}
  230. {-    to the calling procedure.                                             -}
  231. {-                                                                          -}
  232. {----------------------------------------------------------------------------}
  233.  
  234. PROCEDURE PrintErrorMsg (    s    : string;
  235.                              x    : BYTE;
  236.                              y    : BYTE;
  237.                              wait : BOOLEAN;
  238.                          VAR resp : CHAR
  239.                         );
  240.  
  241.  
  242. (****************************************************************************)
  243. (****************************************************************************)
  244.  
  245.  
  246. IMPLEMENTATION
  247.  
  248.  
  249. PROCEDURE Initialize_Variables;
  250.  
  251.    BEGIN   {Initialize_Variables}
  252.       TRANS   :=false;
  253.       ORIG    :=false;
  254.       ACCEPT  :=false;
  255.       Mark (HeapTop);
  256.       NEW (time);
  257.       NEW (ampl);
  258.       NEW (freq);
  259.       NEW (mag);
  260.       NEW (phase);
  261.       NEW (TempXPtr);
  262.       NEW (TempYPtr);
  263.       NEW (OutArrayX);
  264.       NEW (OutArrayY);
  265.       FillChar (info,SizeOf(info),0);
  266.    END;   {Initialize_Variables}
  267.  
  268.  
  269. {----------------------------------------------------------------------------}
  270.  
  271.  
  272. {$IFDEF DOSCrt}
  273. PROCEDURE ClearWindow ( XMin : BYTE;        { first column to be erased }
  274.                         YMin : BYTE;        { last  column to be erased }
  275.                         XMax : BYTE;        { first row    to be erased }
  276.                         YMax : BYTE         { last  row    to be erased }
  277.                       );
  278.  
  279.    VAR
  280.       x : BYTE;
  281.       y : BYTE;
  282.  
  283.    BEGIN   {ClearWindow}
  284.       FOR y:=YMin TO YMax DO BEGIN
  285.          GotoXY (XMin,y);
  286.          FOR x:=XMin TO XMax DO Write (' ');
  287.       END;   {FOR}
  288.    END;   {ClearWindow}
  289.  
  290.  
  291. {$ELSE}
  292. PROCEDURE ClearWindow ( XMin : BYTE;        { first column to be erased }
  293.                         YMin : BYTE;        { last  column to be erased }
  294.                         XMax : BYTE;        { first row    to be erased }
  295.                         YMax : BYTE         { last  row    to be erased }
  296.                       );
  297.  
  298.    VAR
  299.       CurrXMin : BYTE;
  300.       CurrYMin : BYTE;
  301.       CurrXMax : BYTE;
  302.       CurrYMax : BYTE;
  303.  
  304.    BEGIN   {ClearWindow}
  305.       CurrXMin:=succ(Lo(WindMin));
  306.       CurrYMin:=succ(Hi(WindMin));
  307.       CurrXMax:=succ(Lo(WindMax));
  308.       CurrYMax:=succ(Hi(WindMax));
  309.       Window (XMin,YMin,XMax,YMax);
  310.       ClrScr;
  311.       Window (CurrXMin,CurrYMin,CurrXMax,CurrYMax);
  312.    END;   {ClearWindow}
  313.  
  314. {$ENDIF}
  315.  
  316. {----------------------------------------------------------------------------}
  317.  
  318.  
  319. PROCEDURE Buzzer;
  320.  
  321.    CONST
  322.       pitch = 440;                  { pitch of warning sound               }
  323.       PauseLength = 250;            { length of warning sound, in ms       }
  324.       LongPauseLength = 1000;       { additional time to display error msg }
  325.  
  326.    BEGIN   {Buzzer}
  327. {$IFNDEF DOSCrt}
  328.       Sound (pitch);
  329.       Delay (PauseLength);
  330.       NoSound;
  331.       Delay (LongPauseLength);
  332. {$ENDIF}
  333.    END;   {Buzzer}
  334.  
  335.  
  336. {----------------------------------------------------------------------------}
  337.  
  338.  
  339. PROCEDURE MainMenu;
  340.  
  341.    BEGIN   {MainMenu}
  342.       IF GraphDriver <> HercMono THEN BEGIN
  343.          TextColor (ForeColor);
  344.          TextBackground (BackColor);
  345.       END;   {IF}
  346.       ClrScr;
  347.       GotoXY (StartColumn+8,3);  Write ('FFT Main Menu  (',VersionNumber,')');
  348.       GotoXY (StartColumn,5);    Write ('Select Option by typing a number:');
  349.       GotoXY (StartColumn+8,8);  Write ('1. Create Waveform    ');
  350.       GotoXY (StartColumn+8,10); Write ('2. Retrieve/Save Data ');
  351.       GotoXY (StartColumn+8,12); Write ('3. Signal Processing  ');
  352.       GotoXY (StartColumn+8,14); Write ('4. Graph Results      ');
  353.       GotoXY (StartColumn+8,16); Write ('5. Advanced Options   ');
  354.       GotoXY (StartColumn+8,18); Write ('6. Digitizer ');
  355.       GotoXY (StartColumn+4,25); Write ('[ESC - Exit to System]  ');
  356.       GotoXY (StartColumn,21);   Write ('Your Choice? ');
  357.       REPEAT
  358.          Choice:=ReadKey;
  359.       UNTIL (Choice IN ['1'..'6',ESC]);
  360.       Write (Choice);
  361.    END;   {MainMenu}
  362.  
  363.  
  364. {----------------------------------------------------------------------------}
  365.  
  366.  
  367. FUNCTION EXIST (filename : string) : BOOLEAN;
  368.  
  369.    VAR
  370.       OK   : BOOLEAN;      { temporary variable, equal to exist }
  371.       Name : text;
  372.  
  373.    BEGIN   {EXIST}
  374.       IF length (filename) > 0
  375.          THEN BEGIN
  376.             Assign (Name,filename);
  377.             {$I-} Reset (Name); {$I+}
  378.             OK:=(IOresult=0);
  379.             exist:=OK;
  380.             IF OK THEN Close (Name);
  381.          END   {THEN}
  382.          ELSE EXIST:=false;
  383.    END;   {EXIST}
  384.  
  385.  
  386. {----------------------------------------------------------------------------}
  387.  
  388.  
  389. PROCEDURE PrintErrorMsg (    s    : string;
  390.                              x    : BYTE;
  391.                              y    : BYTE;
  392.                              wait : BOOLEAN;
  393.                          VAR resp : CHAR
  394.                         );
  395.  
  396.    CONST
  397.       PauseLength = 1000;
  398.  
  399.    VAR
  400.       CurrMinX : BYTE;
  401.       CurrMinY : BYTE;
  402.       CurrMaxX : BYTE;
  403.  
  404.    BEGIN   {PrintErrorMsg}
  405.       CurrMinX:=x-2;
  406.       CurrMinY:=y-1;
  407.       CurrMaxX:=CurrMinX+length(s)+4;
  408.       IF wait THEN INC(CurrMaxX,1);
  409.       TextColor (White);
  410.       TextBackground (Red);
  411.       ClearWindow (CurrMinX,CurrMinY,CurrMaxX,CurrMinY+2);
  412.       DrawBorder (CurrMinX,CurrMinY,CurrMaxX,CurrMinY+2);
  413.       WriteXY (s,x,CurrMinY+1);
  414.       Buzzer;
  415.       IF NOT wait
  416.          THEN Delay (PauseLength)
  417.          ELSE resp:=ReadKey;
  418.       TextColor (ForeColor);
  419.       TextBackground (BackColor);
  420.       ClearWindow (CurrMinX,CurrMinY,CurrMaxX,CurrMinY+2);
  421.    END;   {PrintErrorMsg}
  422.  
  423. (****************************************************************************)
  424.  
  425. VAR
  426.    ch : CHAR;
  427.  
  428. BEGIN   {Initialization}
  429.    TextColor (ForeColor);
  430.    TextBackground (BackColor);
  431.    ClrScr;
  432.    DrawBorder (15,10,65,14);
  433.    WriteXY ('FFT - Waveform Analysis Program - '+VersionNumber,21,12);
  434.    WriteXY ('Written by Jeff Falter, Harry Diamond Laboratories.',15,19);
  435.    WriteXY ('Documentation for this program can be found in HDL-TM-88-7.',11,20);
  436.    TextColor (ForeColor+Blink);
  437.    WriteXY ('Press any key to continue ...',26,25);
  438.    ch:=ReadKey;
  439. END.   {UNIT Global}