2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
4 * FILE: subsystems/mvdm/ntvdm/hardware/cmos.h
5 * PURPOSE: CMOS Real Time Clock emulation
6 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
12 /* DEFINES ********************************************************************/
14 #define RTC_IRQ_NUMBER 8
15 #define CMOS_ADDRESS_PORT 0x70
16 #define CMOS_DATA_PORT 0x71
17 #define CMOS_DISABLE_NMI (1 << 7)
18 #define CMOS_BATTERY_OK 0x80
20 /* Status Register B flags */
21 #define CMOS_STB_DST (1 << 0)
22 #define CMOS_STB_24HOUR (1 << 1)
23 #define CMOS_STB_BINARY (1 << 2)
24 #define CMOS_STB_SQUARE_WAVE (1 << 3)
25 #define CMOS_STB_INT_ON_UPDATE (1 << 4)
26 #define CMOS_STB_INT_ON_ALARM (1 << 5)
27 #define CMOS_STB_INT_PERIODIC (1 << 6)
28 #define CMOS_STB_UPDATE_CYCLE (1 << 7)
30 /* Status Register C flags */
31 #define CMOS_STC_UF (1 << 4)
32 #define CMOS_STC_AF (1 << 5)
33 #define CMOS_STC_PF (1 << 6)
34 #define CMOS_STC_IRQF (1 << 7)
36 /* Default register values */
37 #define CMOS_DEFAULT_STA 0x26
38 #define CMOS_DEFAULT_STB CMOS_STB_24HOUR
40 // Bit 0: Floppy, Bit 1: FPU, Bit 2: Mouse, Bits 4-5: 80x25 Color Video, Bits 6-7: 2 floppy drives
41 #define CMOS_EQUIPMENT_LIST 0x6F
44 #define WRITE_CMOS_DATA(Cmos, Value) \
45 ((Cmos).StatusRegB & CMOS_STB_BINARY) ? (Value) : BCD_TO_BINARY(Value)
47 #define READ_CMOS_DATA(Cmos, Value) \
48 ((Cmos).StatusRegB & CMOS_STB_BINARY) ? (Value) : BINARY_TO_BCD(Value)
50 typedef enum _CMOS_REGISTERS
67 CMOS_REG_SHUTDOWN_STATUS
,
68 CMOS_REG_EQUIPMENT_LIST
= 0x14,
69 CMOS_REG_BASE_MEMORY_LOW
= 0x15,
70 CMOS_REG_BASE_MEMORY_HIGH
= 0x16,
71 CMOS_REG_EXT_MEMORY_LOW
= 0x17,
72 CMOS_REG_EXT_MEMORY_HIGH
= 0x18,
73 CMOS_REG_SYSOP
= 0x2D,
74 CMOS_REG_ACTUAL_EXT_MEMORY_LOW
= 0x30,
75 CMOS_REG_ACTUAL_EXT_MEMORY_HIGH
= 0x31,
76 CMOS_REG_CENTURY
= 0x32,
78 } CMOS_REGISTERS
, *PCMOS_REGISTERS
;
83 * See the following documentation for more information:
84 * http://www.intel-assembler.it/portale/5/cmos-memory-map-123/cmos-memory-map-123.asp
85 * http://wiki.osdev.org/CMOS
86 * http://www.walshcomptech.com/ohlandl/config/cmos_registers.html
87 * http://www.fysnet.net/cmosinfo.htm
88 * http://www.bioscentral.com/misc/cmosmap.htm
94 BYTE AlarmSecond
; // 0x01
96 BYTE AlarmMinute
; // 0x03
98 BYTE AlarmHour
; // 0x05
99 BYTE DayOfWeek
; // 0x06
104 BYTE StatusRegA
; // 0x0a
105 BYTE StatusRegB
; // 0x0b
106 } CMOS_CLOCK
, *PCMOS_CLOCK
;
114 CMOS_CLOCK
; // 0x00 - 0x0b
115 BYTE StatusRegC
; // 0x0c
116 BYTE StatusRegD
; // 0x0d
117 BYTE Diagnostics
; // 0x0e
118 BYTE ShutdownStatus
; // 0x0f
119 BYTE FloppyDrivesType
; // 0x10
120 BYTE Reserved0
; // 0x11
121 BYTE HardDrivesType
; // 0x12
122 BYTE Reserved1
; // 0x13
123 BYTE EquipmentList
; // 0x14
124 BYTE BaseMemoryLow
; // 0x15
125 BYTE BaseMemoryHigh
; // 0x16
126 BYTE ExtMemoryLow
; // 0x17
127 BYTE ExtMemoryHigh
; // 0x18
128 BYTE ExtHardDrivesType
[2]; // 0x19 - 0x1a
129 BYTE Reserved2
[0x15]; // 0x1b
130 BYTE ActualExtMemoryLow
; // 0x30
131 BYTE ActualExtMemoryHigh
; // 0x31
132 BYTE Century
; // 0x32
134 BYTE Regs1
[0x10]; // 0x00 - 0x0f
135 BYTE Regs
[0x40]; // 0x00 - 0x3f
139 * Extended information 0x40 - 0x7f
141 } CMOS_MEMORY
, *PCMOS_MEMORY
;
144 C_ASSERT(sizeof(CMOS_MEMORY
) == 0x40);
146 /* FUNCTIONS ******************************************************************/
148 BOOLEAN
IsNmiEnabled(VOID
);
149 DWORD
RtcGetTicksPerSecond(VOID
);
151 VOID
CmosInitialize(VOID
);
152 VOID
CmosCleanup(VOID
);