70 lines
1.6 KiB
Rust
70 lines
1.6 KiB
Rust
|
|
mod cpu_trait;
|
||
|
|
|
||
|
|
pub use cpu_trait::{CpuTrait, DebugMode, RunMode};
|
||
|
|
|
||
|
|
|
||
|
|
#[wasm_bindgen]
|
||
|
|
impl WasmCpu {
|
||
|
|
#[wasm_bindgen(constructor)]
|
||
|
|
pub fn new() -> Self {
|
||
|
|
WasmCpu {
|
||
|
|
memory: [0; 64 * 1024],
|
||
|
|
registers: [0; 8],
|
||
|
|
ip: 0,
|
||
|
|
sp: 0xFFFF,
|
||
|
|
flags: 0,
|
||
|
|
verbose: false,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
pub fn set_verbose(&mut self, verbose: bool) {
|
||
|
|
self.verbose = verbose;
|
||
|
|
}
|
||
|
|
|
||
|
|
pub fn load_memory(&mut self, memory: &[u8]) {
|
||
|
|
self.memory[..memory.len()].copy_from_slice(memory);
|
||
|
|
}
|
||
|
|
|
||
|
|
pub fn execute(&mut self, run_mode: RunMode) {
|
||
|
|
match run_mode {
|
||
|
|
RunMode::Run => self.run(),
|
||
|
|
RunMode::Debug(debug_mode) => self.debug(debug_mode),
|
||
|
|
RunMode::StepOver => self.step_over(),
|
||
|
|
RunMode::StepInto => self.step_into(),
|
||
|
|
RunMode::StepOut => self.step_out(),
|
||
|
|
RunMode::RunFor(cycles) => self.run_for(cycles),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
fn run(&mut self) {
|
||
|
|
while self.ip < self.memory.len() as u16 {
|
||
|
|
self.step();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
fn debug(&mut self, _debug_mode: DebugMode) {
|
||
|
|
// Implement debug functionality
|
||
|
|
}
|
||
|
|
|
||
|
|
fn run_for(&mut self, cycles: usize) {
|
||
|
|
for _ in 0..cycles {
|
||
|
|
self.step();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
fn step_over(&mut self) {
|
||
|
|
self.step(); // Placeholder for step-over functionality
|
||
|
|
}
|
||
|
|
|
||
|
|
fn step_into(&mut self) {
|
||
|
|
self.step(); // Placeholder for step-into functionality
|
||
|
|
}
|
||
|
|
|
||
|
|
fn step_out(&mut self) {
|
||
|
|
self.step(); // Placeholder for step-out functionality
|
||
|
|
}
|
||
|
|
|
||
|
|
fn step(&mut self) {
|
||
|
|
// Fetch and execute instructions
|
||
|
|
}
|
||
|
|
}
|