Website Summary Files Commits Branches @commit @diff @stats
path: root / vm / src
diff options
context:
space:
mode:
Commit991e6fdd96296bf7bcbee10c47c4f56dd1f83cf9 (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-02-14 13:28:22 +0200
Committer
 Syndamia <kamen@syndamia.com>
2025-02-14 13:28:39 +0200
Files56026c30dfd88759af455ebfd3787e1cd06b2720 /vm/src
tonkobali-991e6fdd96296bf7bcbee10c47c4f56dd1f83cf9.tar
tonkobali-991e6fdd96296bf7bcbee10c47c4f56dd1f83cf9.tar.gz
tonkobali-991e6fdd96296bf7bcbee10c47c4f56dd1f83cf9.zip
Parent5df95aaf466c2e2beaa321c380d03a4df7d07aaa (diff)
feat(vm): Proper cli
4 files changed, 41 insertions, 39 deletions
-rw-r--r--vm/src/main.rs47
-rw-r--r--vm/src/vm/mod.rs21
-rw-r--r--vm/src/vm/primitive.rs8
-rw-r--r--vm/src/vmm/mod.rs4
diff --git a/vm/src/main.rs b/vm/src/main.rs
index 0076ba1..b3907ea 100644
--- a/vm/src/main.rs
+++ b/vm/src/main.rs
@@ -1,29 +1,32 @@
-use std::{
- sync::Arc, thread
-};
-
mod vm;
-use vm::{ VirtualMachine, VirtualMachineInterface };
mod vmm;
+
+use std::{ sync::Arc, thread };
+use clap::Parser;
+
+use vm::{ VirtualMachine, VirtualMachineInterface };
use vmm::VirtualMachineMonitor;
+#[derive(Parser, Debug)]
+#[command(about, long_about = None)]
+struct Args {
+ binary_path: Option<String>,
+
+ #[arg(short, long, default_value_t = 10)]
+ tick_gap: u64,
+
+ #[arg(short, long, default_value_t = 500)]
+ refresh: u64,
+}
+
fn main() {
- /* This is a simple program: calculate 331 + 95 in address 5 (answer 426)
- *
- * > ADD 331, 95
- * > JMP 0
- *
- * > subleq 331, 0
- * > subleq 0, 95
- * > subleq 0, 0
- * > subleq 0, 0, 0
- *
- * > subleq 3, 0, next
- * > subleq 0, 4, next
- * > subleq 0, 0, next
- * > subleq 0, 0, 0
- */
- let vm = VirtualMachine::create_from_file("./program.bin");
+ let args = Args::parse();
+
+ let vm = if let Some(path) = &args.binary_path {
+ VirtualMachine::create_from_file(args.tick_gap, path)
+ } else {
+ VirtualMachine::create(args.tick_gap)
+ };
let _vm_handle = {
let vm = Arc::clone(&vm);
@@ -32,6 +35,6 @@ fn main() {
})
};
- let mut monitor = VirtualMachineMonitor::new();
+ let mut monitor = VirtualMachineMonitor::new(args.refresh);
monitor.start(vm);
}
diff --git a/vm/src/vm/mod.rs b/vm/src/vm/mod.rs
index 2f8e96e..5545e43 100644
--- a/vm/src/vm/mod.rs
+++ b/vm/src/vm/mod.rs
@@ -11,30 +11,29 @@ use memory::Word;
pub(crate) type VirtualMachine = Arc<Mutex<PrimitiveVirtualMachine>>;
pub(crate) trait VirtualMachineInterface {
- fn create() -> VirtualMachine;
- fn create_with_memory(mem: &Vec<Word>) -> VirtualMachine;
- fn create_from_file(path: &str) -> VirtualMachine;
+ fn create(tick_gap: u64) -> VirtualMachine;
+ fn create_from_file(tick_gap: u64, path: &str) -> VirtualMachine;
fn start(&self);
fn get_word(&self, index: usize) -> Word;
}
-impl VirtualMachineInterface for VirtualMachine {
- fn create() -> VirtualMachine {
- Arc::new(Mutex::new(PrimitiveVirtualMachine::new()))
- }
+fn create_with_memory(tick_gap: u64, mem: &Vec<Word>) -> VirtualMachine {
+ Arc::new(Mutex::new(PrimitiveVirtualMachine::new_with_memory(tick_gap, mem)))
+}
- fn create_with_memory(mem: &Vec<Word>) -> VirtualMachine {
- Arc::new(Mutex::new(PrimitiveVirtualMachine::new_with_memory(mem)))
+impl VirtualMachineInterface for VirtualMachine {
+ fn create(tick_gap: u64) -> VirtualMachine {
+ Arc::new(Mutex::new(PrimitiveVirtualMachine::new(tick_gap)))
}
- fn create_from_file(path: &str) -> VirtualMachine {
+ fn create_from_file(tick_gap: u64, path: &str) -> VirtualMachine {
let file = fs::read(path).unwrap();
let numbers = &file
.chunks_exact(8)
.map(|x| Word::from_be_bytes(x.try_into().unwrap()))
.collect();
- Self::create_with_memory(numbers)
+ create_with_memory(tick_gap, numbers)
}
fn start(&self) {
diff --git a/vm/src/vm/primitive.rs b/vm/src/vm/primitive.rs
index c7eda45..6b0a7c8 100644
--- a/vm/src/vm/primitive.rs
+++ b/vm/src/vm/primitive.rs
@@ -19,18 +19,18 @@ pub struct PrimitiveVirtualMachine {
}
impl PrimitiveVirtualMachine {
- pub fn new() -> PrimitiveVirtualMachine {
+ pub fn new(tick_gap: u64) -> PrimitiveVirtualMachine {
PrimitiveVirtualMachine {
- tick_gap: 100,
halted: false,
+ tick_gap,
..Default::default()
}
}
- pub fn new_with_memory(mem: &Vec<Word>) -> PrimitiveVirtualMachine {
+ pub fn new_with_memory(tick_gap: u64, mem: &Vec<Word>) -> PrimitiveVirtualMachine {
PrimitiveVirtualMachine {
- tick_gap: 100,
halted: false,
+ tick_gap,
mem: Memory::new_from(mem),
}
}
diff --git a/vm/src/vmm/mod.rs b/vm/src/vmm/mod.rs
index 41e3184..ac08ffe 100644
--- a/vm/src/vmm/mod.rs
+++ b/vm/src/vmm/mod.rs
@@ -10,9 +10,9 @@ pub(crate) struct VirtualMachineMonitor {
}
impl VirtualMachineMonitor {
- pub(crate) fn new() -> VirtualMachineMonitor {
+ pub(crate) fn new(refresh_rate: u64) -> VirtualMachineMonitor {
VirtualMachineMonitor {
- refresh_rate: 500,
+ refresh_rate,
}
}