diff -u --recursive --new-file linux14m/linux/drivers/char/console.c linux/drivers/char/console.c
--- linux14m/linux/drivers/char/console.c	Sun Jan  2 13:40:38 1994
+++ linux/drivers/char/console.c	Fri Jan  7 01:07:10 1994
@@ -10,7 +10,7 @@
  * This module exports the console io functions:
  * 
  *	'long con_init(long)'
- *	'void con_open(struct tty_queue * queue, struct )'
+ *	'int con_open(struct tty_struct *tty, struct file * filp)'
  * 	'void update_screen(int new_console)'
  * 	'void blank_screen(void)'
  * 	'void unblank_screen(void)'
@@ -73,9 +73,10 @@
 
 extern void vt_init(void);
 extern void register_console(void (*proc)(const char *));
+extern void compute_shiftstate(void);
 
 unsigned long	video_num_columns;		/* Number of text columns	*/
-unsigned long	video_num_lines;		/* Number of test lines		*/
+unsigned long	video_num_lines;		/* Number of text lines		*/
 
 static unsigned char	video_type;		/* Type of display being used	*/
 static unsigned long	video_mem_base;		/* Base of video memory		*/
@@ -215,22 +216,22 @@
 /* 8-bit Latin-1 mapped to the PC charater set: '\0' means non-printable */
 (unsigned char *)
 	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\376\0\0\0\0\0"
 	" !\"#$%&'()*+,-./0123456789:;<=>?"
 	"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
 	"`abcdefghijklmnopqrstuvwxyz{|}~\0"
 	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
 	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\040\255\233\234\376\235\174\025\376\376\246\256\252\055\376\376"
+	"\377\255\233\234\376\235\174\025\376\376\246\256\252\055\376\376"
 	"\370\361\375\376\376\346\024\371\376\376\247\257\254\253\376\250"
 	"\376\376\376\376\216\217\222\200\376\220\376\376\376\376\376\376"
-	"\376\245\376\376\376\376\231\376\235\376\376\376\232\376\376\341"
+	"\376\245\376\376\376\376\231\376\350\376\376\376\232\376\376\341"
 	"\205\240\203\376\204\206\221\207\212\202\210\211\215\241\214\213"
-	"\376\244\225\242\223\376\224\366\233\227\243\226\201\376\376\230",
+	"\376\244\225\242\223\376\224\366\355\227\243\226\201\376\376\230",
 /* vt100 graphics */
 (unsigned char *)
 	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\376\0\0\0\0\0"
 	" !\"#$%&'()*+,-./0123456789:;<=>?"
 	"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^ "
 	"\004\261\007\007\007\007\370\361\007\007\331\277\332\300\305\304"
@@ -237,7 +238,7 @@
 	"\304\304\137\137\303\264\301\302\263\363\362\343\330\234\007\0"
 	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
 	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\040\255\233\234\376\235\174\025\376\376\246\256\252\055\376\376"
+	"\377\255\233\234\376\235\174\025\376\376\246\256\252\055\376\376"
 	"\370\361\375\376\376\346\024\371\376\376\247\257\254\253\376\250"
 	"\376\376\376\376\216\217\222\200\376\220\376\376\376\376\376\376"
 	"\376\245\376\376\376\376\231\376\376\376\376\376\232\376\376\341"
@@ -498,12 +499,16 @@
 
 static inline void del(int currcons)
 {
+#if 0
 	if (x) {
-		pos -= 2;
-		x--;
+		if (!need_wrap) {    /* this is not the right condition */
+		        pos -= 2;
+			x--;
+		}
 		*(unsigned short *)pos = video_erase_char;
 		need_wrap = 0;
 	}
+#endif
 }
 
 static void csi_J(int currcons, int vpar)
@@ -1547,6 +1552,7 @@
 	set_origin(fg_console);
 	set_cursor(new_console);
 	set_leds();
+	compute_shiftstate();
 	lock = 0;
 }
 
diff -u --recursive --new-file linux14m/linux/drivers/char/defkeymap.c linux/drivers/char/defkeymap.c
--- linux14m/linux/drivers/char/defkeymap.c	Wed Dec  1 13:44:15 1993
+++ linux/drivers/char/defkeymap.c	Fri Jan  7 01:07:10 1994
@@ -3,6 +3,7 @@
 
 #include <linux/types.h>
 #include <linux/keyboard.h>
+#include <linux/kd.h>
 
 u_short key_map[NR_KEYMAPS][NR_KEYS] = {
 	{
@@ -20,8 +21,8 @@
 	0x010b,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x030e,	0x0702,	0x030d,	0x001c,	0x0701,	0x0205,	0x0114,	0x0603,	
 	0x0118,	0x0601,	0x0602,	0x0117,	0x0600,	0x0119,	0x0115,	0x0116,	
+	0x011a,	0x010c,	0x010d,	0x011b,	0x011c,	0x0110,	0x0311,	0x011d,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	}, {
 	0x0200,	0x001b,	0x0021,	0x0040,	0x0023,	0x0024,	0x0025,	0x005e,	
 	0x0026,	0x002a,	0x0028,	0x0029,	0x005f,	0x002b,	0x007f,	0x0009,	
@@ -37,16 +38,16 @@
 	0x010b,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x030e,	0x0702,	0x030d,	0x0200,	0x0701,	0x0205,	0x0114,	0x0603,	
 	0x020b,	0x0601,	0x0602,	0x0117,	0x0600,	0x020a,	0x0115,	0x0116,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
+	0x011a,	0x010c,	0x010d,	0x011b,	0x011c,	0x0110,	0x0311,	0x011d,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	}, {
 	0x0200,	0x0200,	0x0200,	0x0040,	0x0200,	0x0024,	0x0200,	0x0200,	
 	0x007b,	0x005b,	0x005d,	0x007d,	0x005c,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x007e,	0x0201,	0x0702,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0700,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
+	0x0071,	0x0077,	0x0065,	0x0072,	0x0074,	0x0079,	0x0075,	0x0069,	
+	0x006f,	0x0070,	0x0200,	0x007e,	0x0201,	0x0702,	0x0061,	0x0073,	
+	0x0064,	0x0066,	0x0067,	0x0068,	0x006a,	0x006b,	0x006c,	0x0200,	
+	0x0200,	0x0200,	0x0700,	0x0200,	0x007a,	0x0078,	0x0063,	0x0076,	
+	0x0062,	0x006e,	0x006d,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
 	0x0703,	0x0200,	0x0207,	0x050c,	0x050d,	0x050e,	0x050f,	0x0510,	
 	0x0511,	0x0512,	0x0513,	0x0514,	0x0515,	0x0208,	0x0202,	0x0307,	
 	0x0308,	0x0309,	0x030b,	0x0304,	0x0305,	0x0306,	0x030a,	0x0301,	
@@ -54,16 +55,16 @@
 	0x0517,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x030e,	0x0702,	0x030d,	0x0200,	0x0701,	0x0205,	0x0114,	0x0603,	
 	0x0118,	0x0601,	0x0602,	0x0117,	0x0600,	0x0119,	0x0115,	0x0116,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
+	0x011a,	0x010c,	0x010d,	0x011b,	0x011c,	0x0110,	0x0311,	0x011d,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	}, {
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0201,	0x0702,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0700,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
+	0x0051,	0x0057,	0x0045,	0x0052,	0x0054,	0x0059,	0x0055,	0x0049,	
+	0x004f,	0x0050,	0x0200,	0x0200,	0x0201,	0x0702,	0x0041,	0x0053,	
+	0x0044,	0x0046,	0x0047,	0x0048,	0x004a,	0x004b,	0x004c,	0x0200,	
+	0x0200,	0x0200,	0x0700,	0x0200,	0x005a,	0x0058,	0x0043,	0x0056,	
+	0x0042,	0x004e,	0x004d,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
 	0x0703,	0x0200,	0x0207,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0208,	0x0200,	0x0307,	
 	0x0308,	0x0309,	0x030b,	0x0304,	0x0305,	0x0306,	0x030a,	0x0301,	
@@ -71,8 +72,8 @@
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x030e,	0x0702,	0x030d,	0x0200,	0x0701,	0x0205,	0x0114,	0x0603,	
 	0x0118,	0x0601,	0x0602,	0x0117,	0x0600,	0x0119,	0x0115,	0x0116,	
+	0x011a,	0x010c,	0x010d,	0x011b,	0x011c,	0x0110,	0x0311,	0x011d,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	}, {
 	0x0200,	0x0200,	0x0200,	0x0000,	0x001b,	0x001c,	0x001d,	0x001e,	
 	0x001f,	0x007f,	0x0200,	0x0200,	0x001f,	0x0200,	0x0200,	0x0200,	
@@ -80,7 +81,7 @@
 	0x000f,	0x0010,	0x001b,	0x001d,	0x0201,	0x0702,	0x0001,	0x0013,	
 	0x0004,	0x0006,	0x0007,	0x0008,	0x000a,	0x000b,	0x000c,	0x0200,	
 	0x0007,	0x0000,	0x0700,	0x001c,	0x001a,	0x0018,	0x0003,	0x0016,	
-	0x0002,	0x000e,	0x000d,	0x0200,	0x0200,	0x007f,	0x0700,	0x030c,	
+	0x0002,	0x000e,	0x000d,	0x0200,	0x020e,	0x007f,	0x0700,	0x030c,	
 	0x0703,	0x0000,	0x0207,	0x0100,	0x0101,	0x0102,	0x0103,	0x0104,	
 	0x0105,	0x0106,	0x0107,	0x0108,	0x0109,	0x0208,	0x0204,	0x0307,	
 	0x0308,	0x0309,	0x030b,	0x0304,	0x0305,	0x0306,	0x030a,	0x0301,	
@@ -88,16 +89,16 @@
 	0x010b,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x030e,	0x0702,	0x030d,	0x001c,	0x0701,	0x0205,	0x0114,	0x0603,	
 	0x0118,	0x0601,	0x0602,	0x0117,	0x0600,	0x0119,	0x0115,	0x0116,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
+	0x011a,	0x010c,	0x010d,	0x011b,	0x011c,	0x0110,	0x0311,	0x011d,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	}, {
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0201,	0x0702,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0700,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
+	0x0200,	0x0200,	0x0200,	0x0000,	0x0200,	0x0200,	0x0200,	0x0200,	
+	0x0200,	0x0200,	0x0200,	0x0200,	0x001f,	0x0200,	0x0200,	0x0200,	
+	0x0011,	0x0017,	0x0005,	0x0012,	0x0014,	0x0019,	0x0015,	0x0009,	
+	0x000f,	0x0010,	0x0200,	0x0200,	0x0201,	0x0702,	0x0001,	0x0013,	
+	0x0004,	0x0006,	0x0007,	0x0008,	0x000a,	0x000b,	0x000c,	0x0200,	
+	0x0200,	0x0200,	0x0700,	0x0200,	0x001a,	0x0018,	0x0003,	0x0016,	
+	0x0002,	0x000e,	0x000d,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
 	0x0703,	0x0200,	0x0207,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0208,	0x0200,	0x0307,	
 	0x0308,	0x0309,	0x030b,	0x0304,	0x0305,	0x0306,	0x030a,	0x0301,	
@@ -105,16 +106,16 @@
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x030e,	0x0702,	0x030d,	0x0200,	0x0701,	0x0205,	0x0114,	0x0603,	
 	0x0118,	0x0601,	0x0602,	0x0117,	0x0600,	0x0119,	0x0115,	0x0116,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
+	0x011a,	0x010c,	0x010d,	0x011b,	0x011c,	0x0110,	0x0311,	0x011d,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	}, {
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0201,	0x0702,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0700,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
+	0x0011,	0x0017,	0x0005,	0x0012,	0x0014,	0x0019,	0x0015,	0x0009,	
+	0x000f,	0x0010,	0x0200,	0x0200,	0x0201,	0x0702,	0x0001,	0x0013,	
+	0x0004,	0x0006,	0x0007,	0x0008,	0x000a,	0x000b,	0x000c,	0x0200,	
+	0x0200,	0x0200,	0x0700,	0x0200,	0x001a,	0x0018,	0x0003,	0x0016,	
+	0x0002,	0x000e,	0x000d,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
 	0x0703,	0x0200,	0x0207,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0208,	0x0200,	0x0307,	
 	0x0308,	0x0309,	0x030b,	0x0304,	0x0305,	0x0306,	0x030a,	0x0301,	
@@ -122,16 +123,16 @@
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x030e,	0x0702,	0x030d,	0x0200,	0x0701,	0x0205,	0x0114,	0x0603,	
 	0x0118,	0x0601,	0x0602,	0x0117,	0x0600,	0x0119,	0x0115,	0x020c,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
+	0x011a,	0x010c,	0x010d,	0x011b,	0x011c,	0x0110,	0x0311,	0x011d,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	}, {
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0201,	0x0702,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0700,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
+	0x0011,	0x0017,	0x0005,	0x0012,	0x0014,	0x0019,	0x0015,	0x0009,	
+	0x000f,	0x0010,	0x0200,	0x0200,	0x0201,	0x0702,	0x0001,	0x0013,	
+	0x0004,	0x0006,	0x0007,	0x0008,	0x000a,	0x000b,	0x000c,	0x0200,	
+	0x0200,	0x0200,	0x0700,	0x0200,	0x001a,	0x0018,	0x0003,	0x0016,	
+	0x0002,	0x000e,	0x000d,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
 	0x0703,	0x0200,	0x0207,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0208,	0x0200,	0x0307,	
 	0x0308,	0x0309,	0x030b,	0x0304,	0x0305,	0x0306,	0x030a,	0x0301,	
@@ -139,7 +140,7 @@
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x030e,	0x0702,	0x030d,	0x0200,	0x0701,	0x0205,	0x0114,	0x0603,	
 	0x0118,	0x0601,	0x0602,	0x0117,	0x0600,	0x0119,	0x0115,	0x0116,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
+	0x011a,	0x010c,	0x010d,	0x011b,	0x011c,	0x0110,	0x0311,	0x011d,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	}, {
 	0x0200,	0x081b,	0x0831,	0x0832,	0x0833,	0x0834,	0x0835,	0x0836,	
@@ -156,16 +157,16 @@
 	0x050b,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x030e,	0x0702,	0x030d,	0x001c,	0x0701,	0x0205,	0x0114,	0x0603,	
 	0x0118,	0x0601,	0x0602,	0x0117,	0x0600,	0x0119,	0x0115,	0x0116,	
+	0x011a,	0x010c,	0x010d,	0x011b,	0x011c,	0x0110,	0x0311,	0x011d,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	}, {
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0201,	0x0702,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0700,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
+	0x0851,	0x0857,	0x0845,	0x0852,	0x0854,	0x0859,	0x0855,	0x0849,	
+	0x084f,	0x0850,	0x0200,	0x0200,	0x0201,	0x0702,	0x0841,	0x0853,	
+	0x0844,	0x0846,	0x0847,	0x0848,	0x084a,	0x084b,	0x084c,	0x0200,	
+	0x0200,	0x0200,	0x0700,	0x0200,	0x085a,	0x0858,	0x0843,	0x0856,	
+	0x0842,	0x084e,	0x084d,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
 	0x0703,	0x0200,	0x0207,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0208,	0x0200,	0x0307,	
 	0x0308,	0x0309,	0x030b,	0x0304,	0x0305,	0x0306,	0x030a,	0x0301,	
@@ -173,16 +174,16 @@
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x030e,	0x0702,	0x030d,	0x0200,	0x0701,	0x0205,	0x0114,	0x0603,	
 	0x0118,	0x0601,	0x0602,	0x0117,	0x0600,	0x0119,	0x0115,	0x0116,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
+	0x011a,	0x010c,	0x010d,	0x011b,	0x011c,	0x0110,	0x0311,	0x011d,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	}, {
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0201,	0x0702,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0700,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
+	0x0871,	0x0877,	0x0865,	0x0872,	0x0874,	0x0879,	0x0875,	0x0869,	
+	0x086f,	0x0870,	0x0200,	0x0200,	0x0201,	0x0702,	0x0861,	0x0873,	
+	0x0864,	0x0866,	0x0867,	0x0868,	0x086a,	0x086b,	0x086c,	0x0200,	
+	0x0200,	0x0200,	0x0700,	0x0200,	0x087a,	0x0878,	0x0863,	0x0876,	
+	0x0862,	0x086e,	0x086d,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
 	0x0703,	0x0200,	0x0207,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0208,	0x0200,	0x0307,	
 	0x0308,	0x0309,	0x030b,	0x0304,	0x0305,	0x0306,	0x030a,	0x0301,	
@@ -190,16 +191,16 @@
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x030e,	0x0702,	0x030d,	0x0200,	0x0701,	0x0205,	0x0114,	0x0603,	
 	0x0118,	0x0601,	0x0602,	0x0117,	0x0600,	0x0119,	0x0115,	0x0116,	
+	0x011a,	0x010c,	0x010d,	0x011b,	0x011c,	0x0110,	0x0311,	0x011d,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	}, {
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0201,	0x0702,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0700,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
+	0x0851,	0x0857,	0x0845,	0x0852,	0x0854,	0x0859,	0x0855,	0x0849,	
+	0x084f,	0x0850,	0x0200,	0x0200,	0x0201,	0x0702,	0x0841,	0x0853,	
+	0x0844,	0x0846,	0x0847,	0x0848,	0x084a,	0x084b,	0x084c,	0x0200,	
+	0x0200,	0x0200,	0x0700,	0x0200,	0x085a,	0x0858,	0x0843,	0x0856,	
+	0x0842,	0x084e,	0x084d,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
 	0x0703,	0x0200,	0x0207,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0208,	0x0200,	0x0307,	
 	0x0308,	0x0309,	0x030b,	0x0304,	0x0305,	0x0306,	0x030a,	0x0301,	
@@ -207,16 +208,16 @@
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x030e,	0x0702,	0x030d,	0x0200,	0x0701,	0x0205,	0x0114,	0x0603,	
 	0x0118,	0x0601,	0x0602,	0x0117,	0x0600,	0x0119,	0x0115,	0x0116,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
+	0x011a,	0x010c,	0x010d,	0x011b,	0x011c,	0x0110,	0x0311,	0x011d,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	}, {
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0201,	0x0702,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0700,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
+	0x0811,	0x0817,	0x0805,	0x0812,	0x0814,	0x0819,	0x0815,	0x0809,	
+	0x080f,	0x0810,	0x0200,	0x0200,	0x0201,	0x0702,	0x0801,	0x0813,	
+	0x0804,	0x0806,	0x0807,	0x0808,	0x080a,	0x080b,	0x080c,	0x0200,	
+	0x0200,	0x0200,	0x0700,	0x0200,	0x081a,	0x0818,	0x0803,	0x0816,	
+	0x0802,	0x080e,	0x080d,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
 	0x0703,	0x0200,	0x0207,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0208,	0x0200,	0x0307,	
 	0x0308,	0x0309,	0x030b,	0x0304,	0x0305,	0x0306,	0x030a,	0x0301,	
@@ -224,16 +225,16 @@
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x030e,	0x0702,	0x030d,	0x0200,	0x0701,	0x0205,	0x0114,	0x0603,	
 	0x0118,	0x0601,	0x0602,	0x0117,	0x0600,	0x0119,	0x0115,	0x020c,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
+	0x011a,	0x010c,	0x010d,	0x011b,	0x011c,	0x0110,	0x0311,	0x011d,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	}, {
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0201,	0x0702,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0700,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
+	0x0811,	0x0817,	0x0805,	0x0812,	0x0814,	0x0819,	0x0815,	0x0809,	
+	0x080f,	0x0810,	0x0200,	0x0200,	0x0201,	0x0702,	0x0801,	0x0813,	
+	0x0804,	0x0806,	0x0807,	0x0808,	0x080a,	0x080b,	0x080c,	0x0200,	
+	0x0200,	0x0200,	0x0700,	0x0200,	0x081a,	0x0818,	0x0803,	0x0816,	
+	0x0802,	0x080e,	0x080d,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
 	0x0703,	0x0200,	0x0207,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0208,	0x0200,	0x0307,	
 	0x0308,	0x0309,	0x030b,	0x0304,	0x0305,	0x0306,	0x030a,	0x0301,	
@@ -241,16 +242,16 @@
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x030e,	0x0702,	0x030d,	0x0200,	0x0701,	0x0205,	0x0114,	0x0603,	
 	0x0118,	0x0601,	0x0602,	0x0117,	0x0600,	0x0119,	0x0115,	0x0116,	
+	0x011a,	0x010c,	0x010d,	0x011b,	0x011c,	0x0110,	0x0311,	0x011d,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	}, {
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0201,	0x0702,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0700,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
+	0x0811,	0x0817,	0x0805,	0x0812,	0x0814,	0x0819,	0x0815,	0x0809,	
+	0x080f,	0x0810,	0x0200,	0x0200,	0x0201,	0x0702,	0x0801,	0x0813,	
+	0x0804,	0x0806,	0x0807,	0x0808,	0x080a,	0x080b,	0x080c,	0x0200,	
+	0x0200,	0x0200,	0x0700,	0x0200,	0x081a,	0x0818,	0x0803,	0x0816,	
+	0x0802,	0x080e,	0x080d,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
 	0x0703,	0x0200,	0x0207,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0208,	0x0200,	0x0307,	
 	0x0308,	0x0309,	0x030b,	0x0304,	0x0305,	0x0306,	0x030a,	0x0301,	
@@ -258,16 +259,16 @@
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x030e,	0x0702,	0x030d,	0x0200,	0x0701,	0x0205,	0x0114,	0x0603,	
 	0x0118,	0x0601,	0x0602,	0x0117,	0x0600,	0x0119,	0x0115,	0x0116,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
+	0x011a,	0x010c,	0x010d,	0x011b,	0x011c,	0x0110,	0x0311,	0x011d,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	}, {
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0201,	0x0702,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0700,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
+	0x0811,	0x0817,	0x0805,	0x0812,	0x0814,	0x0819,	0x0815,	0x0809,	
+	0x080f,	0x0810,	0x0200,	0x0200,	0x0201,	0x0702,	0x0801,	0x0813,	
+	0x0804,	0x0806,	0x0807,	0x0808,	0x080a,	0x080b,	0x080c,	0x0200,	
+	0x0200,	0x0200,	0x0700,	0x0200,	0x081a,	0x0818,	0x0803,	0x0816,	
+	0x0802,	0x080e,	0x080d,	0x0200,	0x0200,	0x0200,	0x0700,	0x030c,	
 	0x0703,	0x0200,	0x0207,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0208,	0x0200,	0x0307,	
 	0x0308,	0x0309,	0x030b,	0x0304,	0x0305,	0x0306,	0x030a,	0x0301,	
@@ -275,7 +276,7 @@
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	0x030e,	0x0702,	0x030d,	0x0200,	0x0701,	0x0205,	0x0114,	0x0603,	
 	0x0118,	0x0601,	0x0602,	0x0117,	0x0600,	0x0119,	0x0115,	0x0116,	
-	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
+	0x011a,	0x010c,	0x010d,	0x011b,	0x011c,	0x0110,	0x0311,	0x011d,	
 	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	0x0200,	
 	}, 
 };
@@ -307,6 +308,10 @@
 	'\033', '[', '4', '~', 0, 
 	'\033', '[', '5', '~', 0, 
 	'\033', '[', '6', '~', 0, 
+	'\033', '[', 'M', 0, 
+	0, 
+	0, 
+	'\033', '[', 'P', 0, 
 	0, 
 	0, 
 	0, 
@@ -343,9 +348,52 @@
 	func_buf + 135,
 	func_buf + 140,
 	func_buf + 145,
-	func_buf + 146,
-	func_buf + 147,
-	func_buf + 148,
 	func_buf + 149,
 	func_buf + 150,
+	func_buf + 151,
+	func_buf + 155,
+	func_buf + 156,
+	func_buf + 157,
+	func_buf + 158,
+	func_buf + 159,
+	func_buf + 160,
 };
+
+struct kbdiacr accent_table[MAX_DIACR] = {
+	{'`', 'A', '\300'},	{'`', 'a', '\340'},
+	{'\'', 'A', '\301'},	{'\'', 'a', '\341'},
+	{'^', 'A', '\302'},	{'^', 'a', '\342'},
+	{'~', 'A', '\303'},	{'~', 'a', '\343'},
+	{'"', 'A', '\304'},	{'"', 'a', '\344'},
+	{'O', 'A', '\305'},	{'o', 'a', '\345'},
+	{'0', 'A', '\305'},	{'0', 'a', '\345'},
+	{'A', 'A', '\305'},	{'a', 'a', '\345'},
+	{'A', 'E', '\306'},	{'a', 'e', '\346'},
+	{',', 'C', '\307'},	{',', 'c', '\347'},
+	{'`', 'E', '\310'},	{'`', 'e', '\350'},
+	{'\'', 'E', '\311'},	{'\'', 'e', '\351'},
+	{'^', 'E', '\312'},	{'^', 'e', '\352'},
+	{'"', 'E', '\313'},	{'"', 'e', '\353'},
+	{'`', 'I', '\314'},	{'`', 'i', '\354'},
+	{'\'', 'I', '\315'},	{'\'', 'i', '\355'},
+	{'^', 'I', '\316'},	{'^', 'i', '\356'},
+	{'"', 'I', '\317'},	{'"', 'i', '\357'},
+	{'-', 'D', '\320'},	{'-', 'd', '\360'},
+	{'~', 'N', '\321'},	{'~', 'n', '\361'},
+	{'`', 'O', '\322'},	{'`', 'o', '\362'},
+	{'\'', 'O', '\323'},	{'\'', 'o', '\363'},
+	{'^', 'O', '\324'},	{'^', 'o', '\364'},
+	{'~', 'O', '\325'},	{'~', 'o', '\365'},
+	{'"', 'O', '\326'},	{'"', 'o', '\366'},
+	{'/', 'O', '\330'},	{'/', 'o', '\370'},
+	{'`', 'U', '\331'},	{'`', 'u', '\371'},
+	{'\'', 'U', '\332'},	{'\'', 'u', '\372'},
+	{'^', 'U', '\333'},	{'^', 'u', '\373'},
+	{'"', 'U', '\334'},	{'"', 'u', '\374'},
+	{'\'', 'Y', '\335'},	{'\'', 'y', '\375'},
+	{'T', 'H', '\336'},	{'t', 'h', '\376'},
+	{'s', 's', '\337'},	{'"', 'y', '\377'},
+	{'s', 'z', '\337'},	{'i', 'j', '\377'},
+};
+
+unsigned int accent_table_size = 68;
diff -u --recursive --new-file linux14m/linux/drivers/char/defkeymap.map linux/drivers/char/defkeymap.map
--- linux14m/linux/drivers/char/defkeymap.map	Wed Dec  1 13:44:15 1993
+++ linux/drivers/char/defkeymap.map	Fri Jan  7 01:07:10 1994
@@ -5,6 +5,7 @@
 	alt     keycode   2 = Meta_one        
 keycode   3 = two              at               at              
 	control keycode   3 = nul             
+	shift control keycode 3 = nul
 	alt     keycode   3 = Meta_two        
 keycode   4 = three            numbersign      
 	control keycode   4 = Escape          
@@ -30,6 +31,7 @@
 	alt     keycode  11 = Meta_zero       
 keycode  12 = minus            underscore       backslash       
 	control keycode  12 = Control_underscore
+	shift control keycode 12 = Control_underscore
 	alt     keycode  12 = Meta_minus      
 keycode  13 = equal            plus            
 	alt     keycode  13 = Meta_equal      
@@ -54,7 +56,7 @@
 	control keycode  27 = Control_bracketright
 	alt     keycode  27 = Meta_bracketright
 keycode  28 = Return          
-	alt     keycode  28 = 0x080d          
+	alt     keycode  28 = Meta_Control_m  
 keycode  29 = Control         
 keycode  30 = a               
 keycode  31 = s               
@@ -87,6 +89,7 @@
 keycode  51 = comma            less            
 	alt     keycode  51 = Meta_comma      
 keycode  52 = period           greater         
+	control keycode  52 = Compose
 	alt     keycode  52 = Meta_period     
 keycode  53 = slash            question        
 	control keycode  53 = Delete          
@@ -196,14 +199,14 @@
 keycode 111 = Remove          
 	altgr   control keycode 111 = Boot            
 	control alt     keycode 111 = Boot            
-keycode 112 =
-keycode 113 =
-keycode 114 =
-keycode 115 =
-keycode 116 =
-keycode 117 =
-keycode 118 =
-keycode 119 =
+keycode 112 = Macro           
+keycode 113 = F13             
+keycode 114 = F14             
+keycode 115 = Help            
+keycode 116 = Do              
+keycode 117 = F17             
+keycode 118 = KP_MinPlus      
+keycode 119 = Pause
 keycode 120 =
 keycode 121 =
 keycode 122 =
@@ -238,6 +241,10 @@
 string Select = "\033[4~"
 string Prior = "\033[5~"
 string Next = "\033[6~"
+string Help = ""
+string Do = ""
+string Macro = "\033[M"
+string Pause = "\033[P"
 string F21 = ""
 string F22 = ""
 string F23 = ""
@@ -244,3 +251,71 @@
 string F24 = ""
 string F25 = ""
 string F26 = ""
+compose '`' 'A' to ''
+compose '`' 'a' to ''
+compose '\'' 'A' to ''
+compose '\'' 'a' to ''
+compose '^' 'A' to ''
+compose '^' 'a' to ''
+compose '~' 'A' to ''
+compose '~' 'a' to ''
+compose '"' 'A' to ''
+compose '"' 'a' to ''
+compose 'O' 'A' to ''
+compose 'o' 'a' to ''
+compose '0' 'A' to ''
+compose '0' 'a' to ''
+compose 'A' 'A' to ''
+compose 'a' 'a' to ''
+compose 'A' 'E' to ''
+compose 'a' 'e' to ''
+compose ',' 'C' to ''
+compose ',' 'c' to ''
+compose '`' 'E' to ''
+compose '`' 'e' to ''
+compose '\'' 'E' to ''
+compose '\'' 'e' to ''
+compose '^' 'E' to ''
+compose '^' 'e' to ''
+compose '"' 'E' to ''
+compose '"' 'e' to ''
+compose '`' 'I' to ''
+compose '`' 'i' to ''
+compose '\'' 'I' to ''
+compose '\'' 'i' to ''
+compose '^' 'I' to ''
+compose '^' 'i' to ''
+compose '"' 'I' to ''
+compose '"' 'i' to ''
+compose '-' 'D' to ''
+compose '-' 'd' to ''
+compose '~' 'N' to ''
+compose '~' 'n' to ''
+compose '`' 'O' to ''
+compose '`' 'o' to ''
+compose '\'' 'O' to ''
+compose '\'' 'o' to ''
+compose '^' 'O' to ''
+compose '^' 'o' to ''
+compose '~' 'O' to ''
+compose '~' 'o' to ''
+compose '"' 'O' to ''
+compose '"' 'o' to ''
+compose '/' 'O' to ''
+compose '/' 'o' to ''
+compose '`' 'U' to ''
+compose '`' 'u' to ''
+compose '\'' 'U' to ''
+compose '\'' 'u' to ''
+compose '^' 'U' to ''
+compose '^' 'u' to ''
+compose '"' 'U' to ''
+compose '"' 'u' to ''
+compose '\'' 'Y' to ''
+compose '\'' 'y' to ''
+compose 'T' 'H' to ''
+compose 't' 'h' to ''
+compose 's' 's' to ''
+compose '"' 'y' to ''
+compose 's' 'z' to ''
+compose 'i' 'j' to ''
diff -u --recursive --new-file linux14m/linux/drivers/char/diacr.h linux/drivers/char/diacr.h
--- linux14m/linux/drivers/char/diacr.h
+++ linux/drivers/char/diacr.h	Fri Jan  7 01:07:11 1994
@@ -0,0 +1,8 @@
+#ifndef _DIACR_H
+#define _DIACR_H
+#include <linux/kd.h>
+
+extern struct kbdiacr accent_table[];
+extern unsigned int accent_table_size;
+
+#endif /* _DIACR_H */
diff -u --recursive --new-file linux14m/linux/drivers/char/keyboard.c linux/drivers/char/keyboard.c
--- linux14m/linux/drivers/char/keyboard.c	Wed Dec  1 13:44:15 1993
+++ linux/drivers/char/keyboard.c	Fri Jan  7 01:07:11 1994
@@ -7,8 +7,8 @@
  * the assembly version by Linus (with diacriticals added)
  *
  * Some additional features added by Christoph Niemann (ChN), March 1993
- *
  * Loadable keymaps by Risto Kankkunen, May 1993
+ * Diacriticals redone & other small changes, aeb@cwi.nl, June 1993
  */
 
 #define KEYBOARD_IRQ 1
@@ -25,6 +25,10 @@
 
 #include <asm/bitops.h>
 
+#include "diacr.h"
+
+#define SIZE(x) (sizeof(x)/sizeof((x)[0]))
+
 #ifndef KBD_DEFFLAGS
 
 #ifdef CONFIG_KBD_META
@@ -64,8 +68,11 @@
 
 unsigned char kbd_read_mask = 0x01;	/* modified by psaux.c */
 
-unsigned long kbd_dead_keys = 0;
-unsigned long kbd_prev_dead_keys = 0;
+/*
+ * global state includes the following, and various static variables
+ * in this module: prev_scancode, shift_state, diacr, npadch,
+ *   dead_key_next, last_console
+ */
 
 /* shift state counters.. */
 static unsigned char k_down[NR_SHIFT] = {0, };
@@ -74,6 +81,10 @@
 
 static int want_console = -1;
 static int last_console = 0;		/* last used VC */
+static int dead_key_next = 0;
+static int shift_state = 0;
+static int npadch = -1;		        /* -1 or number assembled on pad */
+static unsigned char diacr = 0;
 static char rep = 0;			/* flag telling character repeat */
 struct kbd_struct kbd_table[NR_CONSOLES];
 static struct kbd_struct * kbd = kbd_table;
@@ -103,25 +114,18 @@
 
 /* maximum values each key_handler can handle */
 const int max_vals[] = {
-	255, NR_FUNC - 1, 13, 16, 4, 255, 3, NR_SHIFT,
+	255, NR_FUNC - 1, 14, 17, 4, 255, 3, NR_SHIFT,
 	255, 9, 3
 };
 
-const int NR_TYPES = (sizeof(max_vals) / sizeof(int));
-
-#define E0_BASE 96
-
-static int shift_state = 0;
-static int diacr = -1;
-static int npadch = 0;
+const int NR_TYPES = SIZE(max_vals);
 
 static void put_queue(int);
-static unsigned int handle_diacr(unsigned int);
+static unsigned char handle_diacr(unsigned char);
 
+/* pt_regs - set by keyboard_interrupt(), used by show_ptregs() */
 static struct pt_regs * pt_regs;
 
-static inline void translate(unsigned char scancode);
-
 static inline void kb_wait(void)
 {
 	int i;
@@ -137,15 +141,67 @@
 	outb(c,0x64);
 }
 
+/*
+ * Translation of escaped scancodes to keysyms.
+ * This should be user-settable.
+ */
+#define E0_BASE 96
+
+#define E0_KPENTER (E0_BASE+0)
+#define E0_RCTRL   (E0_BASE+1)
+#define E0_KPSLASH (E0_BASE+2)
+#define E0_PRSCR   (E0_BASE+3)
+#define E0_RALT    (E0_BASE+4)
+#define E0_BREAK   (E0_BASE+5)  /* (control-pause) */
+#define E0_HOME    (E0_BASE+6)
+#define E0_UP      (E0_BASE+7)
+#define E0_PGUP    (E0_BASE+8)
+#define E0_LEFT    (E0_BASE+9)
+#define E0_RIGHT   (E0_BASE+10)
+#define E0_END     (E0_BASE+11)
+#define E0_DOWN    (E0_BASE+12)
+#define E0_PGDN    (E0_BASE+13)
+#define E0_INS     (E0_BASE+14)
+#define E0_DEL     (E0_BASE+15)
+/* BTC */
+#define E0_MACRO   (E0_BASE+16)
+/* LK450 */
+#define E0_F13     (E0_BASE+17)
+#define E0_F14     (E0_BASE+18)
+#define E0_HELP    (E0_BASE+19)
+#define E0_DO      (E0_BASE+20)
+#define E0_F17     (E0_BASE+21)
+#define E0_KPMINPLUS (E0_BASE+22)
+
+#define E1_PAUSE   (E0_BASE+23)
+
+static unsigned char e0_keys[128] = {
+  0, 0, 0, 0, 0, 0, 0, 0,			      /* 0x00-0x07 */
+  0, 0, 0, 0, 0, 0, 0, 0,			      /* 0x08-0x0f */
+  0, 0, 0, 0, 0, 0, 0, 0,			      /* 0x10-0x17 */
+  0, 0, 0, 0, E0_KPENTER, E0_RCTRL, 0, 0,	      /* 0x18-0x1f */
+  0, 0, 0, 0, 0, 0, 0, 0,			      /* 0x20-0x27 */
+  0, 0, 0, 0, 0, 0, 0, 0,			      /* 0x28-0x2f */
+  0, 0, 0, 0, 0, E0_KPSLASH, 0, E0_PRSCR,	      /* 0x30-0x37 */
+  E0_RALT, 0, 0, 0, 0, E0_F13, E0_F14, E0_HELP,	      /* 0x38-0x3f */
+  E0_DO, E0_F17, 0, 0, 0, 0, E0_BREAK, E0_HOME,	      /* 0x40-0x47 */
+  E0_UP, E0_PGUP, 0, E0_LEFT, 0, E0_RIGHT, E0_KPMINPLUS, E0_END,/* 0x48-0x4f */
+  E0_DOWN, E0_PGDN, E0_INS, E0_DEL, 0, 0, 0, 0,	      /* 0x50-0x57 */
+  0, 0, 0, 0, 0, 0, 0, 0,			      /* 0x58-0x5f */
+  0, 0, 0, 0, 0, 0, 0, 0,			      /* 0x60-0x67 */
+  0, 0, 0, 0, 0, 0, 0, E0_MACRO,		      /* 0x68-0x6f */
+  0, 0, 0, 0, 0, 0, 0, 0,			      /* 0x70-0x77 */
+  0, 0, 0, 0, 0, 0, 0, 0			      /* 0x78-0x7f */
+};
+
 static void keyboard_interrupt(int int_pt_regs)
 {
 	unsigned char scancode;
+	static unsigned int prev_scancode = 0;   /* remember E0, E1 */
+	char up_flag;		                 /* 0 or 0200 */
+	char raw_mode;
 
 	pt_regs = (struct pt_regs *) int_pt_regs;
-	kbd_prev_dead_keys |= kbd_dead_keys;
-	if (!kbd_dead_keys)
-		kbd_prev_dead_keys = 0;
-	kbd_dead_keys = 0;
 	send_cmd(0xAD);		/* disable keyboard */
 	kb_wait();
 	if ((inb_p(0x64) & kbd_read_mask) != 0x01)
@@ -160,113 +216,106 @@
 		goto end_kbd_intr;
 	}
 	tty = TTY_TABLE(0);
-	kbd = kbd_table + fg_console;
-	if (vc_kbd_flag(kbd,VC_RAW)) {
-		memset(k_down, 0, sizeof(k_down));
-		memset(key_down, 0, sizeof(key_down));
-		shift_state = 0;
-		put_queue(scancode);
+ 	kbd = kbd_table + fg_console;
+	if ((raw_mode = vc_kbd_flag(kbd,VC_RAW))) {
+ 		put_queue(scancode);
+		/* we do not return yet, because we want to maintain
+		   the key_down array, so that we have the correct
+		   values when finishing RAW mode or when changing VT's */
+ 	}
+	if (scancode == 0xe0 || scancode == 0xe1) {
+		prev_scancode = scancode;
 		goto end_kbd_intr;
-	} else
-		translate(scancode);
-end_kbd_intr:
-	send_cmd(0xAE);		/* enable keyboard */
-	return;
-}
+ 	}
 
-static inline void translate(unsigned char scancode)
-{
-	char break_flag;
-     	static unsigned char e0_keys[] = {
-		0x1c,	/* keypad enter */
-		0x1d,	/* right control */
-		0x35,	/* keypad slash */
-		0x37,	/* print screen */
-		0x38,	/* right alt */
-		0x46,	/* break (control-pause) */
-		0x47,	/* editpad home */
-		0x48,	/* editpad up */
-		0x49,	/* editpad pgup */
-		0x4b,	/* editpad left */
-		0x4d,	/* editpad right */
-		0x4f,	/* editpad end */
-		0x50,	/* editpad dn */
-		0x51,	/* editpad pgdn */
-		0x52,	/* editpad ins */
-		0x53,	/* editpad del */
-#ifdef LK450
-		0x3d,	/* f13 */
-		0x3e,	/* f14 */
-		0x3f,	/* help */
-		0x40,	/* do */
-		0x41,	/* f17 */
-		0x4e	/* keypad minus/plus */
-#endif
-#ifdef BTC
-		0x6f    /* macro */
-#endif
-	};
+ 	/*
+	 *  Convert scancode to keysym, using prev_scancode.
+ 	 */
+	up_flag = (scancode & 0200);
+ 	scancode &= 0x7f;
+  
+	if (prev_scancode) {
+	  /*
+	   * usually it will be 0xe0, but a Pause key generates
+	   * e1 1d 45 e1 9d c5 when pressed, and nothing when released
+	   */
+	  if (prev_scancode != 0xe0) {
+	      if (prev_scancode == 0xe1 && scancode == 0x1d) {
+		  prev_scancode = 0x100;
+		  goto end_kbd_intr;
+	      } else if (prev_scancode == 0x100 && scancode == 0x45) {
+		  scancode = E1_PAUSE;
+		  prev_scancode = 0;
+	      } else {
+		  printk("keyboard: unknown e1 escape sequence\n");
+		  prev_scancode = 0;
+		  goto end_kbd_intr;
+	      }
+	  } else {
+	      prev_scancode = 0;
+	      /*
+	       *  The keyboard maintains its own internal caps lock and
+	       *  num lock statuses. In caps lock mode E0 AA precedes make
+	       *  code and E0 2A follows break code. In num lock mode,
+	       *  E0 2A precedes make code and E0 AA follows break code.
+	       *  We do our own book-keeping, so we will just ignore these.
+	       */
+	      /*
+	       *  For my keyboard there is no caps lock mode, but there are
+	       *  both Shift-L and Shift-R modes. The former mode generates
+	       *  E0 2A / E0 AA pairs, the latter E0 B6 / E0 36 pairs.
+	       *  So, we should also ignore the latter. - aeb@cwi.nl
+	       */
+	      if (scancode == 0x2a || scancode == 0x36)
+		goto end_kbd_intr;
 
-	if (scancode == 0xe0) {
-		set_kbd_dead(KGD_E0);
-		return;
-	}
-	if (scancode == 0xe1) {
-		set_kbd_dead(KGD_E1);
-		return;
-	}
+	      if (e0_keys[scancode])
+		scancode = e0_keys[scancode];
+	      else if (!raw_mode) {
+		  printk("keyboard: unknown scancode e0 %02x\n", scancode);
+		  goto end_kbd_intr;
+	      }
+	  }
+	} else if (scancode >= E0_BASE && !raw_mode) {
+	  printk("keyboard: scancode (%02x) not in range 00 - %2x\n",
+		 scancode, E0_BASE - 1);
+	  goto end_kbd_intr;
+ 	}
+  
 	/*
-	 *  The keyboard maintains its own internal caps lock and num lock
-	 *  statuses. In caps lock mode E0 AA precedes make code and E0 2A
-	 *  follows break code. In num lock mode, E0 2A precedes make
-	 *  code and E0 AA follows break code. We do our own book-keeping,
-	 *  so we will just ignore these.
+	 * At this point the variable `scancode' contains the keysym.
+	 * We keep track of the up/down status of the key, and
+	 * return the keysym if in MEDIUMRAW mode.
+	 * (Note: earlier kernels had a bug and did not pass the up/down
+	 * bit to applications.)
 	 */
-	if (kbd_dead(KGD_E0) && (scancode == 0x2a || scancode == 0xaa ||
-				 scancode == 0x36 || scancode == 0xb6))
-		return;
-
-	/* map two byte scancodes into one byte id's */
-
-	break_flag = scancode > 0x7f;
-	scancode &= 0x7f;
-
-	if (kbd_dead(KGD_E0)) {
-		int i;
-		for (i = 0; i < sizeof(e0_keys); i++)
-			if (scancode == e0_keys[i]) {
-				scancode = E0_BASE + i;
-				i = -1;
-				break;
-			}
-		if (i != -1) {
-#if 0
-			printk("keyboard: unknown scancode e0 %02x\n", scancode);
-#endif
-			return;
-		}
-	} else if (scancode >= E0_BASE) {
-#if 0
-		printk("keyboard: scancode (%02x) not in range 00 - %2x\n", scancode, E0_BASE - 1);
-#endif
-		return;
-	}
 
-	rep = 0;
-	if (break_flag)
-		clear_bit(scancode, key_down);
-	else
-		rep = set_bit(scancode, key_down);
+	if (up_flag) {
+ 		clear_bit(scancode, key_down);
+		rep = 0;
+	} else
+ 		rep = set_bit(scancode, key_down);
+  
+	if (raw_mode)
+	        goto end_kbd_intr;
 
-	if (vc_kbd_flag(kbd, VC_MEDIUMRAW)) {
-		put_queue(scancode);
-		return;
-	}
+ 	if (vc_kbd_flag(kbd, VC_MEDIUMRAW)) {
+ 		put_queue(scancode + up_flag);
+		goto end_kbd_intr;
+ 	}
+  
+ 	/*
+	 * Small change in philosophy: earlier we defined repetition by
+	 *	 rep = scancode == prev_keysym;
+	 *	 prev_keysym = scancode;
+	 * but now by the fact that the depressed key was down already.
+	 * Does this ever make a difference?
+	 */
 
 	/*
-	 *  Repeat a key only if the input buffers are empty or the
-	 *  characters get echoed locally. This makes key repeat usable
-	 *  with slow applications and under heavy loads.
+ 	 *  Repeat a key only if the input buffers are empty or the
+ 	 *  characters get echoed locally. This makes key repeat usable
+ 	 *  with slow applications and under heavy loads.
 	 */
 	if (!rep || 
 	    (vc_kbd_flag(kbd,VC_REPEAT) && tty &&
@@ -275,8 +324,11 @@
 		u_short key_code;
 
 		key_code = key_map[shift_state][scancode];
-		(*key_handler[key_code >> 8])(key_code & 0xff, break_flag);
+		(*key_handler[key_code >> 8])(key_code & 0xff, up_flag);
 	}
+
+end_kbd_intr:
+	send_cmd(0xAE);         /* enable keyboard */
 }
 
 static void put_queue(int ch)
@@ -371,7 +423,7 @@
 		/* pressing srcoll lock 2nd time sends ^Q, ChN */
 		put_queue(START_CHAR(tty));
 	else
-		/* pressing srcoll lock 1st time sends ^S, ChN */
+		/* pressing scroll lock 1st time sends ^S, ChN */
 		put_queue(STOP_CHAR(tty));
 	chg_vc_kbd_flag(kbd,VC_SCROLLOCK);
 }
@@ -420,6 +472,10 @@
 	ctrl_alt_del();
 }
 
+static void compose(void)
+{
+        dead_key_next = 1;
+}
 
 static void do_spec(unsigned char value, char up_flag)
 {
@@ -426,15 +482,15 @@
 	typedef void (*fnp)(void);
 	fnp fn_table[] = {
 		NULL,		enter,		show_ptregs,	show_mem,
-		show_state,	send_intr,	lastcons, 	caps_toggle,
+		show_state,	send_intr,	lastcons,	caps_toggle,
 		num,		hold,		scrll_forw,	scrll_back,
-		boot_it,	caps_on
+		boot_it,	caps_on,        compose
 	};
 
-	if (value >= sizeof(fn_table)/sizeof(fnp))
-		return;
 	if (up_flag)
 		return;
+	if (value >= SIZE(fn_table))
+		return;
 	if (!fn_table[value])
 		return;
 	fn_table[value]();
@@ -445,7 +501,14 @@
 	if (up_flag)
 		return;		/* no action, if this is a key release */
 
-	value = handle_diacr(value);
+        if (diacr)
+                value = handle_diacr(value);
+
+        if (dead_key_next) {
+                dead_key_next = 0;
+                diacr = value;
+                return;
+        }
 
 	/* kludge... but works for ISO 8859-1 */
 	if (vc_kbd_flag(kbd,VC_CAPSLOCK))
@@ -457,8 +520,13 @@
 	put_queue(value);
 }
 
+#define A_GRAVE  '`'
+#define A_ACUTE  '\''
+#define A_CFLEX  '^'
+#define A_TILDE  '~'
+#define A_DIAER  '"'
 static unsigned char ret_diacr[] =
-	{'`', '\'', '^', '~', '"' };		/* Must not end with 0 */
+        {A_GRAVE, A_ACUTE, A_CFLEX, A_TILDE, A_DIAER };
 
 /* If a dead key pressed twice, output a character corresponding to it,	*/
 /* otherwise just remember the dead key.				*/
@@ -468,52 +536,34 @@
 	if (up_flag)
 		return;
 
-	if (diacr == value) {	/* pressed twice */
-		diacr = -1;
-		put_queue(ret_diacr[value]);
-		return;
-	}
+        value = ret_diacr[value];
+        if (diacr == value) {   /* pressed twice */
+                diacr = 0;
+                put_queue(value);
+                return;
+        }
 	diacr = value;
 }
 
-/* If no pending dead key, return the character unchanged. Otherwise,	*/
-/* if space if pressed, return a character corresponding the pending	*/
+
+/* If space is pressed, return the character corresponding the pending	*/
 /* dead key, otherwise try to combine the two.				*/
 
-unsigned int handle_diacr(unsigned int ch)
+unsigned char handle_diacr(unsigned char ch)
 {
-	static unsigned char accent_table[5][64] = {
-	" \300BCD\310FGH\314JKLMN\322PQRST\331VWXYZ[\\]^_"
-	"`\340bcd\350fgh\354jklmn\362pqrst\371vwxyz{|}~",   /* accent grave */
-
-	" \301BCD\311FGH\315JKLMN\323PQRST\332VWX\335Z[\\]^_"
-	"`\341bcd\351fgh\355jklmn\363pqrst\372vwx\375z{|}~", /* accent acute */
+        int d = diacr;
+        int i;
 
-	" \302BCD\312FGH\316JKLMN\324PQRST\333VWXYZ[\\]^_"
-	"`\342bcd\352fgh\356jklmn\364pqrst\373vwxyz{|}~",   /* circumflex */
+        diacr = 0;
+        if (ch == ' ')
+                return d;
 
-	" \303BCDEFGHIJKLM\321\325PQRSTUVWXYZ[\\]^_"
-	"`\343bcdefghijklm\361\365pqrstuvwxyz{|}~",	    /* tilde */
+        for (i = 0; i < accent_table_size; i++)
+          if(accent_table[i].diacr == d && accent_table[i].base == ch)
+            return accent_table[i].result;
 
-	" \304BCD\313FGH\317JKLMN\326PQRST\334VWXYZ[\\]^_"
-	"`\344bcd\353fgh\357jklmn\366pqrst\374vwx\377z{|}~" /* dieresis */
-	};
-	int d = diacr, e;
-
-	if (diacr == -1)
-		return ch;
-
-	diacr = -1;
-	if (ch == ' ')
-		return ret_diacr[d];
-
-	if (ch >= 64 && ch <= 122) {
-		e = accent_table[d][ch - 64];
-		if (e != ch)
-			return e;
-	}
-	put_queue(ret_diacr[d]);
-	return ch;
+        put_queue(d);
+        return ch;
 }
 
 static void do_cons(unsigned char value, char up_flag)
@@ -527,13 +577,16 @@
 {
 	if (up_flag)
 		return;
-	puts_queue(func_table[value]);
+	if (value < SIZE(func_table))
+	        puts_queue(func_table[value]);
+	else
+	        printk("do_fn called with value=%d\n", value);
 }
 
 static void do_pad(unsigned char value, char up_flag)
 {
-	static char *pad_chars = "0123456789+-*/\015,.";
-	static char *app_map = "pqrstuvwxylSRQMnn";
+	static char *pad_chars = "0123456789+-*/\015,.?";
+	static char *app_map = "pqrstuvwxylSRQMnn?";
 
 	if (up_flag)
 		return;		/* no action, if this is a key release */
@@ -610,6 +663,8 @@
 	}
 
 	if (up_flag) {
+	        /* handle the case that two shift or control
+		   keys are depressed simultaneously */
 		if (k_down[value])
 			k_down[value]--;
 	} else
@@ -621,12 +676,37 @@
 		shift_state &= ~ (1 << value);
 
 	/* kludge */
-	if (up_flag && shift_state != old_state && npadch != 0) {
+	if (up_flag && shift_state != old_state && npadch != -1) {
 		put_queue(npadch);
-		npadch = 0;
+		npadch = -1;
 	}
 }
 
+/* called after returning from RAW mode or when changing consoles -
+   recompute k_down[] and shift_state from key_down[] */
+void compute_shiftstate(void)
+{
+        int i, j, k, sym, val;
+
+        shift_state = 0;
+	for(i=0; i < SIZE(k_down); i++)
+	  k_down[i] = 0;
+
+	for(i=0; i < SIZE(key_down); i++)
+	  if(key_down[i]) {	/* skip this word if not a single bit on */
+	    k = (i<<5);
+	    for(j=0; j<32; j++,k++)
+	      if(test_bit(k, key_down)) {
+		sym = key_map[0][k];
+		if(KTYP(sym) == KT_SHIFT) {
+		  val = KVAL(sym);
+		  k_down[val]++;
+		  shift_state |= (1<<val);
+	        }
+	      }
+	  }
+}
+
 static void do_meta(unsigned char value, char up_flag)
 {
 	if (up_flag)
@@ -644,7 +724,10 @@
 	if (up_flag)
 		return;
 
-	npadch = (npadch * 10 + value) % 1000;
+	if (npadch == -1)
+	        npadch = value;
+	else
+	        npadch = (npadch * 10 + value) % 1000;
 }
 
 /* done stupidly to avoid coding in any dependencies of
diff -u --recursive --new-file linux14m/linux/drivers/char/tty_io.c linux/drivers/char/tty_io.c
--- linux14m/linux/drivers/char/tty_io.c	Tue Jan  4 09:07:19 1994
+++ linux/drivers/char/tty_io.c	Fri Jan  7 01:07:11 1994
@@ -586,55 +586,39 @@
 		if (c == __DISABLED_CHAR)
 			tty->lnext = 1;
 		if (L_CANON(tty) && !tty->lnext) {
-			if (c == KILL_CHAR(tty) || c == WERASE_CHAR(tty)) {
+			if (c == ERASE_CHAR(tty) || c == KILL_CHAR(tty) || c == WERASE_CHAR(tty)) {
 				int seen_alnums =
 				  (c == WERASE_CHAR(tty)) ? 0 : -1;
+				int cc;
 
-				/* deal with killing the input line */
+				/* deal with killing in the input line */
 				while(!(EMPTY(&tty->secondary) ||
-					(c=LAST(&tty->secondary))==10 ||
+					(cc=LAST(&tty->secondary))==10 ||
 					((EOF_CHAR(tty) != __DISABLED_CHAR) &&
-					 (c==EOF_CHAR(tty))))) {
+					 (cc==EOF_CHAR(tty))))) {
 					/* if killing just a word, kill all
 					   non-alnum chars, then all alnum
 					   chars.  */
 					if (seen_alnums >= 0) {
-						if (isalnum(c))
+						if (isalnum(cc))
 							seen_alnums++;
 						else if (seen_alnums)
 							break;
 					}
 					if (L_ECHO(tty)) {
-						if (c<32) {
+					        int ct = 1;
+						if (cc < 32)
+						  ct = (L_ECHOCTL(tty) ? 2 : 0);
+						while(ct--) {
 							put_tty_queue('\b', &tty->write_q);
 							put_tty_queue(' ', &tty->write_q);
 							put_tty_queue('\b',&tty->write_q);
 						}
-						put_tty_queue('\b',&tty->write_q);
-						put_tty_queue(' ',&tty->write_q);
-						put_tty_queue('\b',&tty->write_q);
 					}
 					DEC(tty->secondary.head);
+					if(c == ERASE_CHAR(tty))
+					        break;
 				}
-				continue;
-			}
-			if (c == ERASE_CHAR(tty)) {
-				if (EMPTY(&tty->secondary) ||
-				   (c=LAST(&tty->secondary))==10 ||
-				   ((EOF_CHAR(tty) != __DISABLED_CHAR) &&
-				    (c==EOF_CHAR(tty))))
-					continue;
-				if (L_ECHO(tty)) {
-					if (c<32) {
-						put_tty_queue('\b',&tty->write_q);
-						put_tty_queue(' ',&tty->write_q);
-						put_tty_queue('\b',&tty->write_q);
-					}
-					put_tty_queue('\b',&tty->write_q);
-					put_tty_queue(' ',&tty->write_q);
-					put_tty_queue('\b',&tty->write_q);
-				}
-				DEC(tty->secondary.head);
 				continue;
 			}
 			if (c == LNEXT_CHAR(tty)) {
diff -u --recursive --new-file linux14m/linux/drivers/char/vt.c linux/drivers/char/vt.c
--- linux14m/linux/drivers/char/vt.c	Wed Dec  1 13:44:15 1993
+++ linux/drivers/char/vt.c	Fri Jan  7 01:07:11 1994
@@ -2,6 +2,7 @@
  *  kernel/chr_drv/vt.c
  *
  *  Copyright (C) 1992 obz under the linux copyright
+ *  Dynamic diacritical handling - aeb@cwi.nl - Dec 1993
  */
 
 #include <linux/types.h>
@@ -19,6 +20,7 @@
 #include <asm/segment.h>
 
 #include "vt_kern.h"
+#include "diacr.h"
 
 /*
  * Console (vt and kd) routines, as defined by USL SVR4 manual, and by
@@ -37,6 +39,7 @@
 
 asmlinkage int sys_ioperm(unsigned long from, unsigned long num, int on);
 
+extern void compute_shiftstate(void);
 extern void change_console(unsigned int new_console);
 extern void complete_change_console(unsigned int new_console);
 extern int vt_waitactive(void);
@@ -212,6 +215,7 @@
 		} else if (arg == K_XLATE) {
 			clr_vc_kbd_flag(kbd, VC_RAW);
 			clr_vc_kbd_flag(kbd, VC_MEDIUMRAW);
+			compute_shiftstate();
 		} else if (arg == K_MEDIUMRAW) {
 			clr_vc_kbd_flag(kbd, VC_RAW);
 			set_vc_kbd_flag(kbd, VC_MEDIUMRAW);
@@ -278,10 +282,17 @@
 		i = verify_area(VERIFY_WRITE, (void *)a, sizeof(struct kbsentry));
 		if (i)
 			return i;
-		if ((i = get_fs_byte(&a->kb_func)) >= NR_FUNC)
+		if ((i = get_fs_byte(&a->kb_func)) >= NR_FUNC || i < 0)
 			return -EINVAL;
 		q = a->kb_string;
-		for (p = func_table[i]; *p; p++)
+		p = func_table[i];
+		if(!p) {
+		    /* beware of tables generated for a smaller NR_FUNC */
+		    printk("KDGKBSENT error: func_table[%d] is nil.\n",
+			   i);
+		    return -EINVAL;
+		}
+		for ( ; *p; p++)
 			put_fs_byte(*p, q++);
 		put_fs_byte(0, q);
 		return 0;
@@ -301,7 +312,14 @@
 			return i;
 		if ((i = get_fs_byte(&a->kb_func)) >= NR_FUNC)
 			return -EINVAL;
-		delta = -strlen(func_table[i]);
+		q = func_table[i];
+		if (!q) {
+		    /* beware of tables generated for a smaller NR_FUNC */
+		    printk("KDSKBSENT error: func_table[%d] is nil.\n",
+			   i);
+		    return -EINVAL;
+		}
+		delta = -strlen(q);
 		for (p = a->kb_string; get_fs_byte(p); p++)
 			delta++;
 		first_free = func_table[NR_FUNC - 1] +
@@ -317,11 +335,41 @@
 				func_table[i + 1],
 				first_free - func_table[i + 1]);
 			for (k = i + 1; k < NR_FUNC; k++)
+			    if (func_table[k])  /* just to be sure */
 				func_table[k] += delta;
 		}
 		for (p = a->kb_string, q = func_table[i]; ; p++, q++)
 			if (!(*q = get_fs_byte(p)))
 				break;
+		return 0;
+	}
+
+	case KDGKBDIACR:
+	{
+	        struct kbdiacrs *a = (struct kbdiacrs *)arg;
+
+	        i = verify_area(VERIFY_WRITE, (void *) a, sizeof(struct kbdiacrs));
+		if (i)
+		        return i;
+		put_fs_long(accent_table_size, &a->kb_cnt);
+		memcpy_tofs(a->kbdiacr, accent_table,
+			    accent_table_size*sizeof(struct kbdiacr));
+		return 0;
+	}
+
+	case KDSKBDIACR:
+	{
+	        struct kbdiacrs *a = (struct kbdiacrs *)arg;
+		unsigned int ct;
+
+	        i = verify_area(VERIFY_READ, (void *) a, sizeof(struct kbdiacrs));
+		if (i)
+		        return i;
+		ct = get_fs_long(&a->kb_cnt);
+		if (ct >= MAX_DIACR)
+		        return -EINVAL;
+		accent_table_size = ct;
+		memcpy_fromfs(accent_table, a->kbdiacr, ct*sizeof(struct kbdiacr));
 		return 0;
 	}
 
diff -u --recursive --new-file linux14m/linux/include/linux/kd.h linux/include/linux/kd.h
--- linux14m/linux/include/linux/kd.h	Wed Dec  1 13:44:15 1993
+++ linux/include/linux/kd.h	Fri Jan  7 01:07:11 1994
@@ -184,4 +184,14 @@
 #define KDGKBSENT	0x4B48	/* gets one function key string entry */
 #define KDSKBSENT	0x4B49	/* sets one function key string entry */
 
+struct kbdiacr {
+        u_char diacr, base, result;
+};
+struct kbdiacrs {
+        unsigned int kb_cnt;    /* number of entries in following array */
+	struct kbdiacr kbdiacr[256];    /* MAX_DIACR from keyboard.h */
+};
+#define KDGKBDIACR      0x4B4A  /* read kernel accent table */
+#define KDSKBDIACR      0x4B4B  /* write kernel accent table */
+
 #endif /* _LINUX_KD_H */
diff -u --recursive --new-file linux14m/linux/include/linux/keyboard.h linux/include/linux/keyboard.h
--- linux14m/linux/include/linux/keyboard.h	Wed Dec  1 13:44:15 1993
+++ linux/include/linux/keyboard.h	Fri Jan  7 01:07:11 1994
@@ -5,19 +5,6 @@
 #define set_leds() mark_bh(KEYBOARD_BH)
 
 /*
- * "dead" keys - prefix key values that are valid only for the next
- * character code (sticky shift, E0/E1 special scancodes, diacriticals)
- */
-extern unsigned long kbd_dead_keys;
-extern unsigned long kbd_prev_dead_keys;
-
-/*
- * these are the hardcoded dead key flags
- */
-#define KGD_E0		0
-#define KGD_E1		1
-
-/*
  * kbd->xxx contains the VC-local things (flag settings etc..)
  * The low 3 local flags are hardcoded to be the led setting..
  */
@@ -52,26 +39,6 @@
 
 extern unsigned long kbd_init(unsigned long);
 
-extern inline int kbd_dead(int flag)
-{
-	return kbd_prev_dead_keys & (1 << flag);
-}
-
-extern inline void set_kbd_dead(int flag)
-{
-	kbd_dead_keys |= 1 << flag;
-}
-
-extern inline void clr_kbd_dead(int flag)
-{
-	kbd_dead_keys &= ~(1 << flag);
-}
-
-extern inline void chg_kbd_dead(int flag)
-{
-	kbd_dead_keys ^= 1 << flag;
-}
-
 extern inline int vc_kbd_flag(struct kbd_struct * kbd, int flag)
 {
 	return ((kbd->flags >> flag) & 1);
@@ -98,7 +65,7 @@
 extern const int max_vals[];
 extern unsigned short key_map[NR_KEYMAPS][NR_KEYS];
 
-#define NR_FUNC 32
+#define NR_FUNC 36
 #define FUNC_BUFSIZE 512
 extern char func_buf[FUNC_BUFSIZE];
 extern char *func_table[NR_FUNC];
@@ -145,6 +112,10 @@
 #define K_SELECT	K(KT_FN,23)
 #define K_PGUP		K(KT_FN,24)
 #define K_PGDN		K(KT_FN,25)
+#define K_MACRO         K(KT_FN,26)
+#define K_HELP          K(KT_FN,27)
+#define K_DO            K(KT_FN,28)
+#define K_PAUSE         K(KT_FN,29)
 
 #define K_HOLE		K(KT_SPEC,0)
 #define K_ENTER		K(KT_SPEC,1)
@@ -160,6 +131,7 @@
 #define K_SCROLLBACK	K(KT_SPEC,11)
 #define K_BOOT		K(KT_SPEC,12)
 #define K_CAPSON	K(KT_SPEC,13)
+#define K_COMPOSE       K(KT_SPEC,14)
 
 #define K_P0		K(KT_PAD,0)
 #define K_P1		K(KT_PAD,1)
@@ -178,6 +150,7 @@
 #define K_PENTER	K(KT_PAD,14)	/* key-pad enter		   */
 #define K_PCOMMA	K(KT_PAD,15)	/* key-pad comma: kludge...	   */
 #define K_PDOT		K(KT_PAD,16)	/* key-pad dot (period): kludge... */
+#define K_PPLUSMINUS    K(KT_PAD,17)    /* key-pad plus/minus              */
 
 #define K_DGRAVE	K(KT_DEAD,0)
 #define K_DACUTE	K(KT_DEAD,1)
@@ -220,4 +193,5 @@
 #define K_ALTLOCK	K(KT_LOCK,3)
 #define K_ALTGRLOCK	K(KT_LOCK,1)
 
+#define MAX_DIACR       256
 #endif
