mirror of https://github.com/bsnes-emu/bsnes.git
58 lines
1.1 KiB
C++
58 lines
1.1 KiB
C++
void APU::Noise::clock_length() {
|
|
if(envelope.loop_mode == 0) {
|
|
if(length_counter > 0) length_counter--;
|
|
}
|
|
}
|
|
|
|
uint8 APU::Noise::clock() {
|
|
if(length_counter == 0) return 0;
|
|
|
|
uint8 result = (lfsr & 1) ? envelope.volume() : 0;
|
|
|
|
if(--period_counter == 0) {
|
|
unsigned feedback;
|
|
|
|
if(short_mode) {
|
|
feedback = ((lfsr >> 0) & 1) ^ ((lfsr >> 6) & 1);
|
|
} else {
|
|
feedback = ((lfsr >> 0) & 1) ^ ((lfsr >> 1) & 1);
|
|
}
|
|
|
|
lfsr = (lfsr >> 1) | (feedback << 14);
|
|
period_counter = apu.ntsc_noise_period_table[period];
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
void APU::Noise::power() {
|
|
}
|
|
|
|
void APU::Noise::reset() {
|
|
length_counter = 0;
|
|
|
|
envelope.speed = 0;
|
|
envelope.use_speed_as_volume = 0;
|
|
envelope.loop_mode = 0;
|
|
envelope.reload_decay = 0;
|
|
envelope.decay_counter = 0;
|
|
envelope.decay_volume = 0;
|
|
|
|
period = 0;
|
|
period_counter = 1;
|
|
short_mode = 0;
|
|
lfsr = 1;
|
|
}
|
|
|
|
void APU::Noise::serialize(serializer& s) {
|
|
s.integer(length_counter);
|
|
|
|
envelope.serialize(s);
|
|
|
|
s.integer(period);
|
|
s.integer(period_counter);
|
|
|
|
s.integer(short_mode);
|
|
s.integer(lfsr);
|
|
}
|