comparison segacd.c @ 2055:c4d066d798c4 segacd

Fix prog RAM banking and Genesis to SCD cycle conversion. Arkagis Escape demo now works
author Michael Pavone <pavone@retrodev.com>
date Tue, 18 Jan 2022 23:54:02 -0800
parents 8ee7ecbf3f21
children 27bbfcb7850a
comparison
equal deleted inserted replaced
2054:8ee7ecbf3f21 2055:c4d066d798c4
298 m68k->mem_pointers[1] = (value & BIT_RET) ? cd->word_ram : cd->word_ram + 0x10000; 298 m68k->mem_pointers[1] = (value & BIT_RET) ? cd->word_ram : cd->word_ram + 0x10000;
299 } else { 299 } else {
300 //switch to 2M mode 300 //switch to 2M mode
301 if (value & BIT_RET) { 301 if (value & BIT_RET) {
302 //Main CPU will have word ram 302 //Main CPU will have word ram
303 genesis_context *gen = cd->genesis;
304 gen->m68k->mem_pointers[cd->memptr_start_index + 1] = cd->word_ram; 303 gen->m68k->mem_pointers[cd->memptr_start_index + 1] = cd->word_ram;
305 gen->m68k->mem_pointers[cd->memptr_start_index + 2] = cd->word_ram + 0x10000; 304 gen->m68k->mem_pointers[cd->memptr_start_index + 2] = cd->word_ram + 0x10000;
306 m68k->mem_pointers[0] = NULL; 305 m68k->mem_pointers[0] = NULL;
307 m68k->mem_pointers[1] = NULL; 306 m68k->mem_pointers[1] = NULL;
308 } else { 307 } else {
423 scd_peripherals_run(cd, cycle); 422 scd_peripherals_run(cd, cycle);
424 } 423 }
425 424
426 uint32_t gen_cycle_to_scd(uint32_t cycle, genesis_context *gen) 425 uint32_t gen_cycle_to_scd(uint32_t cycle, genesis_context *gen)
427 { 426 {
428 return ((uint64_t)cycle) * ((uint64_t)gen->normal_clock) / ((uint64_t)SCD_MCLKS); 427 return ((uint64_t)cycle) * ((uint64_t)SCD_MCLKS) / ((uint64_t)gen->normal_clock);
429 } 428 }
430 429
431 void scd_adjust_cycle(segacd_context *cd, uint32_t deduction) 430 void scd_adjust_cycle(segacd_context *cd, uint32_t deduction)
432 { 431 {
433 deduction = gen_cycle_to_scd(deduction, cd->genesis); 432 deduction = gen_cycle_to_scd(deduction, cd->genesis);
550 m68k_invalidate_code_range(cd->m68k, 0x080000, 0x0C0000); 549 m68k_invalidate_code_range(cd->m68k, 0x080000, 0x0C0000);
551 } 550 }
552 } 551 }
553 if (changed & MASK_PROG_BANK) { 552 if (changed & MASK_PROG_BANK) {
554 uint32_t bank = cd->gate_array[GA_MEM_MODE] >> 6 & 0x3; 553 uint32_t bank = cd->gate_array[GA_MEM_MODE] >> 6 & 0x3;
555 m68k->mem_pointers[cd->memptr_start_index] = cd->word_ram + bank * 0x10000; 554 m68k->mem_pointers[cd->memptr_start_index] = cd->prog_ram + bank * 0x10000;
556 m68k_invalidate_code_range(m68k, cd->base + 0x220000, cd->base + 0x240000); 555 m68k_invalidate_code_range(m68k, cd->base + 0x220000, cd->base + 0x240000);
557 } 556 }
558 break; 557 break;
559 } 558 }
560 case GA_HINT_VECTOR: 559 case GA_HINT_VECTOR: