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


Unit Timer;
 Interface
  Var Int1CSave : Procedure;        {Pointer to the old 1C.                  }
      TimerCnt  : Word;             {The timer counter.                      }

Procedure InstallInt1C;            {Install the interrupt routine for $1C.   }
Procedure RestoreInt1C;            {Restore the original interrupt for $1C.  }
Procedure SetTimer(SetVar : Word); {Sets the timer to a number of ticks.     }
Procedure WaitTimer;               {Waits until the timer is 0.              }
Procedure DLay(Ticks : Word);      {Delays a number of ticks (18.2 per sec.) }
Procedure DLaySec(Ticks : Word);   {Delays a certain # of seconds.           }
Function TimerDone : Boolean;      {Checks if the timer has counted down.    }
Implementation
 Uses CRT,
      DOS;

{$F+,S-}
Procedure TimerHandler;
 Interrupt;
  Assembler;
   Asm
    Cmp   TimerCnt,0
    Jle   @Done
    Dec   TimerCnt
   @Done:
    PushF
    Call  Int1CSave
   End;
{$F-,S-}

Procedure SetTimer(SetVar : Word); Begin TimerCnt:=SetVar End;

Function TimerDone : Boolean; Begin TimerDone:=TimerCnt=0; End;

Procedure WaitTimer;
 Assembler;
  Asm
   @RepLoop:
   Cmp TimerCnt,0
   Jge @RepLoop
  End;

Procedure DLay(Ticks : Word);
 Begin
  TimerCnt:=Ticks;
  Asm
   @RepLoop:
   Cmp TimerCnt,0
   Jg @RepLoop
  End;
 End;

Procedure DLaySec(Ticks : Word);
 Begin
  TimerCnt:=Round(Ticks*18.2);
  Asm
   @RepLoop:
   Cmp TimerCnt,0
   Jg @RepLoop
  End;
 End;

Procedure InstallInt1C;
 Begin
  GetIntVec($1C,@Int1CSave);
  SetIntVec($1C,Addr(TimerHandler));
 End;

Procedure RestoreInt1C;
 Begin
  SetIntVec($1C,@Int1CSave);
 End;

End. {You need to call InstallInt1C; to start it and make SURE you call
RestoreInt1C; before you exit your program.}


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