# HG changeset patch # User Michael Pavone # Date 1732602632 28800 # Node ID a6687a6fb69d6e494ec804cf2c318fa2c5614f15 # Parent 90a40be940f7ce6a4024840ac97286df63e57f6d# Parent 7e1215d175718df504bdb0e92e339f322641b0a8 Merge diff -r 90a40be940f7 -r a6687a6fb69d controller_info.c --- 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]; diff -r 90a40be940f7 -r a6687a6fb69d psg.c --- 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) diff -r 90a40be940f7 -r a6687a6fb69d sms.c --- 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; diff -r 90a40be940f7 -r a6687a6fb69d vgm.c --- 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); } diff -r 90a40be940f7 -r a6687a6fb69d vgm.h --- 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);