mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-02-23 14:42:33 +01:00
byuu says: Changelog: - fc/apu: $4003,$4007 writes initialize duty counter to 0 instead of 7 - fc/apu: corrected duty table entries for use with decrementing duty counter - processor/spc700: emulated the behavior of cycle 3 of (x)+ instructions to not read I/O registers - specifically, this prevents reads from $fd-ff from resetting the timers, as observed on real hardware - sfc/controller: added ControllerPort class to match Mega Drive design - sfc/expansion: added ExpansionPort class to match Mega Drive design - sfc/system: removed Peripherals class - sfc/system: changed `colorburst()` to `cpuFrequency()`; added `apuFrequency()` - sfc: replaced calls to `system.region == System::Region::*` with `Region::*()` - sfc/expansion: remove thread from scheduler when device is destroyed - sfc/smp: `{read,write}Port` now use a separate 4x8-bit buffer instead of underlying APU RAM [hex\_usr]
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;
|
|
}
|