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