summaryrefslogtreecommitdiffstats
path: root/private/ntos/fw/alpha/fwsignal.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/fw/alpha/fwsignal.c')
-rw-r--r--private/ntos/fw/alpha/fwsignal.c381
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;
+ }
+ }
+}