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