changeset 2278:5a21bc0ec583

Implement turbo/slo mo for Sega CD
author Michael Pavone <pavone@retrodev.com>
date Mon, 02 Jan 2023 13:08:49 -0800
parents 9e578fd493e1
children 3b5fef896475
files cdd_fader.c cdd_fader.h genesis.c rf5c164.c rf5c164.h segacd.c segacd.h
diffstat 7 files changed, 29 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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 <stdio.h>
+#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;
--- 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);
--- 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);
 }
--- 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
--- 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);
--- 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);
+}
--- 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_