From 1a1ab3693100bf1993a27d86126e2ca5d4d80887 Mon Sep 17 00:00:00 2001 From: Souryo Date: Thu, 14 Jul 2016 17:48:22 -0400 Subject: [PATCH] Audio: (Square) TickSweep() logic was incorrect (sound effects were wrong in Journey to Silius, etc.) --- Core/SquareChannel.h | 46 +++++++++++++++++--------------------------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/Core/SquareChannel.h b/Core/SquareChannel.h index 6ede738d6..bb500fe21 100644 --- a/Core/SquareChannel.h +++ b/Core/SquareChannel.h @@ -47,7 +47,7 @@ class SquareChannel : public ApuEnvelope _reloadSweep = true; } - void UpdateTargetPeriod(bool setPeriod) + void UpdateTargetPeriod() { uint16_t shiftResult = (_realPeriod >> _sweepShift); if(_sweepNegate) { @@ -59,10 +59,13 @@ class SquareChannel : public ApuEnvelope } else { _sweepTargetPeriod = _realPeriod + shiftResult; } - if(setPeriod && _sweepShift > 0 && _realPeriod >= 8 && _sweepTargetPeriod <= 0x7FF) { - _realPeriod = _sweepTargetPeriod; - _period = (_realPeriod * 2) + 1; - } + } + + void SetPeriod(uint16_t newPeriod) + { + _realPeriod = newPeriod; + _period = (_realPeriod * 2) + 1; + UpdateTargetPeriod(); } protected: @@ -136,17 +139,13 @@ class SquareChannel : public ApuEnvelope break; case 2: //4002 & 4006 - _realPeriod &= ~0x00FF; - _realPeriod |= value; - _period = (_realPeriod * 2) + 1; + SetPeriod((_realPeriod & 0x0700) | value); break; case 3: //4003 & 4007 LoadLengthCounter(value >> 3); - _realPeriod &= ~0x0700; - _realPeriod |= (value & 0x07) << 8; - _period = (_realPeriod * 2) + 1; + SetPeriod((_realPeriod & 0xFF) | ((value & 0x07) << 8)); //The sequencer is restarted at the first value of the current sequence. _timer = 0; @@ -160,26 +159,17 @@ class SquareChannel : public ApuEnvelope void TickSweep() { - if(_reloadSweep) { - if(_sweepDivider == 0 && _sweepEnabled) { - //If the divider's counter was zero before the reload and the sweep is enabled, the pulse's period is also adjusted - UpdateTargetPeriod(true); + _sweepDivider--; + if(_sweepDivider == 0) { + if(_sweepShift > 0 && _sweepEnabled && _realPeriod >= 8 && _sweepTargetPeriod <= 0x7FF) { + SetPeriod(_sweepTargetPeriod); } _sweepDivider = _sweepPeriod; - _reloadSweep = false; - } else { - if(_sweepDivider > 0) { - _sweepDivider--; - } else if(_sweepEnabled) { - UpdateTargetPeriod(true); - _sweepDivider = _sweepPeriod; - } } - } - void Run(uint32_t targetCycle) - { - UpdateTargetPeriod(false); - ApuLengthCounter::Run(targetCycle); + if(_reloadSweep) { + _sweepDivider = _sweepPeriod; + _reloadSweep = false; + } } }; \ No newline at end of file