home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / hp300 / stand / ite.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-07  |  6.7 KB  |  282 lines

  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 and use in source and binary forms, with or without
  11.  * modification, are permitted provided that the following conditions
  12.  * are met:
  13.  * 1. Redistributions of source code must retain the above copyright
  14.  *    notice, this list of conditions and the following disclaimer.
  15.  * 2. Redistributions in binary form must reproduce the above copyright
  16.  *    notice, this list of conditions and the following disclaimer in the
  17.  *    documentation and/or other materials provided with the distribution.
  18.  * 3. All advertising materials mentioning features or use of this software
  19.  *    must display the following acknowledgement:
  20.  *    This product includes software developed by the University of
  21.  *    California, Berkeley and its contributors.
  22.  * 4. Neither the name of the University nor the names of its contributors
  23.  *    may be used to endorse or promote products derived from this software
  24.  *    without specific prior written permission.
  25.  *
  26.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  27.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  28.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  29.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  30.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  31.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  32.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  33.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  34.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  35.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  36.  * SUCH DAMAGE.
  37.  *
  38.  * from: Utah $Hdr: ite.c 1.20 91/01/21$
  39.  *
  40.  *    @(#)ite.c    7.3 (Berkeley) 5/7/91
  41.  */
  42.  
  43. /*
  44.  * Standalone Internal Terminal Emulator (CRT and keyboard)
  45.  */
  46. #include "samachdep.h"
  47.  
  48. #ifdef ITECONSOLE
  49.  
  50. #include "sys/param.h"
  51. #include "../hp300/cons.h"
  52. #include "../dev/device.h"
  53. #include "../dev/itevar.h"
  54. #include "../dev/grfvar.h"
  55.  
  56. int nodev();
  57.  
  58. int topcat_init(), topcat_putc();
  59. int topcat_clear(), topcat_cursor(), topcat_scroll();
  60. int gatorbox_init(), gatorbox_clear();
  61. int gatorbox_putc(), gatorbox_cursor(), gatorbox_scroll();
  62. int rbox_init(), rbox_clear();
  63. int rbox_putc(), rbox_cursor(), rbox_scroll();
  64. int dvbox_init(), dvbox_clear();
  65. int dvbox_putc(), dvbox_cursor(), dvbox_scroll();
  66.  
  67. struct itesw itesw[] = {
  68.     topcat_init,        nodev,            topcat_clear,
  69.     topcat_putc,        topcat_cursor,        topcat_scroll,
  70.  
  71.     gatorbox_init,        nodev,            gatorbox_clear,
  72.     gatorbox_putc,        gatorbox_cursor,    gatorbox_scroll,
  73.  
  74.     rbox_init,        nodev,            rbox_clear,
  75.     rbox_putc,        rbox_cursor,        rbox_scroll,
  76.  
  77.           dvbox_init,        nodev,            dvbox_clear,
  78.     dvbox_putc,        dvbox_cursor,        dvbox_scroll,
  79. };
  80.  
  81. /* these guys need to be in initialized data */
  82. int itecons = -1;
  83. struct  ite_softc ite_softc[NITE] = { 0 };
  84.  
  85. /*
  86.  * Locate all bitmapped displays
  87.  */
  88. iteconfig()
  89. {
  90.     extern struct hp_hw sc_table[];
  91.     int dtype, fboff, i;
  92.     struct hp_hw *hw;
  93.     struct grfreg *gr;
  94.     struct ite_softc *ip;
  95.  
  96.     i = 0;
  97.     for (hw = sc_table; hw < &sc_table[MAXCTLRS]; hw++) {
  98.             if (!HW_ISDEV(hw, D_BITMAP))
  99.             continue;
  100.         gr = (struct grfreg *) hw->hw_kva;
  101.         /* XXX: redundent but safe */
  102.         if (badaddr((caddr_t)gr) || gr->gr_id != GRFHWID)
  103.             continue;
  104.         switch (gr->gr_id2) {
  105.         case GID_GATORBOX:
  106.             dtype = ITE_GATORBOX;
  107.             break;
  108.         case GID_TOPCAT:
  109.         case GID_LRCATSEYE:
  110.         case GID_HRCCATSEYE:
  111.         case GID_HRMCATSEYE:
  112.             dtype = ITE_TOPCAT;
  113.             break;
  114.         case GID_RENAISSANCE:
  115.             dtype = ITE_RENAISSANCE;
  116.             break;
  117.         case GID_DAVINCI:
  118.             dtype = ITE_DAVINCI;
  119.             break;
  120.         default:
  121.             continue;
  122.         }
  123.         if (i >= NITE)
  124.             break;
  125.         ip = &ite_softc[i];
  126.         ip->regbase = (caddr_t) gr;
  127.         fboff = (gr->gr_fbomsb << 8) | gr->gr_fbolsb;
  128.         ip->fbbase = (caddr_t) (*((u_char *)ip->regbase+fboff) << 16);
  129.         /* DIO II: FB offset is relative to select code space */
  130.         if (ip->regbase >= (caddr_t)DIOIIBASE)
  131.             ip->fbbase += (int)ip->regbase;
  132.         ip->flags = ITE_ALIVE|ITE_CONSOLE;
  133.         ip->type = dtype;
  134.         i++;
  135.     }
  136. }
  137.  
  138. #ifdef CONSDEBUG
  139. /*
  140.  * Allows us to cycle through all possible consoles (NITE ites and serial port)
  141.  * by using SHIFT-RESET on the keyboard.
  142.  */
  143. int    whichconsole = -1;
  144. #endif
  145.  
  146. iteprobe(cp)
  147.     struct consdev *cp;
  148. {
  149.     register int ite;
  150.     register struct ite_softc *ip;
  151.     int unit, pri;
  152.  
  153. #ifdef CONSDEBUG
  154.     whichconsole = ++whichconsole % (NITE+1);
  155. #endif
  156.  
  157.     if (itecons != -1)
  158.         return(1);
  159.  
  160.     iteconfig();
  161.     unit = -1;
  162.     pri = CN_DEAD;
  163.     for (ite = 0; ite < NITE; ite++) {
  164. #ifdef CONSDEBUG
  165.         if (ite < whichconsole)
  166.             continue;
  167. #endif
  168.         ip = &ite_softc[ite];
  169.         if ((ip->flags & (ITE_ALIVE|ITE_CONSOLE))
  170.             != (ITE_ALIVE|ITE_CONSOLE))
  171.             continue;
  172.         if ((int)ip->regbase == GRFIADDR) {
  173.             pri = CN_INTERNAL;
  174.             unit = ite;
  175.         } else if (unit < 0) {
  176.             pri = CN_NORMAL;
  177.             unit = ite;
  178.         }
  179.     }
  180.     cp->cn_dev = unit;
  181.     cp->cn_pri = pri;
  182. }
  183.  
  184. iteinit(cp)
  185.     struct consdev *cp;
  186. {
  187.     int ite = cp->cn_dev;
  188.     struct ite_softc *ip;
  189.  
  190.     if (itecons != -1)
  191.         return(1);
  192.  
  193.     ip = &ite_softc[ite];
  194.  
  195.     ip->curx = 0;
  196.     ip->cury = 0;
  197.     ip->cursorx = 0;
  198.     ip->cursory = 0;
  199.  
  200.     (*itesw[ip->type].ite_init)(ip);
  201.     (*itesw[ip->type].ite_cursor)(ip, DRAW_CURSOR);
  202.  
  203.     itecons = ite;
  204.     kbdinit();
  205. }
  206.  
  207. iteputchar(c)
  208.     register int c;
  209. {
  210.     register struct ite_softc *ip = &ite_softc[itecons];
  211.     register struct itesw *sp = &itesw[ip->type];
  212.  
  213.     c &= 0x7F;
  214.     switch (c) {
  215.  
  216.     case '\n':
  217.         if (++ip->cury == ip->rows) {
  218.             ip->cury--;
  219.             (*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP);
  220.             ite_clrtoeol(ip, sp, ip->cury, 0);
  221.         }
  222.         else
  223.             (*sp->ite_cursor)(ip, MOVE_CURSOR);
  224.         break;
  225.  
  226.     case '\r':
  227.         ip->curx = 0;
  228.         (*sp->ite_cursor)(ip, MOVE_CURSOR);
  229.         break;
  230.  
  231.     case '\b':
  232.         if (--ip->curx < 0)
  233.             ip->curx = 0;
  234.         else
  235.             (*sp->ite_cursor)(ip, MOVE_CURSOR);
  236.         break;
  237.  
  238.     default:
  239.         if (c < ' ' || c == 0177)
  240.             break;
  241.         (*sp->ite_putc)(ip, c, ip->cury, ip->curx, ATTR_NOR);
  242.         (*sp->ite_cursor)(ip, DRAW_CURSOR);
  243.         itecheckwrap(ip, sp);
  244.         break;
  245.     }
  246. }
  247.  
  248. itecheckwrap(ip, sp)
  249.      register struct ite_softc *ip;
  250.      register struct itesw *sp;
  251. {
  252.     if (++ip->curx == ip->cols) {
  253.         ip->curx = 0;
  254.         if (++ip->cury == ip->rows) {
  255.             --ip->cury;
  256.             (*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP);
  257.             ite_clrtoeol(ip, sp, ip->cury, 0);
  258.             return;
  259.         }
  260.     }
  261.     (*sp->ite_cursor)(ip, MOVE_CURSOR);
  262. }
  263.  
  264. ite_clrtoeol(ip, sp, y, x)
  265.      register struct ite_softc *ip;
  266.      register struct itesw *sp;
  267.      register int y, x;
  268. {
  269.     (*sp->ite_clear)(ip, y, x, 1, ip->cols - x);
  270.     (*sp->ite_cursor)(ip, DRAW_CURSOR);
  271. }
  272.  
  273. itegetchar()
  274. {
  275. #ifdef SMALL
  276.     return (0);
  277. #else
  278.     return (kbdgetc());
  279. #endif
  280. }
  281. #endif
  282.