Mercurial > repos > blastem
comparison jaguar.c @ 1083:f6e998227300
Byteswap ROMs in jaguar ROM loader. Handle switching memory map from writes to memcon1. Fix some typos in error messages
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 06 Oct 2016 09:35:35 -0700 |
parents | 382614130914 |
children | bc86eaf6699d |
comparison
equal
deleted
inserted
replaced
1082:2ec5e6eaf81d | 1083:f6e998227300 |
---|---|
3 #include <stddef.h> | 3 #include <stddef.h> |
4 #include <stdlib.h> | 4 #include <stdlib.h> |
5 #include "m68k_core.h" | 5 #include "m68k_core.h" |
6 #include "jaguar.h" | 6 #include "jaguar.h" |
7 #include "util.h" | 7 #include "util.h" |
8 #include "debug.h" | |
8 | 9 |
9 //BIOS Area Memory map | 10 //BIOS Area Memory map |
10 // 10 00 00 - 10 04 00 : Video mode/ Memory control registers | 11 // 10 00 00 - 10 04 00 : Video mode/ Memory control registers |
11 // 10 04 00 - 10 08 00 : CLUT | 12 // 10 04 00 - 10 08 00 : CLUT |
12 // 10 08 00 - 10 10 00 : Line buffer A | 13 // 10 08 00 - 10 10 00 : Line buffer A |
34 } | 35 } |
35 if (address < 0x103000) { | 36 if (address < 0x103000) { |
36 if (address < 0x101000) { | 37 if (address < 0x101000) { |
37 if (address < 0x100400) { | 38 if (address < 0x100400) { |
38 //Video mode / Memory control registers | 39 //Video mode / Memory control registers |
39 fprintf(stderr, "Unhanelde write to video mode/memory control registers - %X:%X", address, value); | 40 switch(address & 0x3FE) |
41 { | |
42 case 0: | |
43 if (((value ^ system->memcon1) & 1) || !system->memcon_written) { | |
44 uint16_t **mem_pointers = system->m68k->mem_pointers; | |
45 int rom = value & 1 ? 4 : 1; | |
46 int ram0 = value & 1 ? 0 : 6; | |
47 int ram1 = value & 1 ? 2 : 4; | |
48 mem_pointers[ram0] = mem_pointers[ram0 + 1] = system->dram; | |
49 //these are probably open bus, but mirror DRAM for now | |
50 mem_pointers[ram1] = mem_pointers[ram1 + 1] = system->dram; | |
51 | |
52 mem_pointers[rom] = system->cart; | |
53 mem_pointers[rom + 1] = system->cart + ((0x200000 & (system->cart_size-1)) >> 1); | |
54 mem_pointers[rom + 2] = system->cart + ((0x400000 & (system->cart_size-1)) >> 1); | |
55 system->memcon_written = 1; | |
56 //TODO: invalidate code cache | |
57 } | |
58 system->memcon1 = value; | |
59 break; | |
60 case 2: | |
61 system->memcon2 = value; | |
62 break; | |
63 default: | |
64 fprintf(stderr, "Unhandled write to video mode/memory control registers - %X:%X\n", address, value); | |
65 break; | |
66 } | |
40 } else if (address < 0x100800) { | 67 } else if (address < 0x100800) { |
41 //CLUT | 68 //CLUT |
42 address = address >> 1 & 255; | 69 address = address >> 1 & 255; |
43 system->clut[address] = value; | 70 system->clut[address] = value; |
44 } else { | 71 } else { |
76 value32 = value32 << 16; | 103 value32 = value32 << 16; |
77 } | 104 } |
78 system->gpu_local[offset] |= value32; | 105 system->gpu_local[offset] |= value32; |
79 } else if (address < 0x114000) { | 106 } else if (address < 0x114000) { |
80 //timer clock registers | 107 //timer clock registers |
81 fprintf(stderr, "Unhanelde write to timer/clock registers - %X:%X", address, value); | 108 fprintf(stderr, "Unhandled write to timer/clock registers - %X:%X\n", address, value); |
82 } else { | 109 } else { |
83 //joystick interface | 110 //joystick interface |
84 fprintf(stderr, "Unhanelde write to joystick interface - %X:%X", address, value); | 111 fprintf(stderr, "Unhandled write to joystick interface - %X:%X\n", address, value); |
85 } | 112 } |
86 } else if (address < 0x11B000) { | 113 } else if (address < 0x11B000) { |
87 //DSP/DAC/I2S Registers | 114 //DSP/DAC/I2S Registers |
88 fprintf(stderr, "Unhanelde write to DSP/DAC/I2S registers - %X:%X", address, value); | 115 fprintf(stderr, "Unhandled write to DSP/DAC/I2S registers - %X:%X\n", address, value); |
89 } else if (address < 0x11D000) { | 116 } else if (address < 0x11D000) { |
90 //DSP local RAM | 117 //DSP local RAM |
91 uint32_t offset = address >> 2 & (DSP_RAM_BYTES / sizeof(uint32_t) - 1); | 118 uint32_t offset = address >> 2 & (DSP_RAM_BYTES / sizeof(uint32_t) - 1); |
92 uint32_t value32 = value; | 119 uint32_t value32 = value; |
93 if (address & 2) { | 120 if (address & 2) { |
112 } | 139 } |
113 if (address < 0x103000) { | 140 if (address < 0x103000) { |
114 if (address < 0x101000) { | 141 if (address < 0x101000) { |
115 if (address < 0x100400) { | 142 if (address < 0x100400) { |
116 //Video mode / Memory control registers | 143 //Video mode / Memory control registers |
117 fprintf(stderr, "Unhandled read from video mode/memory control registers - %X", address); | 144 fprintf(stderr, "Unhandled read from video mode/memory control registers - %X\n", address); |
118 } else if (address < 0x100800) { | 145 } else if (address < 0x100800) { |
119 //CLUT | 146 //CLUT |
120 address = address >> 1 & 255; | 147 address = address >> 1 & 255; |
121 return system->clut[address]; | 148 return system->clut[address]; |
122 } else { | 149 } else { |
151 } else { | 178 } else { |
152 return system->gpu_local[offset] >> 16; | 179 return system->gpu_local[offset] >> 16; |
153 } | 180 } |
154 } else if (address < 0x114000) { | 181 } else if (address < 0x114000) { |
155 //timer clock registers | 182 //timer clock registers |
156 fprintf(stderr, "Unhandled read from timer/clock registers - %X", address); | 183 fprintf(stderr, "Unhandled read from timer/clock registers - %X\n", address); |
157 } else { | 184 } else { |
158 //joystick interface | 185 //joystick interface |
159 fprintf(stderr, "Unhandled read from joystick interface - %X", address); | 186 fprintf(stderr, "Unhandled read from joystick interface - %X\n", address); |
160 } | 187 } |
161 } else if (address < 0x11B000) { | 188 } else if (address < 0x11B000) { |
162 //DSP/DAC/I2S Registers | 189 //DSP/DAC/I2S Registers |
163 fprintf(stderr, "Unhandled read from DSP/DAC/I2S registers - %X", address); | 190 fprintf(stderr, "Unhandled read from DSP/DAC/I2S registers - %X\n", address); |
164 } else if (address < 0x11D000) { | 191 } else if (address < 0x11D000) { |
165 //DSP local RAM | 192 //DSP local RAM |
166 uint32_t offset = address >> 2 & (DSP_RAM_BYTES / sizeof(uint32_t) - 1); | 193 uint32_t offset = address >> 2 & (DSP_RAM_BYTES / sizeof(uint32_t) - 1); |
167 if (address & 2) { | 194 if (address & 2) { |
168 return system->dsp_local[offset]; | 195 return system->dsp_local[offset]; |
212 context->current_cycle -= 0x10000000; | 239 context->current_cycle -= 0x10000000; |
213 } | 240 } |
214 return context; | 241 return context; |
215 } | 242 } |
216 | 243 |
244 m68k_context *handle_m68k_reset(m68k_context *context) | |
245 { | |
246 puts("M68K executed RESET"); | |
247 return context; | |
248 } | |
249 | |
217 jaguar_context *init_jaguar(uint16_t *bios, uint32_t bios_size, uint16_t *cart, uint32_t cart_size) | 250 jaguar_context *init_jaguar(uint16_t *bios, uint32_t bios_size, uint16_t *cart, uint32_t cart_size) |
218 { | 251 { |
219 jaguar_context *system = calloc(1, sizeof(jaguar_context)); | 252 jaguar_context *system = calloc(1, sizeof(jaguar_context)); |
220 system->bios = bios; | 253 system->bios = bios; |
221 system->bios_size = bios_size; | 254 system->bios_size = bios_size; |
222 system->cart = cart; | 255 system->cart = cart; |
223 system->cart_size = cart_size; | 256 system->cart_size = cart_size; |
224 | 257 |
225 memmap_chunk jag_m68k_map[8]; | 258 memmap_chunk *jag_m68k_map = calloc(8, sizeof(memmap_chunk)); |
226 for (uint32_t start = 0, index=0; index < 8; index++, start += 0x200000) | 259 for (uint32_t start = 0, index=0; index < 8; index++, start += 0x200000) |
227 { | 260 { |
228 jag_m68k_map[index].start = start; | 261 jag_m68k_map[index].start = start; |
229 jag_m68k_map[index].end = start + 0x200000; | 262 jag_m68k_map[index].end = start + 0x200000; |
230 jag_m68k_map[index].mask = index ? 0x1FFFFF : 0xFFFFFF; | 263 jag_m68k_map[index].mask = index ? 0x1FFFFF : 0xFFFFFF; |
231 jag_m68k_map[index].aux_mask = bios_size - 1; | 264 jag_m68k_map[index].aux_mask = bios_size - 1; |
232 jag_m68k_map[index].ptr_index = index; | 265 jag_m68k_map[index].ptr_index = index; |
233 jag_m68k_map[index].flags = MMAP_READ | MMAP_WRITE | MMAP_PTR_IDX | MMAP_FUNC_NULL | MMAP_AUX_BUFF; | 266 jag_m68k_map[index].flags = MMAP_READ | MMAP_WRITE | MMAP_PTR_IDX | MMAP_FUNC_NULL | MMAP_AUX_BUFF | MMAP_CODE; |
234 jag_m68k_map[index].buffer = bios; | 267 jag_m68k_map[index].buffer = bios; |
235 jag_m68k_map[index].read_16 = rom0_read_m68k; | 268 jag_m68k_map[index].read_16 = rom0_read_m68k; |
236 jag_m68k_map[index].read_8 = rom0_read_m68k_b; | 269 jag_m68k_map[index].read_8 = rom0_read_m68k_b; |
237 jag_m68k_map[index].write_16 = rom0_write_m68k; | 270 jag_m68k_map[index].write_16 = rom0_write_m68k; |
238 jag_m68k_map[index].write_8 = rom0_write_m68k_b; | 271 jag_m68k_map[index].write_8 = rom0_write_m68k_b; |
239 } | 272 } |
240 m68k_options *opts = malloc(sizeof(m68k_options)); | 273 m68k_options *opts = malloc(sizeof(m68k_options)); |
241 init_m68k_opts(opts, jag_m68k_map, 8, 2); | 274 init_m68k_opts(opts, jag_m68k_map, 8, 2); |
242 system->m68k = init_68k_context(opts); | 275 system->m68k = init_68k_context(opts, handle_m68k_reset); |
243 system->m68k->system = system; | 276 system->m68k->system = system; |
244 return system; | 277 return system; |
245 } | 278 } |
246 | 279 |
247 //modified copy of the version in blastem.c | 280 //modified copy of the version in blastem.c |
258 *size = nearest_pow2(filesize); | 291 *size = nearest_pow2(filesize); |
259 uint16_t *cart = malloc(*size); | 292 uint16_t *cart = malloc(*size); |
260 if (filesize != fread(cart, 1, filesize, f)) { | 293 if (filesize != fread(cart, 1, filesize, f)) { |
261 fatal_error("Error reading from %s\n", filename); | 294 fatal_error("Error reading from %s\n", filename); |
262 } | 295 } |
296 filesize = (filesize + 1) & ~1L; | |
297 for (long i = 0; i < filesize; i+=2) | |
298 { | |
299 long index = i >> 1; | |
300 cart[index] = cart[index] >> 8 | cart[index] << 8; | |
301 } | |
263 while (filesize < *size) | 302 while (filesize < *size) |
264 { | 303 { |
265 cart[filesize / 2] = 0xFFFF; | 304 cart[filesize / 2] = 0xFFFF; |
266 filesize += 2; | 305 filesize += 2; |
267 } | 306 } |