1use bitfield_struct::{bitenum, bitfield};
4use voladdress::{Safe, VolAddress};
5
6#[bitenum(all = false)]
8#[repr(u8)]
9#[derive(Clone, Copy, Debug, PartialEq, Eq)]
10pub enum TimerClock {
11 Hz4096 = 0b00,
13 Hz262144 = 0b01,
15 Hz65536 = 0b10,
17 #[fallback]
19 Hz16384 = 0b11,
20}
21
22#[bitfield(u8)]
30#[derive(PartialEq, Eq)]
31pub struct TimerCtrl {
32 #[bits(2)]
34 pub clock: TimerClock,
35 pub enable: bool,
37 #[bits(5)]
38 __: u8,
39}
40
41pub const DIV: VolAddress<u8, Safe, Safe> = unsafe { VolAddress::new(0xFF04) };
43pub const TIMA: VolAddress<u8, Safe, Safe> = unsafe { VolAddress::new(0xFF05) };
45pub const TMA: VolAddress<u8, Safe, Safe> = unsafe { VolAddress::new(0xFF06) };
47pub const TAC: VolAddress<TimerCtrl, Safe, Safe> = unsafe { VolAddress::new(0xFF07) };
49
50const _: () = {
51 assert!(TimerCtrl::new().with_enable(true).into_bits() == 0b0000_0100);
52 assert!(TimerCtrl::new().with_clock(TimerClock::Hz16384).into_bits() == 0b0000_0011);
53};