Skip to content
Snippets Groups Projects
apu.rs 33.9 KiB
Newer Older
  • Learn to ignore specific revisions
  •         self.ch2_timer = ((2048 - self.ch2_wave_length) << 2) as i16;
            self.ch2_envelope_sequence = 0;
        }
    
        #[inline(always)]
        fn trigger_ch3(&mut self) {
            self.ch3_timer = 3;
            self.ch3_position = 0;
        }
    
        #[inline(always)]
        fn trigger_ch4(&mut self) {
            self.ch4_timer =
    
                ((CH4_DIVISORS[self.ch4_divisor as usize] as u16) << self.ch4_clock_shift) as i32;
    
            self.ch4_lfsr = 0x7ff1;
            self.ch4_envelope_sequence = 0;
        }
    
    
    impl Default for Apu {
        fn default() -> Self {
    
            Self::new(44100, 1.0, GameBoy::CPU_FREQ)
    
    
    #[cfg(test)]
    mod tests {
        use super::*;
    
        #[test]
        fn test_trigger_ch1() {
    
            let mut apu = Apu {
                ch1_wave_length: 1024,
                ..Default::default()
            };
    
            apu.trigger_ch1();
    
            assert_eq!(apu.ch1_timer, 4096);
            assert_eq!(apu.ch1_envelope_sequence, 0);
            assert_eq!(apu.ch1_sweep_sequence, 0);
        }
    
        #[test]
        fn test_trigger_ch2() {
    
            let mut apu = Apu {
                ch2_wave_length: 1024,
                ..Default::default()
            };
    
            apu.trigger_ch2();
    
            assert_eq!(apu.ch2_timer, 4096);
            assert_eq!(apu.ch2_envelope_sequence, 0);
        }
    
        #[test]
        fn test_trigger_ch3() {
    
            let mut apu = Apu {
                ch3_wave_length: 1024,
                ..Default::default()
            };
    
            apu.trigger_ch3();
    
            assert_eq!(apu.ch3_timer, 3);
            assert_eq!(apu.ch3_position, 0);
        }
    
        #[test]
        fn test_trigger_ch4() {
    
            let mut apu = Apu {
                ch4_divisor: 3,
                ch4_clock_shift: 2,
                ..Default::default()
            };
    
            apu.trigger_ch4();
    
            assert_eq!(apu.ch4_timer, 192);
            assert_eq!(apu.ch4_lfsr, 0x7ff1);
            assert_eq!(apu.ch4_envelope_sequence, 0);
        }
    }