|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1988 University of Utah. ! 3: * Copyright (c) 1990 The Regents of the University of California. ! 4: * All rights reserved. ! 5: * ! 6: * This code is derived from software contributed to Berkeley by ! 7: * the Systems Programming Group of the University of Utah Computer ! 8: * Science Department. ! 9: * ! 10: * Redistribution is only permitted until one year after the first shipment ! 11: * of 4.4BSD by the Regents. Otherwise, redistribution and use in source and ! 12: * binary forms are permitted provided that: (1) source distributions retain ! 13: * this entire copyright notice and comment, and (2) distributions including ! 14: * binaries display the following acknowledgement: This product includes ! 15: * software developed by the University of California, Berkeley and its ! 16: * contributors'' in the documentation or other materials provided with the ! 17: * distribution and in all advertising materials mentioning features or use ! 18: * of this software. Neither the name of the University nor the names of ! 19: * its contributors may be used to endorse or promote products derived from ! 20: * this software without specific prior written permission. ! 21: * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 22: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 23: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 24: * ! 25: * from: Utah $Hdr: ite.c 1.19 89/08/22$ ! 26: * ! 27: * @(#)ite.c 7.1 (Berkeley) 5/8/90 ! 28: */ ! 29: ! 30: /* ! 31: * Standalone Internal Terminal Emulator (CRT and keyboard) ! 32: */ ! 33: #include "samachdep.h" ! 34: ! 35: #ifdef ITECONSOLE ! 36: ! 37: #include "param.h" ! 38: #include "machine/cons.h" ! 39: #include "../hpdev/device.h" ! 40: #include "../hpdev/itevar.h" ! 41: #include "../hpdev/grfvar.h" ! 42: ! 43: int nodev(); ! 44: ! 45: int topcat_init(), topcat_putc(); ! 46: int topcat_clear(), topcat_cursor(), topcat_scroll(); ! 47: int gatorbox_init(), gatorbox_clear(); ! 48: int gatorbox_putc(), gatorbox_cursor(), gatorbox_scroll(); ! 49: int rbox_init(), rbox_clear(); ! 50: int rbox_putc(), rbox_cursor(), rbox_scroll(); ! 51: int dvbox_init(), dvbox_clear(); ! 52: int dvbox_putc(), dvbox_cursor(), dvbox_scroll(); ! 53: ! 54: struct itesw itesw[] = { ! 55: topcat_init, nodev, topcat_clear, ! 56: topcat_putc, topcat_cursor, topcat_scroll, ! 57: ! 58: gatorbox_init, nodev, gatorbox_clear, ! 59: gatorbox_putc, gatorbox_cursor, gatorbox_scroll, ! 60: ! 61: rbox_init, nodev, rbox_clear, ! 62: rbox_putc, rbox_cursor, rbox_scroll, ! 63: ! 64: dvbox_init, nodev, dvbox_clear, ! 65: dvbox_putc, dvbox_cursor, dvbox_scroll, ! 66: }; ! 67: ! 68: /* these guys need to be in initialized data */ ! 69: int itecons = -1; ! 70: struct ite_softc ite_softc[NITE] = { 0 }; ! 71: ! 72: /* ! 73: * Locate all bitmapped displays ! 74: */ ! 75: iteconfig() ! 76: { ! 77: extern struct hp_hw sc_table[]; ! 78: int dtype, fboff, i; ! 79: struct hp_hw *hw; ! 80: struct grfreg *gr; ! 81: struct ite_softc *ip; ! 82: ! 83: i = 0; ! 84: for (hw = sc_table; hw < &sc_table[MAX_CTLR]; hw++) { ! 85: if (hw->hw_type != BITMAP) ! 86: continue; ! 87: gr = (struct grfreg *) hw->hw_addr; ! 88: /* XXX: redundent but safe */ ! 89: if (badaddr((caddr_t)gr) || gr->gr_id != GRFHWID) ! 90: continue; ! 91: switch (gr->gr_id2) { ! 92: case GID_GATORBOX: ! 93: dtype = ITE_GATORBOX; ! 94: break; ! 95: case GID_TOPCAT: ! 96: case GID_LRCATSEYE: ! 97: case GID_HRCCATSEYE: ! 98: case GID_HRMCATSEYE: ! 99: dtype = ITE_TOPCAT; ! 100: break; ! 101: case GID_RENAISSANCE: ! 102: dtype = ITE_RENAISSANCE; ! 103: break; ! 104: case GID_DAVINCI: ! 105: dtype = ITE_DAVINCI; ! 106: break; ! 107: default: ! 108: continue; ! 109: } ! 110: if (i >= NITE) ! 111: break; ! 112: ip = &ite_softc[i]; ! 113: ip->regbase = (caddr_t) gr; ! 114: fboff = (gr->gr_fbomsb << 8) | gr->gr_fbolsb; ! 115: ip->fbbase = (caddr_t) (*((u_char *)ip->regbase+fboff) << 16); ! 116: /* DIO II: FB offset is relative to select code space */ ! 117: if (ip->regbase >= (caddr_t)0x1000000) ! 118: ip->fbbase += (int)ip->regbase; ! 119: ip->flags = ITE_ALIVE|ITE_CONSOLE; ! 120: ip->type = dtype; ! 121: i++; ! 122: } ! 123: } ! 124: ! 125: #ifdef CONSDEBUG ! 126: /* ! 127: * Allows us to cycle through all possible consoles (NITE ites and serial port) ! 128: * by using SHIFT-RESET on the keyboard. ! 129: */ ! 130: int whichconsole = -1; ! 131: #endif ! 132: ! 133: iteprobe(cp) ! 134: struct consdev *cp; ! 135: { ! 136: register int ite; ! 137: register struct ite_softc *ip; ! 138: int unit, pri; ! 139: ! 140: #ifdef CONSDEBUG ! 141: whichconsole = ++whichconsole % (NITE+1); ! 142: #endif ! 143: ! 144: if (itecons != -1) ! 145: return(1); ! 146: ! 147: iteconfig(); ! 148: unit = -1; ! 149: pri = CN_DEAD; ! 150: for (ite = 0; ite < NITE; ite++) { ! 151: #ifdef CONSDEBUG ! 152: if (ite < whichconsole) ! 153: continue; ! 154: #endif ! 155: ip = &ite_softc[ite]; ! 156: if ((ip->flags & (ITE_ALIVE|ITE_CONSOLE)) ! 157: != (ITE_ALIVE|ITE_CONSOLE)) ! 158: continue; ! 159: if ((int)ip->regbase == GRFIADDR) { ! 160: pri = CN_INTERNAL; ! 161: unit = ite; ! 162: } else if (unit < 0) { ! 163: pri = CN_NORMAL; ! 164: unit = ite; ! 165: } ! 166: } ! 167: cp->cn_dev = unit; ! 168: cp->cn_pri = pri; ! 169: } ! 170: ! 171: iteinit(cp) ! 172: struct consdev *cp; ! 173: { ! 174: int ite = cp->cn_dev; ! 175: struct ite_softc *ip; ! 176: ! 177: if (itecons != -1) ! 178: return(1); ! 179: ! 180: ip = &ite_softc[ite]; ! 181: ! 182: ip->curx = 0; ! 183: ip->cury = 0; ! 184: ip->cursorx = 0; ! 185: ip->cursory = 0; ! 186: ! 187: (*itesw[ip->type].ite_init)(ip); ! 188: (*itesw[ip->type].ite_cursor)(ip, DRAW_CURSOR); ! 189: ! 190: itecons = ite; ! 191: kbdinit(); ! 192: } ! 193: ! 194: iteputchar(c) ! 195: register int c; ! 196: { ! 197: register struct ite_softc *ip = &ite_softc[itecons]; ! 198: register struct itesw *sp = &itesw[ip->type]; ! 199: ! 200: c &= 0x7F; ! 201: switch (c) { ! 202: ! 203: case '\n': ! 204: if (++ip->cury == ip->rows) { ! 205: ip->cury--; ! 206: (*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP); ! 207: ite_clrtoeol(ip, sp, ip->cury, 0); ! 208: } ! 209: else ! 210: (*sp->ite_cursor)(ip, MOVE_CURSOR); ! 211: break; ! 212: ! 213: case '\r': ! 214: ip->curx = 0; ! 215: (*sp->ite_cursor)(ip, MOVE_CURSOR); ! 216: break; ! 217: ! 218: case '\b': ! 219: if (--ip->curx < 0) ! 220: ip->curx = 0; ! 221: else ! 222: (*sp->ite_cursor)(ip, MOVE_CURSOR); ! 223: break; ! 224: ! 225: default: ! 226: if (c < ' ' || c == 0177) ! 227: break; ! 228: (*sp->ite_putc)(ip, c, ip->cury, ip->curx, ATTR_NOR); ! 229: (*sp->ite_cursor)(ip, DRAW_CURSOR); ! 230: itecheckwrap(ip, sp); ! 231: break; ! 232: } ! 233: } ! 234: ! 235: itecheckwrap(ip, sp) ! 236: register struct ite_softc *ip; ! 237: register struct itesw *sp; ! 238: { ! 239: if (++ip->curx == ip->cols) { ! 240: ip->curx = 0; ! 241: if (++ip->cury == ip->rows) { ! 242: --ip->cury; ! 243: (*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP); ! 244: ite_clrtoeol(ip, sp, ip->cury, 0); ! 245: return; ! 246: } ! 247: } ! 248: (*sp->ite_cursor)(ip, MOVE_CURSOR); ! 249: } ! 250: ! 251: ite_clrtoeol(ip, sp, y, x) ! 252: register struct ite_softc *ip; ! 253: register struct itesw *sp; ! 254: register int y, x; ! 255: { ! 256: (*sp->ite_clear)(ip, y, x, 1, ip->cols - x); ! 257: (*sp->ite_cursor)(ip, DRAW_CURSOR); ! 258: } ! 259: ! 260: itegetchar() ! 261: { ! 262: #ifdef SMALL ! 263: return (0); ! 264: #else ! 265: return (kbdgetc()); ! 266: #endif ! 267: } ! 268: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.