/[gxemul]/upstream/0.4.3/src/promemul/dreamcast.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.3/src/promemul/dreamcast.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 33 - (show annotations)
Mon Oct 8 16:21:06 2007 UTC (16 years, 7 months ago) by dpavlin
File MIME type: text/plain
File size: 6354 byte(s)
0.4.3
1 /*
2 * Copyright (C) 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: dreamcast.c,v 1.12 2006/11/02 06:47:14 debug Exp $
29 *
30 * Dreamcast PROM emulation.
31 *
32 * NOTE: This is basically just a dummy module, for now.
33 *
34 * See http://mc.pp.se/dc/syscalls.html for a description of what the
35 * PROM syscalls do. (The symbolic names in this module are the same as on
36 * that page.)
37 */
38
39 #include <stdio.h>
40 #include <stdlib.h>
41 #include <string.h>
42 #include <sys/types.h>
43
44 #include "cpu.h"
45 #include "machine.h"
46 #include "memory.h"
47 #include "misc.h"
48
49 #ifdef ENABLE_SH
50
51
52 /* The ROM FONT seems to be located just after 1MB, in a real Dreamcast: */
53 #define DREAMCAST_ROMFONT_BASE 0x80100020
54
55
56 /*
57 * dreamcast_romfont_init()
58 *
59 * Initialize the ROM font.
60 */
61 static void dreamcast_romfont_init(struct machine *machine)
62 {
63 struct cpu *cpu = machine->cpus[0];
64 int i, y, v;
65 uint64_t d = DREAMCAST_ROMFONT_BASE;
66
67 /* TODO: A real font. */
68
69 /* 288 narrow glyphs (12 x 24 pixels): */
70 for (i=0; i<288; i++) {
71 for (y=0; y<24; y+=2) {
72 if (y <= 1 || y >= 22)
73 v = 0;
74 else
75 v = random();
76 store_byte(cpu, d++, v & 0x3f);
77 store_byte(cpu, d++, v & 0xc3);
78 store_byte(cpu, d++, v & 0xfc);
79 }
80 }
81
82 /* 7078 wide glyphs (24 x 24 pixels): */
83 for (i=0; i<7078; i++) {
84 for (y=0; y<24; y++) {
85 if (y <= 1 || y >= 22)
86 v = 0;
87 else
88 v = random();
89 store_byte(cpu, d++, v & 0x3f);
90 store_byte(cpu, d++, v);
91 store_byte(cpu, d++, v & 0xfc);
92 }
93 }
94
95 /* 129 VME icons (32 x 32 pixels): */
96 for (i=0; i<129; i++) {
97 for (y=0; y<32; y++) {
98 if (y <= 1 || y >= 30)
99 v = 0;
100 else
101 v = random();
102 store_byte(cpu, d++, v & 0x3f);
103 store_byte(cpu, d++, v);
104 store_byte(cpu, d++, v);
105 store_byte(cpu, d++, v & 0xfc);
106 }
107 }
108 }
109
110
111 /*
112 * dreamcast_machine_setup():
113 *
114 * Initializes pointers to Dreamcast PROM syscalls.
115 */
116 void dreamcast_machine_setup(struct machine *machine)
117 {
118 int i;
119 struct cpu *cpu = machine->cpus[0];
120
121 for (i=0xb0; i<=0xfc; i+=sizeof(uint32_t)) {
122 /* Store pointer to PROM routine... */
123 store_32bit_word(cpu, 0x8c000000 + i, 0x8c000100 + i);
124
125 /* ... which contains only 1 instruction, a special
126 0x00ff opcode which triggers PROM emulation: */
127 store_16bit_word(cpu, 0x8c000100 + i, 0x00ff);
128 }
129
130 /* PROM reboot, in case someone jumps to 0xa0000000: */
131 store_16bit_word(cpu, 0xa0000000, 0x00ff);
132
133 dreamcast_romfont_init(machine);
134 }
135
136
137 /*
138 * dreamcast_emul():
139 */
140 int dreamcast_emul(struct cpu *cpu)
141 {
142 int addr = cpu->pc & 0xff;
143 int r1 = cpu->cd.sh.r[1];
144 int r6 = cpu->cd.sh.r[6];
145 int r7 = cpu->cd.sh.r[7];
146
147 switch (addr) {
148
149 case 0x00:
150 /* Special case: Reboot */
151 fatal("[ dreamcast reboot ]\n");
152 cpu->running = 0;
153 break;
154
155 case 0xb0:
156 /* SYSINFO */
157 switch (r7) {
158 default:fatal("[ SYSINFO: Unimplemented r7=%i ]\n", r7);
159 goto bad;
160 }
161 break;
162
163 case 0xb4:
164 /* ROMFONT */
165 switch (r1) {
166 case 0: /* ROMFONT_ADDRESS */
167 cpu->cd.sh.r[0] = DREAMCAST_ROMFONT_BASE;
168 break;
169 default:fatal("[ ROMFONT: Unimplemented r1=%i ]\n", r1);
170 goto bad;
171 }
172 break;
173
174 case 0xb8:
175 /* FLASHROM */
176 switch (r7) {
177 case 0: /* FLASHROM_INFO */
178 /* TODO */
179 cpu->cd.sh.r[0] = (uint32_t) -1;
180 break;
181 default:fatal("[ FLASHROM: Unimplemented r7=%i ]\n", r7);
182 goto bad;
183 }
184 break;
185
186 case 0xbc:
187 switch ((int32_t)r6) {
188 case 0: /* GD-ROM emulation */
189 switch (r7) {
190 case 0: /* GDROM_SEND_COMMAND */
191 /* TODO */
192 cpu->cd.sh.r[0] = (uint32_t) -1;
193 break;
194 case 1: /* GDROM_CHECK_COMMAND */
195 /* TODO */
196 cpu->cd.sh.r[0] = 0;
197 break;
198 case 2: /* GDROM_MAINLOOP */
199 /* TODO */
200 break;
201 case 3: /* GDROM_INIT */
202 /* TODO: Do something here? */
203 break;
204 case 4: /* GDROM_CHECK_DRIVE */
205 /* TODO: Return status words */
206 break;
207 default:fatal("[ GDROM: Unimplemented r7=%i ]\n", r7);
208 goto bad;
209 }
210 break;
211 default:fatal("[ 0xbc: Unimplemented r6=0x%x ]\n", r6);
212 goto bad;
213 }
214 break;
215
216 case 0xe0:
217 /*
218 * This seems to have two uses:
219 *
220 * 1. KalistOS calls this from arch_menu(), i.e. to return
221 * from a running program.
222 * 2. The "licence code" in the IP.BIN code when booting from
223 * a bootable CD image calls this once the license screen
224 * has been displayed, and it wants the ROM to jump to
225 * 0x8c00b800 ("Bootstrap 1").
226 *
227 * The easiest way to support both is probably to keep track
228 * of whether the IP.BIN code was started by the (software)
229 * ROM emulation code, or not.
230 *
231 * TODO
232 */
233 fatal("[ Boot menu? TODO ]\n");
234 goto bad;
235
236 default:goto bad;
237 }
238
239 /* Return from subroutine: */
240 cpu->pc = cpu->cd.sh.pr;
241
242 return 1;
243
244 bad:
245 cpu_register_dump(cpu->machine, cpu, 1, 0);
246 printf("\n");
247 fatal("[ dreamcast_emul(): unimplemented dreamcast PROM call ]\n");
248 cpu->running = 0;
249 return 1;
250 }
251
252
253 #endif /* ENABLE_SH */

  ViewVC Help
Powered by ViewVC 1.1.26