use std::{fs::File, io, path::Path};
use gumdrop::Options;
use siso::{chips::Rom, Ibm5150};
use tracing::Level;
use tracing_subscriber::FmtSubscriber;
#[derive(Debug, Options)]
struct SisoOptions {
#[options(help = "print help message")]
help: bool,
#[options(help = "path to the BIOS")]
bios: String,
#[options(help = "path to the Cassette BASIC ROMs (BASIC##.ROM)")]
cassette_basic: Option<String>,
}
fn main() -> io::Result<()> {
let subscriber = FmtSubscriber::builder()
.with_max_level(Level::TRACE)
.finish();
tracing::subscriber::set_global_default(subscriber).expect("setting default subscriber failed");
let opts = SisoOptions::parse_args_default_or_exit();
let bios_rom = Rom::load(File::open(opts.bios)?)?;
let cassette_basic = if let Some(dir) = opts.cassette_basic {
let dir = Path::new(&dir);
Some([
Rom::load(File::open(dir.join("BASICF6.ROM"))?)?,
Rom::load(File::open(dir.join("BASICF8.ROM"))?)?,
Rom::load(File::open(dir.join("BASICFA.ROM"))?)?,
Rom::load(File::open(dir.join("BASICFC.ROM"))?)?,
])
} else {
None
};
let mut machine = Ibm5150::new(bios_rom, cassette_basic);
machine.run();
Ok(())
}