/[gxemul]/upstream/0.4.2/src/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.4.2/src/devices/dev_kn01.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 31 - (show annotations)
Mon Oct 8 16:20:48 2007 UTC (16 years, 8 months ago) by dpavlin
File MIME type: text/plain
File size: 7136 byte(s)
0.4.2
1 /*
2 * Copyright (C) 2003-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_kn01.c,v 1.8 2006/01/01 13:17:16 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 DEVICE_ACCESS(kn01_csr)
85 {
86 struct kn01_csr_data *k = extra;
87 int csr;
88
89 if (writeflag == MEM_WRITE) {
90 /* TODO */
91 return 1;
92 }
93
94 /* Read: */
95 if (len != 2 || relative_addr != 0) {
96 fatal("[ kn01_csr: trying to read something which is not "
97 "the first half-word of the csr ]");
98 }
99
100 csr = k->csr;
101
102 if (cpu->byte_order == EMUL_LITTLE_ENDIAN) {
103 data[0] = csr & 0xff;
104 data[1] = (csr >> 8) & 0xff;
105 } else {
106 data[1] = csr & 0xff;
107 data[0] = (csr >> 8) & 0xff;
108 }
109
110 return 1;
111 }
112
113
114 /*
115 * dev_vdac_access():
116 */
117 DEVICE_ACCESS(vdac)
118 {
119 struct vdac_data *d = (struct vdac_data *) extra;
120
121 /* Read from/write to the vdac: */
122 switch (relative_addr) {
123 case DEV_VDAC_MAPWA:
124 if (writeflag == MEM_WRITE) {
125 d->cur_write_addr = data[0];
126 d->sub_color = 0;
127 } else {
128 debug("[ vdac: read from MAPWA ]\n");
129 data[0] = d->vdac_reg[relative_addr];
130 }
131 break;
132 case DEV_VDAC_MAP:
133 if (writeflag == MEM_WRITE) {
134 d->cur_rgb[d->sub_color] = data[0];
135 d->sub_color++;
136
137 if (d->sub_color > 2) {
138 /* (Only update for color, not mono mode) */
139 if (d->color_fb_flag)
140 memcpy(d->rgb_palette +
141 3*d->cur_write_addr, d->cur_rgb, 3);
142
143 d->sub_color = 0;
144 d->cur_write_addr ++;
145 }
146 } else {
147 if (d->sub_color == 0) {
148 memcpy(d->cur_rgb, d->rgb_palette +
149 3 * d->cur_read_addr, 3);
150 }
151 data[0] = d->cur_rgb[d->sub_color];
152 d->sub_color++;
153 if (d->sub_color > 2) {
154 d->sub_color = 0;
155 d->cur_read_addr ++;
156 }
157 }
158 break;
159 case DEV_VDAC_MAPRA:
160 if (writeflag == MEM_WRITE) {
161 d->cur_read_addr = data[0];
162 d->sub_color = 0;
163 } else {
164 debug("[ vdac: read from MAPRA ]\n");
165 data[0] = d->vdac_reg[relative_addr];
166 }
167 break;
168 case DEV_VDAC_OVERWA:
169 if (writeflag == MEM_WRITE) {
170 d->cur_write_addr_overlay = data[0];
171 d->sub_color_overlay = 0;
172 } else {
173 debug("[ vdac: read from OVERWA ]\n");
174 data[0] = d->vdac_reg[relative_addr];
175 }
176 break;
177 case DEV_VDAC_OVER:
178 if (writeflag == MEM_WRITE) {
179 d->cur_rgb_overlay[d->sub_color_overlay] = data[0];
180 d->sub_color_overlay++;
181
182 if (d->sub_color_overlay > 2) {
183 /* (Only update for color, not mono mode) */
184 if (d->color_fb_flag)
185 memcpy(d->rgb_palette_overlay +
186 3 * d->cur_write_addr_overlay,
187 d->cur_rgb_overlay, 3);
188
189 d->sub_color_overlay = 0;
190 d->cur_write_addr_overlay ++;
191 if (d->cur_write_addr_overlay > 15)
192 d->cur_write_addr_overlay = 0;
193 }
194 } else {
195 if (d->sub_color_overlay == 0) {
196 memcpy(d->cur_rgb_overlay,
197 d->rgb_palette_overlay +
198 3 * d->cur_read_addr_overlay, 3);
199 }
200 data[0] = d->cur_rgb_overlay[d->sub_color_overlay];
201 d->sub_color_overlay++;
202 if (d->sub_color_overlay > 2) {
203 d->sub_color_overlay = 0;
204 d->cur_read_addr_overlay ++;
205 if (d->cur_read_addr_overlay > 15)
206 d->cur_read_addr_overlay = 0;
207 }
208 }
209 break;
210 case DEV_VDAC_OVERRA:
211 if (writeflag == MEM_WRITE) {
212 d->cur_read_addr_overlay = data[0];
213 d->sub_color_overlay = 0;
214 } else {
215 debug("[ vdac: read from OVERRA ]\n");
216 data[0] = d->vdac_reg[relative_addr];
217 }
218 break;
219 default:
220 if (writeflag == MEM_WRITE) {
221 debug("[ vdac: unimplemented write to address 0x%x,"
222 " data=0x%02x ]\n", (int)relative_addr, data[0]);
223 d->vdac_reg[relative_addr] = data[0];
224 } else {
225 debug("[ vdac: unimplemented read from address 0x%x"
226 " ]\n", (int)relative_addr);
227 data[0] = d->vdac_reg[relative_addr];
228 }
229 }
230
231 /* Pretend it was ok: */
232 return 1;
233 }
234
235
236 /*
237 * dev_vdac_init():
238 */
239 void dev_vdac_init(struct memory *mem, uint64_t baseaddr,
240 unsigned char *rgb_palette, int color_fb_flag)
241 {
242 struct vdac_data *d = malloc(sizeof(struct vdac_data));
243 if (d == NULL) {
244 fprintf(stderr, "out of memory\n");
245 exit(1);
246 }
247 memset(d, 0, sizeof(struct vdac_data));
248 d->rgb_palette = rgb_palette;
249 d->color_fb_flag = color_fb_flag;
250
251 memory_device_register(mem, "vdac", baseaddr, DEV_VDAC_LENGTH,
252 dev_vdac_access, (void *)d, DM_DEFAULT, NULL);
253 }
254
255
256 /*
257 * dev_kn01_csr_init():
258 */
259 void dev_kn01_csr_init(struct memory *mem, uint64_t baseaddr, int color_fb)
260 {
261 struct kn01_csr_data *k = malloc(sizeof(struct kn01_csr_data));
262 if (k == NULL) {
263 fprintf(stderr, "out of memory\n");
264 exit(1);
265 }
266
267 memset(k, 0, sizeof(struct kn01_csr_data));
268 k->color_fb = color_fb;
269
270 k->csr = 0;
271 k->csr |= (color_fb? 0 : KN01_CSR_MONO);
272
273 memory_device_register(mem, "kn01_csr", baseaddr,
274 DEV_KN01_CSR_LENGTH, dev_kn01_csr_access, k, DM_DEFAULT, NULL);
275 }
276

  ViewVC Help
Powered by ViewVC 1.1.26