[FREELDR] Separate PC beep routines out into its own file (#2347)
[reactos.git] / boot / freeldr / freeldr / arch / i386 / pc / pcbeep.c
1 /*
2 * PROJECT: FreeLoader
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Hardware-specific beep routine
5 * COPYRIGHT: Copyright 1998-2003 Brian Palmer (brianp@reactos.org)
6 */
7
8 #include <freeldr.h>
9
10 #if defined(SARCH_XBOX)
11 #define CLOCK_TICK_RATE 1125000
12 #else
13 #define CLOCK_TICK_RATE 1193182
14 #endif
15
16 static VOID
17 Sound(USHORT Frequency)
18 {
19 USHORT Scale;
20
21 if (Frequency == 0)
22 {
23 WRITE_PORT_UCHAR((PUCHAR)0x61, READ_PORT_UCHAR((PUCHAR)0x61) & ~3);
24 return;
25 }
26
27 Scale = CLOCK_TICK_RATE / Frequency;
28 WRITE_PORT_UCHAR((PUCHAR)0x43, 0xB6);
29 WRITE_PORT_UCHAR((PUCHAR)0x42, Scale & 0xFF);
30 WRITE_PORT_UCHAR((PUCHAR)0x42, Scale >> 8);
31 WRITE_PORT_UCHAR((PUCHAR)0x61, READ_PORT_UCHAR((PUCHAR)0x61) | 3);
32 }
33
34 VOID PcBeep(VOID)
35 {
36 Sound(700);
37 StallExecutionProcessor(100000);
38 Sound(0);
39 }