home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / hp300 / dev / ite_rb.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-08  |  6.1 KB  |  246 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_rb.c 1.16 91/01/21$
  39.  *
  40.  *    @(#)ite_rb.c    7.5 (Berkeley) 5/7/91
  41.  */
  42.  
  43. #include "ite.h"
  44. #if NITE > 0
  45.  
  46. #include "param.h"
  47. #include "conf.h"
  48. #include "proc.h"
  49. #include "ioctl.h"
  50. #include "tty.h"
  51. #include "systm.h"
  52.  
  53. #include "itevar.h"
  54. #include "itereg.h"
  55. #include "grf_rbreg.h"
  56.  
  57. #include "machine/cpu.h"
  58.  
  59. /* XXX */
  60. #include "grfioctl.h"
  61. #include "grfvar.h"
  62.  
  63. #define REGBASE        ((struct rboxfb *)(ip->regbase))
  64. #define WINDOWMOVER    rbox_windowmove
  65.  
  66. rbox_init(ip)
  67.     struct ite_softc *ip;
  68. {
  69.     register int i;
  70.  
  71.     /* XXX */
  72.     if (ip->regbase == 0) {
  73.         struct grf_softc *gp = &grf_softc[ip - ite_softc];
  74.         ip->regbase = gp->g_regkva;
  75.         ip->fbbase = gp->g_fbkva;
  76.     }
  77.  
  78.     rb_waitbusy(REGADDR);
  79.  
  80.     REGBASE->reset = 0x39;
  81.     DELAY(1000);
  82.  
  83.     REGBASE->interrupt = 0x04;
  84.     REGBASE->display_enable = 0x01;
  85.     REGBASE->video_enable = 0x01;
  86.     REGBASE->drive = 0x01;
  87.     REGBASE->vdrive = 0x0;
  88.  
  89.     ite_devinfo(ip);
  90.     
  91.     REGBASE->opwen = 0xFF;
  92.  
  93.     /*
  94.      * Clear the framebuffer.
  95.      */
  96.     rbox_windowmove(ip, 0, 0, 0, 0, ip->fbheight, ip->fbwidth, RR_CLEAR);
  97.     rb_waitbusy(REGADDR);
  98.  
  99.     for(i = 0; i < 16; i++) {
  100.         *(REGADDR + 0x63c3 + i*4) = 0x0;
  101.         *(REGADDR + 0x6403 + i*4) = 0x0;
  102.         *(REGADDR + 0x6803 + i*4) = 0x0;
  103.         *(REGADDR + 0x6c03 + i*4) = 0x0;
  104.         *(REGADDR + 0x73c3 + i*4) = 0x0;
  105.         *(REGADDR + 0x7403 + i*4) = 0x0;
  106.         *(REGADDR + 0x7803 + i*4) = 0x0;
  107.         *(REGADDR + 0x7c03 + i*4) = 0x0;
  108.     }
  109.  
  110.     REGBASE->rep_rule = 0x33;
  111.     
  112.     /*
  113.      * I cannot figure out how to make the blink planes stop. So, we
  114.      * must set both colormaps so that when the planes blink, and
  115.      * the secondary colormap is active, we still get text.
  116.      */
  117.     CM1RED[0x00].value = 0x00;
  118.     CM1GRN[0x00].value = 0x00;
  119.     CM1BLU[0x00].value = 0x00;
  120.     CM1RED[0x01].value = 0xFF;
  121.     CM1GRN[0x01].value = 0xFF;
  122.     CM1BLU[0x01].value = 0xFF;
  123.  
  124.     CM2RED[0x00].value = 0x00;
  125.     CM2GRN[0x00].value = 0x00;
  126.     CM2BLU[0x00].value = 0x00;
  127.     CM2RED[0x01].value = 0xFF;
  128.     CM2GRN[0x01].value = 0xFF;
  129.     CM2BLU[0x01].value = 0xFF;
  130.  
  131.      REGBASE->blink = 0x00;
  132.     REGBASE->write_enable = 0x01;
  133.     REGBASE->opwen = 0x00;
  134.     
  135.     ite_fontinit(ip);
  136.     
  137.     /*
  138.      * Stash the inverted cursor.
  139.      */
  140.     rbox_windowmove(ip, charY(ip, ' '), charX(ip, ' '),
  141.                 ip->cblanky, ip->cblankx, ip->ftheight,
  142.                 ip->ftwidth, RR_COPYINVERTED);
  143. }
  144.  
  145. rbox_deinit(ip)
  146.     struct ite_softc *ip;
  147. {
  148.     rbox_windowmove(ip, 0, 0, 0, 0, ip->fbheight, ip->fbwidth, RR_CLEAR);
  149.     rb_waitbusy(REGADDR);
  150.  
  151.        ip->flags &= ~ITE_INITED;
  152. }
  153.  
  154. rbox_putc(ip, c, dy, dx, mode)
  155.     register struct ite_softc *ip;
  156.         register int dy, dx;
  157.     int c, mode;
  158. {
  159.         register int wrr = ((mode == ATTR_INV) ? RR_COPYINVERTED : RR_COPY);
  160.     
  161.     rbox_windowmove(ip, charY(ip, c), charX(ip, c),
  162.             dy * ip->ftheight, dx * ip->ftwidth,
  163.             ip->ftheight, ip->ftwidth, wrr);
  164. }
  165.  
  166. rbox_cursor(ip, flag)
  167.     register struct ite_softc *ip;
  168.         register int flag;
  169. {
  170.     if (flag == DRAW_CURSOR)
  171.         draw_cursor(ip)
  172.     else if (flag == MOVE_CURSOR) {
  173.         erase_cursor(ip)
  174.         draw_cursor(ip)
  175.     }
  176.     else
  177.         erase_cursor(ip)
  178. }
  179.  
  180. rbox_clear(ip, sy, sx, h, w)
  181.     struct ite_softc *ip;
  182.     register int sy, sx, h, w;
  183. {
  184.     rbox_windowmove(ip, sy * ip->ftheight, sx * ip->ftwidth,
  185.             sy * ip->ftheight, sx * ip->ftwidth, 
  186.             h  * ip->ftheight, w  * ip->ftwidth,
  187.             RR_CLEAR);
  188. }
  189.  
  190. rbox_scroll(ip, sy, sx, count, dir)
  191.         register struct ite_softc *ip;
  192.         register int sy, count;
  193.         int dir, sx;
  194. {
  195.     register int dy;
  196.     register int dx = sx;
  197.     register int height = 1;
  198.     register int width = ip->cols;
  199.  
  200.     rbox_cursor(ip, ERASE_CURSOR);
  201.  
  202.     if (dir == SCROLL_UP) {
  203.         dy = sy - count;
  204.         height = ip->rows - sy;
  205.     }
  206.     else if (dir == SCROLL_DOWN) {
  207.         dy = sy + count;
  208.         height = ip->rows - dy - 1;
  209.     }
  210.     else if (dir == SCROLL_RIGHT) {
  211.         dy = sy;
  212.         dx = sx + count;
  213.         width = ip->cols - dx;
  214.     }
  215.     else {
  216.         dy = sy;
  217.         dx = sx - count;
  218.         width = ip->cols - sx;
  219.     }        
  220.  
  221.     rbox_windowmove(ip, sy * ip->ftheight, sx * ip->ftwidth,
  222.             dy * ip->ftheight, dx * ip->ftwidth,
  223.             height * ip->ftheight,
  224.             width  * ip->ftwidth, RR_COPY);
  225. }
  226.  
  227. rbox_windowmove(ip, sy, sx, dy, dx, h, w, func)
  228.     struct ite_softc *ip;
  229.     int sy, sx, dy, dx, h, w, func;
  230. {
  231.     register struct rboxfb *rp = REGBASE;
  232.     if (h == 0 || w == 0)
  233.         return;
  234.     
  235.     rb_waitbusy(REGADDR);
  236.     rp->rep_rule = func << 4 | func;
  237.     rp->source_y = sy;
  238.     rp->source_x = sx;
  239.     rp->dest_y = dy;
  240.     rp->dest_x = dx;
  241.     rp->wheight = h;
  242.     rp->wwidth  = w;
  243.     rp->wmove = 1;
  244. }
  245. #endif
  246.