2 * PROJECT: ReactOS Boot Loader
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: boot/armllb/hw/time.c
5 * PURPOSE: LLB Time Routines
6 * PROGRAMMERS: ReactOS Portable Systems Group
11 #define LEAPS_THRU_END_OF(y) ((y)/4 - (y)/100 + (y)/400)
13 UCHAR LlbDaysInMonth
[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
18 extern TIMEINFO LlbTime
;
23 LlbIsLeapYear(IN ULONG Year
)
25 /* Every 4, 100, or 400 years */
26 return (!(Year
% 4) && (Year
% 100)) || !(Year
% 400);
31 LlbDayOfMonth(IN ULONG Month
,
34 /* Check how many days a month has, accounting for leap yearS */
35 return LlbDaysInMonth
[Month
] + (LlbIsLeapYear(Year
) && Month
== 1);
40 LlbConvertRtcTime(IN ULONG RtcTime
,
41 OUT TIMEINFO
* TimeInfo
)
43 ULONG Month
, Year
, Days
, DaysLeft
;
45 /* Count the days, keep the minutes */
46 Days
= RtcTime
/ 86400;
47 RtcTime
-= Days
* 86400;
49 /* Get the year, based on days since 1970 */
50 Year
= 1970 + Days
/ 365;
52 /* Account for leap years which changed the number of days/year */
53 Days
-= (Year
- 1970) * 365 + LEAPS_THRU_END_OF(Year
- 1) - LEAPS_THRU_END_OF(1970 - 1);
56 /* We hit a leap year, so fixup the math */
58 Days
+= 365 + LlbIsLeapYear(Year
);
62 for (Month
= 0; Month
< 11; Month
++)
64 /* How many days in this month? */
65 DaysLeft
= Days
- LlbDayOfMonth(Month
, Year
);
66 if (DaysLeft
< 0) break;
68 /* How many days left total? */
72 /* Write the structure */
73 TimeInfo
->Year
= Year
;
74 TimeInfo
->Day
= Days
+ 1;
75 TimeInfo
->Month
= Month
+ 1;
76 TimeInfo
->Hour
= RtcTime
/ 3600;
77 RtcTime
-= TimeInfo
->Hour
* 3600;
78 TimeInfo
->Minute
= RtcTime
/ 60;
79 TimeInfo
->Second
= RtcTime
- TimeInfo
->Minute
* 60;
89 RtcTime
= LlbHwRtcRead();
92 LlbConvertRtcTime(RtcTime
, &LlbTime
);