/* cons.c 4.13 82/03/13 */ /* * Vax console driver and floppy interface * * Note: * We avoid use the ready bit in txcs because it doesn't * work on an 11/750 with an rdm plugged in. */ #include "../h/param.h" #include "../h/conf.h" #include "../h/dir.h" #include "../h/user.h" #include "../h/proc.h" #include "../h/tty.h" #include "../h/systm.h" #include "../h/cons.h" #include "../h/mtpr.h" #include "../h/cpu.h" struct tty cons; int cnstart(); int ttrstrt(); char partab[]; /*ARGSUSED*/ cnopen(dev, flag) dev_t dev; { register struct tty *tp; tp = &cons; tp->t_oproc = cnstart; if ((tp->t_state&TS_ISOPEN) == 0) { ttychars(tp); tp->t_state = TS_ISOPEN|TS_CARR_ON; tp->t_flags = EVENP|ECHO|XTABS|CRMOD; } if (tp->t_state&TS_XCLUDE && u.u_uid != 0) { u.u_error = EBUSY; return; } mtpr(RXCS, mfpr(RXCS)|RXCS_IE); mtpr(TXCS, mfpr(TXCS)|TXCS_IE); (*linesw[tp->t_line].l_open)(dev, tp); } /*ARGSUSED*/ cnclose(dev) dev_t dev; { register struct tty *tp; tp = &cons; (*linesw[tp->t_line].l_close)(tp); ttyclose(tp); } /*ARGSUSED*/ cnread(dev) dev_t dev; { register struct tty *tp; tp = &cons; (*linesw[tp->t_line].l_read)(tp); } /*ARGSUSED*/ cnwrite(dev) dev_t dev; { register struct tty *tp; tp = &cons; (*linesw[tp->t_line].l_write)(tp); } /* * Got a level-20 receive interrupt - * the LSI wants to give us a character. * Catch the character, and see who it goes to. */ /*ARGSUSED*/ cnrint(dev) dev_t dev; { register int c; register struct tty *tp; c = mfpr(RXDB); if (c&RXDB_ID) { #if VAX780 if (cpu == VAX_780) cnrfl(c); #endif return; } tp = &cons; (*linesw[tp->t_line].l_rint)(c, tp); } /*ARGSUSED*/ cnioctl(dev, cmd, addr, flag) dev_t dev; caddr_t addr; { register struct tty *tp; tp = &cons; cmd = (*linesw[tp->t_line].l_ioctl)(tp, cmd, addr); if (cmd == 0) return; if (ttioctl(tp, cmd, addr, flag) == 0) u.u_error = ENOTTY; } int consdone = 1; /* * Got a level-20 transmission interrupt - * the LSI wants another character. First, * see if we can send something to the typewriter. * If not, try the floppy. */ /*ARGSUSED*/ cnxint(dev) dev_t dev; { register struct tty *tp; consdone++; tp = &cons; tp->t_state &= ~TS_BUSY; if (tp->t_line) (*linesw[tp->t_line].l_start)(tp); else cnstart(tp); #if VAX780 if (cpu==VAX_780 && (tp->t_state & TS_BUSY) == 0) conxfl(); #endif } cnstart(tp) register struct tty *tp; { register c; register s; s = spl5(); if (tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP)) goto out; if (tp->t_outq.c_cc <= TTLOWAT(tp)) { if (tp->t_state&TS_ASLEEP) { tp->t_state &= ~TS_ASLEEP; wakeup((caddr_t)&tp->t_outq); } if (tp->t_wsel) { selwakeup(tp->t_wsel, tp->t_state & TS_WCOLL); tp->t_wsel = 0; tp->t_state &= ~TS_WCOLL; } } if (tp->t_outq.c_cc == 0) goto out; if (consdone == 0) return; c = getc(&tp->t_outq); if (tp->t_flags&RAW || tp->t_local&LLITOUT) 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 |= TS_TIMEOUT; goto out; } consdone = 0; tp->t_state |= TS_BUSY; out: splx(s); } /* * Print a character on console. * Attempts to save and restore device * status. */ cnputc(c) register c; { register s, timo; 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') cnputc('\r'); cnputc(0); mtpr(TXCS, s); }