Don't echo when STDIN isn't the CON device.


svn path=/trunk/; revision=69357
This commit is contained in:
Aleksandar Andrejevic 2015-09-25 22:09:37 +00:00
parent 7f662fde76
commit 357395eacc
2 changed files with 53 additions and 50 deletions

View file

@ -43,6 +43,51 @@ PBIOS_DATA BiosData;
/* PUBLIC FUNCTIONS ***********************************************************/ /* PUBLIC FUNCTIONS ***********************************************************/
VOID DosEchoCharacter(CHAR Character)
{
switch (Character)
{
case '\0':
{
/* Nothing */
break;
}
case '\r':
case '\n':
{
/* Print both a carriage return and a newline */
DosPrintCharacter(DOS_OUTPUT_HANDLE, '\r');
DosPrintCharacter(DOS_OUTPUT_HANDLE, '\n');
break;
}
case '\b':
{
/* Erase the character */
DosPrintCharacter(DOS_OUTPUT_HANDLE, '\b');
DosPrintCharacter(DOS_OUTPUT_HANDLE, ' ');
DosPrintCharacter(DOS_OUTPUT_HANDLE, '\b');
break;
}
default:
{
/* Check if this is a special character */
if (Character < 0x20)
{
DosPrintCharacter(DOS_OUTPUT_HANDLE, '^');
Character += 'A' - 1;
}
else
{
/* Echo the character */
DosPrintCharacter(DOS_OUTPUT_HANDLE, Character);
}
}
}
}
CHAR DosReadCharacter(WORD FileHandle) CHAR DosReadCharacter(WORD FileHandle)
{ {
WORD BytesRead; WORD BytesRead;
@ -66,6 +111,13 @@ CHAR DosReadCharacter(WORD FileHandle)
1, 1,
&BytesRead); &BytesRead);
/* Check if the file is actually the CON device */
if (Descriptor && Descriptor->DeviceInfo & FILE_INFO_DEVICE)
{
/* Echo the character */
DosEchoCharacter(Sda->ByteBuffer);
}
/* Restore the old mode and return the character */ /* Restore the old mode and return the character */
if (Descriptor) Descriptor->DeviceInfo = OldDeviceInfo; if (Descriptor) Descriptor->DeviceInfo = OldDeviceInfo;
return Sda->ByteBuffer; return Sda->ByteBuffer;

View file

@ -161,51 +161,6 @@ static BOOLEAN DosChangeDirectory(LPSTR Directory)
/* PUBLIC FUNCTIONS ***********************************************************/ /* PUBLIC FUNCTIONS ***********************************************************/
VOID DosEchoCharacter(CHAR Character)
{
switch (Character)
{
case '\0':
{
/* Nothing */
break;
}
case '\r':
case '\n':
{
/* Print both a carriage return and a newline */
DosPrintCharacter(DOS_OUTPUT_HANDLE, '\r');
DosPrintCharacter(DOS_OUTPUT_HANDLE, '\n');
break;
}
case '\b':
{
/* Erase the character */
DosPrintCharacter(DOS_OUTPUT_HANDLE, '\b');
DosPrintCharacter(DOS_OUTPUT_HANDLE, ' ');
DosPrintCharacter(DOS_OUTPUT_HANDLE, '\b');
break;
}
default:
{
/* Check if this is a special character */
if (Character < 0x20)
{
DosPrintCharacter(DOS_OUTPUT_HANDLE, '^');
Character += 'A' - 1;
}
else
{
/* Echo the character */
DosPrintCharacter(DOS_OUTPUT_HANDLE, Character);
}
}
}
}
BOOLEAN DosControlBreak(VOID) BOOLEAN DosControlBreak(VOID)
{ {
setCF(0); setCF(0);
@ -260,7 +215,6 @@ VOID WINAPI DosInt21h(LPWORD Stack)
DPRINT("INT 21h, AH = 01h\n"); DPRINT("INT 21h, AH = 01h\n");
Character = DosReadCharacter(DOS_INPUT_HANDLE); Character = DosReadCharacter(DOS_INPUT_HANDLE);
DosEchoCharacter(Character);
if (Character == 0x03 && DosControlBreak()) break; if (Character == 0x03 && DosControlBreak()) break;
setAL(Character); setAL(Character);
@ -337,11 +291,8 @@ VOID WINAPI DosInt21h(LPWORD Stack)
/* Input */ /* Input */
if (DosCheckInput()) if (DosCheckInput())
{ {
CHAR Character = DosReadCharacter(DOS_INPUT_HANDLE);
DosEchoCharacter(Character);
Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_ZF; Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_ZF;
setAL(Character); setAL(DosReadCharacter(DOS_INPUT_HANDLE));
} }
else else
{ {