[Back to MISC SWAG index] [Back to Main SWAG index] [Original]

    UNIT Timer;

    { TIMER - Fine resolution timer functions              }

    INTERFACE
    USES Crt,Dos;
    CONST
       TixSec  = 18.20648193;
       TixMin  = TixSec * 60.0;
       TixHour = TixMin * 60.0;
       TixDay  = TixHour * 24.0;
    TYPE
       DiffType = String[16];
    VAR
       tGet       : Longint ABSOLUTE $0040:$006C;
    FUNCTION tStart: Longint;
    FUNCTION tDiff(StartTime,EndTime: Longint) : Real;
    FUNCTION tFormat(T1,T2:Longint): DiffType;
    PROCEDURE GetTime(H,M,S,S100:Word);

    IMPLEMENTATION

    VAR
       TimeDiff   : DiffType;

    { tStart - wait for a new tick, and return the
      tick number to the caller.  The wait allows
      us to be sure the user gets a start at the
      beginning of the second.                             }

    FUNCTION tStart: Longint;
    VAR
       StartTime : Longint;
    BEGIN
              StartTime := tGet;
       WHILE StartTime = tGet DO;
              tStart := tGet
    END;

    { tDiff - compute the difference between two
      timepoints (in seconds). }

    FUNCTION tDiff(StartTime,EndTime: Longint) : Real;
    BEGIN
       tDiff := (EndTime-StartTime)/TixSec;
    END;

    PROCEDURE GetTime(H,M,S,S100:Word);
    VAR
       Regs : Registers;
    BEGIN
       Regs.AH := $2C;
       MsDos(Regs);
       H := Regs.CH;
       M := Regs.CL;
       S := Regs.DH;
       S100 := Regs.DL
    END;

    { tFormat - given two times, return a pointer
      to a (static) string that is the difference
      in the times, formatted HH:MM:SS }

    FUNCTION tFormat(T1,T2:Longint): DiffType;

    FUNCTION rMod(P1,P2: Real): Real;
    BEGIN
       rMod := Frac(P1/P2) * P2
    END;

    VAR
            Temp : Real;
       tStr : String;
       TempStr : String[2];
       TimeValue : ARRAY [1..4] OF Longint;
       I : Integer;
    BEGIN
       Temp := t2-t1;           { Time diff. }
       {Adj midnight crossover}
       IF Temp < 0 THEN
              Temp := Temp + TixDay;
              TimeValue[1] := Trunc(Temp/TixHour);  {hours}
              Temp := rMod(Temp,TixHour);
       TimeValue[2] := Trunc(Temp/TixMin); {minutes}
       Temp := rMod(Temp,TixMin);
       TimeValue[3] := Trunc(Temp/TixSec); {seconds}
       Temp := rMod(Temp,TixSec);     {milliseconds}
       TimeValue[4] := Trunc(Temp*100.0/TixSec+0.5);
       STR(TimeValue[1]:2,tStr);
       IF tStr[1] = ' ' THEN tStr[1] := '0';
       FOR I := 2 TO 3 DO
          BEGIN
             STR(TimeValue[I]:2,TempStr);
             IF TempStr[1]=' ' THEN
                                TempStr[1]:='0';
             tStr := tStr + ':'+ TempStr
          END;
       STR(TimeValue[4]:2,TempStr);
       IF TempStr[1]=' ' THEN TempStr[1]:='0';
       tStr := tStr + '.' + TempStr;
       tFormat := tStr
    END;

    END.

[Back to MISC SWAG index] [Back to Main SWAG index] [Original]