plan 9 kernel history: overview | file list | diff list

1999/1104/carrera/kbd.c (diff list | history)

1993/0907/sys/src/9/carrera/kbd.c:152,1581993/0908/sys/src/9/carrera/kbd.c:152,158 (short | long)
1993/0907    
{ 
	int i; 
 
	l *= 21; 
1993/0908    
	l *= 21;	/* experimentally determined */ 
1993/0907    
	for(i=0; i<l; i++) 
		; 
} 
1993/0907/sys/src/9/carrera/kbd.c:167,1731993/0908/sys/src/9/carrera/kbd.c:167,172
1993/0907    
 
	for(tries = 0; tries < 2000; tries++){ 
		if(KBDCTL & Sobf){ 
			kdbdly(1); 
			return 1; 
		} 
		kdbdly(1); 
1993/0907/sys/src/9/carrera/kbd.c:193,1981993/0908/sys/src/9/carrera/kbd.c:192,198
1993/0907    
	uchar ch, code; 
	static uchar kc[5]; 
	static int shifted, ctrled, lstate; 
1993/0908    
	static int upcode; 
1993/0907    
 
	kbdwait(); 
	code = KBDDAT; 
1993/0907/sys/src/9/carrera/kbd.c:201,2181993/0908/sys/src/9/carrera/kbd.c:201,224
1993/0907    
	 *  key has gone up 
	 */ 
	if(code == Up) { 
		kbdwait(); 
		ch = keymap[KBDDAT]; 
1993/0908    
		upcode = 1; 
		return 0; 
	} 
 
	if(code > 0x87) 
		return 1; 
 
	if(upcode){ 
		ch = keymap[code]; 
1993/0907    
		if(ch == Ctrl) 
			ctrled = 0; 
		else if(ch == Shift) 
			shifted = 0; 
1993/0908    
		upcode = 0; 
1993/0907    
		return 0; 
	} 
1993/0908    
	upcode = 0; 
1993/0907    
 
	if(code > 0x87) 
		return 1; 
                 
	/* 
	 *  convert 
	 */ 
1993/0907/sys/src/9/carrera/kbd.c:220,2261993/0908/sys/src/9/carrera/kbd.c:226,231
1993/0907    
		ch = skeymap[code]; 
	else 
		ch = keymap[code]; 
iprint("code %d %d\n", code, ch); 
	/* 
 	 *  normal character 
	 */ 
1993/0908/sys/src/9/carrera/kbd.c:166,1741993/1001/sys/src/9/carrera/kbd.c:166,173 (short | long)
1993/0907    
	int tries; 
 
	for(tries = 0; tries < 2000; tries++){ 
		if(KBDCTL & Sobf){ 
1993/1001    
		if(KBDCTL & Sobf) 
1993/0907    
			return 1; 
		} 
		kdbdly(1); 
	} 
	return 0; 
1993/0908/sys/src/9/carrera/kbd.c:183,1881993/1001/sys/src/9/carrera/kbd.c:182,197
1993/0907    
	if(kbdintr()) 
		return KBDDAT; 
	return 0; 
1993/1001    
} 
 
void 
mouseintr(void) 
{ 
	uchar code; 
 
	kbdwait(); 
	code = KBDDAT; 
	print("mouse intr %d\n", code); 
1993/0907    
} 
 
int 
1993/1001/sys/src/9/carrera/kbd.c:19,241993/1003/sys/src/9/carrera/kbd.c:19,25 (short | long)
1993/0907    
	Ktest=		0xAB,	/* keyboard test */ 
	Kdisable=	0xAD,	/* disable keyboard */ 
	Kenable=	0xAE,	/* enable keyboard */ 
1993/1003    
	Kmseena=	0xA8,	/* enable mouse */ 
1993/0907    
	Krdin=		0xC0,	/* read input port */ 
	Krdout=		0xD0,	/* read output port */ 
	Kwrout=		0xD1,	/* write output port */ 
1993/1001/sys/src/9/carrera/kbd.c:46,511993/1003/sys/src/9/carrera/kbd.c:47,53
1993/0907    
	 *  command register bits 
	 */ 
	Cintena=	1<<0,	/* enable output interrupt */ 
1993/1003    
	Cmseint=	1<<1,	/* enable mouse interrupt */ 
1993/0907    
	Csystem=	1<<2,	/* set system */ 
	Cinhibit=	1<<3,	/* inhibit override */ 
	Cdisable=	1<<4,	/* disable keyboard */ 
1993/1001/sys/src/9/carrera/kbd.c:187,1971993/1003/sys/src/9/carrera/kbd.c:189,222
1993/1001    
void 
mouseintr(void) 
{ 
	uchar code; 
1993/1003    
	uchar c; 
	static int nb; 
	int buttons, dx, dy; 
	static short msg[3]; 
	static uchar b[] = {0, 1, 4, 5, 2, 3, 6, 7, 0, 1, 2, 5, 2, 3, 6, 7 }; 
1993/1001    
 
	kbdwait(); 
	code = KBDDAT; 
	print("mouse intr %d\n", code); 
1993/1003    
	c = KBDDAT; 
 
	/*  
	 *  check byte 0 for consistency 
	 */ 
	if(nb==0 && (c&0xc8)!=0x08) 
		return; 
 
	msg[nb] = c; 
	if(++nb == 3){ 
		nb = 0; 
		if(msg[0] & 0x10) 
			msg[1] |= 0xFF00; 
		if(msg[0] & 0x20) 
			msg[2] |= 0xFF00; 
 
		buttons = b[msg[0]&7]; 
		dx = msg[1]; 
		dy = -msg[2]; 
		mousetrack(buttons, dx, dy); 
	} 
1993/0907    
} 
 
int 
1993/1001/sys/src/9/carrera/kbd.c:342,3471993/1003/sys/src/9/carrera/kbd.c:367,401
1993/0907    
	} 
} 
 
1993/1003    
/* 
 *  send a command to the mouse 
 */ 
static int 
mousecmd(int cmd) 
{ 
	int tries; 
	unsigned int c; 
 
	c = 0; 
	tries = 0; 
	do{ 
		if(tries++ > 2) 
			break; 
		OUTWAIT; 
		KBDCTL = 0xD4; 
		OUTWAIT; 
		KBDDAT = cmd; 
		OUTWAIT; 
		kbdwait(); 
		c = KBDDAT; 
	} while(c == 0xFE || c == 0); 
	if(c != 0xFA){ 
		print("mouse returns %2.2ux to the %2.2ux command\n", c, cmd); 
		return -1; 
	} 
	return 0; 
} 
 
1993/0907    
int 
kbdinit(void) 
{ 
1993/1001/sys/src/9/carrera/kbd.c:387,3961993/1003/sys/src/9/carrera/kbd.c:441,455
1993/0907    
	OUTWAIT; 
	KBDCTL = Kwrcmd; 
	OUTWAIT; 
	KBDDAT = Csystem | Cinhibit | Cintena; 
1993/1003    
	KBDDAT = Csystem | Cinhibit | Cintena | Cmseint; 
1993/0907    
	OUTWAIT; 
	KBDCTL = Kenable; 
1993/1003    
	OUTWAIT; 
	KBDCTL = Kmseena; 
1993/0907    
	empty(); 
1993/1003    
 
	mousecmd(0xEA); 
	mousecmd(0xF4); 
1993/0907    
 
	return 1; 
} 
1993/1003/sys/src/9/carrera/kbd.c:448,4551994/0201/sys/src/9/carrera/kbd.c:448,457 (short | long)
1993/1003    
	KBDCTL = Kmseena; 
1993/0907    
	empty(); 
1993/1003    
 
	mousecmd(0xEA); 
	mousecmd(0xF4); 
1994/0201    
	mousecmd(0xEA);	/* streaming */ 
	mousecmd(0xE8);	/* set resolution */ 
	mousecmd(3); 
	mousecmd(0xF4);	/* enabled */ 
1993/0907    
 
	return 1; 
} 
1994/0201/sys/src/9/carrera/kbd.c:10,401994/0306/sys/src/9/carrera/kbd.c:10,24 (short | long)
1993/0907    
 
enum 
{ 
1994/0306    
	/* controller command byte */ 
	Cscs1=		(1<<6),		/* scan code set 1 */ 
	Cmousedis=	(1<<5),		/* mouse disable */ 
	Ckbddis=	(1<<4),		/* kbd disable */ 
	Csf=		(1<<2),		/* system flag */ 
	Cmouseint=	(1<<1),		/* mouse interrupt enable */ 
	Ckbdint=	(1<<0),		/* kbd interrupt enable */ 
 
1993/0907    
	/* 
	 *  commands 
	 */ 
	Krdcmd=		0x20,	/* read command byte */ 
	Kwrcmd=		0x60,	/* write command byte */ 
	Kselftest=	0xAA,	/* self test */ 
	Ktest=		0xAB,	/* keyboard test */ 
	Kdisable=	0xAD,	/* disable keyboard */ 
	Kenable=	0xAE,	/* enable keyboard */ 
1993/1003    
	Kmseena=	0xA8,	/* enable mouse */ 
1993/0907    
	Krdin=		0xC0,	/* read input port */ 
	Krdout=		0xD0,	/* read output port */ 
	Kwrout=		0xD1,	/* write output port */ 
	Krdtest=	0xE0,	/* read test inputs */ 
	Kwrlights=	0xED,	/* set lights */ 
	Kreset=		0xF0,	/* soft reset */ 
	/* 
	 *  magic characters 
	 */ 
	Msetscan=	0xF0,	/* set scan type (0 == unix) */ 
	Menable=	0xF4,	/* enable the keyboard */ 
	Mdisable=	0xF5,	/* disable the keyboard */ 
	Mdefault=	0xF6,	/* set defaults */ 
	Mreset=		0xFF,	/* reset the keyboard */ 
	/* 
	 *  responses from keyboard 
	 */ 
	Rok=		0xAA,		/* self test OK */ 
1994/0201/sys/src/9/carrera/kbd.c:43,661994/0306/sys/src/9/carrera/kbd.c:27,34
1993/0907    
	Rfail=		0xFC,		/* self test failed */ 
	Rresend=	0xFE,		/* ??? */ 
	Rovfl=		0xFF,		/* input overflow */ 
1994/0306    
 
1993/0907    
	/* 
	 *  command register bits 
	 */ 
	Cintena=	1<<0,	/* enable output interrupt */ 
1993/1003    
	Cmseint=	1<<1,	/* enable mouse interrupt */ 
1993/0907    
	Csystem=	1<<2,	/* set system */ 
	Cinhibit=	1<<3,	/* inhibit override */ 
	Cdisable=	1<<4,	/* disable keyboard */ 
	/* 
	 *  output port bits 
	 */ 
	Osoft=		1<<0,	/* soft reset bit (must be 1?) */ 
	Oparity=	1<<1,	/* force bad parity */ 
	Omemtype=	1<<2,	/* simm type (1 = 4Mb, 0 = 1Mb)	*/ 
	Obigendian=	1<<3,	/* big endian */ 
	Ointena=	1<<4,	/* enable interrupt */ 
	Oclear=		1<<5,	/* clear expansion slot interrupt */ 
	/* 
	 *  status bits 
	 */ 
	Sobf=		1<<0,	/* output buffer full */ 
1994/0201/sys/src/9/carrera/kbd.c:71,821994/0306/sys/src/9/carrera/kbd.c:39,70
1993/0907    
	Stxtimeout=	1<<5,	/* transmit to kybd has timed out */ 
	Srxtimeout=	1<<6,	/* receive from kybd has timed out */ 
	Sparity=	1<<7,	/* parity on byte was even */ 
	/* 
	 *  light bits 
	 */ 
	L1=		1<<0,	/* light 1, network activity */ 
	L2=		1<<2,	/* light 2, caps lock */ 
	L3=		1<<1,	/* light 3, no label */ 
1994/0306    
 
	Spec=		0x80, 
 
	PF=		Spec|0x20,	/* num pad function key */ 
	View=		Spec|0x00,	/* view (shift window up) */ 
	KF=		Spec|0x40,	/* function key */ 
	Shift=		Spec|0x60, 
	Break=		Spec|0x61, 
	Ctrl=		Spec|0x62, 
	Latin=		Spec|0x63, 
	Caps=		Spec|0x64, 
	Num=		Spec|0x65, 
	Middle=		Spec|0x66, 
	No=		0x00,		/* peter */ 
 
	Home=		KF|13, 
	Up=		KF|14, 
	Pgup=		KF|15, 
	Print=		KF|16, 
	Left=		View, 
	Right=		View, 
	End=		'\r', 
	Down=		View, 
	Pgdown=		View, 
	Ins=		KF|20, 
	Del=		0x7F, 
1993/0907    
}; 
 
#define KBDCTL	(*(uchar*)(KeyboardIO+Keyctl)) 
1994/0201/sys/src/9/carrera/kbd.c:85,1531994/0306/sys/src/9/carrera/kbd.c:73,132
1993/0907    
#define INWAIT	while(!(KBDCTL & Sobf)); kdbdly(1) 
#define ACKWAIT INWAIT ; if(KBDDAT != Rack) print("bad response\n"); kdbdly(1) 
 
enum 
1994/0306    
uchar kbtab[] =  
1993/0907    
{ 
	Spec=	0x80, 
                 
	PF=	Spec|0x20,	/* num pad function key */ 
	View=	Spec|0x00,	/* view (shift window up) */ 
	F=	Spec|0x40,	/* function key */ 
	Shift=	Spec|0x60, 
	Break=	Spec|0x61, 
	Ctrl=	Spec|0x62, 
	Latin=	Spec|0x63, 
	Up=	Spec|0x70,	/* key has come up */ 
	No=	Spec|0x7F,	/* no mapping */ 
                 
	Tmask=	Spec|0x60, 
1994/0306    
[0x00]	No,	0x1b,	'1',	'2',	'3',	'4',	'5',	'6', 
[0x08]	'7',	'8',	'9',	'0',	'-',	'=',	'\b',	'\t', 
[0x10]	'q',	'w',	'e',	'r',	't',	'y',	'u',	'i', 
[0x18]	'o',	'p',	'[',	']',	'\n',	Ctrl,	'a',	's', 
[0x20]	'd',	'f',	'g',	'h',	'j',	'k',	'l',	';', 
[0x28]	'\'',	'`',	Shift,	'\\',	'z',	'x',	'c',	'v', 
[0x30]	'b',	'n',	'm',	',',	'.',	'/',	Shift,	'*', 
[0x38]	Latin,	' ',	Ctrl,	KF|1,	KF|2,	KF|3,	KF|4,	KF|5, 
[0x40]	KF|6,	KF|7,	KF|8,	KF|9,	KF|10,	Num,	KF|12,	'7', 
[0x48]	'8',	'9',	'-',	'4',	'5',	'6',	'+',	'1', 
[0x50]	'2',	'3',	'0',	'.',	No,	No,	No,	KF|11, 
[0x58]	KF|12,	No,	No,	No,	No,	No,	No,	No, 
1993/0907    
}; 
 
uchar keymap[] = { 
[0]	No,	No,	No,	No,	No,	No,	No,	F|1, 
	'\033',	No,	No,	No,	No,	'\t',	'`',	F|2, 
[0x10]	No,	Ctrl,	Shift,	Shift,	Shift,	'q',	'1',	F|3, 
	No,	Shift,	'z',	's',	'a',	'w',	'2',	F|4, 
[0x20]	No,	'c',	'x',	'd',	'e',	'4',	'3',	F|5, 
	No,	' ',	'v',	'f',	't',	'r',	'5',	F|6, 
[0x30]	No,	'n',	'b',	'h',	'g',	'y',	'6',	F|7, 
	No,	View,	'm',	'j',	'u',	'7',	'8',	F|8, 
[0x40]	No,	',',	'k',	'i',	'o',	'0',	'9',	F|9, 
	No,	'.',	'/',	'l',	';',	'p',	'-',	F|10, 
[0x50]	No,	No,	'\'',	No,	'[',	'=',	F|11,	'\r', 
	Latin,	Shift,	'\n',	']',	'\\',	No,	F|12,	Break, 
[0x60]	View,	View,	Break,	Shift,	'\177',	No,	'\b',	No, 
	No,	'1',	View,	'4',	'7',	',',	No,	No, 
[0x70]	'0',	'.',	'2',	'5',	'6',	'8',	PF|1,	PF|2, 
	No,	'\n',	'3',	No,	PF|4,	'9',	PF|3,	No, 
[0x80]	No,	No,	No,	No,	'-',	No,	No,	No, 
1994/0306    
uchar kbtabshift[] = 
{ 
[0x00]	No,	0x1b,	'!',	'@',	'#',	'$',	'%',	'^', 
[0x08]	'&',	'*',	'(',	')',	'_',	'+',	'\b',	'\t', 
[0x10]	'Q',	'W',	'E',	'R',	'T',	'Y',	'U',	'I', 
[0x18]	'O',	'P',	'{',	'}',	'\n',	Ctrl,	'A',	'S', 
[0x20]	'D',	'F',	'G',	'H',	'J',	'K',	'L',	':', 
[0x28]	'"',	'~',	Shift,	'|',	'Z',	'X',	'C',	'V', 
[0x30]	'B',	'N',	'M',	'<',	'>',	'?',	Shift,	'*', 
[0x38]	Latin,	' ',	Ctrl,	KF|1,	KF|2,	KF|3,	KF|4,	KF|5, 
[0x40]	KF|6,	KF|7,	KF|8,	KF|9,	KF|10,	Num,	KF|12,	'7', 
[0x48]	'8',	'9',	'-',	'4',	'5',	'6',	'+',	'1', 
[0x50]	'2',	'3',	'0',	'.',	No,	No,	No,	KF|11, 
[0x58]	KF|12,	No,	No,	No,	No,	No,	No,	No, 
1993/0907    
}; 
 
uchar skeymap[] = { 
[0]	No,	No,	No,	No,	No,	No,	No,	F|1, 
	'\033',	No,	No,	No,	No,	'\t',	'~',	F|2, 
[0x10]	No,	Ctrl,	Shift,	Shift,	Shift,	'Q',	'!',	F|3, 
	No,	Shift,	'Z',	'S',	'A',	'W',	'@',	F|4, 
[0x20]	No,	'C',	'X',	'D',	'E',	'$',	'#',	F|5, 
	No,	' ',	'V',	'F',	'T',	'R',	'%',	F|6, 
[0x30]	No,	'N',	'B',	'H',	'G',	'Y',	'^',	F|7, 
	No,	View,	'M',	'J',	'U',	'&',	'*',	F|8, 
[0x40]	No,	'<',	'K',	'I',	'O',	')',	'(',	F|9, 
	No,	'>',	'?',	'L',	':',	'P',	'_',	F|10, 
[0x50]	No,	No,	'"',	No,	'{',	'+',	F|11,	'\r', 
	Latin,	Shift,	'\n',	'}',	'|',	No,	F|12,	Break, 
[0x60]	View,	View,	Break,	Shift,	'\177',	No,	'\b',	No, 
	No,	'1',	View,	'4',	'7',	',',	No,	No, 
[0x70]	'0',	'.',	'2',	'5',	'6',	'8',	PF|1,	PF|2, 
	No,	'\n',	'3',	No,	PF|4,	'9',	PF|3,	No, 
[0x80]	No,	No,	No,	No,	'-',	No,	No,	No, 
1994/0306    
uchar kbtabesc1[] = 
{ 
[0x00]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x08]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x10]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x18]	No,	No,	No,	No,	'\n',	Ctrl,	No,	No, 
[0x20]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x28]	No,	No,	Shift,	No,	No,	No,	No,	No, 
[0x30]	No,	No,	No,	No,	No,	'/',	No,	Print, 
[0x38]	Latin,	No,	No,	No,	No,	No,	No,	No, 
[0x40]	No,	No,	No,	No,	No,	No,	Break,	Home, 
[0x48]	Up,	Pgup,	No,	Left,	No,	Right,	No,	End, 
[0x50]	Down,	Pgdown,	Ins,	Del,	No,	No,	No,	No, 
[0x58]	No,	No,	No,	No,	No,	No,	No,	No, 
1993/0907    
}; 
 
                 
struct Kbd 
{ 
	Lock; 
	int l; 
} kbd; 
1994/0306    
static uchar ccc; 
1993/0907    
 
void 
kdbdly(int l) 
1994/0201/sys/src/9/carrera/kbd.c:175,1911994/0306/sys/src/9/carrera/kbd.c:154,159
1993/0907    
	return 0; 
} 
 
/* 
 *  wait for a keyboard acknowledge (or some max time) 
 */ 
int 
kbdackwait(void) 
{ 
	if(kbdintr()) 
		return KBDDAT; 
	return 0; 
1993/1001    
} 
                 
void 
mouseintr(void) 
{ 
1994/0201/sys/src/9/carrera/kbd.c:219,2801994/0306/sys/src/9/carrera/kbd.c:187,271
1993/1003    
	} 
1993/0907    
} 
 
int 
1994/0306    
void 
1993/0907    
kbdintr(void) 
{ 
	int c, i, nk; 
	uchar ch, code; 
1994/0306    
	static int esc1, esc2; 
	static int caps; 
	static int ctl; 
	static int num; 
	static int lstate; 
1993/0907    
	static uchar kc[5]; 
	static int shifted, ctrled, lstate; 
1993/0908    
	static int upcode; 
1994/0306    
	static int shift; 
	int keyup; 
1993/0907    
 
	kbdwait(); 
	code = KBDDAT; 
1994/0306    
	c = KBDDAT; 
1993/0907    
 
	/* 
	 *  key has gone up 
1994/0306    
	 *  e0's is the first of a 2 character sequence 
1993/0907    
	 */ 
	if(code == Up) { 
1993/0908    
		upcode = 1; 
		return 0; 
1994/0306    
	if(c == 0xe0){ 
		esc1 = 1; 
		return; 
	} else if(c == 0xe1){ 
		esc2 = 2; 
		return; 
1993/0908    
	} 
 
	if(code > 0x87) 
		return 1; 
1994/0306    
	keyup = c&0x80; 
	c &= 0x7f; 
	if(c > sizeof kbtab){ 
		print("unknown key %ux\n", c|keyup); 
		return; 
	} 
1993/0908    
 
	if(upcode){ 
		ch = keymap[code]; 
1993/0907    
		if(ch == Ctrl) 
			ctrled = 0; 
		else if(ch == Shift) 
			shifted = 0; 
1993/0908    
		upcode = 0; 
1993/0907    
		return 0; 
1994/0306    
	if(esc1){ 
		c = kbtabesc1[c]; 
		esc1 = 0; 
1993/0907    
	} 
1993/0908    
	upcode = 0; 
1994/0306    
	else if(esc2){ 
		esc2--; 
		return; 
	} 
	else if(shift) 
		c = kbtabshift[c]; 
	else 
		c = kbtab[c]; 
1993/0907    
 
1994/0306    
	if(caps && c<='z' && c>='a') 
		c += 'A' - 'a'; 
 
1993/0907    
	/* 
	 *  convert 
1994/0306    
	 *  keyup only important for shifts 
1993/0907    
	 */ 
	if(shifted) 
		ch = skeymap[code]; 
	else 
		ch = keymap[code]; 
1994/0306    
	if(keyup){ 
		switch(c){ 
		case Shift: 
			shift = 0; 
			break; 
		case Ctrl: 
			ctl = 0; 
			break; 
		} 
		return; 
	} 
1993/0907    
	/* 
 	 *  normal character 
	 */ 
	if(!(ch & Spec)){ 
		if(ctrled) 
			ch &= 0x1f; 
1994/0306    
	if(!(c & Spec)){ 
		if(ctl) 
			c &= 0x1f; 
1993/0907    
		switch(lstate){ 
		case 1: 
			kc[0] = ch; 
1994/0306    
			kc[0] = c; 
1993/0907    
			lstate = 2; 
			if(ch == 'X') 
1994/0306    
			if(c == 'X') 
1993/0907    
				lstate = 3; 
			break; 
		case 2: 
			kc[1] = ch; 
1994/0306    
			kc[1] = c; 
1993/0907    
			c = latin1(kc); 
			nk = 2; 
		putit: 
1994/0201/sys/src/9/carrera/kbd.c:281,3541994/0306/sys/src/9/carrera/kbd.c:272,323
1993/0907    
			lstate = 0; 
			if(c != -1) 
				kbdputc(kbdq, c); 
			else { 
				for(i=0; i<nk; i++) 
					kbdputc(kbdq, kc[i]); 
			} 
1994/0306    
			else for(i=0; i<nk; i++) 
				kbdputc(kbdq, kc[i]); 
1993/0907    
			break; 
		case 3: 
		case 4: 
		case 5: 
			kc[lstate-2] = ch; 
1994/0306    
			kc[lstate-2] = c; 
1993/0907    
			lstate++; 
			break; 
		case 6: 
			kc[4] = ch; 
1994/0306    
			kc[4] = c; 
1993/0907    
			c = unicode(kc); 
			nk = 5; 
			goto putit; 
		default: 
			kbdputc(kbdq, ch); 
1994/0306    
			kbdputc(kbdq, c); 
1993/0907    
			break; 
		} 
		return 0; 
1994/0306    
		return; 
1993/0907    
	} 
                 
	/* 
	 *  filter out function keys 
	 */ 
	if((Tmask&ch) == (Spec|F)) 
		return 0; 
                 
	/* 
	 *  special character 
	 */ 
	switch(ch){ 
	case Shift: 
		shifted = 1; 
		break; 
	case Break: 
		break; 
	case Ctrl: 
		ctrled = 1; 
		break; 
	case Latin: 
		lstate = 1; 
		break; 
	default: 
		kbdputc(kbdq, ch); 
1994/0306    
	else { 
		switch(c){ 
		case Caps: 
			caps ^= 1; 
			return; 
		case Num: 
			num ^= 1; 
			return; 
		case Shift: 
			shift = 1; 
			return; 
		case Latin: 
			lstate = 1; 
			return; 
		case Ctrl: 
			ctl = 1; 
			return; 
		} 
1993/0907    
	} 
	return 0; 
1994/0306    
	kbdputc(kbdq, c); 
1993/0907    
} 
 
void 
lights(int l) 
{ 
	int s; 
	int tries; 
                 
	s = splhi(); 
	for(tries = 0; tries < 2000 && (KBDCTL & Sibf); tries++) 
		; 
	kdbdly(1); 
	KBDDAT = Kwrlights; 
	kbdackwait(); 
	for(tries = 0; tries < 2000 && (KBDCTL & Sibf); tries++) 
		; 
	kdbdly(1); 
	KBDDAT = kbd.l = l; 
	kbdackwait(); 
	splx(s); 
1994/0306    
	USED(l); 
1993/0907    
} 
 
static void 
1994/0201/sys/src/9/carrera/kbd.c:410,4521994/0306/sys/src/9/carrera/kbd.c:379,402
1993/0907    
	} 
 
 
	/* 
	 *  disable the interface 
	 */ 
1994/0306    
	/* wait for a quiescent controller */ 
1993/0907    
	OUTWAIT; 
	KBDCTL = Kwrcmd; 
	OUTWAIT; 
	KBDDAT = Csystem | Cinhibit | Cdisable | Cintena; 
1994/0306    
	KBDCTL = 0x20; 
	if(kbdwait() == 0) { 
		print("kbdinit: can't read ccc\n"); 
		ccc = 0; 
	} else 
		ccc = KBDDAT; 
1993/0907    
 
	/* 
	 *  set unix scan on the keyboard 
	 */ 
	OUTWAIT; 
	KBDDAT = Mdisable; 
	INWAIT; 
	if(KBDDAT != Rack) 
		return 0; 
	OUTWAIT; 
	KBDDAT = Msetscan; 
	ACKWAIT; 
	OUTWAIT; 
	KBDDAT = 0; 
	ACKWAIT; 
	OUTWAIT; 
	KBDDAT = Menable; 
1994/0306    
	/* enable kbd xfers and interrupts */ 
	ccc &= ~Ckbddis; 
	ccc |= Csf | Ckbdint | Cscs1 | Cmouseint; 
1993/0907    
 
	/* 
	 *  enable the interface 
	 */ 
	OUTWAIT; 
	KBDCTL = Kwrcmd; 
1994/0306    
	KBDCTL = 0x60; 
1993/0907    
	OUTWAIT; 
1993/1003    
	KBDDAT = Csystem | Cinhibit | Cintena | Cmseint; 
1994/0306    
	KBDDAT = ccc; 
1993/0907    
	OUTWAIT; 
	KBDCTL = Kenable; 
1993/1003    
	OUTWAIT; 
	KBDCTL = Kmseena; 
1993/0907    
	empty(); 
1993/1003    
 
1994/0201    
	mousecmd(0xEA);	/* streaming */ 
	mousecmd(0xE8);	/* set resolution */ 
1994/0306/sys/src/9/carrera/kbd.c:369,3751994/0415/sys/src/9/carrera/kbd.c:369,375 (short | long)
1993/0907    
kbdinit(void) 
{ 
	int i; 
                 
1994/0415    
return; 
1993/0907    
	/* 
	 *  empty the buffer 
	 */ 
1994/0415/sys/src/9/carrera/kbd.c:369,3751994/0423/sys/src/9/carrera/kbd.c:369,375 (short | long)
1993/0907    
kbdinit(void) 
{ 
	int i; 
1994/0415    
return; 
1994/0423    
 
1993/0907    
	/* 
	 *  empty the buffer 
	 */ 
1994/0423/sys/src/9/carrera/kbd.c:369,3751994/0427/sys/src/9/carrera/kbd.c:369,375 (short | long)
1993/0907    
kbdinit(void) 
{ 
	int i; 
1994/0423    
                 
1994/0427    
return 0; 
1993/0907    
	/* 
	 *  empty the buffer 
	 */ 
1994/0427/sys/src/9/carrera/kbd.c:369,3751994/0428/sys/src/9/carrera/kbd.c:369,375 (short | long)
1993/0907    
kbdinit(void) 
{ 
	int i; 
1994/0427    
return 0; 
1994/0428    
 
1993/0907    
	/* 
	 *  empty the buffer 
	 */ 
1994/0428/sys/src/9/carrera/kbd.c:190,2011994/0503/sys/src/9/carrera/kbd.c:190,201 (short | long)
1994/0306    
void 
1993/0907    
kbdintr(void) 
{ 
	int c, i, nk; 
1994/0503    
	int c, i; 
1994/0306    
	static int esc1, esc2; 
	static int caps; 
	static int ctl; 
	static int num; 
	static int lstate; 
1994/0503    
	static int collecting, nk; 
1993/0907    
	static uchar kc[5]; 
1994/0306    
	static int shift; 
	int keyup; 
1994/0428/sys/src/9/carrera/kbd.c:257,2951994/0503/sys/src/9/carrera/kbd.c:257,277
1994/0306    
	if(!(c & Spec)){ 
		if(ctl) 
			c &= 0x1f; 
1993/0907    
		switch(lstate){ 
		case 1: 
1994/0306    
			kc[0] = c; 
1993/0907    
			lstate = 2; 
1994/0306    
			if(c == 'X') 
1993/0907    
				lstate = 3; 
			break; 
		case 2: 
1994/0306    
			kc[1] = c; 
1993/0907    
			c = latin1(kc); 
			nk = 2; 
		putit: 
			lstate = 0; 
			if(c != -1) 
				kbdputc(kbdq, c); 
1994/0306    
			else for(i=0; i<nk; i++) 
				kbdputc(kbdq, kc[i]); 
1993/0907    
			break; 
		case 3: 
		case 4: 
		case 5: 
1994/0306    
			kc[lstate-2] = c; 
1993/0907    
			lstate++; 
			break; 
		case 6: 
1994/0306    
			kc[4] = c; 
1993/0907    
			c = unicode(kc); 
			nk = 5; 
			goto putit; 
		default: 
1994/0503    
		if(!collecting){ 
1994/0306    
			kbdputc(kbdq, c); 
1993/0907    
			break; 
1994/0503    
			return; 
1993/0907    
		} 
1994/0503    
		kc[nk++] = c; 
		c = latin1(kc, nk); 
		if(c < -1)	/* need more keystrokes */ 
			return; 
		if(c != -1)	/* valid sequence */ 
			kbdputc(kbdq, c); 
		else	/* dump characters */ 
			for(i=0; i<nk; i++) 
				kbdputc(kbdq, kc[i]); 
		nk = 0; 
		collecting = 0; 
1994/0306    
		return; 
1993/0907    
	} 
1994/0306    
	else { 
1994/0428/sys/src/9/carrera/kbd.c:304,3101994/0503/sys/src/9/carrera/kbd.c:286,293
1994/0306    
			shift = 1; 
			return; 
		case Latin: 
			lstate = 1; 
1994/0503    
			collecting = 1; 
			nk = 0; 
1994/0306    
			return; 
		case Ctrl: 
			ctl = 1; 
1994/0428/sys/src/9/carrera/kbd.c:369,3741994/0503/sys/src/9/carrera/kbd.c:352,358
1993/0907    
kbdinit(void) 
{ 
	int i; 
1994/0503    
return 0; 
1994/0428    
 
1993/0907    
	/* 
	 *  empty the buffer 
1994/0503/sys/src/9/carrera/kbd.c:352,3581994/0504/sys/src/9/carrera/kbd.c:352,357 (short | long)
1993/0907    
kbdinit(void) 
{ 
	int i; 
1994/0503    
return 0; 
1994/0428    
 
1993/0907    
	/* 
	 *  empty the buffer 
1994/0504/sys/src/9/carrera/kbd.c:353,3581994/0621/sys/src/9/carrera/kbd.c:353,360 (short | long)
1993/0907    
{ 
	int i; 
1994/0428    
 
1994/0621    
	kbdq = qopen(4*1024, 0, 0, 0); 
 
1993/0907    
	/* 
	 *  empty the buffer 
	 */ 
1994/0621/sys/src/9/carrera/kbd.c:354,3591994/0902/sys/src/9/carrera/kbd.c:354,360 (short | long)
1993/0907    
	int i; 
1994/0428    
 
1994/0621    
	kbdq = qopen(4*1024, 0, 0, 0); 
1994/0902    
	qnoblock(kbdq, 1); 
1994/0621    
 
1993/0907    
	/* 
	 *  empty the buffer 
1994/0902/sys/src/9/carrera/kbd.c:391,3931994/0910/sys/src/9/carrera/kbd.c:391,409 (short | long)
1993/0907    
 
	return 1; 
} 
1994/0910    
 
void 
mousectl(char *cmd) 
{ 
	int s; 
 
	if(strncmp(cmd, "reset", 5) == 0){ 
		s = splhi(); 
		mousecmd(0xF6); 
		mousecmd(0xEA);	/* streaming */ 
		mousecmd(0xE8);	/* set resolution */ 
		mousecmd(3); 
		mousecmd(0xF4);	/* enabled */ 
		splx(s); 
	} 
} 
1994/0910/sys/src/9/carrera/kbd.c:406,4091995/0207/sys/src/9/carrera/kbd.c:406,411 (short | long)
1994/0910    
		mousecmd(0xF4);	/* enabled */ 
		splx(s); 
	} 
1995/0207    
	else 
		error(Ebadctl); 
1994/0910    
} 
1995/0207/sys/src/9/carrera/kbd.c:342,3481995/1101/sys/src/9/carrera/kbd.c:342,348 (short | long)
1993/1003    
		c = KBDDAT; 
	} while(c == 0xFE || c == 0); 
	if(c != 0xFA){ 
		print("mouse returns %2.2ux to the %2.2ux command\n", c, cmd); 
1995/1101    
		/*print("mouse returns %2.2ux to the %2.2ux command\n", c, cmd);/**/ 
1993/1003    
		return -1; 
	} 
	return 0; 
1995/1101/sys/src/9/carrera/kbd.c:406,4111995/1216/sys/src/9/carrera/kbd.c:406,416 (short | long)
1994/0910    
		mousecmd(0xF4);	/* enabled */ 
		splx(s); 
	} 
1995/1216    
	else if(strcmp(cmd, "accelerated") == 0){ 
		s = splhi(); 
		mousecmd(0xE7); 
		splx(s); 
	} 
1995/0207    
	else 
		error(Ebadctl); 
1994/0910    
} 
1995/1216/sys/src/9/carrera/kbd.c:6,121996/0223/sys/src/9/carrera/kbd.c:6,11 (short | long)
1993/0907    
#include	"io.h" 
#include	"../port/error.h" 
 
#include	"devtab.h" 
 
enum 
{ 
1996/0223/sys/src/9/carrera/kbd.c:6,111997/0327/sys/src/9/carrera/kbd.c:6,13 (short | long)
1993/0907    
#include	"io.h" 
#include	"../port/error.h" 
 
1997/0327    
#include	<libg.h> 
#include	"screen.h" 
1993/0907    
 
enum 
{ 
1997/0327/sys/src/9/carrera/kbd.c:6,121997/1101/sys/src/9/carrera/kbd.c:6,13 (short | long)
1993/0907    
#include	"io.h" 
#include	"../port/error.h" 
 
1997/0327    
#include	<libg.h> 
1997/1101    
#define	Image	IMAGE 
#include	<draw.h> 
1997/0327    
#include	"screen.h" 
1993/0907    
 
enum 
1997/1101/sys/src/9/carrera/kbd.c:356,3611997/1105/sys/src/9/carrera/kbd.c:356,363 (short | long)
1993/0907    
	int i; 
1994/0428    
 
1994/0621    
	kbdq = qopen(4*1024, 0, 0, 0); 
1997/1105    
	if(kbdq == nil) 
		panic("kbdinit"); 
1994/0902    
	qnoblock(kbdq, 1); 
1994/0621    
 
1993/0907    
	/* 
1997/1105/sys/src/9/carrera/kbd.c:397,4071998/0417/sys/src/9/carrera/kbd.c:397,407 (short | long)
Change mousectl to accept list of fields.
rsc Fri Mar 4 12:44:25 2005
1993/0907    
} 
1994/0910    
 
void 
mousectl(char *cmd) 
1998/0417    
mousectl(char* field[], int) 
1994/0910    
{ 
	int s; 
 
	if(strncmp(cmd, "reset", 5) == 0){ 
1998/0417    
	if(strncmp(field[0], "reset", 5) == 0){ 
1994/0910    
		s = splhi(); 
		mousecmd(0xF6); 
		mousecmd(0xEA);	/* streaming */ 
1997/1105/sys/src/9/carrera/kbd.c:410,4161998/0417/sys/src/9/carrera/kbd.c:410,416
1994/0910    
		mousecmd(0xF4);	/* enabled */ 
		splx(s); 
	} 
1995/1216    
	else if(strcmp(cmd, "accelerated") == 0){ 
1998/0417    
	else if(strcmp(field[0], "accelerated") == 0){ 
1995/1216    
		s = splhi(); 
		mousecmd(0xE7); 
		splx(s); 
1998/0417/sys/src/9/carrera/kbd.c:8,131999/0119/sys/src/9/carrera/kbd.c:8,14 (short | long)
1993/0907    
 
1997/1101    
#define	Image	IMAGE 
#include	<draw.h> 
1999/0119    
#include	<cursor.h> 
1997/0327    
#include	"screen.h" 
1993/0907    
 
enum 
1999/0119/sys/src/9/carrera/kbd.c:47,531999/1005/sys/src/9/carrera/kbd.c:47,53 (short | long)
1994/0306    
 
	PF=		Spec|0x20,	/* num pad function key */ 
	View=		Spec|0x00,	/* view (shift window up) */ 
	KF=		Spec|0x40,	/* function key */ 
1999/1005    
	KF=		0xF000,	/* function key (begin Unicode private space) */ 
1994/0306    
	Shift=		Spec|0x60, 
	Break=		Spec|0x61, 
	Ctrl=		Spec|0x62, 
1999/0119/sys/src/9/carrera/kbd.c:76,821999/1005/sys/src/9/carrera/kbd.c:76,82
1993/0907    
#define INWAIT	while(!(KBDCTL & Sobf)); kdbdly(1) 
#define ACKWAIT INWAIT ; if(KBDDAT != Rack) print("bad response\n"); kdbdly(1) 
 
1994/0306    
uchar kbtab[] =  
1999/1005    
Rune kbtab[] =  
1993/0907    
{ 
1994/0306    
[0x00]	No,	0x1b,	'1',	'2',	'3',	'4',	'5',	'6', 
[0x08]	'7',	'8',	'9',	'0',	'-',	'=',	'\b',	'\t', 
1999/0119/sys/src/9/carrera/kbd.c:92,981999/1005/sys/src/9/carrera/kbd.c:92,98
1994/0306    
[0x58]	KF|12,	No,	No,	No,	No,	No,	No,	No, 
1993/0907    
}; 
 
1994/0306    
uchar kbtabshift[] = 
1999/1005    
Rune kbtabshift[] = 
1994/0306    
{ 
[0x00]	No,	0x1b,	'!',	'@',	'#',	'$',	'%',	'^', 
[0x08]	'&',	'*',	'(',	')',	'_',	'+',	'\b',	'\t', 
1999/0119/sys/src/9/carrera/kbd.c:108,1141999/1005/sys/src/9/carrera/kbd.c:108,114
1994/0306    
[0x58]	KF|12,	No,	No,	No,	No,	No,	No,	No, 
1993/0907    
}; 
 
1994/0306    
uchar kbtabesc1[] = 
1999/1005    
Rune kbtabesc1[] = 
1994/0306    
{ 
[0x00]	No,	No,	No,	No,	No,	No,	No,	No, 
[0x08]	No,	No,	No,	No,	No,	No,	No,	No, 
1999/0119/sys/src/9/carrera/kbd.c:199,2051999/1005/sys/src/9/carrera/kbd.c:199,205
1994/0306    
	static int ctl; 
	static int num; 
1994/0503    
	static int collecting, nk; 
1993/0907    
	static uchar kc[5]; 
1999/1005    
	static Rune kc[5]; 
1994/0306    
	static int shift; 
	int keyup; 
1993/0907    
 
1999/1005/sys/src/9/carrera/kbd.c:61,711999/1104/sys/src/9/carrera/kbd.c:61,71 (short | long)
1994/0306    
	Up=		KF|14, 
	Pgup=		KF|15, 
	Print=		KF|16, 
	Left=		View, 
	Right=		View, 
1999/1104    
	Left=		KF|17, 
	Right=		KF|18, 
1994/0306    
	End=		'\r', 
	Down=		View, 
	Pgdown=		View, 
1999/1104    
	Pgdown=		KF|19, 
1994/0306    
	Ins=		KF|20, 
	Del=		0x7F, 
1993/0907    
}; 
Too many diffs (26 > 25). Stopping.


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)