2 #include "../port/lib.h"
7 #include "../port/error.h"
15 static Memimage* back;
16 static Memimage *conscol;
19 static Rectangle window;
26 vgaimageinit(ulong chan)
29 back = allocmemimage(Rect(0,0,1,1), chan); /* RSC BUG */
31 panic("back alloc"); /* RSC BUG */
33 back->clipr = Rect(-0x3FFFFFF, -0x3FFFFFF, 0x3FFFFFF, 0x3FFFFFF);
34 memfillcolor(back, DBlack);
38 conscol = allocmemimage(Rect(0,0,1,1), chan); /* RSC BUG */
40 panic("conscol alloc"); /* RSC BUG */
41 conscol->flags |= Frepl;
42 conscol->clipr = Rect(-0x3FFFFFF, -0x3FFFFFF, 0x3FFFFFF, 0x3FFFFFF);
43 memfillcolor(conscol, DWhite);
48 vgascroll(VGAscr* scr)
54 h = scr->memdefont->height;
56 r = Rpt(window.min, Pt(window.max.x, window.max.y-o));
57 p = Pt(window.min.x, window.min.y+o);
58 memimagedraw(scr->gscreen, r, scr->gscreen, p, nil, p, S);
59 r = Rpt(Pt(window.min.x, window.max.y-o), window.max);
60 memimagedraw(scr->gscreen, r, back, ZP, nil, ZP, S);
66 vgascreenputc(VGAscr* scr, char* buf, Rectangle *flushr)
73 if(xp < xbuf || xp >= &xbuf[sizeof(xbuf)])
76 h = scr->memdefont->height;
80 if(curpos.y+h >= window.max.y){
85 vgascreenputc(scr, "\r", flushr);
90 curpos.x = window.min.x;
94 p = memsubfontwidth(scr->memdefont, " ");
96 if(curpos.x >= window.max.x-4*w)
97 vgascreenputc(scr, "\n", flushr);
99 pos = (curpos.x-window.min.x)/w;
102 r = Rect(curpos.x, curpos.y, curpos.x+pos*w, curpos.y + h);
103 memimagedraw(scr->gscreen, r, back, back->r.min, nil, back->r.min, S);
111 r = Rect(*xp, curpos.y, curpos.x, curpos.y+h);
112 memimagedraw(scr->gscreen, r, back, back->r.min, nil, ZP, S);
113 combinerect(flushr, r);
121 p = memsubfontwidth(scr->memdefont, buf);
124 if(curpos.x >= window.max.x-w)
125 vgascreenputc(scr, "\n", flushr);
128 r = Rect(curpos.x, curpos.y, curpos.x+w, curpos.y+h);
129 memimagedraw(scr->gscreen, r, back, back->r.min, nil, back->r.min, S);
130 memimagestring(scr->gscreen, curpos, conscol, ZP, scr->memdefont, buf);
131 combinerect(flushr, r);
138 vgascreenputs(char* s, int n)
150 * Don't deadlock trying to
151 * print in an interrupt.
153 if(!canlock(&vgascreenlock))
157 lock(&vgascreenlock);
160 * Be nice to hold this, but not going to deadlock
161 * waiting for it. Just try and see.
163 gotdraw = canqlock(&drawlock);
165 flushr = Rect(10000, 10000, -10000, -10000);
168 i = chartorune(&r, s);
178 vgascreenputc(scr, buf, &flushr);
180 flushmemscreen(flushr);
184 unlock(&vgascreenlock);
188 vgascreenwin(VGAscr* scr)
192 h = scr->memdefont->height;
193 w = scr->memdefont->info[' '].width;
195 window = insetrect(scr->gscreen->r, 48);
196 window.max.x = window.min.x+((window.max.x-window.min.x)/w)*w;
197 window.max.y = window.min.y+((window.max.y-window.min.y)/h)*h;
200 screenputs = vgascreenputs;
204 * Supposedly this is the way to turn DPMS
205 * monitors off using just the VGA registers.
206 * Unfortunately, it seems to mess up the video mode
207 * on the cards I've tried.
210 vgablank(VGAscr*, int blank)
222 outs(Seqx, 0x0100); /* synchronous reset */
223 seq1 |= vgaxi(Seqx, 1) & ~0x20;
224 vgaxo(Seqx, 1, seq1);
225 crtc17 |= vgaxi(Crtx, 0x17) & ~0x80;
227 vgaxo(Crtx, 0x17, crtc17);
228 outs(Crtx, 0x0300); /* end synchronous reset */
232 addvgaseg(char *name, ulong pa, ulong size)
236 memset(&seg, 0, sizeof seg);
237 seg.attr = SG_PHYSICAL;
245 cornerstring(char *s)
253 if(scr->vaddr == nil || screenputs != vgascreenputs)
255 p = memsubfontwidth(scr->memdefont, s);
257 h = scr->memdefont->height;
259 r = Rect(0, 0, w, h);
260 memimagedraw(scr->gscreen, r, back, back->r.min, nil, back->r.min, S);
261 memimagestring(scr->gscreen, r.min, conscol, ZP, scr->memdefont, s);
262 // flushmemscreen(r);