reznez 0.0.0

The high accuracy NES Emulator
Documentation
#[derive(Default)]
pub struct Timer {
    period: u16,
    index: u16,
}

impl Timer {
    pub fn period(&self) -> u16 {
        self.period
    }

    pub fn set_period_and_reset_index(&mut self, period: u16) {
        self.period = period;
        self.index = self.period;
    }

    pub fn set_period_high_and_reset_index(&mut self, period_high: u8) {
        self.period &= 0b0000_0000_1111_1111;
        self.period |= u16::from(period_high & 0b0000_0111) << 8;
        self.index = self.period;
    }

    pub fn set_period_low(&mut self, period_low: u8) {
        self.period &= 0b0000_0111_0000_0000;
        self.period |= u16::from(period_low);
    }

    pub fn tick(&mut self) -> bool {
        let mut wrapped_around = false;
        match (self.period, self.index) {
            (0, _) => self.index = 0,
            (_, 0) => {
                self.index = self.period;
                wrapped_around = true;
            }
            (_, _) => self.index -= 1,
        }

        wrapped_around
    }
}