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