# /* */ /* * KL/DL-11 driver */ #include "/sys/param.h" #include "/sys/conf.h" #include "/sys/user.h" #include "/sys/tty.h" #include "/sys/proc.h" /* base address */ #define KLADDR 0177560 /* console */ #define KLBASE 0176500 /* kl and dl11-a */ #define DLBASE 0175610 /* dl-e */ #define NKL11 3 #define NDL11 0 #define DSRDY 02 #define RDRENB 01 #define SNDBRK 01 struct tty dl11[NKL11+NDL11]; int ndl11 NKL11+NDL11; struct dlregs { int dlrcsr; int dlrbuf; int dltcsr; int dltbuf; } dlopen(dev, flag) { register char *addr; register struct tty *tp; if(dev.d_minor >= NKL11+NDL11) { u.u_error = ENXIO; return; } tp = &dl11[dev.d_minor]; if (u.u_procp->p_ttyp == 0) { u.u_procp->p_ttyp = tp; tp->t_dev = dev; } /* * set up minor 0 to address KLADDR * set up minor 1 thru NKL11-1 to address from KLBASE * set up minor NKL11 on to address from DLBASE */ addr = KLADDR + 8*dev.d_minor; if(dev.d_minor) addr =+ KLBASE-KLADDR-8; if(dev.d_minor >= NKL11) addr =+ DLBASE-KLBASE-8*NKL11+8; tp->t_addr = addr; if ((tp->t_state&ISOPEN) == 0) { tp->t_state = ISOPEN|CARR_ON; tp->t_flags = ECHO|CRMOD; tp->t_xflags = 0; tp->t_erase = CERASE; tp->t_kill = CKILL; } addr->dlrcsr =| IENABLE|DSRDY|RDRENB; addr->dltcsr =| IENABLE; } dlclose(dev) { register struct tty *tp; tp = &dl11[dev.d_minor]; wflushtty(tp); tp->t_state = 0; } dlread(dev) { ttread(&dl11[dev.d_minor]); } dlwrite(dev) { ttwrite(&dl11[dev.d_minor]); } dlxint(dev) { register struct tty *tp; tp = &dl11[dev.d_minor]; ttstart(tp); if (tp->t_outq.c_cc == 0 || tp->t_outq.c_cc == TTLOWAT) wakeup(&tp->t_outq); } dlrint(dev) { register int c, *addr; register struct tty *tp; tp = &dl11[dev.d_minor]; addr = tp->t_addr; c = addr->dlrbuf; ttyinput(c, tp); } dlsgtty(dev, av) int *av; { register struct tty *tp; register int *v; register struct dlregs *addr; char flag; tp = &dl11[dev.d_minor]; if ((v = av) != 0) { ttystty(tp, v); return; } flag = (&u.u_arg[1])->lobyte; if ((flag != 'S') && (flag != 'C')) { ttystty(tp, 0); return; } if (u.u_arg[2] != 'BR') { if (flag == 'S') ttyset(tp); else ttyclear(tp); return; } addr = tp->t_addr; if (flag == 'S') addr->dltcsr =| SNDBRK; else addr->dltcsr =& ~SNDBRK; }