| plan 9 kernel history: overview | file list | diff list |
1992/0813/ss/screen.c (diff list | history)
| ss/screen.c on 1990/1223 | ||
| 1990/1223 | #include "u.h" | |
| 1992/0321 | #include "../port/lib.h" | |
| 1990/1223 | #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" | |
| 1992/0111 | #include "../port/error.h" | |
| 1990/1223 | ||
| 1992/0211 | #include <libg.h> | |
| 1990/1223 | #include <gnot.h> | |
| 1991/0708 | #include "screen.h" | |
| 1990/1223 | #define MINX 8 | |
| 1992/0208 | extern GSubfont defont0; GSubfont *defont; | |
| 1990/1223 | struct{ Point pos; int bwid; }out; | |
| 1992/0813 | static ulong rep(ulong, int); void (*kprofp)(ulong); | |
| 1990/1223 | ||
| 1992/0813 | /* Brooktree 458/451 */ typedef struct DAC DAC; struct DAC { uchar pad[16]; ulong dacaddr; /* DAC address register */ ulong daccolor; /* DAC color palette */ ulong daccntrl; /* DAC control register */ ulong dacovrl; /* DAC overlay palette */ }*dac; | |
| 1992/0810 | GBitmap gscreen; struct screens | |
| 1990/1223 | { | |
| 1992/0812 | char *type; | |
| 1992/0810 | int x; int y; int ld; | |
| 1992/0813 | ulong dacaddr; | |
| 1992/0810 | }screens[] = { | |
| 1992/0813 | { "bwtwo", 1152, 900, 0, 0x400000 }, { "cgsix", 1152, 900, 3, 0x400000 }, { "cgthree", 1152, 900, 3, 0x200000 }, | |
| 1990/1223 | 0 }; | |
| 1991/1228 | Lock screenlock; | |
| 1990/1223 | void | |
| 1992/0812 | screeninit(char *str) | |
| 1990/1223 | { | |
| 1992/0810 | struct screens *s; | |
| 1992/0813 | ulong n, r, g, b; int i; int havecol; | |
| 1992/0810 | for(s=screens; s->type; s++) | |
| 1992/0812 | if(strcmp(s->type, str) == 0) | |
| 1992/0810 | goto found; /* default is 0th element of table */ if(conf.monitor){ s = screens; goto found; | |
| 1992/0811 | } | |
| 1992/0810 | conf.monitor = 0; return; found: gscreen.zero = 0; | |
| 1992/0812 | gscreen.width = (s->x<<s->ld)/(8*sizeof(ulong)); n = sizeof(ulong) * gscreen.width * s->y; gscreen.base = (ulong*)kmapregion(DISPLAYRAM, n, PTENOCACHE|PTEIO); | |
| 1992/0810 | gscreen.ldepth = s->ld; gscreen.r = Rect(0, 0, s->x, s->y); gscreen.clipr = gscreen.r; gscreen.cache = 0; | |
| 1990/1226 | defont = &defont0; | |
| 1990/1223 | gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, 0); out.pos.x = MINX; out.pos.y = 0; out.bwid = defont0.info[' '].width; | |
| 1992/0813 | dac = (DAC*)kmappa(FRAMEBUF+s->dacaddr, PTENOCACHE|PTEIO); if(gscreen.ldepth == 3){ havecol = 0; if(havecol) { /* * For now, just use a fixed colormap, where pixel i is * regarded as 3 bits of red, 3 bits of green, and 2 bits of blue. * Intensities are inverted so that 0 means white, 255 means black. * Exception: pixels 85 and 170 are set to intermediate grey values * so that 2-bit grey scale images will look ok on this screen. */ for(i = 0; i<256; i++) { r = ~rep((i>>5) & 7, 3); g = ~rep((i>>2) & 7, 3); b = ~rep(i & 3, 2); setcolor(i, r, g, b); } setcolor(85, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA); setcolor(170, 0x55555555, 0x55555555, 0x55555555); } else { dac->dacaddr = 4; dac->daccntrl = 0xFF; dac->dacaddr = 5; dac->daccntrl = 0x00; dac->dacaddr = 6; dac->daccntrl = 0x40; dac->dacaddr = 7; dac->daccntrl = 0x00; dac->dacaddr = 0; for(i=0; i<252; i+=4) { dac->daccolor = ~rep(i,8); dac->daccolor = ~rep(i,8); dac->daccolor = ~rep(i,8); } /* for(i = 0; i<256; i++) setcolor(i, ~rep(i,8), ~rep(i,8), ~rep(i,8)); */ } } | |
| 1990/1223 | } void | |
| 1992/0813 | mapdump(void) { int i; dac->dacaddr = 0; for(i=0; i<100; i++) print("%lux ", dac->daccolor); } void | |
| 1991/1228 | screenputnl(void) { | |
| 1992/0807 | if(!conf.monitor) return; | |
| 1991/1228 | out.pos.x = MINX; out.pos.y += defont0.height; if(out.pos.y > gscreen.r.max.y-defont0.height) out.pos.y = gscreen.r.min.y; gbitblt(&gscreen, Pt(0, out.pos.y), &gscreen, Rect(0, out.pos.y, gscreen.r.max.x, out.pos.y+2*defont0.height), 0); } void | |
| 1991/0604 | screenputs(char *s, int n) | |
| 1990/1223 | { | |
| 1991/1223 | Rune r; int i; char buf[4]; | |
| 1992/0807 | if(!conf.monitor) return; | |
| 1991/1228 | lock(&screenlock); | |
| 1991/1223 | while(n > 0){ i = chartorune(&r, s); if(i == 0){ s++; --n; continue; } memmove(buf, s, i); buf[i] = 0; n -= i; s += i; | |
| 1991/1228 | if(r == '\n') screenputnl(); else if(r == '\t'){ | |
| 1991/1223 | out.pos.x += (8-((out.pos.x-MINX)/out.bwid&7))*out.bwid; if(out.pos.x >= gscreen.r.max.x) | |
| 1991/1228 | screenputnl(); | |
| 1991/1223 | }else if(r == '\b'){ if(out.pos.x >= out.bwid+MINX){ out.pos.x -= out.bwid; | |
| 1992/0208 | gsubfstring(&gscreen, out.pos, defont, " ", S); | |
| 1991/1223 | } }else{ if(out.pos.x >= gscreen.r.max.x-out.bwid) | |
| 1991/1228 | screenputnl(); | |
| 1992/0208 | out.pos = gsubfstring(&gscreen, out.pos, defont, buf, S); | |
| 1991/1223 | } } | |
| 1991/1228 | unlock(&screenlock); | |
| 1990/1223 | } | |
| 1990/1231 | /* | |
| 1991/0112 | * Map is indexed by keyboard char, output is ASCII. | |
| 1992/0813 | * Plan 9-isms: * Return sends newline and Line Feed sends carriage return. | |
| 1991/0112 | * Delete and Backspace both send backspace. * Num Lock sends delete (rubout). * Alt Graph is VIEW (scroll). | |
| 1992/0813 | * Compose builds Unicode characters. | |
| 1990/1231 | */ uchar keymap[128] = { /* 00 L1 02 L2 04 F1 F2 07 */ 0xFF, 0x80, 0xFF, 0x81, 0xFF, 0x82, 0x83, 0xFF, | |
| 1991/0112 | /* F3 09 F4 0b F5 altgr F6 0f */ 0x84, 0xFF, 0x85, 0xFF, 0x86, 0x80, 0x87, 0xFF, | |
| 1990/1231 | /* F7 F8 F9 Alt 14 R1 R2 R3 */ 0x88, 0x89, 0x8a, 0x8b, 0xFF, 0x8c, 0x8d, 0x8e, /* 18 L3 L4 1b 1c Esc 1 2 */ 0xFF, 0x8f, 0x90, 0xFF, 0xFF, 0x1b, '1', '2', /* 3 4 5 6 7 8 9 0 */ '3', '4', '5', '6', '7', '8', '9', '0', /* - = ` bs 2c R4 R5 R6 */ '-', '=', '`', '\b', 0xFF, 0x91, 0x92, 0x93, | |
| 1991/0112 | /* 30 L5 del L6 34 tab q w */ 0xFF, 0x94, 0xFF, 0x95, 0xFF, '\t', 'q', 'w', | |
| 1990/1231 | /* e r t y u i o p */ 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', | |
| 1991/0112 | /* [ ] dele comp R7 R8 R9 r - */ '[', ']', '\b', 0xB6, 0x96, 0x97, 0x98, 0xFF, | |
| 1990/1231 | /* L7 L8 4a 4b ctrl a s d */ 0x99, 0x9a, 0xFF, 0xFF, 0xF0, 'a', 's', 'd', /* f g h j k l ; ' */ 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', | |
| 1991/0112 | /* \ ret enter R10 R11 R12 ins L9 */ | |
| 1990/1231 | '\\', '\n', 0xFF, 0x9b, 0x9c, 0x9d, 0xFF, 0x9e, | |
| 1991/0112 | /* 60 L10 numlk shift z x c v */ 0xFF, 0x9f, 0x7F, 0xF1, 'z', 'x', 'c', 'v', | |
| 1990/1231 | /* b n m , . / shift lf */ 'b', 'n', 'm', ',', '.', '/', 0xF1, '\r', | |
| 1991/0112 | /* R13 R14 R15 73 74 75 help caps */ | |
| 1990/1231 | 0xA0, 0xA1, 0xA2, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, | |
| 1991/0112 | /* lloz 79 rloz 7b 7c r + 7e 7f */ | |
| 1990/1231 | 0xA3, ' ', 0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; uchar keymapshift[128] = { /* 00 L1 02 L2 04 F1 F2 07 */ 0xFF, 0x80, 0xFF, 0x81, 0xFF, 0x82, 0x83, 0xFF, | |
| 1991/0112 | /* F3 09 F4 0b F5 altgr F6 0f */ 0x84, 0xFF, 0x85, 0xFF, 0x86, 0x80, 0x87, 0xFF, | |
| 1990/1231 | /* F7 F8 F9 Alt 14 R1 R2 R3 */ 0x88, 0x89, 0x8a, 0x8b, 0xFF, 0x8c, 0x8d, 0x8e, /* 18 L3 L4 1b 1c Esc 1 2 */ 0xFF, 0x8f, 0x90, 0xFF, 0xFF, 0x1b, '!', '@', /* 3 4 5 6 7 8 9 0 */ '#', '$', '%', '^', '&', '*', '(', ')', /* - = ` bs 2c R4 R5 R6 */ '_', '+', '~', '\b', 0xFF, 0x91, 0x92, 0x93, | |
| 1991/0112 | /* 30 L5 del L6 34 tab q w */ 0xFF, 0x94, 0xFF, 0x95, 0xFF, '\t', 'Q', 'W', | |
| 1990/1231 | /* e r t y u i o p */ 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', | |
| 1991/0112 | /* [ ] dele comp R7 R8 R9 r - */ '{', '}', '\b', 0xB6, 0x96, 0x97, 0x98, 0xFF, | |
| 1990/1231 | /* L7 L8 4a 4b ctrl a s d */ 0x99, 0x9a, 0xFF, 0xFF, 0xF0, 'A', 'S', 'D', /* f g h j k l ; ' */ 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', | |
| 1991/0112 | /* \ ret enter R10 R11 R12 ins L9 */ | |
| 1990/1231 | '|', '\n', 0xFF, 0x9b, 0x9c, 0x9d, 0xFF, 0x9e, | |
| 1991/0112 | /* 60 L10 numlk shift z x c v */ 0xFF, 0x9f, 0x7F, 0xF1, 'Z', 'X', 'C', 'V', | |
| 1990/1231 | /* b n m , . / shift lf */ 'B', 'N', 'M', '<', '>', '?', 0xF1, '\r', | |
| 1991/0112 | /* R13 R14 R15 73 74 75 help caps */ | |
| 1990/1231 | 0xA0, 0xA1, 0xA2, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, | |
| 1991/0112 | /* lloz 79 rloz 7b 7c r + 7e 7f */ | |
| 1990/1231 | 0xA3, ' ', 0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; uchar keymapctrl[128] = { /* 00 L1 02 L2 04 F1 F2 07 */ 0xFF, 0x80, 0xFF, 0x81, 0xFF, 0x82, 0x83, 0xFF, | |
| 1991/0112 | /* F3 09 F4 0b F5 altgr F6 0f */ 0x84, 0xFF, 0x85, 0xFF, 0x86, 0x80, 0x87, 0xFF, | |
| 1990/1231 | /* F7 F8 F9 Alt 14 R1 R2 R3 */ 0x88, 0x89, 0x8a, 0x8b, 0xFF, 0x8c, 0x8d, 0x8e, /* 18 L3 L4 1b 1c Esc 1 2 */ 0xFF, 0x8f, 0x90, 0xFF, 0xFF, 0x1b, '!', '@', /* 3 4 5 6 7 8 9 0 */ '#', '$', '%', '^', '&', '*', '(', ')', /* - = ` bs 2c R4 R5 R6 */ '_', '+', '~', '\b', 0xFF, 0x91, 0x92, 0x93, | |
| 1991/0112 | /* 30 L5 del L6 34 tab q w */ 0xFF, 0x94, 0xFF, 0x95, 0xFF, '\t', 0x11, 0x17, | |
| 1990/1231 | /* e r t y u i o p */ 0x05, 0x12, 0x14, 0x19, 0x15, 0x09, 0x0F, 0x10, | |
| 1991/0112 | /* [ ] dele comp R7 R8 R9 r - */ 0x1B, 0x1D, '\b', 0xB6, 0x96, 0x97, 0x98, 0xFF, | |
| 1990/1231 | /* L7 L8 4a 4b ctrl a s d */ 0x99, 0x9a, 0xFF, 0xFF, 0xF0, 0x01, 0x13, 0x04, /* f g h j k l ; ' */ 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C,':', '"', | |
| 1991/0112 | /* \ ret enter R10 R11 R12 ins L9 */ | |
| 1990/1231 | 0x1C, '\n', 0xFF, 0x9b, 0x9c, 0x9d, 0xFF, 0x9e, | |
| 1991/0112 | /* 60 L10 numlk shift z x c v */ 0xFF, 0x9f, 0x7F, 0xF1, 0x1A, 0x18, 0x03, 0x16, | |
| 1990/1231 | /* b n m , . / shift lf */ 0x02, 0x0E, 0x0D, '<', '>', '?', 0xF1, '\r', | |
| 1991/0112 | /* R13 R14 R15 73 74 75 help caps */ | |
| 1990/1231 | 0xA0, 0xA1, 0xA2, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, | |
| 1991/0112 | /* lloz 79 rloz 7b 7c r + 7e 7f */ | |
| 1990/1231 | 0xA3, ' ', 0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; uchar keymapshiftctrl[128] = { /* 00 L1 02 L2 04 F1 F2 07 */ 0xFF, 0x80, 0xFF, 0x81, 0xFF, 0x82, 0x83, 0xFF, | |
| 1991/0112 | /* F3 09 F4 0b F5 altgr F6 0f */ 0x84, 0xFF, 0x85, 0xFF, 0x86, 0x80, 0x87, 0xFF, | |
| 1990/1231 | /* F7 F8 F9 Alt 14 R1 R2 R3 */ 0x88, 0x89, 0x8a, 0x8b, 0xFF, 0x8c, 0x8d, 0x8e, /* 18 L3 L4 1b 1c Esc 1 2 */ 0xFF, 0x8f, 0x90, 0xFF, 0xFF, 0x1b, '!', 0x00, /* 3 4 5 6 7 8 9 0 */ '#', '$', '%', 0x1E, '&', '*', '(', ')', /* - = ` bs 2c R4 R5 R6 */ 0x1F, '+', '~', '\b', 0xFF, 0x91, 0x92, 0x93, | |
| 1991/0112 | /* 30 L5 del L6 34 tab q w */ 0xFF, 0x94, 0xFF, 0x95, 0xFF, '\t', 0x11, 0x17, | |
| 1990/1231 | /* e r t y u i o p */ 0x05, 0x12, 0x14, 0x19, 0x15, 0x09, 0x0F, 0x10, | |
| 1991/0112 | /* [ ] dele comp R7 R8 R9 r - */ 0x1B, 0x1D, '\b', 0xB6, 0x96, 0x97, 0x98, 0xFF, | |
| 1990/1231 | /* L7 L8 4a 4b ctrl a s d */ 0x99, 0x9a, 0xFF, 0xFF, 0xF0, 0x01, 0x13, 0x04, /* f g h j k l ; ' */ 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C,':', '"', | |
| 1991/0112 | /* \ ret enter R10 R11 R12 ins L9 */ 0x1C, '\n', 0xFF, 0x9b, 0x9c, 0x9d, 0xFF, 0x9e, /* 60 L10 numlk shift z x c v */ 0xFF, 0x9f, 0x7F, 0xF1, 0x1A, 0x18, 0x03, 0x16, | |
| 1990/1231 | /* b n m , . / shift lf */ 0x02, 0x0E, 0x0D, '<', '>', '?', 0xF1, '\r', | |
| 1991/0112 | /* R13 R14 R15 73 74 75 help caps */ | |
| 1990/1231 | 0xA0, 0xA1, 0xA2, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, | |
| 1991/0112 | /* lloz 79 rloz 7b 7c r + 7e 7f */ | |
| 1990/1231 | 0xA3, ' ', 0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; static uchar *kbdmap[4] = { keymap, keymapshift, keymapctrl, keymapshiftctrl }; | |
| 1991/0604 | int kbdstate(IOQ *q, int c) | |
| 1990/1231 | { static shift = 0x00; static caps = 0; static long startclick; | |
| 1991/0713 | static int repeatc; | |
| 1991/1211 | static int lstate; static uchar kc[4]; | |
| 1992/0711 | uchar ch; | |
| 1991/1211 | int i, nk; | |
| 1990/1231 | ||
| 1992/0711 | USED(q); | |
| 1991/1211 | ch = kbdmap[shift][c&0x7F]; | |
| 1990/1231 | if(c==0x7F){ /* all keys up */ | |
| 1991/0713 | norepeat: kbdrepeat(0); | |
| 1992/0711 | return 0; | |
| 1990/1231 | } | |
| 1991/1211 | if(ch == 0xFF) /* shouldn't happen; ignore */ | |
| 1992/0711 | return 0; | |
| 1990/1231 | if(c & 0x80){ /* key went up */ | |
| 1991/1211 | if(ch == 0xF0){ /* control */ | |
| 1990/1231 | shift &= ~2; | |
| 1991/0713 | goto norepeat; | |
| 1990/1223 | } | |
| 1991/1211 | if(ch == 0xF1){ /* shift */ | |
| 1990/1231 | shift &= ~1; | |
| 1991/0713 | goto norepeat; | |
| 1990/1231 | } | |
| 1991/1211 | if(ch == 0xF2){ /* caps */ | |
| 1991/0713 | goto norepeat; | |
| 1990/1231 | } | |
| 1991/0713 | goto norepeat; | |
| 1990/1223 | } | |
| 1991/1211 | if(ch == 0xF0){ /* control */ | |
| 1990/1231 | shift |= 2; | |
| 1991/0713 | goto norepeat; | |
| 1990/1223 | } | |
| 1991/1211 | if(ch==0xF1){ /* shift */ | |
| 1990/1231 | shift |= 1; | |
| 1991/0713 | goto norepeat; | |
| 1990/1231 | } | |
| 1991/1211 | if(ch==0xF2){ /* caps */ | |
| 1990/1231 | caps ^= 1; | |
| 1991/0713 | goto norepeat; | |
| 1990/1231 | } | |
| 1991/1211 | if(caps && 'a'<=ch && ch<='z') ch |= ' '; repeatc = ch; | |
| 1991/0713 | kbdrepeat(1); | |
| 1991/1211 | if(ch == 0xB6) /* Compose */ lstate = 1; | |
| 1991/0112 | else{ | |
| 1991/1211 | switch(lstate){ | |
| 1991/0112 | case 1: | |
| 1991/1211 | kc[0] = ch; lstate = 2; if(ch == 'X') lstate = 3; | |
| 1991/0112 | break; case 2: | |
| 1991/1211 | kc[1] = ch; c = latin1(kc); nk = 2; putit: lstate = 0; if(c != -1) kbdputc(&kbdq, c); else for(i=0; i<nk; i++) kbdputc(&kbdq, kc[i]); break; case 3: case 4: case 5: kc[lstate-2] = ch; lstate++; break; case 6: kc[4] = ch; c = unicode(kc); nk = 5; goto putit; | |
| 1991/0112 | default: | |
| 1991/1211 | kbdputc(&kbdq, ch); break; | |
| 1991/0112 | } } | |
| 1992/0711 | return 0; | |
| 1991/0604 | } void buzz(int freq, int dur) { | |
| 1992/0703 | USED(freq, dur); | |
| 1991/0604 | } void lights(int mask) { | |
| 1992/0703 | USED(mask); | |
| 1991/0707 | } int screenbits(void) { return 1; /* bits per pixel */ } void getcolor(ulong p, ulong *pr, ulong *pg, ulong *pb) { | |
| 1992/0813 | uchar r, g, b; | |
| 1991/0707 | ulong ans; /* * The slc monochrome says 0 is white (max intensity) */ | |
| 1992/0813 | if(1 || gscreen.ldepth == 0) { if(p == 0) ans = ~0; else ans = 0; *pr = *pg = *pb = ans; } else { *(uchar *)&dac->dacaddr = p & 0xFF; r = *(uchar *)&dac->daccolor; g = *(uchar *)&dac->daccolor; b = *(uchar *)&dac->daccolor; *pr = (r<<24) | (r<<16) | (r<<8) | r; *pg = (g<<24) | (g<<16) | (g<<8) | g; *pb = (b<<24) | (b<<16) | (b<<8) | b; } | |
| 1991/0707 | } int setcolor(ulong p, ulong r, ulong g, ulong b) { | |
| 1992/0813 | if(1 || gscreen.ldepth == 0) return 0; /* can't change mono screen colormap */ else { /* perhaps not reliable unless done while vertical blanking ? */ *(uchar *)&dac->dacaddr = p & 0xFF; /* *(uchar *)&dac->daccolor = r >> 24; *(uchar *)&dac->daccolor = g >> 24; *(uchar *)&dac->daccolor = b >> 24; */ return 1; } | |
| 1991/0707 | } int hwcursset(uchar *s, uchar *c, int ox, int oy) { | |
| 1992/0711 | USED(s, c, ox, oy); | |
| 1991/0707 | return 0; } int hwcursmove(int x, int y) { | |
| 1992/0711 | USED(x, y); | |
| 1991/0707 | return 0; } void mouseclock(void) /* called splhi */ { mouseupdate(1); | |
| 1992/0813 | } /* replicate (from top) value in v (n bits) until it fills a ulong */ static ulong rep(ulong v, int n) { int o; ulong rv; rv = 0; for(o = 32 - n; o >= 0; o -= n) rv |= (v << o); return rv; | |
| 1990/1223 | } | |