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);