2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
4 * FILE: subsystems/mvdm/ntvdm/hardware/pit.h
5 * PURPOSE: Programmable Interval Timer emulation -
6 * i82C54/8254 compatible
7 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
8 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
14 /* DEFINES ********************************************************************/
16 #define PIT_CHANNELS 3
17 #define PIT_BASE_FREQUENCY 1193182LL
18 #define PIT_DATA_PORT(x) (0x40 + (x))
19 #define PIT_COMMAND_PORT 0x43
21 #define WRITE_PIT_VALUE(PitChannel, Value) \
22 (PitChannel).Bcd ? BCD_TO_BINARY(Value) : (Value)
24 #define READ_PIT_VALUE(PitChannel, Value) \
25 (PitChannel).Bcd ? BINARY_TO_BCD(Value) : (Value)
27 typedef enum _PIT_MODE
29 PIT_MODE_INT_ON_TERMINAL_COUNT
,
30 PIT_MODE_HARDWARE_ONE_SHOT
,
31 PIT_MODE_RATE_GENERATOR
,
33 PIT_MODE_SOFTWARE_STROBE
,
34 PIT_MODE_HARDWARE_STROBE
35 } PIT_MODE
, *PPIT_MODE
;
37 typedef VOID (WINAPI
*PIT_OUT_FUNCTION
)(LPVOID Param
, BOOLEAN State
);
39 typedef struct _PIT_CHANNEL
41 /* PIT Status fields */
44 BYTE ReadWriteMode
; // 0 --> Counter Latch ; 1 --> LSB R/W ; 2 --> MSB R/W ; 3 --> LSB then MSB R/W
46 /* For interleaved reading and writing in 2-byte RW mode */
47 BYTE ReadStatus
; // Same convention as ReadWriteMode
48 BYTE WriteStatus
; // Same convention as ReadWriteMode
50 /* For reading the PIT status byte */
51 BOOLEAN LatchStatusSet
;
57 /**/WORD CountRegister
;/**/ // Our ReloadValue ???
59 /*******************************/
61 WORD ReloadValue
; // Max value of the counter
62 WORD CurrentValue
; // Real value of the counter
65 BOOLEAN Out
; // 0: Low ; 1: High
66 /** HACK!! **/BOOLEAN FlipFlop
;/** HACK!! **/
68 PIT_OUT_FUNCTION OutFunction
;
70 } PIT_CHANNEL
, *PPIT_CHANNEL
;
72 /* FUNCTIONS ******************************************************************/
74 VOID
PitSetOutFunction(BYTE Channel
, LPVOID Param
, PIT_OUT_FUNCTION OutFunction
);
75 VOID
PitSetGate(BYTE Channel
, BOOLEAN State
);
76 WORD
PitGetReloadValue(BYTE Channel
);
78 VOID
PitInitialize(VOID
);