/[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

Annotation of /upstream/0.3.8/src/devices/dev_bt455.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 23 - (hide 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 dpavlin 4 /*
2 dpavlin 22 * Copyright (C) 2004-2006 Anders Gavare. All rights reserved.
3 dpavlin 4 *
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 dpavlin 22 * $Id: dev_bt455.c,v 1.10 2006/01/01 13:17:16 debug Exp $
29 dpavlin 4 *
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 dpavlin 22 DEVICE_ACCESS(bt455)
64 dpavlin 4 {
65     struct bt455_data *d = (struct bt455_data *) extra;
66     uint64_t idata = 0, odata = 0;
67     int i, modified;
68    
69 dpavlin 18 if (writeflag == MEM_WRITE)
70     idata = memory_readmax64(cpu, data, len);
71 dpavlin 4
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 dpavlin 20 dev_bt455_access, (void *)d, DM_DEFAULT, NULL);
186 dpavlin 4 }
187    

  ViewVC Help
Powered by ViewVC 1.1.26