Test logo now displays

This commit is contained in:
Gwilym Kuiper 2022-01-17 23:11:14 +00:00
parent b2c16f754b
commit 93d82f309e
4 changed files with 65 additions and 30 deletions

View file

@ -3,7 +3,10 @@ use hashbrown::HashMap;
use crate::memory_mapped::{MemoryMapped, MemoryMapped1DArray}; use crate::memory_mapped::{MemoryMapped, MemoryMapped1DArray};
use super::{set_graphics_mode, set_graphics_settings, DisplayMode, GraphicsSettings}; use super::{
palette16, set_graphics_mode, set_graphics_settings, DisplayMode, GraphicsSettings, Priority,
DISPLAY_CONTROL,
};
const TILE_BACKGROUND: MemoryMapped1DArray<u32, { 2048 * 8 }> = const TILE_BACKGROUND: MemoryMapped1DArray<u32, { 2048 * 8 }> =
unsafe { MemoryMapped1DArray::new(0x06000000) }; unsafe { MemoryMapped1DArray::new(0x06000000) };
@ -26,10 +29,16 @@ impl TileFormat {
} }
pub struct TileSet<'a> { pub struct TileSet<'a> {
tiles: &'a [u8], tiles: &'a [u32],
format: TileFormat, format: TileFormat,
} }
impl<'a> TileSet<'a> {
pub fn new(tiles: &'a [u32], format: TileFormat) -> Self {
Self { tiles, format }
}
}
#[derive(Clone, Copy, PartialEq, Eq)] #[derive(Clone, Copy, PartialEq, Eq)]
pub struct TileSetReference { pub struct TileSetReference {
id: u16, id: u16,
@ -145,21 +154,17 @@ impl<'a> VRamManager<'a> {
"Stale tile data requested" "Stale tile data requested"
); );
let tile_offset = (tile as usize) * data.format.tile_size(); let tile_offset = (tile as usize) * data.format.tile_size() / 4;
&data.tiles[tile_offset..(tile_offset + data.format.tile_size())] &data.tiles[tile_offset..(tile_offset + data.format.tile_size() / 4)]
} else { } else {
panic!("Cannot find tile data at given reference"); panic!("Cannot find tile data at given reference");
}; };
let tile_size_in_words = TileFormat::FourBpp.tile_size() / 4; let tile_size_in_words = TileFormat::FourBpp.tile_size() / 4;
unsafe { for (i, &word) in tile_slice.iter().enumerate() {
let (_, tile_data, _) = tile_slice.align_to::<u32>();
for (i, &word) in tile_data.iter().enumerate() {
TILE_BACKGROUND.set(index_to_copy_into * tile_size_in_words + i, word); TILE_BACKGROUND.set(index_to_copy_into * tile_size_in_words + i, word);
} }
}
TileIndex(index_to_copy_into as u16) TileIndex(index_to_copy_into as u16)
} }
@ -187,6 +192,19 @@ impl<'a> VRamManager<'a> {
PALETTE_BACKGROUND.set(index, colour); PALETTE_BACKGROUND.set(index, colour);
} }
} }
fn set_background_palette(&mut self, pal_index: u8, palette: &palette16::Palette16) {
for (colour_index, &colour) in palette.colours.iter().enumerate() {
PALETTE_BACKGROUND.set(pal_index as usize * 16 + colour_index, colour);
}
}
/// Copies palettes to the background palettes without any checks.
pub fn set_background_palettes(&mut self, palettes: &[palette16::Palette16]) {
for (palette_index, entry) in palettes.iter().enumerate() {
self.set_background_palette(palette_index as u8, entry)
}
}
} }
#[derive(Clone, Copy, Debug)] #[derive(Clone, Copy, Debug)]
@ -205,7 +223,7 @@ pub struct RegularMap {
screenblock: u8, screenblock: u8,
x_scroll: u16, x_scroll: u16,
y_scroll: u16, y_scroll: u16,
priority: u8, priority: Priority,
tiles: [Tile; 32 * 32], tiles: [Tile; 32 * 32],
tiles_dirty: bool, tiles_dirty: bool,
@ -219,7 +237,7 @@ impl RegularMap {
screenblock, screenblock,
x_scroll: 0, x_scroll: 0,
y_scroll: 0, y_scroll: 0,
priority: 0, priority: Priority::P0,
tiles: [Tile(0); 32 * 32], tiles: [Tile(0); 32 * 32],
tiles_dirty: true, tiles_dirty: true,
@ -231,6 +249,12 @@ impl RegularMap {
self.tiles_dirty = true; self.tiles_dirty = true;
} }
pub fn show(&mut self) {
let mode = DISPLAY_CONTROL.get();
let new_mode = mode | (1 << (self.background_id + 0x08));
DISPLAY_CONTROL.set(new_mode);
}
pub fn commit(&mut self) { pub fn commit(&mut self) {
let new_bg_control_value = (self.priority as u16) | ((self.screenblock as u16) << 8); let new_bg_control_value = (self.priority as u16) | ((self.screenblock as u16) << 8);
@ -246,6 +270,8 @@ impl RegularMap {
for (i, tile) in self.tiles.iter().enumerate() { for (i, tile) in self.tiles.iter().enumerate() {
screenblock_memory.set(i, tile.0); screenblock_memory.set(i, tile.0);
} }
self.tiles_dirty = false;
} }
const fn bg_control_register(&self) -> MemoryMapped<u16> { const fn bg_control_register(&self) -> MemoryMapped<u16> {
@ -261,7 +287,7 @@ impl RegularMap {
} }
const fn screenblock_memory(&self) -> MemoryMapped1DArray<u16, { 32 * 32 }> { const fn screenblock_memory(&self) -> MemoryMapped1DArray<u16, { 32 * 32 }> {
unsafe { MemoryMapped1DArray::new(0x0600_0000 + 0x1000 * self.screenblock as usize) } unsafe { MemoryMapped1DArray::new(0x0600_0000 + 0x1000 * self.screenblock as usize / 2) }
} }
} }

View file

@ -1,23 +1,31 @@
/*use crate::display::background::BackgroundDistributor; use crate::display::background::Tiled0;
use super::background::{Tile, TileFormat, TileSet};
crate::include_gfx!("gfx/agb_logo.toml"); crate::include_gfx!("gfx/agb_logo.toml");
pub fn display_logo(gfx: &mut BackgroundDistributor) { pub fn display_logo(gfx: &mut Tiled0) {
use super::background::Map; gfx.vram
gfx.set_background_palettes(agb_logo::test_logo.palettes); .set_background_palettes(agb_logo::test_logo.palettes);
gfx.set_background_tilemap(0, agb_logo::test_logo.tiles);
let mut back = gfx.get_regular().unwrap(); let background_tilemap = TileSet::new(agb_logo::test_logo.tiles, TileFormat::FourBpp);
let background_tilemap_reference = gfx.vram.add_tileset(background_tilemap);
let mut back = gfx.background();
for y in 0..20 {
for x in 0..30 {
let tile_id = y * 30 + x;
let mut entries: [u16; 30 * 20] = [0; 30 * 20];
for tile_id in 0..(30 * 20) {
let palette_entry = agb_logo::test_logo.palette_assignments[tile_id as usize] as u16; let palette_entry = agb_logo::test_logo.palette_assignments[tile_id as usize] as u16;
entries[tile_id as usize] = tile_id | (palette_entry << 12); let tile = gfx.vram.add_tile(background_tilemap_reference, tile_id);
back.set_tile(x, y, Tile::new(tile, false, false, palette_entry))
}
} }
back.set_map(Map::new(&entries, (30_u32, 20_u32).into(), 0));
back.show();
back.commit(); back.commit();
back.show();
} }
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
@ -31,4 +39,4 @@ mod tests {
crate::test_runner::assert_image_output("gfx/test_logo.png"); crate::test_runner::assert_image_output("gfx/test_logo.png");
} }
}*/ }

View file

@ -109,6 +109,7 @@ pub fn busy_wait_for_vblank() {
while VCOUNT.get() < 160 {} while VCOUNT.get() < 160 {}
} }
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum Priority { pub enum Priority {
P0 = 0, P0 = 0,
P1 = 1, P1 = 1,

View file

@ -1,4 +1,4 @@
use super::{bitmap3::Bitmap3, bitmap4::Bitmap4}; use super::{background::Tiled0, bitmap3::Bitmap3, bitmap4::Bitmap4};
#[non_exhaustive] #[non_exhaustive]
pub struct Video {} pub struct Video {}
@ -14,7 +14,7 @@ impl Video {
unsafe { Bitmap4::new() } unsafe { Bitmap4::new() }
} }
// pub fn tiled0(&mut self) -> BackgroundDistributor { pub fn tiled0(&mut self) -> Tiled0 {
// unsafe { BackgroundDistributor::new() } unsafe { Tiled0::new() }
// } }
} }