Changed the instruction set in the engine

This commit is contained in:
jan 2025-01-06 14:02:34 +01:00
parent 6abfcbc811
commit af51204ed5
4 changed files with 21 additions and 10 deletions

2
Cargo.lock generated
View File

@ -539,7 +539,7 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "svc16"
version = "0.8.0"
version = "0.9.0"
dependencies = [
"anyhow",
"clap",

View File

@ -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"

View File

@ -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<Option<(u16, u16, u16)>, 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)
}
}

View File

@ -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;
}