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