diff --git a/subsystems/ntvdm/bios/bios32/kbdbios32.c b/subsystems/ntvdm/bios/bios32/kbdbios32.c index 4f551618750..1ba2b374057 100644 --- a/subsystems/ntvdm/bios/bios32/kbdbios32.c +++ b/subsystems/ntvdm/bios/bios32/kbdbios32.c @@ -81,7 +81,7 @@ static BOOLEAN BiosKbdBufferPop(VOID) return TRUE; } -WORD BiosPeekCharacter(VOID) +static WORD BiosPeekCharacter(VOID) { WORD CharacterData = 0; diff --git a/subsystems/ntvdm/bios/bios32/kbdbios32.h b/subsystems/ntvdm/bios/bios32/kbdbios32.h index 46590d84635..8e9fdfde3a9 100644 --- a/subsystems/ntvdm/bios/bios32/kbdbios32.h +++ b/subsystems/ntvdm/bios/bios32/kbdbios32.h @@ -38,7 +38,6 @@ /* FUNCTIONS ******************************************************************/ -WORD BiosPeekCharacter(VOID); WORD BiosGetCharacter(VOID); BOOLEAN KbdBios32Initialize(HANDLE ConsoleInput); diff --git a/subsystems/ntvdm/bios/bios32/vidbios32.c b/subsystems/ntvdm/bios/bios32/vidbios32.c index e84814507f1..acb1480078c 100644 --- a/subsystems/ntvdm/bios/bios32/vidbios32.c +++ b/subsystems/ntvdm/bios/bios32/vidbios32.c @@ -1045,7 +1045,7 @@ static BOOLEAN VidBiosSetVideoPage(BYTE PageNumber) return TRUE; } -VOID VidBiosPrintCharacter(CHAR Character, BYTE Attribute, BYTE Page) +static VOID VidBiosPrintCharacter(CHAR Character, BYTE Attribute, BYTE Page) { WORD CharData = MAKEWORD(Character, Attribute); BYTE Row, Column; diff --git a/subsystems/ntvdm/bios/bios32/vidbios32.h b/subsystems/ntvdm/bios/bios32/vidbios32.h index 23fee947557..3610133bf30 100644 --- a/subsystems/ntvdm/bios/bios32/vidbios32.h +++ b/subsystems/ntvdm/bios/bios32/vidbios32.h @@ -36,8 +36,6 @@ enum /* FUNCTIONS ******************************************************************/ -VOID VidBiosPrintCharacter(CHAR Character, BYTE Attribute, BYTE Page); - BOOLEAN VidBios32Initialize(HANDLE BiosConsoleOutput); VOID VidBios32Cleanup(VOID); diff --git a/subsystems/ntvdm/dos/dos32krnl/bios.c b/subsystems/ntvdm/dos/dos32krnl/bios.c index d3cc39257e5..b7ce9d313e5 100644 --- a/subsystems/ntvdm/dos/dos32krnl/bios.c +++ b/subsystems/ntvdm/dos/dos32krnl/bios.c @@ -93,8 +93,18 @@ BOOLEAN DosCheckInput(VOID) if (IsConsoleHandle(Handle)) { + /* Save AX */ + USHORT AX = getAX(); + /* Call the BIOS */ - return (BiosPeekCharacter() != 0xFFFF); + setAH(0x01); // or 0x11 for enhanced, but what to choose? + Int32Call(&DosContext, BIOS_KBD_INTERRUPT); + + /* Restore AX */ + setAX(AX); + + /* Return keyboard status */ + return (getZF() == 0); } else { diff --git a/subsystems/ntvdm/dos/dos32krnl/dos.c b/subsystems/ntvdm/dos/dos32krnl/dos.c index c86594db4e3..a9d10a012da 100644 --- a/subsystems/ntvdm/dos/dos32krnl/dos.c +++ b/subsystems/ntvdm/dos/dos32krnl/dos.c @@ -809,8 +809,23 @@ WORD DosWriteFile(WORD FileHandle, LPVOID Buffer, WORD Count, LPWORD BytesWritte { for (i = 0; i < Count; i++) { - /* Call the BIOS to print the character */ - VidBiosPrintCharacter(((LPBYTE)Buffer)[i], DOS_CHAR_ATTRIBUTE, Bda->VideoPage); + /* Save AX and BX */ + USHORT AX = getAX(); + USHORT BX = getBX(); + + /* Set the parameters */ + setAL(((PCHAR)Buffer)[i]); + setBL(DOS_CHAR_ATTRIBUTE); + setBH(Bda->VideoPage); + + /* Call the BIOS INT 10h, AH=0Eh "Teletype Output" */ + setAH(0x0E); + Int32Call(&DosContext, BIOS_VIDEO_INTERRUPT); + + /* Restore AX and BX */ + setBX(BX); + setAX(AX); + BytesWritten32++; } } @@ -2513,14 +2528,17 @@ VOID WINAPI DosFastConOut(LPWORD Stack) USHORT AX = getAX(); USHORT BX = getBX(); + /* Set the parameters (AL = character, already set) */ setBL(DOS_CHAR_ATTRIBUTE); setBH(Bda->VideoPage); + + /* Call the BIOS INT 10h, AH=0Eh "Teletype Output" */ setAH(0x0E); - Int32Call(&DosContext, 0x10); + Int32Call(&DosContext, BIOS_VIDEO_INTERRUPT); /* Restore AX and BX */ - setAX(AX); setBX(BX); + setAX(AX); #endif }