[HALPC98] Add Hardware Abstraction Layer for NEC PC-98 series (#3002)
[reactos.git] / hal / halx86 / pc98 / clock.c
1 /*
2 * PROJECT: NEC PC-98 series HAL
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: PIT rollover tables
5 * COPYRIGHT: Copyright 2020 Dmitry Borisov (di.sean@protonmail.com)
6 */
7
8 /* INCLUDES ******************************************************************/
9
10 #include <hal.h>
11
12 /* GLOBALS *******************************************************************/
13
14 #define LPT_STATUS 0x42
15 #define SYSTEM_CLOCK_8_MHZ 0x20
16
17 ULONG PIT_FREQUENCY;
18 HALP_ROLLOVER HalpRolloverTable[15];
19
20 /* Accuracy is 97.5% */
21 static const HALP_ROLLOVER RolloverTable1[15] =
22 {
23 {1996, 9996}, /* 1 ms */
24 {3993, 19997},
25 {5990, 29998},
26 {7987, 39999},
27 {9984, 50000},
28 {11980, 59996},
29 {13977, 69997},
30 {15974, 79998},
31 {17971, 89999},
32 {19968, 100000},
33 {21964, 109996},
34 {23961, 119997},
35 {25958, 129998},
36 {27955, 139999},
37 {29951, 149995} /* 15 ms */
38 };
39 static const HALP_ROLLOVER RolloverTable2[15] =
40 {
41 {2463, 10022}, /* 1 ms */
42 {4912, 19987},
43 {7376, 30013},
44 {9825, 39978},
45 {12288, 50000},
46 {14751, 60022},
47 {17200, 69987},
48 {19664, 80013},
49 {22113, 89978},
50 {24576, 100000},
51 {27039, 110022},
52 {29488, 119987},
53 {31952, 130013},
54 {34401, 139978},
55 {36864, 150000} /* 15 ms */
56 };
57
58 /* PRIVATE FUNCTIONS *********************************************************/
59
60 VOID
61 NTAPI
62 HalpInitializeClockPc98(VOID)
63 {
64 /* Obtain system clock value from the parallel port */
65 if (__inbyte(LPT_STATUS) & SYSTEM_CLOCK_8_MHZ)
66 {
67 PIT_FREQUENCY = TIMER_FREQUENCY_1;
68 RtlCopyMemory(HalpRolloverTable, RolloverTable1, sizeof(HALP_ROLLOVER) * 15);
69 }
70 else
71 {
72 PIT_FREQUENCY = TIMER_FREQUENCY_2;
73 RtlCopyMemory(HalpRolloverTable, RolloverTable2, sizeof(HALP_ROLLOVER) * 15);
74 }
75 }