xref: /plan9-contrib/sys/src/boot/vt4/console.c (revision da917039c7f233c1a27d212bf012c6afa758af39)
1*da917039SDavid du Colombier #include "include.h"
2*da917039SDavid du Colombier 
3*da917039SDavid du Colombier #define uartputs vuartputs
4*da917039SDavid du Colombier #define uartgets vuartgets
5*da917039SDavid du Colombier #define uartputc vuartputc
6*da917039SDavid du Colombier 
7*da917039SDavid du Colombier static int useuart = 1;
8*da917039SDavid du Colombier 
9*da917039SDavid du Colombier int debug;
10*da917039SDavid du Colombier 
11*da917039SDavid du Colombier void
kbdinit(void)12*da917039SDavid du Colombier kbdinit(void)
13*da917039SDavid du Colombier {
14*da917039SDavid du Colombier }
15*da917039SDavid du Colombier 
16*da917039SDavid du Colombier void
consinit(char * name,char * speed)17*da917039SDavid du Colombier consinit(char* name, char* speed)
18*da917039SDavid du Colombier {
19*da917039SDavid du Colombier 	int port;
20*da917039SDavid du Colombier 
21*da917039SDavid du Colombier 	if(name == nil || cistrcmp(name, "cga") == 0)
22*da917039SDavid du Colombier 		return;
23*da917039SDavid du Colombier 	port = strtoul(name, 0, 0);
24*da917039SDavid du Colombier 	if(port < 0 || port > 1)
25*da917039SDavid du Colombier 		return;
26*da917039SDavid du Colombier 	USED(speed);
27*da917039SDavid du Colombier 
28*da917039SDavid du Colombier 	uartputs("\n", 1);
29*da917039SDavid du Colombier }
30*da917039SDavid du Colombier 
31*da917039SDavid du Colombier void
consdrain(void)32*da917039SDavid du Colombier consdrain(void)
33*da917039SDavid du Colombier {
34*da917039SDavid du Colombier //	if(useuart)
35*da917039SDavid du Colombier //		uartdrain();
36*da917039SDavid du Colombier }
37*da917039SDavid du Colombier 
38*da917039SDavid du Colombier static void
consputs(char * s,int n)39*da917039SDavid du Colombier consputs(char* s, int n)
40*da917039SDavid du Colombier {
41*da917039SDavid du Colombier 	if(useuart)
42*da917039SDavid du Colombier 		uartputs(s, n);
43*da917039SDavid du Colombier }
44*da917039SDavid du Colombier 
45*da917039SDavid du Colombier void
warp86(char * s,ulong)46*da917039SDavid du Colombier warp86(char* s, ulong)
47*da917039SDavid du Colombier {
48*da917039SDavid du Colombier 	if(s != nil)
49*da917039SDavid du Colombier 		print(s);
50*da917039SDavid du Colombier 	spllo();
51*da917039SDavid du Colombier 	consdrain();
52*da917039SDavid du Colombier 	print("Takes a licking and keeps on ticking...\n");
53*da917039SDavid du Colombier 	splhi();
54*da917039SDavid du Colombier 	for(;;)
55*da917039SDavid du Colombier 		;
56*da917039SDavid du Colombier }
57*da917039SDavid du Colombier 
58*da917039SDavid du Colombier static int
getline(char * buf,int size,int timeout)59*da917039SDavid du Colombier getline(char *buf, int size, int timeout)
60*da917039SDavid du Colombier {
61*da917039SDavid du Colombier 	int c, i=0;
62*da917039SDavid du Colombier //	ulong start;
63*da917039SDavid du Colombier 	char echo;
64*da917039SDavid du Colombier 
65*da917039SDavid du Colombier 	USED(timeout);
66*da917039SDavid du Colombier 	for (;;) {
67*da917039SDavid du Colombier //		start = m->ticks;
68*da917039SDavid du Colombier //		do{
69*da917039SDavid du Colombier //			/* timeout seconds to first char */
70*da917039SDavid du Colombier //			if(timeout && ((m->ticks - start) > timeout*HZ))
71*da917039SDavid du Colombier //				return -2;
72*da917039SDavid du Colombier //			c = consiq.getc(&consiq);
73*da917039SDavid du Colombier //		}while(c == -1);
74*da917039SDavid du Colombier 		c = vuartgetc();
75*da917039SDavid du Colombier //		timeout = 0;
76*da917039SDavid du Colombier 
77*da917039SDavid du Colombier 		if(c == '\r')
78*da917039SDavid du Colombier 			c = '\n'; 		/* turn carriage return into newline */
79*da917039SDavid du Colombier 		if(c == '\177')
80*da917039SDavid du Colombier 			c = '\010';		/* turn delete into backspace */
81*da917039SDavid du Colombier 		if(c == '\025')
82*da917039SDavid du Colombier 			echo = '\n';		/* echo ^U as a newline */
83*da917039SDavid du Colombier 		else
84*da917039SDavid du Colombier 			echo = c;
85*da917039SDavid du Colombier 		consputs(&echo, 1);
86*da917039SDavid du Colombier 
87*da917039SDavid du Colombier 		if(c == '\010'){
88*da917039SDavid du Colombier 			if(i > 0)
89*da917039SDavid du Colombier 				i--; /* bs deletes last character */
90*da917039SDavid du Colombier 			continue;
91*da917039SDavid du Colombier 		}
92*da917039SDavid du Colombier 		/* a newline ends a line */
93*da917039SDavid du Colombier 		if (c == '\n')
94*da917039SDavid du Colombier 			break;
95*da917039SDavid du Colombier 		/* ^U wipes out the line */
96*da917039SDavid du Colombier 		if (c =='\025')
97*da917039SDavid du Colombier 			return -1;
98*da917039SDavid du Colombier 		if(i == size)
99*da917039SDavid du Colombier 			return size;
100*da917039SDavid du Colombier 		buf[i++] = c;
101*da917039SDavid du Colombier 	}
102*da917039SDavid du Colombier 	buf[i] = 0;
103*da917039SDavid du Colombier 	return i;
104*da917039SDavid du Colombier }
105*da917039SDavid du Colombier 
106*da917039SDavid du Colombier int
getstr(char * prompt,char * buf,int size,char * def,int timeout)107*da917039SDavid du Colombier getstr(char *prompt, char *buf, int size, char *def, int timeout)
108*da917039SDavid du Colombier {
109*da917039SDavid du Colombier 	int len, isdefault;
110*da917039SDavid du Colombier 	char pbuf[PRINTSIZE];
111*da917039SDavid du Colombier 
112*da917039SDavid du Colombier 	buf[0] = 0;
113*da917039SDavid du Colombier 	isdefault = (def && *def);
114*da917039SDavid du Colombier 	if(isdefault == 0){
115*da917039SDavid du Colombier 		timeout = 0;
116*da917039SDavid du Colombier 		seprint(pbuf, pbuf + sizeof pbuf, "%s: ", prompt);
117*da917039SDavid du Colombier 	}
118*da917039SDavid du Colombier 	else if(timeout)
119*da917039SDavid du Colombier 		seprint(pbuf, pbuf + sizeof pbuf, "%s[default==%s (%ds timeout)]: ",
120*da917039SDavid du Colombier 			prompt, def, timeout);
121*da917039SDavid du Colombier 	else
122*da917039SDavid du Colombier 		seprint(pbuf, pbuf + sizeof pbuf, "%s[default==%s]: ",
123*da917039SDavid du Colombier 			prompt, def);
124*da917039SDavid du Colombier 	for (;;) {
125*da917039SDavid du Colombier 		print(pbuf);
126*da917039SDavid du Colombier 		consdrain();
127*da917039SDavid du Colombier 		len = getline(buf, size, timeout);
128*da917039SDavid du Colombier 		switch(len){
129*da917039SDavid du Colombier 		case 0:
130*da917039SDavid du Colombier 			/* RETURN */
131*da917039SDavid du Colombier 			if(isdefault)
132*da917039SDavid du Colombier 				break;
133*da917039SDavid du Colombier 			continue;
134*da917039SDavid du Colombier 		case -1:
135*da917039SDavid du Colombier 			/* ^U typed */
136*da917039SDavid du Colombier 			continue;
137*da917039SDavid du Colombier 		case -2:
138*da917039SDavid du Colombier 			/* timeout, use default */
139*da917039SDavid du Colombier 			consputs("\n", 1);
140*da917039SDavid du Colombier 			len = 0;
141*da917039SDavid du Colombier 			break;
142*da917039SDavid du Colombier 		default:
143*da917039SDavid du Colombier 			break;
144*da917039SDavid du Colombier 		}
145*da917039SDavid du Colombier 		if(len >= size){
146*da917039SDavid du Colombier 			print("line too long\n");
147*da917039SDavid du Colombier 			continue;
148*da917039SDavid du Colombier 		}
149*da917039SDavid du Colombier 		break;
150*da917039SDavid du Colombier 	}
151*da917039SDavid du Colombier 	if(len == 0 && isdefault)
152*da917039SDavid du Colombier 		strecpy(buf, buf + size, def);
153*da917039SDavid du Colombier 	return 0;
154*da917039SDavid du Colombier }
155*da917039SDavid du Colombier 
156*da917039SDavid du Colombier void
panic(char * fmt,...)157*da917039SDavid du Colombier panic(char *fmt, ...)
158*da917039SDavid du Colombier {
159*da917039SDavid du Colombier 	int n;
160*da917039SDavid du Colombier 	va_list arg;
161*da917039SDavid du Colombier 	char buf[PRINTSIZE];
162*da917039SDavid du Colombier 
163*da917039SDavid du Colombier 	strecpy(buf, buf + sizeof buf, "panic: ");
164*da917039SDavid du Colombier 	va_start(arg, fmt);
165*da917039SDavid du Colombier 	n = vseprint(buf+7, buf+sizeof(buf)-7, fmt, arg) - buf;
166*da917039SDavid du Colombier 	va_end(arg);
167*da917039SDavid du Colombier 	buf[n] = '\n';
168*da917039SDavid du Colombier 	consputs(buf, n+1);
169*da917039SDavid du Colombier 
170*da917039SDavid du Colombier 	if (securemem) {
171*da917039SDavid du Colombier 		n = qtmerrfmt(buf, sizeof buf);
172*da917039SDavid du Colombier 		consputs(buf, n+1);
173*da917039SDavid du Colombier 	}
174*da917039SDavid du Colombier 
175*da917039SDavid du Colombier //	splhi(); for(;;);
176*da917039SDavid du Colombier 	if(etherdetach)
177*da917039SDavid du Colombier 		etherdetach();
178*da917039SDavid du Colombier 
179*da917039SDavid du Colombier //	consputs("\nPress almost any key to reset...", 32);
180*da917039SDavid du Colombier 	spllo();
181*da917039SDavid du Colombier //	while(consiq.getc(&consiq) == -1)
182*da917039SDavid du Colombier //		;
183*da917039SDavid du Colombier 	vuartgetc();
184*da917039SDavid du Colombier 	warp86(nil, 0);
185*da917039SDavid du Colombier }
186