xref: /inferno-os/appl/lib/irsim.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Ir;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsythinclude "sys.m";
4*37da2899SCharles.Forsythsys: Sys;
5*37da2899SCharles.ForsythFD: import sys;
6*37da2899SCharles.Forsyth
7*37da2899SCharles.Forsythinclude "ir.m";
8*37da2899SCharles.Forsyth
9*37da2899SCharles.Forsythrawon: ref FD;
10*37da2899SCharles.Forsyth
11*37da2899SCharles.Forsythinit(keys, pid: chan of int): int
12*37da2899SCharles.Forsyth{
13*37da2899SCharles.Forsyth	dfd: ref FD;
14*37da2899SCharles.Forsyth
15*37da2899SCharles.Forsyth	sys = load Sys Sys->PATH;
16*37da2899SCharles.Forsyth
17*37da2899SCharles.Forsyth	dfd = sys->open("/dev/keyboard", sys->OREAD);
18*37da2899SCharles.Forsyth	if(dfd == nil)
19*37da2899SCharles.Forsyth		return -1;
20*37da2899SCharles.Forsyth
21*37da2899SCharles.Forsyth	spawn reader(keys, pid, dfd);
22*37da2899SCharles.Forsyth	return 0;
23*37da2899SCharles.Forsyth}
24*37da2899SCharles.Forsyth
25*37da2899SCharles.Forsythreader(keys, pid: chan of int, dfd: ref FD)
26*37da2899SCharles.Forsyth{
27*37da2899SCharles.Forsyth	n: int;
28*37da2899SCharles.Forsyth
29*37da2899SCharles.Forsyth	nb := 0;
30*37da2899SCharles.Forsyth	b:= array[1] of byte;
31*37da2899SCharles.Forsyth	buf := array[10] of byte;
32*37da2899SCharles.Forsyth	pid <-= sys->pctl(0,nil);
33*37da2899SCharles.Forsyth	for(;;) {
34*37da2899SCharles.Forsyth		n = sys->read(dfd, b, 1);
35*37da2899SCharles.Forsyth		if(n != 1)
36*37da2899SCharles.Forsyth			break;
37*37da2899SCharles.Forsyth		if(nb>= len buf){
38*37da2899SCharles.Forsyth			sys->print("irsim: confused by input\n");
39*37da2899SCharles.Forsyth			break;
40*37da2899SCharles.Forsyth		}
41*37da2899SCharles.Forsyth
42*37da2899SCharles.Forsyth		buf[nb++] = b[0];
43*37da2899SCharles.Forsyth		nutf := sys->utfbytes(buf, nb);
44*37da2899SCharles.Forsyth		if(nutf > 0){
45*37da2899SCharles.Forsyth			s := string buf[0:nutf];
46*37da2899SCharles.Forsyth			keys <-= s[0];
47*37da2899SCharles.Forsyth			nb = 0;
48*37da2899SCharles.Forsyth		}
49*37da2899SCharles.Forsyth	}
50*37da2899SCharles.Forsyth	keys <-= Ir->EOF;
51*37da2899SCharles.Forsyth}
52*37da2899SCharles.Forsyth
53*37da2899SCharles.Forsythtranslate(key: int): int
54*37da2899SCharles.Forsyth{
55*37da2899SCharles.Forsyth	n := Ir->Error;
56*37da2899SCharles.Forsyth
57*37da2899SCharles.Forsyth	case key {
58*37da2899SCharles.Forsyth	'0' =>	n = Ir->Zero;
59*37da2899SCharles.Forsyth	'1' =>	n = Ir->One;
60*37da2899SCharles.Forsyth	'2' =>	n = Ir->Two;
61*37da2899SCharles.Forsyth	'3' =>	n = Ir->Three;
62*37da2899SCharles.Forsyth	'4' =>	n = Ir->Four;
63*37da2899SCharles.Forsyth	'5' =>	n = Ir->Five;
64*37da2899SCharles.Forsyth	'6' =>	n = Ir->Six;
65*37da2899SCharles.Forsyth	'7' =>	n = Ir->Seven;
66*37da2899SCharles.Forsyth	'8' =>	n = Ir->Eight;
67*37da2899SCharles.Forsyth	'9' =>	n = Ir->Nine;
68*37da2899SCharles.Forsyth	'r' =>	n = Ir->ChanUP;
69*37da2899SCharles.Forsyth	'c' =>	n = Ir->ChanDN;
70*37da2899SCharles.Forsyth	't' =>	n = Ir->VolUP;
71*37da2899SCharles.Forsyth	'v' =>	n = Ir->VolDN;
72*37da2899SCharles.Forsyth	'k' =>	n = Ir->FF;
73*37da2899SCharles.Forsyth	'j' =>	n = Ir->Rew;
74*37da2899SCharles.Forsyth	'i' =>	n = Ir->Up;
75*37da2899SCharles.Forsyth	'm' =>	n = Ir->Dn;
76*37da2899SCharles.Forsyth	'x' =>	n = Ir->Rcl;
77*37da2899SCharles.Forsyth	'\n' =>	n = Ir->Select;
78*37da2899SCharles.Forsyth	' ' =>	n = Ir->Enter;
79*37da2899SCharles.Forsyth	16r7f =>	n = Ir->Power;
80*37da2899SCharles.Forsyth	}
81*37da2899SCharles.Forsyth
82*37da2899SCharles.Forsyth	return n;
83*37da2899SCharles.Forsyth}
84