diff options
Diffstat (limited to 'sys/arch/hp300/dev/ite_hy.c')
-rw-r--r-- | sys/arch/hp300/dev/ite_hy.c | 471 |
1 files changed, 0 insertions, 471 deletions
diff --git a/sys/arch/hp300/dev/ite_hy.c b/sys/arch/hp300/dev/ite_hy.c index 3889c91adde..e69de29bb2d 100644 --- a/sys/arch/hp300/dev/ite_hy.c +++ b/sys/arch/hp300/dev/ite_hy.c @@ -1,471 +0,0 @@ -/* $NetBSD: ite_hy.c,v 1.2 1994/10/26 07:24:31 cgd Exp $ */ - -/* - * Copyright (c) 1991 University of Utah. - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * the Systems Programming Group of the University of Utah Computer - * Science Department and Mark Davies of the Department of Computer - * Science, Victoria University of Wellington, New Zealand. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: Utah $Hdr: ite_hy.c 1.2 92/12/20$ - * - * @(#)ite_hy.c 8.1 (Berkeley) 6/10/93 - */ - -#include "ite.h" -#if NITE > 0 - -#include <sys/param.h> -#include <sys/conf.h> -#include <sys/proc.h> -#include <sys/ioctl.h> -#include <sys/tty.h> -#include <sys/systm.h> -#include <sys/uio.h> - -#include <hp300/dev/grf_hyreg.h> -#include <hp300/dev/itereg.h> -#include <hp300/dev/itevar.h> - -#include <machine/cpu.h> - -/* XXX */ -#include <hp300/dev/grfioctl.h> -#include <hp300/dev/grfvar.h> - -#define REGBASE ((struct hyboxfb *)(ip->regbase)) -#define WINDOWMOVER hyper_windowmove - -#undef charX -#define charX(ip,c) \ - (((c) % (ip)->cpl) * ((((ip)->ftwidth + 7) / 8) * 8) + (ip)->fontx) - -hyper_init(ip) - register struct ite_softc *ip; -{ - int width; - - /* XXX */ - if (ip->regbase == NULL) { - struct grf_softc *gp = ip->grf; - - ip->regbase = gp->g_regkva; - ip->fbbase = gp->g_fbkva; - ip->fbwidth = gp->g_display.gd_fbwidth; - ip->fbheight = gp->g_display.gd_fbheight; - ip->dwidth = gp->g_display.gd_dwidth; - ip->dheight = gp->g_display.gd_dheight; - } - - ite_fontinfo(ip); - width = ((ip->ftwidth + 7) / 8) * 8; - ip->cpl = (ip->fbwidth - ip->dwidth) / width; - ip->cblanky = ip->fonty + ((128 / ip->cpl) +1) * ip->ftheight; - - /* - * Clear the framebuffer on all planes. - */ - hyper_windowmove(ip, 0, 0, 0, 0, ip->fbheight, ip->fbwidth, RR_CLEAR); - - hyper_ite_fontinit(ip); - - REGBASE->nblank = 0x05; - - /* - * Stash the inverted cursor. - */ - hyper_windowmove(ip, charY(ip, ' '), charX(ip, ' '), - ip->cblanky, ip->cblankx, ip->ftheight, - ip->ftwidth, RR_COPYINVERTED); -} - -hyper_deinit(ip) - register struct ite_softc *ip; -{ - hyper_windowmove(ip, 0, 0, 0, 0, ip->fbheight, ip->fbwidth, RR_CLEAR); - - REGBASE->nblank = 0x05; - ip->flags &= ~ITE_INITED; -} - -hyper_ite_fontinit(ip) - register struct ite_softc *ip; -{ - register u_char *fbmem, *dp; - int c, l, b; - int stride, width; - - dp = (u_char *)(getword(ip, getword(ip, FONTROM) + FONTADDR) + - ip->regbase) + FONTDATA; - stride = ip->fbwidth >> 3; - width = (ip->ftwidth + 7) / 8; - - for (c = 0; c < 128; c++) { - fbmem = (u_char *) FBBASE + - (ip->fonty + (c / ip->cpl) * ip->ftheight) * - stride; - fbmem += (ip->fontx >> 3) + (c % ip->cpl) * width; - for (l = 0; l < ip->ftheight; l++) { - for (b = 0; b < width; b++) { - *fbmem++ = *dp; - dp += 2; - } - fbmem -= width; - fbmem += stride; - } - } -} - -hyper_putc(ip, c, dy, dx, mode) - register struct ite_softc *ip; - int c, dy, dx, mode; -{ - int wmrr = ((mode == ATTR_INV) ? RR_COPYINVERTED : RR_COPY); - - hyper_windowmove(ip, charY(ip, c), charX(ip, c), - dy * ip->ftheight, dx * ip->ftwidth, - ip->ftheight, ip->ftwidth, wmrr); -} - -hyper_cursor(ip, flag) - register struct ite_softc *ip; - register int flag; -{ - if (flag == DRAW_CURSOR) - draw_cursor(ip) - else if (flag == MOVE_CURSOR) { - erase_cursor(ip) - draw_cursor(ip) - } - else - erase_cursor(ip) -} - -hyper_clear(ip, sy, sx, h, w) - register struct ite_softc *ip; - register int sy, sx, h, w; -{ - hyper_windowmove(ip, sy * ip->ftheight, sx * ip->ftwidth, - sy * ip->ftheight, sx * ip->ftwidth, - h * ip->ftheight, w * ip->ftwidth, - RR_CLEAR); -} - -hyper_scroll(ip, sy, sx, count, dir) - register struct ite_softc *ip; - register int sy, count; - int dir, sx; -{ - register int dy; - register int dx = sx; - register int height = 1; - register int width = ip->cols; - - if (dir == SCROLL_UP) { - dy = sy - count; - height = ip->rows - sy; - } - else if (dir == SCROLL_DOWN) { - dy = sy + count; - height = ip->rows - dy - 1; - } - else if (dir == SCROLL_RIGHT) { - dy = sy; - dx = sx + count; - width = ip->cols - dx; - } - else { - dy = sy; - dx = sx - count; - width = ip->cols - sx; - } - - hyper_windowmove(ip, sy * ip->ftheight, sx * ip->ftwidth, - dy * ip->ftheight, dx * ip->ftwidth, - height * ip->ftheight, - width * ip->ftwidth, RR_COPY); -} - -#include <hp300/dev/maskbits.h> - -/* NOTE: - * the first element in starttab could be 0xffffffff. making it 0 - * lets us deal with a full first word in the middle loop, rather - * than having to do the multiple reads and masks that we'd - * have to do if we thought it was partial. - */ -int starttab[32] = - { - 0x00000000, - 0x7FFFFFFF, - 0x3FFFFFFF, - 0x1FFFFFFF, - 0x0FFFFFFF, - 0x07FFFFFF, - 0x03FFFFFF, - 0x01FFFFFF, - 0x00FFFFFF, - 0x007FFFFF, - 0x003FFFFF, - 0x001FFFFF, - 0x000FFFFF, - 0x0007FFFF, - 0x0003FFFF, - 0x0001FFFF, - 0x0000FFFF, - 0x00007FFF, - 0x00003FFF, - 0x00001FFF, - 0x00000FFF, - 0x000007FF, - 0x000003FF, - 0x000001FF, - 0x000000FF, - 0x0000007F, - 0x0000003F, - 0x0000001F, - 0x0000000F, - 0x00000007, - 0x00000003, - 0x00000001 - }; - -int endtab[32] = - { - 0x00000000, - 0x80000000, - 0xC0000000, - 0xE0000000, - 0xF0000000, - 0xF8000000, - 0xFC000000, - 0xFE000000, - 0xFF000000, - 0xFF800000, - 0xFFC00000, - 0xFFE00000, - 0xFFF00000, - 0xFFF80000, - 0xFFFC0000, - 0xFFFE0000, - 0xFFFF0000, - 0xFFFF8000, - 0xFFFFC000, - 0xFFFFE000, - 0xFFFFF000, - 0xFFFFF800, - 0xFFFFFC00, - 0xFFFFFE00, - 0xFFFFFF00, - 0xFFFFFF80, - 0xFFFFFFC0, - 0xFFFFFFE0, - 0xFFFFFFF0, - 0xFFFFFFF8, - 0xFFFFFFFC, - 0xFFFFFFFE - }; - -hyper_windowmove(ip, sy, sx, dy, dx, h, w, func) - struct ite_softc *ip; - int sy, sx, dy, dx, h, w, func; -{ - int width; /* add to get to same position in next line */ - - unsigned int *psrcLine, *pdstLine; - /* pointers to line with current src and dst */ - register unsigned int *psrc; /* pointer to current src longword */ - register unsigned int *pdst; /* pointer to current dst longword */ - - /* following used for looping through a line */ - unsigned int startmask, endmask; /* masks for writing ends of dst */ - int nlMiddle; /* whole longwords in dst */ - register int nl; /* temp copy of nlMiddle */ - register unsigned int tmpSrc; - /* place to store full source word */ - register int xoffSrc; /* offset (>= 0, < 32) from which to - fetch whole longwords fetched - in src */ - int nstart; /* number of ragged bits at start of dst */ - int nend; /* number of ragged bits at end of dst */ - int srcStartOver; /* pulling nstart bits from src - overflows into the next word? */ - - if (h == 0 || w == 0) - return; - - width = ip->fbwidth >> 5; - - if (sy < dy) /* start at last scanline of rectangle */ - { - psrcLine = ((unsigned int *) ip->fbbase) + ((sy+h-1) * width); - pdstLine = ((unsigned int *) ip->fbbase) + ((dy+h-1) * width); - width = -width; - } - else /* start at first scanline */ - { - psrcLine = ((unsigned int *) ip->fbbase) + (sy * width); - pdstLine = ((unsigned int *) ip->fbbase) + (dy * width); - } - - /* x direction doesn't matter for < 1 longword */ - if (w <= 32) - { - int srcBit, dstBit; /* bit offset of src and dst */ - - pdstLine += (dx >> 5); - psrcLine += (sx >> 5); - psrc = psrcLine; - pdst = pdstLine; - - srcBit = sx & 0x1f; - dstBit = dx & 0x1f; - - while(h--) - { - getandputrop(psrc, srcBit, dstBit, w, pdst, func) - pdst += width; - psrc += width; - } - } - else - { - maskbits(dx, w, startmask, endmask, nlMiddle) - if (startmask) - nstart = 32 - (dx & 0x1f); - else - nstart = 0; - if (endmask) - nend = (dx + w) & 0x1f; - else - nend = 0; - - xoffSrc = ((sx & 0x1f) + nstart) & 0x1f; - srcStartOver = ((sx & 0x1f) + nstart) > 31; - - if (sx >= dx) /* move left to right */ - { - pdstLine += (dx >> 5); - psrcLine += (sx >> 5); - - while (h--) - { - psrc = psrcLine; - pdst = pdstLine; - - if (startmask) - { - getandputrop(psrc, (sx & 0x1f), - (dx & 0x1f), nstart, pdst, func) - pdst++; - if (srcStartOver) - psrc++; - } - - /* special case for aligned operations */ - if (xoffSrc == 0) - { - nl = nlMiddle; - while (nl--) - { - DoRop (*pdst, func, *psrc++, *pdst); - pdst++; - } - } - else - { - nl = nlMiddle + 1; - while (--nl) - { - getunalignedword (psrc, xoffSrc, tmpSrc) - DoRop (*pdst, func, tmpSrc, *pdst); - pdst++; - psrc++; - } - } - - if (endmask) - { - getandputrop0(psrc, xoffSrc, nend, pdst, func); - } - - pdstLine += width; - psrcLine += width; - } - } - else /* move right to left */ - { - pdstLine += (dx+w >> 5); - psrcLine += (sx+w >> 5); - /* if fetch of last partial bits from source crosses - a longword boundary, start at the previous longword - */ - if (xoffSrc + nend >= 32) - --psrcLine; - - while (h--) - { - psrc = psrcLine; - pdst = pdstLine; - - if (endmask) - { - getandputrop0(psrc, xoffSrc, nend, pdst, func); - } - - nl = nlMiddle + 1; - while (--nl) - { - --psrc; - --pdst; - getunalignedword(psrc, xoffSrc, tmpSrc) - DoRop(*pdst, func, tmpSrc, *pdst); - } - - if (startmask) - { - if (srcStartOver) - --psrc; - --pdst; - getandputrop(psrc, (sx & 0x1f), - (dx & 0x1f), nstart, pdst, func) - } - - pdstLine += width; - psrcLine += width; - } - } /* move right to left */ - } -} -#endif |