``````{
> 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.

``````