Dec 202017
Turbo Pascal Unit Overcome Bug of Delay Function on Fast 33mhz machines. | |||
---|---|---|---|
File Name | File Size | Zip Size | Zip Type |
FASTWAIT.PAS | 2418 | 890 | deflated |
TEST.PAS | 2292 | 809 | deflated |
WAIT.ASM | 2516 | 847 | deflated |
WAIT.DOC | 3921 | 1671 | deflated |
WAIT.OBJ | 319 | 291 | deflated |
Download File FWAIT1.ZIP Here
Contents of the WAIT.DOC file
FastWait Copyright (c) 1991 Southern Software
Version 1.00 - 4/8/91
Allows PC's faster than 20 mhz (386/486) to properly use a delay
function based upon a null looping procedure such as is used in the
Turbo Pascal "Delay" procedure. Wait is accurate for PC's as fast as
1,100 mhz equivalent!
USAGE: Simply place "FastWait" in the Uses section of your program
and replace each occurrence of "delay" in your program with
"wait".
Example-
=======
Existing program:
----------------
Uses CRT;
begin
writeln('This program delays for 5 seconds.);
delay(5000);
end.
New program:
-----------
Uses FastWait, CRT; {Now also uses "FastWait"}
begin
writeln('This program delays for 5 seconds.);
wait(5000); {changed "delay" to "wait"}
end.
User accessible variables in FastWait unit:
------------------------------------------
WaitOneMS : Number of loops required for one millisecond delay
LoopsPerTick : LongInt which is # loops in timer for one
BIOS tick (18.2 ticks per second)
BIOSTick : An absolute LongInt variable into the PC BIOS area
which is the system counter and is incremented 18.2
times per second.
Procedure in FastWait unit:
--------------------------
procedure Wait( ms : word );
procedure ShortDelay(NumLoops : word);
{
This procedure is for very short timing loops ( < 1ms) that cannot be
handled by the delay routine.
The variable "LoopsPerTick" has the number of loops to do for one BIOS
tick (18.2 of these/sec). If you want to delay for "X" s, the number
of loops required would be "(LoopsPerTick*X) div 54945"
This will not compile if you are using TP 4.0, 5.0 or 5.5 due to the
conditional defines. This is because it makes use of the "asm"
statement which is not available in TP versions prior to 6.0.
}
Technical Discussion
--------------------
In the Turbo CRT unit, there has been a word variable named "DelayCnt"
(local variable to the CRT unit) which is the number of loops that
were done in one clock tick divided by 55. This is a decent approx-
imation of the number of loops required for one millisecond (the
"Delay" procedure merely called a null loop "DelayCnt" times for each
millisecond specified in the call to the procedure. (Note- For those
using Object Professional or Turbo Professional, this variable is called
"OneMS", but the logic is identical).
Unfortunately, if the clock speed gets to about 25 mhz, the PC is so
fast that the PC can do more than 65,535 loops and the null loop timer
does not work. The value 65,535 is divided by 55 to give 1,191
regardless of the speed of the PC. Subsequent calls to the delay
procedure cause shorter-than-expected delays since the delay count
calculated for one millisecond is too low. This problem gets worse the
faster the PC becomes.
The "Wait" procedure is a simple solution to this problem. The number
of loops done in one clock tick is stored in a LongInt rather than a
word variable so the limit of 65,535 loops in one clock tick is not a
problem.
Special goody if you are using TP 6.0+ (or if you want to make the
assembly code below in a separate ASM file) -- A routine called
"ShortDelay" is provided which will be included in the FastWait unit
automatically if you are using TP 6.0+ that allows you to specify
delays which are shorter than 1 millisecond (the lower limit of
the "delay" and "wait" routines.
Public Usage
------------
This utility is provided for the public domain on an as-is basis
free of charge. It may be used in any programs with no royalties.
Southern Software retains all rights to the code and is not liable
for anything which may happen as a result of using the code.
December 20, 2017
Add comments