summaryrefslogtreecommitdiff
path: root/chips/dc503.c
diff options
context:
space:
mode:
authorThomas Bushnell <thomas@gnu.org>1997-02-25 21:28:37 +0000
committerThomas Bushnell <thomas@gnu.org>1997-02-25 21:28:37 +0000
commitf07a4c844da9f0ecae5bbee1ab94be56505f26f7 (patch)
tree12b07c7e578fc1a5f53dbfde2632408491ff2a70 /chips/dc503.c
Initial source
Diffstat (limited to 'chips/dc503.c')
-rw-r--r--chips/dc503.c189
1 files changed, 189 insertions, 0 deletions
diff --git a/chips/dc503.c b/chips/dc503.c
new file mode 100644
index 0000000..8bfab50
--- /dev/null
+++ b/chips/dc503.c
@@ -0,0 +1,189 @@
+/*
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989 Carnegie Mellon University
+ * All Rights Reserved.
+ *
+ * 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 Mellon
+ * the rights to redistribute these changes.
+ */
+/*
+ * File: dc503.h
+ * Author: Alessandro Forin, Carnegie Mellon University
+ * Date: 9/90
+ *
+ * Routines for the DEC DC503 Programmable Cursor Chip
+ */
+#include <platforms.h>
+
+#include <chips/pm_defs.h>
+#include <chips/dc503.h>
+
+
+#if defined(DECSTATION) || defined(VAXSTATION)
+
+typedef struct {
+ volatile unsigned short pcc_cmdr; /* all regs are wo */
+ short pad0;
+ volatile unsigned short pcc_xpos;
+ short pad1;
+ volatile unsigned short pcc_ypos;
+ short pad2;
+ volatile unsigned short pcc_xmin1;
+ short pad3;
+ volatile unsigned short pcc_xmax1;
+ short pad4;
+ volatile unsigned short pcc_ymin1;
+ short pad5;
+ volatile unsigned short pcc_ymax1;
+ short pad6[9];
+ volatile unsigned short pcc_xmin2;
+ short pad7;
+ volatile unsigned short pcc_xmax2;
+ short pad8;
+ volatile unsigned short pcc_ymin2;
+ short pad9;
+ volatile unsigned short pcc_ymax2;
+ short pad10;
+ volatile unsigned short pcc_memory;
+ short pad11;
+} dc503_padded_regmap_t;
+
+#else
+
+typedef dc503_regmap_t dc503_padded_regmap_t;
+
+#endif
+
+#ifdef VAXSTATION
+#define X_CSHIFT 216
+#define Y_CSHIFT 34
+#define wbflush()
+#define PCC_STATE (DC503_CMD_ENPA | DC503_CMD_ENPB | DC503_CMD_HSHI)
+#endif /*VAXSTATION*/
+
+/* defaults, for the innocents */
+
+#ifndef X_CSHIFT
+#define X_CSHIFT 212
+#define Y_CSHIFT 34
+#define PCC_STATE (DC503_CMD_ENPA | DC503_CMD_ENPB)
+#endif
+
+/*
+ * Cursor
+ */
+dc503_pos_cursor( regs, x, y)
+ dc503_padded_regmap_t *regs;
+{
+ regs->pcc_xpos = x + X_CSHIFT;
+ regs->pcc_ypos = y + Y_CSHIFT;
+ wbflush();
+}
+
+dc503_load_cursor( pm, cursor)
+ pm_softc_t *pm;
+ unsigned short *cursor;
+{
+ dc503_padded_regmap_t *regs;
+ register int i;
+
+ regs = (dc503_padded_regmap_t*)pm->cursor_registers;
+
+ pm->cursor_state |= DC503_CMD_LODSA;
+ regs->pcc_cmdr = pm->cursor_state;
+ wbflush();
+ for (i = 0; i < 32; i++) {
+ regs->pcc_memory = *cursor++;
+ wbflush();
+ }
+ pm->cursor_state &= ~DC503_CMD_LODSA;
+ regs->pcc_cmdr = pm->cursor_state;
+}
+
+
+unsigned short dc503_default_cursor[16+16] = {
+/* Plane A */
+ 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff,
+ 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff,
+/* Plane B */
+ 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff,
+ 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff
+};
+
+/*
+ * Vert retrace interrupt
+ */
+dc503_vretrace( pm, on)
+ pm_softc_t *pm;
+{
+ if (on)
+ pm->cursor_state |= DC503_CMD_ENRG2;
+ else
+ pm->cursor_state &= ~DC503_CMD_ENRG2;
+ ((dc503_padded_regmap_t*)pm->cursor_registers)->pcc_cmdr = pm->cursor_state;
+}
+
+/*
+ * Video on/off
+ */
+dc503_video_on( pm, up)
+ pm_softc_t *pm;
+{
+ pm->cursor_state = DC503_CMD_ENPA | (pm->cursor_state & ~DC503_CMD_FOPB);
+ ((dc503_padded_regmap_t*)pm->cursor_registers)->pcc_cmdr = pm->cursor_state;
+}
+
+dc503_video_off( pm, up)
+ pm_softc_t *pm;
+{
+ pm->cursor_state = DC503_CMD_FOPB | (pm->cursor_state & ~DC503_CMD_ENPA);
+ ((dc503_padded_regmap_t*)pm->cursor_registers)->pcc_cmdr = pm->cursor_state;
+}
+
+
+/*
+ * Initialization
+ */
+dc503_init( pm )
+ pm_softc_t *pm;
+{
+ dc503_padded_regmap_t *regs;
+
+ regs = (dc503_padded_regmap_t*)pm->cursor_registers;
+
+ dc503_load_cursor( pm, dc503_default_cursor);
+ dc503_pos_cursor( regs, 0, 0); /* XXX off screen */
+
+ regs->pcc_xmin1 = 0; /* test only */
+ regs->pcc_xmax1 = 0;
+ regs->pcc_ymin1 = 0;
+ regs->pcc_ymax1 = 0;
+
+ regs->pcc_xmin2 = 212; /* vert retrace detector */
+ regs->pcc_xmax2 = 212+1023;
+ regs->pcc_ymin2 = 34+863;
+ regs->pcc_ymax2 = 34+863;
+
+#if 0
+ regs->pcc_cmdr = DC503_CMD_FOPB | DC503_CMD_VBHI;/* reset */
+#endif
+ pm->cursor_state = PCC_STATE;
+ regs->pcc_cmdr = pm->cursor_state;
+}