diff options
| Commit | e7656f12d0ab604c40df10d6777ddb8c608a5bfd (patch) | |
|---|---|---|
| Author | 2025-02-15 09:05:27 +0200 | |
| Committer | 2025-02-15 09:05:27 +0200 | |
| Files | f091122e6d24011b828030f35b5abeaa316c4b95 /vm/src/vmm/command.rs | |
| tonkobali-e7656f12d0ab604c40df10d6777ddb8c608a5bfd.tar tonkobali-e7656f12d0ab604c40df10d6777ddb8c608a5bfd.tar.gz tonkobali-e7656f12d0ab604c40df10d6777ddb8c608a5bfd.zip | ||
| Parent | cde6e64005b8cc1b426b1aea15398eb7acb11d08 (diff) | |
feat(vm): Single-step mode
1 files changed, 31 insertions, 0 deletions
| -rw-r--r-- | vm/src/vmm/command.rs | 31 |
diff --git a/vm/src/vmm/command.rs b/vm/src/vmm/command.rs index 628a30f..6791663 100644 --- a/vm/src/vmm/command.rs +++ b/vm/src/vmm/command.rs @@ -71,6 +71,7 @@ pub(super) fn parse_and_exec(input: String, vm: &mut VirtualMachine) -> Result<( } match args[0] { + /* Run mode */ "r" | "run" => { expects_n_args(&args, 1)?; if ! vm.is_halted() { @@ -78,6 +79,36 @@ pub(super) fn parse_and_exec(input: String, vm: &mut VirtualMachine) -> Result<( } vm.set_start(args[1].parse().unwrap()); }, + + /* Single step mode */ + "s" | "single" => { + expects_n_args(&args, 1)?; + if ! vm.is_halted() { + return Err(format!("Machine already running!")); + } + if vm.is_single_step() { + return Err(format!("Machine already in single-step mode!")); + } + vm.set_single_step(true); + vm.set_start(args[1].parse().unwrap()); + }, + "c" | "continue" => { + expects_n_args(&args, 0)?; + if ! vm.is_single_step() { + return Err(format!("Machine not in single-step mode!")); + } + vm.set_single_step(false); + vm.set_halt(false); + }, + "n" | "next" => { + expects_n_args(&args, 0)?; + if ! vm.is_single_step() { + return Err(format!("Machine not in single-step mode!")); + } + vm.step(); + }, + + /* Other */ "q" | "quit" | "e" | "exit" => return Err(String::new()), _ => { for arg in args { |
