Add flag to just run the CPU

This commit is contained in:
pjht 2022-11-18 16:19:20 -06:00
parent 0b1a8e1398
commit a9d79025cf
3 changed files with 74 additions and 2 deletions

46
Cargo.lock generated
View File

@ -108,13 +108,28 @@ checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5"
dependencies = [ dependencies = [
"atty", "atty",
"bitflags", "bitflags",
"clap_derive",
"clap_lex", "clap_lex",
"indexmap", "indexmap",
"once_cell",
"strsim", "strsim",
"termcolor", "termcolor",
"textwrap", "textwrap",
] ]
[[package]]
name = "clap_derive"
version = "3.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65"
dependencies = [
"heck",
"proc-macro-error",
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "clap_lex" name = "clap_lex"
version = "0.2.4" version = "0.2.4"
@ -438,6 +453,7 @@ dependencies = [
"anyhow", "anyhow",
"bitflags", "bitflags",
"bitvec", "bitvec",
"clap",
"derive-try-from-primitive", "derive-try-from-primitive",
"elf", "elf",
"human-repr", "human-repr",
@ -555,6 +571,30 @@ dependencies = [
"num-traits", "num-traits",
] ]
[[package]]
name = "proc-macro-error"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
dependencies = [
"proc-macro-error-attr",
"proc-macro2",
"quote",
"syn",
"version_check",
]
[[package]]
name = "proc-macro-error-attr"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
dependencies = [
"proc-macro2",
"quote",
"version_check",
]
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.47" version = "1.0.47"
@ -856,6 +896,12 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372" checksum = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372"
[[package]]
name = "version_check"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
[[package]] [[package]]
name = "vte" name = "vte"
version = "0.10.1" version = "0.10.1"

View File

@ -9,6 +9,7 @@ edition = "2021"
anyhow = "1.0.66" anyhow = "1.0.66"
bitflags = "1.3.2" bitflags = "1.3.2"
bitvec = "1.0.0" bitvec = "1.0.0"
clap = { version = "3.2.23", features = ["clap_derive", "derive"] }
derive-try-from-primitive = "1.0.0" derive-try-from-primitive = "1.0.0"
elf = "0.7.0" elf = "0.7.0"
human-repr = { version = "1.0.1", features = ["iec", "space"] } human-repr = { version = "1.0.1", features = ["iec", "space"] }

View File

@ -20,6 +20,7 @@ use crate::{
m68k::{BusError, M68K}, m68k::{BusError, M68K},
}; };
use anyhow::anyhow; use anyhow::anyhow;
use clap::Parser;
use disas::DisassemblyError; use disas::DisassemblyError;
use indexmap::IndexSet; use indexmap::IndexSet;
use itertools::Itertools; use itertools::Itertools;
@ -46,7 +47,18 @@ struct EmuState {
address_breakpoints: IndexSet<u32>, address_breakpoints: IndexSet<u32>,
} }
/// 68K Backplane Computer Emulator
#[derive(Parser, Debug)]
#[clap(name = "68KEmu", author, version, about, long_about = None)]
struct Args {
/// Just run the CPU instad of starting a REPL
#[clap(short, long)]
run: bool,
}
fn main() -> Result<(), anyhow::Error> { fn main() -> Result<(), anyhow::Error> {
let args = Args::parse();
let config_str = fs::read_to_string("config.toml") let config_str = fs::read_to_string("config.toml")
.map_err(|e| anyhow!("Could not read config file ({})", e))?; .map_err(|e| anyhow!("Could not read config file ({})", e))?;
let config: EmuConfig = let config: EmuConfig =
@ -58,11 +70,24 @@ fn main() -> Result<(), anyhow::Error> {
symbol_tables.load_table(path, true)?; symbol_tables.load_table(path, true)?;
} }
} }
Repl::<_, anyhow::Error>::new(EmuState { let mut state = EmuState {
cpu: M68K::new(backplane), cpu: M68K::new(backplane),
symbol_tables, symbol_tables,
address_breakpoints: IndexSet::new(), address_breakpoints: IndexSet::new(),
}) };
if args.run {
let mut out = String::new();
while !state.cpu.stopped {
state.cpu.step();
}
out += &format!("{}\n", state.cpu);
let pc = state.cpu.pc();
out += &disas_fmt(&mut state.cpu, pc, &state.symbol_tables).0;
out.pop(); // Remove trailing newline
println!("{}", out);
return Ok(());
}
Repl::<_, anyhow::Error>::new(state)
.with_name("68KEmu") .with_name("68KEmu")
.with_version("0.1.0") .with_version("0.1.0")
.with_banner("68K Backplane Computer Emulator") .with_banner("68K Backplane Computer Emulator")