diff options
Diffstat (limited to 'private/ntos/fw/alpha/fwsignal.c')
-rw-r--r-- | private/ntos/fw/alpha/fwsignal.c | 381 |
1 files changed, 381 insertions, 0 deletions
diff --git a/private/ntos/fw/alpha/fwsignal.c b/private/ntos/fw/alpha/fwsignal.c new file mode 100644 index 000000000..9e0df889b --- /dev/null +++ b/private/ntos/fw/alpha/fwsignal.c @@ -0,0 +1,381 @@ +/*++ + +Copyright (c) 1991 Microsoft Corporation +Copyright (c) 1992, 1993 Digital Equipment Corporation + +Module Name: + + fwsignal.c + +Abstract: + + This module implements the ARC firmware Signal Handling Functions. + +Author: + + Lluis Abello (lluis) 24-Sep-1991 + + +Revision History: + + 22-May-1992 John DeRosa [DEC] + + Modified this for Alpha. The vestigal interrupt and signal + support was removed, and keyboard input is done by polling. + +--*/ + +#include "fwp.h" +#include "iodevice.h" + +extern KEYBOARD_BUFFER KbdBuffer; + +// +// Keyboard static variables. +// + +BOOLEAN Scan0xE0 = FALSE; + +// 1111 1 1111122222222 2 2333333333344 4 44444445555 5 5 55 +// Character # 234567890123 4 5678901234567 8 9012345678901 2 34567890123 4 5 67 +PCHAR NormalLookup = "1234567890-=\b\tqwertyuiop[]\n\0asdfghjkl;'`\0\\zxcvbnm,./\0\0\0 "; +PCHAR ShiftedLookup = "!@#$%^&*()_+\b\0QWERTYUIOP{}\n\0ASDFGHJKL:\"~\0\|ZXCVBNM<>?\0\0\0 "; + +extern BOOLEAN FwLeftShift; +extern BOOLEAN FwRightShift; +extern BOOLEAN FwControl; +extern BOOLEAN FwAlt; +extern BOOLEAN FwCapsLock; + + +VOID +StoreKeyboardChar( + IN UCHAR Character + ) +/*++ + +Routine Description: + + This routine stores the given character into the circular + buffer if there is enough room. Otherwise the character is lost. + +Arguments: + + Character - Supplies the translated scan code to store into the buffer + +Return Value: + + None. + +--*/ +{ + // + // Store scan code in buffer if there is room. + // + if (((KbdBuffer.WriteIndex+1) % KBD_BUFFER_SIZE) != KbdBuffer.ReadIndex) { + KbdBuffer.WriteIndex = (KbdBuffer.WriteIndex+1) % KBD_BUFFER_SIZE; + KbdBuffer.Buffer[KbdBuffer.WriteIndex] = Character; + } +} + + +VOID +TranslateScanCode( + IN UCHAR Scan + ) + +/*++ + +Routine Description: + + This routine translates the given keyboard scan code into an + ASCII character and puts it in the circular buffer. + +Arguments: + + Scan - Supplies the scan code read from the keyboard. + +Return Value: + + None. + +--*/ + +{ + UCHAR FwControlCharacter=0; + UCHAR FwFunctionCharacter; + BOOLEAN MakeCode; + UCHAR Char; + + // + // Check 0xE0, which introduces a two key sequence. + // + + if (Scan == 0xE0) { + Scan0xE0 = TRUE; + return; + } + + if (Scan0xE0 == TRUE) { + + // + // Check for PrintScrn (used as SysRq, also found in its true Alt + // form below). + // + + if (Scan == KEY_PRINT_SCREEN) { + StoreKeyboardChar(ASCII_SYSRQ); + Scan0xE0 = FALSE; + return; + } + } + + // + // Look for scan codes that indicate shift, control, or alt keys. Bit 7 + // of scan code indicates upward or downward keypress. + // + // N.B. By masking the scan code with 0x7f, both the make and break codes + // are covered. + // + + MakeCode = !(Scan & 0x80); + switch (Scan & 0x7F) { + + case KEY_LEFT_SHIFT: + FwLeftShift = MakeCode; + return; + + case KEY_RIGHT_SHIFT: + FwRightShift = MakeCode; + return; + + case KEY_CONTROL: + FwControl = MakeCode; + Scan0xE0 = FALSE; + return; + + case KEY_ALT: + FwAlt = MakeCode; + return; + + default: + break; + } + + // + // The rest of the keys only do something on make. + // + + if (MakeCode) { + + // + // Check for control keys. + // + + switch (Scan) { + + case KEY_UP_ARROW: + FwControlCharacter = 'A'; + break; + + case KEY_DOWN_ARROW: + FwControlCharacter = 'B'; + break; + + case KEY_RIGHT_ARROW: + FwControlCharacter = 'C'; + break; + + case KEY_LEFT_ARROW: + FwControlCharacter = 'D'; + break; + + case KEY_HOME: + FwControlCharacter = 'H'; + break; + + case KEY_END: + FwControlCharacter = 'K'; + break; + + case KEY_PAGE_UP: + FwControlCharacter = '?'; + break; + + case KEY_PAGE_DOWN: + FwControlCharacter = '/'; + break; + + case KEY_INSERT: + FwControlCharacter = '@'; + break; + + case KEY_DELETE: + FwControlCharacter = 'P'; + break; + + case KEY_SYS_REQUEST: + StoreKeyboardChar(ASCII_SYSRQ); + return; + + case KEY_ESC: + StoreKeyboardChar(ASCII_ESC); + return; + + case KEY_CAPS_LOCK: + FwCapsLock = !FwCapsLock; + return; + + case KEY_F1: + FwControlCharacter = 'O'; + FwFunctionCharacter = 'P'; + break; + + case KEY_F2: + FwControlCharacter = 'O'; + FwFunctionCharacter = 'Q'; + break; + + case KEY_F3: + FwControlCharacter = 'O'; + FwFunctionCharacter = 'w'; + break; + + case KEY_F4: + FwControlCharacter = 'O'; + FwFunctionCharacter = 'x'; + break; + + case KEY_F5: + FwControlCharacter = 'O'; + FwFunctionCharacter = 't'; + break; + + case KEY_F6: + FwControlCharacter = 'O'; + FwFunctionCharacter = 'u'; + break; + + case KEY_F7: + FwControlCharacter = 'O'; + FwFunctionCharacter = 'q'; + break; + + case KEY_F8: + FwControlCharacter = 'O'; + FwFunctionCharacter = 'r'; + break; + + case KEY_F9: + FwControlCharacter = 'O'; + FwFunctionCharacter = 'p'; + break; + + case KEY_F10: + FwControlCharacter = 'O'; + FwFunctionCharacter = 'M'; + break; + +// case KEY_F11: +// FwControlCharacter = 'O'; +// FwFunctionCharacter = 'A'; +// break; +// +// case KEY_F12: +// FwControlCharacter = 'O'; +// FwFunctionCharacter = 'B'; +// break; + + default: + + // + // Some kind of character. + // + + Char = 0; + + // + // Check for keypad + or -. This is done here because we only + // recognize a two keypad keys. Full keypad support should be + // done by a lookup table. + // + + if (Scan == KEY_KEYPAD_MINUS) { + + Char = '-'; + + } else if (Scan == KEY_KEYPAD_PLUS) { + + Char = '+'; + + } else if (((Scan >= 16) && (Scan <= 25)) || + ((Scan >= 30) && (Scan <= 38)) || + ((Scan >= 44) && (Scan <= 50))) { + + // + // Alphabetic character + // + + if (FwControl) { + + // + // Control character. + // + // This works for ^A -- ^Z. + // + + Char = NormalLookup[Scan - 2] - 'A'; + + } else { + + // + // ASCII alphanumeric character. Set up to store + // either the main key or shifted key character. + // + + if (((FwLeftShift || FwRightShift) && !FwCapsLock) || + (!(FwLeftShift || FwRightShift) && FwCapsLock)) { + Char = ShiftedLookup[Scan - 2]; + } else { + Char = NormalLookup[Scan - 2]; + } + } + + } else if ((Scan > 1) && (Scan < 58)) { + + // + // It is ASCII but not alpha, so do not shift on CapsLock. + // + + if (FwLeftShift || FwRightShift) { + Char = ShiftedLookup[Scan - 2]; + } else { + Char = NormalLookup[Scan - 2]; + } + } + + // + // If a character, store it in buffer. + // + + if (Char) { + StoreKeyboardChar(Char); + return; + } + break; + } + + // + // This is for ASCII_CSI sequences, not normal control characters. + // + + if (FwControlCharacter) { + StoreKeyboardChar(ASCII_CSI); + StoreKeyboardChar(FwControlCharacter); + if (FwControlCharacter == 'O') { + StoreKeyboardChar(FwFunctionCharacter); + } + return; + } + } +} |