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

{ millisecond timer Unit }

Unit msecs;

Interface

Var
   timer:Word;                     { msec timer }
   idle:Procedure; {  you can change this to do something useful when Delaying}

Procedure Delay_ticks(t:Word);     { resume Until t clock ticks have elapsed }
Procedure start_clock;             { starts the 1 msec timer }
Procedure stop_clock;              { stops the 1 msec timer }

Implementation

Uses Dos;

Procedure Delay_ticks(t:Word);
begin
  inc(t,timer);
  Repeat idle Until Integer(timer - t) >= 0;
end;

Const clock_active:Boolean = False;
      one_msec = 1193;
Var   save_clock:Pointer;
      clocks:Word;

Procedure tick_int; Far; Assembler;
Asm
  push ax
  push ds
  mov ax,seg @data
  mov ds,ax
  mov al,$20
  out $20,al
  inc [timer]
  add [clocks],one_msec
  jnc @1
  pushf
  call [save_clock]
@1:
  pop ds
  pop ax
  iret
end;


Procedure start_clock;
begin
  if clock_active then Exit;
  inc(clock_active);
  timer := 0;
  clocks := 0;
  getintvec($08,save_clock);
  setintvec($08,@tick_int);
  port[$43] := $36;
  port[$40] := lo(one_msec);
  port[$40] := hi(one_msec);
end;

Procedure stop_clock;
begin
  if not clock_active then Exit;
  dec(clock_active);
  port[$43] := $36;
  port[$40] := 0;
  port[$40] := 0;
  setintvec($08,save_clock);
end;

Procedure nothing; Far;
begin
end;

Var saveexit:Pointer;

Procedure uninstall; Far;
begin
  Exitproc := saveexit;
  if clock_active then stop_clock;
end;

begin
  timer := 0;
  idle := nothing;
  saveexit := Exitproc;
  Exitproc := @uninstall;
end.




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