mirror of https://github.com/bsnes-emu/bsnes.git
39 lines
839 B
C++
39 lines
839 B
C++
auto APU::Pulse::clockLength() -> void {
|
|
if(envelope.loopMode == 0) {
|
|
if(lengthCounter) lengthCounter--;
|
|
}
|
|
}
|
|
|
|
auto APU::Pulse::clock() -> uint8 {
|
|
if(!sweep.checkPeriod()) return 0;
|
|
if(lengthCounter == 0) return 0;
|
|
|
|
static const uint dutyTable[4][8] = {
|
|
{0, 0, 0, 0, 0, 0, 0, 1}, //12.5%
|
|
{0, 0, 0, 0, 0, 0, 1, 1}, //25.0%
|
|
{0, 0, 0, 0, 1, 1, 1, 1}, //50.0%
|
|
{1, 1, 1, 1, 1, 1, 0, 0}, //25.0% (negated)
|
|
};
|
|
uint8 result = dutyTable[duty][dutyCounter] ? envelope.volume() : 0;
|
|
if(sweep.pulsePeriod < 0x008) result = 0;
|
|
|
|
if(--periodCounter == 0) {
|
|
periodCounter = (sweep.pulsePeriod + 1) * 2;
|
|
dutyCounter--;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
auto APU::Pulse::power() -> void {
|
|
envelope.power();
|
|
sweep.power();
|
|
|
|
lengthCounter = 0;
|
|
|
|
duty = 0;
|
|
dutyCounter = 0;
|
|
period = 0;
|
|
periodCounter = 1;
|
|
}
|