diff options
| Commit | 991e6fdd96296bf7bcbee10c47c4f56dd1f83cf9 (patch) | |
|---|---|---|
| Author | 2025-02-14 13:28:22 +0200 | |
| Committer | 2025-02-14 13:28:39 +0200 | |
| Files | 56026c30dfd88759af455ebfd3787e1cd06b2720 | |
| tonkobali-991e6fdd96296bf7bcbee10c47c4f56dd1f83cf9.tar tonkobali-991e6fdd96296bf7bcbee10c47c4f56dd1f83cf9.tar.gz tonkobali-991e6fdd96296bf7bcbee10c47c4f56dd1f83cf9.zip | ||
| Parent | 5df95aaf466c2e2beaa321c380d03a4df7d07aaa (diff) | |
feat(vm): Proper cli
6 files changed, 279 insertions, 39 deletions
| -rw-r--r-- | Cargo.lock | 237 | ||||
| -rw-r--r-- | vm/Cargo.toml | 1 | ||||
| -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 |
@@ -3,9 +3,246 @@ version = 3 [[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys", +] + +[[package]] name = "assembler" version = "0.1.0" [[package]] +name = "clap" +version = "4.5.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acebd8ad879283633b343856142139f2da2317c96b05b4dd6181c61e2480184" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ba32cbda51c7e1dfd49acc1457ba1a7dec5b64fe360e828acb13ca8dc9c2f9" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "once_cell" +version = "1.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" + +[[package]] +name = "proc-macro2" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] name = "vm" version = "0.1.0" +dependencies = [ + "clap", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/vm/Cargo.toml b/vm/Cargo.toml index bd9b36a..64f9841 100644 --- a/vm/Cargo.toml +++ b/vm/Cargo.toml @@ -4,3 +4,4 @@ version = "0.1.0" edition = "2021" [dependencies] +clap = { version = "4.5.29", features = ["derive"] } 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, } } |
