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

1991/0706/pc/kbd.c (diff list | history)

1991/0705/sys/src/9/pc/kbd.c:1,91991/0706/sys/src/9/pc/kbd.c:1,9 (short | long | prev | next)
1991/0702    
#include	"u.h" 
#include	"lib.h" 
1991/0706    
#include	"mem.h" 
1991/0702    
#include	"dat.h" 
#include	"fns.h" 
1991/0703    
#include	"io.h" 
#include	"mem.h" 
1991/0702    
 
enum { 
	Data=		0x60,	/* data port */ 
1991/0705/sys/src/9/pc/kbd.c:241,2681991/0706/sys/src/9/pc/kbd.c:241,251
1991/0703    
	setvec(Kbdvec, kbdintr, SEGIG); 
} 
 
1991/0702    
/* 
 *  get a byte from the keyboard 
 */ 
int 
kbdc(void) 
{ 
1991/0703    
	int c; 
                 
	for(;;){ 
		while((inb(Status)&Inready)==0) 
			; 
		kbdintr(&c); 
		c = getc(&kbdq); 
		if(c != -1) 
			return c; 
	} 
1991/0702    
} 
                 
1991/0703    
int 
kbdputc(IOQ* q, int c) 
{ 
	screenputc(c); 
1991/0706    
	if(c==0x10) 
		panic("^p"); 
1991/0703    
	putc(q, c); 
} 
 
1991/0705/sys/src/9/pc/kbd.c:270,2761991/0706/sys/src/9/pc/kbd.c:253,259
1991/0703    
 *  keyboard interrupt 
 */ 
void 
kbdintr(void *a) 
1991/0706    
kbdintr(Ureg *ur) 
1991/0703    
{ 
	int c, nc; 
	static int esc1, esc2; 
1991/0705/sys/src/9/pc/kbd.c:291,2971991/0706/sys/src/9/pc/kbd.c:274,280
1991/0703    
	if(c > sizeof kbtab){ 
		print("unknown key %ux\n", c|keyup); 
		kbdputc(&kbdq, k1); 
		goto out; 
1991/0706    
		return; 
1991/0703    
	} 
 
	/* 
1991/0705/sys/src/9/pc/kbd.c:299,3081991/0706/sys/src/9/pc/kbd.c:282,291
1991/0703    
	 */ 
	if(c == 0xe0){ 
		esc1 = 1; 
		goto out; 
1991/0706    
		return; 
1991/0703    
	} else if(c == 0xe1){ 
		esc2 = 2; 
		goto out; 
1991/0706    
		return; 
1991/0703    
	} 
 
	if(esc1){ 
1991/0705/sys/src/9/pc/kbd.c:310,3161991/0706/sys/src/9/pc/kbd.c:293,299
1991/0703    
		esc1 = 0; 
	} else if(esc2){ 
		esc2--; 
		goto out; 
1991/0706    
		return; 
1991/0703    
	} else if(shift) 
		c = kbtabshift[c]; 
	else 
1991/0705/sys/src/9/pc/kbd.c:331,3371991/0706/sys/src/9/pc/kbd.c:314,320
1991/0703    
			ctl = 0; 
			break; 
		} 
		goto out; 
1991/0706    
		return; 
1991/0703    
	} 
 
	/* 
1991/0705/sys/src/9/pc/kbd.c:361,3831991/0706/sys/src/9/pc/kbd.c:344,364
1991/0703    
		switch(c){ 
		case Caps: 
			caps ^= 1; 
			goto out; 
1991/0706    
			return; 
1991/0703    
		case Num: 
			num ^= 1; 
			goto out; 
1991/0706    
			return; 
1991/0703    
		case Shift: 
			shift = 1; 
			goto out; 
1991/0706    
			return; 
1991/0703    
		case Latin: 
			lstate = 1; 
			goto out; 
1991/0706    
			return; 
1991/0703    
		case Ctrl: 
			ctl = 1; 
			goto out; 
1991/0706    
			return; 
1991/0703    
		} 
	} 
	kbdputc(&kbdq, c); 
out: 
1991/0705    
	INT0ENABLE;			/* reenable interrupt */ 
1991/0703    
	return; 
} 


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