mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-10-04 07:11:35 +02:00
byuu says: Changelog: - int_t<bits> replaced with Integer<bits> - uint_t<bits> replaced with Natural<bits> - fixed "Synchronize Audio" menu option that broke recently - all of sfc/performance ported to "auto function() -> return;" syntax With this WIP, all of higan is finally ported over to the new function declaration syntax. Thank the gods. There's still going to be periodic disruption for diffs from porting over signed->int, unsigned->uint, and whatever we come up with for the new Natural<> and Integer<> classes. But the worst of it's behind us now.
104 lines
2.2 KiB
C++
104 lines
2.2 KiB
C++
auto APU::Noise::dac_enable() const -> bool {
|
|
return (envelope_volume || envelope_direction);
|
|
}
|
|
|
|
auto APU::Noise::run() -> void {
|
|
if(period && --period == 0) {
|
|
period = divisor << frequency;
|
|
if(frequency < 14) {
|
|
bool bit = (lfsr ^ (lfsr >> 1)) & 1;
|
|
lfsr = (lfsr >> 1) ^ (bit << (narrow_lfsr ? 6 : 14));
|
|
}
|
|
}
|
|
|
|
uint4 sample = (lfsr & 1) ? (uint4)0 : volume;
|
|
if(enable == false) sample = 0;
|
|
|
|
output = sample;
|
|
}
|
|
|
|
auto APU::Noise::clock_length() -> void {
|
|
if(enable && counter) {
|
|
if(++length == 0) enable = false;
|
|
}
|
|
}
|
|
|
|
auto APU::Noise::clock_envelope() -> void {
|
|
if(enable && envelope_frequency && --envelope_period == 0) {
|
|
envelope_period = envelope_frequency;
|
|
if(envelope_direction == 0 && volume > 0) volume--;
|
|
if(envelope_direction == 1 && volume < 15) volume++;
|
|
}
|
|
}
|
|
|
|
auto APU::Noise::write(uint r, uint8 data) -> void {
|
|
if(r == 1) { //$ff20 NR41
|
|
length = data & 0x3f;
|
|
}
|
|
|
|
if(r == 2) { //$ff21 NR42
|
|
envelope_volume = data >> 4;
|
|
envelope_direction = data & 0x08;
|
|
envelope_frequency = data & 0x07;
|
|
if(dac_enable() == false) enable = false;
|
|
}
|
|
|
|
if(r == 3) { //$ff22 NR43
|
|
frequency = data >> 4;
|
|
narrow_lfsr = data & 0x08;
|
|
divisor = (data & 0x07) << 3;
|
|
if(divisor == 0) divisor = 4;
|
|
period = divisor << frequency;
|
|
}
|
|
|
|
if(r == 4) { //$ff34 NR44
|
|
bool initialize = data & 0x80;
|
|
counter = data & 0x40;
|
|
|
|
if(initialize) {
|
|
enable = dac_enable();
|
|
lfsr = -1;
|
|
envelope_period = envelope_frequency;
|
|
volume = envelope_volume;
|
|
}
|
|
}
|
|
}
|
|
|
|
auto APU::Noise::power() -> void {
|
|
enable = 0;
|
|
|
|
envelope_volume = 0;
|
|
envelope_direction = 0;
|
|
envelope_frequency = 0;
|
|
frequency = 0;
|
|
narrow_lfsr = 0;
|
|
divisor = 0;
|
|
counter = 0;
|
|
|
|
output = 0;
|
|
length = 0;
|
|
envelope_period = 0;
|
|
volume = 0;
|
|
period = 0;
|
|
lfsr = 0;
|
|
}
|
|
|
|
auto APU::Noise::serialize(serializer& s) -> void {
|
|
s.integer(enable);
|
|
|
|
s.integer(envelope_volume);
|
|
s.integer(envelope_direction);
|
|
s.integer(envelope_frequency);
|
|
s.integer(frequency);
|
|
s.integer(narrow_lfsr);
|
|
s.integer(divisor);
|
|
s.integer(counter);
|
|
|
|
s.integer(output);
|
|
s.integer(length);
|
|
s.integer(envelope_period);
|
|
s.integer(volume);
|
|
s.integer(period);
|
|
s.integer(lfsr);
|
|
}
|