|
|
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.22 89/08/17$ ! 26: * ! 27: * @(#)ite.c 7.2 (Berkeley) 6/22/90 ! 28: */ ! 29: ! 30: /* ! 31: * Bit-mapped display terminal emulator machine independent code. ! 32: * This is a very rudimentary. Much more can be abstracted out of ! 33: * the hardware dependent routines. ! 34: */ ! 35: #include "ite.h" ! 36: #if NITE > 0 ! 37: ! 38: #include "grf.h" ! 39: ! 40: #undef NITE ! 41: #define NITE NGRF ! 42: ! 43: #include "param.h" ! 44: #include "conf.h" ! 45: #include "user.h" ! 46: #include "proc.h" ! 47: #include "ioctl.h" ! 48: #include "tty.h" ! 49: #include "systm.h" ! 50: #include "uio.h" ! 51: #include "malloc.h" ! 52: ! 53: #include "itevar.h" ! 54: #include "iteioctl.h" ! 55: #include "kbdmap.h" ! 56: ! 57: #include "machine/cpu.h" ! 58: ! 59: #define set_attr(ip, attr) ((ip)->attribute |= (attr)) ! 60: #define clr_attr(ip, attr) ((ip)->attribute &= ~(attr)) ! 61: ! 62: extern int nodev(); ! 63: ! 64: int topcat_scroll(), topcat_init(), topcat_deinit(); ! 65: int topcat_clear(), topcat_putc(), topcat_cursor(); ! 66: int gatorbox_scroll(), gatorbox_init(), gatorbox_deinit(); ! 67: int gatorbox_clear(), gatorbox_putc(), gatorbox_cursor(); ! 68: int rbox_scroll(), rbox_init(), rbox_deinit(); ! 69: int rbox_clear(), rbox_putc(), rbox_cursor(); ! 70: int dvbox_scroll(), dvbox_init(), dvbox_deinit(); ! 71: int dvbox_clear(), dvbox_putc(), dvbox_cursor(); ! 72: ! 73: struct itesw itesw[] = ! 74: { ! 75: topcat_init, topcat_deinit, topcat_clear, ! 76: topcat_putc, topcat_cursor, topcat_scroll, ! 77: ! 78: gatorbox_init, gatorbox_deinit, gatorbox_clear, ! 79: gatorbox_putc, gatorbox_cursor, gatorbox_scroll, ! 80: ! 81: rbox_init, rbox_deinit, rbox_clear, ! 82: rbox_putc, rbox_cursor, rbox_scroll, ! 83: ! 84: dvbox_init, dvbox_deinit, dvbox_clear, ! 85: dvbox_putc, dvbox_cursor, dvbox_scroll, ! 86: }; ! 87: ! 88: /* ! 89: * # of chars are output in a single itestart() call. ! 90: * If this is too big, user processes will be blocked out for ! 91: * long periods of time while we are emptying the queue in itestart(). ! 92: * If it is too small, console output will be very ragged. ! 93: */ ! 94: int iteburst = 64; ! 95: ! 96: int nite = NITE; ! 97: struct tty *kbd_tty = NULL; ! 98: struct tty ite_tty[NITE]; ! 99: struct ite_softc ite_softc[NITE]; ! 100: ! 101: int itestart(); ! 102: extern int ttrstrt(); ! 103: extern struct tty *constty; ! 104: ! 105: /* ! 106: * Primary attribute buffer to be used by the first bitmapped console ! 107: * found. Secondary displays alloc the attribute buffer as needed. ! 108: * Size is based on a 68x128 display, which is currently our largest. ! 109: */ ! 110: u_char console_attributes[0x2200]; ! 111: ! 112: /* ! 113: * Perform functions necessary to setup device as a terminal emulator. ! 114: */ ! 115: iteon(dev, flag) ! 116: dev_t dev; ! 117: { ! 118: int unit = UNIT(dev); ! 119: struct tty *tp = &ite_tty[unit]; ! 120: struct ite_softc *ip = &ite_softc[unit]; ! 121: ! 122: if (unit < 0 || unit >= NITE || (ip->flags&ITE_ALIVE) == 0) ! 123: return(ENXIO); ! 124: /* force ite active, overriding graphics mode */ ! 125: if (flag & 1) { ! 126: ip->flags |= ITE_ACTIVE; ! 127: ip->flags &= ~(ITE_INGRF|ITE_INITED); ! 128: } ! 129: /* leave graphics mode */ ! 130: if (flag & 2) { ! 131: ip->flags &= ~ITE_INGRF; ! 132: if ((ip->flags & ITE_ACTIVE) == 0) ! 133: return(0); ! 134: } ! 135: ip->flags |= ITE_ACTIVE; ! 136: if (ip->flags & ITE_INGRF) ! 137: return(0); ! 138: if (kbd_tty == NULL || kbd_tty == tp) { ! 139: kbd_tty = tp; ! 140: kbdenable(); ! 141: } ! 142: iteinit(dev); ! 143: return(0); ! 144: } ! 145: ! 146: iteinit(dev) ! 147: dev_t dev; ! 148: { ! 149: int unit = UNIT(dev); ! 150: struct ite_softc *ip = &ite_softc[unit]; ! 151: ! 152: if (ip->flags & ITE_INITED) ! 153: return; ! 154: ! 155: ip->curx = 0; ! 156: ip->cury = 0; ! 157: ip->cursorx = 0; ! 158: ip->cursory = 0; ! 159: ! 160: (*itesw[ip->type].ite_init)(ip); ! 161: (*itesw[ip->type].ite_cursor)(ip, DRAW_CURSOR); ! 162: ! 163: ip->attribute = 0; ! 164: if (ip->attrbuf == NULL) ! 165: ip->attrbuf = (u_char *) ! 166: malloc(ip->rows * ip->cols, M_DEVBUF, M_WAITOK); ! 167: bzero(ip->attrbuf, (ip->rows * ip->cols)); ! 168: ! 169: ip->imode = 0; ! 170: ip->flags |= ITE_INITED; ! 171: } ! 172: ! 173: /* ! 174: * "Shut down" device as terminal emulator. ! 175: * Note that we do not deinit the console device unless forced. ! 176: * Deinit'ing the console every time leads to a very active ! 177: * screen when processing /etc/rc. ! 178: */ ! 179: iteoff(dev, flag) ! 180: dev_t dev; ! 181: { ! 182: register struct ite_softc *ip = &ite_softc[UNIT(dev)]; ! 183: ! 184: if (flag & 2) ! 185: ip->flags |= ITE_INGRF; ! 186: if ((ip->flags & ITE_ACTIVE) == 0) ! 187: return; ! 188: if ((flag & 1) || ! 189: (ip->flags & (ITE_INGRF|ITE_ISCONS|ITE_INITED)) == ITE_INITED) ! 190: (*itesw[ip->type].ite_deinit)(ip); ! 191: if ((flag & 2) == 0) ! 192: ip->flags &= ~ITE_ACTIVE; ! 193: } ! 194: ! 195: /*ARGSUSED*/ ! 196: iteopen(dev, flag) ! 197: dev_t dev; ! 198: { ! 199: int unit = UNIT(dev); ! 200: register struct tty *tp = &ite_tty[unit]; ! 201: register struct ite_softc *ip = &ite_softc[unit]; ! 202: register int error; ! 203: int first = 0; ! 204: ! 205: if ((tp->t_state&(TS_ISOPEN|TS_XCLUDE)) == (TS_ISOPEN|TS_XCLUDE) ! 206: && u.u_uid != 0) ! 207: return (EBUSY); ! 208: if ((ip->flags & ITE_ACTIVE) == 0) { ! 209: error = iteon(dev, 0); ! 210: if (error) ! 211: return (error); ! 212: first = 1; ! 213: } ! 214: tp->t_oproc = itestart; ! 215: tp->t_param = NULL; ! 216: tp->t_dev = dev; ! 217: if ((tp->t_state&TS_ISOPEN) == 0) { ! 218: ttychars(tp); ! 219: tp->t_iflag = TTYDEF_IFLAG; ! 220: tp->t_oflag = TTYDEF_OFLAG; ! 221: tp->t_cflag = CS8|CREAD; ! 222: tp->t_lflag = TTYDEF_LFLAG; ! 223: tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED; ! 224: tp->t_state = TS_ISOPEN|TS_CARR_ON; ! 225: ttsetwater(tp); ! 226: } ! 227: error = (*linesw[tp->t_line].l_open)(dev, tp); ! 228: if (error == 0) { ! 229: tp->t_winsize.ws_row = ip->rows; ! 230: tp->t_winsize.ws_col = ip->cols; ! 231: } else if (first) ! 232: iteoff(dev, 0); ! 233: return (error); ! 234: } ! 235: ! 236: /*ARGSUSED*/ ! 237: iteclose(dev, flag) ! 238: dev_t dev; ! 239: { ! 240: register struct tty *tp = &ite_tty[UNIT(dev)]; ! 241: ! 242: (*linesw[tp->t_line].l_close)(tp); ! 243: ttyclose(tp); ! 244: iteoff(dev, 0); ! 245: return(0); ! 246: } ! 247: ! 248: iteread(dev, uio, flag) ! 249: dev_t dev; ! 250: struct uio *uio; ! 251: { ! 252: register struct tty *tp = &ite_tty[UNIT(dev)]; ! 253: ! 254: return ((*linesw[tp->t_line].l_read)(tp, uio, flag)); ! 255: } ! 256: ! 257: itewrite(dev, uio, flag) ! 258: dev_t dev; ! 259: struct uio *uio; ! 260: { ! 261: int unit = UNIT(dev); ! 262: register struct tty *tp = &ite_tty[unit]; ! 263: ! 264: if ((ite_softc[unit].flags & ITE_ISCONS) && constty && ! 265: (constty->t_state&(TS_CARR_ON|TS_ISOPEN))==(TS_CARR_ON|TS_ISOPEN)) ! 266: tp = constty; ! 267: return ((*linesw[tp->t_line].l_write)(tp, uio, flag)); ! 268: } ! 269: ! 270: iteioctl(dev, cmd, addr, flag) ! 271: dev_t dev; ! 272: caddr_t addr; ! 273: { ! 274: register struct tty *tp = &ite_tty[UNIT(dev)]; ! 275: int error; ! 276: ! 277: error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, addr, flag); ! 278: if (error >= 0) ! 279: return (error); ! 280: error = ttioctl(tp, cmd, addr, flag); ! 281: if (error >= 0) ! 282: return (error); ! 283: return (ENOTTY); ! 284: } ! 285: ! 286: itestart(tp) ! 287: register struct tty *tp; ! 288: { ! 289: register int cc, s; ! 290: int hiwat = 0; ! 291: ! 292: s = spltty(); ! 293: if (tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP)) { ! 294: splx(s); ! 295: return; ! 296: } ! 297: tp->t_state |= TS_BUSY; ! 298: cc = tp->t_outq.c_cc; ! 299: if (cc <= tp->t_lowat) { ! 300: if (tp->t_state & TS_ASLEEP) { ! 301: tp->t_state &= ~TS_ASLEEP; ! 302: wakeup(&tp->t_outq); ! 303: } ! 304: if (tp->t_wsel) { ! 305: selwakeup(tp->t_wsel, tp->t_state & TS_WCOLL); ! 306: tp->t_wsel = 0; ! 307: tp->t_state &= ~TS_WCOLL; ! 308: } ! 309: } ! 310: /* ! 311: * Limit the amount of output we do in one burst ! 312: * to prevent hogging the CPU. ! 313: */ ! 314: if (cc > iteburst) { ! 315: hiwat++; ! 316: cc = iteburst; ! 317: } ! 318: while (--cc >= 0) { ! 319: register int c; ! 320: ! 321: c = getc(&tp->t_outq); ! 322: /* ! 323: * iteputchar() may take a long time and we don't want to ! 324: * block all interrupts for long periods of time. Since ! 325: * there is no need to stay at high priority while outputing ! 326: * the character (since we don't have to worry about ! 327: * interrupts), we don't. We just need to make sure that ! 328: * we don't reenter iteputchar, which is guarenteed by the ! 329: * earlier setting of TS_BUSY. ! 330: */ ! 331: splx(s); ! 332: iteputchar(c, tp->t_dev); ! 333: spltty(); ! 334: } ! 335: if (hiwat) { ! 336: tp->t_state |= TS_TIMEOUT; ! 337: timeout(ttrstrt, tp, 1); ! 338: } ! 339: tp->t_state &= ~TS_BUSY; ! 340: splx(s); ! 341: } ! 342: ! 343: itefilter(stat, c) ! 344: register char stat, c; ! 345: { ! 346: static int capsmode = 0; ! 347: static int metamode = 0; ! 348: register char code, *str; ! 349: ! 350: if (kbd_tty == NULL) ! 351: return; ! 352: ! 353: switch (c & 0xFF) { ! 354: case KBD_CAPSLOCK: ! 355: capsmode = !capsmode; ! 356: return; ! 357: ! 358: case KBD_EXT_LEFT_DOWN: ! 359: case KBD_EXT_RIGHT_DOWN: ! 360: metamode = 1; ! 361: return; ! 362: ! 363: case KBD_EXT_LEFT_UP: ! 364: case KBD_EXT_RIGHT_UP: ! 365: metamode = 0; ! 366: return; ! 367: } ! 368: ! 369: c &= KBD_CHARMASK; ! 370: switch ((stat>>KBD_SSHIFT) & KBD_SMASK) { ! 371: ! 372: case KBD_KEY: ! 373: if (!capsmode) { ! 374: code = kbd_keymap[c]; ! 375: break; ! 376: } ! 377: /* fall into... */ ! 378: ! 379: case KBD_SHIFT: ! 380: code = kbd_shiftmap[c]; ! 381: break; ! 382: ! 383: case KBD_CTRL: ! 384: code = kbd_ctrlmap[c]; ! 385: break; ! 386: ! 387: case KBD_CTRLSHIFT: ! 388: code = kbd_ctrlshiftmap[c]; ! 389: break; ! 390: } ! 391: ! 392: if (code == NULL && (str = kbd_stringmap[c]) != NULL) { ! 393: while (*str) ! 394: (*linesw[kbd_tty->t_line].l_rint)(*str++, kbd_tty); ! 395: } else { ! 396: if (metamode) ! 397: code |= 0x80; ! 398: (*linesw[kbd_tty->t_line].l_rint)(code, kbd_tty); ! 399: } ! 400: } ! 401: ! 402: iteputchar(c, dev) ! 403: register int c; ! 404: dev_t dev; ! 405: { ! 406: int unit = UNIT(dev); ! 407: register struct ite_softc *ip = &ite_softc[unit]; ! 408: register struct itesw *sp = &itesw[ip->type]; ! 409: register int n; ! 410: ! 411: if ((ip->flags & (ITE_ACTIVE|ITE_INGRF)) != ITE_ACTIVE) ! 412: return; ! 413: ! 414: if (ip->escape) { ! 415: doesc: ! 416: switch (ip->escape) { ! 417: ! 418: case '&': /* Next can be a,d, or s */ ! 419: if (ip->fpd++) { ! 420: ip->escape = c; ! 421: ip->fpd = 0; ! 422: } ! 423: return; ! 424: ! 425: case 'a': /* cursor change */ ! 426: switch (c) { ! 427: ! 428: case 'Y': /* Only y coord. */ ! 429: ip->cury = MIN(ip->pos, ip->rows-1); ! 430: ip->pos = 0; ! 431: ip->escape = 0; ! 432: (*sp->ite_cursor)(ip, MOVE_CURSOR); ! 433: clr_attr(ip, ATTR_INV); ! 434: break; ! 435: ! 436: case 'y': /* y coord first */ ! 437: ip->cury = MIN(ip->pos, ip->rows-1); ! 438: ip->pos = 0; ! 439: ip->fpd = 0; ! 440: break; ! 441: ! 442: case 'C': /* x coord */ ! 443: ip->curx = MIN(ip->pos, ip->cols-1); ! 444: ip->pos = 0; ! 445: ip->escape = 0; ! 446: (*sp->ite_cursor)(ip, MOVE_CURSOR); ! 447: clr_attr(ip, ATTR_INV); ! 448: break; ! 449: ! 450: default: /* Possibly a 3 digit number. */ ! 451: if (c >= '0' && c <= '9' && ip->fpd < 3) { ! 452: ip->pos = ip->pos * 10 + (c - '0'); ! 453: ip->fpd++; ! 454: } else { ! 455: ip->pos = 0; ! 456: ip->escape = 0; ! 457: } ! 458: break; ! 459: } ! 460: return; ! 461: ! 462: case 'd': /* attribute change */ ! 463: switch (c) { ! 464: ! 465: case 'B': ! 466: set_attr(ip, ATTR_INV); ! 467: break; ! 468: case 'D': ! 469: /* XXX: we don't do anything for underline */ ! 470: set_attr(ip, ATTR_UL); ! 471: break; ! 472: case '@': ! 473: clr_attr(ip, ATTR_ALL); ! 474: break; ! 475: } ! 476: ip->escape = 0; ! 477: return; ! 478: ! 479: case 's': /* keypad control */ ! 480: switch (ip->fpd) { ! 481: ! 482: case 0: ! 483: ip->hold = c; ! 484: ip->fpd++; ! 485: return; ! 486: ! 487: case 1: ! 488: if (c == 'A') { ! 489: switch (ip->hold) { ! 490: ! 491: case '0': ! 492: clr_attr(ip, ATTR_KPAD); ! 493: break; ! 494: case '1': ! 495: set_attr(ip, ATTR_KPAD); ! 496: break; ! 497: } ! 498: } ! 499: ip->hold = 0; ! 500: } ! 501: ip->escape = 0; ! 502: return; ! 503: ! 504: case 'i': /* back tab */ ! 505: if (ip->curx > TABSIZE) { ! 506: n = ip->curx - (ip->curx & (TABSIZE - 1)); ! 507: ip->curx -= n; ! 508: } else ! 509: ip->curx = 0; ! 510: (*sp->ite_cursor)(ip, MOVE_CURSOR); ! 511: ip->escape = 0; ! 512: return; ! 513: ! 514: case '3': /* clear all tabs */ ! 515: goto ignore; ! 516: ! 517: case 'K': /* clear_eol */ ! 518: ite_clrtoeol(ip, sp, ip->cury, ip->curx); ! 519: ip->escape = 0; ! 520: return; ! 521: ! 522: case 'J': /* clear_eos */ ! 523: ite_clrtoeos(ip, sp); ! 524: ip->escape = 0; ! 525: return; ! 526: ! 527: case 'B': /* cursor down 1 line */ ! 528: if (++ip->cury == ip->rows) { ! 529: --ip->cury; ! 530: (*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP); ! 531: ite_clrtoeol(ip, sp, ip->cury, 0); ! 532: } ! 533: else ! 534: (*sp->ite_cursor)(ip, MOVE_CURSOR); ! 535: clr_attr(ip, ATTR_INV); ! 536: ip->escape = 0; ! 537: return; ! 538: ! 539: case 'C': /* cursor forward 1 char */ ! 540: ip->escape = 0; ! 541: itecheckwrap(ip, sp); ! 542: return; ! 543: ! 544: case 'A': /* cursor up 1 line */ ! 545: if (ip->cury > 0) { ! 546: ip->cury--; ! 547: (*sp->ite_cursor)(ip, MOVE_CURSOR); ! 548: } ! 549: ip->escape = 0; ! 550: clr_attr(ip, ATTR_INV); ! 551: return; ! 552: ! 553: case 'P': /* delete character */ ! 554: ite_dchar(ip, sp); ! 555: ip->escape = 0; ! 556: return; ! 557: ! 558: case 'M': /* delete line */ ! 559: ite_dline(ip, sp); ! 560: ip->escape = 0; ! 561: return; ! 562: ! 563: case 'Q': /* enter insert mode */ ! 564: ip->imode = 1; ! 565: ip->escape = 0; ! 566: return; ! 567: ! 568: case 'R': /* exit insert mode */ ! 569: ip->imode = 0; ! 570: ip->escape = 0; ! 571: return; ! 572: ! 573: case 'L': /* insert blank line */ ! 574: ite_iline(ip, sp); ! 575: ip->escape = 0; ! 576: return; ! 577: ! 578: case 'h': /* home key */ ! 579: ip->cury = ip->curx = 0; ! 580: (*sp->ite_cursor)(ip, MOVE_CURSOR); ! 581: ip->escape = 0; ! 582: return; ! 583: ! 584: case 'D': /* left arrow key */ ! 585: if (ip->curx > 0) { ! 586: ip->curx--; ! 587: (*sp->ite_cursor)(ip, MOVE_CURSOR); ! 588: } ! 589: ip->escape = 0; ! 590: return; ! 591: ! 592: case '1': /* set tab in all rows */ ! 593: goto ignore; ! 594: ! 595: case ESC: ! 596: if ((ip->escape = c) == ESC) ! 597: break; ! 598: ip->fpd = 0; ! 599: goto doesc; ! 600: ! 601: default: ! 602: ignore: ! 603: ip->escape = 0; ! 604: return; ! 605: ! 606: } ! 607: } ! 608: ! 609: switch (c &= 0x7F) { ! 610: ! 611: case '\n': ! 612: ! 613: if (++ip->cury == ip->rows) { ! 614: --ip->cury; ! 615: (*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP); ! 616: ite_clrtoeol(ip, sp, ip->cury, 0); ! 617: } ! 618: else ! 619: (*sp->ite_cursor)(ip, MOVE_CURSOR); ! 620: clr_attr(ip, ATTR_INV); ! 621: break; ! 622: ! 623: case '\r': ! 624: if (ip->curx) { ! 625: ip->curx = 0; ! 626: (*sp->ite_cursor)(ip, MOVE_CURSOR); ! 627: } ! 628: break; ! 629: ! 630: case '\b': ! 631: if (--ip->curx < 0) ! 632: ip->curx = 0; ! 633: else ! 634: (*sp->ite_cursor)(ip, MOVE_CURSOR); ! 635: break; ! 636: ! 637: case '\t': ! 638: if (ip->curx < TABEND(unit)) { ! 639: n = TABSIZE - (ip->curx & (TABSIZE - 1)); ! 640: ip->curx += n; ! 641: (*sp->ite_cursor)(ip, MOVE_CURSOR); ! 642: } else ! 643: itecheckwrap(ip, sp); ! 644: break; ! 645: ! 646: case CTRL('G'): ! 647: if (&ite_tty[unit] == kbd_tty) ! 648: kbdbell(); ! 649: break; ! 650: ! 651: case ESC: ! 652: ip->escape = ESC; ! 653: break; ! 654: ! 655: default: ! 656: if (c < ' ' || c == DEL) ! 657: break; ! 658: if (ip->imode) ! 659: ite_ichar(ip, sp); ! 660: if ((ip->attribute & ATTR_INV) || attrtest(ip, ATTR_INV)) { ! 661: attrset(ip, ATTR_INV); ! 662: (*sp->ite_putc)(ip, c, ip->cury, ip->curx, ATTR_INV); ! 663: } ! 664: else ! 665: (*sp->ite_putc)(ip, c, ip->cury, ip->curx, ATTR_NOR); ! 666: (*sp->ite_cursor)(ip, DRAW_CURSOR); ! 667: itecheckwrap(ip, sp); ! 668: break; ! 669: } ! 670: } ! 671: ! 672: itecheckwrap(ip, sp) ! 673: register struct ite_softc *ip; ! 674: register struct itesw *sp; ! 675: { ! 676: if (++ip->curx == ip->cols) { ! 677: ip->curx = 0; ! 678: clr_attr(ip, ATTR_INV); ! 679: if (++ip->cury == ip->rows) { ! 680: --ip->cury; ! 681: (*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP); ! 682: ite_clrtoeol(ip, sp, ip->cury, 0); ! 683: return; ! 684: } ! 685: } ! 686: (*sp->ite_cursor)(ip, MOVE_CURSOR); ! 687: } ! 688: ! 689: ite_dchar(ip, sp) ! 690: register struct ite_softc *ip; ! 691: register struct itesw *sp; ! 692: { ! 693: (*sp->ite_scroll)(ip, ip->cury, ip->curx + 1, 1, SCROLL_LEFT); ! 694: attrmov(ip, ip->cury, ip->curx + 1, ip->cury, ip->curx, ! 695: 1, ip->cols - ip->curx - 1); ! 696: attrclr(ip, ip->cury, ip->cols - 1, 1, 1); ! 697: (*sp->ite_putc)(ip, ' ', ip->cury, ip->cols - 1, ATTR_NOR); ! 698: (*sp->ite_cursor)(ip, DRAW_CURSOR); ! 699: } ! 700: ! 701: ite_ichar(ip, sp) ! 702: register struct ite_softc *ip; ! 703: register struct itesw *sp; ! 704: { ! 705: (*sp->ite_scroll)(ip, ip->cury, ip->curx, 1, SCROLL_RIGHT); ! 706: attrmov(ip, ip->cury, ip->curx, ip->cury, ip->curx + 1, ! 707: 1, ip->cols - ip->curx - 1); ! 708: attrclr(ip, ip->cury, ip->curx, 1, 1); ! 709: (*sp->ite_putc)(ip, ' ', ip->cury, ip->curx, ATTR_NOR); ! 710: (*sp->ite_cursor)(ip, DRAW_CURSOR); ! 711: } ! 712: ! 713: ite_dline(ip, sp) ! 714: register struct ite_softc *ip; ! 715: register struct itesw *sp; ! 716: { ! 717: (*sp->ite_scroll)(ip, ip->cury + 1, 0, 1, SCROLL_UP); ! 718: attrmov(ip, ip->cury + 1, 0, ip->cury, 0, ! 719: ip->rows - ip->cury - 1, ip->cols); ! 720: ite_clrtoeol(ip, sp, ip->rows - 1, 0); ! 721: } ! 722: ! 723: ite_iline(ip, sp) ! 724: register struct ite_softc *ip; ! 725: register struct itesw *sp; ! 726: { ! 727: (*sp->ite_scroll)(ip, ip->cury, 0, 1, SCROLL_DOWN); ! 728: attrmov(ip, ip->cury, 0, ip->cury + 1, 0, ! 729: ip->rows - ip->cury - 1, ip->cols); ! 730: ite_clrtoeol(ip, sp, ip->cury, 0); ! 731: } ! 732: ! 733: ite_clrtoeol(ip, sp, y, x) ! 734: register struct ite_softc *ip; ! 735: register struct itesw *sp; ! 736: register int y, x; ! 737: { ! 738: (*sp->ite_clear)(ip, y, x, 1, ip->cols - x); ! 739: attrclr(ip, y, x, 1, ip->cols - x); ! 740: (*sp->ite_cursor)(ip, DRAW_CURSOR); ! 741: } ! 742: ! 743: ite_clrtoeos(ip, sp) ! 744: register struct ite_softc *ip; ! 745: register struct itesw *sp; ! 746: { ! 747: (*sp->ite_clear)(ip, ip->cury, 0, ip->rows - ip->cury, ip->cols); ! 748: attrclr(ip, ip->cury, 0, ip->rows - ip->cury, ip->cols); ! 749: (*sp->ite_cursor)(ip, DRAW_CURSOR); ! 750: } ! 751: ! 752: /* ! 753: * Console functions ! 754: */ ! 755: #include "machine/cons.h" ! 756: #include "grfioctl.h" ! 757: #include "grfvar.h" ! 758: ! 759: #ifdef DEBUG ! 760: /* ! 761: * Minimum ITE number at which to start looking for a console. ! 762: * Setting to 0 will do normal search, 1 will skip first ITE device, ! 763: * NITE will skip ITEs and use serial port. ! 764: */ ! 765: int whichconsole = 0; ! 766: #endif ! 767: ! 768: itecnprobe(cp) ! 769: struct consdev *cp; ! 770: { ! 771: register struct ite_softc *ip; ! 772: int i, maj, unit, pri; ! 773: extern int iteopen(); ! 774: ! 775: /* locate the major number */ ! 776: for (maj = 0; maj < nchrdev; maj++) ! 777: if (cdevsw[maj].d_open == iteopen) ! 778: break; ! 779: ! 780: /* urk! */ ! 781: grfconfig(); ! 782: ! 783: /* check all the individual displays and find the best */ ! 784: unit = -1; ! 785: pri = CN_DEAD; ! 786: for (i = 0; i < NITE; i++) { ! 787: struct grf_softc *gp = &grf_softc[i]; ! 788: ! 789: ip = &ite_softc[i]; ! 790: if ((gp->g_flags & GF_ALIVE) == 0) ! 791: continue; ! 792: ip->flags = (ITE_ALIVE|ITE_CONSOLE); ! 793: ! 794: /* XXX - we need to do something about mapping these */ ! 795: switch (gp->g_type) { ! 796: ! 797: case GT_TOPCAT: ! 798: case GT_LRCATSEYE: ! 799: case GT_HRCCATSEYE: ! 800: case GT_HRMCATSEYE: ! 801: ip->type = ITE_TOPCAT; ! 802: break; ! 803: case GT_GATORBOX: ! 804: ip->type = ITE_GATORBOX; ! 805: break; ! 806: case GT_RENAISSANCE: ! 807: ip->type = ITE_RENAISSANCE; ! 808: break; ! 809: case GT_DAVINCI: ! 810: ip->type = ITE_DAVINCI; ! 811: break; ! 812: } ! 813: #ifdef DEBUG ! 814: if (i < whichconsole) ! 815: continue; ! 816: #endif ! 817: if ((int)gp->g_display.gd_regaddr == GRFIADDR) { ! 818: pri = CN_INTERNAL; ! 819: unit = i; ! 820: } else if (unit < 0) { ! 821: pri = CN_NORMAL; ! 822: unit = i; ! 823: } ! 824: } ! 825: ! 826: /* initialize required fields */ ! 827: cp->cn_dev = makedev(maj, unit); ! 828: cp->cn_tp = &ite_tty[unit]; ! 829: cp->cn_pri = pri; ! 830: } ! 831: ! 832: itecninit(cp) ! 833: struct consdev *cp; ! 834: { ! 835: int unit = UNIT(cp->cn_dev); ! 836: struct ite_softc *ip = &ite_softc[unit]; ! 837: ! 838: ip->attrbuf = console_attributes; ! 839: iteinit(cp->cn_dev); ! 840: ip->flags |= (ITE_ACTIVE|ITE_ISCONS); ! 841: kbd_tty = &ite_tty[unit]; ! 842: } ! 843: ! 844: /*ARGSUSED*/ ! 845: itecngetc(dev) ! 846: dev_t dev; ! 847: { ! 848: register int c; ! 849: int stat; ! 850: ! 851: c = kbdgetc(&stat); ! 852: switch ((stat >> KBD_SSHIFT) & KBD_SMASK) { ! 853: case KBD_SHIFT: ! 854: c = kbd_shiftmap[c & KBD_CHARMASK]; ! 855: break; ! 856: case KBD_CTRL: ! 857: c = kbd_ctrlmap[c & KBD_CHARMASK]; ! 858: break; ! 859: case KBD_KEY: ! 860: c = kbd_keymap[c & KBD_CHARMASK]; ! 861: break; ! 862: default: ! 863: c = 0; ! 864: break; ! 865: } ! 866: return(c); ! 867: } ! 868: ! 869: itecnputc(dev, c) ! 870: dev_t dev; ! 871: int c; ! 872: { ! 873: static int paniced = 0; ! 874: struct ite_softc *ip = &ite_softc[UNIT(dev)]; ! 875: extern char *panicstr; ! 876: ! 877: if (panicstr && !paniced && ! 878: (ip->flags & (ITE_ACTIVE|ITE_INGRF)) != ITE_ACTIVE) { ! 879: (void) iteon(dev, 3); ! 880: paniced = 1; ! 881: } ! 882: iteputchar(c, dev); ! 883: } ! 884: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.