xref: /original-bsd/sys/i386/isa/pccons.c (revision 2dc74e6c)
1135d056fSwilliam /*-
2*2dc74e6cSbostic  * Copyright (c) 1990, 1993
3*2dc74e6cSbostic  *	The Regents of the University of California.  All rights reserved.
4135d056fSwilliam  *
5135d056fSwilliam  * This code is derived from software contributed to Berkeley by
69306be26Sbostic  * William Jolitz and Don Ahn.
739901661Swilliam  *
80034e9a1Swilliam  * %sccs.include.redist.c%
9107c2d6fSdonahn  *
10*2dc74e6cSbostic  *	@(#)pccons.c	8.1 (Berkeley) 06/11/93
11135d056fSwilliam  */
12135d056fSwilliam 
13135d056fSwilliam /*
1439901661Swilliam  * code to work keyboard & display for PC-style console
15135d056fSwilliam  */
16fb81e5fdSbostic #include <sys/param.h>
17fb81e5fdSbostic #include <sys/conf.h>
18fb81e5fdSbostic #include <sys/ioctl.h>
19fb81e5fdSbostic #include <sys/proc.h>
20fb81e5fdSbostic #include <sys/user.h>
21fb81e5fdSbostic #include <sys/tty.h>
22fb81e5fdSbostic #include <sys/uio.h>
23fb81e5fdSbostic #include <sys/callout.h>
24fb81e5fdSbostic #include <sys/systm.h>
25fb81e5fdSbostic #include <sys/kernel.h>
26fb81e5fdSbostic #include <sys/syslog.h>
27fb81e5fdSbostic 
28fb81e5fdSbostic #include <i386/isa/isa_device.h>
29fb81e5fdSbostic #include <i386/isa/icu.h>
30fb81e5fdSbostic #include <i386/i386/cons.h>
31135d056fSwilliam 
3239901661Swilliam struct	tty pccons;
33135d056fSwilliam 
3439901661Swilliam struct	pcconsoftc {
35135d056fSwilliam 	char	cs_flags;
36135d056fSwilliam #define	CSF_ACTIVE	0x1	/* timeout active */
37135d056fSwilliam #define	CSF_POLLING	0x2	/* polling for input */
38135d056fSwilliam 	char	cs_lastc;	/* last char sent */
39135d056fSwilliam 	int	cs_timo;	/* timeouts since interrupt */
40135d056fSwilliam 	u_long	cs_wedgecnt;	/* times restarted */
4139901661Swilliam } pcconsoftc;
42135d056fSwilliam 
4339901661Swilliam int pcprobe(), pcattach();
44107c2d6fSdonahn 
4539901661Swilliam struct	isa_driver pcdriver = {
4639901661Swilliam 	pcprobe, pcattach, "pc",
47107c2d6fSdonahn };
48107c2d6fSdonahn 
4985f5e7e3Sbill #define	COL		80
5085f5e7e3Sbill #define	ROW		25
5185f5e7e3Sbill #define	CHR		2
5285f5e7e3Sbill #define MONO_BASE	0x3B4
530034e9a1Swilliam #define MONO_BUF	0xfe0B0000
5485f5e7e3Sbill #define CGA_BASE	0x3D4
550034e9a1Swilliam #define CGA_BUF		0xfe0B8000
5685f5e7e3Sbill #define IOPHYSMEM	0xA0000
5785f5e7e3Sbill 
5885f5e7e3Sbill u_char	color = 0xe ;
5985f5e7e3Sbill static unsigned int addr_6845 = MONO_BASE;
6085f5e7e3Sbill u_short *Crtat = (u_short *)MONO_BUF;
610034e9a1Swilliam static openf;
62135d056fSwilliam 
6339901661Swilliam /*
6439901661Swilliam  * We check the console periodically to make sure
6539901661Swilliam  * that it hasn't wedged.  Unfortunately, if an XOFF
6639901661Swilliam  * is typed on the console, that can't be distinguished
6739901661Swilliam  * from more catastrophic failure.
6839901661Swilliam  */
6939901661Swilliam #define	CN_TIMERVAL	(hz)		/* frequency at which to check cons */
7039901661Swilliam #define	CN_TIMO		(2*60)		/* intervals to allow for output char */
7139901661Swilliam 
7239901661Swilliam int	pcstart();
7339901661Swilliam int	pcparam();
74135d056fSwilliam int	ttrstrt();
75135d056fSwilliam char	partab[];
7639901661Swilliam 
7739901661Swilliam /*
7839901661Swilliam  * Wait for CP to accept last CP command sent
7939901661Swilliam  * before setting up next command.
8039901661Swilliam  */
8139901661Swilliam #define	waitforlast(timo) { \
8239901661Swilliam 	if (pclast) { \
8339901661Swilliam 		(timo) = 10000; \
8439901661Swilliam 		do \
8539901661Swilliam 			uncache((char *)&pclast->cp_unit); \
8639901661Swilliam 		while ((pclast->cp_unit&CPTAKE) == 0 && --(timo)); \
8739901661Swilliam 	} \
8839901661Swilliam }
8939901661Swilliam 
90135d056fSwilliam u_char inb();
91135d056fSwilliam 
9239901661Swilliam pcprobe(dev)
9385f5e7e3Sbill struct isa_device *dev;
94107c2d6fSdonahn {
95107c2d6fSdonahn 	u_char c;
96107c2d6fSdonahn 	int again = 0;
97107c2d6fSdonahn 
98107c2d6fSdonahn 	/* Enable interrupts and keyboard controller */
99107c2d6fSdonahn 	while (inb(0x64)&2); outb(0x64,0x60);
100107c2d6fSdonahn 	while (inb(0x64)&2); outb(0x60,0x4D);
101107c2d6fSdonahn 
102107c2d6fSdonahn 	/* Start keyboard stuff RESET */
103107c2d6fSdonahn 	while (inb(0x64)&2);	/* wait input ready */
104107c2d6fSdonahn 	outb(0x60,0xFF);	/* RESET */
105107c2d6fSdonahn 	while((c=inb(0x60))!=0xFA) {
106107c2d6fSdonahn 		if ((c == 0xFE) ||  (c == 0xFF)) {
107107c2d6fSdonahn 			if(!again)printf("KEYBOARD disconnected: RECONNECT \n");
108107c2d6fSdonahn 			while (inb(0x64)&2);	/* wait input ready */
109107c2d6fSdonahn 			outb(0x60,0xFF);	/* RESET */
110107c2d6fSdonahn 			again = 1;
111107c2d6fSdonahn 		}
112107c2d6fSdonahn 	}
113107c2d6fSdonahn 	/* pick up keyboard reset return code */
1140034e9a1Swilliam 	while((c=inb(0x60))!=0xAA);
115107c2d6fSdonahn 	return 1;
116107c2d6fSdonahn }
117107c2d6fSdonahn 
11839901661Swilliam pcattach(dev)
11985f5e7e3Sbill struct isa_device *dev;
120107c2d6fSdonahn {
12185f5e7e3Sbill 	u_short *cp = Crtat + (CGA_BUF-MONO_BUF)/CHR;
12285f5e7e3Sbill 	u_short was;
12385f5e7e3Sbill 
12485f5e7e3Sbill 	/* Crtat initialized to point to MONO buffer   */
12585f5e7e3Sbill 	/* if not present change to CGA_BUF offset     */
12685f5e7e3Sbill 	/* ONLY ADD the difference since locore.s adds */
12785f5e7e3Sbill 	/* in the remapped offset at the right time    */
12885f5e7e3Sbill 
12985f5e7e3Sbill 	was = *Crtat;
13085f5e7e3Sbill 	*Crtat = (u_short) 0xA55A;
13185f5e7e3Sbill 	if (*Crtat != 0xA55A)
13285f5e7e3Sbill 		printf("<mono>");
13385f5e7e3Sbill 	else	printf("<color>");
13485f5e7e3Sbill 	*Crtat = was;
1350034e9a1Swilliam 	cursor();
136107c2d6fSdonahn }
137107c2d6fSdonahn 
138135d056fSwilliam /* ARGSUSED */
1390034e9a1Swilliam #ifdef __STDC__
pcopen(dev_t dev,int flag,int mode,struct proc * p)14039901661Swilliam pcopen(dev_t dev, int flag, int mode, struct proc *p)
1410034e9a1Swilliam #else
14239901661Swilliam pcopen(dev, flag, mode, p)
143135d056fSwilliam 	dev_t dev;
1440034e9a1Swilliam 	int flag, mode;
1450034e9a1Swilliam 	struct proc *p;
1460034e9a1Swilliam #endif
147135d056fSwilliam {
148135d056fSwilliam 	register struct tty *tp;
149135d056fSwilliam 
15039901661Swilliam 	tp = &pccons;
15139901661Swilliam 	tp->t_oproc = pcstart;
15239901661Swilliam 	tp->t_param = pcparam;
1530034e9a1Swilliam 	tp->t_dev = dev;
1540034e9a1Swilliam 	openf++;
155135d056fSwilliam 	if ((tp->t_state & TS_ISOPEN) == 0) {
1560034e9a1Swilliam 		tp->t_state |= TS_WOPEN;
157135d056fSwilliam 		ttychars(tp);
1580034e9a1Swilliam 		tp->t_iflag = TTYDEF_IFLAG;
1590034e9a1Swilliam 		tp->t_oflag = TTYDEF_OFLAG;
1600034e9a1Swilliam 		tp->t_cflag = TTYDEF_CFLAG;
1610034e9a1Swilliam 		tp->t_lflag = TTYDEF_LFLAG;
1620034e9a1Swilliam 		tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
16339901661Swilliam 		pcparam(tp, &tp->t_termios);
1640034e9a1Swilliam 		ttsetwater(tp);
1650034e9a1Swilliam 	} else if (tp->t_state&TS_XCLUDE && p->p_ucred->cr_uid != 0)
1660034e9a1Swilliam 		return (EBUSY);
1670034e9a1Swilliam 	tp->t_state |= TS_CARR_ON;
168135d056fSwilliam 	return ((*linesw[tp->t_line].l_open)(dev, tp));
169135d056fSwilliam }
170135d056fSwilliam 
pcclose(dev,flag,mode,p)17193a48359Smarc pcclose(dev, flag, mode, p)
172135d056fSwilliam 	dev_t dev;
17393a48359Smarc 	int flag, mode;
17493a48359Smarc 	struct proc *p;
175135d056fSwilliam {
17693a48359Smarc 	(*linesw[pccons.t_line].l_close)(&pccons, flag);
17739901661Swilliam 	ttyclose(&pccons);
1780034e9a1Swilliam 	return(0);
179135d056fSwilliam }
180135d056fSwilliam 
181135d056fSwilliam /*ARGSUSED*/
pcread(dev,uio,flag)18239901661Swilliam pcread(dev, uio, flag)
183135d056fSwilliam 	dev_t dev;
184135d056fSwilliam 	struct uio *uio;
185135d056fSwilliam {
18639901661Swilliam 	return ((*linesw[pccons.t_line].l_read)(&pccons, uio, flag));
187135d056fSwilliam }
188135d056fSwilliam 
189135d056fSwilliam /*ARGSUSED*/
pcwrite(dev,uio,flag)19039901661Swilliam pcwrite(dev, uio, flag)
191135d056fSwilliam 	dev_t dev;
192135d056fSwilliam 	struct uio *uio;
193135d056fSwilliam {
19439901661Swilliam 	return ((*linesw[pccons.t_line].l_write)(&pccons, uio, flag));
195135d056fSwilliam }
196135d056fSwilliam 
197135d056fSwilliam /*
198135d056fSwilliam  * Got a console receive interrupt -
199135d056fSwilliam  * the console processor wants to give us a character.
200135d056fSwilliam  * Catch the character, and see who it goes to.
201135d056fSwilliam  */
pcrint(dev,irq,cpl)20239901661Swilliam pcrint(dev, irq, cpl)
203135d056fSwilliam 	dev_t dev;
204135d056fSwilliam {
205135d056fSwilliam 	int c;
206135d056fSwilliam 
207135d056fSwilliam 	c = sgetc(1);
208135d056fSwilliam 	if (c&0x100) return;
20939901661Swilliam 	if (pcconsoftc.cs_flags&CSF_POLLING)
210135d056fSwilliam 		return;
211135d056fSwilliam #ifdef KDB
21239901661Swilliam 	if (kdbrintr(c, &pccons))
213135d056fSwilliam 		return;
214135d056fSwilliam #endif
215803e8ce4Sbostic 	if (openf) /* 386bsd */
21639901661Swilliam 		(*linesw[pccons.t_line].l_rint)(c&0xff, &pccons);
217135d056fSwilliam }
218135d056fSwilliam 
pcioctl(dev,cmd,data,flag,p)219d3080caaSsklower pcioctl(dev, cmd, data, flag, p)
220135d056fSwilliam 	dev_t dev;
221d3080caaSsklower 	int cmd, flag;
2220034e9a1Swilliam 	caddr_t data;
223d3080caaSsklower 	struct proc *p;
224135d056fSwilliam {
22539901661Swilliam 	register struct tty *tp = &pccons;
226135d056fSwilliam 	register error;
227135d056fSwilliam 
228d3080caaSsklower 	error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, p);
229135d056fSwilliam 	if (error >= 0)
230135d056fSwilliam 		return (error);
2310034e9a1Swilliam 	error = ttioctl(tp, cmd, data, flag);
2320034e9a1Swilliam 	if (error >= 0)
2330034e9a1Swilliam 		return (error);
2340034e9a1Swilliam 	return (ENOTTY);
235135d056fSwilliam }
236135d056fSwilliam 
23739901661Swilliam int	pcconsintr = 1;
238135d056fSwilliam /*
239135d056fSwilliam  * Got a console transmission interrupt -
240135d056fSwilliam  * the console processor wants another character.
241135d056fSwilliam  */
pcxint(dev)24239901661Swilliam pcxint(dev)
243135d056fSwilliam 	dev_t dev;
244135d056fSwilliam {
245135d056fSwilliam 	register struct tty *tp;
246135d056fSwilliam 	register int unit;
247135d056fSwilliam 
24839901661Swilliam 	if (!pcconsintr)
249135d056fSwilliam 		return;
25039901661Swilliam 	pccons.t_state &= ~TS_BUSY;
25139901661Swilliam 	pcconsoftc.cs_timo = 0;
25239901661Swilliam 	if (pccons.t_line)
25339901661Swilliam 		(*linesw[pccons.t_line].l_start)(&pccons);
254135d056fSwilliam 	else
25539901661Swilliam 		pcstart(&pccons);
256135d056fSwilliam }
257135d056fSwilliam 
pcstart(tp)25839901661Swilliam pcstart(tp)
259135d056fSwilliam 	register struct tty *tp;
260135d056fSwilliam {
261135d056fSwilliam 	register c, s;
262135d056fSwilliam 
263135d056fSwilliam 	s = spltty();
264135d056fSwilliam 	if (tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP))
265135d056fSwilliam 		goto out;
2660034e9a1Swilliam 	do {
2670034e9a1Swilliam 		if (tp->t_outq.c_cc <= tp->t_lowat) {
268135d056fSwilliam 			if (tp->t_state&TS_ASLEEP) {
269135d056fSwilliam 				tp->t_state &= ~TS_ASLEEP;
270135d056fSwilliam 				wakeup((caddr_t)&tp->t_outq);
271135d056fSwilliam 			}
272598c5826Storek 			selwakeup(&tp->t_wsel);
273135d056fSwilliam 		}
2740034e9a1Swilliam 		if (tp->t_outq.c_cc == 0)
2750034e9a1Swilliam 			goto out;
2760034e9a1Swilliam 		c = getc(&tp->t_outq);
277107c2d6fSdonahn 		splx(s);
278107c2d6fSdonahn 		sput(c, 0x7);
279107c2d6fSdonahn 		s = spltty();
2800034e9a1Swilliam 	} while(1);
281135d056fSwilliam out:
282135d056fSwilliam 	splx(s);
283135d056fSwilliam }
284135d056fSwilliam 
28539901661Swilliam pccnprobe(cp)
28639901661Swilliam 	struct consdev *cp;
28739901661Swilliam {
28839901661Swilliam 	int maj;
28939901661Swilliam 	extern int pcopen();
29039901661Swilliam 
29139901661Swilliam 	/* locate the major number */
29239901661Swilliam 	for (maj = 0; maj < nchrdev; maj++)
29339901661Swilliam 		if (cdevsw[maj].d_open == pcopen)
29439901661Swilliam 			break;
29539901661Swilliam 
29639901661Swilliam 	/* initialize required fields */
29739901661Swilliam 	cp->cn_dev = makedev(maj, 0);
29839901661Swilliam 	cp->cn_tp = &pccons;
29939901661Swilliam 	cp->cn_pri = CN_INTERNAL;
30039901661Swilliam }
30139901661Swilliam 
30239901661Swilliam /* ARGSUSED */
30339901661Swilliam pccninit(cp)
30439901661Swilliam 	struct consdev *cp;
30539901661Swilliam {
30639901661Swilliam 	/*
30739901661Swilliam 	 * For now, don't screw with it.
30839901661Swilliam 	 */
30939901661Swilliam 	/* crtat = 0; */
31039901661Swilliam }
31139901661Swilliam 
3120034e9a1Swilliam static __color;
3130034e9a1Swilliam 
31439901661Swilliam /* ARGSUSED */
pccnputc(dev,c)31539901661Swilliam pccnputc(dev, c)
31639901661Swilliam 	dev_t dev;
317135d056fSwilliam 	char c;
31839901661Swilliam {
31939901661Swilliam 	int clr = __color;
32039901661Swilliam 
32139901661Swilliam 	if (clr == 0)
32239901661Swilliam 		clr = 0x30;
32339901661Swilliam 	else
32439901661Swilliam 		clr |= 0x60;
325135d056fSwilliam 	if (c == '\n')
3260034e9a1Swilliam 		sput('\r', clr);
3270034e9a1Swilliam 	sput(c, clr);
328135d056fSwilliam }
329135d056fSwilliam 
330135d056fSwilliam /*
331135d056fSwilliam  * Print a character on console.
332135d056fSwilliam  */
pcputchar(c,tp)33339901661Swilliam pcputchar(c, tp)
334135d056fSwilliam 	char c;
335135d056fSwilliam 	register struct tty *tp;
336135d056fSwilliam {
337107c2d6fSdonahn 	sput(c,0x2);
338135d056fSwilliam 	if (c=='\n') getchar();
339135d056fSwilliam }
340135d056fSwilliam 
341135d056fSwilliam 
34239901661Swilliam /* ARGSUSED */
pccngetc(dev)34339901661Swilliam pccngetc(dev)
34439901661Swilliam 	dev_t dev;
345135d056fSwilliam {
346135d056fSwilliam 	register int c, s;
347135d056fSwilliam 
34839901661Swilliam 	s = spltty();		/* block pcrint while we poll */
349107c2d6fSdonahn 	c = sgetc(0);
350107c2d6fSdonahn 	if (c == '\r') c = '\n';
351135d056fSwilliam 	splx(s);
352135d056fSwilliam 	return (c);
353135d056fSwilliam }
354135d056fSwilliam 
pcgetchar(tp)35539901661Swilliam pcgetchar(tp)
356135d056fSwilliam 	register struct tty *tp;
357135d056fSwilliam {
358135d056fSwilliam 	int c;
359135d056fSwilliam 
360135d056fSwilliam 	c = sgetc(0);
361135d056fSwilliam 	return (c&0xff);
362135d056fSwilliam }
363135d056fSwilliam 
364135d056fSwilliam /*
365135d056fSwilliam  * Set line parameters
366135d056fSwilliam  */
pcparam(tp,t)36739901661Swilliam pcparam(tp, t)
368135d056fSwilliam 	register struct tty *tp;
3690034e9a1Swilliam 	register struct termios *t;
370135d056fSwilliam {
3710034e9a1Swilliam 	register int cflag = t->c_cflag;
3720034e9a1Swilliam         /* and copy to tty */
3730034e9a1Swilliam         tp->t_ispeed = t->c_ispeed;
3740034e9a1Swilliam         tp->t_ospeed = t->c_ospeed;
3750034e9a1Swilliam         tp->t_cflag = cflag;
3760034e9a1Swilliam 
3770034e9a1Swilliam 	return(0);
378135d056fSwilliam }
379135d056fSwilliam 
380135d056fSwilliam #ifdef KDB
381135d056fSwilliam /*
382135d056fSwilliam  * Turn input polling on/off (used by debugger).
383135d056fSwilliam  */
pcpoll(onoff)38439901661Swilliam pcpoll(onoff)
385135d056fSwilliam 	int onoff;
386135d056fSwilliam {
387135d056fSwilliam }
388135d056fSwilliam #endif
389135d056fSwilliam 
390107c2d6fSdonahn extern int hz;
391107c2d6fSdonahn 
3920034e9a1Swilliam static beeping;
sysbeepstop()393107c2d6fSdonahn sysbeepstop()
394107c2d6fSdonahn {
395107c2d6fSdonahn 	/* disable counter 2 */
396107c2d6fSdonahn 	outb(0x61,inb(0x61)&0xFC);
3970034e9a1Swilliam 	beeping = 0;
398107c2d6fSdonahn }
399107c2d6fSdonahn 
sysbeep()400107c2d6fSdonahn sysbeep()
401107c2d6fSdonahn {
4020034e9a1Swilliam 
403107c2d6fSdonahn 	/* enable counter 2 */
404107c2d6fSdonahn 	outb(0x61,inb(0x61)|3);
405107c2d6fSdonahn 	/* set command for counter 2, 2 byte write */
406107c2d6fSdonahn 	outb(0x43,0xB6);
407107c2d6fSdonahn 	/* send 0x637 for 750 HZ */
408107c2d6fSdonahn 	outb(0x42,0x37);
409107c2d6fSdonahn 	outb(0x42,0x06);
4100034e9a1Swilliam 	if(!beeping)timeout(sysbeepstop,0,hz/4);
4110034e9a1Swilliam 	beeping = 1;
412107c2d6fSdonahn }
413107c2d6fSdonahn 
414107c2d6fSdonahn /* cursor() sets an offset (0-1999) into the 80x25 text area    */
415135d056fSwilliam 
41685f5e7e3Sbill static u_short *crtat = 0;
41785f5e7e3Sbill char bg_at = 0x0f;
41885f5e7e3Sbill char so_at = 0x70;
41985f5e7e3Sbill 
cursor()42085f5e7e3Sbill cursor()
42185f5e7e3Sbill { 	int pos = crtat - Crtat;
42285f5e7e3Sbill 
423107c2d6fSdonahn 	outb(addr_6845,14);
424107c2d6fSdonahn 	outb(addr_6845+1,pos >> 8);
425107c2d6fSdonahn 	outb(addr_6845,15);
426107c2d6fSdonahn 	outb(addr_6845+1,pos&0xff);
4270034e9a1Swilliam 	timeout(cursor,0,hz/10);
428135d056fSwilliam }
429107c2d6fSdonahn 
4300034e9a1Swilliam u_char shfts, ctls, alts, caps, num, stp, scroll;
4310034e9a1Swilliam 
4320034e9a1Swilliam /*
4330034e9a1Swilliam  * Compensate for abysmally stupid frame buffer aribitration with macro
4340034e9a1Swilliam  */
4350034e9a1Swilliam #define	wrtchar(c) { do *crtat = (c); while ((c) != *crtat); crtat++; row++; }
4360034e9a1Swilliam 
437107c2d6fSdonahn /* sput has support for emulation of the 'ibmpc' termcap entry. */
438107c2d6fSdonahn /* This is a bare-bones implementation of a bare-bones entry    */
439107c2d6fSdonahn /* One modification: Change li#24 to li#25 to reflect 25 lines  */
440107c2d6fSdonahn 
sput(c,ca)441107c2d6fSdonahn sput(c, ca)
442107c2d6fSdonahn u_char c, ca;
443107c2d6fSdonahn {
444107c2d6fSdonahn 
445107c2d6fSdonahn 	static int esc,ebrac,eparm,cx,cy,row,so;
446107c2d6fSdonahn 
447107c2d6fSdonahn 	if (crtat == 0) {
44885f5e7e3Sbill 		u_short *cp = Crtat + (CGA_BUF-MONO_BUF)/CHR, was;
44985f5e7e3Sbill 		unsigned cursorat;
450107c2d6fSdonahn 
451107c2d6fSdonahn 		/* Crtat initialized to point to MONO buffer   */
452107c2d6fSdonahn 		/* if not present change to CGA_BUF offset     */
453107c2d6fSdonahn 		/* ONLY ADD the difference since locore.s adds */
454107c2d6fSdonahn 		/* in the remapped offset at the right time    */
455107c2d6fSdonahn 
45685f5e7e3Sbill 		was = *cp;
45785f5e7e3Sbill 		*cp = (u_short) 0xA55A;
45885f5e7e3Sbill 		if (*cp != 0xA55A) {
45985f5e7e3Sbill 			addr_6845 = MONO_BASE;
46085f5e7e3Sbill 		} else {
46185f5e7e3Sbill 			*cp = was;
462107c2d6fSdonahn 			addr_6845 = CGA_BASE;
46385f5e7e3Sbill 			Crtat = Crtat + (CGA_BUF-MONO_BUF)/CHR;
46485f5e7e3Sbill 		}
46585f5e7e3Sbill 		/* Extract cursor location */
46685f5e7e3Sbill 		outb(addr_6845,14);
46785f5e7e3Sbill 		cursorat = inb(addr_6845+1)<<8 ;
46885f5e7e3Sbill 		outb(addr_6845,15);
46985f5e7e3Sbill 		cursorat |= inb(addr_6845+1);
47085f5e7e3Sbill 
47185f5e7e3Sbill 		crtat = Crtat + cursorat;
47285f5e7e3Sbill 		fillw((bg_at<<8)|' ', crtat, COL*ROW-cursorat);
473135d056fSwilliam 	}
474135d056fSwilliam 	switch(c) {
475107c2d6fSdonahn 	case 0x1B:
476107c2d6fSdonahn 		esc = 1; ebrac = 0; eparm = 0;
477107c2d6fSdonahn 		break;
478135d056fSwilliam 
479135d056fSwilliam 	case '\t':
480135d056fSwilliam 		do {
4810034e9a1Swilliam 			wrtchar((ca<<8)| ' ');
482135d056fSwilliam 		} while (row % 8);
483135d056fSwilliam 		break;
484135d056fSwilliam 
485135d056fSwilliam 	case '\010':
486135d056fSwilliam 		crtat--; row--;
487107c2d6fSdonahn 		if (row < 0) row += COL;  /* non-destructive backspace */
488135d056fSwilliam 		break;
489135d056fSwilliam 
490135d056fSwilliam 	case '\r':
491107c2d6fSdonahn 		crtat -= row ; row = 0;
492135d056fSwilliam 		break;
493135d056fSwilliam 
494135d056fSwilliam 	case '\n':
495135d056fSwilliam 		crtat += COL ;
496135d056fSwilliam 		break;
497135d056fSwilliam 
498135d056fSwilliam 	default:
499107c2d6fSdonahn 		if (esc) {
500107c2d6fSdonahn 			if (ebrac) {
501107c2d6fSdonahn 				switch(c) {
502107c2d6fSdonahn 				case 'm': /* no support for standout */
503107c2d6fSdonahn 					if (!cx) so = 0;
504107c2d6fSdonahn 					else so = 1;
505107c2d6fSdonahn 					esc = 0; ebrac = 0; eparm = 0;
506107c2d6fSdonahn 					break;
507107c2d6fSdonahn 				case 'A': /* back one row */
508135d056fSwilliam 					crtat -= COL;
509107c2d6fSdonahn 					esc = 0; ebrac = 0; eparm = 0;
510107c2d6fSdonahn 					break;
511107c2d6fSdonahn 				case 'B': /* down one row */
512135d056fSwilliam 					crtat += COL;
513107c2d6fSdonahn 					esc = 0; ebrac = 0; eparm = 0;
514107c2d6fSdonahn 					break;
515107c2d6fSdonahn 				case 'C': /* right cursor */
516107c2d6fSdonahn 					crtat++; row++;
517107c2d6fSdonahn 					esc = 0; ebrac = 0; eparm = 0;
518107c2d6fSdonahn 					break;
519107c2d6fSdonahn 				case 'J': /* Clear to end of display */
52085f5e7e3Sbill 					fillw((bg_at<<8)+' ', crtat,
52185f5e7e3Sbill 						Crtat+COL*ROW-crtat);
522107c2d6fSdonahn 					esc = 0; ebrac = 0; eparm = 0;
523107c2d6fSdonahn 					break;
524107c2d6fSdonahn 				case 'K': /* Clear to EOL */
5250034e9a1Swilliam 					fillw((bg_at<<8)+' ', crtat,
5260034e9a1Swilliam 						COL-(crtat-Crtat)%COL);
527107c2d6fSdonahn 					esc = 0; ebrac = 0; eparm = 0;
528107c2d6fSdonahn 					break;
529107c2d6fSdonahn 				case 'H': /* Cursor move */
530107c2d6fSdonahn 					if ((!cx)||(!cy)) {
531107c2d6fSdonahn 						crtat = Crtat;
532107c2d6fSdonahn 						row = 0;
533107c2d6fSdonahn 					} else {
534107c2d6fSdonahn 						crtat = Crtat+(cx-1)*COL+cy-1;
535107c2d6fSdonahn 						row = cy-1;
536135d056fSwilliam 					}
537107c2d6fSdonahn 					esc = 0; ebrac = 0; eparm = 0;
538107c2d6fSdonahn 					break;
539107c2d6fSdonahn 				case ';': /* Switch params in cursor def */
540107c2d6fSdonahn 					eparm = 1;
541107c2d6fSdonahn 					return;
542107c2d6fSdonahn 				default: /* Only numbers valid here */
543107c2d6fSdonahn 					if ((c >= '0')&&(c <= '9')) {
544107c2d6fSdonahn 						if (eparm) {
545107c2d6fSdonahn 							cy *= 10;
546107c2d6fSdonahn 							cy += c - '0';
547107c2d6fSdonahn 						} else {
548107c2d6fSdonahn 							cx *= 10;
549107c2d6fSdonahn 							cx += c - '0';
550107c2d6fSdonahn 						}
551107c2d6fSdonahn 					} else {
552107c2d6fSdonahn 						esc = 0; ebrac = 0; eparm = 0;
553107c2d6fSdonahn 					}
554107c2d6fSdonahn 					return;
555107c2d6fSdonahn 				}
556107c2d6fSdonahn 				break;
557107c2d6fSdonahn 			} else if (c == 'c') { /* Clear screen & home */
55885f5e7e3Sbill 				fillw((bg_at<<8)+' ', Crtat,COL*ROW);
559107c2d6fSdonahn 				crtat = Crtat; row = 0;
560107c2d6fSdonahn 				esc = 0; ebrac = 0; eparm = 0;
561107c2d6fSdonahn 			} else if (c == '[') { /* Start ESC [ sequence */
562107c2d6fSdonahn 				ebrac = 1; cx = 0; cy = 0; eparm = 0;
563107c2d6fSdonahn 			} else { /* Invalid, clear state */
564107c2d6fSdonahn 				 esc = 0; ebrac = 0; eparm = 0;
565107c2d6fSdonahn 			}
566107c2d6fSdonahn 		} else {
5670034e9a1Swilliam 			if (c == 7)
568107c2d6fSdonahn 				sysbeep();
569107c2d6fSdonahn 			/* Print only printables */
57085f5e7e3Sbill 			else /*if (c >= ' ') */ {
571107c2d6fSdonahn 				if (so) {
5720034e9a1Swilliam 					wrtchar((so_at<<8)| c);
573107c2d6fSdonahn 				} else {
5740034e9a1Swilliam 					wrtchar((ca<<8)| c);
575107c2d6fSdonahn 				}
576107c2d6fSdonahn 				if (row >= COL) row = 0;
577135d056fSwilliam 				break ;
578135d056fSwilliam 			}
579135d056fSwilliam 		}
580107c2d6fSdonahn 	}
581107c2d6fSdonahn 	if (crtat >= Crtat+COL*(ROW)) { /* scroll check */
5820034e9a1Swilliam 		if (openf) do sgetc(1); while (scroll);
583107c2d6fSdonahn 		bcopy(Crtat+COL,Crtat,COL*(ROW-1)*CHR);
58485f5e7e3Sbill 		fillw ((bg_at<<8) + ' ', Crtat+COL*(ROW-1),COL) ;
585107c2d6fSdonahn 		crtat -= COL ;
586107c2d6fSdonahn 	}
587107c2d6fSdonahn }
588107c2d6fSdonahn 
589135d056fSwilliam #define	L		0x0001	/* locking function */
590135d056fSwilliam #define	SHF		0x0002	/* keyboard shift */
591135d056fSwilliam #define	ALT		0x0004	/* alternate shift -- alternate chars */
592135d056fSwilliam #define	NUM		0x0008	/* numeric shift  cursors vs. numeric */
593135d056fSwilliam #define	CTL		0x0010	/* control shift  -- allows ctl function */
594135d056fSwilliam #define	CPS		0x0020	/* caps shift -- swaps case of letter */
595135d056fSwilliam #define	ASCII		0x0040	/* ascii code for this key */
596135d056fSwilliam #define	STP		0x0080	/* stop output */
597135d056fSwilliam #define	FUNC		0x0100	/* function key */
598107c2d6fSdonahn #define	SCROLL		0x0200	/* scroll lock key */
599135d056fSwilliam 
600bf9b00cfSwilliam unsigned	__debug = 0; /*0xffe */;
601135d056fSwilliam u_short action[] = {
602135d056fSwilliam 0,     ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII,		/* scan  0- 7 */
603135d056fSwilliam ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII,		/* scan  8-15 */
604135d056fSwilliam ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII,		/* scan 16-23 */
605135d056fSwilliam ASCII, ASCII, ASCII, ASCII, ASCII,   CTL, ASCII, ASCII,		/* scan 24-31 */
606135d056fSwilliam ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII,		/* scan 32-39 */
607135d056fSwilliam ASCII, ASCII, SHF  , ASCII, ASCII, ASCII, ASCII, ASCII,		/* scan 40-47 */
608135d056fSwilliam ASCII, ASCII, ASCII, ASCII, ASCII, ASCII,  SHF,  ASCII,		/* scan 48-55 */
609107c2d6fSdonahn   ALT, ASCII, CPS  , FUNC , FUNC , FUNC , FUNC , FUNC ,		/* scan 56-63 */
6100034e9a1Swilliam FUNC , FUNC , FUNC , FUNC , FUNC , NUM, SCROLL, ASCII,		/* scan 64-71 */
611135d056fSwilliam ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII,		/* scan 72-79 */
612135d056fSwilliam ASCII, ASCII, ASCII, ASCII,     0,     0,     0,     0,		/* scan 80-87 */
613135d056fSwilliam 0,0,0,0,0,0,0,0,
614135d056fSwilliam 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
615135d056fSwilliam 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,	} ;
616135d056fSwilliam 
617135d056fSwilliam u_char unshift[] = {	/* no shift */
618135d056fSwilliam 0,     033  , '1'  , '2'  , '3'  , '4'  , '5'  , '6'  ,		/* scan  0- 7 */
619135d056fSwilliam '7'  , '8'  , '9'  , '0'  , '-'  , '='  , 0177 ,'\t'  ,		/* scan  8-15 */
620135d056fSwilliam 
621135d056fSwilliam 'q'  , 'w'  , 'e'  , 'r'  , 't'  , 'y'  , 'u'  , 'i'  ,		/* scan 16-23 */
622135d056fSwilliam 'o'  , 'p'  , '['  , ']'  , '\r' , CTL  , 'a'  , 's'  ,		/* scan 24-31 */
623135d056fSwilliam 
624135d056fSwilliam 'd'  , 'f'  , 'g'  , 'h'  , 'j'  , 'k'  , 'l'  , ';'  ,		/* scan 32-39 */
625135d056fSwilliam '\'' , '`'  , SHF  , '\\' , 'z'  , 'x'  , 'c'  , 'v'  ,		/* scan 40-47 */
626135d056fSwilliam 
627135d056fSwilliam 'b'  , 'n'  , 'm'  , ','  , '.'  , '/'  , SHF  ,   '*',		/* scan 48-55 */
628107c2d6fSdonahn ALT  , ' '  , CPS,     1,     2,    3 ,     4,     5,		/* scan 56-63 */
629135d056fSwilliam 
630107c2d6fSdonahn     6,     7,     8,     9,    10, NUM, STP,   '7',		/* scan 64-71 */
631135d056fSwilliam   '8',   '9',   '-',   '4',   '5',   '6',   '+',   '1',		/* scan 72-79 */
632135d056fSwilliam 
633135d056fSwilliam   '2',   '3',   '0',   '.',     0,     0,     0,     0,		/* scan 80-87 */
634135d056fSwilliam 0,0,0,0,0,0,0,0,
635135d056fSwilliam 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
636135d056fSwilliam 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,	} ;
637135d056fSwilliam 
638135d056fSwilliam u_char shift[] = {	/* shift shift */
639135d056fSwilliam 0,     033  , '!'  , '@'  , '#'  , '$'  , '%'  , '^'  ,		/* scan  0- 7 */
640135d056fSwilliam '&'  , '*'  , '('  , ')'  , '_'  , '+'  , 0177 ,'\t'  ,		/* scan  8-15 */
641135d056fSwilliam 'Q'  , 'W'  , 'E'  , 'R'  , 'T'  , 'Y'  , 'U'  , 'I'  ,		/* scan 16-23 */
642135d056fSwilliam 'O'  , 'P'  , '{'  , '}'  , '\r' , CTL  , 'A'  , 'S'  ,		/* scan 24-31 */
643135d056fSwilliam 'D'  , 'F'  , 'G'  , 'H'  , 'J'  , 'K'  , 'L'  , ':'  ,		/* scan 32-39 */
644135d056fSwilliam '"'  , '~'  , SHF  , '|'  , 'Z'  , 'X'  , 'C'  , 'V'  ,		/* scan 40-47 */
645135d056fSwilliam 'B'  , 'N'  , 'M'  , '<'  , '>'  , '?'  , SHF  ,   '*',		/* scan 48-55 */
646107c2d6fSdonahn ALT  , ' '  , CPS,     0,     0, ' '  ,     0,     0,		/* scan 56-63 */
647107c2d6fSdonahn     0,     0,     0,     0,     0, NUM, STP,   '7',		/* scan 64-71 */
648135d056fSwilliam   '8',   '9',   '-',   '4',   '5',   '6',   '+',   '1',		/* scan 72-79 */
649135d056fSwilliam   '2',   '3',   '0',   '.',     0,     0,     0,     0,		/* scan 80-87 */
650135d056fSwilliam 0,0,0,0,0,0,0,0,
651135d056fSwilliam 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
652135d056fSwilliam 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,	} ;
653135d056fSwilliam 
654135d056fSwilliam u_char ctl[] = {	/* CTL shift */
655135d056fSwilliam 0,     033  , '!'  , 000  , '#'  , '$'  , '%'  , 036  ,		/* scan  0- 7 */
656135d056fSwilliam '&'  , '*'  , '('  , ')'  , 037  , '+'  , 034  ,'\177',		/* scan  8-15 */
657135d056fSwilliam 021  , 027  , 005  , 022  , 024  , 031  , 025  , 011  ,		/* scan 16-23 */
658135d056fSwilliam 017  , 020  , 033  , 035  , '\r' , CTL  , 001  , 023  ,		/* scan 24-31 */
659135d056fSwilliam 004  , 006  , 007  , 010  , 012  , 013  , 014  , ';'  ,		/* scan 32-39 */
660135d056fSwilliam '\'' , '`'  , SHF  , 034  , 032  , 030  , 003  , 026  ,		/* scan 40-47 */
661135d056fSwilliam 002  , 016  , 015  , '<'  , '>'  , '?'  , SHF  ,   '*',		/* scan 48-55 */
662107c2d6fSdonahn ALT  , ' '  , CPS,     0,     0, ' '  ,     0,     0,		/* scan 56-63 */
663107c2d6fSdonahn CPS,     0,     0,     0,     0,     0,     0,     0,		/* scan 64-71 */
664135d056fSwilliam     0,     0,     0,     0,     0,     0,     0,     0,		/* scan 72-79 */
665135d056fSwilliam     0,     0,     0,     0,     0,     0,     0,     0,		/* scan 80-87 */
666107c2d6fSdonahn     0,     0,   033, '7'  , '4'  , '1'  ,     0, NUM,		/* scan 88-95 */
667107c2d6fSdonahn '8'  , '5'  , '2'  ,     0, STP, '9'  , '6'  , '3'  ,		/*scan  96-103*/
668135d056fSwilliam '.'  ,     0, '*'  , '-'  , '+'  ,     0,     0,     0,		/*scan 104-111*/
669135d056fSwilliam 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,	} ;
670135d056fSwilliam 
671135d056fSwilliam #ifdef notdef
672135d056fSwilliam struct key {
673135d056fSwilliam 	u_short action;		/* how this key functions */
674135d056fSwilliam 	char	ascii[8];	/* ascii result character indexed by shifts */
675135d056fSwilliam };
676135d056fSwilliam #endif
677135d056fSwilliam 
678135d056fSwilliam 
679107c2d6fSdonahn #define	KBSTAT		0x64	/* kbd status port */
680135d056fSwilliam #define	KBS_INP_BUF_FUL	0x02	/* kbd char ready */
681107c2d6fSdonahn #define	KBDATA		0x60	/* kbd data port */
682135d056fSwilliam #define	KBSTATUSPORT	0x61	/* kbd status */
683135d056fSwilliam 
update_led()684107c2d6fSdonahn update_led()
685107c2d6fSdonahn {
686107c2d6fSdonahn 	while (inb(0x64)&2);	/* wait input ready */
687107c2d6fSdonahn 	outb(0x60,0xED);	/* LED Command */
688107c2d6fSdonahn 	while (inb(0x64)&2);	/* wait input ready */
689107c2d6fSdonahn 	outb(0x60,scroll | 2*num | 4*caps);
690107c2d6fSdonahn }
691135d056fSwilliam 
reset_cpu()69285f5e7e3Sbill reset_cpu() {
69385f5e7e3Sbill 	while(1) {
69485f5e7e3Sbill 		while (inb(0x64)&2);	/* wait input ready */
69585f5e7e3Sbill 		outb(0x64,0xFE);	/* Reset Command */
69685f5e7e3Sbill 		DELAY(4000000);
69785f5e7e3Sbill 		while (inb(0x64)&2);	/* wait input ready */
69885f5e7e3Sbill 		outb(0x64,0xFF);	/* Keyboard Reset Command */
69985f5e7e3Sbill 	}
70085f5e7e3Sbill 	/* NOTREACHED */
70185f5e7e3Sbill }
70285f5e7e3Sbill 
703107c2d6fSdonahn /*
704107c2d6fSdonahn sgetc(noblock) : get a character from the keyboard. If noblock = 0 wait until
705107c2d6fSdonahn a key is gotten.  Otherwise return a 0x100 (256).
706107c2d6fSdonahn */
sgetc(noblock)707107c2d6fSdonahn int sgetc(noblock)
708107c2d6fSdonahn {
709107c2d6fSdonahn 	u_char dt; unsigned key;
710135d056fSwilliam loop:
711107c2d6fSdonahn 	/* First see if there is something in the keyboard port */
712107c2d6fSdonahn 	if (inb(KBSTAT)&1) dt = inb(KBDATA);
713107c2d6fSdonahn 	else { if (noblock) return (0x100); else goto loop; }
714135d056fSwilliam 
715107c2d6fSdonahn 	/* Check for cntl-alt-del */
716107c2d6fSdonahn 	if ((dt == 83)&&ctls&&alts) _exit();
717135d056fSwilliam 
718107c2d6fSdonahn 	/* Check for make/break */
719107c2d6fSdonahn 	if (dt & 0x80) {
720107c2d6fSdonahn 		/* break */
721107c2d6fSdonahn 		dt = dt & 0x7f ;
722107c2d6fSdonahn 		switch (action[dt]) {
723107c2d6fSdonahn 		case SHF: shfts = 0; break;
724107c2d6fSdonahn 		case ALT: alts = 0; break;
725107c2d6fSdonahn 		case CTL: ctls = 0; break;
726107c2d6fSdonahn 		case FUNC:
727107c2d6fSdonahn 			/* Toggle debug flags */
728107c2d6fSdonahn 			key = unshift[dt];
729107c2d6fSdonahn 			if(__debug & (1<<key)) __debug &= ~(1<<key) ;
730107c2d6fSdonahn 			else __debug |= (1<<key) ;
731107c2d6fSdonahn 			break;
732135d056fSwilliam 		}
733107c2d6fSdonahn 	} else {
734107c2d6fSdonahn 		/* make */
735107c2d6fSdonahn 		dt = dt & 0x7f ;
736107c2d6fSdonahn 		switch (action[dt]) {
737107c2d6fSdonahn 		/* LOCKING KEYS */
738107c2d6fSdonahn 		case NUM: num ^= 1; update_led(); break;
739107c2d6fSdonahn 		case CPS: caps ^= 1; update_led(); break;
740107c2d6fSdonahn 		case SCROLL: scroll ^= 1; update_led(); break;
741107c2d6fSdonahn 		case STP: stp ^= 1; if(stp) goto loop; break;
742107c2d6fSdonahn 
743107c2d6fSdonahn 		/* NON-LOCKING KEYS */
744107c2d6fSdonahn 		case SHF: shfts = 1; break;
745107c2d6fSdonahn 		case ALT: alts = 1; break;
746107c2d6fSdonahn 		case CTL: ctls = 1; break;
747107c2d6fSdonahn 		case ASCII:
748107c2d6fSdonahn 			if (shfts) dt = shift[dt];
749107c2d6fSdonahn 			else if (ctls) dt = ctl[dt];
750107c2d6fSdonahn 			else dt = unshift[dt];
751107c2d6fSdonahn 			if (caps && (dt >= 'a' && dt <= 'z')) dt -= 'a' - 'A';
752107c2d6fSdonahn 			return(dt);
753135d056fSwilliam 		}
754107c2d6fSdonahn 	}
755107c2d6fSdonahn 	if (noblock) return (0x100); else goto loop;
756135d056fSwilliam }
757135d056fSwilliam 
pg(p,q,r,s,t,u,v,w,x,y,z)758135d056fSwilliam pg(p,q,r,s,t,u,v,w,x,y,z) char *p; {
759135d056fSwilliam 	printf(p,q,r,s,t,u,v,w,x,y,z);
760135d056fSwilliam 	printf("\n");
761135d056fSwilliam 	return(getchar());
762135d056fSwilliam }
763135d056fSwilliam 
764135d056fSwilliam /* special characters */
765135d056fSwilliam #define bs	8
766135d056fSwilliam #define lf	10
767135d056fSwilliam #define cr	13
768135d056fSwilliam #define cntlc	3
769135d056fSwilliam #define del	0177
770135d056fSwilliam #define cntld	4
771135d056fSwilliam 
getchar()772135d056fSwilliam getchar()
773135d056fSwilliam {
774135d056fSwilliam 	register char thechar;
775135d056fSwilliam 	register delay;
776135d056fSwilliam 	int x;
777135d056fSwilliam 
77839901661Swilliam 	pcconsoftc.cs_flags |= CSF_POLLING;
779135d056fSwilliam 	x=splhigh();
780107c2d6fSdonahn 	sput('>',0x6);
78185f5e7e3Sbill 	/*while (1) {*/
782135d056fSwilliam 		thechar = (char) sgetc(0);
78339901661Swilliam 		pcconsoftc.cs_flags &= ~CSF_POLLING;
784135d056fSwilliam 		splx(x);
785135d056fSwilliam 		switch (thechar) {
786135d056fSwilliam 		    default: if (thechar >= ' ')
787107c2d6fSdonahn 			     	sput(thechar,0x6);
788135d056fSwilliam 			     return(thechar);
789135d056fSwilliam 		    case cr:
790107c2d6fSdonahn 		    case lf: sput(cr,0x6);
791107c2d6fSdonahn 			     sput(lf,0x6);
792135d056fSwilliam 			     return(lf);
793135d056fSwilliam 		    case bs:
794135d056fSwilliam 		    case del:
795107c2d6fSdonahn 			     sput(bs,0x6);
796107c2d6fSdonahn 			     sput(' ',0x6);
797107c2d6fSdonahn 			     sput(bs,0x6);
798135d056fSwilliam 			     return(thechar);
799107c2d6fSdonahn 		    /*case cntlc:
800135d056fSwilliam 			     sput('^',0xe) ; sput('C',0xe) ; sput('\r',0xe) ; sput('\n',0xe) ;
801107c2d6fSdonahn 			     _exit(-2) ; */
802135d056fSwilliam 		    case cntld:
803107c2d6fSdonahn 			     sput('^',0x6) ; sput('D',0x6) ; sput('\r',0x6) ; sput('\n',0x6) ;
804135d056fSwilliam 			     return(0);
805135d056fSwilliam 		}
80685f5e7e3Sbill 	/*}*/
807135d056fSwilliam }
8080034e9a1Swilliam 
809fb81e5fdSbostic #include <machine/dbg.h>
810fb81e5fdSbostic #include <machine/stdarg.h>
8110034e9a1Swilliam static nrow;
8120034e9a1Swilliam 
8130034e9a1Swilliam void
8140034e9a1Swilliam #ifdef __STDC__
dprintf(unsigned flgs,const char * fmt,...)8150034e9a1Swilliam dprintf(unsigned flgs, const char *fmt, ...)
8160034e9a1Swilliam #else
8170034e9a1Swilliam dprintf(flgs, fmt /*, va_alist */)
8180034e9a1Swilliam         char *fmt;
8190034e9a1Swilliam 	unsigned flgs;
8200034e9a1Swilliam #endif
8210034e9a1Swilliam {	extern unsigned __debug;
8220034e9a1Swilliam 	va_list ap;
8230034e9a1Swilliam 
8240034e9a1Swilliam 	if((flgs&__debug) > DPAUSE) {
8250034e9a1Swilliam 		__color = ffs(flgs&__debug)+1;
8260034e9a1Swilliam 		va_start(ap,fmt);
8270034e9a1Swilliam 		kprintf(fmt, 1, (struct tty *)0, ap);
8280034e9a1Swilliam 		va_end(ap);
8290034e9a1Swilliam 	if (flgs&DPAUSE || nrow%24 == 23) {
8300034e9a1Swilliam 		int x;
8310034e9a1Swilliam 		x = splhigh();
8320034e9a1Swilliam 		if (nrow%24 == 23) nrow = 0;
8330034e9a1Swilliam 		sgetc(0);
8340034e9a1Swilliam 		splx(x);
8350034e9a1Swilliam 	}
8360034e9a1Swilliam 	}
8370034e9a1Swilliam 	__color = 0;
8380034e9a1Swilliam }
8390034e9a1Swilliam 
consinit()8400034e9a1Swilliam consinit() {}
841