Category : Files from Magazines
Archive   : WDAPR92.ZIP
Filename : 3N04043A

 
Output of file : 3N04043A contained in archive : WDAPR92.ZIP
/*
High Resolution Time Stamping Routines
tstamp.c
Author: Charles B. Allison,
Allison Technical Services
Houston, Texas USA
Change History:
Created 07:30 4-11-91
Purpose: To provide high resolution time of
day time stamp acquisition and
printing.
Hardware: PC and compatibles
*/

#include
#include
#include
#include "timer.h"

/* generate inline code for interrupt and i/o */
#pragma intrinsic (inp,outp,enable,disable)

/* # of seconds in a day at 12:00 noon
(i.e., 3600 * 12) */
#define NOON_SECS 43200L

/* Number of ticks til noon when including timer byte
as least significant byte of tick count.
(i.e., 256 * 12 * 3600 * 18.2) */
#define NEW_TICKS 201277440L

/* FRAC_SEC = 10 * the number of new ticks in a second
since one second has 18.2 ticks (i.e., 256 * 182)*/
#define FRAC_SEC 46592L

long far *systime = (long far *) 0x0046b;
/*actually 46c but want times 256*/

long get_time(void); /* get 32 bit time value */
int get_tmr(void); /* get timer contents */
void init_timer(void); /* set 8253 timer mode=2 */
long get_sec_time(long val);
int get_msec_time(long val);
long atime_diff(unsigned long time1,
unsigned long time2);
void print_time(unsigned long intim);

/* ********* time access ************ */
/* ------ get 32 bit time stamp -------- */
/*
NOTES - there are 86,400 seconds per day
0x40:6c (long) has number of ticks (18.2x per sec)
since midnight
then get number of ticks from 40:6c * 10/182
for # of seconds today
then add together for number of seconds
each timer tick is 54.945054 ms
take remainder of the /182 division for
the fraction of seconds
(fraction*10000)/182 = milliseconds*10
(use long and multiply first)
take timer msb to .2 ms - each tick is .2146ms
of ms byte of timer
(long) (timer byte * 2146)/1000 = 10*milliseconds
number should be good to .1 ms - divide
by 10 to get msecs for struct timeb
timeb is loaded by ftime()
note timeb is struct with:
time_t (long) time seconds since 1-1-1970 (GMT)
unsigned short milliseconds
short timezone (diff. in minutes between gmt
and local)
short dstflag ( =0 no daylight savings time)
needs
alternately just use 40:6c 4 bytes + timer 1 byte
*/

/* ---------- get_time ------------- */
long get_time(void)
{
long temptime;

_disable();
temptime = (*systime) & 0xFFFFFF00L; /** 256;*/
temptime += get_tmr();
_enable();
return temptime;
} /* end of get 32 bit time value */

/* ------- get 8 bit timer contents -------- */
int get_tmr(void)
{
int tmp1;
/* WARNING should be called with interrupts disabled
or risk glitching the who is who sequence
of bytes for upper lower byte */
outp(TIMERC,0); /* latch data */
inp(TIMER0); /* throw away lsb */
tmp1 = 255 - (0xff & inp(TIMER0));
/* request pending intrpt status */
outp(PIC00,OCW3IR);
tmp1 |= ( inp(PIC00) & 0x01) ? 0x100 : 0x00;
/* get the pending status for timer int irq01*/
/* set - timer int not done yet */

/* use PIC for rollover not captured yet */
return tmp1;
} /* end of get timer contents */

/* ----------- init_timer ------------- */
void init_timer(void)
{
_disable();
outp(TIMERC,TMODE2);
outp(TIMER0,0); /* load 65536 */
outp(TIMER0,0);
_enable();
}

/* ----------- get_sec_time -------------- */
long get_sec_time(long val)
{
long subflg = 0;
long tmp = NEW_TICKS;

if(val > tmp)
{
val -= tmp;/* sub out 12 hrs if need to - overflow */
subflg = NOON_SECS; /* subtract 12 hrs of seconds */
}
/* return integer result of number of seconds */
return (subflg + ((val*10L)/(FRAC_SEC)));
}

/* ----------- get_msec_time ------------ */
int get_msec_time(long val)
{
long tmp = NEW_TICKS;

if(val > tmp) val -= tmp; /* sub out 12 hrs */

/* return integer 0-9,999 for tenths of a fractional
millisecond. i.e., get the fraction of a second
remainder of val and scale it. */
return (int)((10000L*((10L*val)%FRAC_SEC))/FRAC_SEC);
}


/* ----------- atime_diff -------------- */
long atime_diff(unsigned long time1,
unsigned long time2)
{
if (time1 > time2)
return (time1-time2);
else
return (time2-time1);
}

/* ---------- print_time -------------- */
void print_time(unsigned long intim)
{
long tmp;
int sec,min,hr;
int tenms;

tenms = get_msec_time(intim);
tmp = get_sec_time(intim);
sec = (int)(tmp % 60);
tmp = (int)(tmp / 60);
min = (int)(tmp % 60);
hr = (int)(tmp / 60);
printf("%2d:%2.2d:%2.2d.%4.4d",hr, min,sec,tenms);
}


  3 Responses to “Category : Files from Magazines
Archive   : WDAPR92.ZIP
Filename : 3N04043A

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/