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