/[gxemul]/upstream/0.3.1/devices/dev_kn01.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.1/devices/dev_kn01.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (show annotations)
Mon Oct 8 16:17:52 2007 UTC (16 years, 7 months ago) by dpavlin
File MIME type: text/plain
File size: 7386 byte(s)
0.3.1
1 /*
2 * Copyright (C) 2003-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_kn01.c,v 1.6 2005/02/11 09:53:48 debug Exp $
29 *
30 * KN01 stuff ("PMAX", DECstation type 1); CSR (System Control Register)
31 * and VDAC.
32 *
33 * TODO: The CSR isn't really complete.
34 *
35 * One of the few usable bits in the csr would be KN01_CSR_MONO.
36 * If that bit is set, the framebuffer is treated as a monochrome
37 * one.
38 */
39
40 #include <stdio.h>
41 #include <stdlib.h>
42 #include <string.h>
43
44 #include "cpu.h"
45 #include "devices.h"
46 #include "memory.h"
47 #include "misc.h"
48
49 #include "dec_kn01.h"
50
51
52 struct kn01_csr_data {
53 int color_fb;
54 int csr;
55 };
56
57
58 struct vdac_data {
59 unsigned char vdac_reg[DEV_VDAC_LENGTH];
60
61 int color_fb_flag;
62
63 unsigned char cur_read_addr;
64 unsigned char cur_write_addr;
65
66 int sub_color; /* subcolor. 0, 1, or 2 */
67 unsigned char cur_rgb[3];
68
69 unsigned char *rgb_palette; /* ptr to 256 * 3 (r,g,b) */
70
71 unsigned char cur_read_addr_overlay;
72 unsigned char cur_write_addr_overlay;
73
74 int sub_color_overlay; /* subcolor: 0, 1, or 2 */
75 unsigned char cur_rgb_overlay[3];
76
77 unsigned char rgb_palette_overlay[16 * 3]; /* 16 * 3 (r,g,b) */
78 };
79
80
81 /*
82 * dev_kn01_csr_access():
83 */
84 int dev_kn01_csr_access(struct cpu *cpu, struct memory *mem,
85 uint64_t relative_addr, unsigned char *data, size_t len,
86 int writeflag, void *extra)
87 {
88 struct kn01_csr_data *k = extra;
89 int csr;
90
91 if (writeflag == MEM_WRITE) {
92 /* TODO */
93 return 1;
94 }
95
96 /* Read: */
97 if (len != 2 || relative_addr != 0) {
98 fatal("[ kn01_csr: trying to read something which is not "
99 "the first half-word of the csr ]");
100 }
101
102 csr = k->csr;
103
104 if (cpu->byte_order == EMUL_LITTLE_ENDIAN) {
105 data[0] = csr & 0xff;
106 data[1] = (csr >> 8) & 0xff;
107 } else {
108 data[1] = csr & 0xff;
109 data[0] = (csr >> 8) & 0xff;
110 }
111
112 return 1;
113 }
114
115
116 /*
117 * dev_vdac_access():
118 */
119 int dev_vdac_access(struct cpu *cpu, struct memory *mem,
120 uint64_t relative_addr, unsigned char *data, size_t len,
121 int writeflag, void *extra)
122 {
123 struct vdac_data *d = (struct vdac_data *) extra;
124
125 /* Read from/write to the vdac: */
126 switch (relative_addr) {
127 case DEV_VDAC_MAPWA:
128 if (writeflag == MEM_WRITE) {
129 d->cur_write_addr = data[0];
130 d->sub_color = 0;
131 } else {
132 debug("[ vdac: read from MAPWA ]\n");
133 data[0] = d->vdac_reg[relative_addr];
134 }
135 break;
136 case DEV_VDAC_MAP:
137 if (writeflag == MEM_WRITE) {
138 d->cur_rgb[d->sub_color] = data[0];
139 d->sub_color++;
140
141 if (d->sub_color > 2) {
142 /* (Only update for color, not mono mode) */
143 if (d->color_fb_flag)
144 memcpy(d->rgb_palette +
145 3*d->cur_write_addr, d->cur_rgb, 3);
146
147 d->sub_color = 0;
148 d->cur_write_addr ++;
149 }
150 } else {
151 if (d->sub_color == 0) {
152 memcpy(d->cur_rgb, d->rgb_palette +
153 3 * d->cur_read_addr, 3);
154 }
155 data[0] = d->cur_rgb[d->sub_color];
156 d->sub_color++;
157 if (d->sub_color > 2) {
158 d->sub_color = 0;
159 d->cur_read_addr ++;
160 }
161 }
162 break;
163 case DEV_VDAC_MAPRA:
164 if (writeflag == MEM_WRITE) {
165 d->cur_read_addr = data[0];
166 d->sub_color = 0;
167 } else {
168 debug("[ vdac: read from MAPRA ]\n");
169 data[0] = d->vdac_reg[relative_addr];
170 }
171 break;
172 case DEV_VDAC_OVERWA:
173 if (writeflag == MEM_WRITE) {
174 d->cur_write_addr_overlay = data[0];
175 d->sub_color_overlay = 0;
176 } else {
177 debug("[ vdac: read from OVERWA ]\n");
178 data[0] = d->vdac_reg[relative_addr];
179 }
180 break;
181 case DEV_VDAC_OVER:
182 if (writeflag == MEM_WRITE) {
183 d->cur_rgb_overlay[d->sub_color_overlay] = data[0];
184 d->sub_color_overlay++;
185
186 if (d->sub_color_overlay > 2) {
187 /* (Only update for color, not mono mode) */
188 if (d->color_fb_flag)
189 memcpy(d->rgb_palette_overlay +
190 3 * d->cur_write_addr_overlay,
191 d->cur_rgb_overlay, 3);
192
193 d->sub_color_overlay = 0;
194 d->cur_write_addr_overlay ++;
195 if (d->cur_write_addr_overlay > 15)
196 d->cur_write_addr_overlay = 0;
197 }
198 } else {
199 if (d->sub_color_overlay == 0) {
200 memcpy(d->cur_rgb_overlay,
201 d->rgb_palette_overlay +
202 3 * d->cur_read_addr_overlay, 3);
203 }
204 data[0] = d->cur_rgb_overlay[d->sub_color_overlay];
205 d->sub_color_overlay++;
206 if (d->sub_color_overlay > 2) {
207 d->sub_color_overlay = 0;
208 d->cur_read_addr_overlay ++;
209 if (d->cur_read_addr_overlay > 15)
210 d->cur_read_addr_overlay = 0;
211 }
212 }
213 break;
214 case DEV_VDAC_OVERRA:
215 if (writeflag == MEM_WRITE) {
216 d->cur_read_addr_overlay = data[0];
217 d->sub_color_overlay = 0;
218 } else {
219 debug("[ vdac: read from OVERRA ]\n");
220 data[0] = d->vdac_reg[relative_addr];
221 }
222 break;
223 default:
224 if (writeflag == MEM_WRITE) {
225 debug("[ vdac: unimplemented write to address 0x%x,"
226 " data=0x%02x ]\n", (int)relative_addr, data[0]);
227 d->vdac_reg[relative_addr] = data[0];
228 } else {
229 debug("[ vdac: unimplemented read from address 0x%x"
230 " ]\n", (int)relative_addr);
231 data[0] = d->vdac_reg[relative_addr];
232 }
233 }
234
235 /* Pretend it was ok: */
236 return 1;
237 }
238
239
240 /*
241 * dev_vdac_init():
242 */
243 void dev_vdac_init(struct memory *mem, uint64_t baseaddr,
244 unsigned char *rgb_palette, int color_fb_flag)
245 {
246 struct vdac_data *d = malloc(sizeof(struct vdac_data));
247 if (d == NULL) {
248 fprintf(stderr, "out of memory\n");
249 exit(1);
250 }
251 memset(d, 0, sizeof(struct vdac_data));
252 d->rgb_palette = rgb_palette;
253 d->color_fb_flag = color_fb_flag;
254
255 memory_device_register(mem, "vdac", baseaddr, DEV_VDAC_LENGTH,
256 dev_vdac_access, (void *)d, MEM_DEFAULT, NULL);
257 }
258
259
260 /*
261 * dev_kn01_csr_init():
262 */
263 void dev_kn01_csr_init(struct memory *mem, uint64_t baseaddr, int color_fb)
264 {
265 struct kn01_csr_data *k = malloc(sizeof(struct kn01_csr_data));
266 if (k == NULL) {
267 fprintf(stderr, "out of memory\n");
268 exit(1);
269 }
270
271 memset(k, 0, sizeof(struct kn01_csr_data));
272 k->color_fb = color_fb;
273
274 k->csr = 0;
275 k->csr |= (color_fb? 0 : KN01_CSR_MONO);
276
277 memory_device_register(mem, "kn01_csr", baseaddr,
278 DEV_KN01_CSR_LENGTH, dev_kn01_csr_access, k, MEM_DEFAULT, NULL);
279 }
280

  ViewVC Help
Powered by ViewVC 1.1.26