mirror of https://github.com/bsnes-emu/bsnes.git
45 lines
915 B
C++
45 lines
915 B
C++
auto APU::Triangle::clockLength() -> void {
|
|
if(haltLengthCounter == 0) {
|
|
if(lengthCounter > 0) lengthCounter--;
|
|
}
|
|
}
|
|
|
|
auto APU::Triangle::clockLinearLength() -> void {
|
|
if(reloadLinear) {
|
|
linearLengthCounter = linearLength;
|
|
} else if(linearLengthCounter) {
|
|
linearLengthCounter--;
|
|
}
|
|
|
|
if(haltLengthCounter == 0) reloadLinear = false;
|
|
}
|
|
|
|
auto APU::Triangle::clock() -> uint8 {
|
|
uint8 result = stepCounter & 0x0f;
|
|
if((stepCounter & 0x10) == 0) result ^= 0x0f;
|
|
if(lengthCounter == 0 || linearLengthCounter == 0) return result;
|
|
|
|
if(--periodCounter == 0) {
|
|
stepCounter++;
|
|
periodCounter = period + 1;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
auto APU::Triangle::power() -> void {
|
|
reset();
|
|
}
|
|
|
|
auto APU::Triangle::reset() -> void {
|
|
lengthCounter = 0;
|
|
|
|
linearLength = 0;
|
|
haltLengthCounter = 0;
|
|
period = 0;
|
|
periodCounter = 1;
|
|
stepCounter = 0;
|
|
linearLengthCounter = 0;
|
|
reloadLinear = 0;
|
|
}
|