diff options
author | Thomas Bushnell <thomas@gnu.org> | 1997-02-25 21:28:37 +0000 |
---|---|---|
committer | Thomas Bushnell <thomas@gnu.org> | 1997-02-25 21:28:37 +0000 |
commit | f07a4c844da9f0ecae5bbee1ab94be56505f26f7 (patch) | |
tree | 12b07c7e578fc1a5f53dbfde2632408491ff2a70 /chips/bt455.c |
Initial source
Diffstat (limited to 'chips/bt455.c')
-rw-r--r-- | chips/bt455.c | 222 |
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 */ +} + |