comparison jaguar.c @ 1090:a68274a25e2f

Initial stab at implementing the Jaguar object processor
author Michael Pavone <pavone@retrodev.com>
date Sun, 16 Oct 2016 18:25:18 -0700
parents 87597a048d38
children f338c950fcef
comparison
equal deleted inserted replaced
1089:87597a048d38 1090:a68274a25e2f
87 mem_pointers[rom] = system->cart; 87 mem_pointers[rom] = system->cart;
88 mem_pointers[rom + 1] = system->cart + ((0x200000 & (system->cart_size-1)) >> 1); 88 mem_pointers[rom + 1] = system->cart + ((0x200000 & (system->cart_size-1)) >> 1);
89 mem_pointers[rom + 2] = system->cart + ((0x400000 & (system->cart_size-1)) >> 1); 89 mem_pointers[rom + 2] = system->cart + ((0x400000 & (system->cart_size-1)) >> 1);
90 system->memcon_written = 1; 90 system->memcon_written = 1;
91 printf("MEMCON1 write - ROMHI: %d\n", value & 1); 91 printf("MEMCON1 write - ROMHI: %d\n", value & 1);
92 switch (system->memcon1 >> 3 & 3)
93 {
94 case 0:
95 system->rom_cycles = 10;
96 break;
97 case 1:
98 system->rom_cycles = 8;
99 break;
100 case 2:
101 system->rom_cycles = 6;
102 break;
103 case 3:
104 system->rom_cycles = 5;
105 break;
106 }
92 //TODO: invalidate code cache 107 //TODO: invalidate code cache
93 } 108 }
94 system->memcon1 = value; 109 system->memcon1 = value;
95 break; 110 break;
96 case 2: 111 case 2:
237 fprintf(stderr, "Unhandled read from wave table ROM - %X\n", address); 252 fprintf(stderr, "Unhandled read from wave table ROM - %X\n", address);
238 } 253 }
239 return 0xFFFF; 254 return 0xFFFF;
240 } 255 }
241 256
257 uint64_t rom0_read_64(uint32_t address, jaguar_context *system)
258 {
259 address &= 0x1FFFFF;
260 uint64_t high = rom0_read_16(address, system);
261 uint64_t highmid = rom0_read_16(address+2, system);
262 uint64_t lowmid = rom0_read_16(address+4, system);
263 uint64_t low = rom0_read_16(address+6, system);
264 return high << 48 | highmid << 32 | lowmid << 16 | low;
265 }
266
267 void rom0_write_64(uint32_t address, jaguar_context *system, uint64_t val)
268 {
269 address &= 0x1FFFFF;
270 rom0_write_16(address, system, val >> 48);
271 rom0_write_16(address+2, system, val >> 32);
272 rom0_write_16(address+4, system, val >> 16);
273 rom0_write_16(address+6, system, val);
274 }
275
276 uint64_t jag_read_phrase(jaguar_context *system, uint32_t address, uint32_t *cycles)
277 {
278 if (!system->memcon_written) {
279 //unsure of timing, but presumably at least 2 32-bit reads
280 //which presumably take a minimum of 1 cycle
281 //reality probably depends on the exact area read
282 //docs seem to imply some areas only 16-bits wide whereas others are 32-bit
283 *cycles += 2;
284 return rom0_read_64(address, system);
285 }
286 uint16_t *src;
287 if (system->memcon1 & 1) {
288 if (address < 0x800000) {
289 src = system->dram + (address >> 1 & (DRAM_WORDS - 1));
290 //DRAM is 64-bits wide, but sounds like an access is still at least two cycles
291 *cycles += 2;
292 } else if (address < 0xE00000) {
293 //cart is slow and only 32-bits wide
294 *cycles += 2 * (system->rom_cycles);
295 src = system->cart + (address >> 1 & (system->cart_size - 1));
296 } else {
297 *cycles += 2;
298 return rom0_read_64(address, system);
299 }
300 } else if (address > 0x800000) {
301 src = system->dram + (address >> 1 & (DRAM_WORDS - 1));
302 //DRAM is 64-bits wide, but sounds like an access is still at least two cycles
303 *cycles += 2;
304 } else if (address > 0x200000) {
305 //cart is slow and only 32-bits wide
306 *cycles += 2 * (system->rom_cycles);
307 src = system->cart + (address >> 1 & (system->cart_size - 1));
308 } else {
309 *cycles += 2;
310 return rom0_read_64(address, system);
311 }
312 uint64_t high = src[0];
313 uint64_t highmid = src[1];
314 uint64_t lowmid = src[2];
315 uint64_t low = src[3];
316 return high << 48 | highmid << 32 | lowmid << 16 | low;
317 }
318
319 uint32_t jag_write_phrase(jaguar_context *system, uint32_t address, uint64_t val)
320 {
321 if (!system->memcon_written) {
322 //unsure of timing, but presumably at least 2 32-bit reads
323 //which presumably take a minimum of 1 cycle
324 //reality probably depends on the exact area read
325 //docs seem to imply some areas only 16-bits wide whereas others are 32-bit
326 rom0_write_64(address, system, val);
327 return 2;
328 }
329 uint16_t *dst;
330 uint32_t cycles;
331 if (system->memcon1 & 1) {
332 if (address < 0x800000) {
333 dst = system->dram + (address >> 1 & (DRAM_WORDS - 1));
334 //DRAM is 64-bits wide, but sounds like an access is still at least two cycles
335 cycles = 2;
336 } else if (address < 0xE00000) {
337 dst = system->cart + (address >> 1 & (system->cart_size - 1));
338 //cart is slow and only 32-bits wide
339 cycles = 2 * (system->rom_cycles);
340 } else {
341 rom0_write_64(address, system, val);
342 return 2;
343 }
344 } else if (address > 0x800000) {
345 dst = system->dram + (address >> 1 & (DRAM_WORDS - 1));
346 //DRAM is 64-bits wide, but sounds like an access is still at least two cycles
347 cycles = 2;
348 } else if (address > 0x200000) {
349 dst = system->cart + (address >> 1 & (system->cart_size - 1));
350 //cart is slow and only 32-bits wide
351 cycles = 2 * (system->rom_cycles);
352 } else {
353 rom0_write_64(address, system, val);
354 return 2;
355 }
356 dst[0] = val >> 48;
357 dst[1] = val >> 32;
358 dst[2] = val >> 16;
359 dst[3] = val;
360 return cycles;
361 }
362
242 m68k_context * sync_components(m68k_context * context, uint32_t address) 363 m68k_context * sync_components(m68k_context * context, uint32_t address)
243 { 364 {
244 jaguar_context *system = context->system; 365 jaguar_context *system = context->system;
245 jag_video_run(system->video, context->current_cycle); 366 jag_video_run(system->video, context->current_cycle);
246 if (context->current_cycle > 0x10000000) { 367 if (context->current_cycle > 0x10000000) {
316 m68k_options *opts = malloc(sizeof(m68k_options)); 437 m68k_options *opts = malloc(sizeof(m68k_options));
317 init_m68k_opts(opts, jag_m68k_map, 8, 2); 438 init_m68k_opts(opts, jag_m68k_map, 8, 2);
318 system->m68k = init_68k_context(opts, handle_m68k_reset); 439 system->m68k = init_68k_context(opts, handle_m68k_reset);
319 system->m68k->system = system; 440 system->m68k->system = system;
320 system->video = jag_video_init(); 441 system->video = jag_video_init();
442 system->video->system = system;
321 return system; 443 return system;
322 } 444 }
323 445
324 //modified copy of the version in blastem.c 446 //modified copy of the version in blastem.c
325 uint16_t *load_rom(char * filename, uint32_t *size) 447 uint16_t *load_rom(char * filename, uint32_t *size)