xref: /inferno-os/appl/lib/ir.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Ir;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsythinclude "sys.m";
4*37da2899SCharles.ForsythFD, Dir: import Sys;
5*37da2899SCharles.Forsythinclude "ir.m";
6*37da2899SCharles.Forsyth
7*37da2899SCharles.Forsythsys: Sys;
8*37da2899SCharles.Forsyth
9*37da2899SCharles.Forsythinit(keys, pid: chan of int): int
10*37da2899SCharles.Forsyth{
11*37da2899SCharles.Forsyth	sys = load Sys Sys->PATH;
12*37da2899SCharles.Forsyth
13*37da2899SCharles.Forsyth	cfd := sys->open("#t/eia1ctl", sys->OWRITE);
14*37da2899SCharles.Forsyth	if(cfd == nil)
15*37da2899SCharles.Forsyth		return -1;
16*37da2899SCharles.Forsyth	sys->fprint(cfd, "b9600");
17*37da2899SCharles.Forsyth
18*37da2899SCharles.Forsyth	dfd := sys->open("#t/eia1", sys->OREAD);
19*37da2899SCharles.Forsyth	cfd = nil;
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, ta, tb: int;
28*37da2899SCharles.Forsyth	dir: Dir;
29*37da2899SCharles.Forsyth	b1:= array[1] of byte;
30*37da2899SCharles.Forsyth	b2:= array[1] of byte;
31*37da2899SCharles.Forsyth
32*37da2899SCharles.Forsyth	pid <-= sys->pctl(0,nil);
33*37da2899SCharles.Forsyth	(n, dir) = sys->fstat(dfd);
34*37da2899SCharles.Forsyth	if(n >= 0 && dir.length > big 0) {
35*37da2899SCharles.Forsyth		while(dir.length > big 0) {
36*37da2899SCharles.Forsyth			l := int dir.length;
37*37da2899SCharles.Forsyth			n = sys->read(dfd, array[l] of byte, l);
38*37da2899SCharles.Forsyth			if(n < 0)
39*37da2899SCharles.Forsyth				break;
40*37da2899SCharles.Forsyth			dir.length -= big n;
41*37da2899SCharles.Forsyth		}
42*37da2899SCharles.Forsyth	}
43*37da2899SCharles.Forsyth
44*37da2899SCharles.Forsythout:	for(;;) {
45*37da2899SCharles.Forsyth		n = sys->read(dfd, b1, len b1);
46*37da2899SCharles.Forsyth		if(n <= 0)
47*37da2899SCharles.Forsyth			break;
48*37da2899SCharles.Forsyth		ta = sys->millisec();
49*37da2899SCharles.Forsyth		for(;;) {
50*37da2899SCharles.Forsyth			n = sys->read(dfd, b2, 1);
51*37da2899SCharles.Forsyth			if(n <= 0)
52*37da2899SCharles.Forsyth				break out;
53*37da2899SCharles.Forsyth			tb = sys->millisec();
54*37da2899SCharles.Forsyth			if(tb - ta <= 200)
55*37da2899SCharles.Forsyth				break;
56*37da2899SCharles.Forsyth			ta = tb;
57*37da2899SCharles.Forsyth			b1[0] = b2[0];
58*37da2899SCharles.Forsyth		}
59*37da2899SCharles.Forsyth		case ((int b1[0]&16r1f)<<5) | (int b2[0]&16r1f) {
60*37da2899SCharles.Forsyth		 71 =>	n = Ir->ChanDN;
61*37da2899SCharles.Forsyth		 95 =>	n = Ir->Seven;
62*37da2899SCharles.Forsyth		135 =>	n = Ir->VolDN;
63*37da2899SCharles.Forsyth		207 =>	n = Ir->Three;
64*37da2899SCharles.Forsyth		215 =>	n = Ir->Select;
65*37da2899SCharles.Forsyth		263 =>	n = Ir->Dn;
66*37da2899SCharles.Forsyth		335 =>	n = Ir->Five;
67*37da2899SCharles.Forsyth		343 =>	n = Ir->Rew;
68*37da2899SCharles.Forsyth		399 =>	n = Ir->Nine;
69*37da2899SCharles.Forsyth		407 =>	n = Ir->Enter;
70*37da2899SCharles.Forsyth		455 =>	n = Ir->Power;
71*37da2899SCharles.Forsyth		479 =>	n = Ir->One;
72*37da2899SCharles.Forsyth		591 =>	n = Ir->Six;
73*37da2899SCharles.Forsyth		599 =>	n = Ir->ChanUP;
74*37da2899SCharles.Forsyth		663 =>	n = Ir->VolUP;
75*37da2899SCharles.Forsyth		711 =>	n = Ir->Up;
76*37da2899SCharles.Forsyth		735 =>	n = Ir->Two;
77*37da2899SCharles.Forsyth		791 =>	n = Ir->Mute;
78*37da2899SCharles.Forsyth		839 =>	n = Ir->FF;
79*37da2899SCharles.Forsyth		863 =>	n = Ir->Four;
80*37da2899SCharles.Forsyth		903 =>	n = Ir->Record;
81*37da2899SCharles.Forsyth		927 =>	n = Ir->Eight;
82*37da2899SCharles.Forsyth		975 =>	n = Ir->Zero;
83*37da2899SCharles.Forsyth		983 =>	n = Ir->Rcl;
84*37da2899SCharles.Forsyth		* =>	n = Ir->Error;
85*37da2899SCharles.Forsyth		}
86*37da2899SCharles.Forsyth
87*37da2899SCharles.Forsyth		keys <-= n;
88*37da2899SCharles.Forsyth	}
89*37da2899SCharles.Forsyth	keys <-= Ir->Error;
90*37da2899SCharles.Forsyth}
91*37da2899SCharles.Forsyth
92*37da2899SCharles.Forsythtranslate(c: int): int
93*37da2899SCharles.Forsyth{
94*37da2899SCharles.Forsyth	return c;
95*37da2899SCharles.Forsyth}
96