Website Summary Files Commits Branches @commit @diff @stats
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
tonkobali-991e6fdd96296bf7bcbee10c47c4f56dd1f83cf9.tar
tonkobali-991e6fdd96296bf7bcbee10c47c4f56dd1f83cf9.tar.gz
tonkobali-991e6fdd96296bf7bcbee10c47c4f56dd1f83cf9.zip
Parent5df95aaf466c2e2beaa321c380d03a4df7d07aaa (diff)
feat(vm): Proper cli
6 files changed, 279 insertions, 39 deletions
-rw-r--r--Cargo.lock237
-rw-r--r--vm/Cargo.toml1
-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/Cargo.lock b/Cargo.lock
index d9959a3..4d1cc57 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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,
}
}