diff --git a/src/display.rs b/src/display.rs index 73f2a57..b58cf4d 100644 --- a/src/display.rs +++ b/src/display.rs @@ -62,6 +62,24 @@ const MONOCHROME_PALETTE: &'static [[u8; 3]; 4] = &[ ]; */ +#[derive(Copy, Clone, Default)] +struct DmgPalette(u8); +impl DmgPalette { + fn get_color(self, n: usize) -> sdl2::pixels::Color { + const MONOCHROME_PALETTE: &'static [[u8; 3]; 4] = &[ + [255, 255, 255], + [200, 200, 200], + [125, 125, 12], + [50, 50, 50], + ]; + assert!(n < 4); + let c = self.0 >> (2 * n); + let n = c & 3; + let c = MONOCHROME_PALETTE[n as usize]; + sdl2::pixels::Color::RGB(c[0], c[1], c[2]) + } +} + #[derive(Copy, Clone)] struct CgbPalette([u8; 8]); impl CgbPalette { @@ -210,9 +228,9 @@ impl Sprite { pub struct Display { control: u8, status: u8, - background_palette: u8, + background_palette: DmgPalette, // Only 0 and 1 for GB - object_palette: [u8; 2], + object_palette: [DmgPalette; 2], scrollx: u8, scrolly: u8, windowx: u8, @@ -266,8 +284,8 @@ impl Display { Display { control: 0, status: 0, - background_palette: 0, - object_palette: [0u8; 2], + background_palette: Default::default(), + object_palette: Default::default(), scrollx: 0, scrolly: 0, windowx: 0, @@ -378,9 +396,9 @@ impl Display { 0xFF44 => self.curline = 0, 0xFF45 => self.lyc = val, // GB classic - 0xFF47 => self.background_palette = val, - 0xFF48 => self.object_palette[0] = val, - 0xFF49 => self.object_palette[1] = val, + 0xFF47 => self.background_palette.0 = val, + 0xFF48 => self.object_palette[0].0 = val, + 0xFF49 => self.object_palette[1].0 = val, // GBC 0xFF68 => { self.background_palette_index = val & 0b0111_1111; @@ -451,9 +469,9 @@ impl Display { 0xFF43 => self.scrollx, 0xFF44 => self.curline, 0xFF45 => self.lyc, - 0xFF47 => self.background_palette, - 0xFF48 => self.object_palette[0], - 0xFF49 => self.object_palette[1], + 0xFF47 => self.background_palette.0, + 0xFF48 => self.object_palette[0].0, + 0xFF49 => self.object_palette[1].0, 0xFF4A => self.windowy, 0xFF4B => self.windowx, 0xFF4F => self.vram_bank | 0b1111_1110,