ReactOS  0.4.14-dev-358-gbef841c
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 
59 BOOLEAN
60 BiosInitialize(IN LPCSTR BiosFileName,
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 
125 Skip:
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 
152 VOID
154 {
155  UmaMgrCleanup();
156 
158 }
159 
160 /* EOF */
VOID Bios32Cleanup(VOID)
Definition: bios32.c:1285
#define IN
Definition: typedefs.h:38
#define BOP_GETMEMSIZE
Definition: bios.c:36
UINT32 strtoul(const char *String, char **Terminator, UINT32 Base)
Definition: utclib.c:696
#define TRUE
Definition: types.h:120
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
VOID RegisterBop(BYTE BopCode, EMULATOR_BOP_PROC BopHandler)
Definition: bop.c:29
char * strncpy(char *DstString, const char *SrcString, ACPI_SIZE Count)
Definition: utclib.c:427
char CHAR
Definition: xmlstorage.h:175
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
PBIOS_DATA_AREA Bda
Definition: bios.c:42
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define wprintf(...)
Definition: whoami.c:18
char * LPSTR
Definition: xmlstorage.h:182
BOOLEAN Bios32Initialize(VOID)
Definition: bios32.c:1242
#define SEG_OFF_TO_PTR(seg, off)
Definition: emulator.h:28
BOOLEAN LoadBios(IN PCSTR BiosFileName, OUT PVOID *BiosLocation OPTIONAL, OUT PULONG BiosSize OPTIONAL)
Definition: rom.c:169
uint32_t ULONG_PTR
Definition: typedefs.h:63
PBIOS_CONFIG_TABLE Bct
Definition: bios.c:43
struct _BIOS_CONFIG_TABLE * PBIOS_CONFIG_TABLE
VOID UmaMgrCleanup(VOID)
Definition: umamgr.c:616
#define BOP_RESET
Definition: bios.c:33
static PVOID ptr
Definition: dispmode.c:27
BOOLEAN LoadRom(IN PCSTR RomFileName, IN PVOID RomLocation, OUT PULONG RomSize OPTIONAL)
Definition: rom.c:214
unsigned char BOOLEAN
static BOOLEAN Bios32Loaded
Definition: bios.c:40
smooth NULL
Definition: ftsmooth.c:416
const char * LPCSTR
Definition: xmlstorage.h:183
#define BOP_EQUIPLIST
Definition: bios.c:35
VOID BiosCleanup(VOID)
Definition: bios.c:153
BOOLEAN UmaMgrInitialize(VOID)
Definition: umamgr.c:375
#define MAX_PATH
Definition: compat.h:26
#define WINAPI
Definition: msvc.h:8
static const WCHAR L[]
Definition: oid.c:1250
#define BDA_SEGMENT
Definition: bios.h:28
VOID EmulatorTerminate(VOID)
Definition: emulator.c:503
uint16_t * LPWORD
Definition: typedefs.h:54
VOID WINAPI WinNtVdmBiosReset(LPWORD Stack)
Definition: bios.c:50
VOID WINAPI setIF(ULONG)
Definition: registers.c:643
char * strchr(const char *String, int ch)
Definition: utclib.c:501
#define DPRINT1
Definition: precomp.h:8
BOOLEAN BiosInitialize(IN LPCSTR BiosFileName, IN LPCSTR RomFiles OPTIONAL)
Definition: bios.c:60
struct BIOS_DATA_AREA * PBIOS_DATA_AREA
VOID WINAPI BiosEquipmentService(LPWORD Stack)
Definition: bios32.c:200
void DisplayMessage(BOOL bConsole, BOOL bSilent, LPCTSTR lpMessage, LPCTSTR lpTitle, UINT uType)
Definition: regsvr32.c:239
#define BIOS_SEGMENT
Definition: bios.h:29
VOID WINAPI BiosGetMemorySize(LPWORD Stack)
Definition: bios32.c:206
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68