1use crate::video::palette::PcePalette;
2use crate::video::vce::Vce;
3use crate::video::vdc::Vdc;
4use jgenesis_common::frontend::Color;
5
6impl Vdc {
7    pub fn dump_vram(
8        &self,
9        palette: u16,
10        out: &mut [[Color; 64]],
11        vce: &Vce,
12        pce_palette: &PcePalette,
13    ) {
14        for (tile_number, out_tile) in out[..2048].iter_mut().enumerate() {
15            let tile_addr = 16 * tile_number;
16            let tile_data = &self.vram[tile_addr..tile_addr + 16];
17
18            for tile_row in 0..8 {
19                let cg0 = tile_data[tile_row];
20                let cg1 = tile_data[tile_row + 8];
21
22                for tile_col in 0..8 {
23                    let shift = 7 - tile_col;
24                    let color_idx = ((cg0 >> shift) & 1)
25                        | (((cg0 >> (shift + 8)) & 1) << 1)
26                        | (((cg1 >> shift) & 1) << 2)
27                        | (((cg1 >> (shift + 8)) & 1) << 3);
28
29                    let vce_color = vce.read_color((palette << 4) | color_idx);
30                    let (r, g, b) = pce_palette[(vce_color & 0x1FF) as usize];
31                    out_tile[8 * tile_row + tile_col] = Color::rgb(r, g, b);
32                }
33            }
34        }
35    }
36}