From dea92c0361bbab9772ce9147d948e78d4c765e1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Wed, 14 May 2014 18:50:29 +0000 Subject: [PATCH] [NTVDM]: Introduce a echo state for INT 21h, AH=01h and AH=3Fh. svn path=/trunk/; revision=63297 --- reactos/subsystems/ntvdm/dos/dos32krnl/dos.c | 20 ++++++++++++++----- reactos/subsystems/ntvdm/dos/dos32krnl/dos.h | 2 ++ .../subsystems/ntvdm/dos/dos32krnl/dosfiles.c | 5 ++--- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/reactos/subsystems/ntvdm/dos/dos32krnl/dos.c b/reactos/subsystems/ntvdm/dos/dos32krnl/dos.c index 8a03448bfc2..bfdef07dc1c 100644 --- a/reactos/subsystems/ntvdm/dos/dos32krnl/dos.c +++ b/reactos/subsystems/ntvdm/dos/dos32krnl/dos.c @@ -40,6 +40,9 @@ static BYTE DosAllocStrategy = DOS_ALLOC_BEST_FIT; static BOOLEAN DosUmbLinked = FALSE; static WORD DosErrorLevel = 0x0000; +/* Echo state for INT 21h, AH = 01h and AH = 3Fh */ +BOOLEAN DoEcho = FALSE; + /* PRIVATE FUNCTIONS **********************************************************/ /* @@ -1434,8 +1437,9 @@ VOID WINAPI DosInt21h(LPWORD Stack) case 0x01: { // FIXME: Under DOS 2+, input / output handle may be redirected!!!! + DoEcho = TRUE; Character = DosReadCharacter(DOS_INPUT_HANDLE); - DosPrintCharacter(DOS_OUTPUT_HANDLE, Character); + DoEcho = FALSE; // /* Let the BOP repeat if needed */ // if (getCF()) break; @@ -1576,6 +1580,8 @@ VOID WINAPI DosInt21h(LPWORD Stack) while (Count < InputBuffer->MaxLength) { + // FIXME!! This function should interpret backspaces etc... + /* Try to read a character (wait) */ Character = DosReadCharacter(DOS_INPUT_HANDLE); @@ -2051,10 +2057,14 @@ VOID WINAPI DosInt21h(LPWORD Stack) case 0x3F: { WORD BytesRead = 0; - WORD ErrorCode = DosReadFile(getBX(), - SEG_OFF_TO_PTR(getDS(), getDX()), - getCX(), - &BytesRead); + WORD ErrorCode; + + DoEcho = TRUE; + ErrorCode = DosReadFile(getBX(), + SEG_OFF_TO_PTR(getDS(), getDX()), + getCX(), + &BytesRead); + DoEcho = FALSE; if (ErrorCode == ERROR_SUCCESS) { diff --git a/reactos/subsystems/ntvdm/dos/dos32krnl/dos.h b/reactos/subsystems/ntvdm/dos/dos32krnl/dos.h index 6fe399e33dc..ead1344d29b 100644 --- a/reactos/subsystems/ntvdm/dos/dos32krnl/dos.h +++ b/reactos/subsystems/ntvdm/dos/dos32krnl/dos.h @@ -160,6 +160,8 @@ typedef struct _DOS_EXEC_PARAM_BLOCK #pragma pack(pop) +extern BOOLEAN DoEcho; + /* FUNCTIONS ******************************************************************/ extern CALLBACK16 DosContext; diff --git a/reactos/subsystems/ntvdm/dos/dos32krnl/dosfiles.c b/reactos/subsystems/ntvdm/dos/dos32krnl/dosfiles.c index 03a5df83847..51c57d3c2c0 100644 --- a/reactos/subsystems/ntvdm/dos/dos32krnl/dosfiles.c +++ b/reactos/subsystems/ntvdm/dos/dos32krnl/dosfiles.c @@ -167,15 +167,14 @@ WORD DosReadFile(WORD FileHandle, LPVOID Buffer, WORD Count, LPWORD BytesRead) /* Retrieve the character in AL (scan code is in AH) */ Character = getAL(); - // FIXME: Sometimes we need echo, some other times not. - // DosPrintCharacter(DOS_OUTPUT_HANDLE, Character); + if (DoEcho) DosPrintCharacter(DOS_OUTPUT_HANDLE, Character); ((PCHAR)Buffer)[BytesRead32] = Character; /* Stop on first carriage return */ if (Character == '\r') { - // DosPrintCharacter(DOS_OUTPUT_HANDLE, '\n'); + if (DoEcho) DosPrintCharacter(DOS_OUTPUT_HANDLE, '\n'); break; }