reactos/boot/armllb/hw/time.c
Timo Kreuzer 9ea495ba33 Create a branch for header work.
svn path=/branches/header-work/; revision=45691
2010-02-26 22:57:55 +00:00

92 lines
2.1 KiB
C
Executable file

/*
* PROJECT: ReactOS Boot Loader
* LICENSE: BSD - See COPYING.ARM in the top level directory
* FILE: boot/armllb/hw/time.c
* PURPOSE: LLB Time Routines
* PROGRAMMERS: ReactOS Portable Systems Group
*/
#include "precomp.h"
#define LEAPS_THRU_END_OF(y) ((y)/4 - (y)/100 + (y)/400)
UCHAR LlbDaysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
TIMEINFO LlbTime;
BOOLEAN
NTAPI
LlbIsLeapYear(IN ULONG Year)
{
/* Every 4, 100, or 400 years */
return (!(Year % 4) && (Year % 100)) || !(Year % 400);
}
ULONG
NTAPI
LlbDayOfMonth(IN ULONG Month,
IN ULONG Year)
{
/* Check how many days a month has, accounting for leap yearS */
return LlbDaysInMonth[Month] + (LlbIsLeapYear(Year) && Month == 1);
}
VOID
NTAPI
LlbConvertRtcTime(IN ULONG RtcTime,
OUT TIMEINFO* TimeInfo)
{
ULONG Month, Year, Days, DaysLeft;
/* Count the days, keep the minutes */
Days = RtcTime / 86400;
RtcTime -= Days * 86400;
/* Get the year, based on days since 1970 */
Year = 1970 + Days / 365;
/* Account for leap years which changed the number of days/year */
Days -= (Year - 1970) * 365 + LEAPS_THRU_END_OF(Year - 1) - LEAPS_THRU_END_OF(1970 - 1);
if (Days < 0)
{
/* We hit a leap year, so fixup the math */
Year--;
Days += 365 + LlbIsLeapYear(Year);
}
/* Count months */
for (Month = 0; Month < 11; Month++)
{
/* How many days in this month? */
DaysLeft = Days - LlbDayOfMonth(Month, Year);
if (DaysLeft < 0) break;
/* How many days left total? */
Days = DaysLeft;
}
/* Write the structure */
TimeInfo->Year = Year;
TimeInfo->Day = Days + 1;
TimeInfo->Month = Month + 1;
TimeInfo->Hour = RtcTime / 3600;
RtcTime -= TimeInfo->Hour * 3600;
TimeInfo->Minute = RtcTime / 60;
TimeInfo->Second = RtcTime - TimeInfo->Minute * 60;
}
TIMEINFO*
NTAPI
LlbGetTime(VOID)
{
ULONG RtcTime;
/* Read RTC time */
RtcTime = LlbHwRtcRead();
/* Convert it */
LlbConvertRtcTime(RtcTime, &LlbTime);
return &LlbTime;
}
/* EOF */