From af51204ed5e671167551041e2e9ea21c4fa5b209 Mon Sep 17 00:00:00 2001 From: jan Date: Mon, 6 Jan 2025 14:02:34 +0100 Subject: [PATCH] Changed the instruction set in the engine --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/engine.rs | 20 +++++++++++++------- src/main.rs | 7 ++++++- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5314c11..3dc6655 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -539,7 +539,7 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "svc16" -version = "0.8.0" +version = "0.9.0" dependencies = [ "anyhow", "clap", diff --git a/Cargo.toml b/Cargo.toml index 01687a2..a86f7fd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "svc16" -version = "0.8.0" +version = "0.9.0" edition = "2021" authors = ["Jan Neuendorf"] description = "An emulator for a simple virtual computer" diff --git a/src/engine.rs b/src/engine.rs index b743314..9298673 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -13,7 +13,7 @@ const DIV: u16 = 6; const CMP: u16 = 7; const DEREF: u16 = 8; const REF: u16 = 9; -const INST: u16 = 10; +const DEBUG: u16 = 10; const PRINT: u16 = 11; const READ: u16 = 12; const BAND: u16 = 13; @@ -115,11 +115,15 @@ impl Engine { fn advance_inst_ptr(&mut self) { self.instruction_pointer = self.instruction_pointer.wrapping_add(4); } - pub fn step(&mut self) -> Result<(), EngineError> { + pub fn step(&mut self) -> Result, EngineError> { let [opcode, arg1, arg2, arg3] = self.read_instruction(); match opcode { SET => { - self.set(arg1, arg2); + let value = match arg3 { + 0 => arg2, + _ => self.instruction_pointer, + }; + self.set(arg1, value); self.advance_inst_ptr(); } GOTO => { @@ -177,10 +181,12 @@ impl Engine { self.set(self.get(arg1) + arg3, value); self.advance_inst_ptr(); } - INST => { - let value = self.instruction_pointer; - self.set(arg1, value); + DEBUG => { + let label = arg1; + let value1 = self.get(arg2); + let value2 = self.get(arg3); self.advance_inst_ptr(); + return Ok(Some((label, value1, value2))); } PRINT => { if arg3 == 0 { @@ -219,6 +225,6 @@ impl Engine { } _ => return Err(EngineError::InvalidInstruction(opcode)), } - Ok(()) + Ok(None) } } diff --git a/src/main.rs b/src/main.rs index a07b670..988a552 100644 --- a/src/main.rs +++ b/src/main.rs @@ -77,7 +77,12 @@ async fn main() -> Result<()> { if !paused { ipf = 0; while !engine.wants_to_sync() && ipf <= MAX_IPF { - engine.step()?; + if let Some(debug_output) = engine.step()? { + println!( + "DEBUG label: {} values: {}, {}", + debug_output.0, debug_output.1, debug_output.2 + ); + } ipf += 1; }