[net.micro.atari16] set date and time

pm@cwruecmp.UUCP (07/19/86)

Here is a simple program to set date and time on the ST.  As you will see,
the reset button does NOT cause the keyboard timer to lose its time.  However,
TOS does; so you need to do Tsettime() and Tsetdate() after reset.

-------cut here-------cut here-------cut here-------cut here-------cut here--
/*
	td.c -- a simple program to set the time and date on Atari ST

	pm @ Case
*/

#include <osbind.h>

long	td;			/* time and date, in internal form */
char	tds[] = "00mm/dd/yy hh:mm:ss";	/* 00 are wasted space */
char	new[20];			/* input buffer, fmt as above */

twodigits(a, p)			/* the last two decimal digits of a	*/
register int	a;		/* are stuffed into p[0], p[1]		*/
register char *p;
{
	*p++ = (a%100)/10 + '0';
	*p++ = a%10 + '0';
}

timestr(t)
register int	t;
{
	register int	sec, min, hr;

	sec = (t & 0x001F) << 1; 
	min = (t >> 5)  & 0x003F;
	hr  = (t >> 11) & 0x001F;
	twodigits(hr,  &tds[11]); 
	twodigits(min, &tds[14]);
	twodigits(sec, &tds[17]);
}

datestr(d)
register int	d;
{
	register int day, mon, yr;

	day = (d & 0x001F);
	mon = (d >> 5) & 0x000F;
	yr  = ((d >> 9) & 0x01FF) + 1980;
	twodigits(mon, &tds[2]);
	twodigits(day, &tds[5]);
	twodigits(yr,  &tds[8]);
}

set(p, m, i)			/* Assign bit field <i:j> of td with a 	*/
register int	p;		/* computed value from new[p], new[p+1]	*/
register long	m;		/* if they are decimal digits.		*/
register int	i;		/* j == i - 1 + #1's in mask m		*/
{
	register int	a, b;
	register long	ll;

	a = new[p++];
	b = new[p];
	if (	(a == 0) || (b == 0)
	||	(a > '9')|| (a < '0')
	||	(b > '9')|| (b < '0')	) return;

	ll = (long) ((a - '0') *10 + b - '0');
	if (i == 0) ll >>= 1;	/* couple of kludges! for 2*sec and yr */
	if (i == 25) ll -= 80;
	ll = (ll << i) & m;
	td = (td & ~m) | ll;
}


main()
{
	register int	*p;

	p = (int *) &td;

	/* \033e (enable cursor) if this prg is invoked from desktop */
	Cconws("\033e\r\nikbd current date and time:  ");
	td =  Gettime();
	datestr(p[0]);
	timestr(p[1]);
	Cconws(&tds[2]);

	Cconws("\r\n\n\
to change the time and date, type in the new values in exactly\r\n\
the same format;  to leave it alone, just type return.\r\n\
\nmm/dd/yy hh:mm:ss\r\n");

	new[0] = (char) 18;
	Cconrs(new);
	Cconout('\n');

	/* set	hours; min; sec; mon; date; year; */
	set(2,  (long) (0x0000000F << 21), 21);	/* month */
	set(5,  (long) (0x0000001F << 16), 16);	/* day */
	set(8,  (long) (0x0000003F << 25), 25);	/* yr, 20th century */
	set(11, (long) (0x0000001F << 11), 11);	/* hr */
	set(14, (long) (0x0000003F << 5),  5);	/* min */
	set(17, (long) (0x0000001F),       0);	/* sec */

	Settime(td);		/* set ikbd clock */
	Tsettime(p[1]);
	Tsetdate(p[0]);
}

/* -eof- */

-- 

prabhaker mateti				decvax!cwruecmp!pm
department of computer engineering & science	pm@Case
case western reserve university			(pm%Case@csnet-relay)
cleveland, oh 44106				(216) 368-2816