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