Mercurial > repos > blastem
changeset 2486:e8eba0cd5444
Implement turbo/slow for Pico and Copera
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 14 Apr 2024 12:30:32 -0700 |
parents | 59a299610662 |
children | 2ea2f3aa5aa8 |
files | genesis.c pico_pcm.c pico_pcm.h ymz263b.c ymz263b.h |
diffstat | 5 files changed, 38 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- 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 {
--- 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
--- 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);
--- 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;
--- 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);