8000: #
8001: /* KL/DL-11 driver */
8002: #include "../param.h"
8003: #include "../conf.h"
8004: #include "../user.h"
8005: #include "../tty.h"
8006: #include "../proc.h"
8007: /* base address */
8008: #define KLADDR 0177560 /* console */
8009: #define KLBASE 0176500 /* kl and dl11-a */
8010: #define DLBASE 0175610 /* dl-e */
8011: #define NKL11 1
8012: #define NDL11 0
8013: #define DSRDY 02
8014: #define RDRENB 01
8015: struct tty kl11[NKL11+NDL11];
8016: struct klregs {
8017: int klrcsr;
8018: int klrbuf;
8019: int kltcsr;
8020: int kltbuf;
8021: }
8022: /* --------------------------- */
8023: klopen(dev, flag)
8024: { register char *addr;
8025: register struct tty *tp;
8026: if(dev.d_minor >= NKL11+NDL11) {
8027: u.u_error = ENXIO;
8028: return;
8029: }
8030: tp = &kl11[dev.d_minor];
8031: if (u.u_procp->p_ttyp == 0) {
8032: u.u_procp->p_ttyp = tp;
8033: tp->t_dev = dev;
8034: }
8035: /* set up minor 0 to address KLADDR
8036: * set up minor 1 thru NKL11-1 to address from KLBASE
8037: * set up minor NKL11 on to address from DLBASE
8038: */
8039: addr = KLADDR + 8*dev.d_minor;
8040: if(dev.d_minor)
8041: addr =+ KLBASE-KLADDR-8;
8042: if(dev.d_minor >= NKL11)
8043: addr =+ DLBASE-KLBASE-8*NKL11+8;
8044: tp->t_addr = addr;
8045: if ((tp->t_state&ISOPEN) == 0) {
8046: tp->t_state = ISOPEN|CARR_ON;
8047: tp->t_flags = XTABS|LCASE|ECHO|CRMOD;
8048: tp->t_erase = CERASE;
8049: tp->t_kill = CKILL;
8050: }
8051: addr->klrcsr =| IENABLE|DSRDY|RDRENB;
8052: addr->kltcsr =| IENABLE;
8053: }
8054: /* --------------------------- */
8055: klclose(dev)
8056: { register struct tty *tp;
8057: tp = &kl11[dev.d_minor];
8058: wflushtty(tp);
8059: tp->t_state = 0;
8060: }
8061: /* --------------------------- */
8062: klread(dev)
8063: { ttread(&kl11[dev.d_minor]);
8064: }
8065: /* --------------------------- */
8066: klwrite(dev)
8067: { ttwrite(&kl11[dev.d_minor]);
8068: }
8069: /* --------------------------- */
8070: klxint(dev)
8071: { register struct tty *tp;
8072: tp = &kl11[dev.d_minor];
8073: ttstart(tp);
8074: if (tp->t_outq.c_cc == 0 || tp->t_outq.c_cc == TTLOWAT)
8075: wakeup(&tp->t_outq);
8076: }
8077: /* --------------------------- */
8078: klrint(dev)
8079: { register int c, *addr;
8080: register struct tty *tp;
8081: tp = &kl11[dev.d_minor];
8082: addr = tp->t_addr;
8083: c = addr->klrbuf;
8084: addr->klrcsr =| RDRENB;
8085: if ((c&0177)==0)
8086: addr->kltbuf = c; /* hardware botch */
8087: ttyinput(c, tp);
8088: }
8089: /* --------------------------- */
8090: klsgtty(dev, v)
8091: int *v;
8092: { register struct tty *tp;
8093: tp = &kl11[dev.d_minor];
8094: ttystty(tp, v);
8095: }
8096: /* --------------------------- */