Author: hbelusca
Date: Mon Feb 17 22:50:41 2014
New Revision: 62236
URL:
http://svn.reactos.org/svn/reactos?rev=62236&view=rev
Log:
[NTVDM]: Load a BIOS image in case its name is given in BiosInitialize.
Modified:
branches/ntvdm/subsystems/ntvdm/bios/bios.c
Modified: branches/ntvdm/subsystems/ntvdm/bios/bios.c
URL:
http://svn.reactos.org/svn/reactos/branches/ntvdm/subsystems/ntvdm/bios/bio…
==============================================================================
--- branches/ntvdm/subsystems/ntvdm/bios/bios.c [iso-8859-1] (original)
+++ branches/ntvdm/subsystems/ntvdm/bios/bios.c [iso-8859-1] Mon Feb 17 22:50:41 2014
@@ -10,6 +10,7 @@
#define NDEBUG
+#include "emulator.h"
#include "bios.h"
/* PRIVATE VARIABLES **********************************************************/
@@ -24,8 +25,119 @@
IN HANDLE ConsoleInput,
IN HANDLE ConsoleOutput)
{
- Bios32Loaded = Bios32Initialize(ConsoleInput, ConsoleOutput);
- return Bios32Loaded;
+ if (BiosFileName)
+ {
+ BOOL Success;
+ HANDLE hBiosFile;
+ DWORD BiosSize;
+
+ /* Open the BIOS file */
+ SetLastError(0); // For debugging purposes
+ hBiosFile = CreateFileW(BiosFileName,
+ GENERIC_READ,
+ FILE_SHARE_READ,
+ NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+ DPRINT1("BIOS opening %s ; GetLastError() = %u\n", hBiosFile !=
INVALID_HANDLE_VALUE ? "succeeded" : "failed", GetLastError());
+
+ /* If we failed, bail out */
+ if (hBiosFile == INVALID_HANDLE_VALUE) return FALSE;
+
+ /* OK, we have a handle to the BIOS file */
+
+ /*
+ * Retrieve the size of the file. Since the size of the BIOS file
+ * should be at most 64kB, we just use GetFileSize.
+ */
+ BiosSize = GetFileSize(hBiosFile, NULL);
+ if (BiosSize == INVALID_FILE_SIZE && GetLastError() != ERROR_SUCCESS)
+ {
+ /* We failed, return failure */
+
+ /* Close the BIOS file */
+ CloseHandle(hBiosFile);
+
+ return FALSE;
+ }
+
+ DisplayMessage(L"First bytes at 0x%p: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x
0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n"
+ L"3 last bytes at 0x%p: 0x%02x 0x%02x 0x%02x",
+ (PVOID)((ULONG_PTR)TO_LINEAR(0xF000, 0xFFFF) + 1 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 1 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 2 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 3 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 4 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 5 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 6 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 7 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 8 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 9 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 0xa - BiosSize),
+
+ (PVOID)((ULONG_PTR)TO_LINEAR(0xF000, 0xFFFF) - 2),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) - 2),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) - 1),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) - 0));
+
+ /* Attempt to load the BIOS file into memory */
+ SetLastError(0); // For debugging purposes
+ Success = ReadFile(hBiosFile,
+ (PVOID)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 1 -
BiosSize),
+ /* (PVOID)((ULONG_PTR)BaseAddress + ROM_AREA_END + 1 -
BiosSize) */
+ BiosSize,
+ &BiosSize,
+ NULL);
+ DPRINT1("BIOS loading %s ; GetLastError() = %u\n", Success ?
"succeeded" : "failed", GetLastError());
+
+ /* Close the BIOS file */
+ CloseHandle(hBiosFile);
+
+ DisplayMessage(L"First bytes at 0x%p: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x
0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n"
+ L"3 last bytes at 0x%p: 0x%02x 0x%02x 0x%02x",
+ (PVOID)((ULONG_PTR)TO_LINEAR(0xF000, 0xFFFF) + 1 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 1 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 2 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 3 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 4 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 5 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 6 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 7 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 8 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 9 - BiosSize),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) + 0xa - BiosSize),
+
+ (PVOID)((ULONG_PTR)TO_LINEAR(0xF000, 0xFFFF) - 2),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) - 2),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) - 1),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(0xF000, 0xFFFF) - 0));
+
+ DisplayMessage(L"POST at 0x%p: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x",
+ TO_LINEAR(getCS(), getIP()),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(getCS(), getIP()) + 0),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(getCS(), getIP()) + 1),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(getCS(), getIP()) + 2),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(getCS(), getIP()) + 3),
+ *(PCHAR)((ULONG_PTR)SEG_OFF_TO_PTR(getCS(), getIP()) + 4));
+
+ /* Boot it up */
+
+ /*
+ * The CPU is already in reset-mode so that
+ * CS:IP points to F000:FFF0 as required.
+ */
+ DisplayMessage(L"CS=0x%p ; IP=0x%p", getCS(), getIP());
+ // setCS(0xF000);
+ // setIP(0xFFF0);
+
+ return TRUE;
+ }
+ else
+ {
+ Bios32Loaded = Bios32Initialize(ConsoleInput, ConsoleOutput);
+ return Bios32Loaded;
+ }
}
VOID BiosCleanup(VOID)