From: Tom London Date: Tue, 23 Jan 1979 12:10:54 +0000 (-0500) Subject: Bell 32V development X-Git-Tag: Bell-32V~288 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/502502c026ff4080a4a6d4f11504142f2e045bc2 Bell 32V development Work on file usr/src/sys/sys/cons.c Co-Authored-By: John Reiser Synthesized-from: 32v --- diff --git a/usr/src/sys/sys/cons.c b/usr/src/sys/sys/cons.c new file mode 100644 index 0000000000..bb3075a86b --- /dev/null +++ b/usr/src/sys/sys/cons.c @@ -0,0 +1,160 @@ +/* + * KL/DL-11 driver + */ +#include "../h/param.h" +#include "../h/conf.h" +#include "../h/dir.h" +#include "../h/user.h" +#include "../h/tty.h" +#include "../h/systm.h" +#include "../h/cons.h" +#include "../h/mtpr.h" + +#define NL1 000400 +#define NL2 001000 +#define CR2 020000 +#define FF1 040000 +#define TAB1 002000 + +struct tty cons; +int consstart(); +int ttrstrt(); +char partab[]; + +consopen(dev, flag) +dev_t dev; +{ + register struct device *addr; + register struct tty *tp; + register d; + + tp = &cons; + tp->t_oproc = consstart; + tp->t_iproc = NULL; + if ((tp->t_state&ISOPEN) == 0) { + tp->t_state = ISOPEN|CARR_ON; + tp->t_flags = EVENP|ECHO|XTABS|CRMOD; + tp->t_erase = CERASE; + tp->t_kill = CKILL; + } + mtpr(RXCS, mfpr(RXCS)|RXCS_IE); + mtpr(TXCS, mfpr(TXCS)|TXCS_IE); + ttyopen(dev, tp); +} + +consclose(dev) +dev_t dev; +{ + register struct tty *tp; + + tp = &cons; + wflushtty(tp); + tp->t_state = 0; +} + +consread(dev) +dev_t dev; +{ + ttread(&cons); +} + +conswrite(dev) +dev_t dev; +{ + ttwrite(&cons); +} + +consxint(dev) +dev_t dev; +{ + register struct tty *tp; + + tp = &cons; + ttstart(tp); + if (tp->t_outq.c_cc == 0 || tp->t_outq.c_cc == TTLOWAT) + wakeup((caddr_t)&tp->t_outq); +} + +consrint(dev) +dev_t dev; +{ + register int c; + register struct device *addr; + register struct tty *tp; + + c = mfpr(RXDB); + ttyinput(c, &cons); +} + +consioctl(dev,cmd,addr,flag) +dev_t dev; +caddr_t addr; +{ + register struct tty *tp; + + tp = &cons; + if (ttioccom(cmd,tp,addr,dev) ==0) + u.u_error = ENOTTY; +} + +consstart(tp) +register struct tty *tp; +{ + register c; + register struct device *addr; + + if( (mfpr(TXCS)&TXCS_RDY) == 0) + return; + if ((c=getc(&tp->t_outq)) >= 0) { + if (tp->t_flags&RAW) + mtpr(TXDB, c&0xff); + else if (c<=0177) + mtpr(TXDB, (c | (partab[c]&0200))&0xff); + else { + timeout(ttrstrt, (caddr_t)tp, (c&0177)); + tp->t_state |= TIMEOUT; + } + } +} + +char *msgbufp = msgbuf; /* Next saved printf character */ +/* + * Print a character on console. + * Attempts to save and restore device + * status. + * If the switches are 0, all + * printing is inhibited. + * + * Whether or not printing is inhibited, + * the last MSGBUFS characters + * are saved in msgbuf for inspection later. + */ +putchar(c) +register c; +{ + register s, timo; + + if (c != '\0' && c != '\r' && c != 0177) { + *msgbufp++ = c; + if(msgbufp >= &msgbuf[MSGBUFS]) + msgbufp = msgbuf; + } + timo = 30000; + /* + * Try waiting for the console tty to come ready, + * otherwise give up after a reasonable time. + */ + while((mfpr(TXCS)&TXCS_RDY) == 0) + if(--timo == 0) + break; + if(c == 0) + return; + s = mfpr(TXCS); + mtpr(TXCS,0); + mtpr(TXDB, c&0xff); + if(c == '\n') { + putchar('\r'); + } + putchar(0); + mtpr(TXCS, s); +}