+/*
+ * 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);
+}