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