use crate::common::{Reset, ResetKind};
use bitflags::bitflags;
use serde::{Deserialize, Serialize};
#[derive(Default, Serialize, Deserialize, Debug, Copy, Clone)]
#[must_use]
pub struct Ctrl {
pub bg_select: u16,
pub spr_select: u16,
pub spr_height: u16,
pub vram_increment: bool,
pub master_slave: u8,
pub nmi_enabled: bool,
pub bits: Bits,
}
bitflags! {
#[derive(Default, Serialize, Deserialize, Debug, Copy, Clone)]
#[must_use]
pub struct Bits: u8 {
const NAMETABLE1 = 0x01;
const NAMETABLE2 = 0x02;
const VRAM_INCREMENT = 0x04;
const SPR_SELECT = 0x08;
const BG_SELECT = 0x10;
const SPR_HEIGHT = 0x20;
const MASTER_SLAVE = 0x40;
const NMI_ENABLE = 0x80;
}
}
impl Ctrl {
pub fn new() -> Self {
let mut ctrl = Self::default();
ctrl.write(0);
ctrl
}
pub const fn write(&mut self, val: u8) {
self.bits = Bits::from_bits_truncate(val);
self.spr_select = self.bits.contains(Bits::SPR_SELECT) as u16 * 0x1000;
self.bg_select = self.bits.contains(Bits::BG_SELECT) as u16 * 0x1000;
self.spr_height = self.bits.contains(Bits::SPR_HEIGHT) as u16 * 8 + 8;
self.master_slave = self.bits.contains(Bits::MASTER_SLAVE) as u8;
self.nmi_enabled = self.bits.contains(Bits::NMI_ENABLE);
self.vram_increment = self.bits.contains(Bits::VRAM_INCREMENT);
}
}
impl Reset for Ctrl {
fn reset(&mut self, _kind: ResetKind) {
self.write(0);
}
}