clock.c revision 1.3
1/*	$NetBSD: clock.c,v 1.3 1998/08/01 11:22:52 scw Exp $ */
2
3#include <sys/types.h>
4#include <machine/prom.h>
5
6#include "stand.h"
7#include "libsa.h"
8
9/*
10 * BCD to decimal and decimal to BCD.
11 */
12#define FROMBCD(x)      (int)((((unsigned int)(x)) >> 4) * 10 +\
13				(((unsigned int)(x)) & 0xf))
14#define TOBCD(x)        (int)((((unsigned int)(x)) / 10 * 16) +\
15				(((unsigned int)(x)) % 10))
16
17#define SECDAY          (24 * 60 * 60)
18#define SECYR           (SECDAY * 365)
19#define LEAPYEAR(y)     (((y) & 3) == 0)
20#define YEAR0		68
21
22
23/*
24 * This code is defunct after 2068.
25 * Will Unix still be here then??
26 */
27const short dayyr[12] =
28{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
29
30static  u_long
31chiptotime(sec, min, hour, day, mon, year)
32	int sec, min, hour, day, mon, year;
33{
34	int days, yr;
35
36	sec = FROMBCD(sec);
37	min = FROMBCD(min);
38	hour = FROMBCD(hour);
39	day = FROMBCD(day);
40	mon = FROMBCD(mon);
41	year = FROMBCD(year) + YEAR0;
42	if (year < 70)
43		year = 70;
44
45	/* simple sanity checks */
46	if (year < 70 || mon < 1 || mon > 12 || day < 1 || day > 31)
47		return (0);
48	days = 0;
49	for (yr = 70; yr < year; yr++)
50		days += LEAPYEAR(yr) ? 366 : 365;
51	days += dayyr[mon - 1] + day - 1;
52	if (LEAPYEAR(yr) && mon > 2)
53		days++;
54	/* now have days since Jan 1, 1970; the rest is easy... */
55	return (days * SECDAY + hour * 3600 + min * 60 + sec);
56}
57
58time_t
59getsecs()
60{
61	struct mvmeprom_time m;
62
63	mvmeprom_rtc_rd(&m);
64	return (chiptotime(m.sec_BCD, m.min_BCD, m.hour_BCD, m.day_BCD,
65			m.month_BCD, m.year_BCD));
66}
67