Path: blob/master/libsnes/bsnes/gameboy/apu/wave/wave.cpp
2 views
#ifdef APU_CPP12void APU::Wave::run() {3if(period && --period == 0) {4period = 2 * (2048 - frequency);5pattern_sample = pattern[++pattern_offset];6}78uint4 sample = pattern_sample >> volume_shift;9if(enable == false) sample = 0;1011output = sample;12}1314void APU::Wave::clock_length() {15if(counter && length) {16if(--length == 0) enable = false;17}18}1920void APU::Wave::write(unsigned r, uint8 data) {21if(r == 0) { //$ff1a NR3022dac_enable = data & 0x80;23if(dac_enable == false) enable = false;24}2526if(r == 1) { //$ff1b NR3127length = 256 - data;28}2930if(r == 2) { //$ff1c NR3231switch((data >> 5) & 3) {32case 0: volume_shift = 4; break; // 0%33case 1: volume_shift = 0; break; //100%34case 2: volume_shift = 1; break; // 50%35case 3: volume_shift = 2; break; // 25%36}37}3839if(r == 3) { //$ff1d NR3340frequency = (frequency & 0x0700) | data;41}4243if(r == 4) { //$ff1e NR3444bool initialize = data & 0x80;45counter = data & 0x40;46frequency = ((data & 7) << 8) | (frequency & 0x00ff);4748if(initialize) {49enable = dac_enable;50pattern_offset = 0;51if(length == 0) length = 256;52}53}5455period = 2 * (2048 - frequency);56}5758void APU::Wave::write_pattern(unsigned p, uint8 data) {59p <<= 1;60pattern[p + 0] = (data >> 4) & 15;61pattern[p + 1] = (data >> 0) & 15;62}6364void APU::Wave::power() {65enable = 0;6667dac_enable = 0;68volume_shift = 0;69frequency = 0;70counter = 0;7172random_lfsr r;73for(auto &n : pattern) n = r() & 15;7475output = 0;76length = 0;77period = 0;78pattern_offset = 0;79pattern_sample = 0;80}8182void APU::Wave::serialize(serializer &s) {83s.integer(enable);8485s.integer(dac_enable);86s.integer(volume_shift);87s.integer(frequency);88s.integer(counter);89s.array(pattern);9091s.integer(output);92s.integer(length);93s.integer(period);94s.integer(pattern_offset);95s.integer(pattern_sample);96}9798#endif99100101