[BACK]Return to pcdisplay_subr.c CVS log [TXT][DIR] Up to [local] / sys / dev / ic

Annotation of sys/dev/ic/pcdisplay_subr.c, Revision 1.1.1.1

1.1       nbrk        1: /* $OpenBSD: pcdisplay_subr.c,v 1.7 2006/11/29 19:11:15 miod Exp $ */
                      2: /* $NetBSD: pcdisplay_subr.c,v 1.16 2000/06/08 07:01:19 cgd Exp $ */
                      3:
                      4: /*
                      5:  * Copyright (c) 1995, 1996 Carnegie-Mellon University.
                      6:  * All rights reserved.
                      7:  *
                      8:  * Author: Chris G. Demetriou
                      9:  *
                     10:  * Permission to use, copy, modify and distribute this software and
                     11:  * its documentation is hereby granted, provided that both the copyright
                     12:  * notice and this permission notice appear in all copies of the
                     13:  * software, derivative works or modified versions, and any portions
                     14:  * thereof, and that both notices appear in supporting documentation.
                     15:  *
                     16:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     17:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
                     18:  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     19:  *
                     20:  * Carnegie Mellon requests users of this software to return to
                     21:  *
                     22:  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
                     23:  *  School of Computer Science
                     24:  *  Carnegie Mellon University
                     25:  *  Pittsburgh PA 15213-3890
                     26:  *
                     27:  * any improvements or extensions that they make and grant Carnegie the
                     28:  * rights to redistribute these changes.
                     29:  */
                     30:
                     31: #include <sys/param.h>
                     32: #include <sys/systm.h>
                     33: #include <sys/kernel.h>
                     34: #include <sys/device.h>
                     35: #include <machine/bus.h>
                     36:
                     37: #include <dev/ic/mc6845reg.h>
                     38: #include <dev/ic/pcdisplayvar.h>
                     39:
                     40: #include <dev/wscons/wsconsio.h>
                     41: #include <dev/wscons/wsdisplayvar.h>
                     42:
                     43: void
                     44: pcdisplay_cursor_reset(scr)
                     45:        struct pcdisplayscreen *scr;
                     46: {
                     47: #ifdef PCDISPLAY_SOFTCURSOR
                     48:        pcdisplay_6845_write(scr->hdl, curstart, 0x10);
                     49:        pcdisplay_6845_write(scr->hdl, curend, 0x10);
                     50: #endif
                     51: }
                     52:
                     53: void
                     54: pcdisplay_cursor_init(scr, existing)
                     55:        struct pcdisplayscreen *scr;
                     56:        int existing;
                     57: {
                     58: #ifdef PCDISPLAY_SOFTCURSOR
                     59:        bus_space_tag_t memt;
                     60:        bus_space_handle_t memh;
                     61:        int off;
                     62: #endif
                     63:
                     64:        pcdisplay_cursor_reset(scr);
                     65:
                     66: #ifdef PCDISPLAY_SOFTCURSOR
                     67:        if (existing) {
                     68:                /*
                     69:                 * This is the first screen. At this point, scr->active is
                     70:                 * false and scr->mem is NULL (no backing store), so we
                     71:                 * can't use pcdisplay_cursor() to do this.
                     72:                 */
                     73:                memt = scr->hdl->ph_memt;
                     74:                memh = scr->hdl->ph_memh;
                     75:                off = (scr->vc_crow * scr->type->ncols + scr->vc_ccol) * 2 +
                     76:                    scr->dispoffset;
                     77:
                     78:                scr->cursortmp = bus_space_read_2(memt, memh, off);
                     79:                bus_space_write_2(memt, memh, off, scr->cursortmp ^ 0x7700);
                     80:        } else
                     81:                scr->cursortmp = 0;
                     82: #endif
                     83:        scr->cursoron = 1;
                     84: }
                     85:
                     86: void
                     87: pcdisplay_cursor(id, on, row, col)
                     88:        void *id;
                     89:        int on, row, col;
                     90: {
                     91: #ifdef PCDISPLAY_SOFTCURSOR
                     92:        struct pcdisplayscreen *scr = id;
                     93:        bus_space_tag_t memt = scr->hdl->ph_memt;
                     94:        bus_space_handle_t memh = scr->hdl->ph_memh;
                     95:        int off;
                     96:
                     97:        /* Remove old cursor image */
                     98:        if (scr->cursoron) {
                     99:                off = scr->vc_crow * scr->type->ncols + scr->vc_ccol;
                    100:                if (scr->active)
                    101:                        bus_space_write_2(memt, memh, scr->dispoffset + off * 2,
                    102:                            scr->cursortmp);
                    103:                else
                    104:                        scr->mem[off] = scr->cursortmp;
                    105:        }
                    106:
                    107:        scr->vc_crow = row;
                    108:        scr->vc_ccol = col;
                    109:
                    110:        if ((scr->cursoron = on) == 0)
                    111:                return;
                    112:
                    113:        off = (scr->vc_crow * scr->type->ncols + scr->vc_ccol);
                    114:        if (scr->active) {
                    115:                off = off * 2 + scr->dispoffset;
                    116:                scr->cursortmp = bus_space_read_2(memt, memh, off);
                    117:                bus_space_write_2(memt, memh, off, scr->cursortmp ^ 0x7700);
                    118:        } else {
                    119:                scr->cursortmp = scr->mem[off];
                    120:                scr->mem[off] = scr->cursortmp ^ 0x7700;
                    121:        }
                    122: #else  /* PCDISPLAY_SOFTCURSOR */
                    123:        struct pcdisplayscreen *scr = id;
                    124:        int pos;
                    125:
                    126:        scr->vc_crow = row;
                    127:        scr->vc_ccol = col;
                    128:        scr->cursoron = on;
                    129:
                    130:        if (scr->active) {
                    131:                if (!on)
                    132:                        pos = 0x1010;
                    133:                else
                    134:                        pos = scr->dispoffset / 2
                    135:                                + row * scr->type->ncols + col;
                    136:
                    137:                pcdisplay_6845_write(scr->hdl, cursorh, pos >> 8);
                    138:                pcdisplay_6845_write(scr->hdl, cursorl, pos);
                    139:        }
                    140: #endif /* PCDISPLAY_SOFTCURSOR */
                    141: }
                    142:
                    143: #if 0
                    144: unsigned int
                    145: pcdisplay_mapchar_simple(id, uni)
                    146:        void *id;
                    147:        int uni;
                    148: {
                    149:        if (uni < 128)
                    150:                return (uni);
                    151:
                    152:        return (1); /* XXX ??? smiley */
                    153: }
                    154: #endif
                    155:
                    156: void
                    157: pcdisplay_putchar(id, row, col, c, attr)
                    158:        void *id;
                    159:        int row, col;
                    160:        u_int c;
                    161:        long attr;
                    162: {
                    163:        struct pcdisplayscreen *scr = id;
                    164:        bus_space_tag_t memt = scr->hdl->ph_memt;
                    165:        bus_space_handle_t memh = scr->hdl->ph_memh;
                    166:        int off;
                    167:
                    168:        off = row * scr->type->ncols + col;
                    169:
                    170:        if (scr->active)
                    171:                bus_space_write_2(memt, memh, scr->dispoffset + off * 2,
                    172:                                  c | (attr << 8));
                    173:        else
                    174:                scr->mem[off] = c | (attr << 8);
                    175: }
                    176:
                    177: int
                    178: pcdisplay_getchar(id, row, col, cell)
                    179:        void *id;
                    180:        int row, col;
                    181:        struct wsdisplay_charcell *cell;
                    182: {
                    183:        struct pcdisplayscreen *scr = id;
                    184:        bus_space_tag_t memt = scr->hdl->ph_memt;
                    185:        bus_space_handle_t memh = scr->hdl->ph_memh;
                    186:        int off;
                    187:        u_int16_t data;
                    188:
                    189:        off = row * scr->type->ncols + col;
                    190:        /* XXX bounds check? */
                    191:
                    192:        if (scr->active)
                    193:                data = (bus_space_read_2(memt, memh,
                    194:                                        scr->dispoffset + off * 2));
                    195:        else
                    196:                data = (scr->mem[off]);
                    197:
                    198:        cell->uc = data & 0xff;
                    199:        cell->attr = data >> 8;
                    200:
                    201:        return (0);
                    202: }
                    203:
                    204: void
                    205: pcdisplay_copycols(id, row, srccol, dstcol, ncols)
                    206:        void *id;
                    207:        int row, srccol, dstcol, ncols;
                    208: {
                    209:        struct pcdisplayscreen *scr = id;
                    210:        bus_space_tag_t memt = scr->hdl->ph_memt;
                    211:        bus_space_handle_t memh = scr->hdl->ph_memh;
                    212:        bus_size_t srcoff, dstoff;
                    213:
                    214:        srcoff = dstoff = row * scr->type->ncols;
                    215:        srcoff += srccol;
                    216:        dstoff += dstcol;
                    217:
                    218:        if (scr->active)
                    219:                bus_space_copy_2(memt, memh,
                    220:                                        scr->dispoffset + srcoff * 2,
                    221:                                        memh, scr->dispoffset + dstoff * 2,
                    222:                                        ncols);
                    223:        else
                    224:                bcopy(&scr->mem[srcoff], &scr->mem[dstoff], ncols * 2);
                    225: }
                    226:
                    227: void
                    228: pcdisplay_erasecols(id, row, startcol, ncols, fillattr)
                    229:        void *id;
                    230:        int row, startcol, ncols;
                    231:        long fillattr;
                    232: {
                    233:        struct pcdisplayscreen *scr = id;
                    234:        bus_space_tag_t memt = scr->hdl->ph_memt;
                    235:        bus_space_handle_t memh = scr->hdl->ph_memh;
                    236:        bus_size_t off;
                    237:        u_int16_t val;
                    238:        int i;
                    239:
                    240:        off = row * scr->type->ncols + startcol;
                    241:
                    242:        val = (fillattr << 8) | ' ';
                    243:
                    244:        if (scr->active)
                    245:                bus_space_set_region_2(memt, memh, scr->dispoffset + off * 2,
                    246:                                       val, ncols);
                    247:        else
                    248:                for (i = 0; i < ncols; i++)
                    249:                        scr->mem[off + i] = val;
                    250: }
                    251:
                    252: void
                    253: pcdisplay_copyrows(id, srcrow, dstrow, nrows)
                    254:        void *id;
                    255:        int srcrow, dstrow, nrows;
                    256: {
                    257:        struct pcdisplayscreen *scr = id;
                    258:        bus_space_tag_t memt = scr->hdl->ph_memt;
                    259:        bus_space_handle_t memh = scr->hdl->ph_memh;
                    260:        int ncols = scr->type->ncols;
                    261:        bus_size_t srcoff, dstoff;
                    262:
                    263:        srcoff = srcrow * ncols + 0;
                    264:        dstoff = dstrow * ncols + 0;
                    265:
                    266:        if (scr->active)
                    267:                bus_space_copy_2(memt, memh,
                    268:                                        scr->dispoffset + srcoff * 2,
                    269:                                        memh, scr->dispoffset + dstoff * 2,
                    270:                                        nrows * ncols);
                    271:        else
                    272:                bcopy(&scr->mem[srcoff], &scr->mem[dstoff],
                    273:                      nrows * ncols * 2);
                    274: }
                    275:
                    276: void
                    277: pcdisplay_eraserows(id, startrow, nrows, fillattr)
                    278:        void *id;
                    279:        int startrow, nrows;
                    280:        long fillattr;
                    281: {
                    282:        struct pcdisplayscreen *scr = id;
                    283:        bus_space_tag_t memt = scr->hdl->ph_memt;
                    284:        bus_space_handle_t memh = scr->hdl->ph_memh;
                    285:        bus_size_t off, count, n;
                    286:        u_int16_t val;
                    287:
                    288:        off = startrow * scr->type->ncols;
                    289:        count = nrows * scr->type->ncols;
                    290:
                    291:        val = (fillattr << 8) | ' ';
                    292:
                    293:        if (scr->active)
                    294:                bus_space_set_region_2(memt, memh, scr->dispoffset + off * 2,
                    295:                                       val, count);
                    296:        else
                    297:                for (n = 0; n < count; n++)
                    298:                        scr->mem[off + n] = val;
                    299: }

CVSweb