diff --git a/src/engine/platform/sid3.cpp b/src/engine/platform/sid3.cpp index 4d3017ecb..2d8583887 100644 --- a/src/engine/platform/sid3.cpp +++ b/src/engine/platform/sid3.cpp @@ -159,6 +159,7 @@ void DivPlatformSID3::tick(bool sysTick) chan[i].duty = 0x1000; updateDuty(i); + rWrite(i * SID3_REGISTERS_PER_CHANNEL, 0); //gate off TODO: make it properly? rWrite(i * SID3_REGISTERS_PER_CHANNEL, SID3_CHAN_ENABLE_GATE); //gate on } if (chan[i].keyOff) diff --git a/src/engine/platform/sound/sid3.c b/src/engine/platform/sound/sid3.c index e09b531fb..ebf993d7d 100644 --- a/src/engine/platform/sound/sid3.c +++ b/src/engine/platform/sound/sid3.c @@ -2455,15 +2455,23 @@ void sid3_write(SID3* sid3, uint8_t address, uint8_t data) { if(channel != SID3_NUM_CHANNELS - 1) { - //uint8_t prev_flags = sid3->chan[channel].flags & SID3_CHAN_ENABLE_GATE; + uint8_t prev_flags = sid3->chan[channel].flags; sid3->chan[channel].flags = data; - sid3_gate_bit(sid3->chan[channel].flags & SID3_CHAN_ENABLE_GATE, &sid3->chan[channel].adsr); + + if((prev_flags & SID3_CHAN_ENABLE_GATE) != (sid3->chan[channel].flags & SID3_CHAN_ENABLE_GATE)) + { + sid3_gate_bit(sid3->chan[channel].flags & SID3_CHAN_ENABLE_GATE, &sid3->chan[channel].adsr); + } } else { - //uint8_t prev_flags = sid3->chan[channel].flags & SID3_CHAN_ENABLE_GATE; + uint8_t prev_flags = sid3->chan[channel].flags; sid3->wave_chan.flags = data; - sid3_gate_bit(sid3->wave_chan.flags & SID3_CHAN_ENABLE_GATE, &sid3->wave_chan.adsr); + + if((prev_flags & SID3_CHAN_ENABLE_GATE) != (sid3->wave_chan.flags & SID3_CHAN_ENABLE_GATE)) + { + sid3_gate_bit(sid3->wave_chan.flags & SID3_CHAN_ENABLE_GATE, &sid3->wave_chan.adsr); + } } break; }