siso 0.1.0

IBM 5150 emulator
Documentation
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(())
}