summaryrefslogtreecommitdiff
path: root/chips/bt455.c
diff options
context:
space:
mode:
Diffstat (limited to 'chips/bt455.c')
-rw-r--r--chips/bt455.c222
1 files changed, 222 insertions, 0 deletions
diff --git a/chips/bt455.c b/chips/bt455.c
new file mode 100644
index 0000000..12acecb
--- /dev/null
+++ b/chips/bt455.c
@@ -0,0 +1,222 @@
+/*
+ * 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: bt455.c
+ * Author: Alessandro Forin, Carnegie Mellon University
+ * Date: 7/91
+ *
+ * Routines for the bt454/bt455 RAMDAC
+ */
+
+#include <platforms.h>
+
+#include <chips/bt455.h>
+#include <chips/screen.h>
+
+#ifdef DECSTATION
+
+typedef struct {
+ volatile unsigned char addr_cmap;
+ char pad0[3];
+ volatile unsigned char addr_cmap_data;
+ char pad1[3];
+ volatile unsigned char addr_clr;
+ char pad2[3];
+ volatile unsigned char addr_ovly;
+ char pad3[3];
+} bt455_padded_regmap_t;
+
+#else /*DECSTATION*/
+
+typedef bt455_regmap_t bt455_padded_regmap_t;
+#define wbflush()
+
+#endif /*DECSTATION*/
+
+
+/*
+ * Generic register access
+ */
+#define bt455_select_entry(regs, regno) \
+ { \
+ (regs)->addr_cmap = (regno)&0x0f; \
+ wbflush(); \
+ }
+
+
+/*
+ * Color map
+ */
+bt455_load_colormap( regs, map)
+ bt455_padded_regmap_t *regs;
+ color_map_t *map;
+{
+ register int i;
+
+ bt455_select_entry(regs, 0);
+
+ for (i = 0; i < 16; i++, map++) {
+ regs->addr_cmap_data = map->red >> 4;
+ wbflush();
+ regs->addr_cmap_data = map->green >> 4;
+ wbflush();
+ regs->addr_cmap_data = map->blue >> 4;
+ wbflush();
+ }
+}
+
+bt455_load_colormap_entry( regs, entry, map)
+ register bt455_padded_regmap_t *regs;
+ register color_map_t *map;
+{
+ bt455_select_entry(regs, entry);
+
+ regs->addr_cmap_data = map->red >> 4;
+ wbflush();
+ regs->addr_cmap_data = map->green >> 4;
+ wbflush();
+ regs->addr_cmap_data = map->blue >> 4;
+ wbflush();
+}
+
+bt455_init_colormap( regs)
+ bt455_padded_regmap_t *regs;
+{
+ register int i;
+ color_map_t m[2];
+
+ m[0].red = m[0].green = m[0].blue = 0;
+ m[1].red = m[1].green = m[1].blue = 0xff;
+
+ for (i = 0; i < 16; i++)
+ bt455_load_colormap_entry(regs, i, &m[0]);
+
+ bt455_load_colormap_entry(regs, 1, &m[1]);
+
+ bt455_cursor_color( regs, &m[0]);
+}
+
+#if 1/*debug*/
+bt455_print_colormap( regs)
+ bt455_padded_regmap_t *regs;
+{
+ register int i;
+
+ for (i = 0; i < 16; i++) {
+ register unsigned char red, green, blue;
+
+ bt455_select_entry(regs, i);
+ red = regs->addr_cmap_data;
+ green = regs->addr_cmap_data;
+ blue = regs->addr_cmap_data;
+ printf("%x->[x%x x%x x%x]\n", i,
+ red, green, blue);
+
+ }
+}
+#endif
+
+/*
+ * Video on/off
+ */
+bt455_video_off(regs, up)
+ bt455_padded_regmap_t *regs;
+ user_info_t *up;
+{
+ color_map_t m;
+ unsigned char *save;
+
+ /* Yes, this is awful */
+ save = (unsigned char *)up->dev_dep_2.gx.colormap;
+
+ bt455_select_entry( regs, 0);
+
+ *save++ = regs->addr_cmap_data; /* entry 0 */
+ *save++ = regs->addr_cmap_data;
+ *save++ = regs->addr_cmap_data;
+
+ *save++ = regs->addr_cmap_data; /* entry 1 */
+ *save++ = regs->addr_cmap_data;
+ *save++ = regs->addr_cmap_data;
+
+ m.red = m.green = m.blue = 0;
+ bt455_load_colormap_entry(regs, 0, &m);
+ bt455_load_colormap_entry(regs, 1, &m);
+}
+
+bt455_video_on(regs, up)
+ bt455_padded_regmap_t *regs;
+ user_info_t *up;
+{
+ unsigned char *save;
+
+ /* Like I said.. */
+ save = (unsigned char *)up->dev_dep_2.gx.colormap;
+
+ bt455_select_entry( regs, 0);
+
+ regs->addr_cmap_data = *save++; wbflush();
+ regs->addr_cmap_data = *save++; wbflush();
+ regs->addr_cmap_data = *save++; wbflush();
+
+ regs->addr_cmap_data = *save++; wbflush();
+ regs->addr_cmap_data = *save++; wbflush();
+ regs->addr_cmap_data = *save;
+
+}
+
+/*
+ * Cursor 'color' [as used on DEC's board]
+ */
+bt455_cursor_color( regs, color)
+ bt455_padded_regmap_t *regs;
+ color_map_t *color;
+{
+ register int i;
+
+ /* Bg is the first in color */
+ bt455_load_colormap_entry( regs, 8, color);
+ bt455_load_colormap_entry( regs, 9, color);
+
+ /* Fg is overlay */
+ color++;
+ regs->addr_ovly = color->red >> 4;
+ wbflush();
+ regs->addr_ovly = color->green >> 4;
+ wbflush();
+ regs->addr_ovly = color->blue >> 4;
+ wbflush();
+}
+
+/*
+ * Initialization
+ */
+bt455_init(regs)
+ bt455_padded_regmap_t *regs;
+{
+ /* Nothing really needed */
+}
+