use crate::{
scr::VideoFlags,
video_dma::{Blitter, VideoDma, spritemem::SpriteMem},
};
#[inline(always)]
fn write_video_flags(flags: VideoFlags) {
unsafe {
core::ptr::write_volatile(0x2007 as *mut u8, flags.bits());
}
}
#[repr(C)]
pub(crate) struct Framebuffers;
impl Framebuffers {
#[inline(always)]
pub fn blitter(self, vf: &mut VideoFlags) -> Blitter {
vf.insert(VideoFlags::DMA_ENABLE);
write_video_flags(*vf);
Blitter
}
#[inline(always)]
pub fn sprite_mem(self, vf: &mut VideoFlags) -> SpriteMem {
vf.remove(VideoFlags::DMA_CPU_TO_VRAM);
write_video_flags(*vf);
SpriteMem
}
}
pub struct FramebuffersGuard<'a> {
pub(crate) dma_slot: &'a mut Option<VideoDma>,
#[allow(dead_code)]
pub(crate) inner: Framebuffers,
}
impl<'a> Drop for FramebuffersGuard<'a> {
fn drop(&mut self) {
*self.dma_slot = Some(VideoDma::DmaFb(Framebuffers));
}
}
impl<'a> FramebuffersGuard<'a> {
#[inline(always)]
pub fn bytes(&mut self) -> &mut [u8; 0x4000] {
unsafe { &mut *(0x4000 as *mut [u8; 0x4000]) }
}
}