diff --git a/sys/dev/kbd/kbdtables.h b/sys/dev/kbd/kbdtables.h index 013cf59e9b7f..45df7f5dd2b3 100644 --- a/sys/dev/kbd/kbdtables.h +++ b/sys/dev/kbd/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 -keymap_t key_map = { 107, /* US iso8859 keymap */ +#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 + +#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/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c index 6081c6522bb7..6828aca9f998 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/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; imax_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 '\t': - do { - wrtchar(scp, scp->attr | ' '); - } while (scp->posx % 8); + case 0x07: + if (scp == cur_scr_stat) + sysbeep(scp->bell_pitch, scp->bell_duration); + break; + 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; iattr; - 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 @@ u_int sgetc(int noblock) 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 @@ u_int sgetc(int noblock) 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 @@ u_int sgetc(int noblock) 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); } diff --git a/sys/i386/isa/kbdtables.h b/sys/i386/isa/kbdtables.h index 013cf59e9b7f..45df7f5dd2b3 100644 --- a/sys/i386/isa/kbdtables.h +++ b/sys/i386/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 -keymap_t key_map = { 107, /* US iso8859 keymap */ +#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 + +#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/i386/isa/syscons.c b/sys/i386/isa/syscons.c index 6081c6522bb7..6828aca9f998 100644 --- a/sys/i386/isa/syscons.c +++ b/sys/i386/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; imax_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 '\t': - do { - wrtchar(scp, scp->attr | ' '); - } while (scp->posx % 8); + case 0x07: + if (scp == cur_scr_stat) + sysbeep(scp->bell_pitch, scp->bell_duration); + break; + 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; iattr; - 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 @@ u_int sgetc(int noblock) 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 @@ u_int sgetc(int noblock) 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 @@ u_int sgetc(int noblock) 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); } diff --git a/sys/isa/kbdtables.h b/sys/isa/kbdtables.h index 013cf59e9b7f..45df7f5dd2b3 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 -keymap_t key_map = { 107, /* US iso8859 keymap */ +#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 + +#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 6081c6522bb7..6828aca9f998 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; imax_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 '\t': - do { - wrtchar(scp, scp->attr | ' '); - } while (scp->posx % 8); + case 0x07: + if (scp == cur_scr_stat) + sysbeep(scp->bell_pitch, scp->bell_duration); + break; + 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; iattr; - 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 @@ u_int sgetc(int noblock) 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 @@ u_int sgetc(int noblock) 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 @@ u_int sgetc(int noblock) 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); }