Author: hpoussin
Date: Thu Mar 4 07:32:13 2010
New Revision: 45823
URL:
http://svn.reactos.org/svn/reactos?rev=45823&view=rev
Log:
Revert part of r45817 to try to fix build
Modified:
trunk/reactos/boot/freeldr/freeldr/arch/i386/pcrtc.c
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/pcrtc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/pcrtc.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/pcrtc.c [iso-8859-1] Thu Mar 4 07:32:13
2010
@@ -19,25 +19,63 @@
#include <freeldr.h>
-BOOLEAN
-NTAPI
-HalQueryRealTimeClock(OUT PTIME_FIELDS Time);
+#define BCD_INT(bcd) (((bcd & 0xf0) >> 4) * 10 + (bcd &0x0f))
TIMEINFO*
PcGetTime(VOID)
{
static TIMEINFO TimeInfo;
- TIME_FIELDS Time;
+ REGS Regs;
- if (!HalQueryRealTimeClock(&Time))
- return NULL;
+ /* Some BIOSes, such as the 1998/07/25 system ROM
+ * in the Compaq Deskpro EP/SB, leave CF unchanged
+ * if successful, so CF should be cleared before
+ * calling this function. */
+ __writeeflags(__readeflags() & ~EFLAGS_CF);
- TimeInfo.Year = Time.Year;
- TimeInfo.Month = Time.Month;
- TimeInfo.Day = Time.Day;
- TimeInfo.Hour = Time.Hour;
- TimeInfo.Minute = Time.Minute;
- TimeInfo.Second = Time.Second;
+ /* Int 1Ah AH=04h
+ * TIME - GET REAL-TIME CLOCK DATE (AT,XT286,PS)
+ *
+ * AH = 04h
+ * CF clear to avoid bug
+ * Return:
+ * CF clear if successful
+ * CH = century (BCD)
+ * CL = year (BCD)
+ * DH = month (BCD)
+ * DL = day (BCD)
+ * CF set on error
+ */
+ Regs.b.ah = 0x04;
+ Int386(0x1A, &Regs, &Regs);
+
+ TimeInfo.Year = 100 * BCD_INT(Regs.b.ch) + BCD_INT(Regs.b.cl);
+ TimeInfo.Month = BCD_INT(Regs.b.dh);
+ TimeInfo.Day = BCD_INT(Regs.b.dl);
+
+ /* Some BIOSes leave CF unchanged if successful,
+ * so CF should be cleared before calling this function. */
+ __writeeflags(__readeflags() & ~EFLAGS_CF);
+
+ /* Int 1Ah AH=02h
+ * TIME - GET REAL-TIME CLOCK TIME (AT,XT286,PS)
+ *
+ * AH = 02h
+ * CF clear to avoid bug
+ * Return:
+ * CF clear if successful
+ * CH = hour (BCD)
+ * CL = minutes (BCD)
+ * DH = seconds (BCD)
+ * DL = daylight savings flag (00h standard time, 01h daylight time)
+ * CF set on error (i.e. clock not running or in middle of update)
+ */
+ Regs.b.ah = 0x02;
+ Int386(0x1A, &Regs, &Regs);
+
+ TimeInfo.Hour = BCD_INT(Regs.b.ch);
+ TimeInfo.Minute = BCD_INT(Regs.b.cl);
+ TimeInfo.Second = BCD_INT(Regs.b.dh);
return &TimeInfo;
}