use crate::ppu::oam;
use crate::ppu::oam::{entry, Entry, Iter, OAM_ARRAY_ENTRIES_COUNT};
pub struct OamArray {
data: [Entry; OAM_ARRAY_ENTRIES_COUNT],
}
impl Default for OamArray {
fn default() -> Self {
Self {
data: [Entry::default(); OAM_ARRAY_ENTRIES_COUNT],
}
}
}
#[allow(dead_code)]
impl OamArray {
pub fn new() -> Self {
Self::default()
}
pub fn data(&self, addr: u8) -> u8 {
let index = (addr >> 2) as usize;
let selected_fied = entry::SelectedField::from(addr);
self.data[index].read_field(selected_fied)
}
pub fn write_data(&mut self, addr: u8, data: u8) {
let index = (addr >> 2) as usize;
let selected_fied = entry::SelectedField::from(addr);
self.data[index].write_field(selected_fied, data);
}
pub fn y(&self, sprite_index: u8) -> u8 {
self.data[sprite_index as usize].y()
}
pub fn tile_number(&self, sprite_index: u8) -> entry::TileIndexNumber {
self.data[sprite_index as usize].tile_num()
}
pub fn attributes(&self, sprite_index: u8) -> entry::Attributes {
self.data[sprite_index as usize].attributes()
}
pub fn x(&self, sprite_index: u8) -> u8 {
self.data[sprite_index as usize].x()
}
pub fn entry(&self, sprite_index: u8) -> oam::Entry {
self.data[sprite_index as usize]
}
pub fn iter(&self) -> Iter<'_> {
Iter {
array: self,
index: 0,
}
}
}