Path: blob/master/libsnes/bsnes/gameboy/apu/noise/noise.cpp
2 views
#ifdef APU_CPP12bool APU::Noise::dac_enable() {3return (envelope_volume || envelope_direction);4}56void APU::Noise::run() {7if(period && --period == 0) {8period = divisor << frequency;9if(frequency < 14) {10bool bit = (lfsr ^ (lfsr >> 1)) & 1;11lfsr = (lfsr >> 1) ^ (bit << (narrow_lfsr ? 6 : 14));12}13}1415uint4 sample = (lfsr & 1) ? (uint4)0 : volume;16if(enable == false) sample = 0;1718output = sample;19}2021void APU::Noise::clock_length() {22if(counter && length) {23if(--length == 0) enable = false;24}25}2627void APU::Noise::clock_envelope() {28if(enable && envelope_frequency && --envelope_period == 0) {29envelope_period = envelope_frequency;30if(envelope_direction == 0 && volume > 0) volume--;31if(envelope_direction == 1 && volume < 15) volume++;32}33}3435void APU::Noise::write(unsigned r, uint8 data) {36if(r == 1) { //$ff20 NR4137length = 64 - (data & 0x3f);38}3940if(r == 2) { //$ff21 NR4241envelope_volume = data >> 4;42envelope_direction = data & 0x08;43envelope_frequency = data & 0x07;44if(dac_enable() == false) enable = false;45}4647if(r == 3) { //$ff22 NR4348frequency = data >> 4;49narrow_lfsr = data & 0x08;50divisor = (data & 0x07) << 4;51if(divisor == 0) divisor = 8;52period = divisor << frequency;53}5455if(r == 4) { //$ff34 NR4456bool initialize = data & 0x80;57counter = data & 0x40;5859if(initialize) {60enable = dac_enable();61lfsr = ~0U;62envelope_period = envelope_frequency;63volume = envelope_volume;64if(length == 0) length = 64;65}66}67}6869void APU::Noise::power() {70enable = 0;7172envelope_volume = 0;73envelope_direction = 0;74envelope_frequency = 0;75frequency = 0;76narrow_lfsr = 0;77divisor = 0;78counter = 0;7980output = 0;81length = 0;82envelope_period = 0;83volume = 0;84period = 0;85lfsr = 0;86}8788void APU::Noise::serialize(serializer &s) {89s.integer(enable);9091s.integer(envelope_volume);92s.integer(envelope_direction);93s.integer(envelope_frequency);94s.integer(frequency);95s.integer(narrow_lfsr);96s.integer(divisor);97s.integer(counter);9899s.integer(output);100s.integer(length);101s.integer(envelope_period);102s.integer(volume);103s.integer(period);104s.integer(lfsr);105}106107#endif108109110