mirror of
https://github.com/reactos/reactos.git
synced 2025-07-02 10:21:23 +00:00
[NTVDM]
Make the BIOS Data Area accessible to other parts of ntvdm. Properly redirect read/write access to the console to the keyboard and VGA systems, respectively. svn path=/branches/ntvdm/; revision=59741
This commit is contained in:
parent
a9fdfb3371
commit
08dc1d3e16
5 changed files with 40 additions and 9 deletions
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
/* PRIVATE VARIABLES **********************************************************/
|
/* PRIVATE VARIABLES **********************************************************/
|
||||||
|
|
||||||
static PBIOS_DATA_AREA Bda;
|
PBIOS_DATA_AREA Bda;
|
||||||
static BYTE BiosKeyboardMap[256];
|
static BYTE BiosKeyboardMap[256];
|
||||||
static HANDLE BiosConsoleInput = INVALID_HANDLE_VALUE;
|
static HANDLE BiosConsoleInput = INVALID_HANDLE_VALUE;
|
||||||
static HANDLE BiosConsoleOutput = INVALID_HANDLE_VALUE;
|
static HANDLE BiosConsoleOutput = INVALID_HANDLE_VALUE;
|
||||||
|
|
|
@ -99,6 +99,8 @@ typedef struct
|
||||||
|
|
||||||
/* FUNCTIONS ******************************************************************/
|
/* FUNCTIONS ******************************************************************/
|
||||||
|
|
||||||
|
extern PBIOS_DATA_AREA Bda;
|
||||||
|
|
||||||
BOOLEAN BiosInitialize(VOID);
|
BOOLEAN BiosInitialize(VOID);
|
||||||
VOID BiosCleanup(VOID);
|
VOID BiosCleanup(VOID);
|
||||||
BYTE BiosGetVideoMode(VOID);
|
BYTE BiosGetVideoMode(VOID);
|
||||||
|
@ -112,6 +114,7 @@ VOID BiosKeyboardService(LPWORD Stack);
|
||||||
VOID BiosTimeService(LPWORD Stack);
|
VOID BiosTimeService(LPWORD Stack);
|
||||||
VOID BiosHandleIrq(BYTE IrqNumber, LPWORD Stack);
|
VOID BiosHandleIrq(BYTE IrqNumber, LPWORD Stack);
|
||||||
VOID BiosSystemTimerInterrupt(LPWORD Stack);
|
VOID BiosSystemTimerInterrupt(LPWORD Stack);
|
||||||
|
VOID BiosPrintCharacter(CHAR Character, BYTE Attribute, BYTE Page);
|
||||||
BOOLEAN BiosScrollWindow(
|
BOOLEAN BiosScrollWindow(
|
||||||
INT Direction,
|
INT Direction,
|
||||||
DWORD Amount,
|
DWORD Amount,
|
||||||
|
|
|
@ -660,18 +660,31 @@ WORD DosReadFile(WORD FileHandle, LPVOID Buffer, WORD Count, LPWORD BytesRead)
|
||||||
WORD Result = ERROR_SUCCESS;
|
WORD Result = ERROR_SUCCESS;
|
||||||
DWORD BytesRead32 = 0;
|
DWORD BytesRead32 = 0;
|
||||||
HANDLE Handle = DosGetRealHandle(FileHandle);
|
HANDLE Handle = DosGetRealHandle(FileHandle);
|
||||||
|
WORD i;
|
||||||
|
|
||||||
DPRINT("DosReadFile: FileHandle 0x%04X, Count 0x%04X\n", FileHandle, Count);
|
DPRINT("DosReadFile: FileHandle 0x%04X, Count 0x%04X\n", FileHandle, Count);
|
||||||
|
|
||||||
/* Make sure the handle is valid */
|
/* Make sure the handle is valid */
|
||||||
if (Handle == INVALID_HANDLE_VALUE) return ERROR_INVALID_HANDLE;
|
if (Handle == INVALID_HANDLE_VALUE) return ERROR_INVALID_HANDLE;
|
||||||
|
|
||||||
|
if (IsConsoleHandle(Handle))
|
||||||
|
{
|
||||||
|
for (i = 0; i < Count; i++)
|
||||||
|
{
|
||||||
|
/* Call the BIOS function to read the character */
|
||||||
|
((LPBYTE)Buffer)[i] = LOBYTE(BiosGetCharacter());
|
||||||
|
BytesRead32++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
/* Read the file */
|
/* Read the file */
|
||||||
if (!ReadFile(Handle, Buffer, Count, &BytesRead32, NULL))
|
if (!ReadFile(Handle, Buffer, Count, &BytesRead32, NULL))
|
||||||
{
|
{
|
||||||
/* Store the error code */
|
/* Store the error code */
|
||||||
Result = (WORD)GetLastError();
|
Result = (WORD)GetLastError();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* The number of bytes read is always 16-bit */
|
/* The number of bytes read is always 16-bit */
|
||||||
*BytesRead = LOWORD(BytesRead32);
|
*BytesRead = LOWORD(BytesRead32);
|
||||||
|
@ -685,6 +698,7 @@ WORD DosWriteFile(WORD FileHandle, LPVOID Buffer, WORD Count, LPWORD BytesWritte
|
||||||
WORD Result = ERROR_SUCCESS;
|
WORD Result = ERROR_SUCCESS;
|
||||||
DWORD BytesWritten32 = 0;
|
DWORD BytesWritten32 = 0;
|
||||||
HANDLE Handle = DosGetRealHandle(FileHandle);
|
HANDLE Handle = DosGetRealHandle(FileHandle);
|
||||||
|
WORD i;
|
||||||
|
|
||||||
DPRINT("DosWriteFile: FileHandle 0x%04X, Count 0x%04X\n",
|
DPRINT("DosWriteFile: FileHandle 0x%04X, Count 0x%04X\n",
|
||||||
FileHandle,
|
FileHandle,
|
||||||
|
@ -693,12 +707,24 @@ WORD DosWriteFile(WORD FileHandle, LPVOID Buffer, WORD Count, LPWORD BytesWritte
|
||||||
/* Make sure the handle is valid */
|
/* Make sure the handle is valid */
|
||||||
if (Handle == INVALID_HANDLE_VALUE) return ERROR_INVALID_HANDLE;
|
if (Handle == INVALID_HANDLE_VALUE) return ERROR_INVALID_HANDLE;
|
||||||
|
|
||||||
|
if (IsConsoleHandle(Handle))
|
||||||
|
{
|
||||||
|
for (i = 0; i < Count; i++)
|
||||||
|
{
|
||||||
|
/* Call the BIOS to print the character */
|
||||||
|
BiosPrintCharacter(((LPBYTE)Buffer)[i], DOS_CHAR_ATTRIBUTE, Bda->VideoPage);
|
||||||
|
BytesWritten32++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
/* Write the file */
|
/* Write the file */
|
||||||
if (!WriteFile(Handle, Buffer, Count, &BytesWritten32, NULL))
|
if (!WriteFile(Handle, Buffer, Count, &BytesWritten32, NULL))
|
||||||
{
|
{
|
||||||
/* Store the error code */
|
/* Store the error code */
|
||||||
Result = (WORD)GetLastError();
|
Result = (WORD)GetLastError();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* The number of bytes written is always 16-bit */
|
/* The number of bytes written is always 16-bit */
|
||||||
*BytesWritten = LOWORD(BytesWritten32);
|
*BytesWritten = LOWORD(BytesWritten32);
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#define DOS_CMDLINE_LENGTH 127
|
#define DOS_CMDLINE_LENGTH 127
|
||||||
#define DOS_DIR_LENGTH 64
|
#define DOS_DIR_LENGTH 64
|
||||||
#define NUM_DRIVES ('Z' - 'A' + 1)
|
#define NUM_DRIVES ('Z' - 'A' + 1)
|
||||||
|
#define DOS_CHAR_ATTRIBUTE 0x07
|
||||||
|
|
||||||
enum DOS_ALLOC_STRATEGY
|
enum DOS_ALLOC_STRATEGY
|
||||||
{
|
{
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#define MAX_ADDRESS TO_LINEAR(MAX_SEGMENT, MAX_OFFSET)
|
#define MAX_ADDRESS TO_LINEAR(MAX_SEGMENT, MAX_OFFSET)
|
||||||
#define FAR_POINTER(x) ((ULONG_PTR)BaseAddress + TO_LINEAR(HIWORD(x), LOWORD(x)))
|
#define FAR_POINTER(x) ((ULONG_PTR)BaseAddress + TO_LINEAR(HIWORD(x), LOWORD(x)))
|
||||||
#define STEPS_PER_CYCLE 256
|
#define STEPS_PER_CYCLE 256
|
||||||
|
#define IsConsoleHandle(h) (((((ULONG_PTR)h) & 0x10000003) == 3) ? TRUE : FALSE)
|
||||||
|
|
||||||
/* FUNCTIONS ******************************************************************/
|
/* FUNCTIONS ******************************************************************/
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue