diff options
author | Aaron Campbell <aaron@cvs.openbsd.org> | 2000-11-15 20:42:41 +0000 |
---|---|---|
committer | Aaron Campbell <aaron@cvs.openbsd.org> | 2000-11-15 20:42:41 +0000 |
commit | 9fb663d328cc277db0ec2e2ae42888aac1776c1a (patch) | |
tree | 60920204cc3c1474ba85a9c115e9fa6c3e1d19e0 /sys/dev/ic/pcdisplay_subr.c | |
parent | 4bad674336d1b2a7a7339daad5f1447ba1d12187 (diff) |
This driver supports PC display adapter hardware within the wscons(4)
console framework. It doesn't provide direct device driver entry points
but makes its functions available via the internal wsdisplay(4) interface.
The pcdisplay driver is indended as a minimal ``catch-all'' driver for
the different kinds of MDA or CGA compatible adapters. It doesn't support
multiple screens, nor colors or font loading.
From NetBSD. Contains routines used by the vga(4) and ega(4) drivers, etc.
This is more MI stuff in prepartion for wscons on i386 and alpha.
Diffstat (limited to 'sys/dev/ic/pcdisplay_subr.c')
-rw-r--r-- | sys/dev/ic/pcdisplay_subr.c | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/sys/dev/ic/pcdisplay_subr.c b/sys/dev/ic/pcdisplay_subr.c new file mode 100644 index 00000000000..d39cf0db60f --- /dev/null +++ b/sys/dev/ic/pcdisplay_subr.c @@ -0,0 +1,260 @@ +/* $NetBSD: pcdisplay_subr.c,v 1.16 2000/06/08 07:01:19 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/device.h> +#include <machine/bus.h> + +#include <dev/ic/mc6845reg.h> +#include <dev/ic/pcdisplayvar.h> + +#include <dev/wscons/wsdisplayvar.h> + +void +pcdisplay_cursor_init(scr, existing) + struct pcdisplayscreen *scr; + int existing; +{ +#ifdef PCDISPLAY_SOFTCURSOR + bus_space_tag_t memt; + bus_space_handle_t memh; + int off; + + pcdisplay_6845_write(scr->hdl, curstart, 0x10); + pcdisplay_6845_write(scr->hdl, curend, 0x10); + + if (existing) { + /* + * This is the first screen. At this point, scr->active is + * false and scr->mem is NULL (no backing store), so we + * can't use pcdisplay_cursor() to do this. + */ + memt = scr->hdl->ph_memt; + memh = scr->hdl->ph_memh; + off = (scr->vc_crow * scr->type->ncols + scr->vc_ccol) * 2 + + scr->dispoffset; + + scr->cursortmp = bus_space_read_2(memt, memh, off); + bus_space_write_2(memt, memh, off, scr->cursortmp ^ 0x7700); + } else + scr->cursortmp = 0; +#endif + scr->cursoron = 1; +} + +void +pcdisplay_cursor(id, on, row, col) + void *id; + int on, row, col; +{ +#ifdef PCDISPLAY_SOFTCURSOR + struct pcdisplayscreen *scr = id; + bus_space_tag_t memt = scr->hdl->ph_memt; + bus_space_handle_t memh = scr->hdl->ph_memh; + int off; + + /* Remove old cursor image */ + if (scr->cursoron) { + off = scr->vc_crow * scr->type->ncols + scr->vc_ccol; + if (scr->active) + bus_space_write_2(memt, memh, scr->dispoffset + off * 2, + scr->cursortmp); + else + scr->mem[off] = scr->cursortmp; + } + + scr->vc_crow = row; + scr->vc_ccol = col; + + if ((scr->cursoron = on) == 0) + return; + + off = (scr->vc_crow * scr->type->ncols + scr->vc_ccol); + if (scr->active) { + off = off * 2 + scr->dispoffset; + scr->cursortmp = bus_space_read_2(memt, memh, off); + bus_space_write_2(memt, memh, off, scr->cursortmp ^ 0x7700); + } else { + scr->cursortmp = scr->mem[off]; + scr->mem[off] = scr->cursortmp ^ 0x7700; + } +#else /* PCDISPLAY_SOFTCURSOR */ + struct pcdisplayscreen *scr = id; + int pos; + + scr->vc_crow = row; + scr->vc_ccol = col; + scr->cursoron = on; + + if (scr->active) { + if (!on) + pos = 0x1010; + else + pos = scr->dispoffset / 2 + + row * scr->type->ncols + col; + + pcdisplay_6845_write(scr->hdl, cursorh, pos >> 8); + pcdisplay_6845_write(scr->hdl, cursorl, pos); + } +#endif /* PCDISPLAY_SOFTCURSOR */ +} + +#if 0 +unsigned int +pcdisplay_mapchar_simple(id, uni) + void *id; + int uni; +{ + if (uni < 128) + return (uni); + + return (1); /* XXX ??? smiley */ +} +#endif + +void +pcdisplay_putchar(id, row, col, c, attr) + void *id; + int row, col; + u_int c; + long attr; +{ + struct pcdisplayscreen *scr = id; + bus_space_tag_t memt = scr->hdl->ph_memt; + bus_space_handle_t memh = scr->hdl->ph_memh; + int off; + + off = row * scr->type->ncols + col; + + if (scr->active) + bus_space_write_2(memt, memh, scr->dispoffset + off * 2, + c | (attr << 8)); + else + scr->mem[off] = c | (attr << 8); +} + +void +pcdisplay_copycols(id, row, srccol, dstcol, ncols) + void *id; + int row, srccol, dstcol, ncols; +{ + struct pcdisplayscreen *scr = id; + bus_space_tag_t memt = scr->hdl->ph_memt; + bus_space_handle_t memh = scr->hdl->ph_memh; + bus_size_t srcoff, dstoff; + + srcoff = dstoff = row * scr->type->ncols; + srcoff += srccol; + dstoff += dstcol; + + if (scr->active) + bus_space_copy_2(memt, memh, + scr->dispoffset + srcoff * 2, + memh, scr->dispoffset + dstoff * 2, + ncols); + else + bcopy(&scr->mem[srcoff], &scr->mem[dstoff], ncols * 2); +} + +void +pcdisplay_erasecols(id, row, startcol, ncols, fillattr) + void *id; + int row, startcol, ncols; + long fillattr; +{ + struct pcdisplayscreen *scr = id; + bus_space_tag_t memt = scr->hdl->ph_memt; + bus_space_handle_t memh = scr->hdl->ph_memh; + bus_size_t off; + u_int16_t val; + int i; + + off = row * scr->type->ncols + startcol; + + val = (fillattr << 8) | ' '; + + if (scr->active) + bus_space_set_region_2(memt, memh, scr->dispoffset + off * 2, + val, ncols); + else + for (i = 0; i < ncols; i++) + scr->mem[off + i] = val; +} + +void +pcdisplay_copyrows(id, srcrow, dstrow, nrows) + void *id; + int srcrow, dstrow, nrows; +{ + struct pcdisplayscreen *scr = id; + bus_space_tag_t memt = scr->hdl->ph_memt; + bus_space_handle_t memh = scr->hdl->ph_memh; + int ncols = scr->type->ncols; + bus_size_t srcoff, dstoff; + + srcoff = srcrow * ncols + 0; + dstoff = dstrow * ncols + 0; + + if (scr->active) + bus_space_copy_2(memt, memh, + scr->dispoffset + srcoff * 2, + memh, scr->dispoffset + dstoff * 2, + nrows * ncols); + else + bcopy(&scr->mem[srcoff], &scr->mem[dstoff], + nrows * ncols * 2); +} + +void +pcdisplay_eraserows(id, startrow, nrows, fillattr) + void *id; + int startrow, nrows; + long fillattr; +{ + struct pcdisplayscreen *scr = id; + bus_space_tag_t memt = scr->hdl->ph_memt; + bus_space_handle_t memh = scr->hdl->ph_memh; + bus_size_t off, count; + u_int16_t val; + int i; + + off = startrow * scr->type->ncols; + count = nrows * scr->type->ncols; + + val = (fillattr << 8) | ' '; + + if (scr->active) + bus_space_set_region_2(memt, memh, scr->dispoffset + off * 2, + val, count); + else + for (i = 0; i < count; i++) + scr->mem[off + i] = val; +} |