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