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

{
> Does anybody knows if there's a timer function in turbo pascal (version 5) or
> turbo pascal for windows in which the user could start and stop a timer using
> this function.

Here is the unit I wrote for high precision timing.  Is can be used for
timing events of up to 54 milliseconds duration accurate to a few microseconds.
Hope it helps.

From: JOHARROW@homeloan.demon.co.uk (John O'Harrow)
}
UNIT Timer;

(*High Precision Timer Library for Borland Pascal, for timing operations 
  of less than 54 milliseconds duration, accurate to a few microseconds.
  Based on code originally written by Michael Abrash for his book "Zen of
  Assembly language", and on Kendall Bennett's subsequent enhancements.*)

INTERFACE

  PROCEDURE StartTimer;          {Start the High-Precision Timer   }
  PROCEDURE StopTimer ;          {Stop the High-Precision Timer    }

  FUNCTION  TimeTaken : LongInt; {Return Time Taken in Microseconds}
                                 {Returns -1 if Time Taken > 54 mS }
IMPLEMENTATION

VAR
  Flags    : Byte;
  Overflow : Byte;
  Counter  : Word;
  RefCount : Word;

  PROCEDURE RefOn; ASSEMBLER;
  ASM
    mov  al,00110100b
    out  43h,al
    db   $EB,0,$EB,0,$EB,0
    sub  al,al
    out  40h,al
    db   $EB,0,$EB,0,$EB,0
    out  40h,al
  END;

  PROCEDURE RefOff; ASSEMBLER;
  ASM
    mov  al,0
    out  43h,al
    db   $EB,0,$EB,0,$EB,0
    in   al,40h
    db   $EB,0,$EB,0,$EB,0
    mov  ah,al
    in   al,40h
    xchg ah,al
    neg  ax
    add  [RefCount],ax
  END;

  PROCEDURE StartTimer; ASSEMBLER;
  ASM
    pushf
    pop  ax
    mov  [Flags],ah
    and  ah,0fdh
    push ax
    sti
    mov  al,00110100b
    out  43h,al
    db   $EB,0,$EB,0,$EB,0
    sub  al,al
    out  40h,al
    db   $EB,0,$EB,0,$EB,0
    out  40h,al
    mov  cx,10
  @@Delay:
    Loop @@Delay
    cli
    mov  al,00110100b
    out  43h,al
    db   $EB,0,$EB,0,$EB,0
    sub  al,al
    out  40h,al
    db   $EB,0,$EB,0,$EB,0
    out  40h,al
    popf
  END;

  PROCEDURE StopTimer; ASSEMBLER;
  ASM
    pushf
    mov  al,0
    out  43h,al
    mov  al,00001010b
    out  20h,al
    db   $EB,0,$EB,0,$EB,0
    in   al,20h
    and  al,1
    mov  [Overflow],al
    sti
    in   al,40h
    db   $EB,0,$EB,0,$EB,0
    mov  ah,al
    in   al,40h
    xchg ah,al
    neg  ax
    mov  [Counter ],ax
    mov  [RefCount],0
    mov  cx,16
    cli
  @@Loop:
    call RefOn
    call RefOff
    loop @@Loop
    sti
    add  [RefCount],8
    mov  cl,4
    shr  [RefCount],cl
    pop  ax
    mov  ch,[Flags]
    and  ch,2
    and  ah,0fdh
    or   ah,ch
    push ax
    popf
  END;

  FUNCTION TimeTaken : LongInt; ASSEMBLER;
  ASM
    cmp  [Overflow],0
    jz   @@Good
    mov  ax,0FFFFh
    mov  dx,0FFFFh
    jmp  @@Done
  @@Good:
    mov  ax,[Counter ]
    sub  ax,[RefCount]
    mov  dx,8381
    mul  dx
    mov  bx,10000
    div  bx
    xor  dx,dx
  @@Done:
  END;

END.


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