[freeldr] Don't write twice the delay method and how to read the RTC. Use those in...
authorHervé Poussineau <hpoussin@reactos.org>
Wed, 3 Mar 2010 23:13:06 +0000 (23:13 +0000)
committerHervé Poussineau <hpoussin@reactos.org>
Wed, 3 Mar 2010 23:13:06 +0000 (23:13 +0000)
svn path=/trunk/; revision=45817

reactos/boot/freeldr/freeldr/arch/i386/pcrtc.c
reactos/boot/freeldr/freeldr/include/freeldr.h
reactos/hal/halx86/generic/bios.c

index 1141753..a03cc2a 100644 (file)
 
 #include <freeldr.h>
 
-#define BCD_INT(bcd) (((bcd & 0xf0) >> 4) * 10 + (bcd &0x0f))
+BOOLEAN
+NTAPI
+HalQueryRealTimeClock(OUT PTIME_FIELDS Time);
 
 TIMEINFO*
 PcGetTime(VOID)
 {
     static TIMEINFO TimeInfo;
-    REGS Regs;
+    TIME_FIELDS Time;
 
-    /* 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);
+    if (!HalQueryRealTimeClock(&Time))
+        return NULL;
 
-    /* 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);
+    TimeInfo.Year = Time.Year;
+    TimeInfo.Month = Time.Month;
+    TimeInfo.Day = Time.Day;
+    TimeInfo.Hour = Time.Hour;
+    TimeInfo.Minute = Time.Minute;
+    TimeInfo.Second = Time.Second;
 
     return &TimeInfo;
 }
index bc27f85..36ea346 100644 (file)
@@ -39,6 +39,7 @@
 #include <ndk/asm.h>
 #include <ndk/rtlfuncs.h>
 #include <ndk/ldrtypes.h>
+#include <ndk/halfuncs.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <ctype.h>
index 1942dd3..5bffb2d 100644 (file)
@@ -235,7 +235,6 @@ HalpTrap06()
     longjmp(HalpSavedContext, 1);
     UNREACHABLE;
 }
-#endif
 
 /* V8086 ENTER ****************************************************************/
 
@@ -278,6 +277,7 @@ HalpBiosCall()
     /* Exit to V86 mode */
     HalpExitToV86((PKTRAP_FRAME)&V86TrapFrame);
 }
+#endif
 
 /* FUNCTIONS ******************************************************************/
 
@@ -432,6 +432,7 @@ HalpRestoreIopm(VOID)
     while (i--) HalpSavedIoMap[HalpSavedIoMapData[i][0]] = HalpSavedIoMapData[i][1];
 }
 
+#ifndef _MINIHAL_
 VOID
 NTAPI
 HalpMapRealModeMemory(VOID)
@@ -499,7 +500,6 @@ HalpMapRealModeMemory(VOID)
     HalpFlushTLB();
 }
 
-#ifndef _MINIHAL_
 VOID
 NTAPI
 HalpSwitchToRealModeTrapHandlers(VOID)