use crate::ppu::registers::Registers;
use bitflags::bitflags;
bitflags! {
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
pub struct PpuControlFlags: u8 {
const NAME_TABLE_X = 0b00000001;
const NAME_TABLE_Y = 0b00000010;
const INC_MODE = 0b00000100;
const SPRITE_TILE_SELECT = 0b00001000;
const BG_TILE_SELECT = 0b00010000;
const SPRITE_HEIGHT = 0b00100000;
const PPU_MASTER_SLAVE = 0b01000000;
const NMI_ENABLE = 0b10000000;
}
}
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct SelectedNameTable {
flags: PpuControlFlags,
}
impl Default for PpuControlFlags {
fn default() -> Self {
Self::empty()
}
}
impl SelectedNameTable {
#[allow(dead_code)]
pub fn new(right_col: bool, bottom_row: bool) -> Self {
let mut flags = PpuControlFlags::default();
if right_col {
flags.insert(PpuControlFlags::NAME_TABLE_X);
}
if bottom_row {
flags.insert(PpuControlFlags::NAME_TABLE_Y);
}
Self { flags }
}
}
impl Registers {
pub fn large_sprites_flag(&self) -> bool {
self.ppu_ctrl.contains(PpuControlFlags::SPRITE_HEIGHT)
}
pub fn sprite_second_table_selected(&self) -> bool {
self.ppu_ctrl.contains(PpuControlFlags::SPRITE_TILE_SELECT)
}
#[cfg(test)]
pub fn set_sprite_second_table_selected(&mut self) {
self.ppu_ctrl.insert(PpuControlFlags::SPRITE_TILE_SELECT);
}
pub fn bg_second_table_selected(&self) -> bool {
self.ppu_ctrl.contains(PpuControlFlags::BG_TILE_SELECT)
}
pub fn nmi_enabled(&self) -> bool {
self.ppu_ctrl.contains(PpuControlFlags::NMI_ENABLE)
}
}