Home | History | Annotate | Line # | Download | only in dev
ite_cc.c revision 1.1
      1 #include "ite.h"
      2 #if NITE > 0
      3 
      4 #include "param.h"
      5 #include "conf.h"
      6 #include "proc.h"
      7 #include "ioctl.h"
      8 #include "tty.h"
      9 #include "systm.h"
     10 
     11 #include "itevar.h"
     12 
     13 #include "machine/cpu.h"
     14 
     15 /* XXX */
     16 #include "grfioctl.h"
     17 #include "grfvar.h"
     18 #include "grf_ccreg.h"
     19 
     20 extern unsigned char kernel_font_width, kernel_font_height;
     21 extern unsigned char kernel_font_lo, kernel_font_hi;
     22 extern unsigned char kernel_font[], kernel_cursor[];
     23 
     24 
     25 customc_init(ip)
     26 	register struct ite_softc *ip;
     27 {
     28   struct ccfb *fb;
     29   int fboff, fbsize;
     30 
     31   if (ip->grf == 0)
     32     ip->grf = &grf_softc[ip - ite_softc];
     33 
     34   ip->priv = ip->grf->g_display.gd_regaddr;
     35   fb = (struct ccfb *) ip->priv;
     36   fbsize = ip->grf->g_display.gd_fbsize;
     37 
     38 #if 0
     39   /* already done in the grf layer */
     40 
     41   /* clear the display. bzero only likes regions up to 64k, so call multiple times */
     42   for (fboff = 0; fboff < fbsize; fboff += 64*1024)
     43     bzero (fb->fb + fboff, fbsize - fboff > 64*1024 ? 64*1024 : fbsize - fboff);
     44 #endif
     45 
     46   /* this is a dreadful font, but I don't have an alternative at the moment.. */
     47   ip->font     = kernel_font;
     48   ip->font_lo  = kernel_font_lo;
     49   ip->font_hi  = kernel_font_hi;
     50   ip->ftwidth  = kernel_font_width;
     51   ip->ftheight = kernel_font_height;
     52   ip->cursor   = kernel_cursor;
     53 
     54   ip->rows     = fb->disp_height / ip->ftheight;
     55   ip->cols     = fb->disp_width  / ip->ftwidth;
     56 
     57 
     58 #if 0
     59   printf ("font@%x, cursor@%x\n", ip->font, ip->cursor);
     60   dump_copperlist (fb->cop1);
     61   dump_copperlist (fb->cop2);
     62 #endif
     63 }
     64 
     65 customc_deinit(ip)
     66 	struct ite_softc *ip;
     67 {
     68   ip->flags &= ~ITE_INITED;
     69 }
     70 
     71 
     72 void static inline
     73 customc_windowmove (src, srcx, srcy, srcmod,
     74 		    dst, dstx, dsty, dstmod, h, w, op)
     75     unsigned char *src, *dst;
     76     unsigned short srcx, srcy, srcmod;
     77     unsigned short dstx, dsty, dstmod;
     78     unsigned short h, w;
     79     unsigned char op;
     80 {
     81   int i;
     82 
     83   src += srcmod*srcy + (srcx >> 3);
     84   dst += dstmod*dsty + (dstx >> 3);
     85 
     86 #if 0
     87 printf("ccwm: %x-%x-%x-%x-%c\n", src, dst, h, w,
     88 	op == RR_XOR ? '^' : op == RR_COPY ? '|' : op == RR_CLEAR ? 'C' : 'I');
     89 #endif
     90 
     91   /* currently, only drawing to byte slots is supported... */
     92   if ((srcx & 07) || (dstx & 07) || (w & 07))
     93     panic ("customc_windowmove: odd offset");
     94 
     95   w >>= 3;
     96   while (h--)
     97     {
     98       if (src > dst)
     99 	for (i = 0; i < w; i++)
    100 	  switch (op)
    101 	    {
    102 	    case RR_COPY:
    103 	      dst[i] = src[i];
    104 	      break;
    105 
    106 	    case RR_CLEAR:
    107 	      dst[i] = 0;
    108 	      break;
    109 
    110 	    case RR_XOR:
    111 	      dst[i] ^= src[i];
    112 	      break;
    113 
    114 	    case RR_COPYINVERTED:
    115 	      dst[i] = ~src[i];
    116 	      break;
    117 	    }
    118       else
    119 	for (i = w - 1; i >= 0; i--)
    120 	  switch (op)
    121 	    {
    122 	    case RR_COPY:
    123 	      dst[i] = src[i];
    124 	      break;
    125 
    126 	    case RR_CLEAR:
    127 	      dst[i] = 0;
    128 	      break;
    129 
    130 	    case RR_XOR:
    131 	      dst[i] ^= src[i];
    132 	      break;
    133 
    134 	    case RR_COPYINVERTED:
    135 	      dst[i] = ~src[i];
    136 	      break;
    137 	    }
    138 
    139 
    140       src += srcmod;
    141       dst += dstmod;
    142     }
    143 
    144 }
    145 
    146 
    147 customc_putc(ip, c, dy, dx, mode)
    148 	register struct ite_softc *ip;
    149         register int dy, dx;
    150 	int c, mode;
    151 {
    152   register int wrr = ((mode == ATTR_INV) ? RR_COPYINVERTED : RR_COPY);
    153   struct ccfb *fb = (struct ccfb *) ip->priv;
    154 
    155   if (c >= ip->font_lo && c <= ip->font_hi)
    156     {
    157       c -= ip->font_lo;
    158 
    159       customc_windowmove (ip->font, 0, c * ip->ftheight, 1,
    160     			  fb->fb, fb->fb_x + dx * ip->ftwidth,
    161     			  fb->fb_y + dy * ip->ftheight,
    162     			  fb->fb_width >> 3,
    163     			  ip->ftheight, ip->ftwidth, wrr);
    164     }
    165 }
    166 
    167 customc_cursor(ip, flag)
    168 	register struct ite_softc *ip;
    169         register int flag;
    170 {
    171   struct ccfb *fb = (struct ccfb *) ip->priv;
    172 
    173   if (flag != DRAW_CURSOR)
    174     {
    175       /* erase it */
    176       customc_windowmove (ip->cursor, 0, 0, 1,
    177 	  		  fb->fb, fb->fb_x + ip->cursorx * ip->ftwidth,
    178     			  fb->fb_y + ip->cursory * ip->ftheight,
    179     			  fb->fb_width >> 3,
    180     			  ip->ftheight, ip->ftwidth, RR_XOR);
    181     }
    182   if (flag == DRAW_CURSOR || flag == MOVE_CURSOR)
    183     {
    184       /* draw it */
    185       customc_windowmove (ip->cursor, 0, 0, 1,
    186 	    		  fb->fb, fb->fb_x + ip->curx * ip->ftwidth,
    187     			  fb->fb_y + ip->cury * ip->ftheight,
    188     			  fb->fb_width >> 3,
    189     			  ip->ftheight, ip->ftwidth, RR_XOR);
    190       ip->cursorx = ip->curx;
    191       ip->cursory = ip->cury;
    192     }
    193 }
    194 
    195 customc_clear(ip, sy, sx, h, w)
    196 	struct ite_softc *ip;
    197 	register int sy, sx, h, w;
    198 {
    199   struct ccfb *fb = (struct ccfb *) ip->priv;
    200 
    201   customc_windowmove (0, 0, 0, 0,
    202   		      fb->fb, fb->fb_x + sx * ip->ftwidth,
    203     		      fb->fb_y + sy * ip->ftheight,
    204     		      fb->fb_width >> 3,
    205     		      h * ip->ftheight, w * ip->ftwidth, RR_CLEAR);
    206 }
    207 
    208 customc_blockmove(ip, sy, sx, dy, dx, h, w)
    209 	register struct ite_softc *ip;
    210 	int sy, sx, dy, dx, h, w;
    211 {
    212   struct ccfb *fb = (struct ccfb *) ip->priv;
    213 
    214   customc_windowmove(fb->fb, fb->fb_x + sx * ip->ftwidth,
    215 		     fb->fb_y + sy * ip->ftheight,
    216 		     fb->fb_width >> 3,
    217 		     fb->fb, fb->fb_x + dx * ip->ftwidth,
    218 		     fb->fb_y + dy * ip->ftheight,
    219 		     fb->fb_width >> 3,
    220 		     h * ip->ftheight, w * ip->ftwidth, RR_COPY);
    221 }
    222 
    223 customc_scroll(ip, sy, sx, count, dir)
    224         register struct ite_softc *ip;
    225         register int sy;
    226         int dir, sx, count;
    227 {
    228   register int height, dy, i;
    229 
    230   customc_cursor(ip, ERASE_CURSOR);
    231 
    232   if (dir == SCROLL_UP)
    233     {
    234       dy = sy - count;
    235       height = ip->bottom_margin - sy + 1;
    236       for (i = 0; i < height; i++)
    237 	customc_blockmove(ip, sy + i, sx, dy + i, 0, 1, ip->cols);
    238     }
    239   else if (dir == SCROLL_DOWN)
    240     {
    241       dy = sy + count;
    242       height = ip->bottom_margin - dy + 1;
    243       for (i = (height - 1); i >= 0; i--)
    244 	customc_blockmove(ip, sy + i, sx, dy + i, 0, 1, ip->cols);
    245     }
    246   else if (dir == SCROLL_RIGHT)
    247     {
    248       customc_blockmove(ip, sy, sx, sy, sx + count, 1, ip->cols - (sx + count));
    249     }
    250   else
    251     {
    252       customc_blockmove(ip, sy, sx, sy, sx - count, 1, ip->cols - sx);
    253     }
    254 }
    255 
    256 #endif
    257