diff --git a/Cargo.lock b/Cargo.lock index d54d8eb..a974489 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1346,7 +1346,7 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "svc16" -version = "0.4.0" +version = "0.4.1" dependencies = [ "anyhow", "clap", diff --git a/Cargo.toml b/Cargo.toml index 45cc29c..66e6fbc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "svc16" -version = "0.4.0" +version = "0.4.1" edition = "2021" authors = ["Jan Neuendorf"] description = "An emulator for a simple virtual computer" diff --git a/src/engine.rs b/src/engine.rs index 0a2c34f..6ef09c7 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -1,7 +1,7 @@ use std::ops::{BitAnd, BitXor}; use thiserror::Error; -const MEMSIZE: usize = u16::MAX as usize + 1; +pub const MEMSIZE: usize = u16::MAX as usize + 1; const SET: u16 = 0; const GOTO: u16 = 1; @@ -71,10 +71,15 @@ impl Engine { self.pos_code = pos_code; self.key_code = key_code; } - pub fn perform_sync(&mut self, pos_code: u16, key_code: u16) -> [u16; MEMSIZE] { + pub fn perform_sync( + &mut self, + pos_code: u16, + key_code: u16, + buffer: &mut [u16; MEMSIZE], + ) -> () { self.set_input(pos_code, key_code); self.sync_called = false; - return self.screen.clone(); + *buffer = self.screen; } } impl Engine { diff --git a/src/main.rs b/src/main.rs index 9574b02..cce8450 100644 --- a/src/main.rs +++ b/src/main.rs @@ -49,6 +49,8 @@ fn main() -> Result<()> { Pixels::new(RES as u32, RES as u32, surface_texture)? }; + let mut raw_buffer = [0 as u16; engine::MEMSIZE]; + event_loop.run(|event, elwt| { let start_time = Instant::now(); if input.update(&event) { @@ -65,6 +67,7 @@ fn main() -> Result<()> { } let mut ipf = 0; + let engine_start = Instant::now(); while !engine.wants_to_sync() && ipf <= cli.max_ipf { match engine.step() { Err(_) => { @@ -75,13 +78,19 @@ fn main() -> Result<()> { } ipf += 1; } + let engine_elapsed = engine_start.elapsed(); let (c1, c2) = get_input_code(&input, &pixels); - let nb = engine.perform_sync(c1, c2); - update_image_buffer(pixels.frame_mut(), &nb); + engine.perform_sync(c1, c2, &mut raw_buffer); + update_image_buffer(pixels.frame_mut(), &raw_buffer); let elapsed = start_time.elapsed(); if cli.verbose { - println!("Instructions: {} Frametime: {}ms", ipf, elapsed.as_millis()); + println!( + "Instructions: {} Frametime: {}ms (Engine only: {}ms)", + ipf, + elapsed.as_millis(), + engine_elapsed.as_millis() + ); } if elapsed < FRAMETIME { std::thread::sleep(FRAMETIME - elapsed);