monistode_emulator_bindings/
lib.rs

1mod utils;
2use std::u8;
3
4use crate::memory::{MemoryBlock, MemoryType};
5use crate::processor::{WasmProcessor, WasmProcessorContinue};
6use processors::{create_processor, ProcessorType};
7use registers::RegisterState;
8use wasm_bindgen::prelude::*;
9
10pub use processors::available_processors;
11mod memory;
12mod processor;
13mod processors;
14mod registers;
15
16#[wasm_bindgen]
17pub struct Runner {
18    processor: Box<dyn WasmProcessor>,
19    message: Result<(), String>,
20}
21
22#[wasm_bindgen]
23impl Runner {
24    #[wasm_bindgen(constructor)]
25    pub fn new(processor_type: ProcessorType, binary: &[u8]) -> Self {
26        let (processor, message) = create_processor(processor_type, binary);
27        Runner { processor, message }
28    }
29
30    #[wasm_bindgen]
31    pub fn run(
32        &mut self,
33        output: &js_sys::Function,
34        input: &js_sys::Function,
35    ) -> WasmProcessorContinue {
36        self.processor.run(output, input)
37    }
38
39    #[wasm_bindgen]
40    pub fn run_n(
41        &mut self,
42        output: &js_sys::Function,
43        input: &js_sys::Function,
44        n: usize,
45    ) -> WasmProcessorContinue {
46        self.processor.run_n(output, input, n)
47    }
48
49    #[wasm_bindgen]
50    pub fn get_memory(&mut self) -> Vec<MemoryBlock> {
51        self.processor.get_memory()
52    }
53
54    #[wasm_bindgen]
55    pub fn set_memory(&mut self, mem_type: MemoryType, index: usize, value: u8) -> bool {
56        self.processor.set_memory(mem_type, index, value)
57    }
58
59    #[wasm_bindgen]
60    pub fn get_registers(&mut self) -> Vec<RegisterState> {
61        self.processor.get_registers()
62    }
63
64    #[wasm_bindgen]
65    pub fn error_message(&self) -> Option<String> {
66        match &self.message {
67            Ok(_) => None,
68            Err(message) => Some(message.clone()),
69        }
70    }
71}