diff options
| Commit | c4b754fbbc144695c77b443771315f1a71efddde (patch) | |
|---|---|---|
| Author | 2025-02-14 00:45:59 +0200 | |
| Committer | 2025-02-14 00:45:59 +0200 | |
| Files | 89f57800020c52e85afcbaaebf0d2391ad6d6606 /vm/src | |
| tonkobali-c4b754fbbc144695c77b443771315f1a71efddde.tar tonkobali-c4b754fbbc144695c77b443771315f1a71efddde.tar.gz tonkobali-c4b754fbbc144695c77b443771315f1a71efddde.zip | ||
| Parent | 13bc44e09c4e0cb2f4e9f90843716624e4c1cde1 (diff) | |
feat(vm): Read from binary file
2 files changed, 15 insertions, 28 deletions
| -rw-r--r-- | vm/src/main.rs | 29 | ||||
| -rw-r--r-- | vm/src/vm/mod.rs | 14 |
diff --git a/vm/src/main.rs b/vm/src/main.rs index 69ede65..211cdc7 100644 --- a/vm/src/main.rs +++ b/vm/src/main.rs @@ -1,5 +1,6 @@ -use std::sync::Arc; -use std::thread; +use std::{ + sync::Arc, thread +}; mod vm; use vm::{ VirtualMachine, VirtualMachineInterface }; @@ -22,29 +23,7 @@ fn main() { * > subleq 0, 0, next * > subleq 0, 0, 0 */ - let vm = VirtualMachine::create_with_memory(&vec![ - /* 0 */ 0, - /* 1 */ -1, - /* 2 */ 5, - /* 3 */ 331, - /* 4 */ 95, - - /* 5 */ 3, - /* 6 */ 0, - /* 7 */ 8, - - /* 8 */ 0, - /* 9 */ 4, - /* 10 */ 11, - - /* 11 */ 0, - /* 12 */ 0, - /* 13 */ 14, - - /* 14 */ 0, - /* 15 */ 0, - /* 16 */ 0, - ]); + let vm = VirtualMachine::create_from_file("../assembler/program.bin"); let _vm_handle = { let vm = Arc::clone(&vm); diff --git a/vm/src/vm/mod.rs b/vm/src/vm/mod.rs index bf83391..2f8e96e 100644 --- a/vm/src/vm/mod.rs +++ b/vm/src/vm/mod.rs @@ -2,9 +2,7 @@ mod primitive; mod memory; use std::{ - sync::{ Arc, Mutex }, - thread, - time + sync::{ Arc, Mutex }, thread, time, fs }; use primitive::PrimitiveVirtualMachine; @@ -15,6 +13,7 @@ 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 start(&self); fn get_word(&self, index: usize) -> Word; @@ -29,6 +28,15 @@ impl VirtualMachineInterface for VirtualMachine { Arc::new(Mutex::new(PrimitiveVirtualMachine::new_with_memory(mem))) } + fn create_from_file(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) + } + fn start(&self) { let tick_gap = { let vm = (*self).lock().unwrap(); |
