From b351a81889d3c71cfc588c194985c593e1f0da72 Mon Sep 17 00:00:00 2001 From: yeastplume Date: Sat, 22 Feb 2020 12:13:10 +0000 Subject: [PATCH] add initial ability to conflate tilemaps for bin output --- samples/tile_wall/Makefile | 1 + vera/src/asm.rs | 48 ++++++++++++++++++++++++++++++-------- vera/src/tilemap.rs | 3 ++- vera/tests/tilemap.rs | 4 ++++ 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/samples/tile_wall/Makefile b/samples/tile_wall/Makefile index 562f3e3..95b44e8 100644 --- a/samples/tile_wall/Makefile +++ b/samples/tile_wall/Makefile @@ -12,6 +12,7 @@ project.av: $(RESOURCES) $(ALOEVERA) -p project.av tilemap load -x 0 -y 10 wall_tilemap tile_wall-map.png $(ALOEVERA) -p project.av asm ./output/ all $(ALOEVERA) -p project.av asm -f basic ./output/ all + $(ALOEVERA) -p project.av asm -f bin ./output/ all generate_resources: project.av diff --git a/vera/src/asm.rs b/vera/src/asm.rs index a5d33d4..073cd35 100644 --- a/vera/src/asm.rs +++ b/vera/src/asm.rs @@ -124,11 +124,13 @@ impl AssembledString { #[derive(Clone, Debug, Serialize, Deserialize)] pub struct ConflateInfo { /// start offset from start of vera tilemap - start_offset: u32, + start_offset: usize, /// number of tiles to draw per row - stride: u32, + stride: usize, /// number of tiles to skip per row - skip: u32, + skip: usize, + /// Total vera tilemap length, in bytes + tilemap_length: usize, } /// Holds raw assembled data, pre-formatting @@ -158,11 +160,18 @@ impl AssembledPrimitive { } /// set Tilemap values - pub fn set_tilemap_conflate_info(&mut self, start_offset: u32, stride: u32, skip: u32) { + pub fn set_tilemap_conflate_info( + &mut self, + start_offset: u32, + stride: u32, + skip: u32, + tilemap_length: u32, + ) { self.conflate_info = Some(ConflateInfo { - start_offset, - stride, - skip, + start_offset: start_offset as usize, + stride: stride as usize, + skip: skip as usize, + tilemap_length: tilemap_length as usize, }); } @@ -208,9 +217,28 @@ impl AssembledPrimitive { &self.data } - /// Conflate raw data in-place - pub fn conflate_data(&self) -> Result, Error> { - Ok(self.data.clone()) + /// Conflate raw data + fn conflate_data(&self) -> Result, Error> { + let c_data = match self.conflate_info.clone() { + Some(c) => c, + None => { + return Err(ErrorKind::InvalidAsmFormat("Missing Conflate Data".into()).into()); + } + }; + // Add zeroes up to start index + let mut ret_data = vec![0u8; c_data.start_offset]; + for i in (0..self.data.len()).step_by(c_data.stride) { + let mut slice_vec = vec![0; c_data.stride]; + slice_vec.copy_from_slice(&self.data[i..i + c_data.stride]); + ret_data.append(&mut slice_vec); + for _ in 0..c_data.skip { + ret_data.push(0); + } + } + for _ in 0..(c_data.tilemap_length - ret_data.len()) { + ret_data.push(0); + } + Ok(ret_data) } /// Output Meta, formatted for assembly target diff --git a/vera/src/tilemap.rs b/vera/src/tilemap.rs index 96d79cb..cc3368e 100644 --- a/vera/src/tilemap.rs +++ b/vera/src/tilemap.rs @@ -478,7 +478,8 @@ impl Assemblable for VeraTileMap { let mut retval = AssembledPrimitive::new(self.id()); // load instructions let (start_index, stride, skip) = self.calc_start_index_stride_and_skip(); - retval.set_tilemap_conflate_info(start_index, stride, skip); + let length = self.map_width.val_as_u32() * self.map_height.val_as_u32() * 2; + retval.set_tilemap_conflate_info(start_index, stride, skip, length); retval.add_meta(format!("{} size is {}", self.id, self.size())); retval.add_meta(format!( "Start write into map_data addr + ${:02X}", diff --git a/vera/tests/tilemap.rs b/vera/tests/tilemap.rs index 21e990e..012651b 100644 --- a/vera/tests/tilemap.rs +++ b/vera/tests/tilemap.rs @@ -139,6 +139,10 @@ fn tilemap_text_8_x_8() -> Result<(), Error> { let asm = code.assemble_data(crate::AsmFormat::Ca65, false)?; println!("{}", asm.to_string(None)?); + // Conflated + let _asm = code.assemble_data(crate::AsmFormat::Ca65, true)?; + //println!("{}", asm.to_string(None)?); + Ok(()) }