Website Summary Files Commits Branches @commit @diff @stats
path: root / vm / src
diff options
context:
space:
mode:
Commitc4b754fbbc144695c77b443771315f1a71efddde (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-02-14 00:45:59 +0200
Committer
 Syndamia <kamen@syndamia.com>
2025-02-14 00:45:59 +0200
Files89f57800020c52e85afcbaaebf0d2391ad6d6606 /vm/src
tonkobali-c4b754fbbc144695c77b443771315f1a71efddde.tar
tonkobali-c4b754fbbc144695c77b443771315f1a71efddde.tar.gz
tonkobali-c4b754fbbc144695c77b443771315f1a71efddde.zip
Parent13bc44e09c4e0cb2f4e9f90843716624e4c1cde1 (diff)
feat(vm): Read from binary file
2 files changed, 15 insertions, 28 deletions
-rw-r--r--vm/src/main.rs29
-rw-r--r--vm/src/vm/mod.rs14
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();