summaryrefslogtreecommitdiffstats
path: root/sys/isa
diff options
context:
space:
mode:
authorjkh <jkh@FreeBSD.org>1993-07-30 02:20:26 +0000
committerjkh <jkh@FreeBSD.org>1993-07-30 02:20:26 +0000
commit2366a822335e391ec97f45247d79064dba141c35 (patch)
tree0ff9b934d8232fb5aa2929784e8f6e0fd78e54ba /sys/isa
parent9c1c8ff17c9e850e55c75ddca0caf4ceda22fa96 (diff)
downloadFreeBSD-src-2366a822335e391ec97f45247d79064dba141c35.zip
FreeBSD-src-2366a822335e391ec97f45247d79064dba141c35.tar.gz
Updated syscons to 0.2b - please test this! It won't be in the ALPHA
release, but it's still worth testing.
Diffstat (limited to 'sys/isa')
-rw-r--r--sys/isa/kbdtables.h603
-rw-r--r--sys/isa/syscons.c1185
2 files changed, 1318 insertions, 470 deletions
diff --git a/sys/isa/kbdtables.h b/sys/isa/kbdtables.h
index 013cf59..45df7f5 100644
--- a/sys/isa/kbdtables.h
+++ b/sys/isa/kbdtables.h
@@ -14,9 +14,10 @@
* DK9210 Aalborg SO Phone: +45 9814 8076
*/
-#if defined(DKKEYMAP)
+#define META 0x80 /* eight bit for emacs META-key */
-keymap_t key_map = { 107, /* DK iso8859 keymap */
+#ifdef DKKEYMAP
+keymap_t key_map = { 0x69, /* DK iso8859 keymap */
/* alt
* scan cntrl alt alt cntrl
* code base shift cntrl shift alt shift cntrl shift spcl flgs
@@ -36,7 +37,7 @@ keymap_t key_map = { 107, /* DK iso8859 keymap */
/* sc=0b */ '0', '=', NOP, NOP, '}', '=', NOP, NOP, 0x33, 0x00,
/* sc=0c */ '+', '?', NOP, NOP, '+', '?', NOP, NOP, 0x33, 0x00,
/* sc=0d */ '\'', '`', NOP, NOP, '|', '`', NOP, NOP, 0x33, 0x00,
-/* sc=0e */ 0x08, 0x08, 0x7F, 0x7F, 0x08, 0x08, 0x7F, 0x7F, 0x00, 0x00,
+/* sc=0e */ 0x7F, 0x7F, 0x08, 0x08, 0x7F, 0x7F, 0x08, 0x08, 0x00, 0x00,
/* sc=0f */ 0x09, 0x08, NOP, NOP, 0x09, 0x08, NOP, NOP, 0x33, 0x00,
/* sc=10 */ 'q', 'Q', 0x11, 0x11, 'q', 'Q', 0x11, 0x11, 0x00, 0x01,
/* sc=11 */ 'w', 'W', 0x17, 0x17, 'w', 'W', 0x17, 0x17, 0x00, 0x01,
@@ -96,7 +97,7 @@ keymap_t key_map = { 107, /* DK iso8859 keymap */
/* sc=47 */ F(49), '7', '7', '7', '7', '7', '7', '7', 0x80, 0x02,
/* sc=48 */ F(50), '8', '8', '8', '8', '8', '8', '8', 0x80, 0x02,
/* sc=49 */ F(51), '9', '9', '9', '9', '9', '9', '9', 0x80, 0x02,
-/* sc=4a */ F(52), '/', '/', '/', '/', '/', '/', '/', 0x80, 0x02,
+/* sc=4a */ F(52), '-', '-', '-', '-', '-', '-', '-', 0x80, 0x02,
/* sc=4b */ F(53), '4', '4', '4', '4', '4', '4', '4', 0x80, 0x02,
/* sc=4c */ NOP, '5', '5', '5', '5', '5', '5', '5', 0x80, 0x02,
/* sc=4d */ F(55), '6', '6', '6', '6', '6', '6', '6', 0x80, 0x02,
@@ -128,10 +129,600 @@ keymap_t key_map = { 107, /* DK iso8859 keymap */
/* sc=67 */ F(54), F(54), F(54), F(54), F(54), F(54), F(54), F(54), 0xFF, 0x00,
/* sc=68 */ SLK, SLK, SLK, SLK, SLK, SLK, SLK, SLK, 0xFF, 0x00,
};
+#endif
-#else
+#ifdef UKKEYMAP
+keymap_t keymap = { 0x69, /* uk iso8859 keymap */
+/* alt
+ * scan cntrl alt alt cntrl
+ * code base shift cntrl shift alt shift cntrl shift spcl flgs
+ * ---------------------------------------------------------------------------
+ */
+/* sc=00 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=01 */ 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00,
+/* sc=02 */ '1', '!', NOP, NOP, '`', '`', NOP, NOP, 0x33, 0x00,
+/* sc=03 */ '2', '"', 0x00, 0x00, '@', '@', 0x00, 0x00, 0x00, 0x00,
+/* sc=04 */ '3', 0xA3, NOP, NOP, '#', '#', NOP, NOP, 0x33, 0x00,
+/* sc=05 */ '4', '$', NOP, NOP, '4', '$', NOP, NOP, 0x33, 0x00,
+/* sc=06 */ '5', '%', NOP, NOP, '5', '%', NOP, NOP, 0x33, 0x00,
+/* sc=07 */ '6', '^', 0x1E, 0x1E, '^', '^', 0x1E, 0x1E, 0x00, 0x00,
+/* sc=08 */ '7', '&', NOP, NOP, '[', '[', 0x1B, 0x1B, 0x30, 0x00,
+/* sc=09 */ '8', '*', NOP, NOP, '8', '*', NOP, NOP, 0x33, 0x00,
+/* sc=0a */ '9', '(', NOP, NOP, ']', ']', 0x1D, 0x1D, 0x30, 0x00,
+/* sc=0b */ '0', ')', NOP, NOP, '{', '{', NOP, NOP, 0x33, 0x00,
+/* sc=0c */ '-', '_', 0x1F, 0x1F, '|', '|', 0x1F, 0x1F, 0x00, 0x00,
+/* sc=0d */ '=', '+', NOP, NOP, '}', '}', NOP, NOP, 0x33, 0x00,
+/* sc=0e */ 0x08, 0x08, 0x7F, 0x7F, 0x08, 0x08, 0x7F, 0x7F, 0x00, 0x00,
+/* sc=0f */ 0x09, 0x08, NOP, NOP, 0x09, 0x08, NOP, NOP, 0x77, 0x00,
+/* sc=10 */ 'q', 'Q', 0x11, 0x11, 'q', 'Q', 0x11, 0x11, 0x00, 0x01,
+/* sc=11 */ 'w', 'W', 0x17, 0x17, 'w', 'W', 0x17, 0x17, 0x00, 0x01,
+/* sc=12 */ 'e', 'E', 0x05, 0x05, 'e', 'E', 0x05, 0x05, 0x00, 0x01,
+/* sc=13 */ 'r', 'R', 0x12, 0x12, 'r', 'R', 0x12, 0x12, 0x00, 0x01,
+/* sc=14 */ 't', 'T', 0x14, 0x14, 't', 'T', 0x14, 0x14, 0x00, 0x01,
+/* sc=15 */ 'y', 'Y', 0x19, 0x19, 'y', 'Y', 0x19, 0x19, 0x00, 0x01,
+/* sc=16 */ 'u', 'U', 0x15, 0x15, 'u', 'U', 0x15, 0x15, 0x00, 0x01,
+/* sc=17 */ 'i', 'I', 0x09, 0x09, 'i', 'I', 0x09, 0x09, 0x00, 0x01,
+/* sc=18 */ 'o', 'O', 0x0F, 0x0F, 'o', 'O', 0x0F, 0x0F, 0x00, 0x01,
+/* sc=19 */ 'p', 'P', 0x10, 0x10, 'p', 'P', 0x10, 0x10, 0x00, 0x01,
+/* sc=1a */ '[', '{', 0x1B, 0x1B, '[', '{', 0x1B, 0x1B, 0x00, 0x00,
+/* sc=1b */ ']', '}', 0x1D, 0x1D, ']', '}', 0x1D, 0x1D, 0x00, 0x00,
+/* sc=1c */ 0x0D, 0x0D, 0x0A, 0x0A, 0x0D, 0x0D, 0x0A, 0x0A, 0x00, 0x00,
+/* sc=1d */ LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, 0xFF, 0x00,
+/* sc=1e */ 'a', 'A', 0x01, 0x01, 'a', 'A', 0x01, 0x01, 0x00, 0x01,
+/* sc=1f */ 's', 'S', 0x13, 0x13, 's', 'S', 0x13, 0x13, 0x00, 0x01,
+/* sc=20 */ 'd', 'D', 0x04, 0x04, 'd', 'D', 0x04, 0x04, 0x00, 0x01,
+/* sc=21 */ 'f', 'F', 0x06, 0x06, 'f', 'F', 0x06, 0x06, 0x00, 0x01,
+/* sc=22 */ 'g', 'G', 0x07, 0x07, 'g', 'G', 0x07, 0x07, 0x00, 0x01,
+/* sc=23 */ 'h', 'H', 0x08, 0x08, 'h', 'H', 0x08, 0x08, 0x00, 0x01,
+/* sc=24 */ 'j', 'J', 0x0A, 0x0A, 'j', 'J', 0x0A, 0x0A, 0x00, 0x01,
+/* sc=25 */ 'k', 'K', 0x0B, 0x0B, 'k', 'K', 0x0B, 0x0B, 0x00, 0x01,
+/* sc=26 */ 'l', 'L', 0x0C, 0x0C, 'l', 'L', 0x0C, 0x0C, 0x00, 0x01,
+/* sc=27 */ ';', ':', NOP, NOP, ';', ':', NOP, NOP, 0x33, 0x00,
+/* sc=28 */ '\'', '@', 0x00, 0x00, '\'', '@', 0x00, 0x00, 0x00, 0x00,
+/* sc=29 */ '\\', '|', 0x1C, 0x1C, '\\', '\\', 0x1C, 0x1C, 0x00, 0x00,
+/* sc=2a */ LSH, LSH, LSH, LSH, LSH, LSH, LSH, LSH, 0xFF, 0x00,
+/* sc=2b */ '#', '~', NOP, NOP, '~', '~', NOP, NOP, 0x33, 0x00,
+/* sc=2c */ 'z', 'Z', 0x1A, 0x1A, 'z', 'Z', 0x1A, 0x1A, 0x00, 0x01,
+/* sc=2d */ 'x', 'X', 0x18, 0x18, 'x', 'X', 0x18, 0x18, 0x00, 0x01,
+/* sc=2e */ 'c', 'C', 0x03, 0x03, 'c', 'C', 0x03, 0x03, 0x00, 0x01,
+/* sc=2f */ 'v', 'V', 0x16, 0x16, 'v', 'V', 0x16, 0x16, 0x00, 0x01,
+/* sc=30 */ 'b', 'B', 0x02, 0x02, 'b', 'B', 0x02, 0x02, 0x00, 0x01,
+/* sc=31 */ 'n', 'N', 0x0E, 0x0E, 'n', 'N', 0x0E, 0x0E, 0x00, 0x01,
+/* sc=32 */ 'm', 'M', 0x0D, 0x0D, 'm', 'M', 0x0D, 0x0D, 0x00, 0x01,
+/* sc=33 */ ',', '<', NOP, NOP, ',', '<', NOP, NOP, 0x33, 0x00,
+/* sc=34 */ '.', '>', NOP, NOP, '.', '>', NOP, NOP, 0x33, 0x00,
+/* sc=35 */ '/', '?', NOP, NOP, '/', '?', NOP, NOP, 0x33, 0x00,
+/* sc=36 */ RSH, RSH, RSH, RSH, RSH, RSH, RSH, RSH, 0xFF, 0x00,
+/* sc=37 */ '*', '*', 0x0A, 0x0A, '*', '*', 0x0A, 0x0A, 0x33, 0x00,
+/* sc=38 */ LALT, LALT, LALT, LALT, LALT, LALT, LALT, LALT, 0xFF, 0x00,
+/* sc=39 */ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 0x00, 0x00,
+/* sc=3a */ CLK, CLK, CLK, CLK, CLK, CLK, CLK, CLK, 0xFF, 0x00,
+/* sc=3b */ F( 1), F(13), F(25), F(37), S( 1), S(11), S( 1), S(11), 0xFF, 0x00,
+/* sc=3c */ F( 2), F(14), F(26), F(38), S( 2), S(12), S( 2), S(12), 0xFF, 0x00,
+/* sc=3d */ F( 3), F(15), F(27), F(39), S( 3), S(13), S( 3), S(13), 0xFF, 0x00,
+/* sc=3e */ F( 4), F(16), F(28), F(40), S( 4), S(14), S( 4), S(14), 0xFF, 0x00,
+/* sc=3f */ F( 5), F(17), F(29), F(41), S( 5), S(15), S( 5), S(15), 0xFF, 0x00,
+/* sc=40 */ F( 6), F(18), F(30), F(42), S( 6), S(16), S( 6), S(16), 0xFF, 0x00,
+/* sc=41 */ F( 7), F(19), F(31), F(43), S( 7), S( 7), S( 7), S( 7), 0xFF, 0x00,
+/* sc=42 */ F( 8), F(20), F(32), F(44), S( 8), S( 8), S( 8), S( 8), 0xFF, 0x00,
+/* sc=43 */ F( 9), F(21), F(33), F(45), S( 9), S( 9), S( 9), S( 9), 0xFF, 0x00,
+/* sc=44 */ F(10), F(22), F(34), F(46), S(10), S(10), S(10), S(10), 0xFF, 0x00,
+/* sc=45 */ NLK, NLK, 0x13, 0x13, NLK, NLK, 0x13, 0x13, 0xCC, 0x00,
+/* sc=46 */ SLK, SLK, 0x7F, 0x7F, SLK, SLK, 0x7F, 0x7F, 0xCC, 0x00,
+/* sc=47 */ F(49), '7', '7', '7', '7', '7', '7', '7', 0x80, 0x02,
+/* sc=48 */ F(50), '8', '8', '8', '8', '8', '8', '8', 0x80, 0x02,
+/* sc=49 */ F(51), '9', '9', '9', '9', '9', '9', '9', 0x80, 0x02,
+/* sc=4a */ F(52), '-', 0x1F, 0x1F, '-', '-', '-', '-', 0x80, 0x02,
+/* sc=4b */ F(53), '4', '4', '4', '4', '4', '4', '4', 0x80, 0x02,
+/* sc=4c */ F(54), '5', '5', '5', '5', '5', '5', '5', 0x80, 0x02,
+/* sc=4d */ F(55), '6', 0x1E, 0x1E, '6', '6', '6', '6', 0x80, 0x02,
+/* sc=4e */ F(56), '+', '+', '+', '+', '+', '+', '+', 0x80, 0x02,
+/* sc=4f */ F(57), '1', '1', '1', '1', '1', '1', '1', 0x80, 0x02,
+/* sc=50 */ F(58), '2', '2', '2', '2', '2', '2', '2', 0x80, 0x02,
+/* sc=51 */ F(59), '3', '3', '3', '3', '3', '3', '3', 0x80, 0x02,
+/* sc=52 */ F(60), '0', '0', '0', '0', '0', '0', '0', 0x80, 0x02,
+/* sc=53 */ 0x7F, '.', 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x00, 0x02,
+/* sc=54 */ 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00,
+/* sc=55 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=56 */ '\\', '|', 0x1C, 0x1C, '\\', '|', 0x1C, 0x1C, 0x00, 0x00,
+/* sc=57 */ F(11), F(23), F(35), F(47), S(11), S(11), S(11), S(11), 0xFF, 0x00,
+/* sc=58 */ F(12), F(24), F(36), F(48), S(12), S(12), S(12), S(12), 0xFF, 0x00,
+/* sc=59 */ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0xFF, 0x02,
+/* sc=5a */ RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, 0xFF, 0x00,
+/* sc=5b */ '/', '/', '/', '/', '/', '/', '/', '/', 0x00, 0x02,
+/* sc=5c */ '*', '*', '*', '*', '*', '*', '*', '*', 0x00, 0x02,
+/* sc=5d */ RALT, RALT, RALT, RALT, RALT, RALT, RALT, RALT, 0xFF, 0x00,
+/* sc=5e */ F(49), F(49), F(49), F(49), F(49), F(49), F(49), F(49), 0xFF, 0x00,
+/* sc=5f */ F(50), F(50), F(50), F(50), F(50), F(50), F(50), F(50), 0xFF, 0x00,
+/* sc=60 */ F(51), F(51), F(51), F(51), F(51), F(51), F(51), F(51), 0xFF, 0x00,
+/* sc=61 */ F(53), F(53), F(53), F(53), F(53), F(53), F(53), F(53), 0xFF, 0x00,
+/* sc=62 */ F(55), F(55), F(55), F(55), F(55), F(55), F(55), F(55), 0xFF, 0x00,
+/* sc=63 */ F(57), F(57), F(57), F(57), F(57), F(57), F(57), F(57), 0xFF, 0x00,
+/* sc=64 */ F(58), F(58), F(58), F(58), F(58), F(58), F(58), F(58), 0xFF, 0x00,
+/* sc=65 */ F(59), F(59), F(59), F(59), F(59), F(59), F(59), F(59), 0xFF, 0x00,
+/* sc=66 */ F(60), F(60), F(60), F(60), F(60), F(60), F(60), F(60), 0xFF, 0x00,
+/* sc=67 */ F(54), F(54), F(54), F(54), F(54), F(54), F(54), F(54), 0xFF, 0x00,
+/* sc=68 */ SLK, SLK, SLK, SLK, SLK, SLK, SLK, SLK, 0xFF, 0x00,
+};
+#endif
+
+#ifdef GRKEYMAP
+keymap_t keymap = { 0x69, /* german iso8859 keymap */
+/* alt
+ * scan cntrl alt alt cntrl
+ * code base shift cntrl shift alt shift cntrl shift spcl flgs
+ * ---------------------------------------------------------------------------
+ */
+/* sc=00 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=01 */ 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00,
+/* sc=02 */ '1', '!', NOP, NOP, '`', '`', NOP, NOP, 0x33, 0x00,
+/* sc=03 */ '2', '"', 0x00, 0x00, '@', '@', 0x00, 0x00, 0x00, 0x00,
+/* sc=04 */ '3', 0xA7, NOP, NOP, '#', '#', NOP, NOP, 0x33, 0x00,
+/* sc=05 */ '4', '$', NOP, NOP, '4', '$', NOP, NOP, 0x33, 0x00,
+/* sc=06 */ '5', '%', NOP, NOP, '5', '%', NOP, NOP, 0x33, 0x00,
+/* sc=07 */ '6', '&', 0x1E, 0x1E, '^', '^', 0x1E, 0x1E, 0x00, 0x00,
+/* sc=08 */ '7', '/', 0x1B, 0x1B, '[', '[', 0x1B, 0x1B, 0x00, 0x00,
+/* sc=09 */ '8', '(', NOP, NOP, '8', '(', NOP, NOP, 0x33, 0x00,
+/* sc=0a */ '9', ')', 0x1D, 0x1D, ']', ']', 0x1D, 0x1D, 0x00, 0x00,
+/* sc=0b */ '0', '=', NOP, NOP, '{', '{', NOP, NOP, 0x33, 0x00,
+/* sc=0c */ 0xDF, '?', NOP, NOP, '|', '|', NOP, NOP, 0x33, 0x00,
+/* sc=0d */ 0x92, 0x93, NOP, NOP, '\'', '`', NOP, NOP, 0x33, 0x00,
+/* sc=0e */ 0x08, 0x08, 0x7F, 0x7F, 0x08, 0x08, 0x7F, 0x7F, 0x00, 0x00,
+/* sc=0f */ 0x09, 0x08, NOP, NOP, 0x09, 0x08, NOP, NOP, 0x77, 0x00,
+/* sc=10 */ 'q', 'Q', 0x11, 0x11, 'q', 'Q', 0x11, 0x11, 0x00, 0x01,
+/* sc=11 */ 'w', 'W', 0x17, 0x17, 'w', 'W', 0x17, 0x17, 0x00, 0x01,
+/* sc=12 */ 'e', 'E', 0x05, 0x05, 'e', 'E', 0x05, 0x05, 0x00, 0x01,
+/* sc=13 */ 'r', 'R', 0x12, 0x12, 'r', 'R', 0x12, 0x12, 0x00, 0x01,
+/* sc=14 */ 't', 'T', 0x14, 0x14, 't', 'T', 0x14, 0x14, 0x00, 0x01,
+/* sc=15 */ 'z', 'Z', 0x1A, 0x1A, 'z', 'Z', 0x1A, 0x1A, 0x00, 0x01,
+/* sc=16 */ 'u', 'U', 0x15, 0x15, 'u', 'U', 0x15, 0x15, 0x00, 0x01,
+/* sc=17 */ 'i', 'I', 0x09, 0x09, 'i', 'I', 0x09, 0x09, 0x00, 0x01,
+/* sc=18 */ 'o', 'O', 0x0F, 0x0F, 'o', 'O', 0x0F, 0x0F, 0x00, 0x01,
+/* sc=19 */ 'p', 'P', 0x10, 0x10, 'p', 'P', 0x10, 0x10, 0x00, 0x01,
+/* sc=1a */ 0xFC, 0xDC, 0x1B, 0x1B, '[', '{', 0x1B, 0x1B, 0x00, 0x01,
+/* sc=1b */ '+', '*', 0x1D, 0x1D, ']', '}', 0x1D, 0x1D, 0x00, 0x00,
+/* sc=1c */ 0x0D, 0x0D, 0x0A, 0x0A, 0x0D, 0x0D, 0x0A, 0x0A, 0x00, 0x00,
+/* sc=1d */ LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, 0xFF, 0x00,
+/* sc=1e */ 'a', 'A', 0x01, 0x01, 'a', 'A', 0x01, 0x01, 0x00, 0x01,
+/* sc=1f */ 's', 'S', 0x13, 0x13, 's', 'S', 0x13, 0x13, 0x00, 0x01,
+/* sc=20 */ 'd', 'D', 0x04, 0x04, 'd', 'D', 0x04, 0x04, 0x00, 0x01,
+/* sc=21 */ 'f', 'F', 0x06, 0x06, 'f', 'F', 0x06, 0x06, 0x00, 0x01,
+/* sc=22 */ 'g', 'G', 0x07, 0x07, 'g', 'G', 0x07, 0x07, 0x00, 0x01,
+/* sc=23 */ 'h', 'H', 0x08, 0x08, 'h', 'H', 0x08, 0x08, 0x00, 0x01,
+/* sc=24 */ 'j', 'J', 0x0A, 0x0A, 'j', 'J', 0x0A, 0x0A, 0x00, 0x01,
+/* sc=25 */ 'k', 'K', 0x0B, 0x0B, 'k', 'K', 0x0B, 0x0B, 0x00, 0x01,
+/* sc=26 */ 'l', 'L', 0x0C, 0x0C, 'l', 'L', 0x0C, 0x0C, 0x00, 0x01,
+/* sc=27 */ 0xF6, 0xD6, NOP, NOP, 0xF6, 0xD6, NOP, NOP, 0x33, 0x01,
+/* sc=28 */ 0xE4, 0xC4, NOP, NOP, 0xE4, 0xC4, NOP, NOP, 0x33, 0x01,
+/* sc=29 */ '<', '>', 0x1C, 0x1C, '\\', '|', 0x1C, 0x1C, 0x00, 0x00,
+/* sc=2a */ LSH, LSH, LSH, LSH, LSH, LSH, LSH, LSH, 0xFF, 0x00,
+/* sc=2b */ '#', '^', 0x1E, 0x1E, '`', '~', 0x1E, 0x1E, 0x00, 0x00,
+/* sc=2c */ 'y', 'Y', 0x19, 0x19, 'y', 'Y', 0x19, 0x19, 0x00, 0x01,
+/* sc=2d */ 'x', 'X', 0x18, 0x18, 'x', 'X', 0x18, 0x18, 0x00, 0x01,
+/* sc=2e */ 'c', 'C', 0x03, 0x03, 'c', 'C', 0x03, 0x03, 0x00, 0x01,
+/* sc=2f */ 'v', 'V', 0x16, 0x16, 'v', 'V', 0x16, 0x16, 0x00, 0x01,
+/* sc=30 */ 'b', 'B', 0x02, 0x02, 'b', 'B', 0x02, 0x02, 0x00, 0x01,
+/* sc=31 */ 'n', 'N', 0x0E, 0x0E, 'n', 'N', 0x0E, 0x0E, 0x00, 0x01,
+/* sc=32 */ 'm', 'M', 0x0D, 0x0D, 'm', 'M', 0x0D, 0x0D, 0x00, 0x01,
+/* sc=33 */ ',', ';', NOP, NOP, ',', ';', NOP, NOP, 0x33, 0x00,
+/* sc=34 */ '.', ':', NOP, NOP, '.', ':', NOP, NOP, 0x33, 0x00,
+/* sc=35 */ '-', '_', 0x1F, 0x1F, '-', '_', 0x1F, 0x1F, 0x00, 0x00,
+/* sc=36 */ RSH, RSH, RSH, RSH, RSH, RSH, RSH, RSH, 0xFF, 0x00,
+/* sc=37 */ '*', '*', 0x0A, 0x0A, '*', '*', 0x0A, 0x0A, 0x33, 0x00,
+/* sc=38 */ LALT, LALT, LALT, LALT, LALT, LALT, LALT, LALT, 0xFF, 0x00,
+/* sc=39 */ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 0x00, 0x00,
+/* sc=3a */ CLK, CLK, CLK, CLK, CLK, CLK, CLK, CLK, 0xFF, 0x00,
+/* sc=3b */ F( 1), F(13), F(25), F(37), S( 1), S(11), S( 1), S(11), 0xFF, 0x00,
+/* sc=3c */ F( 2), F(14), F(26), F(38), S( 2), S(12), S( 2), S(12), 0xFF, 0x00,
+/* sc=3d */ F( 3), F(15), F(27), F(39), S( 3), S(13), S( 3), S(13), 0xFF, 0x00,
+/* sc=3e */ F( 4), F(16), F(28), F(40), S( 4), S(14), S( 4), S(14), 0xFF, 0x00,
+/* sc=3f */ F( 5), F(17), F(29), F(41), S( 5), S(15), S( 5), S(15), 0xFF, 0x00,
+/* sc=40 */ F( 6), F(18), F(30), F(42), S( 6), S(16), S( 6), S(16), 0xFF, 0x00,
+/* sc=41 */ F( 7), F(19), F(31), F(43), S( 7), S( 7), S( 7), S( 7), 0xFF, 0x00,
+/* sc=42 */ F( 8), F(20), F(32), F(44), S( 8), S( 8), S( 8), S( 8), 0xFF, 0x00,
+/* sc=43 */ F( 9), F(21), F(33), F(45), S( 9), S( 9), S( 9), S( 9), 0xFF, 0x00,
+/* sc=44 */ F(10), F(22), F(34), F(46), S(10), S(10), S(10), S(10), 0xFF, 0x00,
+/* sc=45 */ NLK, NLK, 0x13, 0x13, NLK, NLK, 0x13, 0x13, 0xCC, 0x00,
+/* sc=46 */ SLK, SLK, 0x7F, 0x7F, SLK, SLK, 0x7F, 0x7F, 0xCC, 0x00,
+/* sc=47 */ F(49), '7', '7', '7', '7', '7', '7', '7', 0x80, 0x02,
+/* sc=48 */ F(50), '8', '8', '8', '8', '8', '8', '8', 0x80, 0x02,
+/* sc=49 */ F(51), '9', '9', '9', '9', '9', '9', '9', 0x80, 0x02,
+/* sc=4a */ F(52), '-', 0x1F, 0x1F, '-', '-', '-', '-', 0x80, 0x02,
+/* sc=4b */ F(53), '4', '4', '4', '4', '4', '4', '4', 0x80, 0x02,
+/* sc=4c */ F(54), '5', '5', '5', '5', '5', '5', '5', 0x80, 0x02,
+/* sc=4d */ F(55), '6', 0x1E, 0x1E, '6', '6', '6', '6', 0x80, 0x02,
+/* sc=4e */ F(56), '+', '+', '+', '+', '+', '+', '+', 0x80, 0x02,
+/* sc=4f */ F(57), '1', '1', '1', '1', '1', '1', '1', 0x80, 0x02,
+/* sc=50 */ F(58), '2', '2', '2', '2', '2', '2', '2', 0x80, 0x02,
+/* sc=51 */ F(59), '3', '3', '3', '3', '3', '3', '3', 0x80, 0x02,
+/* sc=52 */ F(60), '0', '0', '0', '0', '0', '0', '0', 0x80, 0x02,
+/* sc=53 */ 0x7F, '.', 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x00, 0x02,
+/* sc=54 */ 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00,
+/* sc=55 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=56 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=57 */ F(11), F(23), F(35), F(47), S(11), S(11), S(11), S(11), 0xFF, 0x00,
+/* sc=58 */ F(12), F(24), F(36), F(48), S(12), S(12), S(12), S(12), 0xFF, 0x00,
+/* sc=59 */ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0xFF, 0x02,
+/* sc=5a */ RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, 0xFF, 0x00,
+/* sc=5b */ '/', '/', '/', '/', '/', '/', '/', '/', 0x00, 0x02,
+/* sc=5c */ '*', '*', '*', '*', '*', '*', '*', '*', 0x00, 0x02,
+/* sc=5d */ RALT, RALT, RALT, RALT, RALT, RALT, RALT, RALT, 0xFF, 0x00,
+/* sc=5e */ F(49), F(49), F(49), F(49), F(49), F(49), F(49), F(49), 0xFF, 0x00,
+/* sc=5f */ F(50), F(50), F(50), F(50), F(50), F(50), F(50), F(50), 0xFF, 0x00,
+/* sc=60 */ F(51), F(51), F(51), F(51), F(51), F(51), F(51), F(51), 0xFF, 0x00,
+/* sc=61 */ F(53), F(53), F(53), F(53), F(53), F(53), F(53), F(53), 0xFF, 0x00,
+/* sc=62 */ F(55), F(55), F(55), F(55), F(55), F(55), F(55), F(55), 0xFF, 0x00,
+/* sc=63 */ F(57), F(57), F(57), F(57), F(57), F(57), F(57), F(57), 0xFF, 0x00,
+/* sc=64 */ F(58), F(58), F(58), F(58), F(58), F(58), F(58), F(58), 0xFF, 0x00,
+/* sc=65 */ F(59), F(59), F(59), F(59), F(59), F(59), F(59), F(59), 0xFF, 0x00,
+/* sc=66 */ F(60), F(60), F(60), F(60), F(60), F(60), F(60), F(60), 0xFF, 0x00,
+/* sc=67 */ F(54), F(54), F(54), F(54), F(54), F(54), F(54), F(54), 0xFF, 0x00,
+/* sc=68 */ SLK, SLK, SLK, SLK, SLK, SLK, SLK, SLK, 0xFF, 0x00,
+};
+#endif
+
+#ifdef SWKEYMAP
+keymap_t keymap = { 0x69, /* swedish iso8859 keymap */
+/* alt
+ * scan cntrl alt alt cntrl
+ * code base shift cntrl shift alt shift cntrl shift spcl flgs
+ * ---------------------------------------------------------------------------
+ */
+/* sc=00 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=01 */ 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00,
+/* sc=02 */ '1', '!', NOP, NOP, NOP, NOP, NOP, NOP, 0x3F, 0x00,
+/* sc=03 */ '2', '"', NOP, NOP, NOP, '@', NOP, NOP, 0x3B, 0x00,
+/* sc=04 */ '3', 0xA3, NOP, NOP, NOP, '#', NOP, NOP, 0x3B, 0x00,
+/* sc=05 */ '4', '$', NOP, NOP, NOP, NOP, NOP, NOP, 0x3F, 0x00,
+/* sc=06 */ '5', '%', NOP, NOP, NOP, NOP, NOP, NOP, 0x3F, 0x00,
+/* sc=07 */ '6', '&', 0x1E, NOP, NOP, '^', 0x1E, NOP, 0x19, 0x00,
+/* sc=08 */ '7', '/', NOP, NOP, NOP, '&', NOP, NOP, 0x3B, 0x00,
+/* sc=09 */ '8', '(', NOP, NOP, NOP, '*', NOP, NOP, 0x3B, 0x00,
+/* sc=0a */ '9', ')', NOP, NOP, NOP, '(', NOP, NOP, 0x3B, 0x00,
+/* sc=0b */ '0', '=', NOP, NOP, NOP, ')', NOP, NOP, 0x3B, 0x00,
+/* sc=0c */ '+', '?', 0x1F, 0x1F, '-', '_', 0x1F, 0x1F, 0x00, 0x00,
+/* sc=0d */ 0xB4, '`', NOP, NOP, '=', '+', NOP, NOP, 0x33, 0x00,
+/* sc=0e */ 0x08, 0x08, 0x7F, 0x7F, 0x08, 0x08, 0x7F, 0x7F, 0x00, 0x00,
+/* sc=0f */ 0x09, 0x08, NOP, NOP, 0x09, 0x08, NOP, NOP, 0x77, 0x00,
+/* sc=10 */ 'q', 'Q', 0x11, 0x11, 'q', 'Q', 0x11, 0x11, 0x00, 0x01,
+/* sc=11 */ 'w', 'W', 0x17, 0x17, 'w', 'W', 0x17, 0x17, 0x00, 0x01,
+/* sc=12 */ 'e', 'E', 0x05, 0x05, 'e', 'E', 0x05, 0x05, 0x00, 0x01,
+/* sc=13 */ 'r', 'R', 0x12, 0x12, 'r', 'R', 0x12, 0x12, 0x00, 0x01,
+/* sc=14 */ 't', 'T', 0x14, 0x14, 't', 'T', 0x14, 0x14, 0x00, 0x01,
+/* sc=15 */ 'y', 'Y', 0x19, 0x19, 'y', 'Y', 0x19, 0x19, 0x00, 0x01,
+/* sc=16 */ 'u', 'U', 0x15, 0x15, 'u', 'U', 0x15, 0x15, 0x00, 0x01,
+/* sc=17 */ 'i', 'I', 0x09, 0x09, 'i', 'I', 0x09, 0x09, 0x00, 0x01,
+/* sc=18 */ 'o', 'O', 0x0F, 0x0F, 'o', 'O', 0x0F, 0x0F, 0x00, 0x01,
+/* sc=19 */ 'p', 'P', 0x10, 0x10, 'p', 'P', 0x10, 0x10, 0x00, 0x01,
+/* sc=1a */ 0xE5, 0xC5, NOP, NOP, '[', '{', 0x1B, NOP, 0x31, 0x01,
+/* sc=1b */ 0xA8, '^', NOP, NOP, ']', '}', 0x1D, NOP, 0x31, 0x00,
+/* sc=1c */ 0x0D, 0x0D, 0x0A, 0x0A, 0x0D, 0x0D, 0x0A, 0x0A, 0x00, 0x00,
+/* sc=1d */ LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, 0xFF, 0x00,
+/* sc=1e */ 'a', 'A', 0x01, 0x01, 'a', 'A', 0x01, 0x01, 0x00, 0x01,
+/* sc=1f */ 's', 'S', 0x13, 0x13, 's', 'S', 0x13, 0x13, 0x00, 0x01,
+/* sc=20 */ 'd', 'D', 0x04, 0x04, 'd', 'D', 0x04, 0x04, 0x00, 0x01,
+/* sc=21 */ 'f', 'F', 0x06, 0x06, 'f', 'F', 0x06, 0x06, 0x00, 0x01,
+/* sc=22 */ 'g', 'G', 0x07, 0x07, 'g', 'G', 0x07, 0x07, 0x00, 0x01,
+/* sc=23 */ 'h', 'H', 0x08, 0x08, 'h', 'H', 0x08, 0x08, 0x00, 0x01,
+/* sc=24 */ 'j', 'J', 0x0A, 0x0A, 'j', 'J', 0x0A, 0x0A, 0x00, 0x01,
+/* sc=25 */ 'k', 'K', 0x0B, 0x0B, 'k', 'K', 0x0B, 0x0B, 0x00, 0x01,
+/* sc=26 */ 'l', 'L', 0x0C, 0x0C, 'l', 'L', 0x0C, 0x0C, 0x00, 0x01,
+/* sc=27 */ 0xF8, 0xD8, NOP, NOP, ';', ':', NOP, NOP, 0x33, 0x01,
+/* sc=28 */ 0xE6, 0xC6, NOP, NOP, '\'', '"', NOP, NOP, 0x33, 0x01,
+/* sc=29 */ '<', '>', NOP, NOP, '\\', '|', 0x1C, NOP, 0x31, 0x00,
+/* sc=2a */ LSH, LSH, LSH, LSH, LSH, LSH, LSH, LSH, 0xFF, 0x00,
+/* sc=2b */ '\'', '*', NOP, NOP, '`', '~', NOP, NOP, 0x33, 0x00,
+/* sc=2c */ 'z', 'Z', 0x1A, 0x1A, 'z', 'Z', 0x1A, 0x1A, 0x00, 0x01,
+/* sc=2d */ 'x', 'X', 0x18, 0x18, 'x', 'X', 0x18, 0x18, 0x00, 0x01,
+/* sc=2e */ 'c', 'C', 0x03, 0x03, 'c', 'C', 0x03, 0x03, 0x00, 0x01,
+/* sc=2f */ 'v', 'V', 0x16, 0x16, 'v', 'V', 0x16, 0x16, 0x00, 0x01,
+/* sc=30 */ 'b', 'B', 0x02, 0x02, 'b', 'B', 0x02, 0x02, 0x00, 0x01,
+/* sc=31 */ 'n', 'N', 0x0E, 0x0E, 'n', 'N', 0x0E, 0x0E, 0x00, 0x01,
+/* sc=32 */ 'm', 'M', 0x0D, 0x0D, 'm', 'M', 0x0D, 0x0D, 0x00, 0x01,
+/* sc=33 */ ',', ';', NOP, NOP, NOP, '<', NOP, NOP, 0x3B, 0x00,
+/* sc=34 */ '.', ':', NOP, NOP, NOP, '>', NOP, NOP, 0x3B, 0x00,
+/* sc=35 */ '-', '_', 0x1F, NOP, '/', '?', NOP, NOP, 0x13, 0x00,
+/* sc=36 */ RSH, RSH, RSH, RSH, RSH, RSH, RSH, RSH, 0xFF, 0x00,
+/* sc=37 */ '*', '*', 0x0A, 0x0A, '*', '*', 0x0A, 0x0A, 0x33, 0x00,
+/* sc=38 */ LALT, LALT, LALT, LALT, LALT, LALT, LALT, LALT, 0xFF, 0x00,
+/* sc=39 */ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 0x00, 0x00,
+/* sc=3a */ CLK, CLK, CLK, CLK, CLK, CLK, CLK, CLK, 0xFF, 0x00,
+/* sc=3b */ F( 1), F(13), F(25), F(37), S( 1), S(11), S( 1), S(11), 0xFF, 0x00,
+/* sc=3c */ F( 2), F(14), F(26), F(38), S( 2), S(12), S( 2), S(12), 0xFF, 0x00,
+/* sc=3d */ F( 3), F(15), F(27), F(39), S( 3), S(13), S( 3), S(13), 0xFF, 0x00,
+/* sc=3e */ F( 4), F(16), F(28), F(40), S( 4), S(14), S( 4), S(14), 0xFF, 0x00,
+/* sc=3f */ F( 5), F(17), F(29), F(41), S( 5), S(15), S( 5), S(15), 0xFF, 0x00,
+/* sc=40 */ F( 6), F(18), F(30), F(42), S( 6), S(16), S( 6), S(16), 0xFF, 0x00,
+/* sc=41 */ F( 7), F(19), F(31), F(43), S( 7), S( 7), S( 7), S( 7), 0xFF, 0x00,
+/* sc=42 */ F( 8), F(20), F(32), F(44), S( 8), S( 8), S( 8), S( 8), 0xFF, 0x00,
+/* sc=43 */ F( 9), F(21), F(33), F(45), S( 9), S( 9), S( 9), S( 9), 0xFF, 0x00,
+/* sc=44 */ F(10), F(22), F(34), F(46), S(10), S(10), S(10), S(10), 0xFF, 0x00,
+/* sc=45 */ NLK, NLK, 0x13, 0x13, NLK, NLK, 0x13, 0x13, 0xCC, 0x00,
+/* sc=46 */ SLK, SLK, 0x7F, 0x7F, SLK, SLK, 0x7F, 0x7F, 0xCC, 0x00,
+/* sc=47 */ F(49), '7', '7', '7', '7', '7', '7', '7', 0x80, 0x02,
+/* sc=48 */ F(50), '8', '8', '8', '8', '8', '8', '8', 0x80, 0x02,
+/* sc=49 */ F(51), '9', '9', '9', '9', '9', '9', '9', 0x80, 0x02,
+/* sc=4a */ F(52), '-', 0x1F, 0x1F, '-', '-', '-', '-', 0x80, 0x02,
+/* sc=4b */ F(53), '4', '4', '4', '4', '4', '4', '4', 0x80, 0x02,
+/* sc=4c */ F(54), '5', '5', '5', '5', '5', '5', '5', 0x80, 0x02,
+/* sc=4d */ F(55), '6', 0x1E, 0x1E, '6', '6', '6', '6', 0x80, 0x02,
+/* sc=4e */ F(56), '+', '+', '+', '+', '+', '+', '+', 0x80, 0x02,
+/* sc=4f */ F(57), '1', '1', '1', '1', '1', '1', '1', 0x80, 0x02,
+/* sc=50 */ F(58), '2', '2', '2', '2', '2', '2', '2', 0x80, 0x02,
+/* sc=51 */ F(59), '3', '3', '3', '3', '3', '3', '3', 0x80, 0x02,
+/* sc=52 */ F(60), '0', '0', '0', '0', '0', '0', '0', 0x80, 0x02,
+/* sc=53 */ 0x7F, '.', 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x00, 0x02,
+/* sc=54 */ 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00,
+/* sc=55 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=56 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=57 */ F(11), F(23), F(35), F(47), S(11), S(11), S(11), S(11), 0xFF, 0x00,
+/* sc=58 */ F(12), F(24), F(36), F(48), S(12), S(12), S(12), S(12), 0xFF, 0x00,
+/* sc=59 */ 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0xFF, 0x02,
+/* sc=5a */ RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, 0xFF, 0x00,
+/* sc=5b */ '/', '/', '/', '/', '/', '/', '/', '/', 0x00, 0x02,
+/* sc=5c */ '*', '*', '*', '*', '*', '*', '*', '*', 0x00, 0x02,
+/* sc=5d */ RALT, RALT, RALT, RALT, RALT, RALT, RALT, RALT, 0xFF, 0x00,
+/* sc=5e */ F(49), F(49), F(49), F(49), F(49), F(49), F(49), F(49), 0xFF, 0x00,
+/* sc=5f */ F(50), F(50), F(50), F(50), F(50), F(50), F(50), F(50), 0xFF, 0x00,
+/* sc=60 */ F(51), F(51), F(51), F(51), F(51), F(51), F(51), F(51), 0xFF, 0x00,
+/* sc=61 */ F(53), F(53), F(53), F(53), F(53), F(53), F(53), F(53), 0xFF, 0x00,
+/* sc=62 */ F(55), F(55), F(55), F(55), F(55), F(55), F(55), F(55), 0xFF, 0x00,
+/* sc=63 */ F(57), F(57), F(57), F(57), F(57), F(57), F(57), F(57), 0xFF, 0x00,
+/* sc=64 */ F(58), F(58), F(58), F(58), F(58), F(58), F(58), F(58), 0xFF, 0x00,
+/* sc=65 */ F(59), F(59), F(59), F(59), F(59), F(59), F(59), F(59), 0xFF, 0x00,
+/* sc=66 */ F(60), F(60), F(60), F(60), F(60), F(60), F(60), F(60), 0xFF, 0x00,
+/* sc=67 */ F(54), F(54), F(54), F(54), F(54), F(54), F(54), F(54), 0xFF, 0x00,
+/* sc=68 */ SLK, SLK, SLK, SLK, SLK, SLK, SLK, SLK, 0xFF, 0x00,
+};
+#endif
+
+#ifdef RUKEYMAP
+keymap_t keymap = { 0xe9, /* keys number */
+/* alt
+ * scan cntrl alt alt cntrl
+ * code base shift cntrl shift alt shift cntrl shift spcl flgs
+ * -------------------------------------------------------------------------------------------
+ */
+/* sc=00 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=01 */ 0x1B, 0x1B, NOP, NOP, META|0x1B, META|0x1B, NOP, NOP, 0x33, 0x00,
+/* sc=02 */ '1', '!', NOP, NOP, META|'1', META|'!', NOP, NOP, 0x33, 0x00,
+/* sc=03 */ '2', '@', 0x00, 0x00, META|'2', META|'@', META|0x00, META|0x00, 0x00, 0x00,
+/* sc=04 */ '3', '#', NOP, NOP, META|'3', META|'#', NOP, NOP, 0x33, 0x00,
+/* sc=05 */ '4', '$', NOP, NOP, META|'4', META|'$', NOP, NOP, 0x33, 0x00,
+/* sc=06 */ '5', '%', NOP, NOP, META|'5', META|'%', NOP, NOP, 0x33, 0x00,
+/* sc=07 */ '6', '^', 0x1E, 0x1E, META|'6', META|'^', META|0x1E, META|0x1E, 0x00, 0x00,
+/* sc=08 */ '7', '&', NOP, NOP, META|'7', META|'&', NOP, NOP, 0x33, 0x00,
+/* sc=09 */ '8', '*', NOP, NOP, META|'8', META|'*', NOP, NOP, 0x33, 0x00,
+/* sc=0a */ '9', '(', NOP, NOP, META|'9', META|'(', NOP, NOP, 0x33, 0x00,
+/* sc=0b */ '0', ')', NOP, NOP, META|'0', META|')', NOP, NOP, 0x33, 0x00,
+/* sc=0c */ '-', '_', 0x1F, 0x1F, META|'-', META|'_', META|0x1F, META|0x1F, 0x00, 0x00,
+/* sc=0d */ '=', '+', NOP, NOP, META|'=', META|'+', NOP, NOP, 0x33, 0x00,
+/* sc=0e */ 0x08, 0x08, 0x7F, 0x7F, META|0x08, META|0x08, META|0x7F, META|0x7F, 0x00, 0x00,
+/* sc=0f */ 0x09, F(16), NOP, NOP, META|0x09, F(16), NOP, NOP, 0x77, 0x00,
+/* sc=10 */ 'q', 'Q', 0x11, 0x11, META|'q', META|'Q', META|0x11, META|0x11, 0x00, 0x01,
+/* sc=11 */ 'w', 'W', 0x17, 0x17, META|'w', META|'W', META|0x17, META|0x17, 0x00, 0x01,
+/* sc=12 */ 'e', 'E', 0x05, 0x05, META|'e', META|'E', META|0x05, META|0x05, 0x00, 0x01,
+/* sc=13 */ 'r', 'R', 0x12, 0x12, META|'r', META|'R', META|0x12, META|0x12, 0x00, 0x01,
+/* sc=14 */ 't', 'T', 0x14, 0x14, META|'t', META|'T', META|0x14, META|0x14, 0x00, 0x01,
+/* sc=15 */ 'y', 'Y', 0x19, 0x19, META|'y', META|'Y', META|0x19, META|0x19, 0x00, 0x01,
+/* sc=16 */ 'u', 'U', 0x15, 0x15, META|'u', META|'U', META|0x15, META|0x15, 0x00, 0x01,
+/* sc=17 */ 'i', 'I', 0x09, 0x09, META|'i', META|'I', META|0x09, META|0x09, 0x00, 0x01,
+/* sc=18 */ 'o', 'O', 0x0F, 0x0F, META|'o', META|'O', META|0x0F, META|0x0F, 0x00, 0x01,
+/* sc=19 */ 'p', 'P', 0x10, 0x10, META|'p', META|'P', META|0x10, META|0x10, 0x00, 0x01,
+/* sc=1a */ '[', '{', 0x1B, 0x1B, META|'[', META|'{', META|0x1B, META|0x1B, 0x00, 0x00,
+/* sc=1b */ ']', '}', 0x1D, 0x1D, META|']', META|'}', META|0x1D, META|0x1D, 0x00, 0x00,
+/* sc=1c */ 0x0D, 0x0D, 0x0A, 0x0A, META|0x0D, META|0x0D, META|0x0A, META|0x0A, 0x00, 0x00,
+/* sc=1d */ LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, 0xFF, 0x00,
+/* sc=1e */ 'a', 'A', 0x01, 0x01, META|'a', META|'A', META|0x01, META|0x01, 0x00, 0x01,
+/* sc=1f */ 's', 'S', 0x13, 0x13, META|'s', META|'S', META|0x13, META|0x13, 0x00, 0x01,
+/* sc=20 */ 'd', 'D', 0x04, 0x04, META|'d', META|'D', META|0x04, META|0x04, 0x00, 0x01,
+/* sc=21 */ 'f', 'F', 0x06, 0x06, META|'f', META|'F', META|0x06, META|0x06, 0x00, 0x01,
+/* sc=22 */ 'g', 'G', 0x07, 0x07, META|'g', META|'G', META|0x07, META|0x07, 0x00, 0x01,
+/* sc=23 */ 'h', 'H', 0x08, 0x08, META|'h', META|'H', META|0x08, META|0x08, 0x00, 0x01,
+/* sc=24 */ 'j', 'J', 0x0A, 0x0A, META|'j', META|'J', META|0x0A, META|0x0A, 0x00, 0x01,
+/* sc=25 */ 'k', 'K', 0x0B, 0x0B, META|'k', META|'K', META|0x0B, META|0x0B, 0x00, 0x01,
+/* sc=26 */ 'l', 'L', 0x0C, 0x0C, META|'l', META|'L', META|0x0C, META|0x0C, 0x00, 0x01,
+/* sc=27 */ ';', ':', NOP, NOP, META|';', META|':', NOP, NOP, 0x33, 0x00,
+/* sc=28 */ '\'', '"', NOP, NOP, META|'\'', META|'"', NOP, NOP, 0x33, 0x00,
+/* sc=29 */ '`', '~', NOP, NOP, META|'`', META|'~', NOP, NOP, 0x33, 0x00,
+/* sc=2a */ LSH, LSH, LSH, LSH, LSH, LSH, LSH, LSH, 0xFF, 0x00,
+/* sc=2b */ '\\', '|', 0x1C, 0x1C, META|'\\', META|'|', META|0x1C, META|0x1C, 0x00, 0x00,
+/* sc=2c */ 'z', 'Z', 0x1A, 0x1A, META|'z', META|'Z', META|0x1A, META|0x1A, 0x00, 0x01,
+/* sc=2d */ 'x', 'X', 0x18, 0x18, META|'x', META|'X', META|0x18, META|0x18, 0x00, 0x01,
+/* sc=2e */ 'c', 'C', 0x03, 0x03, META|'c', META|'C', META|0x03, META|0x03, 0x00, 0x01,
+/* sc=2f */ 'v', 'V', 0x16, 0x16, META|'v', META|'V', META|0x16, META|0x16, 0x00, 0x01,
+/* sc=30 */ 'b', 'B', 0x02, 0x02, META|'b', META|'B', META|0x02, META|0x02, 0x00, 0x01,
+/* sc=31 */ 'n', 'N', 0x0E, 0x0E, META|'n', META|'N', META|0x0E, META|0x0E, 0x00, 0x01,
+/* sc=32 */ 'm', 'M', 0x0D, 0x0D, META|'m', META|'M', META|0x0D, META|0x0D, 0x00, 0x01,
+/* sc=33 */ ',', '<', NOP, NOP, META|',', META|'<', NOP, NOP, 0x33, 0x00,
+/* sc=34 */ '.', '>', NOP, NOP, META|'.', META|'>', NOP, NOP, 0x33, 0x00,
+/* sc=35 */ '/', '?', NOP, NOP, META|'/', META|'?', NOP, NOP, 0x33, 0x00,
+/* sc=36 */ ASH, RSH, RSH, RSH, RSH, RSH, RSH, RSH, 0xFF, 0x00,
+/* sc=37 */ '*', '*', 0x0A, 0x0A, META|'*', META|'*', META|0x0A, META|0x0A, 0x00, 0x00,
+/* sc=38 */ LALT, LALT, LALT, LALT, LALT, LALT, LALT, LALT, 0xFF, 0x00,
+/* sc=39 */ ' ', ' ', ' ', ' ', META|' ', META|' ', META|' ', META|' ', 0x00, 0x00,
+/* sc=3a */ ALK, CLK, CLK, CLK, CLK, CLK, CLK, CLK, 0xFF, 0x00,
+/* sc=3b */ F( 1), F(13), F(25), F(37), S( 1), S(11), S( 1), S(11), 0xFF, 0x00,
+/* sc=3c */ F( 2), F(14), F(26), F(38), S( 2), S(12), S( 2), S(12), 0xFF, 0x00,
+/* sc=3d */ F( 3), F(15), F(27), F(39), S( 3), S(13), S( 3), S(13), 0xFF, 0x00,
+/* sc=3e */ F( 4), F(16), F(28), F(40), S( 4), S(14), S( 4), S(14), 0xFF, 0x00,
+/* sc=3f */ F( 5), F(17), F(29), F(41), S( 5), S(15), S( 5), S(15), 0xFF, 0x00,
+/* sc=40 */ F( 6), F(18), F(30), F(42), S( 6), S(16), S( 6), S(16), 0xFF, 0x00,
+/* sc=41 */ F( 7), F(19), F(31), F(43), S( 7), S( 7), S( 7), S( 7), 0xFF, 0x00,
+/* sc=42 */ F( 8), F(20), F(32), F(44), S( 8), S( 8), S( 8), S( 8), 0xFF, 0x00,
+/* sc=43 */ F( 9), F(21), F(33), F(45), S( 9), S( 9), S( 9), S( 9), 0xFF, 0x00,
+/* sc=44 */ F(10), F(22), F(34), F(46), S(10), S(10), S(10), S(10), 0xFF, 0x00,
+/* sc=45 */ NLK, NLK, NLK, NLK, NLK, NLK, NLK, NLK, 0xFF, 0x00,
+/* sc=46 */ SLK, SLK, SLK, SLK, SLK, SLK, SLK, SLK, 0xFF, 0x00,
+/* sc=47 */ F(49), '7', '7', '7', META|'7', META|'7', META|'7', META|'7', 0x80, 0x02,
+/* sc=48 */ F(50), '8', '8', '8', META|'8', META|'8', META|'8', META|'8', 0x80, 0x02,
+/* sc=49 */ F(51), '9', '9', '9', META|'9', META|'9', META|'9', META|'9', 0x80, 0x02,
+/* sc=4a */ F(52), '-', '-', '-', META|'-', META|'-', META|'-', META|'-', 0x80, 0x02,
+/* sc=4b */ F(53), '4', '4', '4', META|'4', META|'4', META|'4', META|'4', 0x80, 0x02,
+/* sc=4c */ F(48), '5', '5', '5', META|'5', META|'5', META|'5', META|'5', 0x80, 0x02,
+/* sc=4d */ F(55), '6', '6', '6', META|'6', META|'6', META|'6', META|'6', 0x80, 0x02,
+/* sc=4e */ F(56), '+', '+', '+', META|'+', META|'+', META|'+', META|'+', 0x80, 0x02,
+/* sc=4f */ F(57), '1', '1', '1', META|'1', META|'1', META|'1', META|'1', 0x80, 0x02,
+/* sc=50 */ F(58), '2', '2', '2', META|'2', META|'2', META|'2', META|'2', 0x80, 0x02,
+/* sc=51 */ F(59), '3', '3', '3', META|'3', META|'3', META|'3', META|'3', 0x80, 0x02,
+/* sc=52 */ F(60), '0', '0', '0', META|'0', META|'0', META|'0', META|'0', 0x80, 0x02,
+/* sc=53 */ F(54), '.', 0x7F, 0x7F, META|0x7F, META|0x7F, META|0x7F, META|0x7F, 0x80, 0x02,
+/* sc=54 */ ALK, ALK, ALK, ALK, ALK, ALK, ALK, ALK, 0xFF, 0x00,
+/* sc=55 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=56 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=57 */ F(11), F(23), F(35), F(47), S(11), S(11), S(11), S(11), 0xFF, 0x00,
+/* sc=58 */ F(12), F(24), F(36), F(48), S(12), S(12), S(12), S(12), 0xFF, 0x00,
+/* sc=59 */ 0x0D, 0x0D, 0x0A, 0x0A, META|0x0D, META|0x0D, META|0x0A, META|0x0A, 0x00, 0x00,
+/* sc=5a */ RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, 0xFF, 0x00,
+/* sc=5b */ '/', '/', NOP, NOP, META|'/', META|'/', NOP, NOP, 0x33, 0x00,
+/* sc=5c */ CLK, ALK, ALK, ALK, ALK, ALK, ALK, ALK, 0xFF, 0x00,
+/* sc=5d */ RALT, RALT, RALT, RALT, RALT, RALT, RALT, RALT, 0xFF, 0x00,
+/* sc=5e */ F(49), F(49), F(49), F(49), F(49), F(49), F(49), F(49), 0xFF, 0x00,
+/* sc=5f */ F(50), F(50), F(50), F(50), F(50), F(50), F(50), F(50), 0xFF, 0x00,
+/* sc=60 */ F(51), F(51), F(51), F(51), F(51), F(51), F(51), F(51), 0xFF, 0x00,
+/* sc=61 */ F(53), F(53), F(53), F(53), F(53), F(53), F(53), F(53), 0xFF, 0x00,
+/* sc=62 */ F(55), F(55), F(55), F(55), F(55), F(55), F(55), F(55), 0xFF, 0x00,
+/* sc=63 */ F(57), F(57), F(57), F(57), F(57), F(57), F(57), F(57), 0xFF, 0x00,
+/* sc=64 */ F(58), F(58), F(58), F(58), F(58), F(58), F(58), F(58), 0xFF, 0x00,
+/* sc=65 */ F(59), F(59), F(59), F(59), F(59), F(59), F(59), F(59), 0xFF, 0x00,
+/* sc=66 */ F(60), F(60), F(60), F(60), F(60), F(60), F(60), F(60), 0xFF, 0x00,
+/* sc=67 */ F(54), F(54), 0x7F, 0x7F, META|0x7F, META|0x7F, META|0x7F, META|0x7F, 0xC0, 0x00,
+/* sc=68 */ SLK, SLK, SLK, SLK, SLK, SLK, SLK, SLK, 0xFF, 0x00,
+/* sc=69 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=6a */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=6b */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=6c */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=6d */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=6e */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=6f */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=70 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=71 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=72 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=73 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=74 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=75 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=76 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=77 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=78 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=79 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=7a */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=7b */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=7c */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=7d */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=7e */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=7f */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* extended (ALTGR LOCK keys) */
+/* sc=00 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=01 */ 0x1B, 0x1B, NOP, NOP, META|0x1B, META|0x1B, NOP, NOP, 0x33, 0x00,
+/* sc=02 */ '!', '1', NOP, NOP, META|'1', META|'!', NOP, NOP, 0x33, 0x00,
+/* sc=03 */ '"', '2', 0x00, 0x00, META|'2', META|'@', META|0x00, META|0x00, 0x00, 0x00,
+/* sc=04 */ '\'', '3', NOP, NOP, META|'3', META|'#', NOP, NOP, 0x33, 0x00,
+/* sc=05 */ ';', '4', NOP, NOP, META|'4', META|'$', NOP, NOP, 0x33, 0x00,
+/* sc=06 */ ':', '5', NOP, NOP, META|'5', META|'%', NOP, NOP, 0x33, 0x00,
+/* sc=07 */ ',', '6', 0x1E, 0x1E, META|'6', META|'^', META|0x1E, META|0x1E, 0x00, 0x00,
+/* sc=08 */ '.', '7', NOP, NOP, META|'7', META|'&', NOP, NOP, 0x33, 0x00,
+/* sc=09 */ '*', '8', NOP, NOP, META|'8', META|'*', NOP, NOP, 0x33, 0x00,
+/* sc=0a */ '(', '9', NOP, NOP, META|'9', META|'(', NOP, NOP, 0x33, 0x00,
+/* sc=0b */ ')', '0', NOP, NOP, META|'0', META|')', NOP, NOP, 0x33, 0x00,
+/* sc=0c */ '_', '-', 0x1F, 0x1F, META|'-', META|'_', META|0x1F, META|0x1F, 0x00, 0x00,
+/* sc=0d */ '+', '=', NOP, NOP, META|'=', META|'+', NOP, NOP, 0x33, 0x00,
+/* sc=0e */ 0x08, 0x08, 0x7F, 0x7F, META|0x08, META|0x08, META|0x7F, META|0x7F, 0x00, 0x00,
+/* sc=0f */ 0x09, F(16), NOP, NOP, META|0x09, F(16), NOP, NOP, 0x77, 0x00,
+/* sc=10 */ 0xca, 0xea, 0x11, 0x11, META|'q', META|'Q', META|0x11, META|0x11, 0x00, 0x01,
+/* sc=11 */ 0xc3, 0xe3, 0x17, 0x17, META|'w', META|'W', META|0x17, META|0x17, 0x00, 0x01,
+/* sc=12 */ 0xd5, 0xf5, 0x05, 0x05, META|'e', META|'E', META|0x05, META|0x05, 0x00, 0x01,
+/* sc=13 */ 0xcb, 0xeb, 0x12, 0x12, META|'r', META|'R', META|0x12, META|0x12, 0x00, 0x01,
+/* sc=14 */ 0xc5, 0xe5, 0x14, 0x14, META|'t', META|'T', META|0x14, META|0x14, 0x00, 0x01,
+/* sc=15 */ 0xce, 0xee, 0x19, 0x19, META|'y', META|'Y', META|0x19, META|0x19, 0x00, 0x01,
+/* sc=16 */ 0xc7, 0xe7, 0x15, 0x15, META|'u', META|'U', META|0x15, META|0x15, 0x00, 0x01,
+/* sc=17 */ 0xdb, 0xfb, 0x09, 0x09, META|'i', META|'I', META|0x09, META|0x09, 0x00, 0x01,
+/* sc=18 */ 0xdd, 0xfd, 0x0F, 0x0F, META|'o', META|'O', META|0x0F, META|0x0F, 0x00, 0x01,
+/* sc=19 */ 0xda, 0xfa, 0x10, 0x10, META|'p', META|'P', META|0x10, META|0x10, 0x00, 0x01,
+/* sc=1a */ 0xc8, 0xe8, 0x1B, 0x1B, META|'[', META|'{', META|0x1B, META|0x1B, 0x00, 0x01,
+/* sc=1b */ 0xdf, 0xff, 0x1D, 0x1D, META|']', META|'}', META|0x1D, META|0x1D, 0x00, 0x01,
+/* sc=1c */ 0x0D, 0x0D, 0x0A, 0x0A, META|0x0D, META|0x0D, META|0x0A, META|0x0A, 0x00, 0x00,
+/* sc=1d */ LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, LCTR, 0xFF, 0x00,
+/* sc=1e */ 0xc6, 0xe6, 0x01, 0x01, META|'a', META|'A', META|0x01, META|0x01, 0x00, 0x01,
+/* sc=1f */ 0xd9, 0xf9, 0x13, 0x13, META|'s', META|'S', META|0x13, META|0x13, 0x00, 0x01,
+/* sc=20 */ 0xd7, 0xf7, 0x04, 0x04, META|'d', META|'D', META|0x04, META|0x04, 0x00, 0x01,
+/* sc=21 */ 0xc1, 0xe1, 0x06, 0x06, META|'f', META|'F', META|0x06, META|0x06, 0x00, 0x01,
+/* sc=22 */ 0xd0, 0xf0, 0x07, 0x07, META|'g', META|'G', META|0x07, META|0x07, 0x00, 0x01,
+/* sc=23 */ 0xd2, 0xf2, 0x08, 0x08, META|'h', META|'H', META|0x08, META|0x08, 0x00, 0x01,
+/* sc=24 */ 0xcf, 0xef, 0x0A, 0x0A, META|'j', META|'J', META|0x0A, META|0x0A, 0x00, 0x01,
+/* sc=25 */ 0xcc, 0xec, 0x0B, 0x0B, META|'k', META|'K', META|0x0B, META|0x0B, 0x00, 0x01,
+/* sc=26 */ 0xc4, 0xe4, 0x0C, 0x0C, META|'l', META|'L', META|0x0C, META|0x0C, 0x00, 0x01,
+/* sc=27 */ 0xd6, 0xf6, NOP, NOP, META|';', META|':', NOP, NOP, 0x33, 0x01,
+/* sc=28 */ 0xdc, 0xfc, NOP, NOP, META|'\'', META|'"', NOP, NOP, 0x33, 0x01,
+/* sc=29 */ 0xa3, 0xb3, NOP, NOP, META|'`', META|'~', NOP, NOP, 0x33, 0x01,
+/* sc=2a */ LSH, LSH, LSH, LSH, LSH, LSH, LSH, LSH, 0xFF, 0x00,
+/* sc=2b */ '\\', '|', 0x1C, 0x1C, META|'\\', META|'|', META|0x1C, META|0x1C, 0x00, 0x00,
+/* sc=2c */ 0xd1, 0xf1, 0x1A, 0x1A, META|'z', META|'Z', META|0x1A, META|0x1A, 0x00, 0x01,
+/* sc=2d */ 0xde, 0xfe, 0x18, 0x18, META|'x', META|'X', META|0x18, META|0x18, 0x00, 0x01,
+/* sc=2e */ 0xd3, 0xf3, 0x03, 0x03, META|'c', META|'C', META|0x03, META|0x03, 0x00, 0x01,
+/* sc=2f */ 0xcd, 0xed, 0x16, 0x16, META|'v', META|'V', META|0x16, META|0x16, 0x00, 0x01,
+/* sc=30 */ 0xc9, 0xe9, 0x02, 0x02, META|'b', META|'B', META|0x02, META|0x02, 0x00, 0x01,
+/* sc=31 */ 0xd4, 0xf4, 0x0E, 0x0E, META|'n', META|'N', META|0x0E, META|0x0E, 0x00, 0x01,
+/* sc=32 */ 0xd8, 0xf8, 0x0D, 0x0D, META|'m', META|'M', META|0x0D, META|0x0D, 0x00, 0x01,
+/* sc=33 */ 0xc2, 0xe2, NOP, NOP, META|',', META|'<', NOP, NOP, 0x33, 0x01,
+/* sc=34 */ 0xc0, 0xe0, NOP, NOP, META|'.', META|'>', NOP, NOP, 0x33, 0x01,
+/* sc=35 */ '/', '?', NOP, NOP, META|'/', META|'?', NOP, NOP, 0x33, 0x00,
+/* sc=36 */ ASH, RSH, RSH, RSH, RSH, RSH, RSH, RSH, 0xFF, 0x00,
+/* sc=37 */ '*', '*', 0x0A, 0x0A, META|'*', META|'*', META|0x0A, META|0x0A, 0x00, 0x00,
+/* sc=38 */ LALT, LALT, LALT, LALT, LALT, LALT, LALT, LALT, 0xFF, 0x00,
+/* sc=39 */ ' ', ' ', ' ', ' ', META|' ', META|' ', META|' ', META|' ', 0x00, 0x00,
+/* sc=3a */ ALK, CLK, CLK, CLK, CLK, CLK, CLK, CLK, 0xFF, 0x00,
+/* sc=3b */ F( 1), F(13), F(25), F(37), S( 1), S(11), S( 1), S(11), 0xFF, 0x00,
+/* sc=3c */ F( 2), F(14), F(26), F(38), S( 2), S(12), S( 2), S(12), 0xFF, 0x00,
+/* sc=3d */ F( 3), F(15), F(27), F(39), S( 3), S(13), S( 3), S(13), 0xFF, 0x00,
+/* sc=3e */ F( 4), F(16), F(28), F(40), S( 4), S(14), S( 4), S(14), 0xFF, 0x00,
+/* sc=3f */ F( 5), F(17), F(29), F(41), S( 5), S(15), S( 5), S(15), 0xFF, 0x00,
+/* sc=40 */ F( 6), F(18), F(30), F(42), S( 6), S(16), S( 6), S(16), 0xFF, 0x00,
+/* sc=41 */ F( 7), F(19), F(31), F(43), S( 7), S( 7), S( 7), S( 7), 0xFF, 0x00,
+/* sc=42 */ F( 8), F(20), F(32), F(44), S( 8), S( 8), S( 8), S( 8), 0xFF, 0x00,
+/* sc=43 */ F( 9), F(21), F(33), F(45), S( 9), S( 9), S( 9), S( 9), 0xFF, 0x00,
+/* sc=44 */ F(10), F(22), F(34), F(46), S(10), S(10), S(10), S(10), 0xFF, 0x00,
+/* sc=45 */ NLK, NLK, NLK, NLK, NLK, NLK, NLK, NLK, 0xFF, 0x00,
+/* sc=46 */ SLK, SLK, SLK, SLK, SLK, SLK, SLK, SLK, 0xFF, 0x00,
+/* sc=47 */ F(49), '7', '7', '7', META|'7', META|'7', META|'7', META|'7', 0x80, 0x02,
+/* sc=48 */ F(50), '8', '8', '8', META|'8', META|'8', META|'8', META|'8', 0x80, 0x02,
+/* sc=49 */ F(51), '9', '9', '9', META|'9', META|'9', META|'9', META|'9', 0x80, 0x02,
+/* sc=4a */ F(52), '-', '-', '-', META|'-', META|'-', META|'-', META|'-', 0x80, 0x02,
+/* sc=4b */ F(53), '4', '4', '4', META|'4', META|'4', META|'4', META|'4', 0x80, 0x02,
+/* sc=4c */ F(48), '5', '5', '5', META|'5', META|'5', META|'5', META|'5', 0x80, 0x02,
+/* sc=4d */ F(55), '6', '6', '6', META|'6', META|'6', META|'6', META|'6', 0x80, 0x02,
+/* sc=4e */ F(56), '+', '+', '+', META|'+', META|'+', META|'+', META|'+', 0x80, 0x02,
+/* sc=4f */ F(57), '1', '1', '1', META|'1', META|'1', META|'1', META|'1', 0x80, 0x02,
+/* sc=50 */ F(58), '2', '2', '2', META|'2', META|'2', META|'2', META|'2', 0x80, 0x02,
+/* sc=51 */ F(59), '3', '3', '3', META|'3', META|'3', META|'3', META|'3', 0x80, 0x02,
+/* sc=52 */ F(60), '0', '0', '0', META|'0', META|'0', META|'0', META|'0', 0x80, 0x02,
+/* sc=53 */ F(54), '.', 0x7F, 0x7F, META|0x7F, META|0x7F, META|0x7F, META|0x7F, 0x80, 0x02,
+/* sc=54 */ ALK, ALK, ALK, ALK, ALK, ALK, ALK, ALK, 0xFF, 0x00,
+/* sc=55 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=56 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, 0xFF, 0x00,
+/* sc=57 */ F(11), F(23), F(35), F(47), S(11), S(11), S(11), S(11), 0xFF, 0x00,
+/* sc=58 */ F(12), F(24), F(36), F(48), S(12), S(12), S(12), S(12), 0xFF, 0x00,
+/* sc=59 */ 0x0D, 0x0D, 0x0A, 0x0A, META|0x0D, META|0x0D, META|0x0A, META|0x0A, 0x00, 0x00,
+/* sc=5a */ RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, RCTR, 0xFF, 0x00,
+/* sc=5b */ '/', '/', NOP, NOP, META|'/', META|'/', NOP, NOP, 0x33, 0x00,
+/* sc=5c */ CLK, ALK, ALK, ALK, ALK, ALK, ALK, ALK, 0xFF, 0x00,
+/* sc=5d */ RALT, RALT, RALT, RALT, RALT, RALT, RALT, RALT, 0xFF, 0x00,
+/* sc=5e */ F(49), F(49), F(49), F(49), F(49), F(49), F(49), F(49), 0xFF, 0x00,
+/* sc=5f */ F(50), F(50), F(50), F(50), F(50), F(50), F(50), F(50), 0xFF, 0x00,
+/* sc=60 */ F(51), F(51), F(51), F(51), F(51), F(51), F(51), F(51), 0xFF, 0x00,
+/* sc=61 */ F(53), F(53), F(53), F(53), F(53), F(53), F(53), F(53), 0xFF, 0x00,
+/* sc=62 */ F(55), F(55), F(55), F(55), F(55), F(55), F(55), F(55), 0xFF, 0x00,
+/* sc=63 */ F(57), F(57), F(57), F(57), F(57), F(57), F(57), F(57), 0xFF, 0x00,
+/* sc=64 */ F(58), F(58), F(58), F(58), F(58), F(58), F(58), F(58), 0xFF, 0x00,
+/* sc=65 */ F(59), F(59), F(59), F(59), F(59), F(59), F(59), F(59), 0xFF, 0x00,
+/* sc=66 */ F(60), F(60), F(60), F(60), F(60), F(60), F(60), F(60), 0xFF, 0x00,
+/* sc=67 */ F(54), F(54), 0x7F, 0x7F, META|0x7F, META|0x7F, META|0x7F, META|0x7F, 0xC0, 0x00,
+/* sc=68 */ SLK, SLK, SLK, SLK, SLK, SLK, SLK, SLK, 0xFF, 0x00,
+};
+
+#endif
-keymap_t key_map = { 107, /* US iso8859 keymap */
+#if !defined(DKKEYMAP) && !defined(UKKEYMAP) && !defined(GRKEYMAP) && !defined(SWKEYMAP) && !defined(RUKEYMAP)
+keymap_t key_map = { 0x69, /* US iso8859 keymap */
/* alt
* scan cntrl alt alt cntrl
* code base shift cntrl shift alt shift cntrl shift spcl flgs
diff --git a/sys/isa/syscons.c b/sys/isa/syscons.c
index 6081c65..6828aca 100644
--- a/sys/isa/syscons.c
+++ b/sys/isa/syscons.c
@@ -1,3 +1,4 @@
+#define STAR_SAVER
/*-
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
@@ -39,11 +40,10 @@
*
* virtual consoles, SYSV ioctl's, ANSI emulation
*
- * @(#)syscons.c 0.2 930402
- *
- * Modified further to provide full (updated) pccons emulation and
- * hooks for init_main.c. Jordan Hubbard, 930725
+ * @(#)syscons.c 0.2b 930531
*
+ * Further changes 29 July 93 by Jordan Hubbard - provide full pccons and
+ * FreeBSD compatability.
*/
#include "param.h"
@@ -63,7 +63,7 @@
#include "i386/isa/icu.h"
#include "i386/isa/isa.h"
#include "i386/isa/isa_device.h"
-#include "i386/include/pc/display.h"
+#include "machine/pc/display.h"
#include "i386/i386/cons.h"
#include "machine/psl.h"
#include "machine/frame.h"
@@ -71,7 +71,6 @@
#include "ddb.h"
#include "iso8859.font"
#include "kbdtables.h"
-/*#include "asm.h"*/
#if NSC > 0
#ifndef NCONS
@@ -79,7 +78,8 @@
#endif
/* status flags */
-#define LOCK_KEY_MASK 0x00007
+#define LOCK_KEY_MASK 0x0000F
+#define LED_MASK 0x00007
#define UNKNOWN_MODE 0x00010
#define KBD_RAW_MODE 0x00020
#define SWITCH_WAIT_REL 0x00040
@@ -90,9 +90,10 @@
#define CGA_BUF 0xFE0B8000
#define VGA_BUF 0xFE0A0000
#define VIDEOMEM 0x000A0000
+#define MEMSIZE 0x00020000
/* misc defines */
-#define MAX_ESC_PAR 2
+#define MAX_ESC_PAR 3
#define TEXT80x25 1
#define TEXT80x50 2
#define COL 80
@@ -114,21 +115,27 @@
#define GDCIDX 0x3CE /* graph data controller idx */
#define GDCREG 0x3CF /* graph data controller data */
-typedef struct scr_stat {
- u_short *crt_base; /* address of screen memory */
- u_short *scr; /* buffer when off screen */
- u_short *crtat; /* cursor address */
+typedef struct term_stat {
int esc; /* processing escape sequence */
int n_par; /* # of parameters to ESC */
int last_par; /* last parameter # */
int par[MAX_ESC_PAR]; /* contains ESC parameters */
+ int attr; /* current attributes */
+ int std_attr; /* normal attributes */
+ int rev_attr; /* reverse attributes */
+} term_stat;
+
+typedef struct scr_stat {
+ u_short *crt_base; /* address of screen memory */
+ u_short *scr; /* buffer when off screen */
+ u_short *crtat; /* cursor address */
int posx; /* current X position */
int posy; /* current Y position */
int max_posx; /* X size */
int max_posy; /* X size */
- int attr; /* current attributes */
- int std_attr; /* normal attributes */
- int rev_attr; /* reverse attributes */
+ term_stat term; /* terminal emulation stuff */
+ char cursor_start; /* cursor start line # */
+ char cursor_end; /* cursor start end # */
u_char border; /* border color */
u_short bell_duration;
u_short bell_pitch;
@@ -137,24 +144,46 @@ typedef struct scr_stat {
pid_t pid; /* pid of controlling proc */
struct proc *proc; /* proc* of controlling proc */
struct vt_mode smode; /* switch mode */
- } scr_stat;
+} scr_stat;
+
+typedef struct default_attr {
+ int std_attr; /* normal attributes */
+ int rev_attr; /* reverse attributes */
+} default_attr;
+
+static default_attr user_default = {
+ (FG_LIGHTGREY | BG_BLACK) << 8,
+ (FG_BLACK | BG_LIGHTGREY) << 8
+};
+
+static default_attr kernel_default = {
+ (FG_WHITE | BG_BLACK) << 8,
+ (FG_BLACK | BG_LIGHTGREY) << 8
+};
+
+static default_attr *current_default;
static scr_stat cons_scr_stat[NCONS];
static scr_stat *cur_scr_stat = &cons_scr_stat[0];
static scr_stat *new_scp, *old_scp;
+static term_stat kernel_console;
static int switch_in_progress = 0;
u_short *Crtat = (u_short *)MONO_BUF;
static u_short *crtat = 0;
static u_int crtc_addr = MONO_BASE;
-static u_char shfts = 0, ctls = 0, alts = 0;
+static char crtc_vga = 0;
+static u_char shfts = 0, ctls = 0, alts = 0, agrs = 0;
+static u_char nlkcnt = 0, clkcnt = 0, slkcnt = 0, alkcnt = 0;
static char palette[3*256];
static const u_int n_fkey_tab = sizeof(fkey_tab) / sizeof(*fkey_tab);
static int cur_cursor_pos = -1;
static char in_putc, nx_scr;
static char saved_console = -1; /* saved console number */
-static long blank_time = 0; /* screen saver timout value */
-static scrmap_t scr_map;
+static long scrn_blank_time = 0; /* screen saver timout value */
+static int scrn_blanked = 0; /* screen saver active flag */
+static long scrn_time_stamp;
+static u_char scr_map[256];
struct tty pccons[NCONS];
struct tty *cur_pccons = &pccons[0];
@@ -171,7 +200,7 @@ struct pcconsoftc {
char cs_lastc; /* last char sent */
int cs_timo; /* timeouts since interrupt */
u_long cs_wedgecnt; /* times restarted */
- } pcconsoftc = {0, 0, 0, 0};
+} pcconsoftc = {0, 0, 0, 0};
/* special characters */
@@ -203,17 +232,18 @@ static struct tty *get_pccons(dev_t dev);
static scr_stat *get_scr_stat(dev_t dev);
static int get_scr_num(scr_stat *scp);
static void cursor_shape(int start, int end);
+static void get_cursor_shape(int *start, int *end);
static void cursor_pos(void);
static void clear_screen(scr_stat *scp);
static switch_scr(u_int next_scr);
static void exchange_scr(void);
-static void move_crsr(scr_stat *scp, u_int x, u_int y);
+static void move_crsr(scr_stat *scp, int x, int y);
static void move_up(u_short *s, u_short *d, u_int len);
static void move_down(u_short *s, u_short *d, u_int len);
static void scan_esc(scr_stat *scp, u_char c);
static void ansi_put(scr_stat *scp, u_char c);
void consinit(void);
-static void sput(u_char c, u_char ca);
+static void sput(u_char c);
static u_char *get_fstr(u_int c, u_int *len);
static update_leds(int which);
void reset_cpu(void);
@@ -231,13 +261,13 @@ static change_winsize(struct tty *tp, int x, int y);
struct isa_driver scdriver = {
pcprobe, pcattach, "sc",
- };
+};
int pcprobe(struct isa_device *dev)
{
u_char c;
- int i, again = 0;
+ int again = 0;
/* Enable interrupts and keyboard controller */
kbd_wait();
@@ -254,11 +284,7 @@ int pcprobe(struct isa_device *dev)
again = 1;
}
}
- /*
- * pick up keyboard reset return code SOS
- * some keyboards / controllers hangs if this is enabled
- */
- /* while ((c=inb(KB_DATA))!=0xAA); */
+ kbd_wait();
return 1;
}
@@ -266,29 +292,42 @@ int pcprobe(struct isa_device *dev)
int pcattach(struct isa_device *dev)
{
scr_stat *scp;
- int i;
+ int start = -1, end = -1, i;
- if (crtc_addr == MONO_BASE)
- printf("VGA mono");
- else
- printf("VGA color");
+ if (crtc_vga)
+ if (crtc_addr == MONO_BASE)
+ printf(" VGA mono");
+ else
+ printf(" VGA color");
+ else
+ if (crtc_addr == MONO_BASE)
+ printf(" MDA/hercules");
+ else
+ printf(" CGA/EGA");
if (NCONS > 1)
printf(" <%d virtual consoles>\n", NCONS);
else
printf("\n");
- save_palette();
- load_font(0, 16, font_8x16);
- load_font(1, 8, font_8x8);
+ if (crtc_vga) {
+ get_cursor_shape(&start, &end);
+ save_palette();
+ load_font(0, 16, font_8x16);
+ load_font(1, 8, font_8x8);
+ load_font(2, 14, font_8x14);
+ }
+ current_default = &user_default;
for (i = 0; i < NCONS; i++) {
scp = &cons_scr_stat[i];
- scp->mode = TEXT80x25;
scp->scr = (u_short *)malloc(COL * ROW * 2, M_DEVBUF, M_NOWAIT);
- scp->std_attr = (FG_LIGHTGREY | BG_BLACK) << 8;
- scp->rev_attr = (FG_BLACK | BG_LIGHTGREY) << 8;
- scp->attr = scp->std_attr;
+ scp->mode = TEXT80x25;
+ scp->term.esc = 0;
+ scp->term.std_attr = current_default->std_attr;
+ scp->term.rev_attr = current_default->rev_attr;
+ scp->term.attr = scp->term.std_attr;
scp->border = BG_BLACK;
- scp->esc = 0;
+ scp->cursor_start = start;
+ scp->cursor_end = end;
scp->max_posx = COL;
scp->max_posy = ROW;
scp->bell_pitch = 800;
@@ -299,9 +338,10 @@ int pcattach(struct isa_device *dev)
scp->smode.mode = VT_AUTO;
if (i > 0) {
scp->crt_base = scp->crtat = scp->scr;
- fillw(scp->attr | ' ', scp->scr, COL * ROW);
+ fillw(scp->term.attr|scr_map[0x20], scp->scr, COL*ROW);
}
}
+ /* get cursor going */
cursor_pos();
}
@@ -406,7 +446,10 @@ scintr(dev_t dev, int irq, int cpl)
int c, len;
u_char *cp;
- scrn_saver(0);
+ /* make screensaver happy */
+ scrn_time_stamp = time.tv_sec;
+ if (scrn_blanked)
+ scrn_saver(0);
c = sgetc(1);
if (c & 0x100)
return;
@@ -439,42 +482,50 @@ pcparam(struct tty *tp, struct termios *t)
pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
{
- int i, error;
+ int error;
struct tty *tp;
struct syscframe *fp;
scr_stat *scp;
tp = get_pccons(dev);
if (!tp)
- return(ENXIO);
+ return ENXIO;
scp = get_scr_stat(tp->t_dev);
switch (cmd) { /* process console hardware related ioctl's */
case CONS_BLANKTIME: /* set screen saver timeout (0 = no saver) */
- blank_time = *(int*)data;
+ scrn_blank_time = *(int*)data;
return 0;
case CONS_80x25TEXT: /* set 80x25 text mode */
+ if (!crtc_vga)
+ return ENXIO;
scp->mode = TEXT80x25;
scp->max_posy = 25;
- set_mode(scp);
- clear_screen(scp);
- change_winsize(tp, scp->max_posx, scp->max_posy);
free(scp->scr, M_DEVBUF);
scp->scr = (u_short *)malloc(scp->max_posx*scp->max_posy*2,
M_DEVBUF, M_NOWAIT);
+ if (scp != cur_scr_stat)
+ scp->crt_base = scp->scr;
+ set_mode(scp);
+ clear_screen(scp);
+ change_winsize(tp, scp->max_posx, scp->max_posy);
return 0;
case CONS_80x50TEXT: /* set 80x50 text mode */
+ if (!crtc_vga)
+ return ENXIO;
scp->mode = TEXT80x50;
scp->max_posy = 50;
- set_mode(scp);
- clear_screen(scp);
- change_winsize(tp, scp->max_posx, scp->max_posy);
free(scp->scr, M_DEVBUF);
scp->scr = (u_short *)malloc(scp->max_posx*scp->max_posy*2,
M_DEVBUF, M_NOWAIT);
+ if (scp != cur_scr_stat)
+ scp->crt_base = scp->scr;
+ set_mode(scp);
+ clear_screen(scp);
+ change_winsize(tp, scp->max_posx, scp->max_posy);
return 0;
case CONS_GETINFO: /* get current (virtual) console info */
@@ -485,10 +536,10 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
ptr->mv_row = scp->posy;
ptr->mv_csz = scp->max_posx;
ptr->mv_rsz = scp->max_posy;
- ptr->mv_norm.fore = (scp->std_attr & 0x0f00)>>8;
- ptr->mv_norm.back = (scp->std_attr & 0xf000)>>12;
- ptr->mv_rev.fore = (scp->rev_attr & 0x0f00)>>8;
- ptr->mv_rev.back = (scp->rev_attr & 0xf000)>>12;
+ ptr->mv_norm.fore = (scp->term.std_attr & 0x0f00)>>8;
+ ptr->mv_norm.back = (scp->term.std_attr & 0xf000)>>12;
+ ptr->mv_rev.fore = (scp->term.rev_attr & 0x0f00)>>8;
+ ptr->mv_rev.back = (scp->term.rev_attr & 0xf000)>>12;
ptr->mv_grfc.fore = 0; /* not supported */
ptr->mv_grfc.back = 0; /* not supported */
ptr->mv_ovscan = scp->border;
@@ -586,9 +637,12 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
switch (*data) {
case KD_TEXT: /* switch to TEXT (known) mode */
/* restore fonts & palette ! */
- load_font(0, 16, font_8x16);
- load_font(1, 8, font_8x8);
- load_palette();
+ if (crtc_vga) {
+ load_font(0, 16, font_8x16);
+ load_font(1, 8, font_8x8);
+ load_font(2, 14, font_8x14);
+ load_palette();
+ }
/* FALL THROUGH */
case KD_TEXT1: /* switch to TEXT (known) mode */
@@ -611,17 +665,19 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
return 0;
case KDSBORDER: /* set border color of this (virtual) console */
+ if (!crtc_vga)
+ return ENXIO;
scp->border = *data;
if (scp == cur_scr_stat)
set_border(scp->border);
return 0;
case KDSKBSTATE: /* set keyboard state (locks) */
- if (*data >= 0 && *data < 4) {
+ if (*data >= 0 && *data <= LOCK_KEY_MASK) {
scp->status &= ~LOCK_KEY_MASK;
scp->status |= *data;
if (scp == cur_scr_stat)
- update_leds(scp->status & LOCK_KEY_MASK);
+ update_leds(scp->status & LED_MASK);
return 0;
}
return EINVAL;
@@ -685,14 +741,17 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
return 0;
case KDSETLED: /* set keyboard LED status */
- scp->status &= ~LOCK_KEY_MASK;
- scp->status |= (*data & LOCK_KEY_MASK);
- if (scp == cur_scr_stat)
- update_leds(scp->status & LOCK_KEY_MASK);
- return 0;
+ if (*data >= 0 && *data <= LED_MASK) {
+ scp->status &= ~LED_MASK;
+ scp->status |= *data;
+ if (scp == cur_scr_stat)
+ update_leds(scp->status & LED_MASK);
+ return 0;
+ }
+ return EINVAL;
case KDGETLED: /* get keyboard LED status */
- *data = scp->status & LOCK_KEY_MASK;
+ *data = scp->status & LED_MASK;
return 0;
case GETFKEY: /* get functionkey string */
@@ -720,11 +779,11 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
return EINVAL;
case GIO_SCRNMAP: /* get output translation table */
- bcopy(&scr_map, data, sizeof(scrmap_t));
+ bcopy(&scr_map, data, sizeof(scr_map));
return 0;
case PIO_SCRNMAP: /* set output translation table */
- bcopy(data, &scr_map, sizeof(scrmap_t));
+ bcopy(data, &scr_map, sizeof(scr_map));
return 0;
case GIO_KEYMAP: /* get keyboard translation table */
@@ -736,30 +795,42 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
return 0;
case PIO_FONT8x8: /* set 8x8 dot font */
- bcopy(data, &font_8x8, sizeof(fnt8_t));
- load_font(1, 8, font_8x16);
+ if (!crtc_vga)
+ return ENXIO;
+ bcopy(data, &font_8x8, sizeof(font_8x8));
+ load_font(1, 8, font_8x8);
return 0;
case GIO_FONT8x8: /* get 8x8 dot font */
- bcopy(&font_8x8, data, sizeof(fnt8_t));
+ if (!crtc_vga)
+ return ENXIO;
+ bcopy(&font_8x8, data, sizeof(font_8x8));
return 0;
case PIO_FONT8x14: /* set 8x14 dot font */
- bcopy(data, &font_8x14, sizeof(fnt14_t));
+ if (!crtc_vga)
+ return ENXIO;
+ bcopy(data, &font_8x14, sizeof(font_8x14));
load_font(2, 14, font_8x14);
return 0;
case GIO_FONT8x14: /* get 8x14 dot font */
- bcopy(&font_8x14, data, sizeof(fnt14_t));
+ if (!crtc_vga)
+ return ENXIO;
+ bcopy(&font_8x14, data, sizeof(font_8x14));
return 0;
case PIO_FONT8x16: /* set 8x16 dot font */
- bcopy(data, &font_8x16, sizeof(fnt16_t));
+ if (!crtc_vga)
+ return ENXIO;
+ bcopy(data, &font_8x16, sizeof(font_8x16));
load_font(0, 16, font_8x16);
return 0;
case GIO_FONT8x16: /* get 8x16 dot font */
- bcopy(&font_8x16, data, sizeof(fnt16_t));
+ if (!crtc_vga)
+ return ENXIO;
+ bcopy(&font_8x16, data, sizeof(font_8x16));
return 0;
case CONSOLE_X_MODE_ON: /* just to be compatible */
@@ -777,8 +848,12 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
case CONSOLE_X_MODE_OFF:/* just to be compatible */
fp = (struct syscframe *)p->p_regs;
fp->sf_eflags &= ~PSL_IOPL;
- load_font(0, 16, font_8x16);
- load_font(1, 8, font_8x8);
+ if (crtc_vga) {
+ load_font(0, 16, font_8x16);
+ load_font(1, 8, font_8x8);
+ load_font(2, 14, font_8x14);
+ load_palette();
+ }
scp->status &= ~UNKNOWN_MODE;
set_mode(scp);
clear_screen(scp);
@@ -787,18 +862,18 @@ pcioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
saved_console = -1;
return 0;
- case CONSOLE_X_BELL:
- /*
- * if set, data is a pointer to a length 2 array of
- * integers. data[0] is the pitch in Hz and data[1]
- * is the duration in msec.
- */
- if (data)
- sysbeep(1187500/ ((int*)data)[0],
- ((int*)data)[1] * hz/ 3000);
- else
- sysbeep(0x31b, hz/4);
- return 0;
+ case CONSOLE_X_BELL:
+ /*
+ * if set, data is a pointer to a length 2 array of
+ * integers. data[0] is the pitch in Hz and data[1]
+ * is the duration in msec.
+ */
+ if (data)
+ sysbeep(1187500/ ((int*)data)[0],
+ ((int*)data)[1] * hz/ 3000);
+ else
+ sysbeep(0x31b, hz/4);
+ return 0;
default:
break;
@@ -851,9 +926,11 @@ pcstart(struct tty *tp)
if (scp->status & SLKED)
break;
c = getc(&tp->t_out);
+ tp->t_state |= TS_BUSY;
splx(s);
ansi_put(scp, c);
s = spltty();
+ tp->t_state &= ~TS_BUSY;
}
splx(s);
}
@@ -887,8 +964,8 @@ pccnputc(dev_t dev, char c)
if (cur_scr_stat->status & UNKNOWN_MODE)
return;
if (c == '\n')
- sput('\r', FG_LIGHTGREY | BG_BLACK);
- sput(c, FG_LIGHTGREY | BG_BLACK);
+ sput('\r');
+ sput(c);
pos = cur_scr_stat->crtat - cur_scr_stat->crt_base;
if (pos != cur_cursor_pos) {
cur_cursor_pos = pos;
@@ -911,105 +988,152 @@ pccngetc(dev_t dev)
return(c);
}
-#ifndef DONT_BLANK
+#if !defined(STAR_SAVER) && !defined(SNAKE_SAVER)
void scrn_saver(int test)
{
u_char val;
- static int blanked = 0;
- static long time_stamp;
-
- if (test && blank_time) {
- if (time.tv_sec > time_stamp + blank_time) {
- blanked = 1;
- outb(TSIDX, 0x01); val = inb(TSREG);
- outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
+
+ if (test) {
+ scrn_blanked = 1;
+ outb(TSIDX, 0x01); val = inb(TSREG);
+ outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
+ }
+ else {
+ scrn_blanked = 0;
+ outb(TSIDX, 0x01); val = inb(TSREG);
+ outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
+ }
+}
+#endif
+#if defined(STAR_SAVER) || defined(SNAKE_SAVER)
+
+static u_long rand_next = 1;
+
+static rand()
+{
+ return ((rand_next = rand_next * 1103515245 + 12345) & 0x7FFFFFFF);
+}
+#endif
+#ifdef STAR_SAVER
+/*
+ * Alternate saver that got its inspiration from a well known utility
+ * package for an unfamous OS.
+ */
+
+#define NUM_STARS 50
+
+void scrn_saver(int test)
+{
+ scr_stat *scp = cur_scr_stat;
+ int cell, i;
+ char pattern[] = {"...........++++*** "};
+ char colors[] = {FG_DARKGREY, FG_LIGHTGREY,
+ FG_WHITE, FG_LIGHTCYAN};
+ static u_short stars[NUM_STARS][2];
+
+ if (test) {
+ if (!scrn_blanked) {
+ bcopy(Crtat, scp->scr,
+ scp->max_posx * scp->max_posy * 2);
+ fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20], Crtat,
+ scp->max_posx * scp->max_posy);
+ set_border(0);
+ i = scp->max_posy * scp->max_posx + 5;
+ outb(crtc_addr, 14);
+ outb(crtc_addr+1, i >> 8);
+ outb(crtc_addr, 15);
+ outb(crtc_addr+1, i & 0xff);
+ scrn_blanked = 1;
+ for(i=0; i<NUM_STARS; i++) {
+ stars[i][0] =
+ rand() % (scp->max_posx*scp->max_posy);
+ stars[i][1] = 0;
+ }
+ }
+ cell = rand() % NUM_STARS;
+ *((u_short*)(Crtat + stars[cell][0])) =
+ scr_map[pattern[stars[cell][1]]] |
+ colors[rand()%sizeof(colors)] << 8;
+ if ((stars[cell][1]+=(rand()%4)) >= sizeof(pattern)-1) {
+ stars[cell][0] = rand() % (scp->max_posx*scp->max_posy);
+ stars[cell][1] = 0;
}
}
else {
- time_stamp = time.tv_sec;
- if (blanked) {
- blanked = 0;
- outb(TSIDX, 0x01); val = inb(TSREG);
- outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
+ if (scrn_blanked) {
+ bcopy(scp->scr, Crtat, scp->max_posx*scp->max_posy*2);
+ cur_cursor_pos = -1;
+ set_border(scp->border);
+ scrn_blanked = 0;
}
}
}
-
-#else
+#endif
+#ifdef SNAKE_SAVER
/*
* alternative screen saver for cards that do not like blanking
- * donated by Christoph Robitchko
*/
-static u_short cur_cursor_shape; /* remember cursor shape */
void scrn_saver(int test)
{
const char saves[] = {"386BSD"};
- static int blanked = 0;
static u_char *savs[sizeof(saves)-1];
static int dirx, diry;
- static long time_stamp;
- static u_short save_cursor;
int f;
scr_stat *scp = cur_scr_stat;
- if (test && blank_time) {
- if (time.tv_sec > time_stamp + blank_time) {
- if (!blanked) {
- bcopy(Crtat, scp->scr,
- scp->max_posx * scp->max_posy * 2);
- fillw(0x07<<8 | ' ', Crtat,
- scp->max_posx * scp->max_posy);
- set_border(0);
- dirx = (scp->posx ? 1 : -1);
- diry = (scp->posy ?
- scp->max_posx : -scp->max_posx);
- for (f=0; f< sizeof(saves)-1; f++)
- savs[f] = (u_char *)Crtat + 2 *
- (scp->posx+scp->posy*scp->max_posx);
- *(savs[0]) = *saves;
- f = scp->max_posy * scp->max_posx + 5;
- outb(crtc_addr, 14);
- outb(crtc_addr+1, f >> 8);
- outb(crtc_addr, 15);
- outb(crtc_addr+1, f & 0xff);
- save_cursor = cur_cursor_shape;
- blanked = 1;
- }
- if (blanked++ < 4)
- return;
- blanked = 1;
- *(savs[sizeof(saves)-2]) = ' ';
- for (f=sizeof(saves)-2; f > 0; f--)
- savs[f] = savs[f-1];
- f = (savs[0] - (u_char *)Crtat) / 2;
- if ((f % scp->max_posx) == 0 ||
- (f % scp->max_posx) == scp->max_posx - 1)
- dirx = -dirx;
- if ((f / scp->max_posx) == 0 ||
- (f / scp->max_posx) == scp->max_posy - 1)
- diry = -diry;
- savs[0] += 2*dirx + 2*diry;
- for (f=sizeof(saves)-2; f>=0; f--)
- *(savs[f]) = saves[f];
+ if (test) {
+ if (!scrn_blanked) {
+ bcopy(Crtat, scp->scr,
+ scp->max_posx * scp->max_posy * 2);
+ fillw((FG_LIGHTGREY|BG_BLACK)<<8 | scr_map[0x20], Crtat,
+ scp->max_posx * scp->max_posy);
+ set_border(0);
+ dirx = (scp->posx ? 1 : -1);
+ diry = (scp->posy ?
+ scp->max_posx : -scp->max_posx);
+ for (f=0; f< sizeof(saves)-1; f++)
+ savs[f] = (u_char *)Crtat + 2 *
+ (scp->posx+scp->posy*scp->max_posx);
+ *(savs[0]) = scr_map[*saves];
+ f = scp->max_posy * scp->max_posx + 5;
+ outb(crtc_addr, 14);
+ outb(crtc_addr+1, f >> 8);
+ outb(crtc_addr, 15);
+ outb(crtc_addr+1, f & 0xff);
+ scrn_blanked = 1;
}
+ if (scrn_blanked++ < 4)
+ return;
+ scrn_blanked = 1;
+ *(savs[sizeof(saves)-2]) = scr_map[0x20];
+ for (f=sizeof(saves)-2; f > 0; f--)
+ savs[f] = savs[f-1];
+ f = (savs[0] - (u_char *)Crtat) / 2;
+ if ((f % scp->max_posx) == 0 ||
+ (f % scp->max_posx) == scp->max_posx - 1 ||
+ (rand() % 50) == 0)
+ dirx = -dirx;
+ if ((f / scp->max_posx) == 0 ||
+ (f / scp->max_posx) == scp->max_posy - 1 ||
+ (rand() % 20) == 0)
+ diry = -diry;
+ savs[0] += 2*dirx + 2*diry;
+ for (f=sizeof(saves)-2; f>=0; f--)
+ *(savs[f]) = scr_map[saves[f]];
}
else {
- time_stamp = time.tv_sec;
- if (blanked) {
+ if (scrn_blanked) {
bcopy(scp->scr, Crtat,
scp->max_posx * scp->max_posy * 2);
cur_cursor_pos = -1;
- cursor_shape((save_cursor >> 8) & 0xff,
- save_cursor & 0xff);
set_border(scp->border);
- blanked = 0;
+ scrn_blanked = 0;
}
}
}
-
-#endif /* DONT_BLANK */
+#endif
static void cursor_shape(int start, int end)
{
@@ -1017,34 +1141,42 @@ static void cursor_shape(int start, int end)
outb(crtc_addr+1, start & 0xFF);
outb(crtc_addr, 11);
outb(crtc_addr+1, end & 0xFF);
-#ifdef DONT_BLANK
- cur_cursor_shape = ((start & 0xff) << 8) | (end & 0xff);
-#endif
+}
+
+
+static void get_cursor_shape(int *start, int *end)
+{
+ outb(crtc_addr, 10);
+ *start = inb(crtc_addr+1) & 0x1F;
+ outb(crtc_addr, 11);
+ *end = inb(crtc_addr+1) & 0x1F;
}
static void cursor_pos(void)
{
- int pos = cur_scr_stat->crtat - cur_scr_stat->crt_base;
+ int pos;
if (cur_scr_stat->status & UNKNOWN_MODE)
return;
- scrn_saver(1);
- if (pos != cur_cursor_pos) {
+ if (scrn_blank_time && (time.tv_sec > scrn_time_stamp+scrn_blank_time))
+ scrn_saver(1);
+ pos = cur_scr_stat->crtat - cur_scr_stat->crt_base;
+ if (!scrn_blanked && pos != cur_cursor_pos) {
cur_cursor_pos = pos;
- outb(crtc_addr,14);
- outb(crtc_addr+1,pos >> 8);
- outb(crtc_addr,15);
- outb(crtc_addr+1,pos&0xff);
+ outb(crtc_addr, 14);
+ outb(crtc_addr+1, pos>>8);
+ outb(crtc_addr, 15);
+ outb(crtc_addr+1, pos&0xff);
}
- timeout(cursor_pos,0,hz/20);
+ timeout(cursor_pos, 0, hz/20);
}
static void clear_screen(scr_stat *scp)
{
move_crsr(scp, 0, 0);
- fillw(scp->attr | ' ', scp->crt_base,
+ fillw(scp->term.attr | scr_map[0x20], scp->crt_base,
scp->max_posx * scp->max_posy);
}
@@ -1052,9 +1184,12 @@ static void clear_screen(scr_stat *scp)
static switch_scr(u_int next_scr)
{
if (in_putc) { /* don't switch if in putc */
- nx_scr = next_scr + 1;
+ nx_scr = next_scr+1;
return 0;
}
+ if (switch_in_progress &&
+ (cur_scr_stat->proc != pfind(cur_scr_stat->pid)))
+ switch_in_progress = 0;
if (next_scr >= NCONS || switch_in_progress) {
sysbeep(800, hz/4);
return -1;
@@ -1102,7 +1237,7 @@ static void exchange_scr(void)
cur_pccons = new_pccons;
if (old_scp->status & KBD_RAW_MODE || new_scp->status & KBD_RAW_MODE)
shfts = ctls = alts = 0;
- update_leds(new_scp->status & LOCK_KEY_MASK);
+ update_leds(new_scp->status & LED_MASK);
set_mode(new_scp);
new_scp->crt_base = Crtat;
move_crsr(new_scp, new_scp->posx, new_scp->posy);
@@ -1111,7 +1246,7 @@ static void exchange_scr(void)
}
-static void move_crsr(scr_stat *scp, u_int x, u_int y)
+static void move_crsr(scr_stat *scp, int x, int y)
{
if (x < 0 || y < 0 || x >= scp->max_posx || y >= scp->max_posy)
return;
@@ -1141,18 +1276,18 @@ static void scan_esc(scr_stat *scp, u_char c)
{
static u_char ansi_col[16] =
{0, 4, 2, 6, 1, 5, 3, 7, 8, 12, 10, 14, 9, 13, 11, 15};
- int i, n, m;
+ int i, n;
u_short *src, *dst, count;
- if (scp->esc == 1) {
+ if (scp->term.esc == 1) {
switch (c) {
case '[': /* Start ESC [ sequence */
- scp->esc = 2;
- scp->last_par = -1;
- for (i = scp->n_par; i < MAX_ESC_PAR; i++)
- scp->par[i] = 1;
- scp->n_par = 0;
+ scp->term.esc = 2;
+ scp->term.last_par = -1;
+ for (i = scp->term.n_par; i < MAX_ESC_PAR; i++)
+ scp->term.par[i] = 1;
+ scp->term.n_par = 0;
return;
case 'M': /* Move cursor up 1 line, scroll if at top */
@@ -1162,13 +1297,13 @@ static void scan_esc(scr_stat *scp, u_char c)
move_up(scp->crt_base,
scp->crt_base + scp->max_posx,
(scp->max_posy - 1) * scp->max_posx);
- fillw(scp->attr | ' ',
+ fillw(scp->term.attr | scr_map[0x20],
scp->crt_base, scp->max_posx);
}
break;
#if notyet
case 'Q':
- scp->esc = 4;
+ scp->term.esc = 4;
break;
#endif
case 'c': /* Clear screen & home */
@@ -1176,87 +1311,90 @@ static void scan_esc(scr_stat *scp, u_char c)
break;
}
}
- else if (scp->esc == 2) {
+ else if (scp->term.esc == 2) {
if (c >= '0' && c <= '9') {
- if (scp->n_par < MAX_ESC_PAR) {
- if (scp->last_par != scp->n_par) {
- scp->last_par = scp->n_par;
- scp->par[scp->n_par] = 0;
+ if (scp->term.n_par < MAX_ESC_PAR) {
+ if (scp->term.last_par != scp->term.n_par) {
+ scp->term.last_par = scp->term.n_par;
+ scp->term.par[scp->term.n_par] = 0;
}
else
- scp->par[scp->n_par] *= 10;
- scp->par[scp->n_par] += c - '0';
+ scp->term.par[scp->term.n_par] *= 10;
+ scp->term.par[scp->term.n_par] += c - '0';
return;
}
}
- scp->n_par = scp->last_par + 1;
+ scp->term.n_par = scp->term.last_par + 1;
switch (c) {
case ';':
- if (scp->n_par < MAX_ESC_PAR)
+ if (scp->term.n_par < MAX_ESC_PAR)
return;
break;
case '=':
- scp->esc = 3;
- scp->last_par = -1;
- for (i = scp->n_par; i < MAX_ESC_PAR; i++)
- scp->par[i] = 1;
- scp->n_par = 0;
+ scp->term.esc = 3;
+ scp->term.last_par = -1;
+ for (i = scp->term.n_par; i < MAX_ESC_PAR; i++)
+ scp->term.par[i] = 1;
+ scp->term.n_par = 0;
return;
case 'A': /* up n rows */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, scp->posx, scp->posy - n);
break;
case 'B': /* down n rows */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, scp->posx, scp->posy + n);
break;
case 'C': /* right n columns */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, scp->posx + n, scp->posy);
break;
case 'D': /* left n columns */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, scp->posx - n, scp->posy);
break;
case 'E': /* cursor to start of line n lines down */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, 0, scp->posy + n);
break;
case 'F': /* cursor to start of line n lines up */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, 0, scp->posy - n);
break;
case 'f': /* System V consoles .. */
case 'H': /* Cursor move */
- if (scp->n_par == 0)
+ if (scp->term.n_par == 0)
move_crsr(scp, 0, 0);
- else if (scp->n_par == 2)
- move_crsr(scp, scp->par[1] - 1, scp->par[0] - 1);
+ else if (scp->term.n_par == 2)
+ move_crsr(scp, scp->term.par[1] - 1,
+ scp->term.par[0] - 1);
break;
case 'J': /* Clear all or part of display */
- if (scp->n_par == 0)
+ if (scp->term.n_par == 0)
n = 0;
else
- n = scp->par[0];
+ n = scp->term.par[0];
switch (n) {
case 0: /* clear form cursor to end of display */
- fillw(scp->attr | ' ', scp->crtat,
- scp->crt_base + scp->max_posx *
- scp->max_posy - scp->crtat);
+ fillw(scp->term.attr | scr_map[0x20],
+ scp->crtat, scp->crt_base +
+ scp->max_posx * scp->max_posy -
+ scp->crtat);
break;
case 1: /* clear from beginning of display to cursor */
- fillw(scp->attr | ' ', scp->crt_base,
- scp->crtat - scp->crt_base);
+ fillw(scp->term.attr | scr_map[0x20],
+ scp->crt_base,
+ scp->crtat - scp->crt_base);
break;
case 2: /* clear entire display */
clear_screen(scp);
@@ -1265,41 +1403,42 @@ static void scan_esc(scr_stat *scp, u_char c)
break;
case 'K': /* Clear all or part of line */
- if (scp->n_par == 0)
+ if (scp->term.n_par == 0)
n = 0;
else
- n = scp->par[0];
+ n = scp->term.par[0];
switch (n) {
case 0: /* clear form cursor to end of line */
- fillw(scp->attr | ' ', scp->crtat,
- scp->max_posx - scp->posx);
+ fillw(scp->term.attr | scr_map[0x20],
+ scp->crtat, scp->max_posx - scp->posx);
break;
case 1: /* clear from beginning of line to cursor */
- fillw(scp->attr | ' ',
- scp->crtat - (scp->max_posx - scp->posx),
- (scp->max_posx - scp->posx) + 1);
+ fillw(scp->term.attr|scr_map[0x20],
+ scp->crtat - (scp->max_posx - scp->posx),
+ (scp->max_posx - scp->posx) + 1);
break;
case 2: /* clear entire line */
- fillw(scp->attr | ' ',
- scp->crtat - (scp->max_posx - scp->posx),
- scp->max_posx);
+ fillw(scp->term.attr|scr_map[0x20],
+ scp->crtat - (scp->max_posx - scp->posx),
+ scp->max_posx);
break;
}
break;
case 'L': /* Insert n lines */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
if (n > scp->max_posy - scp->posy)
n = scp->max_posy - scp->posy;
src = scp->crt_base + scp->posy * scp->max_posx;
dst = src + n * scp->max_posx;
count = scp->max_posy - (scp->posy + n);
move_up(src, dst, count * scp->max_posx);
- fillw(scp->attr | ' ', src, n * scp->max_posx);
+ fillw(scp->term.attr | scr_map[0x20], src,
+ n * scp->max_posx);
break;
case 'M': /* Delete n lines */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
if (n > scp->max_posy - scp->posy)
n = scp->max_posy - scp->posy;
dst = scp->crt_base + scp->posy * scp->max_posx;
@@ -1307,11 +1446,12 @@ static void scan_esc(scr_stat *scp, u_char c)
count = scp->max_posy - (scp->posy + n);
move_down(src, dst, count * scp->max_posx);
src = dst + count * scp->max_posx;
- fillw(scp->attr | ' ', src, n * scp->max_posx);
+ fillw(scp->term.attr | scr_map[0x20], src,
+ n * scp->max_posx);
break;
case 'P': /* Delete n chars */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
if (n > scp->max_posx - scp->posx)
n = scp->max_posx - scp->posx;
dst = scp->crtat;
@@ -1319,49 +1459,51 @@ static void scan_esc(scr_stat *scp, u_char c)
count = scp->max_posx - (scp->posx + n);
move_down(src, dst, count);
src = dst + count;
- fillw(scp->attr | ' ', src, n);
+ fillw(scp->term.attr | scr_map[0x20], src, n);
break;
case '@': /* Insert n chars */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
if (n > scp->max_posx - scp->posx)
n = scp->max_posx - scp->posx;
src = scp->crtat;
dst = src + n;
count = scp->max_posx - (scp->posx + n);
move_up(src, dst, count);
- fillw(scp->attr | ' ', src, n);
+ fillw(scp->term.attr | scr_map[0x20], src, n);
break;
case 'S': /* scroll up n lines */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
bcopy(scp->crt_base + (scp->max_posx * n),
- scp->crt_base,
- scp->max_posx * (scp->max_posy - n) *
- sizeof(u_short));
- fillw(scp->attr | ' ',
- scp->crt_base + scp->max_posx *
- (scp->max_posy - 1),
- scp->max_posx);
+ scp->crt_base,
+ scp->max_posx * (scp->max_posy - n) *
+ sizeof(u_short));
+ fillw(scp->term.attr | scr_map[0x20],
+ scp->crt_base + scp->max_posx *
+ (scp->max_posy - 1),
+ scp->max_posx);
break;
case 'T': /* scroll down n lines */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
bcopy(scp->crt_base,
- scp->crt_base + (scp->max_posx * n),
- scp->max_posx * (scp->max_posy - n) *
- sizeof(u_short));
- fillw(scp->attr | ' ', scp->crt_base, scp->max_posx);
+ scp->crt_base + (scp->max_posx * n),
+ scp->max_posx * (scp->max_posy - n) *
+ sizeof(u_short));
+ fillw(scp->term.attr | scr_map[0x20], scp->crt_base,
+ scp->max_posx);
break;
case 'X': /* delete n characters in line */
- n = scp->par[0]; if (n < 1) n = 1;
- fillw(scp->attr | ' ', scp->crt_base + scp->posx +
+ n = scp->term.par[0]; if (n < 1) n = 1;
+ fillw(scp->term.attr | scr_map[0x20],
+ scp->crt_base + scp->posx +
((scp->max_posx*scp->posy) * sizeof(u_short)), n);
break;
case 'Z': /* move n tabs backwards */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
if ((i = scp->posx & 0xf8) == scp->posx)
i -= 8*n;
else
@@ -1372,202 +1514,213 @@ static void scan_esc(scr_stat *scp, u_char c)
break;
case '`': /* move cursor to column n */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, n, scp->posy);
break;
case 'a': /* move cursor n columns to the right */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, scp->posx + n, scp->posy);
break;
case 'd': /* move cursor to row n */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, scp->posx, n);
break;
case 'e': /* move cursor n rows down */
- n = scp->par[0]; if (n < 1) n = 1;
+ n = scp->term.par[0]; if (n < 1) n = 1;
move_crsr(scp, scp->posx, scp->posy + n);
break;
case 'm': /* change attribute */
- if (scp->n_par == 0)
+ if (scp->term.n_par == 0)
n = 0;
else
- n = scp->par[0];
+ n = scp->term.par[0];
switch (n) {
case 0: /* back to normal */
- scp->attr = scp->std_attr;
+ scp->term.attr = scp->term.std_attr;
break;
case 1: /* highlight (bold) */
- scp->attr &= 0xFF00;
- scp->attr |= 0x0800;
+ scp->term.attr &= 0xFF00;
+ scp->term.attr |= 0x0800;
break;
case 4: /* highlight (underline) */
- scp->attr &= 0x0F00;
- scp->attr |= 0x0800;
+ scp->term.attr &= 0x0F00;
+ scp->term.attr |= 0x0800;
break;
case 5: /* blink */
- scp->attr &= 0xFF00;
- scp->attr |= 0x8000;
+ scp->term.attr &= 0xFF00;
+ scp->term.attr |= 0x8000;
break;
case 7: /* reverse video */
- scp->attr = scp->rev_attr;
+ scp->term.attr = scp->term.rev_attr;
break;
case 30: case 31: case 32: case 33: /* set fg color */
case 34: case 35: case 36: case 37:
- scp->attr = (scp->attr & 0xF0FF)
+ scp->term.attr = (scp->term.attr & 0xF0FF)
| (ansi_col[(n - 30) & 7] << 8);
break;
case 40: case 41: case 42: case 43: /* set bg color */
case 44: case 45: case 46: case 47:
- scp->attr = (scp->attr & 0x0FFF)
+ scp->term.attr = (scp->term.attr & 0x0FFF)
| (ansi_col[(n - 40) & 7] << 12);
break;
}
break;
case 'x':
- if (scp->n_par == 0)
+ if (scp->term.n_par == 0)
n = 0;
else
- n = scp->par[0];
+ n = scp->term.par[0];
switch (n) {
case 0: /* reset attributes */
- scp->attr = scp->std_attr = FG_LIGHTGREY << 8;
+ scp->term.attr = scp->term.std_attr =
+ current_default->std_attr;
+ scp->term.rev_attr = current_default->rev_attr;
break;
case 1: /* set ansi background */
- scp->attr = scp->std_attr =
- (scp->std_attr & 0x0F00)
- | (ansi_col[(scp->par[1])&0x0F] << 12);
+ scp->term.attr = scp->term.std_attr =
+ (scp->term.std_attr & 0x0F00) |
+ (ansi_col[(scp->term.par[1])&0x0F]<<12);
break;
case 2: /* set ansi foreground */
- scp->attr = scp->std_attr =
- (scp->std_attr & 0xF000)
- | (ansi_col[(scp->par[1])&0x0F] << 8);
+ scp->term.attr = scp->term.std_attr =
+ (scp->term.std_attr & 0xF000) |
+ (ansi_col[(scp->term.par[1])&0x0F]<<8);
break;
case 3: /* set ansi attribute directly */
- scp->attr = scp->std_attr =
- (scp->par[1] & 0xFF) << 8;
+ scp->term.attr = scp->term.std_attr =
+ (scp->term.par[1]&0xFF)<<8;
break;
case 5: /* set ansi reverse video background */
- scp->rev_attr =
- (scp->rev_attr & 0x0F00)
- | (ansi_col[(scp->par[1]) & 0x0F] << 12);
+ scp->term.rev_attr =
+ (scp->term.rev_attr & 0x0F00) |
+ (ansi_col[(scp->term.par[1])&0x0F]<<12);
break;
case 6: /* set ansi reverse video foreground */
- scp->rev_attr =
- (scp->rev_attr & 0xF000)
- | (ansi_col[(scp->par[1]) & 0x0F] << 8);
+ scp->term.rev_attr =
+ (scp->term.rev_attr & 0xF000) |
+ (ansi_col[(scp->term.par[1])&0x0F]<<8);
break;
case 7: /* set ansi reverse video directly */
- scp->rev_attr = (scp->par[1] & 0xFF) << 8;
+ scp->term.rev_attr = (scp->term.par[1]&0xFF)<<8;
break;
}
break;
case 'z': /* switch to (virtual) console n */
- if (scp->n_par == 1)
- switch_scr(scp->par[0]);
+ if (scp->term.n_par == 1)
+ switch_scr(scp->term.par[0]);
break;
}
}
- else if (scp->esc == 3) {
+ else if (scp->term.esc == 3) {
if (c >= '0' && c <= '9') {
- if (scp->n_par < MAX_ESC_PAR) {
- if (scp->last_par != scp->n_par) {
- scp->last_par = scp->n_par;
- scp->par[scp->n_par] = 0;
+ if (scp->term.n_par < MAX_ESC_PAR) {
+ if (scp->term.last_par != scp->term.n_par) {
+ scp->term.last_par = scp->term.n_par;
+ scp->term.par[scp->term.n_par] = 0;
}
else
- scp->par[scp->n_par] *= 10;
- scp->par[scp->n_par] += c - '0';
+ scp->term.par[scp->term.n_par] *= 10;
+ scp->term.par[scp->term.n_par] += c - '0';
return;
}
}
- scp->n_par = scp->last_par + 1;
+ scp->term.n_par = scp->term.last_par + 1;
switch (c) {
case ';':
- if (scp->n_par < MAX_ESC_PAR)
+ if (scp->term.n_par < MAX_ESC_PAR)
return;
break;
case 'A': /* set display border color */
- if (scp->n_par == 1)
- scp->border=scp->par[0] & 0xff;
+ if (scp->term.n_par == 1)
+ scp->border=scp->term.par[0] & 0xff;
if (scp == cur_scr_stat)
set_border(scp->border);
break;
case 'B': /* set bell pitch and duration */
- if (scp->n_par == 2) {
- scp->bell_pitch = scp->par[0];
- scp->bell_duration = scp->par[1]*10;
+ if (scp->term.n_par == 2) {
+ scp->bell_pitch = scp->term.par[0];
+ scp->bell_duration = scp->term.par[1]*10;
}
break;
case 'C': /* set cursor shape (start & end line) */
- if (scp->n_par == 2)
- cursor_shape(scp->par[0], scp->par[1]);
+ if (scp->term.n_par == 2) {
+ scp->cursor_start = scp->term.par[0] & 0x1F;
+ scp->cursor_end = scp->term.par[1] & 0x1F;
+ if (scp == cur_scr_stat)
+ cursor_shape(scp->cursor_start,
+ scp->cursor_end);
+ }
break;
case 'F': /* set ansi foreground */
- if (scp->n_par == 1)
- scp->attr = scp->std_attr =
- (scp->std_attr & 0xF000)
- | ((scp->par[0] & 0x0F) << 8);
+ if (scp->term.n_par == 1)
+ scp->term.attr = scp->term.std_attr =
+ (scp->term.std_attr & 0xF000)
+ | ((scp->term.par[0] & 0x0F) << 8);
break;
case 'G': /* set ansi background */
- if (scp->n_par == 1)
- scp->attr = scp->std_attr =
- (scp->std_attr & 0x0F00)
- | ((scp->par[0] & 0x0F) << 12);
+ if (scp->term.n_par == 1)
+ scp->term.attr = scp->term.std_attr =
+ (scp->term.std_attr & 0x0F00)
+ | ((scp->term.par[0] & 0x0F) << 12);
break;
case 'H': /* set ansi reverse video foreground */
- if (scp->n_par == 1)
- scp->rev_attr =
- (scp->rev_attr & 0xF000)
- | ((scp->par[0] & 0x0F) << 8);
+ if (scp->term.n_par == 1)
+ scp->term.rev_attr =
+ (scp->term.rev_attr & 0xF000)
+ | ((scp->term.par[0] & 0x0F) << 8);
break;
case 'I': /* set ansi reverse video background */
- if (scp->n_par == 1)
- scp->rev_attr =
- (scp->rev_attr & 0x0F00)
- | ((scp->par[0] & 0x0F) << 12);
+ if (scp->term.n_par == 1)
+ scp->term.rev_attr =
+ (scp->term.rev_attr & 0x0F00)
+ | ((scp->term.par[0] & 0x0F) << 12);
break;
}
}
- scp->esc = 0;
+ scp->term.esc = 0;
}
-#define wrtchar(scp, c) ( *scp->crtat = (c), scp->crtat++, scp->posx++ )
-
static void ansi_put(scr_stat *scp, u_char c)
{
- int s;
-
- if (scp == cur_scr_stat )
- scrn_saver(0);
if (scp->status & UNKNOWN_MODE)
return;
+
+ /* make screensaver happy */
+ if (scp == cur_scr_stat) {
+ scrn_time_stamp = time.tv_sec;
+ if (scrn_blanked)
+ scrn_saver(0);
+ }
in_putc++;
- if (scp->esc)
+ if (scp->term.esc)
scan_esc(scp, c);
else switch(c) {
- case 0x1B:
- scp->esc = 1;
- scp->n_par = 0;
+ case 0x1B: /* start escape sequence */
+ scp->term.esc = 1;
+ scp->term.n_par = 0;
+ break;
+ case 0x07:
+ if (scp == cur_scr_stat)
+ sysbeep(scp->bell_pitch, scp->bell_duration);
break;
- case '\t':
- do {
- wrtchar(scp, scp->attr | ' ');
- } while (scp->posx % 8);
+ case '\t': /* non-destructive tab */
+ scp->crtat += (8 - scp->posx % 8);
+ scp->posx += (8 - scp->posx % 8);
break;
case '\b': /* non-destructive backspace */
if (scp->crtat > scp->crt_base) {
@@ -1580,43 +1733,36 @@ static void ansi_put(scr_stat *scp, u_char c)
}
}
break;
- case '\r':
+ case '\r': /* return to pos 0 */
move_crsr(scp, 0, scp->posy);
break;
- case '\n':
+ case '\n': /* newline, same pos */
scp->crtat += scp->max_posx;
scp->posy++;
break;
- case '\f':
+ case '\f': /* form feed, clears screen */
clear_screen(scp);
break;
default:
- if (c == 7) {
- if (scp == cur_scr_stat)
- sysbeep(scp->bell_pitch, scp->bell_duration);
- }
/* Print only printables */
- else {
- wrtchar(scp, scp->attr | c);
- if (scp->posx >= scp->max_posx) {
- scp->posx = 0;
- scp->posy++;
- }
- break;
+ *scp->crtat = (scp->term.attr | scr_map[c]);
+ scp->crtat++;
+ if (++scp->posx >= scp->max_posx) {
+ scp->posx = 0;
+ scp->posy++;
}
+ break;
}
if (scp->crtat >= scp->crt_base + scp->max_posy * scp->max_posx) {
bcopy(scp->crt_base + scp->max_posx, scp->crt_base,
scp->max_posx * (scp->max_posy - 1) * sizeof(u_short));
- fillw(scp->attr | ' ',
+ fillw(scp->term.attr | scr_map[0x20],
scp->crt_base + scp->max_posx * (scp->max_posy - 1),
scp->max_posx);
scp->crtat -= scp->max_posx;
scp->posy--;
}
- s = spltty();
in_putc--;
- splx(s);
if (nx_scr)
switch_scr(nx_scr - 1);
}
@@ -1625,14 +1771,12 @@ static void ansi_put(scr_stat *scp, u_char c)
void consinit(void)
{
u_short *cp = Crtat + (CGA_BUF-MONO_BUF)/sizeof(u_short), was;
- scr_stat *scp;
unsigned cursorat;
int i;
/*
* catch that once in a blue moon occurence when consinit is called
* TWICE, adding the CGA_BUF offset again -> poooff
- * thanks to Christoph Robitchko for finding this one !!
*/
if (crtat != 0)
return;
@@ -1650,22 +1794,28 @@ void consinit(void)
crtc_addr = COLOR_BASE;
Crtat = Crtat + (CGA_BUF-MONO_BUF)/sizeof(u_short);
}
+
/* Extract cursor location */
outb(crtc_addr,14);
cursorat = inb(crtc_addr+1)<<8 ;
outb(crtc_addr,15);
cursorat |= inb(crtc_addr+1);
+ crtat = Crtat + cursorat;
- crtat = Crtat+ cursorat;
+ /* is this a VGA or higher ? */
+ outb(crtc_addr, 7);
+ if (inb(crtc_addr) == 7)
+ crtc_vga = 1;
+ current_default = &user_default;
cons_scr_stat[0].crtat = crtat;
cons_scr_stat[0].crt_base = Crtat;
+ cons_scr_stat[0].term.esc = 0;
+ cons_scr_stat[0].term.std_attr = current_default->std_attr;
+ cons_scr_stat[0].term.rev_attr = current_default->rev_attr;
+ cons_scr_stat[0].term.attr = current_default->std_attr;
cons_scr_stat[0].posx = cursorat % COL;
cons_scr_stat[0].posy = cursorat / COL;
- cons_scr_stat[0].esc = 0;
- cons_scr_stat[0].std_attr = (FG_LIGHTGREY | BG_BLACK) << 8;
- cons_scr_stat[0].rev_attr = (FG_BLACK | BG_LIGHTGREY) << 8;
- cons_scr_stat[0].attr = (FG_LIGHTGREY | BG_BLACK) << 8;
cons_scr_stat[0].border = BG_BLACK;;
cons_scr_stat[0].max_posx = COL;
cons_scr_stat[0].max_posy = ROW;
@@ -1675,21 +1825,31 @@ void consinit(void)
cons_scr_stat[0].smode.mode = VT_AUTO;
cons_scr_stat[0].bell_pitch = 800;
cons_scr_stat[0].bell_duration = 10;
+ kernel_console.esc = 0;
+ kernel_console.std_attr = kernel_default.std_attr;
+ kernel_console.rev_attr = kernel_default.rev_attr;
+ kernel_console.attr = kernel_default.std_attr;
+ /* initialize mapscrn array to */
+ for (i=0; i<sizeof(scr_map); i++)
+ scr_map[i] = i;
clear_screen(&cons_scr_stat[0]);
}
-static void sput(u_char c, u_char ca)
+static void sput(u_char c)
{
- int i;
scr_stat *scp = &cons_scr_stat[0];
+ term_stat save;
if (crtat == 0)
consinit();
- i = scp->attr;
- scp->attr = ca << 8;
+ save = scp->term;
+ scp->term = kernel_console;
+ current_default = &kernel_default;
ansi_put(scp, c);
- scp->attr = i;
+ kernel_console = scp->term;
+ current_default = &user_default;
+ scp->term = save;
}
@@ -1710,18 +1870,15 @@ static u_char *get_fstr(u_int c, u_int *len)
static update_leds(int which)
{
u_char xlate_leds[8] = { 0, 4, 2, 6, 1, 5, 3, 7 };
- int i;
kbd_cmd(KB_SETLEDS); /* LED Command */
- kbd_cmd(xlate_leds[which]);
+ kbd_cmd(xlate_leds[which & LED_MASK]);
kbd_wait();
}
volatile void reset_cpu(void)
{
- int i;
-
while (1) {
kbd_cmd(KB_RESET_CPU); /* Reset Command */
DELAY(4000000);
@@ -1736,122 +1893,176 @@ volatile void reset_cpu(void)
*/
u_int sgetc(int noblock)
{
- u_char dt, modifier;
- static u_char esc_flag = 0;
+ u_char val, code, release;
u_int state, action;
- int i;
struct key_t *key;
+ static u_char esc_flag = 0, compose = 0;
+ static u_int chr = 0;
next_code:
kbd_wait();
/* First see if there is something in the keyboard port */
if (inb(KB_STAT) & KB_BUF_FULL)
- dt = inb(KB_DATA);
+ val = inb(KB_DATA);
else if (noblock)
return(0x100);
else
goto next_code;
if (cur_scr_stat->status & KBD_RAW_MODE)
- return dt;
+ return val;
+
+ code = val & 0x7F;
+ release = val & 0x80;
/* Check for cntl-alt-del */
- if ((dt == 83) && ctls && alts)
+ if ((code == 83) && ctls && alts)
cpu_reset();
-
#if NDDB > 0
/* Check for cntl-alt-esc */
- if ((dt == 1) && ctls && alts) {
+ if ((val == 1) && ctls && alts) {
/* if debugger called, try to switch to console 0 */
if (cur_scr_stat->smode.mode == VT_AUTO &&
cons_scr_stat[0].smode.mode == VT_AUTO)
switch_scr(0);
Debugger();
+ return(0x100);
}
#endif
- if (dt == 0xE0 || dt == 0xE1) {
- esc_flag = dt;
- goto next_code;
- }
-
- if ((dt & 0x7F) >= key_map.n_keys)
- goto next_code;
-
- if (esc_flag == 0xE0) {
- switch (dt & 0x7F) {
- case 0x2A: /* This may come because the keyboard keeps */
- case 0x36: /* its own caps lock status, we ignore SOS */
- goto next_code;
- /* NOT REACHED */
- case 0x1C: /* keypad enter key */
- modifier = 0x59;
+ switch (esc_flag) {
+ case 0x00: /* normal scancode */
+ switch(code) {
+ case 0x38: /* left alt (compose key) */
+ if (release && compose) {
+ compose = 0;
+ if (chr > 255) {
+ sysbeep(500, hz/4);
+ chr = 0;
+ }
+ }
+ else {
+ if (!compose) {
+ compose = 1;
+ chr = 0;
+ }
+ }
break;
- case 0x1D: /* right control key */
- modifier = 0x5a;
+ case 0x60:
+ case 0x61:
+ esc_flag = code;
+ goto next_code;
+ }
+ break;
+ case 0x60: /* 0xE0 prefix */
+ esc_flag = 0;
+ switch (code) {
+ case 0x1d: /* right ctrl key */
break;
case 0x35: /* keypad divide key */
- modifier = 0x5b;
+ code = 0x5b;
break;
case 0x37: /* print scrn key */
- modifier = 0x5c;
+ code = 0x5c;
break;
case 0x38: /* right alt key (alt gr) */
- modifier = 0x5d;
+ code = 0x5d;
break;
case 0x47: /* grey home key */
- modifier = 0x5e;
+ code = 0x5e;
break;
case 0x48: /* grey up arrow key */
- modifier = 0x5f;
+ code = 0x5f;
break;
case 0x49: /* grey page up key */
- modifier = 0x60;
+ code = 0x60;
break;
case 0x4b: /* grey left arrow key */
- modifier = 0x61;
+ code = 0x61;
break;
case 0x4d: /* grey right arrow key */
- modifier = 0x62;
+ code = 0x62;
break;
case 0x4f: /* grey end key */
- modifier = 0x63;
+ code = 0x63;
break;
case 0x50: /* grey down arrow key */
- modifier = 0x64;
+ code = 0x64;
break;
case 0x51: /* grey page down key */
- modifier = 0x65;
+ code = 0x65;
break;
case 0x52: /* grey insert key */
- modifier = 0x66;
+ code = 0x66;
break;
case 0x53: /* grey delete key */
- modifier = 0x67;
+ code = 0x67;
break;
- default: /* every thing else is ignored */
+ default: /* ignore everything else */
goto next_code;
- /* NOT REACHED */
}
- dt = (dt & 0x80) | modifier;
- }
- else if (esc_flag == (u_char)0xE1 && ((dt & 0x7F) == 0x1D)) {
- esc_flag = 0x1D;
+ break;
+ case 0x61: /* 0xE1 prefix */
+ esc_flag = 0;
+ if (code == 0x1D)
+ esc_flag = 0x1D;
goto next_code;
+ /* NOT REACHED */
+ case 0x1D: /* pause / break */
+ esc_flag = 0;
+ if (code != 0x45)
+ goto next_code;
+ code = 0x68;
+ break;
}
- else if (esc_flag == 0x1D && ((dt & 0x7F) == 0x45))
- dt = (dt & 0x80) | 0x68;
- esc_flag = 0;
+ if (compose) {
+ switch (code) {
+ case 0x47:
+ case 0x48: /* keypad 7,8,9 */
+ case 0x49:
+ if (!release)
+ chr = (code - 0x40) + chr*10;
+ goto next_code;
+ case 0x4b:
+ case 0x4c: /* keypad 4,5,6 */
+ case 0x4d:
+ if (!release)
+ chr = (code - 0x47) + chr*10;
+ goto next_code;
+ case 0x4f:
+ case 0x50: /* keypad 1,2,3 */
+ case 0x51:
+ if (!release)
+ chr = (code - 0x4e) + chr*10;
+ goto next_code;
+ case 0x52: /* keypad 0 */
+ if (!release)
+ chr *= 10;
+ goto next_code;
+ case 0x38: /* left alt key */
+ break;
+ default:
+ if (chr) {
+ compose = chr = 0;
+ sysbeep(500, hz/4);
+ goto next_code;
+ }
+ break;
+ }
+ }
+
state = (shfts ? 1 : 0 ) | (2 * (ctls ? 1 : 0)) | (4 * (alts ? 1 : 0));
- key = &key_map.key[dt & 0x7F];
+ if ((!agrs && (cur_scr_stat->status & ALKED))
+ || (agrs && !(cur_scr_stat->status & ALKED)))
+ code += ALTGR_OFFSET;
+ key = &key_map.key[code];
if ( ((key->flgs & FLAG_LOCK_C) && (cur_scr_stat->status & CLKED))
|| ((key->flgs & FLAG_LOCK_N) && (cur_scr_stat->status & NLKED)) )
state ^= 1;
/* Check for make/break */
action = key->map[state];
- if (dt & 0x80) {
- /* break */
+ if (release) { /* key released */
if (key->spcl & 0x80) {
switch (action) {
case LSH:
@@ -1872,37 +2083,72 @@ next_code:
case RALT:
alts &= ~2;
break;
+ case NLK:
+ nlkcnt = 0;
+ break;
+ case CLK:
+ clkcnt = 0;
+ break;
+ case SLK:
+ slkcnt = 0;
+ break;
+ case ASH:
+ agrs = 0;
+ break;
}
}
+ if (chr && !compose) {
+ action = chr;
+ chr = 0;
+ return (action);
+ }
} else {
- /* make */
+ /* key pressed */
if (key->spcl & (0x80>>state)) {
switch (action) {
/* LOCKING KEYS */
case NLK:
- if (cur_scr_stat->status & NLKED)
- cur_scr_stat->status &= ~NLKED;
- else
- cur_scr_stat->status |= NLKED;
- update_leds(cur_scr_stat->status&LOCK_KEY_MASK);
+ if (!nlkcnt) {
+ nlkcnt++;
+ if (cur_scr_stat->status & NLKED)
+ cur_scr_stat->status &= ~NLKED;
+ else
+ cur_scr_stat->status |= NLKED;
+ update_leds(cur_scr_stat->status & LED_MASK);
+ }
break;
case CLK:
- if (cur_scr_stat->status & CLKED)
- cur_scr_stat->status &= ~CLKED;
- else
- cur_scr_stat->status |= CLKED;
- update_leds(cur_scr_stat->status&LOCK_KEY_MASK);
+ if (!clkcnt) {
+ clkcnt++;
+ if (cur_scr_stat->status & CLKED)
+ cur_scr_stat->status &= ~CLKED;
+ else
+ cur_scr_stat->status |= CLKED;
+ update_leds(cur_scr_stat->status & LED_MASK);
+ }
break;
case SLK:
- if (cur_scr_stat->status & SLKED) {
- cur_scr_stat->status &= ~SLKED;
- pcstart(&pccons[get_scr_num(cur_scr_stat)]);
- }
- else
- cur_scr_stat->status |= SLKED;
- update_leds(cur_scr_stat->status&LOCK_KEY_MASK);
+ if (!slkcnt) {
+ slkcnt++;
+ if (cur_scr_stat->status & SLKED) {
+ cur_scr_stat->status &= ~SLKED;
+ pcstart(&pccons[get_scr_num(cur_scr_stat)]);
+ }
+ else
+ cur_scr_stat->status |= SLKED;
+ update_leds(cur_scr_stat->status & LED_MASK);
+ }
break;
-
+ case ALK:
+ if (!alkcnt) {
+ alkcnt++;
+ if (cur_scr_stat->status & ALKED)
+ cur_scr_stat->status &= ~ALKED;
+ else
+ cur_scr_stat->status |= ALKED;
+ }
+ break;
+
/* NON-LOCKING KEYS */
case LSH:
shfts |= 1;
@@ -1922,6 +2168,11 @@ next_code:
case RALT:
alts |= 2;
break;
+ case ASH:
+ agrs = 1;
+ break;
+ case NOP:
+ break;
default:
if (action >= F_SCR && action <= L_SCR) {
switch_scr(action - F_SCR);
@@ -1938,54 +2189,44 @@ next_code:
goto next_code;
}
-/* -hv- 22-Apr-93: to make init_main more portable */
-void cons_highlight(void)
+/* July '93, jkh. Added in for init_main.c */
+void cons_highlight()
{
- scr_stat *scp = &cons_scr_stat[0];
-
- scp->attr &= 0xFF00;
- scp->attr |= 0x0800;
+ cons_scr_stat[0].term.attr &= 0xFF00;
+ cons_scr_stat[0].term.attr |= 0x0800;
}
-void cons_normal(void)
+void cons_normal()
{
- scr_stat *scp = &cons_scr_stat[0];
-
- scp->attr = scp->std_attr;
+ cons_scr_stat[0].term.attr = cons_scr_stat[0].term.std_attr;
}
int getchar(void)
{
char thechar;
- int delay, x;
+ int s;
pcconsoftc.cs_flags |= CSF_POLLING;
- x = splhigh();
- sput('>', FG_RED | BG_BLACK);
+ s = splhigh();
+ sput('>');
thechar = (char) sgetc(0);
pcconsoftc.cs_flags &= ~CSF_POLLING;
- splx(x);
+ splx(s);
switch (thechar) {
default:
- if (thechar >= ' ')
- sput(thechar, FG_RED | BG_BLACK);
+ if (thechar >= scr_map[0x20])
+ sput(thechar);
return(thechar);
case cr:
case lf:
- sput(cr, FG_RED | BG_BLACK);
- sput(lf, FG_RED | BG_BLACK);
+ sput(cr); sput(lf);
return(lf);
case bs:
case del:
- sput(bs, FG_RED | BG_BLACK);
- sput(' ', FG_RED | BG_BLACK);
- sput(bs, FG_RED | BG_BLACK);
+ sput(bs); sput(scr_map[0x20]); sput(bs);
return(thechar);
case cntld:
- sput('^', FG_RED | BG_BLACK) ;
- sput('D', FG_RED | BG_BLACK) ;
- sput('\r', FG_RED | BG_BLACK) ;
- sput('\n', FG_RED | BG_BLACK) ;
+ sput('^'); sput('D'); sput('\r'); sput('\n');
return(0);
}
}
@@ -2018,11 +2259,25 @@ static void kbd_cmd(u_char command)
static void set_mode(scr_stat *scp)
{
u_char byte;
+ int s;
if (scp != cur_scr_stat)
return;
+ /* (re)activate cursor */
+ untimeout(cursor_pos, 0);
+ cursor_pos();
+
+ /* change cursor type if set */
+ if (scp->cursor_start != -1 && scp->cursor_end != -1)
+ cursor_shape(scp->cursor_start, scp->cursor_end);
+
+ /* mode change only on VGA's */
+ if (!crtc_vga)
+ return;
+
/* setup video hardware for the given mode */
+ s = splhigh();
switch(scp->mode) {
case TEXT80x25:
outb(crtc_addr, 9); byte = inb(crtc_addr+1);
@@ -2037,13 +2292,11 @@ static void set_mode(scr_stat *scp)
default:
return;
}
+ splx(s);
/* set border color for this (virtual) console */
set_border(scp->border);
-
- /* (re)activate cursor */
- untimeout(cursor_pos, 0);
- cursor_pos();
+ return;
}
@@ -2057,13 +2310,14 @@ static void set_border(int color)
static load_font(int segment, int size, char* font)
{
- int ch, line;
+ int ch, line, s;
u_char val;
outb(TSIDX, 0x01); val = inb(TSREG); /* blank screen */
outb(TSIDX, 0x01); outb(TSREG, val | 0x20);
/* setup vga for loading fonts (graphics plane mode) */
+ s = splhigh();
inb(crtc_addr+6); /* reset flip/flop */
outb(ATC, 0x30); outb(ATC, 0x01);
outb(TSIDX, 0x02); outb(TSREG, 0x04);
@@ -2071,11 +2325,13 @@ static load_font(int segment, int size, char* font)
outb(GDCIDX, 0x04); outb(GDCREG, 0x02);
outb(GDCIDX, 0x05); outb(GDCREG, 0x00);
outb(GDCIDX, 0x06); outb(GDCREG, 0x05); /* addr = a0000, 64kb */
+ splx(s);
for (ch=0; ch < 256; ch++)
for (line=0; line < size; line++)
*((char *)atdevbase+(segment*0x4000)+(ch*32)+line) =
font[(ch*size)+line];
/* setup vga for text mode again */
+ s = splhigh();
inb(crtc_addr+6); /* reset flip/flop */
outb(ATC, 0x30); outb(ATC, 0x0C);
outb(TSIDX, 0x02); outb(TSREG, 0x03);
@@ -2088,6 +2344,7 @@ static load_font(int segment, int size, char* font)
else {
outb(GDCIDX, 0x06); outb(GDCREG, 0x0E); /* addr = b8000, 32kb */
}
+ splx(s);
outb(TSIDX, 0x01); val = inb(TSREG); /* unblank screen */
outb(TSIDX, 0x01); outb(TSREG, val & 0xDF);
}
OpenPOWER on IntegriCloud