/[gxemul]/upstream/0.3.7/src/devices/dev_bt455.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /upstream/0.3.7/src/devices/dev_bt455.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 21 - (show annotations)
Mon Oct 8 16:19:28 2007 UTC (16 years, 7 months ago) by dpavlin
File MIME type: text/plain
File size: 5621 byte(s)
0.3.7
1 /*
2 * Copyright (C) 2004-2005 Anders Gavare. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * 3. The name of the author may not be used to endorse or promote products
13 * derived from this software without specific prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 *
28 * $Id: dev_bt455.c,v 1.9 2005/11/13 00:14:08 debug Exp $
29 *
30 * Brooktree 455, used by TURBOchannel graphics cards.
31 *
32 * TODO: This is hardcoded to only use 16 grayscales, using only the
33 * green component of the palette. Perhaps some other graphics card uses
34 * the BT455 as well; if so then this device must be re-hacked.
35 */
36
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <string.h>
40
41 #include "devices.h"
42 #include "memory.h"
43 #include "misc.h"
44
45
46
47 struct bt455_data {
48 unsigned char addr_cmap;
49 unsigned char addr_cmap_data;
50 unsigned char addr_clr;
51 unsigned char addr_ovly;
52
53 int cur_rgb_offset;
54
55 struct vfb_data *vfb_data;
56 unsigned char *rgb_palette; /* ptr to 256 * 3 (r,g,b) */
57 };
58
59
60 /*
61 * dev_bt455_access():
62 */
63 int dev_bt455_access(struct cpu *cpu, struct memory *mem,
64 uint64_t relative_addr, unsigned char *data, size_t len,
65 int writeflag, void *extra)
66 {
67 struct bt455_data *d = (struct bt455_data *) extra;
68 uint64_t idata = 0, odata = 0;
69 int i, modified;
70
71 if (writeflag == MEM_WRITE)
72 idata = memory_readmax64(cpu, data, len);
73
74 /* Read from/write to the bt455: */
75 switch (relative_addr) {
76 case 0x00: /* addr_cmap */
77 if (writeflag == MEM_WRITE) {
78 debug("[ bt455: write to addr_cmap, 0x%02x ]\n", idata);
79 d->addr_cmap = idata;
80 d->cur_rgb_offset = (d->addr_cmap & 0xf) * 3;
81 } else {
82 odata = d->addr_cmap;
83 debug("[ bt455: read from addr_cmap: 0x%0x ]\n", odata);
84 }
85 break;
86 case 0x04: /* addr_cmap_data */
87 if (writeflag == MEM_WRITE) {
88 debug("[ bt455: write to addr_cmap_data, 0x%02x ]\n",
89 (int)idata);
90 d->addr_cmap_data = idata;
91
92 modified = 0;
93
94 /* Only write on updates to the Green value: */
95 if ((d->cur_rgb_offset % 3) == 1) {
96 /* Update 16 copies: */
97 for (i=0; i<16; i++) {
98 int addr = (d->cur_rgb_offset + 16*i)
99 % 0x300;
100 int newvalue = idata * 0x11;
101
102 if (d->rgb_palette[(addr / 3) * 3 + 0]
103 != newvalue ||
104 d->rgb_palette[(addr / 3) * 3 + 1]
105 != newvalue ||
106 d->rgb_palette[(addr / 3) * 3 + 2]
107 != newvalue)
108 modified = 1;
109
110 d->rgb_palette[(addr / 3) * 3 + 0] =
111 d->rgb_palette[(addr / 3) * 3 + 1] =
112 d->rgb_palette[(addr / 3) * 3 + 2] =
113 newvalue;
114 }
115 }
116
117 if (modified) {
118 d->vfb_data->update_x1 = 0;
119 d->vfb_data->update_x2 = d->vfb_data->xsize - 1;
120 d->vfb_data->update_y1 = 0;
121 d->vfb_data->update_y2 = d->vfb_data->ysize - 1;
122 }
123
124 /* Advance to next palette byte: */
125 d->cur_rgb_offset ++;
126 } else {
127 odata = d->addr_cmap_data;
128 debug("[ bt455: read from addr_cmap_data: 0x%0x ]\n",
129 (int)odata);
130 }
131 break;
132 case 0x08: /* addr_clr */
133 if (writeflag == MEM_WRITE) {
134 debug("[ bt455: write to addr_clr, value 0x%02x ]\n",
135 (int)idata);
136 d->addr_clr = idata;
137 } else {
138 odata = d->addr_clr;
139 debug("[ bt455: read from addr_clr: value 0x%02x ]\n",
140 (int)odata);
141 }
142 break;
143 case 0x0c: /* addr_ovly */
144 if (writeflag == MEM_WRITE) {
145 debug("[ bt455: write to addr_ovly, value 0x%02x ]\n",
146 (int)idata);
147 d->addr_ovly = idata;
148 } else {
149 odata = d->addr_ovly;
150 debug("[ bt455: read from addr_ovly: value 0x%02x ]\n",
151 (int)odata);
152 }
153 break;
154 default:
155 if (writeflag == MEM_WRITE) {
156 debug("[ bt455: unimplemented write to address 0x%x,"
157 " data=0x%02x ]\n", (int)relative_addr, (int)idata);
158 } else {
159 debug("[ bt455: unimplemented read from address "
160 "0x%x ]\n", (int)relative_addr);
161 }
162 }
163
164 if (writeflag == MEM_READ)
165 memory_writemax64(cpu, data, len, odata);
166
167 return 1;
168 }
169
170
171 /*
172 * dev_bt455_init():
173 */
174 void dev_bt455_init(struct memory *mem, uint64_t baseaddr,
175 struct vfb_data *vfb_data)
176 {
177 struct bt455_data *d = malloc(sizeof(struct bt455_data));
178 if (d == NULL) {
179 fprintf(stderr, "out of memory\n");
180 exit(1);
181 }
182 memset(d, 0, sizeof(struct bt455_data));
183 d->vfb_data = vfb_data;
184 d->rgb_palette = vfb_data->rgb_palette;
185
186 memory_device_register(mem, "bt455", baseaddr, DEV_BT455_LENGTH,
187 dev_bt455_access, (void *)d, DM_DEFAULT, NULL);
188 }
189

  ViewVC Help
Powered by ViewVC 1.1.26