# HG changeset patch # User Michael Pavone # Date 1713123032 25200 # Node ID e8eba0cd5444d5e9c3a49f0f4c9869593786c3c2 # Parent 59a2996106624bf3c87144e0295248edd05e1c3a Implement turbo/slow for Pico and Copera diff -r 59a299610662 -r e8eba0cd5444 genesis.c --- a/genesis.c Sun Apr 14 11:46:34 2024 -0700 +++ b/genesis.c Sun Apr 14 12:30:32 2024 -0700 @@ -1876,14 +1876,24 @@ genesis_context *context = (genesis_context *)system; uint32_t old_clock = context->master_clock; context->master_clock = ((uint64_t)context->normal_clock * (uint64_t)percent) / 100; - while (context->ym->current_cycle != context->psg->cycles) { - sync_sound(context, context->psg->cycles + MCLKS_PER_PSG); + if (context->header.type != SYSTEM_PICO && context->header.type != SYSTEM_COPERA) { + 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); + } else { + while (context->adpcm->cycle != context->psg->cycles) { + sync_sound_pico(context, context->psg->cycles + MCLKS_PER_PSG); + } + if (context->ymz) { + ymz263b_adjust_master_clock(context->ymz, context->master_clock); + } + pico_pcm_adjust_master_clock(context->adpcm, context->master_clock); } - 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); } @@ -2211,7 +2221,7 @@ pico_pcm_free(gen->adpcm); free(gen->adpcm); if (gen->ymz) { - //TODO: call cleanup function once it exists + ymz263b_free(gen->ymz); free(gen->ymz); } } else { diff -r 59a299610662 -r e8eba0cd5444 pico_pcm.c --- a/pico_pcm.c Sun Apr 14 11:46:34 2024 -0700 +++ b/pico_pcm.c Sun Apr 14 12:30:32 2024 -0700 @@ -23,10 +23,10 @@ void pico_pcm_init(pico_pcm *pcm, uint32_t master_clock, uint32_t divider) { - pcm->audio = render_audio_source("PICO ADPCM", master_clock, divider * 4, 1); + pcm->clock_inc = divider * 4; + pcm->audio = render_audio_source("PICO ADPCM", master_clock, pcm->clock_inc, 1); pcm->scope = NULL; pcm->scope_channel = 0; - pcm->clock_inc = divider * 4; pico_pcm_reset(pcm); } @@ -35,6 +35,11 @@ render_free_source(pcm->audio); } +void pico_pcm_adjust_master_clock(pico_pcm *pcm, uint32_t master_clock) +{ + render_audio_adjust_clock(pcm->audio, master_clock, pcm->clock_inc); +} + void pico_pcm_enable_scope(pico_pcm *pcm, oscilloscope *scope, uint32_t master_clock) { #ifndef IS_LIB diff -r 59a299610662 -r e8eba0cd5444 pico_pcm.h --- a/pico_pcm.h Sun Apr 14 11:46:34 2024 -0700 +++ b/pico_pcm.h Sun Apr 14 12:30:32 2024 -0700 @@ -27,6 +27,7 @@ void pico_pcm_init(pico_pcm *pcm, uint32_t master_clock, uint32_t divider); void pico_pcm_free(pico_pcm *pcm); +void pico_pcm_adjust_master_clock(pico_pcm *pcm, uint32_t master_clock); void pico_pcm_enable_scope(pico_pcm *pcm, oscilloscope *scope, uint32_t master_clock); void pico_pcm_run(pico_pcm *pcm, uint32_t cycle); void pico_pcm_ctrl_write(pico_pcm *pcm, uint16_t value); diff -r 59a299610662 -r e8eba0cd5444 ymz263b.c --- a/ymz263b.c Sun Apr 14 11:46:34 2024 -0700 +++ b/ymz263b.c Sun Apr 14 12:30:32 2024 -0700 @@ -88,6 +88,16 @@ ymz->pcm_counter = PCM_BASE_DIVIDER; } +void ymz263b_free(ymz263b *ymz) +{ + render_free_source(ymz->audio); +} + +void ymz263b_adjust_master_clock(ymz263b *ymz, uint32_t master_clock) +{ + render_audio_adjust_clock(ymz->audio, master_clock, ymz->clock_inc * PCM_BASE_DIVIDER); +} + static uint8_t fifo_empty(ymz_midi_fifo *fifo) { return fifo->read == FIFO_EMPTY; diff -r 59a299610662 -r e8eba0cd5444 ymz263b.h --- a/ymz263b.h Sun Apr 14 11:46:34 2024 -0700 +++ b/ymz263b.h Sun Apr 14 12:30:32 2024 -0700 @@ -46,6 +46,8 @@ } ymz263b; void ymz263b_init(ymz263b *ymz, uint32_t master_clock, uint32_t clock_divider); +void ymz263b_free(ymz263b *ymz); +void ymz263b_adjust_master_clock(ymz263b *ymz, uint32_t master_clock); void ymz263b_run(ymz263b *ymz, uint32_t target_cycle); uint32_t ymz263b_next_int(ymz263b *ymz); void ymz263b_address_write(ymz263b *ymz, uint8_t value);