# HG changeset patch # User Michael Pavone # Date 1672693729 28800 # Node ID 5a21bc0ec5839abbe0672f1b4020dc76b001c92b # Parent 9e578fd493e1a165bbd5e0de423d002b6eb8f8f4 Implement turbo/slo mo for Sega CD diff -r 9e578fd493e1 -r 5a21bc0ec583 cdd_fader.c --- a/cdd_fader.c Mon Jan 02 12:24:22 2023 -0800 +++ b/cdd_fader.c Mon Jan 02 13:08:49 2023 -0800 @@ -1,9 +1,10 @@ #include "cdd_fader.h" #include +#define CDDA_MCLKS 16934400 void cdd_fader_init(cdd_fader *fader) { - fader->audio = render_audio_source("CDDA", 16934400, 384, 2); + fader->audio = render_audio_source("CDDA", CDDA_MCLKS, 384, 2); fader->cur_attenuation = 0x4000; fader->dst_attenuation = 0x4000; fader->attenuation_step = 0; @@ -14,6 +15,12 @@ render_free_source(fader->audio); } +void cdd_fader_set_speed_percent(cdd_fader *fader, uint32_t percent) +{ + uint32_t new_clock = ((uint64_t)CDDA_MCLKS * (uint64_t)percent) / 100; + render_audio_adjust_clock(fader->audio, new_clock, 384); +} + void cdd_fader_attenuation_write(cdd_fader *fader, uint16_t attenuation) { fader->dst_attenuation = attenuation & 0xFFF0; diff -r 9e578fd493e1 -r 5a21bc0ec583 cdd_fader.h --- a/cdd_fader.h Mon Jan 02 12:24:22 2023 -0800 +++ b/cdd_fader.h Mon Jan 02 13:08:49 2023 -0800 @@ -15,6 +15,7 @@ void cdd_fader_init(cdd_fader *fader); void cdd_fader_deinit(cdd_fader *fader); +void cdd_fader_set_speed_percent(cdd_fader *fader, uint32_t percent); void cdd_fader_attenuation_write(cdd_fader *fader, uint16_t attenuation); void cdd_fader_data(cdd_fader *fader, uint8_t byte); void cdd_fader_pause(cdd_fader *fader); diff -r 9e578fd493e1 -r 5a21bc0ec583 genesis.c --- a/genesis.c Mon Jan 02 12:24:22 2023 -0800 +++ b/genesis.c Mon Jan 02 13:08:49 2023 -0800 @@ -1356,6 +1356,10 @@ while (context->ym->current_cycle != context->psg->cycles) { sync_sound(context, context->psg->cycles + MCLKS_PER_PSG); } + if (context->expansion) { + segacd_context *cd = context->expansion; + segacd_set_speed_percent(cd, percent); + } ym_adjust_master_clock(context->ym, context->master_clock); psg_adjust_master_clock(context->psg, context->master_clock); } diff -r 9e578fd493e1 -r 5a21bc0ec583 rf5c164.c --- a/rf5c164.c Mon Jan 02 12:24:22 2023 -0800 +++ b/rf5c164.c Mon Jan 02 13:08:49 2023 -0800 @@ -33,6 +33,11 @@ render_free_source(pcm->audio); } +void rf5c164_adjust_master_clock(rf5c164* pcm, uint32_t mclks) +{ + render_audio_adjust_clock(pcm->audio, mclks, pcm->clock_step * 96); +} + //48 cycles per channel //1 external write per 16 cycles //3 external writes per channel/sample diff -r 9e578fd493e1 -r 5a21bc0ec583 rf5c164.h --- a/rf5c164.h Mon Jan 02 12:24:22 2023 -0800 +++ b/rf5c164.h Mon Jan 02 13:08:49 2023 -0800 @@ -34,6 +34,7 @@ void rf5c164_init(rf5c164* pcm, uint32_t mclks, uint32_t divider); void rf5c164_deinit(rf5c164* pcm); +void rf5c164_adjust_master_clock(rf5c164* pcm, uint32_t mclks); void rf5c164_run(rf5c164* pcm, uint32_t cycle); void rf5c164_write(rf5c164* pcm, uint16_t address, uint8_t value); uint8_t rf5c164_read(rf5c164* pcm, uint16_t address); diff -r 9e578fd493e1 -r 5a21bc0ec583 segacd.c --- a/segacd.c Mon Jan 02 12:24:22 2023 -0800 +++ b/segacd.c Mon Jan 02 13:08:49 2023 -0800 @@ -1538,3 +1538,12 @@ *num_chunks = sizeof(main_cpu_map) / sizeof(*main_cpu_map); return main_cpu_map; } + +void segacd_set_speed_percent(segacd_context *cd, uint32_t percent) +{ + uint32_t scd_cycle = gen_cycle_to_scd(cd->genesis->ym->current_cycle, cd->genesis); + scd_run(cd, scd_cycle); + uint32_t new_clock = ((uint64_t)SCD_MCLKS * (uint64_t)percent) / 100; + rf5c164_adjust_master_clock(&cd->pcm, new_clock); + cdd_fader_set_speed_percent(&cd->fader, percent); +} diff -r 9e578fd493e1 -r 5a21bc0ec583 segacd.h --- a/segacd.h Mon Jan 02 12:24:22 2023 -0800 +++ b/segacd.h Mon Jan 02 13:08:49 2023 -0800 @@ -59,5 +59,6 @@ void scd_run(segacd_context *cd, uint32_t cycle); void scd_adjust_cycle(segacd_context *cd, uint32_t deduction); void scd_toggle_graphics_debug(segacd_context *cd); +void segacd_set_speed_percent(segacd_context *cd, uint32_t percent); #endif //SEGACD_H_