## diffname ss/screen.c 1990/1223 ## diff -e /dev/null /n/bootesdump/1990/1223/sys/src/9/sparc/screen.c 0a #include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" #include "ureg.h" #include "errno.h" #include #include #define MINX 8 extern GFont defont0; GFont *defont; struct{ Point pos; int bwid; }out; void duartinit(void); int duartacr; int duartimr; void (*kprofp)(ulong); GBitmap gscreen = { (ulong*)((4*1024*1024-256*1024)|KZERO), /* BUG */ 0, 64, 0, 0, 0, 1024, 1024, 0 }; void screeninit(void) { duartinit(); /* * Read HEX switch to set ldepth */ if(*(uchar*)MOUSE & (1<<4)) gscreen.ldepth = 1; defont = &defont0; /* save space; let bitblt do the conversion work */ gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, 0); out.pos.x = MINX; out.pos.y = 0; out.bwid = defont0.info[' '].width; } void screenputc(int c) { char buf[2]; int nx; if(c == '\n'){ 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); }else if(c == '\t'){ out.pos.x += (8-((out.pos.x-MINX)/out.bwid&7))*out.bwid; if(out.pos.x >= gscreen.r.max.x) screenputc('\n'); }else if(c == '\b'){ if(out.pos.x >= out.bwid+MINX){ out.pos.x -= out.bwid; screenputc(' '); out.pos.x -= out.bwid; } }else{ if(out.pos.x >= gscreen.r.max.x-out.bwid) screenputc('\n'); buf[0] = c&0x7F; buf[1] = 0; out.pos = gbitbltstring(&gscreen, out.pos, defont, buf, S); } } /* * Register set for half the duart. There are really two sets. */ struct Duart{ uchar mr1_2; /* Mode Register Channels 1 & 2 */ uchar sr_csr; /* Status Register/Clock Select Register */ uchar cmnd; /* Command Register */ uchar data; /* RX Holding / TX Holding Register */ uchar ipc_acr; /* Input Port Change/Aux. Control Register */ #define ivr ivr /* Interrupt Vector Register */ uchar is_imr; /* Interrupt Status/Interrupt Mask Register */ #define ip_opcr is_imr /* Input Port/Output Port Configuration Register */ uchar ctur; /* Counter/Timer Upper Register */ #define scc_sopbc ctur /* Start Counter Command/Set Output Port Bits Command */ uchar ctlr; /* Counter/Timer Lower Register */ #define scc_ropbc ctlr /* Stop Counter Command/Reset Output Port Bits Command */ }; enum{ CHAR_ERR =0x00, /* MR1x - Mode Register 1 */ PAR_ENB =0x00, EVEN_PAR =0x00, ODD_PAR =0x04, NO_PAR =0x10, CBITS8 =0x03, CBITS7 =0x02, CBITS6 =0x01, CBITS5 =0x00, NORM_OP =0x00, /* MR2x - Mode Register 2 */ TWOSTOPB =0x0F, ONESTOPB =0x07, ENB_RX =0x01, /* CRx - Command Register */ DIS_RX =0x02, ENB_TX =0x04, DIS_TX =0x08, RESET_MR =0x10, RESET_RCV =0x20, RESET_TRANS =0x30, RESET_ERR =0x40, RESET_BCH =0x50, STRT_BRK =0x60, STOP_BRK =0x70, RCV_RDY =0x01, /* SRx - Channel Status Register */ FIFOFULL =0x02, XMT_RDY =0x04, XMT_EMT =0x08, OVR_ERR =0x10, PAR_ERR =0x20, FRM_ERR =0x40, RCVD_BRK =0x80, BD38400 =0xCC|0x0000, BD19200 =0xCC|0x0100, BD9600 =0xBB|0x0000, BD4800 =0x99|0x0000, BD2400 =0x88|0x0000, BD1200 =0x66|0x0000, BD300 =0x44|0x0000, IM_IPC =0x80, /* IMRx/ISRx - Interrupt Mask/Interrupt Status */ IM_DBB =0x40, IM_RRDYB =0x20, IM_XRDYB =0x10, IM_CRDY =0x08, IM_DBA =0x04, IM_RRDYA =0x02, IM_XRDYA =0x01, }; uchar keymap[]={ /*80*/ 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x8e, 0x58, /*90*/ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x58, 0x58, 0x58, 0x58, /*A0*/ 0x58, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0xae, 0xaf, /*B0*/ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0x80, 0xb7, 0xb8, 0xb9, 0x00, 0xbb, 0x1e, 0xbd, 0x60, 0x1f, /*C0*/ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0x58, 0xc6, 0x0a, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /*D0*/ 0x09, 0x08, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x7f, 0x58, /*E0*/ 0x58, 0x58, 0xe2, 0x1b, 0x0d, 0xe5, 0x58, 0x0a, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /*F0*/ 0x09, 0x08, 0xb2, 0x1b, 0x0d, 0xf5, 0x81, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x7f, 0xb2, }; void duartinit(void) { Duart *duart; duart = DUARTREG; /* * Keyboard */ duart[0].cmnd = RESET_RCV|DIS_TX|DIS_RX; duart[0].cmnd = RESET_TRANS; duart[0].cmnd = RESET_ERR; duart[0].cmnd = RESET_MR; duart[0].mr1_2 = CHAR_ERR|PAR_ENB|EVEN_PAR|CBITS8; duart[0].mr1_2 = NORM_OP|ONESTOPB; duart[0].sr_csr = BD4800; /* * RS232 */ duart[1].cmnd = RESET_RCV|DIS_TX|DIS_RX; duart[1].cmnd = RESET_TRANS; duart[1].cmnd = RESET_ERR; duart[1].cmnd = RESET_MR; duart[1].mr1_2 = CHAR_ERR|NO_PAR|CBITS8; duart[1].mr1_2 = NORM_OP|ONESTOPB; duart[1].sr_csr = BD9600; /* * Output port */ duart[0].ipc_acr = duartacr = 0xB7; /* allow change of state interrupt */ duart[1].ip_opcr = 0x00; duart[1].scc_ropbc = 0xFF; /* make sure the port is reset first */ duart[1].scc_sopbc = 0x04; /* dtr = 1, pp = 01 */ duart[0].is_imr = duartimr = IM_IPC|IM_RRDYB|IM_XRDYB|IM_RRDYA|IM_XRDYA; duart[0].cmnd = ENB_TX|ENB_RX; /* enable TX and RX last */ duart[1].cmnd = ENB_TX|ENB_RX; /* * Initialize keyboard */ while (!(duart[0].sr_csr & (XMT_EMT|XMT_RDY))) ; duart[0].data = 0x02; } int duartinputport(void) { Duart *duart = DUARTREG; return duart[1].ip_opcr; } void duartbaud(int b) { int x; Duart *duart = DUARTREG; x = 0; /* set */ switch(b){ case 38400: x = BD38400; break; case 19200: x = BD19200; break; case 9600: x = BD9600; break; case 4800: x = BD4800; break; case 2400: x = BD2400; break; case 1200: x = BD1200; break; case 300: x = BD300; break; default: error(Ebadarg); } if(x & 0x0100) duart[0].ipc_acr = duartacr |= 0x80; else duart[0].ipc_acr = duartacr &= ~0x80; duart[1].sr_csr = x; } void duartdtr(int val) { Duart *duart = DUARTREG; if (val) duart[1].scc_ropbc=0x01; else duart[1].scc_sopbc=0x01; } void duartbreak(int ms) { static QLock brk; Duart *duart = DUARTREG; if (ms<=0 || ms >20000) error(Ebadarg); qlock(&brk); duart[0].is_imr = duartimr &= ~IM_XRDYB; duart[1].cmnd = STRT_BRK|ENB_TX; tsleep(&u->p->sleep, return0, 0, ms); duart[1].cmnd = STOP_BRK|ENB_TX; duart[0].is_imr = duartimr |= IM_XRDYB; qunlock(&brk); } enum{ Kptime=200 }; void duartstarttimer(void) { Duart *duart; char x; duart = DUARTREG; duart[0].ctur = (Kptime)>>8; duart[0].ctlr = (Kptime)&255; duart[0].is_imr = duartimr |= IM_CRDY; x = duart[1].scc_sopbc; } void duartstoptimer(void) { Duart *duart; char x; duart = DUARTREG; x = duart[1].scc_ropbc; duart[0].is_imr = duartimr &= ~IM_CRDY; } void duartrs232intr(void) { int c; Duart *duart; duart = DUARTREG; c = getrs232o(); if(c == -1) duart[1].cmnd = DIS_TX; else duart[1].data = c; } void duartstartrs232o(void) { DUARTREG[1].cmnd = ENB_TX; duartrs232intr(); } void duartintr(Ureg *ur) { int cause, status, c; Duart *duart; duart = DUARTREG; cause = duart->is_imr; /* * I can guess your interrupt. */ /* * Is it 0? */ if(cause & IM_CRDY){ if(kprofp) (*kprofp)(ur->pc); c = duart[1].scc_ropbc; duart[0].ctur = (Kptime)>>8; duart[0].ctlr = (Kptime)&255; c = duart[1].scc_sopbc; return; } /* * Is it 1? */ if(cause & IM_RRDYA){ /* keyboard input */ status = duart->sr_csr; c = duart->data; if(status & (FRM_ERR|OVR_ERR|PAR_ERR)) duart->cmnd = RESET_ERR; if(status & PAR_ERR) /* control word: caps lock (0x4) or repeat (0x10) */ kbdrepeat((c&0x10) == 0); else{ if(c == 0x7F) c = 0xFF; /* VIEW key (bizarre) */ if(c & 0x80) c = keymap[c&0x7F]; kbdchar(c); } } /* * Is it 2? */ if(cause & IM_RRDYB){ /* rs232 input */ status = duart[1].sr_csr; c = duart[1].data; if(status & (FRM_ERR|OVR_ERR|PAR_ERR)) duart[1].cmnd = RESET_ERR; else rs232ichar(c); } /* * Is it 3? */ if(cause & IM_XRDYB) /* rs232 output */ duartrs232intr(); /* * Is it 4? */ if(cause & IM_XRDYA) duart[0].cmnd = DIS_TX; /* * Is it 5? */ if(cause & IM_IPC) mousebuttons((~duart[0].ipc_acr) & 7); } . ## diffname ss/screen.c 1990/1226 ## diff -e /n/bootesdump/1990/1223/sys/src/9/sparc/screen.c /n/bootesdump/1990/1226/sys/src/9/sparc/screen.c 83c out.pos = gstring(&gscreen, out.pos, defont, buf, S); . 42,48c /* duartinit(); /**/ defont = &defont0; . 35c {0, 0, 1160, 900}, . 33c 1160/32, . 31c (ulong*)SCREENSEGM, . ## diffname ss/screen.c 1990/1231 ## diff -e /n/bootesdump/1990/1226/sys/src/9/sparc/screen.c /n/bootesdump/1990/1231/sys/src/9/sparc/screen.c 387,401c if(tc==0xF1){ /* shift */ shift |= 1; repeatc = -1; return; } if(tc==0xF2){ /* caps */ caps ^= 1; repeatc =- 1; return; } if(caps && 'a'<=tc && tc<='z') tc |= ' '; repeatc = tc; /* startclick = clicks; */ if(tc == 0x10) /* ctrl-p */ reset(); kbdchar(tc); . 376,385c if(tc == 0xF0){ /* control */ shift |= 2; repeatc = -1; return; . 374a if(tc == 0xF1){ /* shift */ shift &= ~1; repeatc = -1; return; } if(tc == 0xF2){ /* caps */ repeatc = -1; return; } if(tc == repeatc) repeatc = -1; return; . 358,373c */ if(c==0x7F){ /* all keys up */ repeatc = -1; return; } if(tc == 0xFF) /* shouldn't happen; ignore */ return; if(c & 0x80){ /* key went up */ if(tc == 0xF0){ /* control */ shift &= ~2; repeatc =- 1; return; . 349,355c dp = &duart[1]; if(cause & ExtPendB) duartwrreg(dp, 0, ResExtPend); if(cause & RxPendB){ ch = *dp->data; mousechar(ch); } if(cause & TxPendB) duartwrreg(dp, 0, ResTxPend); } /* * Map is indexed by keyboard char, output is ASCII */ uchar keymap[128] = { /* 00 L1 02 L2 04 F1 F2 07 */ 0xFF, 0x80, 0xFF, 0x81, 0xFF, 0x82, 0x83, 0xFF, /* F3 09 F4 0b F5 0d F6 0f */ 0x84, 0xFF, 0x85, 0xFF, 0x86, 0xFF, 0x87, 0xFF, /* 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, /* 30 L5 L6 33 34 tab q w */ 0xFF, 0x94, 0x95, 0xFF, 0xFF, '\t', 'q', 'w', /* e r t y u i o p */ 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', /* [ ] del 43 R7 R8 R9 47 */ '[', ']', 0x7F, 0xFF, 0x96, 0x97, 0x98, 0xFF, /* 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', ';', '\'', /* \ ret 5a R10 R11 R12 5e L9 */ '\\', '\n', 0xFF, 0x9b, 0x9c, 0x9d, 0xFF, 0x9e, /* 60 L10 62 shift z x c v */ 0xFF, 0x9f, 0xFF, 0xF1, 'z', 'x', 'c', 'v', /* b n m , . / shift lf */ 'b', 'n', 'm', ',', '.', '/', 0xF1, '\r', /* R13 R14 R15 73 74 75 76 caps */ 0xA0, 0xA1, 0xA2, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, /* left 79 right 7b 7c 7d 7e 7f */ 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, /* F3 09 F4 0b F5 0d F6 0f */ 0x84, 0xFF, 0x85, 0xFF, 0x86, 0xFF, 0x87, 0xFF, /* 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, /* 30 L5 L6 33 34 tab q w */ 0xFF, 0x94, 0x95, 0xFF, 0xFF, '\t', 'Q', 'W', /* e r t y u i o p */ 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', /* [ ] del 43 R7 R8 R9 47 */ '{', '}', 0x7F, 0xFF, 0x96, 0x97, 0x98, 0xFF, /* 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', ':', '"', /* \ ret 5a R10 R11 R12 5e L9 */ '|', '\n', 0xFF, 0x9b, 0x9c, 0x9d, 0xFF, 0x9e, /* 60 L10 62 shift z x c v */ 0xFF, 0x9f, 0xFF, 0xF1, 'Z', 'X', 'C', 'V', /* b n m , . / shift lf */ 'B', 'N', 'M', '<', '>', '?', 0xF1, '\r', /* R13 R14 R15 73 74 75 76 caps */ 0xA0, 0xA1, 0xA2, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, /* left 79 right 7b 7c 7d 7e 7f */ 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, /* F3 09 F4 0b F5 0d F6 0f */ 0x84, 0xFF, 0x85, 0xFF, 0x86, 0xFF, 0x87, 0xFF, /* 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, /* 30 L5 L6 33 34 tab q w */ 0xFF, 0x94, 0x95, 0xFF, 0xFF, '\t', 0x11, 0x17, /* e r t y u i o p */ 0x05, 0x12, 0x14, 0x19, 0x15, 0x09, 0x0F, 0x10, /* [ ] del 43 R7 R8 R9 47 */ 0x1B, 0x1D, 0x7F, 0xFF, 0x96, 0x97, 0x98, 0xFF, /* 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,':', '"', /* \ ret 5a R10 R11 R12 5e L9 */ 0x1C, '\n', 0xFF, 0x9b, 0x9c, 0x9d, 0xFF, 0x9e, /* 60 L10 62 shift z x c v */ 0xFF, 0x9f, 0xFF, 0xF1, 0x1A, 0x18, 0x03, 0x16, /* b n m , . / shift lf */ 0x02, 0x0E, 0x0D, '<', '>', '?', 0xF1, '\r', /* R13 R14 R15 73 74 75 76 caps */ 0xA0, 0xA1, 0xA2, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, /* left 79 right 7b 7c 7d 7e 7f */ 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, /* F3 09 F4 0b F5 0d F6 0f */ 0x84, 0xFF, 0x85, 0xFF, 0x86, 0xFF, 0x87, 0xFF, /* 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, /* 30 L5 L6 33 34 tab q w */ 0xFF, 0x94, 0x95, 0xFF, 0xFF, '\t', 0x11, 0x17, /* e r t y u i o p */ 0x05, 0x12, 0x14, 0x19, 0x15, 0x09, 0x0F, 0x10, /* [ ] del 43 R7 R8 R9 47 */ 0x1B, 0x1D, 0x7F, 0xFF, 0x96, 0x97, 0x98, 0xFF, /* 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,':', '"', /* \ ret 5a R10 R11 R12 5e L9 */ 0x1C, '\n', 0xFF, 0x9b, 0x9c, 0x9d, 0xFF, 0x9e, /* 60 L10 62 shift z x c v */ 0xFF, 0x9f, 0xFF, 0xF1, 0x1A, 0x18, 0x03, 0x16, /* b n m , . / shift lf */ 0x02, 0x0E, 0x0D, '<', '>', '?', 0xF1, '\r', /* R13 R14 R15 73 74 75 76 caps */ 0xA0, 0xA1, 0xA2, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, /* left 79 right 7b 7c 7d 7e 7f */ 0xA3, ' ', 0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; static uchar *kbdmap[4] = { keymap, keymapshift, keymapctrl, keymapshiftctrl }; void kbdstate(int c) { static shift = 0x00; static caps = 0; static repeatc = -1; static long startclick; int tc; tc = kbdmap[shift][c&0x7F]; /* if(c==0xFFFF && repeatc!=-1 && clicks>startclick+40 && (clicks-startclick)%3==0){ kbdc = repeatc; . 347c * Mouse . 345a dp = &duart[0]; if(cause & ExtPendA) duartwrreg(dp, 0, ResExtPend); if(cause & RxPendA){ ch = *dp->data; kbdstate(ch); } if(cause & TxPendA) duartwrreg(dp, 0, ResTxPend); . 344c * Keyboard . 341,342c cause = duartrdreg(&duart[0], 3); . 338,339c char ch; int cause; Duart *dp; . 336c duartintr(void) . 328,332c /* * enable I/O, 8 bits/character */ dp->sticky[3] = RxEna | Rx8bits; duartwrreg(dp, 3, 0); dp->sticky[5] = TxEna | Tx8bits; duartwrreg(dp, 5, 0); /* * turn on interrupts */ dp->sticky[1] |= TxIntEna | RxIntAllEna; duartwrreg(dp, 1, 0); dp->sticky[9] |= IntEna; duartwrreg(dp, 9, 0); } /* * turn on DTR and RTS */ dp = &duart[1]; dp->sticky[5] |= TxRTS | TxDTR; duartwrreg(dp, 5, 0); . 320,326c for(dp=duart; dp < &duart[2]; dp++){ memset(dp->sticky, 0, sizeof(dp->sticky)); . 314,318c /* * get port addresses */ duart[0].ptr = &zp->ptra; duart[0].data = &zp->dataa; duart[1].ptr = &zp->ptrb; duart[1].data = &zp->datab; . 309,312c k = kmappa(KMDUART, PTEIO|PTENOCACHE); zp = (Z8530*)k->va; . 306,307c Duart *dp; Z8530 *zp; KMap *k; . 304c duartinit(void) . 302a /* * Initialize just keyboard and mouse for now */ . 296,300c brconst = 10000000/(16*2*rate) - 2; duartwrreg(dp, 12, brconst & 0xff); duartwrreg(dp, 13, (brconst>>8) & 0xff); . 293,294c int brconst; . 291c duartsetbaud(Duart *dp, int rate) . 287,289c /* * set the baud rate by calculating and setting the baudrate * generator constant. This will work with fairly non-standard * baud rates. */ . 274,284c *dp->ptr = addr; return *dp->ptr; . 271,272c ushort duartrdreg(Duart *dp, int addr) . 264,268c *dp->ptr = addr; *dp->ptr = dp->sticky[addr] | value; . 262c duartwrreg(Duart *dp, int addr, int value) . 260a /* * Access registers using the pointer in register 0. */ . 228,259c #define PRINTING 0x4 #define MASK 0x1 . 225,226c QLock; ushort sticky[16]; /* sticky write register values */ uchar *ptr; /* command/pointer register in Z8530 */ uchar *data; /* data register in Z8530 */ }; Duart duart[2]; . 219,223c uchar ptrb; uchar dummy1; uchar datab; uchar dummy2; uchar ptra; uchar dummy3; uchar dataa; uchar dummy4; }; #define NDELIM 5 typedef struct Duart Duart; struct Duart . 216,217c /* rr 3 */ ExtPendB= 1, TxPendB= 1<<1, RxPendB= 1<<2, ExtPendA= 1<<3, TxPendA= 1<<4, RxPendA= 1<<5, }; typedef struct Z8530 Z8530; struct Z8530 . 208,214c /* rr 0 */ RxReady= 1, TxReady= 1<<2, RxDCD= 1<<3, RxCTS= 1<<5, RxBreak= 1<<7, . 197,206c /* wr 14 */ BREna= 1, BRSource= 2, . 186,195c /* wr 11 */ TRxCOutBR= 2, TxClockBR= 2<<3, RxClockBR= 2<<5, TRxCOI= 1<<2, . 175,184c /* wr 9 */ IntEna= 1<<3, ResetB= 1<<6, ResetA= 2<<6, HardReset= 3<<6, . 173c /* wr 5 */ TxRTS= 1<<1, TxEna= 1<<3, TxBreak= 1<<4, TxDTR= 1<<7, Tx5bits= 0<<5, Tx7bits= 1<<5, Tx6bits= 2<<5, Tx8bits= 3<<5, . 168,171c /* wr 4 */ SyncMode= 0<<2, Rx1stop= 1<<2, Rx1hstop= 2<<2, Rx2stop= 3<<2, X16= 1<<6, . 149,166c /* wr 3 */ RxEna= 1, Rx5bits= 0<<6, Rx7bits= 1<<6, Rx6bits= 2<<6, Rx8bits= 3<<6, . 100,147c /* wr 1 */ TxIntEna= 1<<1, RxIntDis= 0<<3, RxIntFirstEna= 1<<3, RxIntAllEna= 2<<3, . 85,98c enum { /* wr 0 */ ResExtPend= 2<<3, ResTxPend= 5<<3, ResErr= 6<<3, . 83c * Driver for the Z8530. . 42d 27a void kbdstate(int); . 23d ## diffname ss/screen.c 1991/0110 ## diff -e /n/bootesdump/1990/1231/sys/src/9/sparc/screen.c /n/bootesdump/1991/0110/sys/src/9/sparc/screen.c 292a cause = duartrdreg(&duart[0], 3); . 268a . ## diffname ss/screen.c 1991/0112 ## diff -e /n/bootesdump/1991/0110/sys/src/9/sparc/screen.c /n/bootesdump/1991/0112/sys/src/9/sparc/screen.c 510,512c if(tc == 0xB6) /* Compose */ kbdstate = 1; else{ switch(kbdstate){ case 1: k1 = tc; kbdstate = 2; break; case 2: k2 = tc; tc = latin1(k1, k2); if(c == 0){ kbdchar(k1); tc = k2; } /* fall through */ default: kbdstate = 0; kbdchar(tc); } } . 457d 453a static int kbdstate, k1, k2; . 446a struct latin { uchar l; char c[2]; }latintab[] = { '€', "!!", /* spanish initial ! */ '€', "c|", /* cent */ '€', "c$", /* cent */ '€', "l$", /* pound sterling */ '€', "g$", /* general currency */ '€', "y$", /* yen */ '€', "j$", /* yen */ '€', "||", /* broken vertical bar */ '€', "SS", /* section symbol */ '€', "\"\"", /* dieresis */ '€', "cr", /* copyright */ '€', "cO", /* copyright */ '€', "sa", /* super a, feminine ordinal */ '€', "<<", /* left angle quotation */ '€', "no", /* not sign, hooked overbar */ '€', "--", /* soft hyphen */ '€', "rg", /* registered trademark */ '€', "__", /* macron */ '€', "s0", /* degree (sup o) */ '€', "+-", /* plus-minus */ '€', "s2", /* sup 2 */ '€', "s3", /* sup 3 */ '€', "''", /* grave accent */ '€', "mu", /* mu */ '€', "pg", /* paragraph (pilcrow) */ '€', "..", /* centered . */ '€', ",,", /* cedilla */ '€', "s1", /* sup 1 */ '€', "so", /* sup o */ '€', ">>", /* right angle quotation */ '€', "14", /* 1/4 */ '€', "12", /* 1/2 */ '€', "34", /* 3/4 */ '€', "??", /* spanish initial ? */ '€', "A`", /* A grave */ '€', "A'", /* A acute */ '€', "A^", /* A circumflex */ '€', "A~", /* A tilde */ '€', "A\"", /* A dieresis */ '€', "A:", /* A dieresis */ '€', "Ao", /* A circle */ '€', "AO", /* A circle */ '€', "Ae", /* AE ligature */ '€', "AE", /* AE ligature */ '€', "C,", /* C cedilla */ '€', "E`", /* E grave */ '€', "E'", /* E acute */ '€', "E^", /* E circumflex */ '€', "E\"", /* E dieresis */ '€', "E:", /* E dieresis */ '€', "I`", /* I grave */ '€', "I'", /* I acute */ '€', "I^", /* I circumflex */ '€', "I\"", /* I dieresis */ '€', "I:", /* I dieresis */ '€', "D-", /* Eth */ '€', "N~", /* N tilde */ '€', "O`", /* O grave */ '€', "O'", /* O acute */ '€', "O^", /* O circumflex */ '€', "O~", /* O tilde */ '€', "O\"", /* O dieresis */ '€', "O:", /* O dieresis */ '€', "OE", /* O dieresis */ '€', "Oe", /* O dieresis */ '€', "xx", /* times sign */ '€', "O/", /* O slash */ '€', "U`", /* U grave */ '€', "U'", /* U acute */ '€', "U^", /* U circumflex */ '€', "U\"", /* U dieresis */ '€', "U:", /* U dieresis */ '€', "UE", /* U dieresis */ '€', "Ue", /* U dieresis */ '€', "Y'", /* Y acute */ '€', "P|", /* Thorn */ '€', "Th", /* Thorn */ '€', "TH", /* Thorn */ '€', "ss", /* sharp s */ '€', "a`", /* a grave */ '€', "a'", /* a acute */ '€', "a^", /* a circumflex */ '€', "a~", /* a tilde */ '€', "a\"", /* a dieresis */ '€', "a:", /* a dieresis */ '€', "ao", /* a circle */ '€', "ae", /* ae ligature */ '€', "c,", /* c cedilla */ '€', "e`", /* e grave */ '€', "e'", /* e acute */ '€', "e^", /* e circumflex */ '€', "e\"", /* e dieresis */ '€', "e:", /* e dieresis */ '€', "i`", /* i grave */ '€', "i'", /* i acute */ '€', "i^", /* i circumflex */ '€', "i\"", /* i dieresis */ '€', "i:", /* i dieresis */ '€', "d-", /* eth */ '€', "n~", /* n tilde */ '€', "o`", /* o grave */ '€', "o'", /* o acute */ '€', "o^", /* o circumflex */ '€', "o~", /* o tilde */ '€', "o\"", /* o dieresis */ '€', "o:", /* o dieresis */ '€', "oe", /* o dieresis */ '€', "-:", /* divide sign */ '€', "o/", /* o slash */ '€', "u`", /* u grave */ '€', "u'", /* u acute */ '€', "u^", /* u circumflex */ '€', "u\"", /* u dieresis */ '€', "u:", /* u dieresis */ '€', "ue", /* u dieresis */ '€', "y'", /* y acute */ '€', "th", /* thorn */ '€', "p|", /* thorn */ '€', "y\"", /* y dieresis */ '€', "y:", /* y dieresis */ 0, 0, }; int latin1(int k1, int k2) { int i; struct latin *l; for(l=latintab; l->l; l++) if(k1==l->c[0] && k2==l->c[1]) return l->l; return 0; } . 436c /* lloz 79 rloz 7b 7c r + 7e 7f */ . 434c /* R13 R14 R15 73 74 75 help caps */ . 428,431c /* \ 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, . 422,423c /* [ ] dele comp R7 R8 R9 r - */ 0x1B, 0x1D, '\b', 0xB6, 0x96, 0x97, 0x98, 0xFF, . 418,419c /* 30 L5 del L6 34 tab q w */ 0xFF, 0x94, 0xFF, 0x95, 0xFF, '\t', 0x11, 0x17, . 408,409c /* F3 09 F4 0b F5 altgr F6 0f */ 0x84, 0xFF, 0x85, 0xFF, 0x86, 0x80, 0x87, 0xFF, . 401c /* lloz 79 rloz 7b 7c r + 7e 7f */ . 399c /* R13 R14 R15 73 74 75 help caps */ . 395,396c /* 60 L10 numlk shift z x c v */ 0xFF, 0x9f, 0x7F, 0xF1, 0x1A, 0x18, 0x03, 0x16, . 393c /* \ ret enter R10 R11 R12 ins L9 */ . 387,388c /* [ ] dele comp R7 R8 R9 r - */ 0x1B, 0x1D, '\b', 0xB6, 0x96, 0x97, 0x98, 0xFF, . 383,384c /* 30 L5 del L6 34 tab q w */ 0xFF, 0x94, 0xFF, 0x95, 0xFF, '\t', 0x11, 0x17, . 373,374c /* F3 09 F4 0b F5 altgr F6 0f */ 0x84, 0xFF, 0x85, 0xFF, 0x86, 0x80, 0x87, 0xFF, . 366c /* lloz 79 rloz 7b 7c r + 7e 7f */ . 364c /* R13 R14 R15 73 74 75 help caps */ . 360,361c /* 60 L10 numlk shift z x c v */ 0xFF, 0x9f, 0x7F, 0xF1, 'Z', 'X', 'C', 'V', . 358c /* \ ret enter R10 R11 R12 ins L9 */ . 352,353c /* [ ] dele comp R7 R8 R9 r - */ '{', '}', '\b', 0xB6, 0x96, 0x97, 0x98, 0xFF, . 348,349c /* 30 L5 del L6 34 tab q w */ 0xFF, 0x94, 0xFF, 0x95, 0xFF, '\t', 'Q', 'W', . 338,339c /* F3 09 F4 0b F5 altgr F6 0f */ 0x84, 0xFF, 0x85, 0xFF, 0x86, 0x80, 0x87, 0xFF, . 331c /* lloz 79 rloz 7b 7c r + 7e 7f */ . 329c /* R13 R14 R15 73 74 75 help caps */ . 325,326c /* 60 L10 numlk shift z x c v */ 0xFF, 0x9f, 0x7F, 0xF1, 'z', 'x', 'c', 'v', . 323c /* \ ret enter R10 R11 R12 ins L9 */ . 317,318c /* [ ] dele comp R7 R8 R9 r - */ '[', ']', '\b', 0xB6, 0x96, 0x97, 0x98, 0xFF, . 313,314c /* 30 L5 del L6 34 tab q w */ 0xFF, 0x94, 0xFF, 0x95, 0xFF, '\t', 'q', 'w', . 303,304c /* F3 09 F4 0b F5 altgr F6 0f */ 0x84, 0xFF, 0x85, 0xFF, 0x86, 0x80, 0x87, 0xFF, . 298c * Map is indexed by keyboard char, output is ASCII. * Gnotisms: Return sends newline and Line Feed sends carriage return. * Delete and Backspace both send backspace. * Num Lock sends delete (rubout). * Alt Graph is VIEW (scroll). * Compose builds Latin-1 characters. . 35c {0, 0, 1152, 900}, . 33c 1152/32, . ## diffname ss/screen.c 1991/0604 ## diff -e /n/bootesdump/1991/0201/sys/src/9/sparc/screen.c /n/bootesdump/1991/0604/sys/src/9/slc/screen.c 675a } void buzz(int freq, int dur) { } void lights(int mask) { . 673c kbdputc(&kbdq, tc); . 667c kbdputc(&kbdq, k1); . 592,593c int kbdstate(IOQ *q, int c) . 198,297d 190,196d 186,187c while(n-- > 0) screenputc(*s++); . 184c screenputs(char *s, int n) . 81,182d 27d 23,25d ## diffname ss/screen.c 1991/0707 ## diff -e /n/bootesdump/1991/0604/sys/src/9/slc/screen.c /n/bootesdump/1991/0707/sys/src/9/slc/screen.c 472a } int screenbits(void) { return 1; /* bits per pixel */ } void getcolor(ulong p, ulong *pr, ulong *pg, ulong *pb) { ulong ans; /* * The slc monochrome says 0 is white (max intensity) */ if(p == 0) ans = ~0; else ans = 0; *pr = *pg = *pb = ans; } int setcolor(ulong p, ulong r, ulong g, ulong b) { return 0; /* can't change mono screen colormap */ } int hwcursset(uchar *s, uchar *c, int ox, int oy) { return 0; } int hwcursmove(int x, int y) { return 0; } void mouseclock(void) /* called splhi */ { mouseupdate(1); . 11a #include "mouse.h" . ## diffname ss/screen.c 1991/0708 ## diff -e /n/bootesdump/1991/0707/sys/src/9/slc/screen.c /n/bootesdump/1991/0708/sys/src/9/slc/screen.c 12c #include "screen.h" . ## diffname ss/screen.c 1991/0713 ## diff -e /n/bootesdump/1991/0708/sys/src/9/slc/screen.c /n/bootesdump/1991/0713/sys/src/9/slc/screen.c 440,442c kbdrepeat(1); . 434,435c goto norepeat; . 429,430c goto norepeat; . 424,425c goto norepeat; . 418,420c goto norepeat; . 415,416c goto norepeat; . 411,412c goto norepeat; . 406,407c goto norepeat; . 398c norepeat: kbdrepeat(0); . 391,396d 386a static int repeatc; . 385d ## diffname ss/screen.c 1991/1108 ## diff -e /n/bootesdump/1991/0713/sys/src/9/slc/screen.c /n/bootesdump/1991/1108/sys/src/9/slc/screen.c 240,379d ## diffname ss/screen.c 1991/1211 ## diff -e /n/bootesdump/1991/1108/sys/src/9/slc/screen.c /n/bootesdump/1991/1211/sys/src/9/slc/screen.c 305,306c kbdputc(&kbdq, ch); break; . 297,303c kc[1] = ch; c = latin1(kc); nk = 2; putit: lstate = 0; if(c != -1) kbdputc(&kbdq, c); else for(i=0; i 0){ i = chartorune(&r, s); if(i == 0){ s++; --n; continue; } memmove(buf, s, i); buf[i] = 0; n -= i; s += i; if(r == '\n'){ 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); }else if(r == '\t'){ out.pos.x += (8-((out.pos.x-MINX)/out.bwid&7))*out.bwid; if(out.pos.x >= gscreen.r.max.x) screenputs("\n", 1); }else if(r == '\b'){ if(out.pos.x >= out.bwid+MINX){ out.pos.x -= out.bwid; screenputs(" ", 1); out.pos.x -= out.bwid; } }else{ if(out.pos.x >= gscreen.r.max.x-out.bwid) screenputs("\n", 1); out.pos = gstring(&gscreen, out.pos, defont, buf, S); } } . ## diffname ss/screen.c 1991/1225 ## diff -e /n/bootesdump/1991/1223/sys/src/9/slc/screen.c /n/bootesdump/1991/1225/sys/src/9/slc/screen.c 47,78d ## diffname ss/screen.c 1991/1228 ## diff -e /n/bootesdump/1991/1225/sys/src/9/slc/screen.c /n/bootesdump/1991/1228/sys/src/9/slc/screen.c 86a unlock(&screenlock); . 83c screenputnl(); . 78,79c gstring(&gscreen, out.pos, defont, " ", S); . 74c screenputnl(); . 64,71c if(r == '\n') screenputnl(); else if(r == '\t'){ . 52a lock(&screenlock); . 46a screenputnl(void) { 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 . 35a Lock screenlock; . ## diffname ss/screen.c 1992/0111 ## diff -e /n/bootesdump/1991/1228/sys/src/9/slc/screen.c /n/bootesdump/1992/0111/sys/src/9/slc/screen.c 8c #include "../port/error.h" . ## diffname ss/screen.c 1992/0120 ## diff -e /n/bootesdump/1992/0111/sys/src/9/slc/screen.c /n/bootesdump/1992/0120/sys/src/9/slc/screen.c 7d ## diffname ss/screen.c 1992/0208 ## diff -e /n/bootesdump/1992/0120/sys/src/9/slc/screen.c /n/bootesdump/1992/0208/sys/src/9/slc/screen.c 91c out.pos = gsubfstring(&gscreen, out.pos, defont, buf, S); . 86c gsubfstring(&gscreen, out.pos, defont, " ", S); . 15,16c extern GSubfont defont0; GSubfont *defont; . ## diffname ss/screen.c 1992/0209 ## diff -e /n/bootesdump/1992/0208/sys/src/9/slc/screen.c /n/bootesdump/1992/0209/sys/src/9/slc/screen.c 9c #include . ## diffname ss/screen.c 1992/0211 ## diff -e /n/bootesdump/1992/0209/sys/src/9/slc/screen.c /n/bootesdump/1992/0211/sys/src/9/slc/screen.c 9c #include . ## diffname ss/screen.c 1992/0321 ## diff -e /n/bootesdump/1992/0211/sys/src/9/slc/screen.c /n/bootesdump/1992/0321/sys/src/9/slc/screen.c 2c #include "../port/lib.h" . ## diffname ss/screen.c 1992/0604 ## diff -e /n/bootesdump/1992/0321/sys/src/9/slc/screen.c /n/bootesdump/1992/0604/sys/src/9/slc/screen.c 31a {0, 0, 1152, 900}, . ## diffname ss/screen.c 1992/0703 ## diff -e /n/bootesdump/1992/0604/sys/src/9/slc/screen.c /n/bootesdump/1992/0703/sys/src/9/slc/screen.c 349a USED(mask); . 344a USED(freq, dur); . ## diffname ss/screen.c 1992/0711 ## diff -e /n/bootesdump/1992/0703/sys/src/9/slc/screen.c /n/bootesdump/1992/0711/sys/src/9/slc/screen.c 390a USED(x, y); . 384a USED(s, c, ox, oy); . 378a USED(p, r, g, b); . 339a return 0; . 272c return 0; . 269c return 0; . 264a USED(q); . 262c uchar ch; . ## diffname ss/screen.c 1992/0807 ## diff -e /n/bootesdump/1992/0807/sys/src/9/slc/screen.c /n/bootesdump/1992/0807/sys/src/9/ss/screen.c 65a if(!conf.monitor) return; . 50a if(!conf.monitor) return; . 40a if(!conf.monitor) return; . ## diffname ss/screen.c 1992/0810 ## diff -e /n/bootesdump/1992/0807/sys/src/9/ss/screen.c /n/bootesdump/1992/0810/sys/src/9/ss/screen.c 41,42c struct screens *s; for(s=screens; s->type; s++) if(s->type == conf.monitor) goto found; /* default is 0th element of table */ if(conf.monitor){ s = screens; goto found; ] conf.monitor = 0; return; found: gscreen.base = (ulong*)SCREENSEGM; gscreen.zero = 0; gscreen.width = (s->x<ld)/32; gscreen.ldepth = s->ld; gscreen.r = Rect(0, 0, s->x, s->y); gscreen.clipr = gscreen.r; gscreen.cache = 0; . 27,32c ulong type; int x; int y; int ld; }screens[] = { { 0xFE010104, 1152, 900, 0 }, . 25c GBitmap gscreen; struct screens . ## diffname ss/screen.c 1992/0811 ## diff -e /n/bootesdump/1992/0810/sys/src/9/ss/screen.c /n/bootesdump/1992/0811/sys/src/9/ss/screen.c 52c } . ## diffname ss/screen.c 1992/0812 ## diff -e /n/bootesdump/1992/0811/sys/src/9/ss/screen.c /n/bootesdump/1992/0812/sys/src/9/ss/screen.c 59c gscreen.width = (s->x<ld)/(8*sizeof(ulong)); n = sizeof(ulong) * gscreen.width * s->y; gscreen.base = (ulong*)kmapregion(DISPLAYRAM, n, PTENOCACHE|PTEIO); . 57d 46c if(strcmp(s->type, str) == 0) . 43a ulong n; . 41c screeninit(char *str) . 34c { "bwtwo", 1152, 900, 0 }, { "cgsix", 1152, 900, 3 }, { "cgthree", 1152, 900, 3 }, . 29c char *type; . ## diffname ss/screen.c 1992/0813 ## diff -e /n/bootesdump/1992/0812/sys/src/9/ss/screen.c /n/bootesdump/1992/0813/sys/src/9/ss/screen.c 433a } /* 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; . 412,413c 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; } . 401,405c 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; } . 395a uchar r, g, b; . 135c * Compose builds Unicode characters. . 131c * Plan 9-isms: * Return sends newline and Line Feed sends carriage return. . 75a mapdump(void) { int i; dac->dacaddr = 0; for(i=0; i<100; i++) print("%lux ", dac->daccolor); } void . 72a 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)); */ } } . 46c ulong n, r, g, b; int i; int havecol; . 34,36c { "bwtwo", 1152, 900, 0, 0x400000 }, { "cgsix", 1152, 900, 3, 0x400000 }, { "cgthree", 1152, 900, 3, 0x200000 }, . 32a ulong dacaddr; . 24a /* 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; . 23c static ulong rep(ulong, int); void (*kprofp)(ulong); . ## diffname ss/screen.c 1992/0814 ## diff -e /n/bootesdump/1992/0813/sys/src/9/ss/screen.c /n/bootesdump/1992/0814/sys/src/9/ss/screen.c 136,138c for(i=0; i<100; i++) { dac->dacaddr = i; dac->daccolor = i; dac->daccolor = i; dac->daccolor = i; dac->dacaddr = i; print("%ux.%ux.%ux ", dac->daccolor, dac->daccolor, dac->daccolor); } . 123d 117,121c for(i=0; i<255; i++) { dac->dacaddr = i; dac->daccolor = i; dac->daccolor = i; dac->daccolor = i; . 88c dac = (DAC*)kmappa(FRAMEBUF+s->dacaddr, PTENOCACHE|PTEMAINMEM); . 48c { "cgsix", 1152, 900, 3, 0x200000 }, . 30,34c uchar pad[3]; uchar dacaddr; /* DAC address register */ uchar pad[3]; uchar daccolor; /* DAC color palette */ uchar pad[3]; uchar daccntrl; /* DAC control register */ uchar pad[3]; uchar dacovrl; /* DAC overlay palette */ . ## diffname ss/screen.c 1992/0815 ## diff -e /n/bootesdump/1992/0814/sys/src/9/ss/screen.c /n/bootesdump/1992/0815/sys/src/9/ss/screen.c 495,502c else{ dac->addr = p & 0xFF; dac->color = r >> 24; dac->color = g >> 24; dac->color = b >> 24; . 493c if(gscreen.ldepth == 0) . 479,482c *(uchar *)&dac->addr = p & 0xFF; r = dac->color; g = dac->color; b = dac->color; . 472c if(gscreen.ldepth == 0) { . 470c * The slc monochrome says 0 is white (max intensity). . 131,144d 125a dac->addr = 0; for(i=255; i>=0; i--){ dac->color = i; dac->color = i; dac->color = i; } . 123,124c dac->addr = 4; dac->cntrl = 0xFF; dac->addr = 5; dac->cntrl = 0x00; dac->addr = 6; dac->cntrl = 0x40; dac->addr = 7; dac->cntrl = 0x00; . 107,121d 87c dac = (DAC*)(kmappa(FRAMEBUF+s->dacaddr, PTENOCACHE|PTEIO)->va); . 30,33c uchar addr; /* DAC address register */ uchar pad0[3]; uchar color; /* DAC color palette */ uchar pad1[3]; uchar cntrl; /* DAC control register */ uchar pad2[3]; uchar ovrl; /* DAC overlay palette */ uchar pad3[3]; . ## diffname ss/screen.c 1992/0816 ## diff -e /n/bootesdump/1992/0815/sys/src/9/ss/screen.c /n/bootesdump/1992/0816/sys/src/9/ss/screen.c 52c { "cgthree", 1152, 900, 3, 0x200000 }, /* PURE GUESS! */ . ## diffname ss/screen.c 1992/0817 ## diff -e /n/bootesdump/1992/0816/sys/src/9/ss/screen.c /n/bootesdump/1992/0817/sys/src/9/ss/screen.c 129a } mapdump(void) { dac->addr = 4; print("cntrl4 %.2ux\n", dac->cntrl); dac->addr = 5; print("cntrl5 %.2ux\n", dac->cntrl); dac->addr = 6; print("cntrl6 %.2ux\n", dac->cntrl); dac->addr = 7; print("cntrl7 %.2ux\n", dac->cntrl); . 111,121d 92a dac->addr = 4; dac->cntrl = 0xFF; /* enable all planes */ dac->addr = 5; dac->cntrl = 0x00; /* no blinking */ dac->addr = 6; dac->cntrl = 0x43; /* enable palette ram and display */ dac->addr = 7; dac->cntrl = 0x00; /* no tests */ . 36c uchar ovrl; /* overlay palette */ . 34c uchar cntrl; /* control register */ . 32c uchar color; /* color palette */ . 30c uchar addr; /* address register */ . ## diffname ss/screen.c 1992/0824 ## diff -e /n/bootesdump/1992/0817/sys/src/9/ss/screen.c /n/bootesdump/1992/0824/sys/src/9/ss/screen.c 127,138d 103,109c /* * 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. */ . ## diffname ss/screen.c 1992/0904 ## diff -e /n/bootesdump/1992/0824/sys/src/9/ss/screen.c /n/bootesdump/1992/0904/sys/src/9/ss/screen.c 481,484c vid->addr = p & 0xFF; vid->color = r >> 24; vid->color = g >> 24; vid->color = b >> 24; . 464,467c *(uchar *)&vid->addr = p & 0xFF; r = vid->color; g = vid->color; b = vid->color; . 129a mapcrap(void) { uchar *v; int i; v = &vid->mcr; for(i=0; i<16; i++,v++) print("%lux %.2ux\n", v, *v); } void . 121,123c vid->color = i; vid->color = i; vid->color = i; . 119c vid->addr = 0; . 93,100c vid->addr = 4; vid->cntrl = 0xFF; /* enable all planes */ vid->addr = 5; vid->cntrl = 0x00; /* no blinking */ vid->addr = 6; vid->cntrl = 0x43; /* enable palette ram and display */ vid->addr = 7; vid->cntrl = 0x00; /* no tests */ . 91c vid = (Video*)(kmappa(FRAMEBUF(slot)+s->vidaddr, PTENOCACHE|PTEIO)->va); . 81c gscreen.base = (ulong*)kmapregion(DISPLAYRAM(slot), n, PTENOCACHE|PTEIO); . 59c screeninit(char *str, int slot) . 48c ulong vidaddr; . 38c /* Sun-4 video chip */ uchar mcr; /* master control register */ uchar sr; /* status register */ uchar csa; /* cursor start address */ uchar cea; /* cursor end address */ uchar hbs; /* horizontal blank set */ uchar hbc; /* horizontal blank clear */ uchar hss; /* horizontal sync set */ uchar hsc; /* horizontal sync clear */ uchar csc; /* composite sync clear */ uchar vbsh; /* vertical blank set high byte */ uchar vbsl; /* vertical blank set low byte */ uchar vbc; /* vertical blank clear */ uchar vss; /* vertical sync set */ uchar vsc; /* vertical sync clear */ uchar xcs; /* transfer cycle hold off set */ uchar xcc; /* transfer cycle hold off clear */ }*vid; . 29a /* Brooktree 458/451 */ . 26,28c typedef struct Video Video; struct Video . ## diffname ss/screen.c 1992/0905 ## diff -e /n/bootesdump/1992/0904/sys/src/9/ss/screen.c /n/bootesdump/1992/0905/sys/src/9/ss/screen.c 146,155d 55c #endif } *vid; . 37a #ifdef notright . ## diffname ss/screen.c 1992/0914 ## diff -e /n/bootesdump/1992/0905/sys/src/9/ss/screen.c /n/bootesdump/1992/0914/sys/src/9/ss/screen.c 171c if((getpsr()&SPL(15))){ if(!canlock(&screenlock)) return; /* don't deadlock trying to print in interrupt */ }else lock(&screenlock); . ## diffname ss/screen.c 1992/1012 ## diff -e /n/bootesdump/1992/0914/sys/src/9/ss/screen.c /n/bootesdump/1992/1012/sys/src/9/ss/screen.c 24a void screenupdate(void); . ## diffname ss/screen.c 1992/1020 ## diff -e /n/bootesdump/1992/1012/sys/src/9/ss/screen.c /n/bootesdump/1992/1020/sys/src/9/ss/screen.c 545a } /* only 1 flavor mouse */ void mousectl(char *x) { USED(x); . 16a int islcd; . ## diffname ss/screen.c 1992/1030 ## diff -e /n/bootesdump/1992/1020/sys/src/9/ss/screen.c /n/bootesdump/1992/1030/sys/src/9/ss/screen.c 553c USED(arg); } void screenupdate(Rectangle r) { USED(r); . 551c mousectl(char *arg) . 549c /* * set/change mouse configuration */ . 26d ## diffname ss/screen.c 1992/1104 ## diff -e /n/bootesdump/1992/1030/sys/src/9/ss/screen.c /n/bootesdump/1992/1104/sys/src/9/ss/screen.c 556,561d ## diffname ss/screen.c 1993/0217 ## diff -e /n/bootesdump/1992/1104/sys/src/9/ss/screen.c /n/bootesdump/1993/0217/sys/src/9/ss/screen.c 72c { "cgthree", 1152, 900, 3, 0x400000 }, /* data from rwolff */ . ## diffname ss/screen.c 1993/0226 ## diff -e /n/bootesdump/1993/0217/sys/src/9/ss/screen.c /n/bootesdump/1993/0226/sys/src/9/ss/screen.c 529,534d ## diffname ss/screen.c 1993/0501 # deleted ## diff -e /n/bootesdump/1993/0226/sys/src/9/ss/screen.c /n/fornaxdump/1993/0501/sys/src/brazil/ss/screen.c 1,549d