xref: /inferno-os/os/boot/mpc/console.c (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1*74a4d8c2SCharles.Forsyth #include "u.h"
2*74a4d8c2SCharles.Forsyth #include "lib.h"
3*74a4d8c2SCharles.Forsyth #include "mem.h"
4*74a4d8c2SCharles.Forsyth #include "dat.h"
5*74a4d8c2SCharles.Forsyth #include "fns.h"
6*74a4d8c2SCharles.Forsyth #include "io.h"
7*74a4d8c2SCharles.Forsyth 
8*74a4d8c2SCharles.Forsyth static Queue*	consiq;
9*74a4d8c2SCharles.Forsyth static Queue*	consoq;
10*74a4d8c2SCharles.Forsyth 
11*74a4d8c2SCharles.Forsyth void
bothputs(char * s,int n)12*74a4d8c2SCharles.Forsyth bothputs(char *s, int n)
13*74a4d8c2SCharles.Forsyth {
14*74a4d8c2SCharles.Forsyth 	uartputs(s, n);
15*74a4d8c2SCharles.Forsyth 	screenputs(s, n);
16*74a4d8c2SCharles.Forsyth }
17*74a4d8c2SCharles.Forsyth 
18*74a4d8c2SCharles.Forsyth static void (*consputs)(char*, int) = bothputs;	/* or screenputs */
19*74a4d8c2SCharles.Forsyth 
20*74a4d8c2SCharles.Forsyth void
consinit(void)21*74a4d8c2SCharles.Forsyth consinit(void)
22*74a4d8c2SCharles.Forsyth {
23*74a4d8c2SCharles.Forsyth 	char *p;
24*74a4d8c2SCharles.Forsyth 	int baud, port;
25*74a4d8c2SCharles.Forsyth 	static int cgadone;
26*74a4d8c2SCharles.Forsyth 
27*74a4d8c2SCharles.Forsyth 	p = getconf("console");
28*74a4d8c2SCharles.Forsyth 	if(0)
29*74a4d8c2SCharles.Forsyth 	if(p == 0 || strcmp(p, "lcd") == 0 || strcmp(p, "screen") == 0){
30*74a4d8c2SCharles.Forsyth 		consiq = qopen(4*1024, 0, 0, 0);
31*74a4d8c2SCharles.Forsyth 		consoq = qopen(8*1024, 0, 0, 0);
32*74a4d8c2SCharles.Forsyth 		consputs = screenputs;
33*74a4d8c2SCharles.Forsyth 		return;
34*74a4d8c2SCharles.Forsyth 	}
35*74a4d8c2SCharles.Forsyth 	if(p!=0 && strstr(p, "lcd") == 0)
36*74a4d8c2SCharles.Forsyth 		consputs = bothputs;
37*74a4d8c2SCharles.Forsyth 	else
38*74a4d8c2SCharles.Forsyth 		consputs = uartputs;
39*74a4d8c2SCharles.Forsyth //consputs = screenputs;
40*74a4d8c2SCharles.Forsyth 	port = 0;
41*74a4d8c2SCharles.Forsyth 	if(p)
42*74a4d8c2SCharles.Forsyth 		port = strtoul(p, 0, 0);
43*74a4d8c2SCharles.Forsyth 	baud = 0;
44*74a4d8c2SCharles.Forsyth 	if(p = getconf("baud"))
45*74a4d8c2SCharles.Forsyth 		baud = strtoul(p, 0, 0);
46*74a4d8c2SCharles.Forsyth 	if(baud == 0)
47*74a4d8c2SCharles.Forsyth 		baud = 9600;
48*74a4d8c2SCharles.Forsyth 	uartspecial(port, baud, &consiq, &consoq, kbdchar);
49*74a4d8c2SCharles.Forsyth }
50*74a4d8c2SCharles.Forsyth 
51*74a4d8c2SCharles.Forsyth void
kbdchar(Queue * q,int c)52*74a4d8c2SCharles.Forsyth kbdchar(Queue *q, int c)
53*74a4d8c2SCharles.Forsyth {
54*74a4d8c2SCharles.Forsyth 	c &= 0x7F;
55*74a4d8c2SCharles.Forsyth 	if(c == 0x10)
56*74a4d8c2SCharles.Forsyth 		panic("^p");
57*74a4d8c2SCharles.Forsyth 	qbputc(q, c);
58*74a4d8c2SCharles.Forsyth }
59*74a4d8c2SCharles.Forsyth 
60*74a4d8c2SCharles.Forsyth static int
getline(char * buf,int size,int dotimeout)61*74a4d8c2SCharles.Forsyth getline(char *buf, int size, int dotimeout)
62*74a4d8c2SCharles.Forsyth {
63*74a4d8c2SCharles.Forsyth 	int c, i=0;
64*74a4d8c2SCharles.Forsyth 	ulong start;
65*74a4d8c2SCharles.Forsyth 	char echo;
66*74a4d8c2SCharles.Forsyth 
67*74a4d8c2SCharles.Forsyth 	for (;;) {
68*74a4d8c2SCharles.Forsyth 		start = m->ticks;
69*74a4d8c2SCharles.Forsyth 		do{
70*74a4d8c2SCharles.Forsyth 			if(dotimeout && ((m->ticks - start) > 5*HZ))
71*74a4d8c2SCharles.Forsyth 				return -2;
72*74a4d8c2SCharles.Forsyth 			c = qbgetc(consiq);
73*74a4d8c2SCharles.Forsyth 		}while(c == -1);
74*74a4d8c2SCharles.Forsyth 		if(c == '\r')
75*74a4d8c2SCharles.Forsyth 			c = '\n'; 		/* turn carriage return into newline */
76*74a4d8c2SCharles.Forsyth 		if(c == '\177')
77*74a4d8c2SCharles.Forsyth 			c = '\010';		/* turn delete into backspace */
78*74a4d8c2SCharles.Forsyth 		if(c == '\025')
79*74a4d8c2SCharles.Forsyth 			echo = '\n';		/* echo ^U as a newline */
80*74a4d8c2SCharles.Forsyth 		else
81*74a4d8c2SCharles.Forsyth 			echo = c;
82*74a4d8c2SCharles.Forsyth 		(*consputs)(&echo, 1);
83*74a4d8c2SCharles.Forsyth 
84*74a4d8c2SCharles.Forsyth 		if(c == '\010'){
85*74a4d8c2SCharles.Forsyth 			if(i > 0)
86*74a4d8c2SCharles.Forsyth 				i--; /* bs deletes last character */
87*74a4d8c2SCharles.Forsyth 			continue;
88*74a4d8c2SCharles.Forsyth 		}
89*74a4d8c2SCharles.Forsyth 		/* a newline ends a line */
90*74a4d8c2SCharles.Forsyth 		if (c == '\n')
91*74a4d8c2SCharles.Forsyth 			break;
92*74a4d8c2SCharles.Forsyth 		/* ^U wipes out the line */
93*74a4d8c2SCharles.Forsyth 		if (c =='\025')
94*74a4d8c2SCharles.Forsyth 			return -1;
95*74a4d8c2SCharles.Forsyth 		if(i == size)
96*74a4d8c2SCharles.Forsyth 			return size;
97*74a4d8c2SCharles.Forsyth 		buf[i++] = c;
98*74a4d8c2SCharles.Forsyth 	}
99*74a4d8c2SCharles.Forsyth 	buf[i] = 0;
100*74a4d8c2SCharles.Forsyth 	return i;
101*74a4d8c2SCharles.Forsyth }
102*74a4d8c2SCharles.Forsyth 
103*74a4d8c2SCharles.Forsyth int
getstr(char * prompt,char * buf,int size,char * def)104*74a4d8c2SCharles.Forsyth getstr(char *prompt, char *buf, int size, char *def)
105*74a4d8c2SCharles.Forsyth {
106*74a4d8c2SCharles.Forsyth 	int len, isdefault;
107*74a4d8c2SCharles.Forsyth 
108*74a4d8c2SCharles.Forsyth 	buf[0] = 0;
109*74a4d8c2SCharles.Forsyth 	isdefault = (def && *def);
110*74a4d8c2SCharles.Forsyth 	for (;;) {
111*74a4d8c2SCharles.Forsyth 		if(isdefault)
112*74a4d8c2SCharles.Forsyth 			print("%s[default==%s]: ", prompt, def);
113*74a4d8c2SCharles.Forsyth 		else
114*74a4d8c2SCharles.Forsyth 			print("%s: ", prompt);
115*74a4d8c2SCharles.Forsyth 		len = getline(buf, size, isdefault);
116*74a4d8c2SCharles.Forsyth 		switch(len){
117*74a4d8c2SCharles.Forsyth 		case -1:
118*74a4d8c2SCharles.Forsyth 			/* ^U typed */
119*74a4d8c2SCharles.Forsyth 			continue;
120*74a4d8c2SCharles.Forsyth 		case -2:
121*74a4d8c2SCharles.Forsyth 			/* timeout, use default */
122*74a4d8c2SCharles.Forsyth 			(*consputs)("\n", 1);
123*74a4d8c2SCharles.Forsyth 			len = 0;
124*74a4d8c2SCharles.Forsyth 			break;
125*74a4d8c2SCharles.Forsyth 		default:
126*74a4d8c2SCharles.Forsyth 			break;
127*74a4d8c2SCharles.Forsyth 		}
128*74a4d8c2SCharles.Forsyth 		if(len >= size){
129*74a4d8c2SCharles.Forsyth 			print("line too long\n");
130*74a4d8c2SCharles.Forsyth 			continue;
131*74a4d8c2SCharles.Forsyth 		}
132*74a4d8c2SCharles.Forsyth 		break;
133*74a4d8c2SCharles.Forsyth 	}
134*74a4d8c2SCharles.Forsyth 	if(len == 0 && isdefault)
135*74a4d8c2SCharles.Forsyth 		strcpy(buf, def);
136*74a4d8c2SCharles.Forsyth 	return 0;
137*74a4d8c2SCharles.Forsyth }
138*74a4d8c2SCharles.Forsyth 
139*74a4d8c2SCharles.Forsyth int
sprint(char * s,char * fmt,...)140*74a4d8c2SCharles.Forsyth sprint(char *s, char *fmt, ...)
141*74a4d8c2SCharles.Forsyth {
142*74a4d8c2SCharles.Forsyth 	return donprint(s, s+PRINTSIZE, fmt, (&fmt+1)) - s;
143*74a4d8c2SCharles.Forsyth }
144*74a4d8c2SCharles.Forsyth 
145*74a4d8c2SCharles.Forsyth int
print(char * fmt,...)146*74a4d8c2SCharles.Forsyth print(char *fmt, ...)
147*74a4d8c2SCharles.Forsyth {
148*74a4d8c2SCharles.Forsyth 	char buf[PRINTSIZE];
149*74a4d8c2SCharles.Forsyth 	int n;
150*74a4d8c2SCharles.Forsyth 
151*74a4d8c2SCharles.Forsyth 	if(consputs == 0)
152*74a4d8c2SCharles.Forsyth 		return 0;
153*74a4d8c2SCharles.Forsyth 	n = donprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf;
154*74a4d8c2SCharles.Forsyth 	(*consputs)(buf, n);
155*74a4d8c2SCharles.Forsyth 	return n;
156*74a4d8c2SCharles.Forsyth }
157*74a4d8c2SCharles.Forsyth 
158*74a4d8c2SCharles.Forsyth void
panic(char * fmt,...)159*74a4d8c2SCharles.Forsyth panic(char *fmt, ...)
160*74a4d8c2SCharles.Forsyth {
161*74a4d8c2SCharles.Forsyth 	char buf[PRINTSIZE];
162*74a4d8c2SCharles.Forsyth 	int n;
163*74a4d8c2SCharles.Forsyth 
164*74a4d8c2SCharles.Forsyth 	if(consputs){
165*74a4d8c2SCharles.Forsyth 		(*consputs)("panic: ", 7);
166*74a4d8c2SCharles.Forsyth 		n = donprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf;
167*74a4d8c2SCharles.Forsyth 		(*consputs)(buf, n);
168*74a4d8c2SCharles.Forsyth 		(*consputs)("\n", 1);
169*74a4d8c2SCharles.Forsyth 	}
170*74a4d8c2SCharles.Forsyth 	spllo();
171*74a4d8c2SCharles.Forsyth 	for(;;)
172*74a4d8c2SCharles.Forsyth 		idle();
173*74a4d8c2SCharles.Forsyth }
174