# HG changeset patch # User Michael Pavone # Date 1392151543 28800 # Node ID 7565ec2ac65298f1334e3bca079c01f7dc486b66 # Parent 6e9d1a8c1b083cc9ca8762031f08c6ad529736a4 Fix overflow handling on FM channel output diff -r 6e9d1a8c1b08 -r 7565ec2ac652 ym2612.c --- a/ym2612.c Tue Feb 11 12:45:15 2014 -0800 +++ b/ym2612.c Tue Feb 11 12:45:43 2014 -0800 @@ -470,9 +470,16 @@ context->audio_buffer[context->buffer_pos] = 0; context->audio_buffer[context->buffer_pos + 1] = 0; for (int i = 0; i < NUM_CHANNELS; i++) { - int16_t value = context->channels[i].output & 0x3FE0; - if (value & 0x2000) { - value |= 0xC000; + int16_t value = context->channels[i].output; + if (value > 0x1FE0) { + value = 0x1FE0; + } else if (value < -0x1FF0) { + value = -0x1FF0; + } else { + value &= 0x3FE0; + if (value & 0x2000) { + value |= 0xC000; + } } if (context->channels[i].logfile) { fwrite(&value, sizeof(value), 1, context->channels[i].logfile);