ReactOS 0.4.16-dev-2208-g6350669
pcrtc.c File Reference
#include <freeldr.h>
Include dependency graph for pcrtc.c:

Go to the source code of this file.

Functions

static UCHAR BCD_INT (_In_ UCHAR Bcd)
 
TIMEINFOPcGetTime (VOID)
 

Function Documentation

◆ BCD_INT()

static UCHAR BCD_INT ( _In_ UCHAR  Bcd)
static

Definition at line 23 of file pcrtc.c.

25{
26 return ((Bcd & 0xF0) >> 4) * 10 + (Bcd & 0x0F);
27}

Referenced by PcGetTime().

◆ PcGetTime()

TIMEINFO * PcGetTime ( VOID  )

Definition at line 30 of file pcrtc.c.

31{
32 static TIMEINFO TimeInfo;
33 REGS Regs;
34
35 for (;;)
36 {
37 /* Some BIOSes, such as the 1998/07/25 system ROM
38 * in the Compaq Deskpro EP/SB, leave CF unchanged
39 * if successful, so CF should be cleared before
40 * calling this function. */
41 Regs.x.eflags = 0;
42// __writeeflags(__readeflags() & ~EFLAGS_CF);
43
44 /* Int 1Ah AH=04h
45 * TIME - GET REAL-TIME CLOCK DATE (AT,XT286,PS)
46 *
47 * AH = 04h
48 * CF clear to avoid bug
49 * Return:
50 * CF clear if successful
51 * CH = century (BCD)
52 * CL = year (BCD)
53 * DH = month (BCD)
54 * DL = day (BCD)
55 * CF set on error
56 */
57 Regs.b.ah = 0x04;
58 Int386(0x1A, &Regs, &Regs);
59
60 if (!INT386_SUCCESS(Regs)) continue;
61
62 TimeInfo.Year = 100 * BCD_INT(Regs.b.ch) + BCD_INT(Regs.b.cl);
63 TimeInfo.Month = BCD_INT(Regs.b.dh);
64 TimeInfo.Day = BCD_INT(Regs.b.dl);
65
66 /* Some BIOSes leave CF unchanged if successful,
67 * so CF should be cleared before calling this function. */
68 Regs.x.eflags = 0;
69// __writeeflags(__readeflags() & ~EFLAGS_CF);
70
71 /* Int 1Ah AH=02h
72 * TIME - GET REAL-TIME CLOCK TIME (AT,XT286,PS)
73 *
74 * AH = 02h
75 * CF clear to avoid bug
76 * Return:
77 * CF clear if successful
78 * CH = hour (BCD)
79 * CL = minutes (BCD)
80 * DH = seconds (BCD)
81 * DL = daylight savings flag (00h standard time, 01h daylight time)
82 * CF set on error (i.e. clock not running or in middle of update)
83 */
84 Regs.b.ah = 0x02;
85 Int386(0x1A, &Regs, &Regs);
86
87 if (!INT386_SUCCESS(Regs)) continue;
88
89 TimeInfo.Hour = BCD_INT(Regs.b.ch);
90 TimeInfo.Minute = BCD_INT(Regs.b.cl);
91 TimeInfo.Second = BCD_INT(Regs.b.dh);
92
93 break;
94 }
95 return &TimeInfo;
96}
#define INT386_SUCCESS(regs)
Definition: pcbios.h:181
int __cdecl Int386(int ivec, REGS *in, REGS *out)
static UCHAR BCD_INT(_In_ UCHAR Bcd)
Definition: pcrtc.c:23
unsigned char ch
Definition: pcbios.h:140
unsigned char dl
Definition: pcbios.h:142
unsigned char cl
Definition: pcbios.h:139
unsigned char ah
Definition: pcbios.h:134
unsigned char dh
Definition: pcbios.h:143
unsigned long eflags
Definition: pcbios.h:107
Definition: fw.h:10
USHORT Month
Definition: fw.h:12
USHORT Day
Definition: fw.h:13
USHORT Minute
Definition: fw.h:15
USHORT Hour
Definition: fw.h:14
USHORT Second
Definition: fw.h:16
USHORT Year
Definition: fw.h:11
Definition: pcbios.h:161
DWORDREGS x
Definition: pcbios.h:162
BYTEREGS b
Definition: pcbios.h:165

Referenced by MachInit().