home *** CD-ROM | disk | FTP | other *** search
/ Hacker Chronicles 2 / HACKER2.BIN / 136.ASYNC.INC < prev    next >
Text File  |  1988-10-18  |  23KB  |  557 lines

  1. UNIT TextOps;
  2.  
  3. INTERFACE
  4. USES
  5. {$IFDEF DOSCrt}
  6.    DOSCrt,
  7. {$ELSE}
  8.    Crt,
  9. {$ENDIF}
  10.    Extended_Reals;
  11.  
  12. CONST
  13.    BELL      = #7;
  14.    BACKSPACE = #8;
  15.    ENTER     = #13;
  16.    ESC       = #27;
  17.    NULL      = #0;         { first  code of extended scan codes }
  18.    Left      = #75;        { second code of extended scan code  }
  19.    Right     = #77;        { second code of extended scan code  }
  20.    Up        = #72;        { second code of extended scan code  }
  21.    Down      = #80;        { second code of extended scan code  }
  22.    PgUp      = #73;        { second code of extended scan code  }
  23.    PgDn      = #81;        { second code of extended scan code  }
  24.    F1        = #59;        { second code of F1  function key    }
  25.    F2        = #60;        { second code of F2  function key    }
  26.    F3        = #61;        { second code of F3  function key    }
  27.    F4        = #62;        { second code of F4  function key    }
  28.    F5        = #63;        { second code of F5  function key    }
  29.    F6        = #64;        { second code of F6  function key    }
  30.    F7        = #65;        { second code of F7  function key    }
  31.    F8        = #66;        { second code of F8  function key    }
  32.    F9        = #67;        { second code of F9  function key    }
  33.    F10       = #68;        { second code of F10 function key    }
  34.  
  35.  
  36. PROCEDURE WriteXY (s:string; x,y:integer);
  37.  
  38. PROCEDURE VertLine  (x0,y1,y2 : INTEGER);
  39.  
  40. PROCEDURE HorizLine (x1,x2,y0 : INTEGER);
  41.  
  42. PROCEDURE frame (leftx, uppery, rightx, lowery: INTEGER);
  43.  
  44. PROCEDURE String_To_Value (     st    : string;
  45.                             VAR value : REAL;
  46.                             VAR units : string);
  47.  
  48. PROCEDURE Value_To_String (     value  : REAL;
  49.                                 NumDig : byte;
  50.                             VAR st     : string);
  51.  
  52. PROCEDURE DrawBorder ( x1 : BYTE;
  53.                        y1 : BYTE;
  54.                        x2 : BYTE;
  55.                        y2 : BYTE);
  56.  
  57. FUNCTION EXIST (filename : string) : BOOLEAN;
  58.  
  59. (****************************************************************************)
  60.  
  61. IMPLEMENTATION
  62.  
  63. PROCEDURE WriteXY (s:string; x,y:integer);
  64.  
  65.    BEGIN   {WriteXY}
  66.       GotoXY (x,y);
  67.       Write (s);
  68.    END;   {WriteXY}
  69.  
  70.  
  71. {----------------------------------------------------------------------------}
  72.  
  73. PROCEDURE VertLine  (x0,y1,y2 : INTEGER);
  74.  
  75.    CONST
  76.       Vertical = '│';           { char (179) }
  77.  
  78.    VAR
  79.       i : INTEGER;
  80.  
  81.    BEGIN   {VertLine}
  82.       FOR i:=y1 TO y2 DO BEGIN
  83.          GotoXY (x0,i);
  84. ÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷     6: mult:='M';
  85.            9: mult:='G';
  86.           12: mult:='T';
  87.       END;   {CASE}
  88.       CASE x OF
  89.          -12..12: BEGIN
  90.                      IF factor < 10
  91.                         THEN x:=NumDig-2
  92.                      ELSE IF factor < 100
  93.                         THEN x:=NumDig-3
  94.                      ELSE x:=NumDig-4;
  95.                      str (factor:NumDig:x,st);
  96.                      IF negative
  97.                         THEN st:='-'+st+' '+mult
  98.                         ELSE st:=    st+' '+mult;
  99.                   END;   {CASE -12..12}
  100.          ELSE     BEGIN
  101.                      str (value:(NumDig+6),st);
  102.                      st:=st+' ';
  103.                   END;   {CASE-ELSE}
  104.       END;   {CASE}
  105.    END;   {Value_To_String}
  106.  
  107. {----------------------------------------------------------------------------}
  108.  
  109. PROCEDURE DrawBorder ( x1 : BYTE;
  110.                        y1 : BYTE;
  111.                        x2 : BYTE;
  112.                        y2 : BYTE
  113.                      );
  114.  
  115.    CONST
  116.       TopLeft     = '╔';          {char(201)}
  117.       BottomLeft  = '╚';          {char(200)}
  118.       TopRight    = '╗';          {char(187)}
  119.       BottomRight = '╝';          {char(188)}
  120.       Vertical    = '║';          {char(186)}
  121.       Horizontal  = '═';          {char(205)}
  122.  
  123.    VAR
  124.       i : integer;
  125.  
  126.    BEGIN   {DrawBorder}
  127.       GotoXY (x1,y1); WriteXY (TopLeft,x1,y1);
  128.       GotoXY (x1,y2); Write   (BottomLeft);
  129.       FOR i:=x1+1 TO x2-1 DO BEGIN
  130.          GotoXY (i,y1); Write (Horizontal);
  131.          GotoXY (i,y2); Write (Horizontal);
  132.       END;   {FOR}
  133.       GotoXY (x2,y1); Write (TopRight);
  134.       GotoXY (x2,y2); Write (BottomRight);
  135.       FOR i:=y1+1 TO y2-1 DO BEGIN
  136.          GotoXY (x1,i); Write (Vertical);
  137.          GotoXY (x2,i); Write (Vertical);
  138.       END;   {FOR}
  139.    END;   {DrawBorder}
  140.  
  141.  
  142. {----------------------------------------------------------------------------}
  143.  
  144. FUNCTION EXIST (filename : string) : boolean;
  145.  
  146.    VAR
  147.       OK   : boolean;      (* temporary variable, equal to exist *)
  148.       Name : text;
  149.  
  150.    BEGIN   {EXIST}
  151.       IF length (filename) > 0
  152.          THEN BEGIN
  153.             Assign (Name,filename);
  154.             {$I-} Reset (Name); {$I+}
  155.             OK:=(IOresult=0);
  156.             exist:=OK;
  157.             IF OK THEN Close (Name);
  158.          END   {THEN}
  159.          ELSE EXIST:=false;
  160.    END;   {EXIST}
  161.  
  162.  
  163. (****************************************************************************)
  164.  
  165. BEGIN   {Initialization}
  166. END.   {UNIT Text}
  167. 
  168.             ampl^[i]:=ampl^[i]+noise;
  169.          END;   {FOR}
  170.       END;   {IF}
  171.    END;   {AddNoise}
  172.  
  173. {----------------------------------------------------------------------------}
  174.  
  175. PROCEDURE AnalyticWaveform;
  176.  
  177.    BEGIN   {AnalyticWaveform}
  178.       AnalyticMenu;
  179.       ClrScr;
  180.       CASE ch OF
  181.          '1': MakeDampSine;
  182.          '2': MakeDoubleExp;
  183.          '3': MakeRecipDoubleExp;
  184.          '4': MakeGeneralSum;
  185.          '9': Exit;
  186.       END;   {CASE}
  187.       AddNoise;
  188.       TRANS:=FALSE;
  189.       ACCEPT:=TRUE;
  190.       ORIG:=TRUE;
  191.       GraphResults ('T');
  192.    END;   {AnalyticWaveform}
  193.  
  194. (****************************************************************************)
  195.  
  196. BEGIN   {Initialization}
  197. END.   {UNIT CreateWaveform}ENTER
  198.          THEN NewPlotNum:=ord(ch)-ord('0')
  199.       ELSE IF PlotMAG
  200.          THEN NewPlotNum:=Logarithmic
  201.       ELSE IF PlotPHASE
  202.          THEN NewPlotNum:=LogLin
  203.       ELSE NewPlotNum:=Linear;
  204.       IF PlotPHASE THEN
  205.          IF NewPlotNum = Logarithmic
  206.             THEN NewPlotNum:= LogLin
  207.          ELSE IF NewPlotNum = LinLog
  208.             THEN NewPlotNum:= Linear;
  209.       IF NewPlotNum <> Plot THEN BEGIN
  210.          Plot:=NewPlotNum;
  211.          GraphData;
  212.       END;   {THEN}
  213.    END;   {ChangePlotType}
  214.  
  215. {----------------------------------------------------------------------------}
  216.  
  217. PROCEDURE GraphResults (PlotType : CHAR);
  218.  
  219.    VAR
  220.       choice : CHAR;
  221.  
  222.    BEGIN   {GraphResults}
  223.       X_Units:='';
  224.       Y_Units:='';
  225.       PlotMAG  :=(UpCase(PlotType) = 'M');
  226.       PlotPHASE:=(UpCase(PlotType) = 'P');
  227.       MinFirst:=0;
  228.       IF (PlotMAG OR PlotPHASE)
  229.          THEN BEGIN
  230.             MaxLast :=pred(NumFreqs);
  231.             FOR i:=MinFirst TO MaxLast DO BEGIN
  232.                OutArrayX^[i]:=freq^[i];
  233.                IF PlotMAG
  234.                   THEN OutArrayY^[i]:=mag^[i]
  235.                   ELSE OutArrayY^[i]:=phase^[i]*180/PI;
  236.             END;   {FOR}
  237.             IF PlotMAG
  238.                THEN Plot:=Logarithmic
  239.                ELSE Plot:=LogLin;
  240.          END   {then}
  241.          ELSE BEGIN
  242.             MaxLast :=pred(NumPoints);
  243.             FOR i:=MinFirst TO MaxLast DO BEGIN
  244.                OutArrayX^[i]:=time^[i];
  245.                OutArrayY^[i]:=ampl^[i];
  246.             END;   {FOR}
  247.             Plot:=Linear;
  248.          END;   {else}
  249.       first:=MinFirst;
  250.       last :=MaxLast;
  251.       InitGraph (GraphDriver,GraphMode,'');
  252.       SetViewPort (0,0,GetMaxX,GetMaxY,ClipOn);
  253.       IF GraphDriver <> HercMono THEN SetColor (White);
  254.       GraphData;
  255.       REPEAT
  256.          PrintMenu;
  257.          REPEAT
  258.             choice:=ReadKey;
  259.          UNTIL choice IN ['1'..'3','9'];
  260.          CASE choice OF
  261.             '1': OutputScreen;
  262.             '2': ChangePlotType;
  263.             '3': ChangeIntervals;
  264.             '9': BEGIN
  265.                     CloseGraph;
  266.                     TextColor (ForeColor);
  267.                     TextBackGround (BackColor);
  268.                     ClrScr;
  269.                     Exit;
  270.                  END;
  271.          END;   {CASE}
  272.       UNTIL FALSE;
  273.    END;   {GraphResults}
  274.  
  275. {----------------------------------------------------------------------------}
  276.  
  277. PROCEDURE Graph_Wave;
  278.  
  279.    VAR
  280.       ch : CHAR;
  281.  
  282.    BEGIN   {Graph_Wave}
  283.       IF TRANS
  284.          THEN BEGIN
  285.             GotoXY (StartColumn,23);
  286.             Write ('Time, Magnitude or Phase (T/M/P)?');
  287.             REPEAT
  288.                ch:=UpCase(ReadKey);
  289.             UNTIL (ch IN ['T','M','P',ENTER]);
  290.             IF (ch = ENTER)
  291.                THEN IF ORIG
  292.                   THEN GraphResults ('T')
  293.                   ELSE GraphResults ('M')
  294.                ELSE GraphResults (ch);
  295.          END   {THEN}
  296.          ELSE GraphResults ('T');
  297.    END;   {Graph_Wave}
  298.  
  299. (****************************************************************************)
  300.  
  301. BEGIN   {INITIALIZATION}
  302. END.   {UNIT GraphWaveform}W (TempYPtr);
  303.       NEW (OutArrayX);
  304.       NEW (OutArrayY);
  305.       FillChar (info,SizeOf(info),0);
  306.    END;   {Initialize_Variables}
  307.  
  308.  
  309. {----------------------------------------------------------------------------}
  310.  
  311.  
  312. {$IFDEF DOSCrt}
  313. PROCEDURE ClearWindow ( XMin : BYTE;        { first column to be erased }
  314.                         YMin : BYTE;        { last  column to be erased }
  315.                         XMax : BYTE;        { first row    to be erased }
  316.                         YMax : BYTE         { last  row    to be erased }
  317.                       );
  318.  
  319.    VAR
  320.       x : BYTE;
  321.       y : BYTE;
  322.  
  323.    BEGIN   {ClearWindow}
  324.       FOR y:=YMin TO YMax DO BEGIN
  325.          GotoXY (XMin,y);
  326.          FOR x:=XMin TO XMax DO Write (' ');
  327.       END;   {FOR}
  328.    END;   {ClearWindow}
  329.  
  330.  
  331. {$ELSE}
  332. PROCEDURE ClearWindow ( XMin : BYTE;        { first column to be erased }
  333.                         YMin : BYTE;        { last  column to be erased }
  334.                         XMax : BYTE;        { first row    to be erased }
  335.                         YMax : BYTE         { last  row    to be erased }
  336.                       );
  337.  
  338.    VAR
  339.       CurrXMin : BYTE;
  340.       CurrYMin : BYTE;
  341.       CurrXMax : BYTE;
  342.       CurrYMax : BYTE;
  343.  
  344.    BEGIN   {ClearWindow}
  345.       CurrXMin:=succ(Lo(WindMin));
  346.       CurrYMin:=succ(Hi(WindMin));
  347.       CurrXMax:=succ(Lo(WindMax));
  348.       CurrYMax:=succ(Hi(WindMax));
  349.       Window (XMin,YMin,XMax,YMax);
  350.       ClrScr;
  351.       Window (CurrXMin,CurrYMin,CurrXMax,CurrYMax);
  352.    END;   {ClearWindow}
  353.  
  354. {$ENDIF}
  355.  
  356. {----------------------------------------------------------------------------}
  357.  
  358.  
  359. PROCEDURE Buzzer;
  360.  
  361.    CONST
  362.       pitch = 440;                  { pitch of warning sound               }
  363.       PauseLengthBBS156  ARC Ñig  VTRM220AARC ╞Jî ╨LOANS21 ARC 
  364. o~-╫4AZEL    ARC c$LSSCAN20 ARC ≈eHΓ┴BVTRM220BARC »Lî6▄ESTTAX10ARC · 2╤xVTRANS  ARC Nîe°PCPCOUNTARC ╔ug╨UI2DEMO ARC jzg┘8UI2D-----------------------------------------------------------------}
  365.  
  366.  
  367. PROCEDURE MainMenu;
  368.  
  369.    BEGIN   {MainMenu}
  370.       IF GraphDriver <> HercMono THEN BEGIN
  371.          TextColor (ForeColor);
  372.          TextBackground (BackColor);
  373.       END;   {IF}
  374.       ClrScr;
  375.       GotoXY (StartColumn+8,3);  Write ('FFT Main Menu  (',VersionNumber,')');
  376.       GotoXY (StartColumn,5);    Write ('Select Option by typing a number:');
  377.       GotoXY (StartColumn+8,8);  Write ('1. Create Waveform    ');
  378.       GotoXY (StartColumn+8,10); Write ('2. Retrieve/Save Data ');
  379.       GotoXY (StartColumn+8,12); Write ('3. Signal Processing  ');
  380.       GotoXY (StartColumn+8,14); Write ('4. Graph Results      ');
  381.       GotoXY (StartColumn+8,16); Write ('5. Advanced Options   ');
  382.       GotoXY (StartColumn+8,18); Write ('6. Digitizer ');
  383.       GotoXY (StartColumn+4,25); Write ('[ESC - Exit to System]  ');
  384.       GotoXY (StartColumn,21);   Write ('Your Choice? ');
  385.       REPEAT
  386.          Choice:=ReadKey;
  387.       UNTIL (Choice IN ['1'..'6',ESC]);
  388.       Write (Choice);
  389.    END;   {MainMenu}
  390.  
  391.  
  392. {----------------------------------------------------------------------------}
  393.  
  394.  
  395. FUNCTION EXIST (filename : string) : BOOLEAN;
  396.  
  397.    VAR
  398.       OK   : BOOLEAN;      { temporary variable, equal do exist }
  399.       Name : text;
  400.  
  401.    BEGIN   {EXIST}
  402.       IF length (filename) > 0
  403.          THEN BEGIN
  404.             Assign (Name,filename);
  405.             √$I-} Reset (Name); {$I+}
  406.         ` ` OK:=(IOresult=0);
  407.             exist:=OK;
  408.             IF OK THEN C∞o≤σ (Name);
  409.          END   {THEN}
  410.          ELSE EXIST:=false;
  411.    END;   {EXIST
  412.  
  413.  
  414. {---------------------------------------------------------)-------------/-/-/}
  415.  
  416.  
  417. PROCEDURE PrintErrorMsg (    s    : string;
  418.                              x    : BYTE;
  419.                              y    : BYTE;
  420.                              wait : BOOLEAN;
  421.                          VAR resp : CHAR
  422.                         );
  423.  
  424.    CONST    
  425.       PauseLength = 1000;
  426.  
  427.    VAR
  428.       CurrMinX : BYTE;
  429.       CurrMinY : BYTE;
  430.       CurrMaxX : BYTE;
  431.  
  432.    BEGIN   {PrintErrorMsg}
  433.       CurrMinX:=x-2;
  434.       CurrMinY:=y-1;
  435.       CurrMaxX:=CurrMinX+length(s)+4;
  436.       IF wait THEN INC(CurrMaxX,1);
  437.                                                      -}
  438. {----------------------------------------------------------------------------}
  439.  
  440. PROCEDURE Add_Comments;
  441.  
  442.    VAR
  443.       i  : INTEGER;
  444.       st : string[80];
  445.  
  446.    BEGIN
  447.       ClrScr;
  448.       Write ('Test Point:   '); ReadLn (st); info[1]:='Test Point:   '+st;
  449.       Write ('Test Type:    '); ReadLn (st); info[2]:='Test Type:    '+st;
  450.       Write ('Attenuation:  '); ReadLn (st); info[3]:='Attenuation:  '+st;
  451.       Write ('Probe Number: '); ReadLn (st); info[4]:='Probe Number: '+st;
  452.       Write ('Comments:     '); ReadLn (st); info[7]:='Comments:     '+st;
  453.       info[5]:='X-Axis units: '+horiz_units;
  454.       info[6]:='Y-Axis units: '+vert_units;
  455.       FOR i:=8 TO MaxInfo DO info[i]:=blank;
  456.    END;   {Add_Comments}
  457.  
  458. {----------------------------------------------------------------------------}
  459.  
  460. PROCEDURE Digitizer ( DataToDigitize : CHAR);
  461.  
  462.    VAR
  463.       STOP : BOOLEAN;     { done yet?                         }
  464.       i    : INTEGER;     { coND.   {UNIT Global}            }
  465.  
  466.    BEGIN   {Digitizer}
  467.       FreqDATA:=(DataToDigitize = 'F');
  468.       SetGraphMode (GraphMode);
  469.       SetViewPort (MinX,MinY,MaxX,MaxY,ClipOn);
  470.       SetColor (DrawColor);
  471.       STOP:=FALSE;
  472.       Initialize_Digitizer;
  473.       IF VALID_PORT THEN BEGIN
  474.          REPEAT UNTIL NOT Async_Buffer_Check (ch1);
  475.          WHILE keypressed DO ch1:=ReadKey;
  476.          Set_Up_Axes;
  477.          WriteText ('Enter x,y coordinate pairs.            ',22,21);
  478.          WriteText ('Press ESC to erase, or ENTER to finish.',22,23);
  479.          REPEAT
  480.             Read_Digitizer;
  481.             Read_Keyboard (STOP);
  482.          UNTIL STOP;
  483.          ClearLine (22,21,40);
  484.          ClearLine (22,23,40);
  485.          NumPoints:=i-4;
  486.          IF (NumPoints >= 5)
  487.             THEN BEGIN
  488.                RestoreCrtMode;
  489.                Rotate_Waveform;
  490.                Add_Comments;
  491.                SetGraphMode (GraphMode);
  492.                Draw_Waveform;
  493.                Async_Send_String (Reset_Command);
  494.                Async_Close;
  495.                WriteText ('Strike any key to return to Main Menu.',22,20);
  496.                ORIG:=TRUE;
  497.                TRANS:=FALSE;
  498.                ACCEPT:=FALSE;
  499.                time^:=TempXPtr^;
  500.                ampl^:=TempYPtr^;
  501.             END   {THEN}
  502.             ELSE BEGIN
  503.                WriteText ('Too few points input. ',22,21);
  504.                WriteText ('Strike any key to continue ...',22,23);
  505.                ORIG:=FALSE;
  506.                TRANS:=FALSE;
  507.                ACCEPT:=FALSE;
  508.             END;   {ELSE}
  509.          Quit:=ReadKey;
  510.       END;   {IF VALID_PORT}
  511.       RestoreCRTMode;
  512.       TextColor (ForeColor);
  513.       TextBackground (BackColor);
  514.       ClrScr;
  515.    END;   {Digitizer}
  516.  
  517. {----------------------------------------------------------------------------}
  518.  
  519. PROCEDURE Digitize_Wave;
  520.  
  521.    VAR
  522.       ch : CHAR;
  523.  
  524.    BEGIN   {Digitize_Wave}
  525.       IF (SerialPort <> 0) THEN BEGIN
  526.          GotoXY (StartColumn,23);
  527.          Write ('Digitize time or frequency data (T/F)? ');
  528.          REPEAT
  529.             ch:=UpCase(ReadKey);
  530.          UNTIL (ch IN ['T','F',ENTER]);
  531.          IF (ch = ENTER)
  532.             THEN Digitizer ('T')
  533.             ELSE Digitizer (ch);
  534.       END;   {IF}
  535.    END;   {Digitize_Wave}
  536.  
  537. (****************************************************************************)
  538.  
  539. BEGIN   {Initialization}
  540. END.   {Initialization}├Uâ∞;&ZwΘ½«ï∞ vΦ╛4ïσëFâ─]├Uâ∞;&ZwΘî«ï∞ vΦƒ4ïσëFâ─]├Uâ∞;&ZwΘm«ï∞Φs<â─]├Uâ∞;&ZwΘV«ï∞Φ\<â─]├Uâ∞t;&ZwΘ?«ï∞Φ▐3└PPΦ-ïσ╕D5PΦ╘τïσ╕q5PΦ╦τïσ3└P╕PΦïσ╕╘%P╕£5PΦ▓τïσ╕P╕PΦ⌡ïσ╕╢5PΦ£τïσ3└P╕PΦαïσ╕└%P╕╗5PΦâτïσ╕P╕PΦ╞ïσ╕╢5PΦmτïσ3└P╕
  541. PΦ▒ïσ╕╩%P╕╓5PΦTτïσ╕P╕ PΦùïσ╕╢5PΦ>τïσ3└P╕PΦéïσ 6╛%╕±5PΦ%τïσ3└P╕PΦiïσâ>>5uFâ>╛%u╕96PìFnPΦ═Oïσδ╕=6PìFnPΦ╛OïσìFnP╕@6PΦΓµïσ╕P╕PΦ%ïσ╕╢5PΦ╠µïσ╕P╕PΦïσ╕PPìFP╕[6PΦïσ╗Sì^SëFhΦ^ïσìFPΦîOïσ=}╕╘%PìFPΦROïσ╕P╕PΦ╞ïσìFP╕\6PΦiµïσ╕P╕PΦ¼ïσ╕
  542. PìFTP╕[6PΦáïσì^TSëFhΦ6Oïσ=}╕└%PìFTPΦⁿNïσ╕PìFTPΦαïσ╕P╕PΦcïσìFTP╕\6PΦµïσ╕P╕ PΦIïσ╕
  543. PìF^P╕[6PΦ=ïσì^^SëFhΦ╙Nïσ=}╕╩%PìF^PΦÖNïσ╕PìF^PΦ}ïσ╕P╕ PΦïσìF^P╕\6PΦúσïσâ>>5tΘ~╕P╕PΦ▄ïσ╕PìFnP╕[6PΦ╨ïσì^nSëFhΦfNïσ=}╞FnYâ>╛%t╞FnNèFn0ΣëF@ï≡èä╓:0Σ%tïF- δèFn0ΣêFn0Σ=YëFt=Nt ╕PΦ╘√ïσδé3└P╕PΦ_ïσ3└P╕s6PΦCïσà└u╕â─t]├ìFjPìF^PΦ2LïσïFj=z~ ╗Ö≈√ëFjδφèF0ΣëF@ï≡èä╓:0Σ%tïF δèF0Σï^j;├uà█tΘÿï6@5èB0Σ@ï°èà╓:0Σ%t
  544. èB0Σ- δ    ï6@5èB0Σï^j;├uà█ucâ>B5u'3└P╕PΦ«ïσìF^P╕ñ6PΦQΣïσ╕╒6PΦHΣïσΦU8δ-ìFP╕╘%PΦMïσìFTP╕└%PΦ°LïσìF^P╕╩%PΦδLïσ╟╛%╕â─t]├ìFP╕╘%PΦ╨LïσìFTP╕└%PΦ├LïσìF^P╕╩%PΦ╢Lïσ╟╛%èFn0Σ=Yu╟╛%Φ·3└â─t]├Uâ∞ï∞ïF=l~ünlïF
  545. =|= â~ |â~  â~|â~c~ïv╞╕â─]├ïF
  546. ΘΓ╕≡6PìFPΦ=LïσΘτ╕⌠6PìFPΦ-LïσΘ╫╕°6PìFPΦLïσΘ╟╕ⁿ6PìFPΦLïσΘ╖╕7PìFPΦ²KïσΘº╕7PìFPΦφKïσΘù╕7PìFPΦ▌KïσΘç╕ 7PìFPΦ═Kïσδx╕7PìFPΦ╛Kïσδi╕7PìFPΦ»KïσδZ╕7PìFPΦáKïσδK╕7PìFPΦæKïσδ<╕ 7PìFPΦéKïσδ-gWwWçWùWºW╖W╟W╫WµW⌡WXXï≡âεr â■ s╤µ. ñ1Xδ─ vìFP v ╕$7P vΦ¢Hïσ3└â─]├Uâ∞;&ZwΘ«¿ï∞ïF =l~ün lïF=|= â~
  547. |â~
  548.  â~ |â~ c~ïv╟╕â─]├ïF -P▒    ╙α▒ï^╙π ├ï^
  549. ├ïvë3└â─]├Uâ∞;&ZwΘ:¿ï∞╟UART_LCR+Async_Base]:=lcr;
  550.  
  551.       Inline ($FB);                    (* enable interrupts.                *)
  552.    END;   {Async_Change}
  553.  
  554. (****************************************************************************)
  555.  
  556. BEGIN   {Initialization}
  557. END.   {Initialization}