ReactOS 0.4.15-dev-7934-g1dc8d80
bios.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
4 * FILE: subsystems/mvdm/ntvdm/bios/bios.c
5 * PURPOSE: VDM BIOS Support Library
6 * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr)
7 */
8
9/* INCLUDES *******************************************************************/
10
11#include "ntvdm.h"
12
13#define NDEBUG
14#include <debug.h>
15
16#include "emulator.h"
17#include "cpu/callback.h"
18#include "cpu/bop.h"
19
20#include "bios.h"
21#include "bios32/bios32.h"
22#include "rom.h"
23#include "umamgr.h"
24
25#include "io.h"
26#include "hardware/cmos.h"
27
28#include <stdlib.h>
29
30/* DEFINES ********************************************************************/
31
32/* BOP Identifiers */
33#define BOP_RESET 0x00 // Windows NTVDM (SoftPC) BIOS calls BOP 0x00
34 // to let the virtual machine perform the POST.
35#define BOP_EQUIPLIST 0x11
36#define BOP_GETMEMSIZE 0x12
37
38/* PRIVATE VARIABLES **********************************************************/
39
41
44
45/* PRIVATE FUNCTIONS **********************************************************/
46
47/* PUBLIC FUNCTIONS ***********************************************************/
48
51{
52 DisplayMessage(L"You are loading Windows NTVDM BIOS!\n");
53 // Bios32Post(Stack);
54
55 DisplayMessage(L"ReactOS NTVDM doesn't support Windows NTVDM BIOS at the moment. The VDM will shut down.");
57}
58
61 IN LPCSTR RomFiles OPTIONAL)
62{
64 BOOLEAN Success2 = FALSE;
65 LPCSTR RomFile;
66 LPSTR ptr;
67 ULONG_PTR RomAddress;
68 CHAR RomFileName[MAX_PATH + 10 + 1];
69
70 /* Disable interrupts */
71 setIF(0);
72
73 /* Initialize the BDA and the BCT pointers */
75 // The BCT is found at F000:E6F5 for 100% compatible BIOSes.
77
78 /* Register the BIOS support BOPs */
79 RegisterBop(BOP_RESET, WinNtVdmBiosReset); // Needed for Windows NTVDM (SoftPC) BIOS.
80 RegisterBop(BOP_EQUIPLIST , BiosEquipmentService); // Needed by Windows NTVDM (SoftPC) BIOS
81 RegisterBop(BOP_GETMEMSIZE, BiosGetMemorySize); // and also NTDOS!!
82
83 if (BiosFileName == NULL)
84 {
86 }
87 else if (BiosFileName[0] != '\0')
88 {
89 PVOID BiosLocation = NULL;
90
91 Success = LoadBios(BiosFileName, &BiosLocation, NULL);
92 DPRINT1("BIOS file '%s' loading %s at address 0x%08x; GetLastError() = %u\n",
93 BiosFileName, Success ? "succeeded" : "failed", BiosLocation, GetLastError());
94 }
95 else // if (BiosFileName[0] == '\0')
96 {
97 /* Do nothing */
98 Success = TRUE;
99 }
100
101 /* Bail out now if we failed to load any BIOS file */
102 if (!Success) return FALSE;
103
104 /* Load optional ROMs */
105 if (RomFiles)
106 {
107 RomFile = RomFiles;
108 while (*RomFile)
109 {
110 strncpy(RomFileName, RomFile, ARRAYSIZE(RomFileName));
111 RomFileName[ARRAYSIZE(RomFileName)-1] = '\0';
112
113 ptr = strchr(RomFileName, '|'); // Since '|' is forbidden as a valid file name, we use it as a separator for the ROM address.
114 if (!ptr) goto Skip;
115 *ptr++ = '\0';
116
117 RomAddress = strtoul(ptr, NULL, 0); // ROM segment
118 RomAddress <<= 4; // Convert to real address
119 if (RomAddress == 0) goto Skip;
120
121 Success2 = LoadRom(RomFileName, (PVOID)RomAddress, NULL);
122 DPRINT1("ROM file '%s' loading %s at address 0x%08x; GetLastError() = %u\n",
123 RomFileName, Success2 ? "succeeded" : "failed", RomAddress, GetLastError());
124
125Skip:
126 RomFile += strlen(RomFile) + 1;
127 }
128 }
129
130 /*
131 * Boot it up.
132 * The CPU is already in reset-mode so that
133 * CS:IP points to F000:FFF0 as required.
134 */
135 // DisplayMessage(L"CS:IP=%04X:%04X", getCS(), getIP());
136 // setCS(0xF000);
137 // setIP(0xFFF0);
138
139 // /* Enable interrupts */
140 // setIF(1);
141
142 /* Initialize the Upper Memory Area Manager */
143 if (!UmaMgrInitialize())
144 {
145 wprintf(L"FATAL: Failed to initialize the UMA manager.\n");
146 return FALSE;
147 }
148
149 return Success;
150}
151
152VOID
154{
156
158}
159
160/* EOF */
unsigned char BOOLEAN
UINT32 strtoul(const char *String, char **Terminator, UINT32 Base)
Definition: utclib.c:696
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
char * strncpy(char *DstString, const char *SrcString, ACPI_SIZE Count)
Definition: utclib.c:427
char * strchr(const char *String, int ch)
Definition: utclib.c:501
#define DPRINT1
Definition: precomp.h:8
VOID Bios32Cleanup(VOID)
Definition: bios32.c:1289
BOOLEAN Bios32Initialize(VOID)
Definition: bios32.c:1246
#define BIOS_SEGMENT
Definition: bios.h:29
#define BDA_SEGMENT
Definition: bios.h:28
VOID WINAPI BiosEquipmentService(LPWORD Stack)
Definition: bios32.c:200
VOID WINAPI BiosGetMemorySize(LPWORD Stack)
Definition: bios32.c:206
struct BIOS_DATA_AREA * PBIOS_DATA_AREA
struct _BIOS_CONFIG_TABLE * PBIOS_CONFIG_TABLE
VOID RegisterBop(BYTE BopCode, EMULATOR_BOP_PROC BopHandler)
Definition: bop.c:29
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define MAX_PATH
Definition: compat.h:34
VOID EmulatorTerminate(VOID)
Definition: emulator.c:503
#define SEG_OFF_TO_PTR(seg, off)
Definition: emulator.h:32
@ Success
Definition: eventcreate.c:712
static PVOID ptr
Definition: dispmode.c:27
#define L(x)
Definition: ntvdm.h:50
void DisplayMessage(BOOL bConsole, BOOL bSilent, LPCTSTR lpMessage, LPCTSTR lpTitle, UINT uType)
Definition: regsvr32.c:239
BOOLEAN LoadBios(IN PCSTR BiosFileName, OUT PVOID *BiosLocation OPTIONAL, OUT PULONG BiosSize OPTIONAL)
Definition: rom.c:169
BOOLEAN LoadRom(IN PCSTR RomFileName, IN PVOID RomLocation, OUT PULONG RomSize OPTIONAL)
Definition: rom.c:214
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
VOID WINAPI WinNtVdmBiosReset(LPWORD Stack)
Definition: bios.c:50
static BOOLEAN Bios32Loaded
Definition: bios.c:40
#define BOP_GETMEMSIZE
Definition: bios.c:36
#define BOP_EQUIPLIST
Definition: bios.c:35
BOOLEAN BiosInitialize(IN LPCSTR BiosFileName, IN LPCSTR RomFiles OPTIONAL)
Definition: bios.c:60
#define BOP_RESET
Definition: bios.c:33
PBIOS_CONFIG_TABLE Bct
Definition: bios.c:43
VOID BiosCleanup(VOID)
Definition: bios.c:153
PBIOS_DATA_AREA Bda
Definition: bios.c:42
uint16_t * LPWORD
Definition: typedefs.h:56
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
BOOLEAN UmaMgrInitialize(VOID)
Definition: umamgr.c:375
VOID UmaMgrCleanup(VOID)
Definition: umamgr.c:616
VOID WINAPI setIF(ULONG)
Definition: registers.c:643
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:639
#define wprintf(...)
Definition: whoami.c:18
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define WINAPI
Definition: msvc.h:6
const char * LPCSTR
Definition: xmlstorage.h:183
char * LPSTR
Definition: xmlstorage.h:182
char CHAR
Definition: xmlstorage.h:175