changeset 2529:a6687a6fb69d

Merge
author Michael Pavone <pavone@retrodev.com>
date Mon, 25 Nov 2024 22:30:32 -0800
parents 90a40be940f7 (current diff) 7e1215d17571 (diff)
children 231305069cbb
files sms.c
diffstat 5 files changed, 44 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/controller_info.c	Mon Nov 25 22:26:45 2024 -0800
+++ b/controller_info.c	Mon Nov 25 22:30:32 2024 -0800
@@ -328,7 +328,7 @@
 const char *get_button_label(controller_info *info, int button)
 {
 #ifndef USE_FBDEV
-#if SDL_VERSION_ATLEAST(2,0,12)
+#if SDL_VERSION_ATLEAST(2,0,14)
 	if (info->subtype == SUBTYPE_XBOX_ELITE && button >= SDL_CONTROLLER_BUTTON_PADDLE1 && button <= SDL_CONTROLLER_BUTTON_PADDLE4) {
 		static char const * names[] = {"Paddle 1", "Paddle 2", "Paddle 3", "Paddle 4"};
 		return names[button - SDL_CONTROLLER_BUTTON_PADDLE1];
--- a/psg.c	Mon Nov 25 22:26:45 2024 -0800
+++ b/psg.c	Mon Nov 25 22:30:32 2024 -0800
@@ -198,6 +198,9 @@
 			vgm_sn76489_write(context->vgm, context->cycles, context->counter_load[chan] >> 4 & 0x3F);
 		}
 	}
+	if (context->pan != 0xFF) {
+		vgm_gg_pan_write(context->vgm, context->cycles, context->pan);
+	}
 }
 
 void psg_serialize(psg_context *context, serialize_buffer *buf)
--- a/sms.c	Mon Nov 25 22:26:45 2024 -0800
+++ b/sms.c	Mon Nov 25 22:30:32 2024 -0800
@@ -375,6 +375,9 @@
 	sms_context *sms = z80->system;
 	psg_run(sms->psg, z80->Z80_CYCLE);
 	sms->psg->pan = value;
+	if (sms->psg->vgm) {
+		vgm_gg_pan_write(sms->psg->vgm, sms->psg->cycles, sms->psg->pan);
+	}
 	return vcontext;
 }
 
@@ -717,6 +720,9 @@
 			vdp_adjust_cycles(sms->vdp, adjust);
 			sms->psg->cycles -= adjust;
 			sms->cassette_cycle -= adjust;
+			if (sms->psg->vgm) {
+				vgm_adjust_cycles(sms->psg->vgm, adjust);
+			}
 			target_cycle -= adjust;
 		}
 	}
@@ -1011,6 +1017,30 @@
 	sms->cassette = media;
 }
 
+static void start_vgm_log(system_header *system, char *filename)
+{
+	sms_context *sms = (sms_context *)system;
+	//TODO: 50 Hz support
+	vgm_writer *vgm = vgm_write_open(filename, 60, sms->normal_clock, sms->z80->Z80_CYCLE);
+	if (vgm) {
+		printf("Started logging VGM to %s\n", filename);
+		psg_run(sms->psg, sms->z80->Z80_CYCLE);
+		psg_vgm_log(sms->psg, sms->normal_clock, vgm);
+		sms->header.vgm_logging = 1;
+	} else {
+		printf("Failed to start logging to %s\n", filename);
+	}
+}
+
+static void stop_vgm_log(system_header *system)
+{
+	puts("Stopped VGM log");
+	sms_context *sms = (sms_context *)system;
+	vgm_close(sms->psg->vgm);
+	sms->psg->vgm = NULL;
+	sms->header.vgm_logging = 0;
+}
+
 sms_context *alloc_configure_sms(system_media *media, uint32_t opts, uint8_t force_region)
 {
 	sms_context *sms = calloc(1, sizeof(sms_context));
@@ -1149,6 +1179,8 @@
 	sms->header.config_updated = config_updated;
 	sms->header.serialize = serialize;
 	sms->header.deserialize = deserialize;
+	sms->header.start_vgm_log = start_vgm_log;
+	sms->header.stop_vgm_log = stop_vgm_log;
 	sms->header.toggle_debug_view = toggle_debug_view;
 	sms->header.cassette_action = cassette_action;
 	sms->header.type = SYSTEM_SMS;
--- a/vgm.c	Mon Nov 25 22:26:45 2024 -0800
+++ b/vgm.c	Mon Nov 25 22:30:32 2024 -0800
@@ -81,12 +81,17 @@
 	wait_commands(writer, delta);
 }
 
-static uint8_t last_cmd;
 void vgm_sn76489_write(vgm_writer *writer, uint32_t cycle, uint8_t value)
 {
 	add_wait(writer, cycle);
 	uint8_t cmd[2] = {CMD_PSG, value};
-	last_cmd = CMD_PSG;
+	fwrite(cmd, 1, sizeof(cmd), writer->f);
+}
+
+void vgm_gg_pan_write(vgm_writer *writer, uint32_t cycle, uint8_t value)
+{
+	add_wait(writer, cycle);
+	uint8_t cmd[2] = {CMD_PSG_STEREO, value};
 	fwrite(cmd, 1, sizeof(cmd), writer->f);
 }
 
@@ -99,7 +104,6 @@
 {
 	add_wait(writer, cycle);
 	uint8_t cmd[3] = {CMD_YM2612_0, reg, value};
-	last_cmd = CMD_YM2612_0;
 	fwrite(cmd, 1, sizeof(cmd), writer->f);
 }
 
@@ -107,7 +111,6 @@
 {
 	add_wait(writer, cycle);
 	uint8_t cmd[3] = {CMD_YM2612_1, reg, value};
-	last_cmd = CMD_YM2612_1;
 	fwrite(cmd, 1, sizeof(cmd), writer->f);
 }
 
--- a/vgm.h	Mon Nov 25 22:26:45 2024 -0800
+++ b/vgm.h	Mon Nov 25 22:30:32 2024 -0800
@@ -135,6 +135,7 @@
 vgm_writer *vgm_write_open(char *filename, uint32_t rate, uint32_t clock, uint32_t cycle);
 void vgm_sn76489_init(vgm_writer *writer, uint32_t clock, uint16_t feedback, uint8_t shift_reg_size, uint8_t flags);
 void vgm_sn76489_write(vgm_writer *writer, uint32_t cycle, uint8_t value);
+void vgm_gg_pan_write(vgm_writer *writer, uint32_t cycle, uint8_t value);
 void vgm_ym2612_init(vgm_writer *writer, uint32_t clock);
 void vgm_ym2612_part1_write(vgm_writer *writer, uint32_t cycle, uint8_t reg, uint8_t value);
 void vgm_ym2612_part2_write(vgm_writer *writer, uint32_t cycle, uint8_t reg, uint8_t value);