From 444e9a4bc8b42e369b6b98376ddb8be2318286c4 Mon Sep 17 00:00:00 2001 From: Jonathan Balls Date: Thu, 12 Sep 2024 21:22:45 +0100 Subject: [PATCH] Handle CLI options with clap and allow enabling doctor mode via an atomic bool --- Cargo.lock | 120 ++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/debugger/mod.rs | 9 ++++ src/main.rs | 29 +++++++++-- 4 files changed, 156 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 264cb2a..29a40de 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,55 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "anstream" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" + +[[package]] +name = "anstyle-parse" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + [[package]] name = "autocfg" version = "1.3.0" @@ -47,6 +96,52 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "clap" +version = "4.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "colorchoice" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" + [[package]] name = "colored" version = "2.1.0" @@ -61,6 +156,7 @@ dependencies = [ name = "cowboy" version = "0.1.0" dependencies = [ + "clap", "colored", "ctrlc", "minifb", @@ -197,6 +293,12 @@ dependencies = [ "slab", ] +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "instant" version = "0.1.13" @@ -209,6 +311,12 @@ dependencies = [ "web-sys", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itoa" version = "1.0.11" @@ -504,6 +612,12 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "syn" version = "2.0.77" @@ -534,6 +648,12 @@ version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "version-compare" version = "0.1.1" diff --git a/Cargo.toml b/Cargo.toml index e6135ea..5e3148d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] +clap = { version = "4.5.17", features = ["derive"] } colored = "2.1.0" ctrlc = "3.4" minifb = "0.27" diff --git a/src/debugger/mod.rs b/src/debugger/mod.rs index 0b5a38f..e9aa935 100644 --- a/src/debugger/mod.rs +++ b/src/debugger/mod.rs @@ -2,6 +2,7 @@ use std::sync::atomic::{AtomicBool, Ordering}; use crate::gameboy::GameBoy; pub static DEBUG_MODE: AtomicBool = AtomicBool::new(false); +pub static GAMEBOY_DOCTOR: AtomicBool = AtomicBool::new(false); pub fn enable_debug() { DEBUG_MODE.store(true, Ordering::SeqCst); @@ -15,6 +16,14 @@ pub fn is_debug_enabled() -> bool { DEBUG_MODE.load(Ordering::SeqCst) } +pub fn enable_gameboy_doctor() { + GAMEBOY_DOCTOR.store(true, Ordering::SeqCst); +} + +pub fn is_gameboy_doctor() -> bool { + GAMEBOY_DOCTOR.load(Ordering::SeqCst) +} + pub fn debugger_cli(gameboy: &mut GameBoy) { gameboy.debugger_cli(); } diff --git a/src/main.rs b/src/main.rs index dc0e493..115f3a6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,8 +7,9 @@ pub mod mmu; mod renderer; use cartridge::header::CartridgeHeader; +use clap::Parser; use colored::*; -use debugger::{enable_debug, is_debug_enabled}; +use debugger::{enable_debug, enable_gameboy_doctor, is_debug_enabled}; use std::fs::File; use std::io::Read; use std::process::exit; @@ -24,10 +25,32 @@ use renderer::window_loop; pub static DEBUG_MODE: AtomicBool = AtomicBool::new(false); +/// Simple program to greet a person +#[derive(Parser, Debug)] +#[command(version, about, long_about = None)] +struct Args { + /// Whether to enable the doctor or not. + #[arg(short, long, default_value_t = false)] + doctor: bool, + + rom_path: Option, +} + fn main() { + let args = Args::parse(); + + let rom_path = match args.rom_path { + Some(path) => path, + _ => "roms/super-mario-land.gb".to_string(), + }; + + if args.doctor { + enable_gameboy_doctor(); + } + let (tx, rx) = mpsc::channel::(); let (tx_key, rx_key) = mpsc::channel::<(bool, Key)>(); - let rom = read_file_to_bytes("roms/super-mario-land.gb").unwrap(); + let rom = read_file_to_bytes(rom_path.as_str()).unwrap(); let game_title = CartridgeHeader::new(&rom).unwrap().title(); let _ = thread::spawn(move || emulator_loop(rom, tx, rx_key)); @@ -45,7 +68,7 @@ fn emulator_loop(rom: Vec, tx: Sender, rx: Receiver<(bool, Key)>) { } else { // If running, pause the emulator enable_debug(); - println!("Received Ctrl+C! Pausing at the end of this step..."); + println!("{}", "Received Ctrl+C! Entering debugger.".red()); } }) .expect("Error setting Ctrl-C handler");