1: #
2: /*
3: */
4:
5: /*
6: * LP-11 Line printer driver
7: */
8:
9: #include "../param.h"
10: #include "../conf.h"
11: #include "../user.h"
12:
13: #define LPADDR 0177514
14:
15: #define IENABLE 0100
16: #define DONE 0200
17:
18: #define LPPRI 10
19: #define LPLWAT 50
20: #define LPHWAT 100
21: #define EJLINE 60
22: #define MAXCOL 80
23:
24: struct {
25: int lpsr;
26: int lpbuf;
27: };
28:
29: struct {
30: int cc;
31: int cf;
32: int cl;
33: int flag;
34: int mcc;
35: int ccc;
36: int mlc;
37: } lp11;
38:
39: #define CAP 01 /* Set to 0 for 96-char printer, else to 01 */
40: #define EJECT 02
41: #define OPEN 04
42: #define IND 010 /* Set to 0 for no indent, else to 010 */
43:
44: #define FORM 014
45:
46: lpopen(dev, flag)
47: {
48:
49: if(lp11.flag & OPEN || LPADDR->lpsr < 0) {
50: u.u_error = EIO;
51: return;
52: }
53: lp11.flag =| (IND|EJECT|OPEN);
54: LPADDR->lpsr =| IENABLE;
55: lpcanon(FORM);
56: }
57:
58: lpclose(dev, flag)
59: {
60: lpcanon(FORM);
61: lp11.flag = 0;
62: }
63:
64: lpwrite()
65: {
66: register int c;
67:
68: while ((c=cpass())>=0)
69: lpcanon(c);
70: }
71:
72: lpcanon(c)
73: {
74: register c1, c2;
75:
76: c1 = c;
77: if(lp11.flag&CAP) {
78: if(c1>='a' && c1<='z')
79: c1 =+ 'A'-'a'; else
80: switch(c1) {
81:
82: case '{':
83: c2 = '(';
84: goto esc;
85:
86: case '}':
87: c2 = ')';
88: goto esc;
89:
90: case '`':
91: c2 = '\'';
92: goto esc;
93:
94: case '|':
95: c2 = '!';
96: goto esc;
97:
98: case '~':
99: c2 = '^';
100:
101: esc:
102: lpcanon(c2);
103: lp11.ccc--;
104: c1 = '-';
105: }
106: }
107:
108: switch(c1) {
109:
110: case '\t':
111: lp11.ccc = (lp11.ccc+8) & ~7;
112: return;
113:
114: case FORM:
115: case '\n':
116: if((lp11.flag&EJECT) == 0 ||
117: lp11.mcc!=0 || lp11.mlc!=0) {
118: lp11.mcc = 0;
119: lp11.mlc++;
120: if(lp11.mlc >= EJLINE && lp11.flag&EJECT)
121: c1 = FORM;
122: lpoutput(c1);
123: if(c1 == FORM)
124: lp11.mlc = 0;
125: }
126:
127: case '\r':
128: lp11.ccc = 0;
129: if(lp11.flag&IND)
130: lp11.ccc = 8;
131: return;
132:
133: case 010:
134: if(lp11.ccc > 0)
135: lp11.ccc--;
136: return;
137:
138: case ' ':
139: lp11.ccc++;
140: return;
141:
142: default:
143: if(lp11.ccc < lp11.mcc) {
144: lpoutput('\r');
145: lp11.mcc = 0;
146: }
147: if(lp11.ccc < MAXCOL) {
148: while(lp11.ccc > lp11.mcc) {
149: lpoutput(' ');
150: lp11.mcc++;
151: }
152: lpoutput(c1);
153: lp11.mcc++;
154: }
155: lp11.ccc++;
156: }
157: }
158:
159: lpstart()
160: {
161: register int c;
162:
163: while (LPADDR->lpsr&DONE && (c = getc(&lp11)) >= 0)
164: LPADDR->lpbuf = c;
165: }
166:
167: lpint()
168: {
169: register int c;
170:
171: lpstart();
172: if (lp11.cc == LPLWAT || lp11.cc == 0)
173: wakeup(&lp11);
174: }
175:
176: lpoutput(c)
177: {
178: if (lp11.cc >= LPHWAT)
179: sleep(&lp11, LPPRI);
180: putc(c, &lp11);
181: spl4();
182: lpstart();
183: spl0();
184: }
Defined functions
Defined macros
CAP
defined in line
39; used 1 times
DONE
defined in line
16; used 1 times
EJECT
defined in line
40; used 3 times
FORM
defined in line
44; used 4 times
IND
defined in line
42; used 2 times
LPPRI
defined in line
18; used 1 times
OPEN
defined in line
41; used 2 times