Revert part of r45817 to try to fix build
[reactos.git] / reactos / boot / freeldr / freeldr / arch / i386 / pcrtc.c
index a03cc2a..1141753 100644 (file)
 
 #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;
 }