/[gxemul]/upstream/0.3.8/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.8/src/devices/dev_bt455.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 23 - (show annotations)
Mon Oct 8 16:19:43 2007 UTC (16 years, 7 months ago) by dpavlin
File MIME type: text/plain
File size: 5498 byte(s)
0.3.8
1 /*
2 * Copyright (C) 2004-2006 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.10 2006/01/01 13:17:16 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 DEVICE_ACCESS(bt455)
64 {
65 struct bt455_data *d = (struct bt455_data *) extra;
66 uint64_t idata = 0, odata = 0;
67 int i, modified;
68
69 if (writeflag == MEM_WRITE)
70 idata = memory_readmax64(cpu, data, len);
71
72 /* Read from/write to the bt455: */
73 switch (relative_addr) {
74 case 0x00: /* addr_cmap */
75 if (writeflag == MEM_WRITE) {
76 debug("[ bt455: write to addr_cmap, 0x%02x ]\n", idata);
77 d->addr_cmap = idata;
78 d->cur_rgb_offset = (d->addr_cmap & 0xf) * 3;
79 } else {
80 odata = d->addr_cmap;
81 debug("[ bt455: read from addr_cmap: 0x%0x ]\n", odata);
82 }
83 break;
84 case 0x04: /* addr_cmap_data */
85 if (writeflag == MEM_WRITE) {
86 debug("[ bt455: write to addr_cmap_data, 0x%02x ]\n",
87 (int)idata);
88 d->addr_cmap_data = idata;
89
90 modified = 0;
91
92 /* Only write on updates to the Green value: */
93 if ((d->cur_rgb_offset % 3) == 1) {
94 /* Update 16 copies: */
95 for (i=0; i<16; i++) {
96 int addr = (d->cur_rgb_offset + 16*i)
97 % 0x300;
98 int newvalue = idata * 0x11;
99
100 if (d->rgb_palette[(addr / 3) * 3 + 0]
101 != newvalue ||
102 d->rgb_palette[(addr / 3) * 3 + 1]
103 != newvalue ||
104 d->rgb_palette[(addr / 3) * 3 + 2]
105 != newvalue)
106 modified = 1;
107
108 d->rgb_palette[(addr / 3) * 3 + 0] =
109 d->rgb_palette[(addr / 3) * 3 + 1] =
110 d->rgb_palette[(addr / 3) * 3 + 2] =
111 newvalue;
112 }
113 }
114
115 if (modified) {
116 d->vfb_data->update_x1 = 0;
117 d->vfb_data->update_x2 = d->vfb_data->xsize - 1;
118 d->vfb_data->update_y1 = 0;
119 d->vfb_data->update_y2 = d->vfb_data->ysize - 1;
120 }
121
122 /* Advance to next palette byte: */
123 d->cur_rgb_offset ++;
124 } else {
125 odata = d->addr_cmap_data;
126 debug("[ bt455: read from addr_cmap_data: 0x%0x ]\n",
127 (int)odata);
128 }
129 break;
130 case 0x08: /* addr_clr */
131 if (writeflag == MEM_WRITE) {
132 debug("[ bt455: write to addr_clr, value 0x%02x ]\n",
133 (int)idata);
134 d->addr_clr = idata;
135 } else {
136 odata = d->addr_clr;
137 debug("[ bt455: read from addr_clr: value 0x%02x ]\n",
138 (int)odata);
139 }
140 break;
141 case 0x0c: /* addr_ovly */
142 if (writeflag == MEM_WRITE) {
143 debug("[ bt455: write to addr_ovly, value 0x%02x ]\n",
144 (int)idata);
145 d->addr_ovly = idata;
146 } else {
147 odata = d->addr_ovly;
148 debug("[ bt455: read from addr_ovly: value 0x%02x ]\n",
149 (int)odata);
150 }
151 break;
152 default:
153 if (writeflag == MEM_WRITE) {
154 debug("[ bt455: unimplemented write to address 0x%x,"
155 " data=0x%02x ]\n", (int)relative_addr, (int)idata);
156 } else {
157 debug("[ bt455: unimplemented read from address "
158 "0x%x ]\n", (int)relative_addr);
159 }
160 }
161
162 if (writeflag == MEM_READ)
163 memory_writemax64(cpu, data, len, odata);
164
165 return 1;
166 }
167
168
169 /*
170 * dev_bt455_init():
171 */
172 void dev_bt455_init(struct memory *mem, uint64_t baseaddr,
173 struct vfb_data *vfb_data)
174 {
175 struct bt455_data *d = malloc(sizeof(struct bt455_data));
176 if (d == NULL) {
177 fprintf(stderr, "out of memory\n");
178 exit(1);
179 }
180 memset(d, 0, sizeof(struct bt455_data));
181 d->vfb_data = vfb_data;
182 d->rgb_palette = vfb_data->rgb_palette;
183
184 memory_device_register(mem, "bt455", baseaddr, DEV_BT455_LENGTH,
185 dev_bt455_access, (void *)d, DM_DEFAULT, NULL);
186 }
187

  ViewVC Help
Powered by ViewVC 1.1.26