## diffname bitsy/screen.c 2000/0902 ## diff -e /dev/null /n/emeliedump/2000/0902/sys/src/9/bitsy/screen.c 0a #include "u.h" #include "../port/lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" #include "ureg.h" #include "../port/error.h" #define Image IMAGE #include #include #include #include "screen.h" void flushmemscreen(Rectangle) { } uchar* attachscreen(Rectangle*, ulong*, int*, int*, int*) { return nil; } void getcolor(ulong p, ulong* pr, ulong* pg, ulong* pb) { USED(p, pr, pg, pb); } int setcolor(ulong p, ulong r, ulong g, ulong b) { USED(p,r,g,b); return 0; } void blankscreen(int blank) { USED(blank); } . ## diffname bitsy/screen.c 2000/1015 ## diff -e /n/emeliedump/2000/0902/sys/src/9/bitsy/screen.c /n/emeliedump/2000/1015/sys/src/9/bitsy/screen.c 44a void screenputs(char *s, int n) { USED(s, n); } . ## diffname bitsy/screen.c 2000/1017 ## diff -e /n/emeliedump/2000/1015/sys/src/9/bitsy/screen.c /n/emeliedump/2000/1017/sys/src/9/bitsy/screen.c 24c *r = gscreen->r; *d = gscreen->depth; *chan = gscreen->chan; *width = gscreen->width; *softscreen = 0; return (uchar*)gscreen->data; . 22c attachscreen(Rectangle *r, ulong *chan, int* d, int *width, int *softscreen) . 20a /* * export screen to devdraw */ . 16a screeninit(void) { framebuf = xspanalloc(sizeof *framebuf, 0x10, 0); memset(framebuf->palette, 0, sizeof framebuf->palette); framebuf->palette[0] = Pal0; lcdinit(); gscreen = &xgscreen; gscreen->data = (struct Memdata *)framebuf->pixel; } void . 15a enum { Wid = 320, Ht = 240, Pal0 = 0x2000, /* 16-bit pixel data in active mode (12 in passive) */ hsw = 0x4, elw = 0x11, blw = 0xc, vsw = 0x3, efw = 0x1, bfw = 0xa, pcd = 0x10, }; struct sa1110fb { /* Frame buffer for 16-bit active color */ short palette[16]; /* entry 0 set to Pal0, the rest to 0 */ ushort pixel[Wid*Ht]; /* Pixel data */ } *framebuf; enum { /* LCD Control Register 0, lcd->lccr0 */ LEN = 0, /* 1 bit */ CMS = 1, /* 1 bit */ SDS = 2, /* 1 bit */ LDM = 3, /* 1 bit */ BAM = 4, /* 1 bit */ ERM = 5, /* 1 bit */ PAS = 7, /* 1 bit */ BLE = 8, /* 1 bit */ DPD = 9, /* 1 bit */ PDD = 12, /* 8 bits */ }; enum { /* LCD Control Register 1, lcd->lccr1 */ PPL = 0, /* 10 bits */ HSW = 10, /* 6 bits */ ELW = 16, /* 8 bits */ BLW = 24, /* 8 bits */ }; enum { /* LCD Control Register 2, lcd->lccr2 */ LPP = 0, /* 10 bits */ VSW = 10, /* 6 bits */ EFW = 16, /* 8 bits */ BFW = 24, /* 8 bits */ }; enum { /* LCD Control Register 3, lcd->lccr3 */ PCD = 0, /* 8 bits */ ACB = 8, /* 8 bits */ API = 16, /* 4 bits */ VSP = 20, /* 1 bit */ HSP = 21, /* 1 bit */ PCP = 22, /* 1 bit */ OEP = 23, /* 1 bit */ }; enum { /* LCD Status Register, lcd->lcsr */ LFD = 0, /* 1 bit */ BAU = 1, /* 1 bit */ BER = 2, /* 1 bit */ ABC = 3, /* 1 bit */ IOL = 4, /* 1 bit */ IUL = 5, /* 1 bit */ OIU = 6, /* 1 bit */ IUU = 7, /* 1 bit */ OOL = 8, /* 1 bit */ OUL = 9, /* 1 bit */ OOU = 10, /* 1 bit */ OUU = 11, /* 1 bit */ }; struct sa1110regs { ulong lccr0; /* 0xb0100000 */ ulong lcsr; /* 0xb0100004 */ ulong dummies[2]; /* unused 0xb0100008 and 0xb010000c */ short* dbar1; /* 0xb0100010 */ ulong dcar1; /* 0xb0100014 */ ulong dbar2; /* 0xb0100018 */ ulong dcar2; /* 0xb010001c */ ulong lccr1; /* 0xb0100020 */ ulong lccr2; /* 0xb0100024 */ ulong lccr3; /* 0xb0100028 */ } *lcd; Point ZP = {0, 0}; static Memimage xgscreen = { { 0, 0, Wid, Ht }, /* r */ { 0, 0, Wid, Ht }, /* clipr */ 16, /* depth */ 1, /* nchan */ RGB16, /* chan */ nil, /* cmap */ nil, /* data */ 0, /* zero */ Wid/2, /* width */ 0, /* layer */ Frepl, /* flags */ }; Memimage *gscreen; Memimage *conscol; Memimage *back; Memimage *hwcursor; static void lcdinit(void) { lcd = (struct sa1110regs*)0xb0100000; lcd->dbar1 = framebuf->palette; lcd->lccr3 = (pcd << PCD) | (0 << ACB) | (0 << API) | (1 << VSP) | (1 << HSP); lcd->lccr2 = ((Ht-1) << LPP) | (vsw << VSW) | (efw << EFW) | (bfw << BFW); lcd->lccr1 = (Wid << PPL) | (hsw << HSW) | (elw << ELW) | (blw << BLW); lcd->lccr0 = 1<lcsr); . 149a print("LCD status before power up: 0x%lux\n", lcd->lcsr); lcdpower(1); print("LCD status after power up: 0x%lux\n", lcd->lcsr); . 147a memset(framebuf->pixel, 0xf8, sizeof framebuf->pixel); . 136,139c lcd->lccr3 = pcd<lccr2 = (Ht-1)<lccr1 = (Wid-16)<lccr0 = 1<lccr0 &= ~(0<lcsr & LDD) == 0) sleep(1); . 133c /* map the lcd regs into the kernel's virtual space */ lcd = (struct sa1110regs*)mapspecial(LCDREGS, sizeof(struct sa1110regs));; . 130a lcdstop(void) { ulong lccr0; lcd->lccr0 &= ~(0<lcsr & LDD) == 0) sleep(1); lcdpower(0); } static void . 96,105c ulong lccr0; ulong lcsr; ulong dummies[2]; short* dbar1; ulong dcar1; ulong dbar2; ulong dcar2; ulong lccr1; ulong lccr2; ulong lccr3; . 25,27c vsw = 0x03, efw = 0x01, bfw = 0x0a, . 23c blw = 0x0c, . 21c hsw = 0x04, . ## diffname bitsy/screen.c 2000/1019 ## diff -e /n/emeliedump/2000/1018/sys/src/9/bitsy/screen.c /n/emeliedump/2000/1019/sys/src/9/bitsy/screen.c 219c int i; Rune r; char buf[4]; if(!islo()) { /* don't deadlock trying to print in interrupt */ if(!canlock(&screenlock)) return; } else lock(&screenlock); while(n > 0){ i = chartorune(&r, s); if(i == 0){ s++; --n; continue; } memmove(buf, s, i); buf[i] = 0; n -= i; s += i; screenputc(buf); } unlock(&screenlock); } static void screenwin(void) { Point p, q; char *greet; Memimage *grey; memsetchan(gscreen, RGB16); back = memwhite; conscol = memblack; memfillcolor(gscreen, 0x444488FF); w = memdefont->info[' '].width; h = memdefont->height; window.min = Pt(8, 8); window.max = addpt(window.min, Pt(8+w*32, 8+h*14)); memimagedraw(gscreen, window, memblack, ZP, memopaque, ZP); window = insetrect(window, 4); memimagedraw(gscreen, window, memwhite, ZP, memopaque, ZP); /* a lot of work to get a grey color */ grey = allocmemimage(Rect(0,0,1,1), RGB16); grey->flags |= Frepl; grey->clipr = gscreen->r; grey->data->bdata[0] = 0x77; grey->data->bdata[1] = 0x77; memimagedraw(gscreen, Rect(window.min.x, window.min.y, window.max.x, window.min.y+h+5+6), grey, ZP, nil, ZP); freememimage(grey); window = insetrect(window, 5); greet = " Plan 9 Console "; p = addpt(window.min, Pt(10, 0)); q = memsubfontwidth(memdefont, greet); memimagestring(gscreen, p, conscol, ZP, memdefont, greet); window.min.y += h+6; curpos = window.min; window.max.y = window.min.y+((window.max.y-window.min.y)/h)*h; } static void screenputc(char *buf) { Point p; int w, pos; Rectangle r; static int *xp; static int xbuf[256]; if(xp < xbuf || xp >= &xbuf[sizeof(xbuf)]) xp = xbuf; switch(buf[0]) { case '\n': if(curpos.y+h >= window.max.y) scroll(); curpos.y += h; screenputc("\r"); break; case '\r': xp = xbuf; curpos.x = window.min.x; break; case '\t': p = memsubfontwidth(memdefont, " "); w = p.x; *xp++ = curpos.x; pos = (curpos.x-window.min.x)/w; pos = 8-(pos%8); r = Rect(curpos.x, curpos.y, curpos.x+pos*w, curpos.y + h); memimagedraw(gscreen, r, back, back->r.min, nil, back->r.min); curpos.x += pos*w; break; case '\b': if(xp <= xbuf) break; xp--; r = Rect(*xp, curpos.y, curpos.x, curpos.y + h); memimagedraw(gscreen, r, back, back->r.min, nil, back->r.min); curpos.x = *xp; break; default: p = memsubfontwidth(memdefont, buf); w = p.x; if(curpos.x >= window.max.x-w) screenputc("\n"); *xp++ = curpos.x; r = Rect(curpos.x, curpos.y, curpos.x+w, curpos.y + h); memimagedraw(gscreen, r, back, back->r.min, nil, back->r.min); memimagestring(gscreen, curpos, conscol, ZP, memdefont, buf); curpos.x += w; } } static void scroll(void) { int o; Point p; Rectangle r; o = 8*h; r = Rpt(window.min, Pt(window.max.x, window.max.y-o)); p = Pt(window.min.x, window.min.y+o); memimagedraw(gscreen, r, gscreen, p, nil, p); r = Rpt(Pt(window.min.x, window.max.y-o), window.max); memimagedraw(gscreen, r, back, ZP, nil, ZP); curpos.y -= o; . 179a /* no-op, screen is direct mapped */ . 174c xgdata.bdata = (uchar *)framebuf->pixel; memimageinit(); memdefont = getmemdefont(); out.pos.x = MINX; out.pos.y = 0; out.bwid = memdefont->info[' '].width; screenwin(); . 171d 169c . 167c iprint("LCD power up\n"); . 163,164c /* the following works because main memory is direct mapped */ . 161a /* map the lcd regs into the kernel's virtual space */ lcd = (struct sa1110regs*)mapspecial(LCDREGS, sizeof(struct sa1110regs));; . 143,150d 136c delay(10); . 132,133d 129a Memsubfont *memdefont; struct{ Point pos; int bwid; }out; Lock screenlock; Point ZP = {0, 0}; static Rectangle window; static Point curpos; static int h, w; int drawdebug; static ulong rep(ulong, int); static void screenwin(void); static void screenputc(char *buf); static void scroll(void); . 128d 118c &xgdata, /* data */ . 109a static Memdata xgdata = { nil, /* *base */ nil, /* *bdata */ 1, /* ref */ nil, /* *imref */ 0, /* allocd */ }; . 81c LDD = 0, /* 1 bit */ . 15a #define MINX 8 . ## diffname bitsy/screen.c 2000/1020 ## diff -e /n/emeliedump/2000/1019/sys/src/9/bitsy/screen.c /n/emeliedump/2000/1020/sys/src/9/bitsy/screen.c 305,310d 298,299c window.min = Pt(4, 4); window.max = addpt(window.min, Pt(4+w*33, 4+h*15)); . 293c /* a lot of work to get a grey color */ grey = allocmemimage(Rect(0,0,1,1), RGB16); grey->flags |= Frepl; grey->clipr = gscreen->r; grey->data->bdata[0] = 0x77; grey->data->bdata[1] = 0x77; . 199a i = 0; while (i < Wid*Ht*1/3) framebuf->pixel[i++] = 0xf800; /* red */ while (i < Wid*Ht*2/3) framebuf->pixel[i++] = 0xffff; /* white */ while (i < Wid*Ht*3/3) framebuf->pixel[i++] = 0x001f; /* blue */ . 182a int i; . ## diffname bitsy/screen.c 2000/1021 ## diff -e /n/emeliedump/2000/1020/sys/src/9/bitsy/screen.c /n/emeliedump/2000/1021/sys/src/9/bitsy/screen.c 337a return; . 195d 193d 188c framebuf = xspanalloc(sizeof *framebuf, 0x20, 0); . 177d 133c 0, /* flags */ . 126c 3, /* nchan */ . ## diffname bitsy/screen.c 2000/1024 ## diff -e /n/emeliedump/2000/1021/sys/src/9/bitsy/screen.c /n/emeliedump/2000/1024/sys/src/9/bitsy/screen.c 335d 231c return (uchar*)gscreen->data->bdata; . ## diffname bitsy/screen.c 2000/1026 ## diff -e /n/emeliedump/2000/1024/sys/src/9/bitsy/screen.c /n/emeliedump/2000/1026/sys/src/9/bitsy/screen.c 300,301c grey->data->bdata[0] = 0x40; grey->data->bdata[1] = 0xfd; . ## diffname bitsy/screen.c 2000/1101 ## diff -e /n/emeliedump/2000/1026/sys/src/9/bitsy/screen.c /n/emeliedump/2000/1101/sys/src/9/bitsy/screen.c 314,315c window.max.x, window.min.y+h+5+6), orange, ZP, nil, ZP); freememimage(orange); . 307c window.max = addpt(window.min, Pt(4+w*33, 4+h*12)); . 296,301c /* a lot of work to get a orange color */ orange = allocmemimage(Rect(0,0,1,1), RGB16); orange->flags |= Frepl; orange->clipr = gscreen->r; orange->data->bdata[0] = 0x40; orange->data->bdata[1] = 0xfd; . 289c Memimage *orange; . ## diffname bitsy/screen.c 2000/1102 ## diff -e /n/emeliedump/2000/1101/sys/src/9/bitsy/screen.c /n/emeliedump/2000/1102/sys/src/9/bitsy/screen.c 366a break; case '\0': . 355c pos = 4-(pos%4); *xp++ = curpos.x; . 353c if(curpos.x >= window.max.x-4*w) screenputc("\n"); . 306,307c window = Rect(4, 4, 320-4, 240-60); . 183a iprint("%lux %lux\n", (ulong)framebuf, (ulong)framebuf->pixel); . ## diffname bitsy/screen.c 2000/1103 ## diff -e /n/emeliedump/2000/1102/sys/src/9/bitsy/screen.c /n/emeliedump/2000/1103/sys/src/9/bitsy/screen.c 203a for(i = 0; i < Wid*Ht; i += Wid) framebuf->pixel[i] = 0xffff; /* white */ for(i = Wid-1; i < Wid*Ht; i += Wid) framebuf->pixel[i] = 0x001f; /* blue */ . 198a xgdata.ref = 1; . 191a iprint("framebuf %lux\n", framebuf); . 189c framebuf = xspanalloc(sizeof *framebuf, 0x100, 0); . 184,185d 179a lcdtweak(Cmdbuf *cmd) { if(cmd->nf < 4) return; if(*cmd->f[0] == 'h') lcd->lccr1 = ((Wid-16)<f[1])<f[2])<f[3])<f[0] == 'v') lcd->lccr2 = ((Ht-1)<f[1])<f[2])<f[3])<pixel[(x+1)*Ht-y-1] = vscreen[y*Wid+x]; cachewb(); . 231c flushmemscreen(Rectangle r) . 219a flushmemscreen(gscreen->r); . 212,218c while (i < Wid*Ht*1/3) vscreen[i++] = 0xf800; /* red */ while (i < Wid*Ht*2/3) vscreen[i++] = 0xffff; /* white */ while (i < Wid*Ht*3/3) vscreen[i++] = 0x001f; /* blue */ . 208c xgdata.bdata = (uchar *)vscreen; . 200c vscreen = xalloc(sizeof(ushort)*Wid*Ht); . 167,168c lcd->lccr2 = (Wid-1)<lccr1 = (Ht-16)<r, 4); r.max.y -= 56; . 251c return (uchar*)gscreen->data->bdata; . 249c *softscreen = landscape == 0; . 233,235c if (landscape == 0) for (x = r.min.x; x < r.max.x; x++) for (y = r.min.y; y < r.max.y; y++) framebuf->pixel[(x+1)*Ht-y-1] = vscreen[y*Wid+x]; . 212,217c if (landscape) { xgdata.bdata = (uchar *)framebuf->pixel; while (i < Wid*Ht*1/3) framebuf->pixel[i++] = 0xf800; /* red */ while (i < Wid*Ht*2/3) framebuf->pixel[i++] = 0xffff; /* white */ while (i < Wid*Ht*3/3) framebuf->pixel[i++] = 0x001f; /* blue */ } else { xgdata.bdata = (uchar *)vscreen; while (i < Wid*Ht*1/3) vscreen[i++] = 0xf800; /* red */ while (i < Wid*Ht*2/3) vscreen[i++] = 0xffff; /* white */ while (i < Wid*Ht*3/3) vscreen[i++] = 0x001f; /* blue */ flushmemscreen(gscreen->r); } . 210d 208d 183c lcd->lccr2 = ((Wid-1)<lccr1 = ((Ht-16)<r = Rect(0, 0, Ht, Wid); gscreen->clipr = gscreen->r; xgdata.bdata = (uchar *)framebuf->pixel; } else { gscreen->r = Rect(0, 0, Wid, Ht); gscreen->clipr = gscreen->r; xgdata.bdata = (uchar *)vscreen; } landscape = ls; } void . 17a int landscape; /* orientation of the screen, default is 0: portait */ . ## diffname bitsy/screen.c 2000/1106 ## diff -e /n/emeliedump/2000/1105/sys/src/9/bitsy/screen.c /n/emeliedump/2000/1106/sys/src/9/bitsy/screen.c 340d 272c *softscreen = (landscape == 0); . 258,259c framebuf->pixel[(x+1)*Ht-1-y] = vscreen[y*Wid+x]; start = (ulong)&framebuf->pixel[(r.min.x+1)*Ht-1-(r.max.y-1)]; end = (ulong)&framebuf->pixel[(r.max.x-1+1)*Ht-1-(r.min.y)]; } else { start = (ulong)&framebuf->pixel[r.min.y*Ht + r.min.x]; end = (ulong)&framebuf->pixel[(r.max.y-1)*Ht + r.max.x - 1]; } cachewbregion(start, end-start); . 255c if (landscape == 0) { if (r.min.x < 0) r.min.x = 0; if (r.max.x > Wid) r.max.x = Wid; if (r.min.y < 0) r.min.y = 0; if (r.max.y > Ht) r.max.y = Ht; . 253a ulong start, end; . 216d 166a /* the following line works because main memory is direct mapped */ . 18c int landscape = 0; /* orientation of the screen, default is 0: portait */ . ## diffname bitsy/screen.c 2000/1130 ## diff -e /n/emeliedump/2000/1106/sys/src/9/bitsy/screen.c /n/emeliedump/2000/1130/sys/src/9/bitsy/screen.c 304c if (blank) { lcdpower(0); } else { lcdpower(1); lcdinit(); } . 246a blanktime = 3; /* minutes */ . ## diffname bitsy/screen.c 2000/1207 ## diff -e /n/emeliedump/2000/1130/sys/src/9/bitsy/screen.c /n/emeliedump/2000/1207/sys/src/9/bitsy/screen.c 265c framebuf->pixel[(x+1)*Ht-1-y] = gamma[vscreen[y*Wid+x]]; . 14a #include "gamma.h" . ## diffname bitsy/screen.c 2000/1214 ## diff -e /n/emeliedump/2000/1207/sys/src/9/bitsy/screen.c /n/emeliedump/2000/1214/sys/src/9/bitsy/screen.c 369d ## diffname bitsy/screen.c 2001/0529 ## diff -e /n/emeliedump/2000/1214/sys/src/9/bitsy/screen.c /n/emeliedump/2001/0529/sys/src/9/bitsy/screen.c 315,316c static void bitsyscreenputs(char *s, int n) . 250a screenputs = bitsyscreenputs; . 154a static void bitsyscreenputs(char *s, int n); . ## diffname bitsy/screen.c 2001/0618 ## diff -e /n/emeliedump/2001/0529/sys/src/9/bitsy/screen.c /n/emeliedump/2001/0618/sys/src/9/bitsy/screen.c 207a } void screenpower(int on) { if (on == 0){ memmove(savedpalette, framebuf->palette, sizeof framebuf->palette); blankscreen(1); } else { memmove(framebuf->palette, savedpalette, sizeof framebuf->palette); blankscreen(0); } . 42a short savedpalette[16]; /* saved during suspend mode */ . ## diffname bitsy/screen.c 2001/0621 ## diff -e /n/emeliedump/2001/0618/sys/src/9/bitsy/screen.c /n/emeliedump/2001/0621/sys/src/9/bitsy/screen.c 154,486c static ulong rep(u . ## diffname bitsy/screen.c 2001/0622 ## diff -e /n/emeliedump/2001/0621/sys/src/9/bitsy/screen.c /n/emeliedump/2001/0622/sys/src/9/bitsy/screen.c 154c static ulong rep(ulong, int); static void screenwin(void); static void screenputc(char *buf); static void bitsyscreenputs(char *s, int n); static void scroll(void); static void lcdstop(void) { lcd->lccr0 &= ~(0<lcsr & LDD) == 0) delay(10); lcdpower(0); } static void lcdinit(void) { /* the following line works because main memory is direct mapped */ lcd->dbar1 = framebuf->palette; lcd->lccr3 = pcd<lccr2 = (Wid-1)<lccr1 = (Ht-16)<lccr0 = 1<r = Rect(0, 0, Ht, Wid); gscreen->clipr = gscreen->r; xgdata.bdata = (uchar *)framebuf->pixel; } else { gscreen->r = Rect(0, 0, Wid, Ht); gscreen->clipr = gscreen->r; xgdata.bdata = (uchar *)vscreen; } landscape = ls; } void lcdtweak(Cmdbuf *cmd) { if(cmd->nf < 4) return; if(*cmd->f[0] == 'h') lcd->lccr1 = ((Ht-16)<f[1])<f[2])<f[3])<f[0] == 'v') lcd->lccr2 = ((Wid-1)<f[1])<f[2])<f[3])<palette, sizeof framebuf->palette); blankscreen(1); } else { memmove(framebuf->palette, savedpalette, sizeof framebuf->palette); blankscreen(0); } } void screeninit(void) { int i; /* map the lcd regs into the kernel's virtual space */ lcd = (struct sa1110regs*)mapspecial(LCDREGS, sizeof(struct sa1110regs));; framebuf = xspanalloc(sizeof *framebuf, 0x100, 0); vscreen = xalloc(sizeof(ushort)*Wid*Ht); framebuf->palette[0] = Pal0; lcdpower(1); lcdinit(); gscreen = &xgscreen; xgdata.ref = 1; i = 0; if (landscape) { xgdata.bdata = (uchar *)framebuf->pixel; while (i < Wid*Ht*1/3) framebuf->pixel[i++] = 0xf800; /* red */ while (i < Wid*Ht*2/3) framebuf->pixel[i++] = 0xffff; /* white */ while (i < Wid*Ht*3/3) framebuf->pixel[i++] = 0x001f; /* blue */ } else { xgdata.bdata = (uchar *)vscreen; while (i < Wid*Ht*1/3) vscreen[i++] = 0xf800; /* red */ while (i < Wid*Ht*2/3) vscreen[i++] = 0xffff; /* white */ while (i < Wid*Ht*3/3) vscreen[i++] = 0x001f; /* blue */ flushmemscreen(gscreen->r); } memimageinit(); memdefont = getmemdefont(); out.pos.x = MINX; out.pos.y = 0; out.bwid = memdefont->info[' '].width; blanktime = 3; /* minutes */ screenwin(); screenputs = bitsyscreenputs; } void flushmemscreen(Rectangle r) { int x, y; ulong start, end; if (landscape == 0) { if (r.min.x < 0) r.min.x = 0; if (r.max.x > Wid) r.max.x = Wid; if (r.min.y < 0) r.min.y = 0; if (r.max.y > Ht) r.max.y = Ht; for (x = r.min.x; x < r.max.x; x++) for (y = r.min.y; y < r.max.y; y++) framebuf->pixel[(x+1)*Ht-1-y] = gamma[vscreen[y*Wid+x]]; start = (ulong)&framebuf->pixel[(r.min.x+1)*Ht-1-(r.max.y-1)]; end = (ulong)&framebuf->pixel[(r.max.x-1+1)*Ht-1-(r.min.y)]; } else { start = (ulong)&framebuf->pixel[r.min.y*Ht + r.min.x]; end = (ulong)&framebuf->pixel[(r.max.y-1)*Ht + r.max.x - 1]; } cachewbregion(start, end-start); } /* * export screen to devdraw */ uchar* attachscreen(Rectangle *r, ulong *chan, int* d, int *width, int *softscreen) { *r = gscreen->r; *d = gscreen->depth; *chan = gscreen->chan; *width = gscreen->width; *softscreen = (landscape == 0); return (uchar*)gscreen->data->bdata; } void getcolor(ulong p, ulong* pr, ulong* pg, ulong* pb) { USED(p, pr, pg, pb); } int setcolor(ulong p, ulong r, ulong g, ulong b) { USED(p,r,g,b); return 0; } void blankscreen(int blank) { if (blank) { lcdpower(0); } else { lcdpower(1); lcdinit(); } } static void bitsyscreenputs(char *s, int n) { int i; Rune r; char buf[4]; if(!islo()) { /* don't deadlock trying to print in interrupt */ if(!canlock(&screenlock)) return; } else lock(&screenlock); while(n > 0){ i = chartorune(&r, s); if(i == 0){ s++; --n; continue; } memmove(buf, s, i); buf[i] = 0; n -= i; s += i; screenputc(buf); } unlock(&screenlock); } static void screenwin(void) { Point p, q; char *greet; Memimage *orange; Rectangle r; memsetchan(gscreen, RGB16); back = memwhite; conscol = memblack; orange = allocmemimage(Rect(0,0,1,1), RGB16); orange->flags |= Frepl; orange->clipr = gscreen->r; orange->data->bdata[0] = 0x40; orange->data->bdata[1] = 0xfd; w = memdefont->info[' '].width; h = memdefont->height; r = insetrect(gscreen->r, 4); memimagedraw(gscreen, r, memblack, ZP, memopaque, ZP); window = insetrect(r, 4); memimagedraw(gscreen, window, memwhite, ZP, memopaque, ZP); memimagedraw(gscreen, Rect(window.min.x, window.min.y, window.max.x, window.min.y+h+5+6), orange, ZP, nil, ZP); freememimage(orange); window = insetrect(window, 5); greet = " Plan 9 Console "; p = addpt(window.min, Pt(10, 0)); q = memsubfontwidth(memdefont, greet); memimagestring(gscreen, p, conscol, ZP, memdefont, greet); flushmemscreen(r); window.min.y += h+6; curpos = window.min; window.max.y = window.min.y+((window.max.y-window.min.y)/h)*h; } static void screenputc(char *buf) { Point p; int w, pos; Rectangle r; static int *xp; static int xbuf[256]; if(xp < xbuf || xp >= &xbuf[sizeof(xbuf)]) xp = xbuf; switch(buf[0]) { case '\n': if(curpos.y+h >= window.max.y) scroll(); curpos.y += h; screenputc("\r"); break; case '\r': xp = xbuf; curpos.x = window.min.x; break; case '\t': p = memsubfontwidth(memdefont, " "); w = p.x; if(curpos.x >= window.max.x-4*w) screenputc("\n"); pos = (curpos.x-window.min.x)/w; pos = 4-(pos%4); *xp++ = curpos.x; r = Rect(curpos.x, curpos.y, curpos.x+pos*w, curpos.y + h); memimagedraw(gscreen, r, back, back->r.min, nil, back->r.min); flushmemscreen(r); curpos.x += pos*w; break; case '\b': if(xp <= xbuf) break; xp--; r = Rect(*xp, curpos.y, curpos.x, curpos.y + h); memimagedraw(gscreen, r, back, back->r.min, nil, back->r.min); flushmemscreen(r); curpos.x = *xp; break; case '\0': break; default: p = memsubfontwidth(memdefont, buf); w = p.x; if(curpos.x >= window.max.x-w) screenputc("\n"); *xp++ = curpos.x; r = Rect(curpos.x, curpos.y, curpos.x+w, curpos.y + h); memimagedraw(gscreen, r, back, back->r.min, nil, back->r.min); memimagestring(gscreen, curpos, conscol, ZP, memdefont, buf); flushmemscreen(r); curpos.x += w; } } static void scroll(void) { int o; Point p; Rectangle r; o = 8*h; r = Rpt(window.min, Pt(window.max.x, window.max.y-o)); p = Pt(window.min.x, window.min.y+o); memimagedraw(gscreen, r, gscreen, p, nil, p); flushmemscreen(r); r = Rpt(Pt(window.min.x, window.max.y-o), window.max); memimagedraw(gscreen, r, back, ZP, nil, ZP); flushmemscreen(r); curpos.y -= o; } . ## diffname bitsy/screen.c 2001/0808 ## diff -e /n/emeliedump/2001/0622/sys/src/9/bitsy/screen.c /n/emeliedump/2001/0808/sys/src/9/bitsy/screen.c 215,221c blankscreen(on == 0); . ## diffname bitsy/screen.c 2001/0809 ## diff -e /n/emeliedump/2001/0808/sys/src/9/bitsy/screen.c /n/emeliedump/2001/0809/sys/src/9/bitsy/screen.c 317a lcd->lccr0 &= ~(0<lccr0 &= ~(1<lcsr & (1<direction |= GPIO_LDD8_o|GPIO_LDD9_o|GPIO_LDD10_o|GPIO_LDD11_o |GPIO_LDD12_o|GPIO_LDD13_o|GPIO_LDD14_o|GPIO_LDD15_o; gpioregs->altfunc |= GPIO_LDD8_o|GPIO_LDD9_o|GPIO_LDD10_o|GPIO_LDD11_o |GPIO_LDD12_o|GPIO_LDD13_o|GPIO_LDD14_o|GPIO_LDD15_o; framebuf->palette[0] = Pal0; . ## diffname bitsy/screen.c 2001/0816 ## diff -e /n/emeliedump/2001/0810/sys/src/9/bitsy/screen.c /n/emeliedump/2001/0816/sys/src/9/bitsy/screen.c 255c // screenputs = bitsyscreenputs; screenputs = nil; . ## diffname bitsy/screen.c 2001/1130 ## diff -e /n/emeliedump/2001/0816/sys/src/9/bitsy/screen.c /n/emeliedump/2001/1130/sys/src/9/bitsy/screen.c 238a gscreen->r = Rect(0, 0, Wid, Ht); gscreen->clipr = gscreen->r; gscreen->width = Wid/2; . 236c while (i < Wid*Ht*2/3) framebuf->pixel[i++] = 0xffff; /* white */ . 233a gscreen->r = Rect(0, 0, Ht, Wid); gscreen->clipr = gscreen->r; gscreen->width = Ht/2; . 230a . 186a gscreen->width = Wid/2; . 182a gscreen->width = Ht/2; . 126,129c 0, /* zero */ Wid/2, /* width */ 0, /* layer */ 0, /* flags */ . 119,123c { 0, 0, Wid, Ht }, /* r */ { 0, 0, Wid, Ht }, /* clipr */ 16, /* depth */ 3, /* nchan */ RGB16, /* chan */ . 19c int landscape = 1; /* orientation of the screen, default is 0: portait */ . ## diffname bitsy/screen.c 2002/1205 ## diff -e /n/emeliedump/2001/1130/sys/src/9/bitsy/screen.c /n/emeliedump/2002/1205/sys/src/9/bitsy/screen.c 492c memimagedraw(gscreen, r, back, ZP, nil, ZP, S); . 489c memimagedraw(gscreen, r, gscreen, p, nil, p, S); . 472c memimagedraw(gscreen, r, back, back->r.min, nil, back->r.min, S); . 457c memimagedraw(gscreen, r, back, back->r.min, nil, back->r.min, S); . 448c memimagedraw(gscreen, r, back, back->r.min, nil, back->r.min, S); . 401c window.max.x, window.min.y+h+5+6), orange, ZP, nil, ZP, S); . 398c memimagedraw(gscreen, window, memwhite, ZP, memopaque, ZP, S); . 396c memimagedraw(gscreen, r, memblack, ZP, memopaque, ZP, S); .