[BACK]Return to ite_subr.c CVS log [TXT][DIR] Up to [local] / sys / arch / hp300 / stand / common

Annotation of sys/arch/hp300/stand/common/ite_subr.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: ite_subr.c,v 1.5 2006/08/17 06:31:10 miod Exp $       */
                      2: /*     $NetBSD: ite_subr.c,v 1.8 1996/03/03 04:23:40 thorpej Exp $     */
                      3:
                      4: /*
                      5:  * Copyright (c) 1988 University of Utah.
                      6:  * Copyright (c) 1990, 1993
                      7:  *     The Regents of the University of California.  All rights reserved.
                      8:  *
                      9:  * This code is derived from software contributed to Berkeley by
                     10:  * the Systems Programming Group of the University of Utah Computer
                     11:  * Science Department.
                     12:  *
                     13:  * Redistribution and use in source and binary forms, with or without
                     14:  * modification, are permitted provided that the following conditions
                     15:  * are met:
                     16:  * 1. Redistributions of source code must retain the above copyright
                     17:  *    notice, this list of conditions and the following disclaimer.
                     18:  * 2. Redistributions in binary form must reproduce the above copyright
                     19:  *    notice, this list of conditions and the following disclaimer in the
                     20:  *    documentation and/or other materials provided with the distribution.
                     21:  * 3. Neither the name of the University nor the names of its contributors
                     22:  *    may be used to endorse or promote products derived from this software
                     23:  *    without specific prior written permission.
                     24:  *
                     25:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     26:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     27:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     28:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     29:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     30:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     31:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     32:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     33:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     34:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     35:  * SUCH DAMAGE.
                     36:  *
                     37:  * from: Utah $Hdr: ite_subr.c 1.2 92/01/20$
                     38:  *
                     39:  *     @(#)ite_subr.c  8.1 (Berkeley) 6/10/93
                     40:  */
                     41:
                     42: #ifdef ITECONSOLE
                     43:
                     44: #include <sys/param.h>
                     45:
                     46: #include "samachdep.h"
                     47: #include "itevar.h"
                     48: #include "itereg.h"
                     49:
                     50: #define        getbyte(ip, offset) \
                     51:        *(((u_char *)(ip)->regbase) + (offset))
                     52:
                     53: #define getword(ip, offset) \
                     54:        ((getbyte(ip, offset) << 8) | getbyte(ip, (offset) + 2))
                     55:
                     56: u_char ite_readbyte(struct ite_data *, int);
                     57: void   ite_writeglyph(struct ite_data *, u_char *, u_char *);
                     58:
                     59: void
                     60: ite_fontinfo(struct ite_data *ip)
                     61: {
                     62:        u_long fontaddr = getword(ip, getword(ip, FONTROM) + FONTADDR);
                     63:
                     64:        ip->ftheight = getbyte(ip, fontaddr + FONTHEIGHT);
                     65:        ip->ftwidth  = getbyte(ip, fontaddr + FONTWIDTH);
                     66:        ip->rows     = ip->dheight / ip->ftheight;
                     67:        ip->cols     = ip->dwidth / ip->ftwidth;
                     68:
                     69:        if (ip->fbwidth > ip->dwidth) {
                     70:                /*
                     71:                 * Stuff goes to right of display.
                     72:                 */
                     73:                ip->fontx    = ip->dwidth;
                     74:                ip->fonty    = 0;
                     75:                ip->cpl      = (ip->fbwidth - ip->dwidth) / ip->ftwidth;
                     76:                ip->cblankx  = ip->dwidth;
                     77:                ip->cblanky  = ip->fonty + ((128 / ip->cpl) +1) * ip->ftheight;
                     78:        } else {
                     79:                /*
                     80:                 * Stuff goes below the display.
                     81:                 */
                     82:                ip->fontx   = 0;
                     83:                ip->fonty   = ip->dheight;
                     84:                ip->cpl     = ip->fbwidth / ip->ftwidth;
                     85:                ip->cblankx = 0;
                     86:                ip->cblanky = ip->fonty + ((128 / ip->cpl) + 1) * ip->ftheight;
                     87:        }
                     88: }
                     89:
                     90: void
                     91: ite_fontinit1bpp(struct ite_data *ip)
                     92: {
                     93:        u_char *fbmem, *dp;
                     94:        int c, l, b;
                     95:        int stride, width;
                     96:
                     97:        dp = (u_char *)(getword(ip, getword(ip, FONTROM) + FONTADDR) +
                     98:            ip->regbase) + FONTDATA;
                     99:        stride = ip->fbwidth >> 3;
                    100:        width = (ip->ftwidth + 7) / 8;
                    101:
                    102:        for (c = 0; c < 128; c++) {
                    103:                fbmem = (u_char *)FBBASE +
                    104:                    (ip->fonty + (c / ip->cpl) * ip->ftheight) * stride;
                    105:                fbmem += (ip->fontx >> 3) + (c % ip->cpl) * width;
                    106:                for (l = 0; l < ip->ftheight; l++) {
                    107:                        for (b = 0; b < width; b++) {
                    108:                                *fbmem++ = *dp;
                    109:                                dp += 2;
                    110:                        }
                    111:                        fbmem -= width;
                    112:                        fbmem += stride;
                    113:                }
                    114:        }
                    115: }
                    116:
                    117: void
                    118: ite_fontinit8bpp(struct ite_data *ip)
                    119: {
                    120:        int bytewidth = (((ip->ftwidth - 1) / 8) + 1);
                    121:        int glyphsize = bytewidth * ip->ftheight;
                    122:        u_char fontbuf[500];
                    123:        u_char *dp, *fbmem;
                    124:        int c, i, romp;
                    125:
                    126:        romp = getword(ip, getword(ip, FONTROM) + FONTADDR) + FONTDATA;
                    127:        for (c = 0; c < 128; c++) {
                    128:                fbmem = (u_char *)(FBBASE +
                    129:                     (ip->fonty + (c / ip->cpl) * ip->ftheight) * ip->fbwidth +
                    130:                     (ip->fontx + (c % ip->cpl) * ip->ftwidth));
                    131:                dp = fontbuf;
                    132:                for (i = 0; i < glyphsize; i++) {
                    133:                        *dp++ = getbyte(ip, romp);
                    134:                        romp += 2;
                    135:                }
                    136:                ite_writeglyph(ip, fbmem, fontbuf);
                    137:        }
                    138: }
                    139:
                    140: void
                    141: ite_writeglyph(struct ite_data *ip, u_char *fbmem, u_char *glyphp)
                    142: {
                    143:        int bn;
                    144:        int l, b;
                    145:
                    146:        for (l = 0; l < ip->ftheight; l++) {
                    147:                bn = 7;
                    148:                for (b = 0; b < ip->ftwidth; b++) {
                    149:                        if ((1 << bn) & *glyphp)
                    150:                                *fbmem++ = 1;
                    151:                        else
                    152:                                *fbmem++ = 0;
                    153:                        if (--bn < 0) {
                    154:                                bn = 7;
                    155:                                glyphp++;
                    156:                        }
                    157:                }
                    158:                if (bn < 7)
                    159:                        glyphp++;
                    160:                fbmem -= ip->ftwidth;
                    161:                fbmem += ip->fbwidth;
                    162:        }
                    163: }
                    164:
                    165: /*
                    166:  * The cursor is just an inverted space.
                    167:  */
                    168: #define flip_cursor(ip) \
                    169:        (*ip->bmv)(ip, ip->cblanky, ip->cblankx, ip->cursory * ip->ftheight, \
                    170:            ip->cursorx * ip->ftwidth, ip->ftheight, ip->ftwidth, RR_XOR)
                    171:
                    172: void
                    173: ite_dio_cursor(struct ite_data *ip, int flag)
                    174: {
                    175:        switch (flag) {
                    176:        case MOVE_CURSOR:
                    177:                flip_cursor(ip);
                    178:                /* FALLTHROUGH */
                    179:        case DRAW_CURSOR:
                    180:                ip->cursorx = ip->curx;
                    181:                ip->cursory = ip->cury;
                    182:                /* FALLTHROUGH */
                    183:        default:
                    184:                flip_cursor(ip);
                    185:                break;
                    186:        }
                    187: }
                    188:
                    189: void
                    190: ite_dio_putc1bpp(struct ite_data *ip, int c, int dy, int dx)
                    191: {
                    192:        ite_dio_windowmove1bpp(ip, charY(ip, c), charX1bpp(ip, c),
                    193:            dy * ip->ftheight, dx * ip->ftwidth,
                    194:            ip->ftheight, ip->ftwidth, RR_COPY);
                    195: }
                    196:
                    197: void
                    198: ite_dio_putc8bpp(struct ite_data *ip, int c, int dy, int dx)
                    199: {
                    200:        (*ip->bmv)(ip, charY(ip, c), charX(ip, c),
                    201:            dy * ip->ftheight, dx * ip->ftwidth,
                    202:            ip->ftheight, ip->ftwidth, RR_COPY);
                    203: }
                    204:
                    205: void
                    206: ite_dio_clear(struct ite_data *ip, int sy, int sx, int h, int w)
                    207: {
                    208:        (*ip->bmv)(ip, sy * ip->ftheight, sx * ip->ftwidth,
                    209:            sy * ip->ftheight, sx * ip->ftwidth,
                    210:            h  * ip->ftheight, w  * ip->ftwidth, RR_CLEAR);
                    211: }
                    212:
                    213: void
                    214: ite_dio_scroll(struct ite_data *ip)
                    215: {
                    216:        flip_cursor(ip);
                    217:
                    218:        (*ip->bmv)(ip, ip->ftheight, 0, 0, 0, (ip->rows - 1) * ip->ftheight,
                    219:            ip->cols * ip->ftwidth, RR_COPY);
                    220: }
                    221:
                    222: #include "maskbits.h"
                    223:
                    224: /* NOTE:
                    225:  * the first element in starttab could be 0xffffffff.  making it 0
                    226:  * lets us deal with a full first word in the middle loop, rather
                    227:  * than having to do the multiple reads and masks that we'd
                    228:  * have to do if we thought it was partial.
                    229:  */
                    230: int starttab[32] = {
                    231:        0x00000000,
                    232:        0x7FFFFFFF,
                    233:        0x3FFFFFFF,
                    234:        0x1FFFFFFF,
                    235:        0x0FFFFFFF,
                    236:        0x07FFFFFF,
                    237:        0x03FFFFFF,
                    238:        0x01FFFFFF,
                    239:        0x00FFFFFF,
                    240:        0x007FFFFF,
                    241:        0x003FFFFF,
                    242:        0x001FFFFF,
                    243:        0x000FFFFF,
                    244:        0x0007FFFF,
                    245:        0x0003FFFF,
                    246:        0x0001FFFF,
                    247:        0x0000FFFF,
                    248:        0x00007FFF,
                    249:        0x00003FFF,
                    250:        0x00001FFF,
                    251:        0x00000FFF,
                    252:        0x000007FF,
                    253:        0x000003FF,
                    254:        0x000001FF,
                    255:        0x000000FF,
                    256:        0x0000007F,
                    257:        0x0000003F,
                    258:        0x0000001F,
                    259:        0x0000000F,
                    260:        0x00000007,
                    261:        0x00000003,
                    262:        0x00000001
                    263: };
                    264:
                    265: int endtab[32] = {
                    266:        0x00000000,
                    267:        0x80000000,
                    268:        0xC0000000,
                    269:        0xE0000000,
                    270:        0xF0000000,
                    271:        0xF8000000,
                    272:        0xFC000000,
                    273:        0xFE000000,
                    274:        0xFF000000,
                    275:        0xFF800000,
                    276:        0xFFC00000,
                    277:        0xFFE00000,
                    278:        0xFFF00000,
                    279:        0xFFF80000,
                    280:        0xFFFC0000,
                    281:        0xFFFE0000,
                    282:        0xFFFF0000,
                    283:        0xFFFF8000,
                    284:        0xFFFFC000,
                    285:        0xFFFFE000,
                    286:        0xFFFFF000,
                    287:        0xFFFFF800,
                    288:        0xFFFFFC00,
                    289:        0xFFFFFE00,
                    290:        0xFFFFFF00,
                    291:        0xFFFFFF80,
                    292:        0xFFFFFFC0,
                    293:        0xFFFFFFE0,
                    294:        0xFFFFFFF0,
                    295:        0xFFFFFFF8,
                    296:        0xFFFFFFFC,
                    297:        0xFFFFFFFE
                    298: };
                    299:
                    300: void
                    301: ite_dio_windowmove1bpp(struct ite_data *ip, int sy, int sx, int dy, int dx,
                    302:     int h, int w, int func)
                    303: {
                    304:        int width;              /* add to get to same position in next line */
                    305:
                    306:        unsigned int *psrcLine, *pdstLine;
                    307:                                 /* pointers to line with current src and dst */
                    308:        unsigned int *psrc;     /* pointer to current src longword */
                    309:        unsigned int *pdst;     /* pointer to current dst longword */
                    310:
                    311:                                 /* following used for looping through a line */
                    312:        unsigned int startmask, endmask;  /* masks for writing ends of dst */
                    313:        int nlMiddle;           /* whole longwords in dst */
                    314:        int nl;                 /* temp copy of nlMiddle */
                    315:        unsigned int tmpSrc;    /* place to store full source word */
                    316:        int xoffSrc;            /* offset (>= 0, < 32) from which to
                    317:                                    fetch whole longwords fetched
                    318:                                    in src */
                    319:        int nstart;             /* number of ragged bits at start of dst */
                    320:        int nend;               /* number of ragged bits at end of dst */
                    321:        int srcStartOver;       /* pulling nstart bits from src
                    322:                                    overflows into the next word? */
                    323:
                    324:        if (h == 0 || w == 0)
                    325:                return;
                    326:
                    327:        width = ip->fbwidth >> 5;
                    328:        psrcLine = ((unsigned int *) ip->fbbase) + (sy * width);
                    329:        pdstLine = ((unsigned int *) ip->fbbase) + (dy * width);
                    330:
                    331:        /* x direction doesn't matter for < 1 longword */
                    332:        if (w <= 32) {
                    333:                int srcBit, dstBit;     /* bit offset of src and dst */
                    334:
                    335:                pdstLine += (dx >> 5);
                    336:                psrcLine += (sx >> 5);
                    337:                psrc = psrcLine;
                    338:                pdst = pdstLine;
                    339:
                    340:                srcBit = sx & 0x1f;
                    341:                dstBit = dx & 0x1f;
                    342:
                    343:                while (h--) {
                    344:                        getandputrop(psrc, srcBit, dstBit, w, pdst, func);
                    345:                        pdst += width;
                    346:                        psrc += width;
                    347:                }
                    348:        } else {
                    349:                maskbits(dx, w, startmask, endmask, nlMiddle);
                    350:                if (startmask)
                    351:                        nstart = 32 - (dx & 0x1f);
                    352:                else
                    353:                        nstart = 0;
                    354:                if (endmask)
                    355:                        nend = (dx + w) & 0x1f;
                    356:                else
                    357:                        nend = 0;
                    358:
                    359:                xoffSrc = ((sx & 0x1f) + nstart) & 0x1f;
                    360:                srcStartOver = ((sx & 0x1f) + nstart) > 31;
                    361:
                    362:                pdstLine += (dx >> 5);
                    363:                psrcLine += (sx >> 5);
                    364:
                    365:                while (h--) {
                    366:                        psrc = psrcLine;
                    367:                        pdst = pdstLine;
                    368:
                    369:                        if (startmask) {
                    370:                                getandputrop(psrc, (sx & 0x1f), (dx & 0x1f),
                    371:                                    nstart, pdst, func);
                    372:                                pdst++;
                    373:                                if (srcStartOver)
                    374:                                        psrc++;
                    375:                        }
                    376:
                    377:                        /* special case for aligned operations */
                    378:                        if (xoffSrc == 0) {
                    379:                                nl = nlMiddle;
                    380:                                while (nl--) {
                    381:                                        DoRop (*pdst, func, *psrc++, *pdst);
                    382:                                        pdst++;
                    383:                                }
                    384:                        } else {
                    385:                                nl = nlMiddle + 1;
                    386:                                while (--nl) {
                    387:                                        getunalignedword (psrc, xoffSrc,
                    388:                                            tmpSrc);
                    389:                                        DoRop (*pdst, func, tmpSrc, *pdst);
                    390:                                        pdst++;
                    391:                                        psrc++;
                    392:                                }
                    393:                        }
                    394:
                    395:                        if (endmask) {
                    396:                                getandputrop0(psrc, xoffSrc, nend, pdst, func);
                    397:                        }
                    398:
                    399:                        pdstLine += width;
                    400:                        psrcLine += width;
                    401:                }
                    402:        }
                    403: }
                    404: #endif

CVSweb