|
|
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:
20: struct{
21: Point pos;
22: int bwid;
23: }out;
24:
25: Lock screenlock;
26:
27: GBitmap gscreen =
28: {
29: (ulong*)((1*1024*1024)|KZERO), /* bootrom puts it here; changed by mmuinit */
30: 0,
31: 64,
32: 0,
33: { 0, 0, 1024, 1024, },
34: { 0, 0, 1024, 1024, },
35: 0
36: };
37:
38: void
39: screeninit(void)
40: {
41: /*
42: * Read HEX switch to set ldepth
43: */
44: if(*(uchar*)MOUSE & (1<<4))
45: gscreen.ldepth = 1;
46: defont = &defont0; /* save space; let bitblt do the conversion work */
47: gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, 0);
48: out.pos.x = MINX;
49: out.pos.y = 0;
50: out.bwid = defont0.info[' '].width;
51: }
52:
53: void
54: screenputnl(void)
55: {
56: out.pos.x = MINX;
57: out.pos.y += defont0.height;
58: if(out.pos.y > gscreen.r.max.y-defont0.height)
59: out.pos.y = gscreen.r.min.y;
60: gbitblt(&gscreen, Pt(0, out.pos.y), &gscreen,
61: Rect(0, out.pos.y, gscreen.r.max.x, out.pos.y+2*defont0.height), 0);
62: }
63:
64: void
65: screenputs(char *s, int n)
66: {
67: Rune r;
68: int i;
69: char buf[4];
70:
71: if(getsr() & 0x0700){
72: if(!canlock(&screenlock))
73: return; /* don't deadlock trying to print in interrupt */
74: }else
75: lock(&screenlock);
76: while(n > 0){
77: i = chartorune(&r, s);
78: if(i == 0){
79: s++;
80: --n;
81: continue;
82: }
83: memmove(buf, s, i);
84: buf[i] = 0;
85: n -= i;
86: s += i;
87: if(r == '\n')
88: screenputnl();
89: else if(r == '\t'){
90: out.pos.x += (8-((out.pos.x-MINX)/out.bwid&7))*out.bwid;
91: if(out.pos.x >= gscreen.r.max.x)
92: screenputnl();
93: }else if(r == '\b'){
94: if(out.pos.x >= out.bwid+MINX){
95: out.pos.x -= out.bwid;
96: gsubfstring(&gscreen, out.pos, defont, " ", S);
97: }
98: }else{
99: if(out.pos.x >= gscreen.r.max.x-out.bwid)
100: screenputnl();
101: out.pos = gsubfstring(&gscreen, out.pos, defont, buf, S);
102: }
103: }
104: unlock(&screenlock);
105: }
106:
107: int
108: screenbits(void)
109: {
110: if(*(uchar*)MOUSE & (1<<4))
111: return 2;
112: else
113: return 1;
114: }
115:
116: void
117: getcolor(ulong p, ulong *pr, ulong *pg, ulong *pb)
118: {
119: ulong ans;
120:
121: /*
122: * The gnot says 0 is white (max intensity)
123: */
124: if(gscreen.ldepth == 0){
125: if(p == 0)
126: ans = ~0;
127: else
128: ans = 0;
129: }else{
130: switch(p){
131: case 0: ans = ~0; break;
132: case 1: ans = 0xAAAAAAAA; break;
133: case 2: ans = 0x55555555; break;
134: default: ans = 0; break;
135: }
136: }
137: *pr = *pg = *pb = ans;
138: }
139:
140: int
141: setcolor(ulong p, ulong r, ulong g, ulong b)
142: {
143: USED(p, r, g, b);
144: return 0; /* can't change mono screen colormap */
145: }
146:
147: int
148: hwgcmove(Point p)
149: {
150: USED(p);
151: return 0;
152: }
153:
154: void
155: setcursor(Cursor *curs)
156: {
157: uchar *p;
158: int i;
159: extern GBitmap set, clr;
160:
161: for(i = 0; i < 16; i++){
162: p = (uchar*)&set.base[i];
163: *p = curs->set[2*i];
164: *(p+1) = curs->set[2*i+1];
165: p = (uchar*)&clr.base[i];
166: *p = curs->clr[2*i];
167: *(p+1) = curs->clr[2*i+1];
168: }
169: }
170:
171: /* only 1 flavor mouse */
172: void
173: mousectl(char *x)
174: {
175: USED(x);
176: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.