home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / TURBOGEN.ZIP / LIBRARY1.GEN < prev    next >
Encoding:
Text File  |  1987-11-20  |  11.0 KB  |  344 lines

  1.  
  2. (*--------------------------------------------------------------------------*)
  3. (*  GetSysId ----- Determine which computer we are running on               *)
  4. (*                                                                          *)
  5. (*--------------------------------------------------------------------------*)
  6.  
  7.  Type
  8.    String4 = String[4];
  9.  
  10.    Function IntToHex(IntNum : integer): string4;
  11.    const
  12.       HexChars : array[0..15] of char = '0123456789ABDCEF';
  13.    VAR
  14.       Temp      : byte;
  15.       TempStr   : String[2];
  16.   begin {intToHex}
  17.     Temp     := hi(IntNum);
  18.     TempSTr  := Hexchars[Temp shr 4] + HexChars[Temp and $0F];
  19.     Temp     := Lo(IntNum);
  20.     IntToHex := TempStr + HexChars[Temp shr 4] +
  21.                           HexChars[Temp and $0F]
  22.   end;
  23.  
  24. Function  GetSysID : char;
  25.     Var
  26.       SysId    : byte;
  27.     Begin
  28.       SysID := mem[$F000:$FFFE];
  29.       Case SysId of
  30.          $FF : GetSysId := 'P';
  31.          $FE : GetSysId := 'X';
  32.          $FD : GetSysId := 'J';
  33.          $FC : GetSysId := 'A';
  34.        Else
  35.           GetSysId := 'U'
  36.      end;
  37. end;
  38.  
  39. (*----------------------------------------------------------------------*)
  40. (*         Int24, Int24ON, Int24OFF, --- handle critical DOS errors     *)
  41. (*----------------------------------------------------------------------*)
  42.  
  43. (*----------------------------------------------------------------------*)
  44. (*                                                                      *)
  45. (*     Remarks:                                                         *)
  46. (*                                                                      *)
  47. (*        This code is slightly modified from some written by Bela      *)
  48. (*        Lubkin.                                                       *)
  49. (*                                                                      *)
  50. (*----------------------------------------------------------------------*)
  51.  
  52. CONST
  53.    INT24Err     : BOOLEAN = FALSE;
  54.    INT24ErrCode : BYTE    = 0;
  55.    OldINT24     : ARRAY[1..2] OF INTEGER = (0,0);
  56. VAR
  57.    RegisterSet: RegPack;
  58.  
  59. (*----------------------------------------------------------------------*)
  60. (*         Int24 --- set up DOS Interrupt 24 critical error handler     *)
  61. (*----------------------------------------------------------------------*)
  62.  
  63. PROCEDURE Int24;
  64.  
  65. BEGIN (* Int24 *)
  66.  
  67.    INLINE
  68.      ($2E/$C6/$06/ INT24Err /$01/$89/$EC/$83/$C4/$08/$89/$F8/$2E/$A2/
  69.       INT24ErrCode /$58/$B0/$FF/$5B/$59/$5A/$5E/$5F/$5D/$1F/$07/$CF);
  70.     { Turbo:  PUSH BP                    (Save caller's stack frame
  71.               MOV  BP,SP                   Set up this procedure's stack frame
  72.               PUSH BP                     ?)
  73.       Inline: MOV  BYTE CS:[INT24Err],1  Set INT24Err to True
  74.               MOV  SP,BP                 Get correct SP;  ADD: Discard saved
  75.               ADD  SP,8                    BP, INT 24 return address & flags
  76.               MOV  AX,DI                 Get INT 24 error code
  77.               MOV  CS:[INT24ErrCode],AL  Save it in INT24ErrCode
  78.               POP  AX                    Pop all registers
  79.               MOV  AL,0FFH               Set FCB call error flag:
  80.               POP  BX                      will cause Turbo I/O error on file
  81.               POP  CX                      operations, no error on character
  82.               POP  DX                      operations
  83.               POP  SI
  84.               POP  DI
  85.               POP  BP
  86.               POP  DS
  87.               POP  ES
  88.               IRET                       Return to next instruction }
  89.  
  90. End   (* Int24 *);
  91.  
  92. (*----------------------------------------------------------------------*)
  93. (*              Int24ON --- Turn ON handling of interrupt 24            *)
  94. (*----------------------------------------------------------------------*)
  95.  
  96. PROCEDURE Int24On;
  97.  
  98. BEGIN (* Int24ON *)
  99.  
  100.    INT24Err:=False;
  101.  
  102.    WITH RegisterSet DO
  103.       BEGIN
  104.  
  105.          AX:=$3524;
  106.  
  107.          MsDos(RegisterSet);
  108.  
  109.          IF ( OldINT24[1] OR OldINT24[2] ) = 0 THEN
  110.             BEGIN
  111.                OldINT24[1] := ES;
  112.                OldINT24[2] := BX;
  113.             END;
  114.  
  115.          DS := CSeg;
  116.          DX := Ofs(INT24);
  117.          AX := $2524;
  118.  
  119.          MsDos( RegisterSet );
  120.  
  121.      END;
  122.  
  123. END   (* Int24ON *);
  124.  
  125. (*----------------------------------------------------------------------*)
  126. (*             Int24OFF --- Turn OFF handling of interrupt 24            *)
  127. (*----------------------------------------------------------------------*)
  128.  
  129. PROCEDURE Int24OFF;
  130.  
  131. BEGIN (* Int24OFF *)
  132.  
  133.    INT24Err:=False;
  134.  
  135.    IF ( OldINT24[1] <> 0 ) THEN
  136.       WITH RegisterSet DO
  137.          BEGIN
  138.  
  139.             DS := OldINT24[1];
  140.             DX := OldINT24[2];
  141.             AX := $2524;
  142.  
  143.             MsDos( RegisterSet );
  144.  
  145.          END;
  146.  
  147.     OldINT24[1] := 0;
  148.     OldINT24[2] := 0;
  149.  
  150. END   (* Int24OFF *);
  151.  
  152. (*----------------------------------------------------------------------*)
  153. (*      Int24Result --- Check for Turbo I/O or critical DOS error       *)
  154. (*----------------------------------------------------------------------*)
  155.  
  156. FUNCTION INT24Result: INTEGER;
  157.  
  158. VAR
  159.    I : INTEGER;
  160.  
  161. BEGIN (* INT24Result *)
  162.  
  163.    I := IOResult;
  164.  
  165.    IF INT24Err THEN
  166.       BEGIN
  167.          I := I + 256 * INT24ErrCode;
  168.          INT24On;
  169.       END;
  170.  
  171.    INT24Result := I;
  172.  
  173. END   (* INT24Result *);
  174.  
  175.    Type
  176.      String255 =  String[255];
  177. (*-----------------------------------------------------------------*)
  178. (*                                                                 *)
  179. (*                          StringOf                               *)
  180. (*                                                                 *)
  181. (*  This function returns a string of the character represented by *)
  182. (*  ASCIINUM repeated NUM times.  This is similar to BASIC's STRING*)
  183. (*  function.                                                      *)
  184. (*-----------------------------------------------------------------*)
  185.  
  186. Function StringOf(ASCIINum,Num: Byte): String255;
  187.  
  188. Var
  189.   Str: String255;
  190.   StrLen: Byte absolute Str;
  191.   S: Byte;
  192.  
  193. Begin
  194. StrLen := Num;
  195. For S := 1 to Num Do
  196.   Str[S] := Chr(ASCIINum);
  197. StringOf := Str;
  198. End;
  199.  
  200. (*-----------------------------------------------------------------*)
  201. (*               Min --- Find minimum of two integers              *)
  202. (*-----------------------------------------------------------------*)
  203.  
  204. Function Min( A, B: Integer ) : Integer;
  205.  
  206. (*-----------------------------------------------------------------*)
  207. (*                                                                 *)
  208. (*   Function: Min                                                 *)
  209. (*                                                                 *)
  210. (*   Purpose:  Returns smaller of two numbers                      *)
  211. (*                                                                 *)
  212. (*   Calling sequence:                                             *)
  213. (*                                                                 *)
  214. (*      Smaller := Min( A , B ) : Integer;                         *)
  215. (*                                                                 *)
  216. (*         A       --- 1st input integer number                    *)
  217. (*         B       --- 2nd input integer number                    *)
  218. (*         Smaller --- smaller of A, B returned                    *)
  219. (*                                                                 *)
  220. (*                                                                 *)
  221. (*   Calls:  None                                                  *)
  222. (*                                                                 *)
  223. (*                                                                 *)
  224. (*-----------------------------------------------------------------*)
  225.  
  226. Begin (* Min *)
  227.  
  228.    IF A < B Then
  229.       Min := A
  230.    Else
  231.       Min := B;
  232.  
  233. End   (* Min *);
  234.  
  235. (*-----------------------------------------------------------------*)
  236. (*               Max --- Find maximum of two integers              *)
  237. (*-----------------------------------------------------------------*)
  238.  
  239. Function Max( A, B: Integer ) : Integer;
  240.  
  241. (*-----------------------------------------------------------------*)
  242. (*                                                                 *)
  243. (*   Function:  Max                                                *)
  244. (*                                                                 *)
  245. (*   Purpose:  Returns larger of two numbers                       *)
  246. (*                                                                 *)
  247. (*   Calling sequence:                                             *)
  248. (*                                                                 *)
  249. (*      Larger := MAX( A , B ) : Integer;                          *)
  250. (*                                                                 *)
  251. (*         A       --- 1st input integer number                    *)
  252. (*         B       --- 2nd input integer number                    *)
  253. (*         Larger  --- Larger of A, B returned                     *)
  254. (*                                                                 *)
  255. (*                                                                 *)
  256. (*   Calls:  None                                                  *)
  257. (*                                                                 *)
  258. (*-----------------------------------------------------------------*)
  259.  
  260. Begin (* Max *)
  261.  
  262.    IF A > B Then
  263.       Max := A
  264.    Else
  265.       Max := B;
  266.  
  267. End   (* Max *);
  268.  
  269. function Power(Number, Exponent: real): real;
  270.  
  271.  
  272. begin
  273.    if Number >0.0 then
  274.       Power := exp(Exponent * ln(Number))
  275.    else
  276.       Power := 0.0
  277. end;
  278.  
  279. function exists(ThisFile : anystr):boolean;
  280. var
  281.   tempFile : text;  {We can get away with assigning a text file to ANY
  282.                      filename because we aren't going to do any input/output}
  283. begin
  284.   assign(tempFile,ThisFile);
  285.   {$I-}
  286.   reset(tempFile);
  287.   {$I+}
  288.   if IOResult = 0 then exists := true
  289.     else exists := false;
  290.   close(tempFile);
  291. end;
  292.  
  293. Function Time : shortstr;
  294. var
  295. MSDOS_REGS : regpack;
  296. hour,Minutes, Sec : String[2];
  297.  
  298.  
  299. begin
  300.   MSDOS_REGS.AX := $2C00;
  301.   intr($21,MSDOS_REGS);
  302.   With MSDOS_REGS do
  303.   begin
  304.     Str(CX shr 8, Hour);
  305.     STR(CX mod 256, minutes);
  306.     STR(DX SHR 8, Sec);
  307.   end;
  308.   IF Length(Hour) < 2 then Hour := '0' + hour;
  309.   IF Length(minutes) < 2 then minutes := '0' + minutes;
  310.   IF Length(Sec) < 2 then Sec := '0' + Sec;
  311.   Time := Hour + ':'+minutes+':'+Sec;
  312. end;
  313.  
  314. Function Date : shortstr;
  315. var
  316. MSDOS_REgS : regpack;
  317. Month, Day : string[2];
  318. Year       : string[4];
  319.  
  320. begin
  321.   MSDOS_REGS.AX := $2A00;
  322.   Intr($21,MSDOS_REGS);
  323.   With MSDOS_REGS do
  324.     begin
  325.       STR(CX,Year);
  326.       STR(DX shr 8, Month);
  327.       STR(DX mod 256, DAY);
  328.     end;
  329.   Year := Copy(Year,3,2);
  330.   IF Length(Month) < 2 then Month := '0' + Month;
  331.   IF Length(Day) < 2 then Day := '0' + Day;
  332.   Date := Month + '/' + Day + '/' + Year;
  333. end;
  334.  
  335. Function Julian(year,month,day:integer):real;
  336.  
  337. begin
  338.  if month > 0.0 then  julian := year*365.25+(month-1)*30.44+day
  339.  else
  340.    julian := 0.0;
  341.  
  342. end;
  343.  
  344.