[Back to TIMING SWAG index] [Back to Main SWAG index] [Original]
UNIT Timer;
INTERFACE
TYPE
  tTimerObject = object
    TimerTicks : LONGINT;
    MaxSeconds : LONGINT;
    PROCEDURE Start(Amount : LONGINT);
    FUNCTION  ElapsedSeconds : LONGINT;
    FUNCTION  Remaining : LONGINT;
    FUNCTION  Expired : BOOLEAN;
    FUNCTION  PrintableTimer(Tics : LONGINT) : STRING;
  END;
IMPLEMENTATION
VAR
  TicksSinceMidnight : LONGINT ABSOLUTE $0040 : $006c;
  PROCEDURE tTimerObject.Start(Amount : LONGINT);
  BEGIN
    TimerTicks := TicksSinceMidnight;
    MaxSeconds := Amount;
  END;
  FUNCTION tTimerObject.ElapsedSeconds : LONGINT;  { elapsed time in seconds }
  CONST
    TicksPerDay = 1573040;
    TicksPerSecond = 18.20648;
  VAR
    ElapsedTicks : LONGINT;
  BEGIN
    ElapsedTicks := TicksSinceMidnight;
    IF (ElapsedTicks >= TimerTicks) THEN
      ElapsedTicks := ElapsedTicks - TimerTicks
    ELSE      { Midnight rollover occurred }
      ElapsedTicks := TicksPerDay - TimerTicks + ElapsedTicks;
    ElapsedSeconds := ROUND (ElapsedTicks / TicksPerSecond);
  END;
  FUNCTION tTimerObject.Expired : BOOLEAN;  { Has this timer expired ?? }
  BEGIN
  Expired := (ElapsedSeconds > MaxSeconds);
  END;
  FUNCTION tTimerObject.Remaining : LONGINT;  { How many seconds remain? }
  BEGIN
  IF Expired THEN Remaining := 0 ELSE
     Remaining := MaxSeconds - ElapsedSeconds;
  END;
  FUNCTION tTimerObject.PrintableTimer(Tics : LONGINT) : STRING;
  { return a printable time string }
    VAR
      S, T : STRING;
      Hour, Min, Sec, Time : LONGINT;
      i : INTEGER;
    BEGIN
    Hour := (Tics div 3600);
    Min  := (Tics div 60);
    Sec  := Tics - (Min * 60);
    STR(Min : 2, T);
    IF T[1] = #32 THEN T[1] := '0';
    S := T + ':';
    STR(Sec : 2, T);
    IF T[1] = #32 THEN T[1] := '0';
    S := S + T;
    PrintableTimer := S;
    END;
END.
{ ----------------------------   DEMO   ----------------------- }
uses
  CRT, Timer;
var
  t : tTimerObject;
begin
  ClrScr;
  t.Start(10);  { set a 10 second timer }
  GoToXY(1,1); Write(t.TimerTicks);
  repeat
  GoToXY(1,2); Write(t.PrintableTimer(t.Remaining));
  GoToXY(1,3); Write(t.PrintableTimer(t.ElapsedSeconds));
  until (t.Expired);  { wait until it expires }
  Readkey;
end.
[Back to TIMING SWAG index] [Back to Main SWAG index] [Original]