use ringbuffer::{ConstGenericRingBuffer, RingBuffer};
#[derive(Copy, Clone, Default)]
struct VramReadBufferEntry {
coords_in_name_table: (u16, u16),
tile_addr: u16,
second_bg_table_selected: bool,
attr_addr: u16,
bg_low_addr: u16,
bg_high_addr: u16,
tile_data: u8,
attr_data: u8,
bg_low_data: u8,
bg_high_data: u8,
}
pub struct VramReadBuffer {
buffer: ConstGenericRingBuffer<VramReadBufferEntry, 3>,
}
impl VramReadBuffer {
pub fn new() -> Self {
let mut ret = Self {
buffer: ConstGenericRingBuffer::new(),
};
for _ in 0..ret.buffer.capacity() {
ret.start_new_entry();
}
ret
}
pub fn pop_front(&mut self) {
self.buffer.dequeue();
}
pub fn start_new_entry(&mut self) {
self.buffer.push(VramReadBufferEntry::default());
}
pub fn set_tile_addr(&mut self, addr: u16) {
self.buffer
.back_mut()
.expect("VramReadBuffer should always contain at least 2 elements")
.tile_addr = addr;
}
pub fn set_second_bg_table_selected(&mut self, selected: bool) {
self.buffer
.back_mut()
.expect("VramReadBuffer should always contain at least 2 elements")
.second_bg_table_selected = selected;
}
pub fn set_coords_in_name_table(&mut self, coords: (u16, u16)) {
self.buffer
.back_mut()
.expect("VramReadBuffer should always contain at least 2 elements")
.coords_in_name_table = coords;
}
pub fn set_attr_addr(&mut self, addr: u16) {
self.buffer
.back_mut()
.expect("VramReadBuffer should always contain at least 2 elements")
.attr_addr = addr;
}
pub fn set_bg_low_addr(&mut self, addr: u16) {
self.buffer
.back_mut()
.expect("VramReadBuffer should always contain at least 2 elements")
.bg_low_addr = addr;
}
pub fn set_bg_high_addr(&mut self, addr: u16) {
self.buffer
.back_mut()
.expect("VramReadBuffer should always contain at least 2 elements")
.bg_high_addr = addr;
}
pub fn set_tile_data(&mut self, data: u8) {
self.buffer
.back_mut()
.expect("VramReadBuffer should always contain at least 2 elements")
.tile_data = data;
}
pub fn set_attr_data(&mut self, data: u8) {
self.buffer
.back_mut()
.expect("VramReadBuffer should always contain at least 2 elements")
.attr_data = data;
}
pub fn set_bg_low_data(&mut self, data: u8) {
self.buffer
.back_mut()
.expect("VramReadBuffer should always contain at least 2 elements")
.bg_low_data = data;
}
pub fn set_bg_high_data(&mut self, data: u8) {
self.buffer
.back_mut()
.expect("VramReadBuffer should always contain at least 2 elements")
.bg_high_data = data;
self.start_new_entry();
}
pub fn back_tile_addr(&self) -> u16 {
self.buffer
.back()
.expect("VramReadBuffer should always contain at least 2 elements")
.tile_addr
}
pub fn back_bg_second_table_selected(&self) -> bool {
self.buffer
.back()
.expect("VramReadBuffer should always contain at least 2 elements")
.second_bg_table_selected
}
pub fn back_attr_addr(&self) -> u16 {
self.buffer
.back()
.expect("VramReadBuffer should always contain at least 2 elements")
.attr_addr
}
pub fn back_bg_low_addr(&self) -> u16 {
self.buffer
.back()
.expect("VramReadBuffer should always contain at least 2 elements")
.bg_low_addr
}
pub fn back_bg_high_addr(&self) -> u16 {
self.buffer
.back()
.expect("VramReadBuffer should always contain at least 2 elements")
.bg_high_addr
}
pub fn back_tile_data(&self) -> u8 {
self.buffer
.back()
.expect("VramReadBuffer should always contain at least 2 elements")
.tile_data
}
pub fn front_coords_in_name_table(&self) -> (u16, u16) {
self.buffer
.front()
.expect("VramReadBuffer should always contain at least 2 elements")
.coords_in_name_table
}
pub fn front_attr_data(&self) -> u8 {
self.buffer
.front()
.expect("VramReadBuffer should always contain at least 2 elements")
.attr_data
}
pub fn front_bg_low_data(&self) -> u8 {
self.buffer
.front()
.expect("VramReadBuffer should always contain at least 2 elements")
.bg_low_data
}
pub fn front_bg_high_data(&self) -> u8 {
self.buffer
.front()
.expect("VramReadBuffer should always contain at least 2 elements")
.bg_high_data
}
}