|
|
1.1 ! root 1: /* (-lgl ! 2: * COHERENT Driver Kit Version 1.1.0 ! 3: * Copyright (c) 1982, 1990 by Mark Williams Company. ! 4: * All rights reserved. May not be copied without permission. ! 5: -lgl) */ ! 6: /* ! 7: * Memory Mapped Video ! 8: * High level output routines. ! 9: * ! 10: * $Log$ ! 11: */ ! 12: #include <sys/coherent.h> ! 13: #include <sys/sched.h> ! 14: #include <errno.h> ! 15: #include <sys/stat.h> ! 16: #include <sys/io.h> ! 17: #include <sys/tty.h> ! 18: #include <sys/uproc.h> ! 19: #include <sys/timeout.h> ! 20: ! 21: /* For beeper */ ! 22: #define TIMCTL 0x43 /* Timer control port */ ! 23: #define TIMCNT 0x42 /* Counter timer port */ ! 24: #define PORTB 0x61 /* Port containing speaker enable */ ! 25: #define FREQ ((int)(1193181L/440)) /* Counter for 440 Hz. tone */ ! 26: ! 27: int mmtime(); ! 28: ! 29: char mmbeeps; /* number of ticks remaining on bell */ ! 30: char mmesc; /* last unserviced escape character */ ! 31: int mmcrtsav = 1; /* crt saver enabled */ ! 32: int mmvcnt = 900; /* seconds remaining before crt saver is activated */ ! 33: ! 34: extern TTY istty; ! 35: ! 36: /* ! 37: * Start the output stream. ! 38: * Called from `ttwrite' and `isrint' routines. ! 39: */ ! 40: TIM mmtim; ! 41: ! 42: mmstart(tp) ! 43: register TTY *tp; ! 44: { ! 45: int c; ! 46: IO iob; ! 47: static int mmbegun; ! 48: ! 49: while ((tp->t_flags&T_STOP) == 0) { ! 50: if ((c = ttout(tp)) < 0) ! 51: break; ! 52: iob.io_seg = IOSYS; ! 53: iob.io_ioc = 1; ! 54: iob.io_base = &c; ! 55: iob.io_flag = 0; ! 56: mmwrite( makedev(2,0), &iob ); ! 57: } ! 58: ! 59: if (mmbegun == 0) { ! 60: ++mmbegun; ! 61: timeout(&mmtim, HZ/10, mmtime, (char *)tp); ! 62: } ! 63: } ! 64: ! 65: mmtime(xp) ! 66: char *xp; ! 67: { ! 68: register int s; ! 69: ! 70: s = sphi(); ! 71: if (mmbeeps < 0) { ! 72: mmbeeps = 2; ! 73: outb(TIMCTL, 0xB6); /* Timer 2, lsb, msb, binary */ ! 74: outb(TIMCNT, FREQ&0xFF); ! 75: outb(TIMCNT, FREQ>>8); ! 76: outb(PORTB, inb(PORTB) | 03); /* Turn speaker on */ ! 77: } ! 78: else if ((mmbeeps > 0) && (--mmbeeps == 0)) ! 79: outb( PORTB, inb(PORTB) & ~03 ); ! 80: ! 81: if (mmesc) { ! 82: ismmfunc(mmesc); ! 83: mmesc = 0; ! 84: } ! 85: spl(s); ! 86: ! 87: ttstart( (TTY *) xp ); ! 88: ! 89: timeout(&mmtim, HZ/10, mmtime, xp); ! 90: } ! 91: ! 92: /** ! 93: * ! 94: * void ! 95: * mmwatch() -- turn video display off after 15 minutes inactivity. ! 96: */ ! 97: void ! 98: mmwatch() ! 99: { ! 100: if ( (mmcrtsav > 0) && (mmvcnt > 0) && (--mmvcnt == 0) ) ! 101: mm_voff(); ! 102: } ! 103: ! 104: mmwrite( dev, iop ) ! 105: dev_t dev; ! 106: register IO *iop; ! 107: { ! 108: int ioc; ! 109: int s; ! 110: ! 111: ioc = iop->io_ioc; ! 112: ! 113: /* ! 114: * Kernel writes. ! 115: */ ! 116: if (iop->io_seg == IOSYS) { ! 117: while (mmgo(iop)) ! 118: ; ! 119: } ! 120: ! 121: /* ! 122: * Blocking user writes. ! 123: */ ! 124: else if ( (iop->io_flag & IONDLY) == 0 ) { ! 125: do { ! 126: while (istty.t_flags & T_STOP) { ! 127: s = sphi(); ! 128: istty.t_flags |= T_HILIM; ! 129: sleep((char*) &istty.t_oq, ! 130: CVTTOUT, IVTTOUT, SVTTOUT); ! 131: spl( s ); ! 132: } ! 133: /* ! 134: * Signal received. ! 135: */ ! 136: if ( SELF->p_ssig && nondsig() ) { ! 137: kbunscroll(); /* update kbd LEDS */ ! 138: /* ! 139: * No data transferred yet. ! 140: */ ! 141: if ( ioc == iop->io_ioc ) ! 142: u.u_error = EINTR; ! 143: /* ! 144: * Transfer remaining data ! 145: * without pausing after scrolling. ! 146: */ ! 147: else while ( mmgo(iop) ) ! 148: ; ! 149: ! 150: return; ! 151: } ! 152: mmgo(iop); ! 153: } while ( iop->io_ioc ); ! 154: } ! 155: ! 156: /* ! 157: * Non-blocking user writes with output stopped. ! 158: */ ! 159: else if ( istty.t_flags & T_STOP ) { ! 160: u.u_error = EAGAIN; ! 161: return; ! 162: } ! 163: ! 164: /* ! 165: * Non-blocking user writes do not pause after scrolling. ! 166: */ ! 167: else { ! 168: while ( mmgo(iop) ) ! 169: ; ! 170: } ! 171: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.