141488Smckusick /* 241488Smckusick * Copyright (c) 1988 University of Utah. 341488Smckusick * Copyright (c) 1990 The Regents of the University of California. 441488Smckusick * All rights reserved. 541488Smckusick * 641488Smckusick * This code is derived from software contributed to Berkeley by 741488Smckusick * the Systems Programming Group of the University of Utah Computer 841488Smckusick * Science Department. 941488Smckusick * 1041488Smckusick * %sccs.include.redist.c% 1141488Smckusick * 1241488Smckusick * from: Utah $Hdr: ite.c 1.19 89/08/22$ 1341488Smckusick * 14*45790Sbostic * @(#)ite.c 7.2 (Berkeley) 12/16/90 1541488Smckusick */ 1641488Smckusick 1741488Smckusick /* 1841488Smckusick * Standalone Internal Terminal Emulator (CRT and keyboard) 1941488Smckusick */ 2041488Smckusick #include "samachdep.h" 2141488Smckusick 2241488Smckusick #ifdef ITECONSOLE 2341488Smckusick 24*45790Sbostic #include "sys/param.h" 25*45790Sbostic #include "../hp300/cons.h" 26*45790Sbostic #include "../dev/device.h" 27*45790Sbostic #include "../dev/itevar.h" 28*45790Sbostic #include "../dev/grfvar.h" 2941488Smckusick 3041488Smckusick int nodev(); 3141488Smckusick 3241488Smckusick int topcat_init(), topcat_putc(); 3341488Smckusick int topcat_clear(), topcat_cursor(), topcat_scroll(); 3441488Smckusick int gatorbox_init(), gatorbox_clear(); 3541488Smckusick int gatorbox_putc(), gatorbox_cursor(), gatorbox_scroll(); 3641488Smckusick int rbox_init(), rbox_clear(); 3741488Smckusick int rbox_putc(), rbox_cursor(), rbox_scroll(); 3841488Smckusick int dvbox_init(), dvbox_clear(); 3941488Smckusick int dvbox_putc(), dvbox_cursor(), dvbox_scroll(); 4041488Smckusick 4141488Smckusick struct itesw itesw[] = { 4241488Smckusick topcat_init, nodev, topcat_clear, 4341488Smckusick topcat_putc, topcat_cursor, topcat_scroll, 4441488Smckusick 4541488Smckusick gatorbox_init, nodev, gatorbox_clear, 4641488Smckusick gatorbox_putc, gatorbox_cursor, gatorbox_scroll, 4741488Smckusick 4841488Smckusick rbox_init, nodev, rbox_clear, 4941488Smckusick rbox_putc, rbox_cursor, rbox_scroll, 5041488Smckusick 5141488Smckusick dvbox_init, nodev, dvbox_clear, 5241488Smckusick dvbox_putc, dvbox_cursor, dvbox_scroll, 5341488Smckusick }; 5441488Smckusick 5541488Smckusick /* these guys need to be in initialized data */ 5641488Smckusick int itecons = -1; 5741488Smckusick struct ite_softc ite_softc[NITE] = { 0 }; 5841488Smckusick 5941488Smckusick /* 6041488Smckusick * Locate all bitmapped displays 6141488Smckusick */ 6241488Smckusick iteconfig() 6341488Smckusick { 6441488Smckusick extern struct hp_hw sc_table[]; 6541488Smckusick int dtype, fboff, i; 6641488Smckusick struct hp_hw *hw; 6741488Smckusick struct grfreg *gr; 6841488Smckusick struct ite_softc *ip; 6941488Smckusick 7041488Smckusick i = 0; 7141488Smckusick for (hw = sc_table; hw < &sc_table[MAX_CTLR]; hw++) { 7241488Smckusick if (hw->hw_type != BITMAP) 7341488Smckusick continue; 7441488Smckusick gr = (struct grfreg *) hw->hw_addr; 7541488Smckusick /* XXX: redundent but safe */ 7641488Smckusick if (badaddr((caddr_t)gr) || gr->gr_id != GRFHWID) 7741488Smckusick continue; 7841488Smckusick switch (gr->gr_id2) { 7941488Smckusick case GID_GATORBOX: 8041488Smckusick dtype = ITE_GATORBOX; 8141488Smckusick break; 8241488Smckusick case GID_TOPCAT: 8341488Smckusick case GID_LRCATSEYE: 8441488Smckusick case GID_HRCCATSEYE: 8541488Smckusick case GID_HRMCATSEYE: 8641488Smckusick dtype = ITE_TOPCAT; 8741488Smckusick break; 8841488Smckusick case GID_RENAISSANCE: 8941488Smckusick dtype = ITE_RENAISSANCE; 9041488Smckusick break; 9141488Smckusick case GID_DAVINCI: 9241488Smckusick dtype = ITE_DAVINCI; 9341488Smckusick break; 9441488Smckusick default: 9541488Smckusick continue; 9641488Smckusick } 9741488Smckusick if (i >= NITE) 9841488Smckusick break; 9941488Smckusick ip = &ite_softc[i]; 10041488Smckusick ip->regbase = (caddr_t) gr; 10141488Smckusick fboff = (gr->gr_fbomsb << 8) | gr->gr_fbolsb; 10241488Smckusick ip->fbbase = (caddr_t) (*((u_char *)ip->regbase+fboff) << 16); 10341488Smckusick /* DIO II: FB offset is relative to select code space */ 10441488Smckusick if (ip->regbase >= (caddr_t)0x1000000) 10541488Smckusick ip->fbbase += (int)ip->regbase; 10641488Smckusick ip->flags = ITE_ALIVE|ITE_CONSOLE; 10741488Smckusick ip->type = dtype; 10841488Smckusick i++; 10941488Smckusick } 11041488Smckusick } 11141488Smckusick 11241488Smckusick #ifdef CONSDEBUG 11341488Smckusick /* 11441488Smckusick * Allows us to cycle through all possible consoles (NITE ites and serial port) 11541488Smckusick * by using SHIFT-RESET on the keyboard. 11641488Smckusick */ 11741488Smckusick int whichconsole = -1; 11841488Smckusick #endif 11941488Smckusick 12041488Smckusick iteprobe(cp) 12141488Smckusick struct consdev *cp; 12241488Smckusick { 12341488Smckusick register int ite; 12441488Smckusick register struct ite_softc *ip; 12541488Smckusick int unit, pri; 12641488Smckusick 12741488Smckusick #ifdef CONSDEBUG 12841488Smckusick whichconsole = ++whichconsole % (NITE+1); 12941488Smckusick #endif 13041488Smckusick 13141488Smckusick if (itecons != -1) 13241488Smckusick return(1); 13341488Smckusick 13441488Smckusick iteconfig(); 13541488Smckusick unit = -1; 13641488Smckusick pri = CN_DEAD; 13741488Smckusick for (ite = 0; ite < NITE; ite++) { 13841488Smckusick #ifdef CONSDEBUG 13941488Smckusick if (ite < whichconsole) 14041488Smckusick continue; 14141488Smckusick #endif 14241488Smckusick ip = &ite_softc[ite]; 14341488Smckusick if ((ip->flags & (ITE_ALIVE|ITE_CONSOLE)) 14441488Smckusick != (ITE_ALIVE|ITE_CONSOLE)) 14541488Smckusick continue; 14641488Smckusick if ((int)ip->regbase == GRFIADDR) { 14741488Smckusick pri = CN_INTERNAL; 14841488Smckusick unit = ite; 14941488Smckusick } else if (unit < 0) { 15041488Smckusick pri = CN_NORMAL; 15141488Smckusick unit = ite; 15241488Smckusick } 15341488Smckusick } 15441488Smckusick cp->cn_dev = unit; 15541488Smckusick cp->cn_pri = pri; 15641488Smckusick } 15741488Smckusick 15841488Smckusick iteinit(cp) 15941488Smckusick struct consdev *cp; 16041488Smckusick { 16141488Smckusick int ite = cp->cn_dev; 16241488Smckusick struct ite_softc *ip; 16341488Smckusick 16441488Smckusick if (itecons != -1) 16541488Smckusick return(1); 16641488Smckusick 16741488Smckusick ip = &ite_softc[ite]; 16841488Smckusick 16941488Smckusick ip->curx = 0; 17041488Smckusick ip->cury = 0; 17141488Smckusick ip->cursorx = 0; 17241488Smckusick ip->cursory = 0; 17341488Smckusick 17441488Smckusick (*itesw[ip->type].ite_init)(ip); 17541488Smckusick (*itesw[ip->type].ite_cursor)(ip, DRAW_CURSOR); 17641488Smckusick 17741488Smckusick itecons = ite; 17841488Smckusick kbdinit(); 17941488Smckusick } 18041488Smckusick 18141488Smckusick iteputchar(c) 18241488Smckusick register int c; 18341488Smckusick { 18441488Smckusick register struct ite_softc *ip = &ite_softc[itecons]; 18541488Smckusick register struct itesw *sp = &itesw[ip->type]; 18641488Smckusick 18741488Smckusick c &= 0x7F; 18841488Smckusick switch (c) { 18941488Smckusick 19041488Smckusick case '\n': 19141488Smckusick if (++ip->cury == ip->rows) { 19241488Smckusick ip->cury--; 19341488Smckusick (*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP); 19441488Smckusick ite_clrtoeol(ip, sp, ip->cury, 0); 19541488Smckusick } 19641488Smckusick else 19741488Smckusick (*sp->ite_cursor)(ip, MOVE_CURSOR); 19841488Smckusick break; 19941488Smckusick 20041488Smckusick case '\r': 20141488Smckusick ip->curx = 0; 20241488Smckusick (*sp->ite_cursor)(ip, MOVE_CURSOR); 20341488Smckusick break; 20441488Smckusick 20541488Smckusick case '\b': 20641488Smckusick if (--ip->curx < 0) 20741488Smckusick ip->curx = 0; 20841488Smckusick else 20941488Smckusick (*sp->ite_cursor)(ip, MOVE_CURSOR); 21041488Smckusick break; 21141488Smckusick 21241488Smckusick default: 21341488Smckusick if (c < ' ' || c == 0177) 21441488Smckusick break; 21541488Smckusick (*sp->ite_putc)(ip, c, ip->cury, ip->curx, ATTR_NOR); 21641488Smckusick (*sp->ite_cursor)(ip, DRAW_CURSOR); 21741488Smckusick itecheckwrap(ip, sp); 21841488Smckusick break; 21941488Smckusick } 22041488Smckusick } 22141488Smckusick 22241488Smckusick itecheckwrap(ip, sp) 22341488Smckusick register struct ite_softc *ip; 22441488Smckusick register struct itesw *sp; 22541488Smckusick { 22641488Smckusick if (++ip->curx == ip->cols) { 22741488Smckusick ip->curx = 0; 22841488Smckusick if (++ip->cury == ip->rows) { 22941488Smckusick --ip->cury; 23041488Smckusick (*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP); 23141488Smckusick ite_clrtoeol(ip, sp, ip->cury, 0); 23241488Smckusick return; 23341488Smckusick } 23441488Smckusick } 23541488Smckusick (*sp->ite_cursor)(ip, MOVE_CURSOR); 23641488Smckusick } 23741488Smckusick 23841488Smckusick ite_clrtoeol(ip, sp, y, x) 23941488Smckusick register struct ite_softc *ip; 24041488Smckusick register struct itesw *sp; 24141488Smckusick register int y, x; 24241488Smckusick { 24341488Smckusick (*sp->ite_clear)(ip, y, x, 1, ip->cols - x); 24441488Smckusick (*sp->ite_cursor)(ip, DRAW_CURSOR); 24541488Smckusick } 24641488Smckusick 24741488Smckusick itegetchar() 24841488Smckusick { 24941488Smckusick #ifdef SMALL 25041488Smckusick return (0); 25141488Smckusick #else 25241488Smckusick return (kbdgetc()); 25341488Smckusick #endif 25441488Smckusick } 25541488Smckusick #endif 256