diff options
| Commit | 991e6fdd96296bf7bcbee10c47c4f56dd1f83cf9 (patch) | |
|---|---|---|
| Author | 2025-02-14 13:28:22 +0200 | |
| Committer | 2025-02-14 13:28:39 +0200 | |
| Files | 56026c30dfd88759af455ebfd3787e1cd06b2720 /vm/src | |
| tonkobali-991e6fdd96296bf7bcbee10c47c4f56dd1f83cf9.tar tonkobali-991e6fdd96296bf7bcbee10c47c4f56dd1f83cf9.tar.gz tonkobali-991e6fdd96296bf7bcbee10c47c4f56dd1f83cf9.zip | ||
| Parent | 5df95aaf466c2e2beaa321c380d03a4df7d07aaa (diff) | |
feat(vm): Proper cli
4 files changed, 41 insertions, 39 deletions
| -rw-r--r-- | vm/src/main.rs | 47 | ||||
| -rw-r--r-- | vm/src/vm/mod.rs | 21 | ||||
| -rw-r--r-- | vm/src/vm/primitive.rs | 8 | ||||
| -rw-r--r-- | vm/src/vmm/mod.rs | 4 |
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, } } |
