toma@killer.UUCP (Tom Armistead) (01/09/88)
This is a 'little thing I put together' when I was in the
need for an Accurate Millisecond timer for the PC. This is
pretty accurate, + or - 5 milliseconds on a 4.77 mhz XT and
even better on an AT (~+ or - 2 milliseconds)!!!
I have included the uuencoded TEST.EXE demo program. See the READ.ME
for a better explanation...
Tom
---
UUCP: ...!ihnp4!killer!toma
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: READ.ME nap.c test.c test.uue
# Wrapped by toma@killer on Sat Jan 9 02:33:23 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f READ.ME -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"READ.ME\"
else
echo shar: Extracting \"READ.ME\" \(1070 characters\)
sed "s/^X//" >READ.ME <<'END_OF_READ.ME'
X
X nap(1) PC-DOS Turbo-C
X
X This is an implementation of unix (curses) nap
X function for Turbo C. Timings are NOT processor
X speed specific and therefore produce the same
X delay on a 10mhz AT as on a 4.77 mhz XT.
X
X Curses nap() is used to produce a millisecond
X delay.
X
X Tom Armistead
X UUCP: ...!ihnp4!killer!toma
X
X --------------------------------------------------
X Synopsis: int nap(delay)
X int delay;
X
X Description: produces a 'delay' millisecond
X delay.
X Must be called once to initialize
X itself, this will produce about a
X 750 millisecond delay. May then be
X called normally to produce the
X specified delay.
X
X
X
END_OF_READ.ME
echo shar: Missing newline added to \"READ.ME\"
echo shar: 1 control character may be missing from \"READ.ME\"
if test 1070 -ne `wc -c <READ.ME`; then
echo shar: \"READ.ME\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f nap.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"nap.c\"
else
echo shar: Extracting \"nap.c\" \(3628 characters\)
sed "s/^X//" >nap.c <<'END_OF_nap.c'
X/*.
X** nap sleep a specified number of milliseconds
X** TurboC v1.0
X**
X** synopsis int nap(d)
X** int d; * # of milliseconds to sleep *
X**
X** description: The first time this function is called, it
X** initializes it self to find out how long it
X** takes to delay 1 millisecond. This is done
X** by using a for loop and the dos clock and
X** takes about 750 milliseconds to complete.
X** This makes the code NON-CPU speed dependent.
X**
X** caveats: If you have things running in backround, they
X** will definately affect the accuracy here.
X**
X** author: Tom Armistead
X** UUCP: ...!ihnp4!killer!toma
X**
X** credits: I got this idea from something posted by Tim Pozar
X** some months back
X**
X** PD: This code is hereby placed in the Public Domain
X** and you may use it (or chunk it) as you see fit.
X** Just remember where you got it...
X**
X**
X*/
X#include <dos.h>
X
Xnap(d)
Xint d;
X{ static long count = 0;
X long loop,delay[10];
X struct time t1, t2;
X int i;
X unsigned char cnt;
X
X if (!count) /* 1st time through */
X { count = 1000L; /* base timer value (random) */
X gettime(&t1);
X cnt = t1.ti_hund; /* currnet ms */
X while (t1.ti_hund == cnt)
X gettime(&t1); /* wait for next ms */
X
X /*
X ** stay in this loop until we find a count value
X ** that will take at leaste 1 clock tick
X */
X do
X { /*
X ** do a short delay, to find out how long it takes
X */
X gettime(&t1);
X for (loop = count; loop; loop--)
X ;
X gettime(&t2);
X delay[0] = (t2.ti_sec * 100 + t2.ti_hund) - /* # of msecs */
X (t1.ti_sec * 100 + t1.ti_hund); /* used in loop */
X if (!delay[0])
X count *= 2;
X } while (!delay[0]);
X
X if (delay[0] < 0)
X delay[0] += 6000; /* check for seconds rollover */
X /*
X ** now we have a delay value, go through loop
X ** 10 times and take an average of those 10 delays
X ** for the actual delay value
X */
X for (i=1; i<=10; i++)
X { gettime(&t1);
X for (loop = count; loop; loop--)
X ;
X gettime(&t2);
X delay[i] = (100 * t2.ti_sec + t2.ti_hund) - /* # of msecs */
X (100 * t1.ti_sec + t1.ti_hund); /* used in loop */
X if (delay[i] < 0)
X delay[i] += 6000;
X }
X for (delay[0] = 0,i=1; i<=10; i++)
X delay[0] += delay[i];
X delay[0] /= 10; /* now the average of the 10 */
X count /= 10 * delay[0]; /* # of loops for 1 millisecond */
X#ifdef TESTING
Xprintf("%ld times through loop, delayed %d ms\n", count, 10*delay[0]);
Xprintf("# of loops for 1 ms is %ld\n",count);
X#endif
X } /* end if !count */
X
X /*
X ** count has been computed, now delay
X */
X else for (loop = count * d; loop; loop--)
X ;
X} /* end of nap */
X
X/* end of nap.c */
X
END_OF_nap.c
echo shar: Missing newline added to \"nap.c\"
echo shar: 1 control character may be missing from \"nap.c\"
if test 3628 -ne `wc -c <nap.c`; then
echo shar: \"nap.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f test.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"test.c\"
else
echo shar: Extracting \"test.c\" \(934 characters\)
sed "s/^X//" >test.c <<'END_OF_test.c'
X/*.
X** test.c test module for nap.c
X** TurboC v1.0
X**
X** compile: tcc test.c nap.c
X**
X**
X*/
X#include <stdio.h>
X
Xmain()
X{ int i,j;
X
X nap(0);
X
X for (i=1; i<=10; i++)
X { /*
X ** this loop will take 20 seconds
X */
X for (j=1; j<=80; j++)
X { nap(250);
X putchar('X');
X }
X /*
X ** this loop will take 8 seconds
X */
X for (j=1; j<=80; j++)
X { nap(100);
X putchar('X');
X }
X /*
X ** this loop will take .8 seconds
X */
X for (j=1; j<=80; j++)
X { nap(10);
X putchar('X');
X }
X
X }
X} /* end of main */
X
X/* end of test.c */
X
END_OF_test.c
echo shar: Missing newline added to \"test.c\"
echo shar: 1 control character may be missing from \"test.c\"
if test 934 -ne `wc -c <test.c`; then
echo shar: \"test.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f test.uue -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"test.uue\"
else
echo shar: Extracting \"test.uue\" \(6535 characters\)
sed "s/^X//" >test.uue <<'END_OF_test.uue'
Xbegin 644 test.exe
XM35J$ H !@ @ #__P& "( ! /L0<FH! 9 0 $H$ [
XM! (00 .4"
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM NN, +HD6;@&T,,TABRX" (L>+ ".VJ.& (P&A ")
XM'H B2Z8 ,<&B@#__X[#,\"Y_W^+^(O8)H$].#=U&2:+50* ^CUU$(#FW_\&
XMB@" _EEU!/\&B@#RKN-C0R8X!776@,V ]]F)#GX @\,'@>/\_]'CB1Z" !ZX
XM #7-(8D>= ",!G8 N E#A^Z8@'-(1\._Q90 HL^3@*[ $[^W<"B_N,VH'#
XME )R%+\ $+$$T^M#*^H[[W<)A]\[[W<#Z9$ B]\#VHD>D ")'I0 H80 *]B.
XMP+1*S2'3YX[2B^?HY GHR@HSP"Z.!FX!OU0"N90"*\_SJO\V? #_-GH _S9X
XM .AM %#H#@2X "7%%G0 S2$NCAYN 0[_%E(",\"+\+DO )#\ @2 U !&XO@M
XM-I!T"KD9 )"Z+P#H"0"+[(I& K1,S2&T0+L" "Z.'FX!S2'#N1X D+I6 .CI
XM_[@# %#HI?^Y#@"0ND@ Z-C_Z^T %97,\!0Z+4 6;\! .FC +X! .LLN/H
XM4.BB %F[M #_!WT0L%B[O@#_!XL?B$?_M #K#+BT %"P6%#H>@=964:#_E!^
XMS[X! .LLN&0 4.AL %F[M #_!WT0L%B[O@#_!XL?B$?_M #K#+BT %"P6%#H
XM1 =964:#_E!^S[X! .LLN H 4.@V %F[M #_!WT0L%B[O@#_!XL?B$?_M #K
XM#+BT %"P6%#H#@=964:#_E!^ST>#_PI_ ^E5_U]>PU95B^R#[#:AF@ +!IP
XM= /I%0+'!IP #'!IH Z .-1O90Z/8$68I&^(A&_XI&^#I&_W4*C4;V4.C@
XM!%GK[HU&]E#HU@19BQ:< *&: (E6S(E&RNL(@V[* 8->S "+1LH+1LQU\(U&
XM^E#HKP19BD;]M "Z9 #WXHI6_+8 \**5OFV %"+PKID /?BBE;XM@ #PHO0
XM6"O"F8U>SHE7 HD'C5[.BP<+1P)U%HL6G "AF@"Y 0":-0@ (D6G "CF@"-
XM7LZ+!PM' G4#Z7'_C5[.@W\" '\=? 6#/P!S%HU>SHM7 HL'!7 7@]( C5[.
XMB5<"B0>^ 0#IJ0"-1O90Z!L$68L6G "AF@")5LR)1LKK"(-NR@LP BT;*
XM"T;,=?"-1OI0Z/0#68I&_;0 NF0 ]^**5ORV /"BE;YM@!0B\*Z9 #WXHI6
XM^+8 \*+T%@KPIF+WM'CT>.-3LX#V8E7 HD'B][1X]'CC4;. ]B#?P( ?RU\
XM!8,_ ',FB][1X]'CC4;. ]B+5P*+!P5P%X/2 (O>T>/1XXU.S@/9B5<"B0=&
XM@_X*?P/I3_^-7L['1P( ,<' "^ 0#K(8O>T>/1XXU&S@/8BU<"BP>-7LX#
XM!Q-7 HU>SHE7 HD'1H/^"G[:,]*X"@!24(U>SO]W O\WFKL' "-7LZ)5P*)
XM!XU>SHM7 HL',\F["@":C0@ %)0_S:< /\VF@":NP< (D6G "CF@#K*8M&
XM!IF+#IP BQZ: )J-" B5;,B4;*ZPB#;LH!@U[, (M&R@M&S'7PB^5=7L-5
XMB^R#/IX ('4%N $ ZQ.+1@2+'IX T>.)AU0"_P:> #/ 7<-5B^R+1@2+U('J
XM $[PG,%HXP ZPG'!H@ " "X__]=PU6+[*&, (M6! /"<P0+TGD2B\B!P0 !
XM<@H[S',&AP:, .L)QP:( @ N/__7<-5B^S_=@3HJ?]97<-5B^S_=@3HO?]9
XM7</'!HH #+PU6+[*&> /\.G@ +P'0,BQZ> -'C_Y=4 NOI_Q:@ /\6H@#_
XM%J0 _W8$Z,;[65W#5E=5B^R+=@B+1 P[QG4Z@SP ?!*#? 8 =33'! BT0(
XMB40*ZRB+? 8#/$<I/%>+1 B)1 I0BD0$F%#H1P>+Y3O'= J!3 (0 +C__^L"
XM,\!=7U[#5E=5B^R+?@B#Q_Z+-D8"ZQ6+1 ([QG<+._YW%8M$ CO'=PZ+= ([
XM_G;GBT0".\=VX(L% \<[1 )U$HM< HL' 06+7 *+1P*)10+K!HM$ HE% HL$
XM \8[QW4.BP4!!(M% HE$ HO^ZP.)? (SP%#HOOY9BQ4#USO"=1F+]^L#BW0"
XMBT0".\=U]HM% HE$ E?HR_Y9B39& EU?7L-65U6+[$Q,BUX(BS>+QHE&_O='
XM D = 2+QNL=BUX(BW\*B\9."\!TB]]'@#\*=?'_1O[K[(M&_HOE75]>P@(
XM5E6+[(MV!E;HQ?Y9"\!T!;C__^M7@WX, 74>@SP ?AF+5@J+1@A24%;HD_^9
XM6UDKV!O*B4X*B5X(@60"7_['! BT0(B40*_W8,_W8*_W8(BD0$F%#HH@&+
XMY8/Z_W4*/?__=06X___K C/ 75[#5E6+[(/L!(MV!E;H4_Y9"\!T![K__XO"
XMZS:P 5 SP%!0BD0$F%#H8P&#Q B)5OZ)1OR#/ !^$U)05N@3_YF+V(O*6%HK
XMPQO1ZP:+5OZ+1OR+Y5U>PU6+[+0JS2&+7@2)#XE7 EW#58OLM"S-(8M>!(D/
XMB5<"7<-65U6+[(MV" OV?!&#_EAW(XDVY@&*A.@!F);K]]Z#_B)W$,<&Y@'_
XM_XO&HX@ N/__ZP6^5P#KV%U?7L(" %6+[+@ 1(M>!,TAN <@31XM'07<.Q
XM ^L*L0+K!K$!ZP(SR5565XOLBT8*BU8,BUX.BVX0,_;VP0%U&@O2>0GWVO?8
XM&]: R00+[7D)]]WWVQON@/$$B_T+^G4&]_.'\NL@4;D@ (O^T>#1TM'6T=<[
XM_7(+=P0[\W(%*_,;_4#BYUGVP0)T Y:+U_;!!'0']]KWV(/: %]>7<H( (/Y
XM('8%,\ STLM)? ;1X-'2Z_?+@_D@=@.Y( !)? ;1^M'8Z_?+@_D@=@4SP#/2
XMRTE\!M'JT=CK]\M5B^RT0HI&"HM>!(M."(M6!LTA<@+K!5#HT/Z97<-6EI*%
XMP'0"]^.1A<!T!/?F \B6]^,#T5[+5E=5B^R#[ 2+?@@+_W1>B\<%!0 E_O^+
XM^*%& HE&_(O8BW<"BP0[QW(HBP2+UX/"!#O"=PN+1 *+7OR)1P+K"BD\BP0#
XMQHOPB3R+1ORC1@+K)#LV1@)T"(EV_(MT NO$5^B]^UF)1OX]__]U!#/ ZPJ+
XM=OZ)/(O&!0( B^5=7U[#5E6+[(MV"/\,]T0"D !T ^FT /=$ @( =0/IJ@"!
XM3 ( 8-\!@!T)X,\ '0,5NCL^UD+P'3IDP"X__^+5 8KPHD$5O]V!NB/ (OE
XMZ8< @SY, @!U-KBT #O&=2^*1 284.C^60O =06!9 +__;@ E"%1 )T!;@"
XM .L",\!0,\!05NA) HOEZ9'_@'X&"G4>]T0"0 !U%[@! %"X2 )0BD0$F%#H
XM[@.+Y3T! '47N $ 4(U&!E"*1 284.C7 XOE/0$ = J!3 (0 +C__^L%BD8&
XMM !=7L-658OLBW8(_P1]-(I&!O]$"HM<"HA'_X!^!@IT!H!^!G45]T0"" !T
XM#E;H%OM9"\!T!;C__^L0BD8&M #K"5;_=@;HX?Z+Y5U>PU6+[+BT %#_=@3H
XMJ/^+Y5W#5E=5B^R+?@B+=@I&]T4"" !T&$YT1%>+7@S_1@S_-^B"_XOE/?__
XM=#'KZ$YT+/\%?16+7@S_1@R*!_]%"HM="HA'_[0 ZPY7BUX,_T8,_S?H>/Z+
XMY3W__W71B\9=7U["!@ NCP:^"BZ,'L *_(X&A "^@ SP(O8B]"+
XMR":LB_Z3)H@!0X?9Z!4 =P=R/^@. '?Y/"!T!#P)=>PRP.OH"\!T!T*J"L!U
XM 4.&X#+ ^>,8)JQ)+")T$00B/%QU"2: /")U R:L20OVP^DB]HS%BS9^ (/&
XM KD! ( ^A@ #<@^.!H B_ZQ?_*NX]Z \7]#B1YX $.+P0/" ]L% 0 E_O\#
XMV(O\*_@KXX?=B^R))GH C-".P(E^ (/% HX>@ !)\Z0RP*J.VX?*OH$ XPZ)
XM?@"#Q0*L"L"JX/IT\#/ B48 +HX>P HN_R:^"HL.?@!1Z/'\68OX"\!T)!X>
XM!XX>@ S]OSSI!^+^ ;_-H( Z-/\@\0"B]@'HWP "\!U ^EN]3/ N?__B3^#
XMPP+RKB8X!77TB0?#5E=5B^R+?@Z+=@B+1 P[QG0#Z9L @WX, GX#Z9( @?__
XM?W8#Z8D @SY, @!U#[BT #O&=0C'!DP" 0#K%(,^2@( =;BF #O&=0;'!DH"
XM 0"#/ !T#K@! % SP%!05N@;^HOE]T0"! !T!_]T".@P^5F!9 +S_\=$!@
XMB\8%!0")1 B)1 J#?@P"=#\+_W8[QP:@ $.@WX* '485^@._%F)1@H+P'0'
XM@4P"! #K!;C__^L9BT8*B40*B40(B7P&@WX, 74%@4P"" SP%U?7L-65U6+
XM[('LB@"+1@Q /0( <P4SP.G8 (M>"-'C]X>^ 0" =!+_=@S_=@K_=@CHQ0"#
XMQ ;IN0"+1@J)AGC_BWX,C;9^_PO_=&5/BYYX__^&>/^*!XB&=_^ ^ IU!,8$
XM1HJ&=_^(!$:-AG[_B]8KT('Z@ !\SXV&?O^+UBO0B99Z_U*-AG[_4/]V".AH
XM (/$!HF&?/\[AGK_=*8+P'(\BT8,*\<#AGS_*X9Z_^M"C89^_XO6*]")EGK_
XM"])V+U*-AG[_4/]V".@L (/$!HF&?/\[AGK_=!8+P',%N/__ZQ"+1@P#AGS_
XM*X9Z_^L#BT8,B^5=7U[#58OLBUX$T>/WA[X! AT#[ "4#/ 4%#_=@3HE/J+
XMY;1 BUX$BTX(BU8&S2%R#U"+7@31XX&/O@$ $%CK!%#H6_E=PU97OP( OJ8
XMZQ#W1 (# '0%5N@N]UE/@\8."_]U[%]>PP %1U
XM<F)O+4,@+2!#;W!Y<FEG:'0@*&,I(#$Y.#<@0F]R;&%N9"!);G1L+@!.=6QL
XM('!O:6YT97(@87-S:6=N;65N= I$:79I9&4@97)R;W(*06)N;W)M86P@<')O
XM9W)A;2!T97)M:6YA=&EO;@H "4 @
XM !0%% 44!0 "0( *8 * @$
XM M (" @ #" #_ - /\
XMW@ _P #L #_ /H /\ " $
XM _P 6 0 #_ "0! /\ ,@$
XM_P ! 0 #_ $X! /\ 7 $ _P
XM !J 0 #_ '@! /\ A@$ _P
XM "4 0 #_ *(! /\ L $!( (@ B $( (@____
XM____________________________________ $P("! 4&" @(%!4%$_\6
XM!18"_________________P4%_____________________P___P+_#_____\3
XL__\" @4/ O___Q/___________________\3_P $("0@( 0!043
X
Xend
END_OF_test.uue
if test 6535 -ne `wc -c <test.uue`; then
echo shar: \"test.uue\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of shell archive.
exit 0
--
-------------
Tom Armistead
UUCP: ...!ihnp4!killer!toma