[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]