ReactOS  0.4.14-dev-358-gbef841c
i386rtl.c
Go to the documentation of this file.
1 /*
2  * FreeLoader
3  * Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 #include <freeldr.h>
21 
22 void sound(int freq);
23 void delay(unsigned msec);
24 
26 {
27  sound(700);
28  delay(200);
29  sound(0);
30 }
31 
32 void delay(unsigned msec)
33 {
34  REGS Regs;
35  unsigned usec;
36  unsigned msec_this;
37 
38  // Int 15h AH=86h
39  // BIOS - WAIT (AT,PS)
40  //
41  // AH = 86h
42  // CX:DX = interval in microseconds
43  // Return:
44  // CF clear if successful (wait interval elapsed)
45  // CF set on error or AH=83h wait already in progress
46  // AH = status (see #00496)
47 
48  // Note: The resolution of the wait period is 977 microseconds on
49  // many systems because many BIOSes use the 1/1024 second fast
50  // interrupt from the AT real-time clock chip which is available on INT 70;
51  // because newer BIOSes may have much more precise timers available, it is
52  // not possible to use this function accurately for very short delays unless
53  // the precise behavior of the BIOS is known (or found through testing)
54 
55  while (msec)
56  {
57  msec_this = msec;
58 
59  if (msec_this > 4000)
60  {
61  msec_this = 4000;
62  }
63 
64  usec = msec_this * 1000;
65 
66  Regs.b.ah = 0x86;
67  Regs.w.cx = usec >> 16;
68  Regs.w.dx = usec & 0xffff;
69  Int386(0x15, &Regs, &Regs);
70 
71  msec -= msec_this;
72  }
73 }
74 
75 void sound(int freq)
76 {
77  int scale;
78 
79  if (freq == 0)
80  {
81  WRITE_PORT_UCHAR((PUCHAR)0x61, READ_PORT_UCHAR((PUCHAR)0x61) & ~3);
82  return;
83  }
84 
85  scale = 1193046 / freq;
86  WRITE_PORT_UCHAR((PUCHAR)0x43, 0xb6);
87  WRITE_PORT_UCHAR((PUCHAR)0x42, scale & 0xff);
88  WRITE_PORT_UCHAR((PUCHAR)0x42, scale >> 8);
89  WRITE_PORT_UCHAR((PUCHAR)0x61, READ_PORT_UCHAR((PUCHAR)0x61) | 3);
90 }
91 
93  IN UCHAR BootDrive OPTIONAL,
94  IN ULONG BootPartition OPTIONAL)
95 {
96  REGS Regs;
97 
98  RtlZeroMemory(&Regs, sizeof(Regs));
99 
100  /* Set the boot drive and the boot partition */
101  Regs.b.dl = (UCHAR)(BootDrive ? BootDrive : FrldrBootDrive);
102  Regs.b.dh = (UCHAR)(BootPartition ? BootPartition : FrldrBootPartition);
103 
104  /*
105  * Don't stop the floppy drive motor when we are just booting a bootsector,
106  * a drive, or a partition. If we were to stop the floppy motor, the BIOS
107  * wouldn't be informed and if the next read is to a floppy then the BIOS
108  * will still think the motor is on and this will result in a read error.
109  */
110  // DiskStopFloppyMotor();
111 
112  Relocator16Boot(&Regs,
113  /* Stack segment:pointer */
114  0x0000, 0x7C00,
115  /* Code segment:pointer */
116  0x0000, 0x7C00);
117 }
ULONG FrldrBootPartition
#define IN
Definition: typedefs.h:38
unsigned short dx
Definition: pcbios.h:102
#define __cdecl
Definition: accygwin.h:79
void sound(int freq)
Definition: i386rtl.c:75
unsigned char * PUCHAR
Definition: retypes.h:3
GLenum GLenum GLenum GLenum GLenum scale
Definition: glext.h:9032
UCHAR NTAPI READ_PORT_UCHAR(PUCHAR Address)
Definition: mach.c:528
unsigned short cx
Definition: pcbios.h:101
unsigned char ah
Definition: pcbios.h:120
unsigned char dh
Definition: pcbios.h:129
int __cdecl Int386(int ivec, REGS *in, REGS *out)
unsigned char dl
Definition: pcbios.h:128
VOID __cdecl ChainLoadBiosBootSectorCode(IN UCHAR BootDrive OPTIONAL, IN ULONG BootPartition OPTIONAL)
Definition: i386rtl.c:92
UCHAR FrldrBootDrive
unsigned char UCHAR
Definition: xmlstorage.h:181
void delay(unsigned msec)
Definition: i386rtl.c:32
BYTEREGS b
Definition: pcbios.h:151
VOID PcBeep(VOID)
Definition: i386rtl.c:25
VOID __cdecl Relocator16Boot(IN REGS *In, IN USHORT StackSegment, IN USHORT StackPointer, IN USHORT CodeSegment, IN USHORT CodePointer)
unsigned int ULONG
Definition: retypes.h:1
Definition: pcbios.h:146
void WRITE_PORT_UCHAR(PUCHAR Address, UCHAR Value)
Definition: mach.c:532
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
WORDREGS w
Definition: pcbios.h:150
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68