|
|
1.1 root 1: #include "u.h"
2: #include "../port/lib.h"
3: #include "mem.h"
4: #include "dat.h"
5: #include "fns.h"
6: #include "io.h"
7: #include "ureg.h"
8: #include "../port/error.h"
9:
10: #include <libg.h>
11: #include <gnot.h>
12: #include "screen.h"
13:
14: #define MINX 8
15:
16: extern GSubfont defont0;
17: GSubfont *defont;
18:
19: struct{
20: Point pos;
21: int bwid;
22: }out;
23:
24: Lock screenlock;
25:
26: void duartinit(void);
27: int duartacr;
28: int duartimr;
29:
30: void (*kprofp)(ulong);
31:
32: GBitmap gscreen =
33: {
34: (ulong*)DISPLAYRAM, /* BUG */
35: 0,
36: 2*1152/32,
37: 1,
38: { 0, 0, 1120, 832, },
39: { 0, 0, 1120, 832, },
40: 0
41: };
42:
43: void
44: screeninit(void)
45: {
46: void bigcursor(void);
47: bigcursor();
48:
49: defont = &defont0; /* save space; let bitblt do the conversion work */
50: gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, 0); /**/
51: out.pos.x = MINX;
52: out.pos.y = 0;
53: out.bwid = defont0.info[' '].width;
54: }
55:
56: void
57: screenputs(char *s, int n)
58: {
59: Rune r;
60: int i;
61: char buf[4];
62:
63: if(getsr() & 0x0700){
64: if(!canlock(&screenlock))
65: return; /* don't deadlock trying to print in interrupt */
66: }else
67: lock(&screenlock);
68: while(n > 0){
69: i = chartorune(&r, s);
70: if(i == 0){
71: s++;
72: --n;
73: continue;
74: }
75: memmove(buf, s, i);
76: buf[i] = 0;
77: n -= i;
78: s += i;
79: if(r == '\n'){
80: out.pos.x = MINX;
81: out.pos.y += defont0.height;
82: if(out.pos.y > gscreen.r.max.y-defont0.height)
83: out.pos.y = gscreen.r.min.y;
84: gbitblt(&gscreen, Pt(0, out.pos.y), &gscreen,
85: Rect(0, out.pos.y, gscreen.r.max.x, out.pos.y+2*defont0.height), 0);
86: }else if(r == '\t'){
87: out.pos.x += (8-((out.pos.x-MINX)/out.bwid&7))*out.bwid;
88: if(out.pos.x >= gscreen.r.max.x)
89: screenputs("\n", 1);
90: }else if(r == '\b'){
91: if(out.pos.x >= out.bwid+MINX){
92: out.pos.x -= out.bwid;
93: gsubfstring(&gscreen, out.pos, defont, " ", S);
94: }
95: }else{
96: if(out.pos.x >= gscreen.r.max.x-out.bwid)
97: screenputs("\n", 1);
98: out.pos = gsubfstring(&gscreen, out.pos, defont, buf, S);
99: }
100: }
101: unlock(&screenlock);
102: }
103:
104: #include "keys.h"
105:
106: void
107: kbdstate(int ch)
108: {
109: static int collecting, nk;
110: static uchar kc[5];
111: int c, i;
112:
113: if(ch == 0xff){
114: collecting = 0;
115: return;
116: }
117: if(ch == -1){
118: collecting = 1;
119: nk = 0;
120: return;
121: }
122: if(!collecting){
123: kbdrepeat(1);
124: kbdputc(&kbdq, ch);
125: return;
126: }
127: kc[nk++] = ch;
128: c = latin1(kc, nk);
129: if(c < -1) /* need more keystrokes */
130: return;
131: if(c != -1) /* valid sequence */
132: kbdputc(&kbdq, c);
133: else /* dump characters */
134: for(i=0; i<nk; i++)
135: kbdputc(&kbdq, kc[i]);
136: nk = 0;
137: collecting = 0;
138: }
139:
140: int altcmd; /* state of left alt and command keys */
141:
142: void
143: kbdmouseintr(void)
144: {
145: int c;
146: ulong d;
147: int dx, dy;
148: static int b;
149:
150: if(*(ulong*)MONCSR & (1<<23)){
151: if(*(ulong*)MONCSR & (1<<22)){
152: d = *(ulong*)KBDDATA;
153: if(d & (0xF<<24)){
154: if((d&0x01) == 0)
155: b |= 1;
156: else
157: b &= ~1;
158: if((d&0x100) == 0)
159: b |= mouseshifted ? 2 : 4;
160: else
161: b &= ~6;
162: dx = (d>>1) & 0x7F;
163: dy = (d>>9) & 0x7F;
164: if(dx & 0x40)
165: dx |= ~0x7F;
166: if(dy & 0x40)
167: dy |= ~0x7F;
168: mousetrack(b, 3*-dx, 3*-dy);
169: }else{
170: /* alt key + right mouse button == middle mouse button */
171: if((d&0x2000))
172: altcmd |= 1;
173: else if(!(d&0x2000))
174: altcmd &= ~1;
175: mouseshifted = altcmd & 1;
176: if((d&0x800)) /* left command */
177: altcmd |= 2;
178: else if(!(d&0x800))
179: altcmd &= ~2;
180: if(d & 0x4000){ /* right alt */
181: kbdstate(-1);
182: goto out;
183: }
184: if(d & 0x8000){ /* valid data */
185: if(d & 0x80){ /* up */
186: kbdrepeat(0);
187: goto out;
188: }
189: if(d & 0x100)
190: c = keyc[d&0x7f];
191: else if(d & 0x600)
192: c = keys[d&0x7f];
193: else
194: c = key0[d&0x7F];
195: kbdstate(c);
196: }
197: }
198: }
199: out:
200: if(*(ulong*)MONCSR & (1<<21)){
201: /* keyboard overrun */
202: *(ulong*)MONCSR |= (1<<21);
203: }
204: }
205: if(*(ulong*)MONCSR & (1<<19)){
206: print("kms interrupt\n");
207: if(*(ulong*)MONCSR & (1<<17)){
208: print("kms overrun\n");
209: *(ulong*)MONCSR |= (1<<17);
210: }
211: if(*(ulong*)MONCSR & (1<<18))
212: print("kmsdata %lux\n", *(ulong*)KMSDATA);
213: }
214: }
215:
216:
217: void
218: buzz(int freq, int dur)
219: {
220: USED(freq, dur);
221: }
222:
223: void
224: lights(int mask)
225: {
226: USED(mask);
227: }
228:
229: int
230: screenbits(void)
231: {
232: return 2; /* bits per pixel */
233: }
234:
235: void
236: getcolor(ulong p, ulong *pr, ulong *pg, ulong *pb)
237: {
238: ulong ans;
239:
240: /*
241: * The next says 0 is white (max intensity)
242: */
243: switch(p){
244: case 0: ans = ~0; break;
245: case 1: ans = 0xAAAAAAAA; break;
246: case 2: ans = 0x55555555; break;
247: default: ans = 0; break;
248: }
249: *pr = *pg = *pb = ans;
250: }
251:
252: int
253: setcolor(ulong p, ulong r, ulong g, ulong b)
254: {
255: USED(p, r, g, b);
256: return 0; /* can't change mono screen colormap */
257: }
258:
259:
260: /*
261: * a fatter than usual cursor for the safari
262: */
263: Cursor fatarrow = {
264: { -1, -1 },
265: {
266: 0xff, 0xff, 0x80, 0x01, 0x80, 0x02, 0x80, 0x0c,
267: 0x80, 0x10, 0x80, 0x10, 0x80, 0x08, 0x80, 0x04,
268: 0x80, 0x02, 0x80, 0x01, 0x80, 0x02, 0x8c, 0x04,
269: 0x92, 0x08, 0x91, 0x10, 0xa0, 0xa0, 0xc0, 0x40,
270: },
271: {
272: 0x00, 0x00, 0x7f, 0xfe, 0x7f, 0xfc, 0x7f, 0xf0,
273: 0x7f, 0xe0, 0x7f, 0xe0, 0x7f, 0xf0, 0x7f, 0xf8,
274: 0x7f, 0xfc, 0x7f, 0xfe, 0x7f, 0xfc, 0x73, 0xf8,
275: 0x61, 0xf0, 0x60, 0xe0, 0x40, 0x40, 0x00, 0x00,
276: },
277: };
278: void
279: bigcursor(void)
280: {
281: extern Cursor arrow;
282:
283: memmove(&arrow, &fatarrow, sizeof(fatarrow));
284: }
285:
286: int
287: hwgcmove(Point p)
288: {
289: USED(p);
290: return 0;
291: }
292:
293: void
294: setcursor(Cursor *curs)
295: {
296: uchar *p;
297: int i;
298: extern GBitmap set, clr;
299:
300: for(i = 0; i < 16; i++){
301: p = (uchar*)&set.base[i];
302: *p = curs->set[2*i];
303: *(p+1) = curs->set[2*i+1];
304: p = (uchar*)&clr.base[i];
305: *p = curs->clr[2*i];
306: *(p+1) = curs->clr[2*i+1];
307: }
308: }
309:
310: /*
311: * setup a serial mouse
312: */
313: static void
314: serialmouse(int port, char *type, int setspeed)
315: {
316: if(mousetype)
317: error(Emouseset);
318:
319: if(port >= 2 || port < 0)
320: error(Ebadarg);
321:
322: /* set up /dev/eia0 as the mouse */
323: sccspecial(port, 0, &mouseq, setspeed ? 1200 : 0);
324: if(type && *type == 'M')
325: mouseq.putc = m3mouseputc;
326: mousetype = Mouseserial;
327: }
328:
329: /*
330: * set/change mouse configuration
331: */
332: void
333: mousectl(char *arg)
334: {
335: int n;
336: char *field[3];
337:
338: n = getfields(arg, field, 3, " ");
339: if(strncmp(field[0], "serial", 6) == 0){
340: switch(n){
341: case 1:
342: serialmouse(atoi(field[0]+6), 0, 1);
343: break;
344: case 2:
345: serialmouse(atoi(field[1]), 0, 0);
346: break;
347: case 3:
348: default:
349: serialmouse(atoi(field[1]), field[2], 0);
350: break;
351: }
352: }
353: else
354: error(Ebadctl);
355: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.