summaryrefslogtreecommitdiff
path: root/sys/dev/ic/pcdisplay_subr.c
diff options
context:
space:
mode:
authorAaron Campbell <aaron@cvs.openbsd.org>2000-11-15 20:42:41 +0000
committerAaron Campbell <aaron@cvs.openbsd.org>2000-11-15 20:42:41 +0000
commit9fb663d328cc277db0ec2e2ae42888aac1776c1a (patch)
tree60920204cc3c1474ba85a9c115e9fa6c3e1d19e0 /sys/dev/ic/pcdisplay_subr.c
parent4bad674336d1b2a7a7339daad5f1447ba1d12187 (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.c260
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;
+}