Mercurial > repos > blastem
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) |