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]] [[package]]
name = "svc16" name = "svc16"
version = "0.8.0" version = "0.9.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"clap", "clap",

View File

@ -1,6 +1,6 @@
[package] [package]
name = "svc16" name = "svc16"
version = "0.8.0" version = "0.9.0"
edition = "2021" edition = "2021"
authors = ["Jan Neuendorf"] authors = ["Jan Neuendorf"]
description = "An emulator for a simple virtual computer" description = "An emulator for a simple virtual computer"

View File

@ -13,7 +13,7 @@ const DIV: u16 = 6;
const CMP: u16 = 7; const CMP: u16 = 7;
const DEREF: u16 = 8; const DEREF: u16 = 8;
const REF: u16 = 9; const REF: u16 = 9;
const INST: u16 = 10; const DEBUG: u16 = 10;
const PRINT: u16 = 11; const PRINT: u16 = 11;
const READ: u16 = 12; const READ: u16 = 12;
const BAND: u16 = 13; const BAND: u16 = 13;
@ -115,11 +115,15 @@ impl Engine {
fn advance_inst_ptr(&mut self) { fn advance_inst_ptr(&mut self) {
self.instruction_pointer = self.instruction_pointer.wrapping_add(4); 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(); let [opcode, arg1, arg2, arg3] = self.read_instruction();
match opcode { match opcode {
SET => { SET => {
self.set(arg1, arg2); let value = match arg3 {
0 => arg2,
_ => self.instruction_pointer,
};
self.set(arg1, value);
self.advance_inst_ptr(); self.advance_inst_ptr();
} }
GOTO => { GOTO => {
@ -177,10 +181,12 @@ impl Engine {
self.set(self.get(arg1) + arg3, value); self.set(self.get(arg1) + arg3, value);
self.advance_inst_ptr(); self.advance_inst_ptr();
} }
INST => { DEBUG => {
let value = self.instruction_pointer; let label = arg1;
self.set(arg1, value); let value1 = self.get(arg2);
let value2 = self.get(arg3);
self.advance_inst_ptr(); self.advance_inst_ptr();
return Ok(Some((label, value1, value2)));
} }
PRINT => { PRINT => {
if arg3 == 0 { if arg3 == 0 {
@ -219,6 +225,6 @@ impl Engine {
} }
_ => return Err(EngineError::InvalidInstruction(opcode)), _ => return Err(EngineError::InvalidInstruction(opcode)),
} }
Ok(()) Ok(None)
} }
} }

View File

@ -77,7 +77,12 @@ async fn main() -> Result<()> {
if !paused { if !paused {
ipf = 0; ipf = 0;
while !engine.wants_to_sync() && ipf <= MAX_IPF { 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; ipf += 1;
} }