use crate::gpu::{DMAMode, Depth, DispEnv, PackedVertex, VertexError, VideoMode};
use crate::hw::gpu::GP1;
use crate::hw::Register;
use core::result::Result;
impl GP1 {
pub fn reset_gpu(&mut self) -> &mut Self {
self.assign(0x00 << 24).store();
self
}
pub fn reset_buffer(&mut self) -> &mut Self {
self.assign(0x01 << 24).store();
self
}
pub fn ack_irq(&mut self) -> &mut Self {
self.assign(0x02 << 24).store();
self
}
pub fn enable_display(&mut self, enabled: bool) -> &mut Self {
self.assign((0x03 << 24) | !enabled as u32).store();
self
}
pub fn dma_mode(&mut self, direction: Option<DMAMode>) -> &mut Self {
let mode = direction.map(|d| d as u32).unwrap_or(0);
self.assign((0x04 << 24) | mode).store();
self
}
pub fn display_start(&mut self, start: PackedVertex<3, 10, 9>) -> &mut Self {
self.assign((0x05 << 24) | u32::from(start)).store();
self
}
pub fn horizontal_range(&mut self, range: PackedVertex<3, 12, 12>) -> &mut Self {
self.assign((0x06 << 24) | u32::from(range)).store();
self
}
pub fn vertical_range(&mut self, range: PackedVertex<3, 10, 10>) -> &mut Self {
self.assign((0x07 << 24) | u32::from(range)).store();
self
}
pub fn display_mode(
&mut self, res: (i16, i16), mode: VideoMode, depth: Depth, interlace: bool,
) -> Result<&mut Self, VertexError> {
let hres = match res.0 {
256 => 0,
320 => 1,
512 => 2,
640 => 3,
368 => 1 << 6,
_ => return Err(VertexError::InvalidX),
};
let vres = match (mode, res.1) {
(VideoMode::NTSC, 240) | (VideoMode::PAL, 256) => 0,
(VideoMode::NTSC, 480) | (VideoMode::PAL, 512) => 1,
_ => return Err(VertexError::InvalidY),
};
let settings =
hres | vres << 2 | (mode as u32) << 3 | (depth as u32) << 4 | (interlace as u32) << 5;
self.assign((0x08 << 24) | settings).store();
Ok(self)
}
pub fn set_display_env(&mut self, disp_env: &DispEnv) -> &mut Self {
self.display_start(disp_env.offset)
.horizontal_range(disp_env.horizontal_range)
.vertical_range(disp_env.vertical_range)
}
}