diff --git a/src/display/mod.rs b/src/display/mod.rs index 1736024..96cb86b 100644 --- a/src/display/mod.rs +++ b/src/display/mod.rs @@ -334,31 +334,6 @@ impl Display { } } - fn get_background_attribute( - &self, - //tile_index_x: usize, - //tile_index_y: usize, - vram_offset: usize, - ) -> BgMapAttributes { - /* - let background_map = if self.control & CTRL_BG_TILE_MAP_SELECT != 0 { - 0x1C00 - } else { - 0x1800 - }; - - let vram_offset: usize = - background_map + ((tile_index_y as usize) * 32) + tile_index_x as usize; - */ - // Background attributes are only in this memory range. - assert!( - vram_offset >= 0x1800 && vram_offset < 0x2000, - format!("offset: {:04X}", vram_offset) - ); - - BgMapAttributes(self.vram1[vram_offset]) - } - pub fn tick(&mut self, ticks: u16) { self.status &= 0xFC; if self.control & CTRL_LCD_DISPLAY_ENABLE == 0 { @@ -621,7 +596,7 @@ impl Display { // GBC stuff // Get BG map attributes - let bg_attribs = self.get_background_attribute(vram_offset); + let bg_attribs = BgMapAttributes(self.vram1[vram_offset]); let vram = [&*self.vram0, &*self.vram1][bg_attribs.vram_bank_number()]; // TODO: Priority @@ -687,11 +662,7 @@ impl Display { // Obtain tile ID in this area let tile_id = self.vram0[vram_offset]; - - let bg_attribs = self.get_background_attribute( - //tile_index_x as usize, tile_index_y as usize - vram_offset, - ); + let bg_attribs = BgMapAttributes(self.vram1[vram_offset]); // Get BG map attributes let vram = if bg_attribs.vram_bank_number() == 0 { @@ -700,13 +671,12 @@ impl Display { &*self.vram1 }; - // TODO: Priority - let tile_offset_x = if bg_attribs.vertical_flip() { + let tile_offset_x = if bg_attribs.horizontal_flip() { 7 ^ tile_offset_x } else { tile_offset_x }; - let tile_offset_y = if bg_attribs.horizontal_flip() { + let tile_offset_y = if bg_attribs.vertical_flip() { 7 ^ tile_offset_y } else { tile_offset_y diff --git a/src/display/structs.rs b/src/display/structs.rs index 4bc4751..aaf6e1b 100644 --- a/src/display/structs.rs +++ b/src/display/structs.rs @@ -11,15 +11,19 @@ impl BgMapAttributes { } pub fn horizontal_flip(&self) -> bool { - (self.0 >> 5) != 0 + ((self.0 >> 5) & 1) == 1 } pub fn vertical_flip(&self) -> bool { - (self.0 >> 6) != 0 + ((self.0 >> 6) & 1) == 1 + } + + pub fn has_priority(&self) -> bool { + (self.0 >> 7) != 0 } } -#[derive(Debug, Copy, Clone)] +#[derive(Copy, Clone, Debug, PartialEq)] pub enum PixelOrigin { Empty, Background(usize), @@ -36,7 +40,7 @@ pub struct Sprite { impl Sprite { pub fn load(buf: &[u8]) -> Self { - assert!(buf.len() > 4); + assert!(buf.len() >= 4); Self { x: buf[0], y: buf[1],