Website Summary Files Commits Branches @commit @diff @stats
path: root / vm / src / vmm / command.rs
diff options
context:
space:
mode:
Commite7656f12d0ab604c40df10d6777ddb8c608a5bfd (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-02-15 09:05:27 +0200
Committer
 Syndamia <kamen@syndamia.com>
2025-02-15 09:05:27 +0200
Filesf091122e6d24011b828030f35b5abeaa316c4b95 /vm/src/vmm/command.rs
tonkobali-e7656f12d0ab604c40df10d6777ddb8c608a5bfd.tar
tonkobali-e7656f12d0ab604c40df10d6777ddb8c608a5bfd.tar.gz
tonkobali-e7656f12d0ab604c40df10d6777ddb8c608a5bfd.zip
Parentcde6e64005b8cc1b426b1aea15398eb7acb11d08 (diff)
feat(vm): Single-step mode
1 files changed, 31 insertions, 0 deletions
-rw-r--r--vm/src/vmm/command.rs31
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 {