[args] Accept the rom filename as arg

This commit is contained in:
2024-03-05 20:10:53 +05:30
parent 6c0d48b749
commit 8702fe7363
2 changed files with 16 additions and 11 deletions

View File

@@ -2,7 +2,7 @@ use clap::Parser;
#[derive(Parser,Debug,Clone)] #[derive(Parser,Debug,Clone)]
#[command(version,about,author)] #[command(version,about,author)]
pub struct Chip8ProgramArgs{ pub struct Porcel8ProgramArgs {
#[arg(short,long,help = "Filename of ROM to load.")] #[arg(short,long,help = "Filename of ROM to load.")]
pub filename:Option<String> pub filename:Option<String>
} }

View File

@@ -4,6 +4,7 @@ use std::sync::{Arc, Mutex};
use std::sync::mpsc::Receiver; use std::sync::mpsc::Receiver;
use std::thread; use std::thread;
use std::time::Duration; use std::time::Duration;
use clap::Parser;
use log::LevelFilter; use log::LevelFilter;
use sdl2::audio::{AudioQueue, AudioSpecDesired}; use sdl2::audio::{AudioQueue, AudioSpecDesired};
use sdl2::event::Event; use sdl2::event::Event;
@@ -15,6 +16,7 @@ use sdl2::render::BlendMode;
use sdl2::render::WindowCanvas; use sdl2::render::WindowCanvas;
use simple_logger::SimpleLogger; use simple_logger::SimpleLogger;
use device::timer::Timer; use device::timer::Timer;
use crate::args::Porcel8ProgramArgs;
use crate::device::Device; use crate::device::Device;
use crate::device::keyboard::Keyboard; use crate::device::keyboard::Keyboard;
use crate::util::EmulatorResult; use crate::util::EmulatorResult;
@@ -31,6 +33,7 @@ mod sdl_keyboard_adapter;
fn main() -> EmulatorResult<()> { fn main() -> EmulatorResult<()> {
SimpleLogger::new().with_level(LevelFilter::Info).env().init().unwrap(); SimpleLogger::new().with_level(LevelFilter::Info).env().init().unwrap();
let Porcel8ProgramArgs { filename } = Porcel8ProgramArgs::parse();
log::info!("Started emulator"); log::info!("Started emulator");
let mut timer = Timer::new(); let mut timer = Timer::new();
@@ -38,12 +41,12 @@ fn main() -> EmulatorResult<()> {
let (frame_buffer_for_display, frame_buffer_for_device) = get_frame_buffer_references(); let (frame_buffer_for_display, frame_buffer_for_device) = get_frame_buffer_references();
let (sdl_kb_adapter,device_keyboard) = SdlKeyboardAdapter::new_keyboard(); let (sdl_kb_adapter, device_keyboard) = SdlKeyboardAdapter::new_keyboard();
let (termination_signal_sender, termination_signal_sender_receiver) = std::sync::mpsc::channel(); let (termination_signal_sender, termination_signal_sender_receiver) = std::sync::mpsc::channel();
let compute_handle = thread::Builder::new().name("Compute".to_string()).spawn(move || { let compute_handle = thread::Builder::new().name("Compute".to_string()).spawn(move || {
do_device_loop(timer, frame_buffer_for_device, termination_signal_sender_receiver, device_keyboard); do_device_loop(timer, frame_buffer_for_device, termination_signal_sender_receiver, device_keyboard, filename);
})?; })?;
let (mut canvas, mut event_pump) = try_initiate_sdl(8f32)?; let (mut canvas, mut event_pump) = try_initiate_sdl(8f32)?;
@@ -86,19 +89,21 @@ fn main() -> EmulatorResult<()> {
canvas.present(); canvas.present();
// 60fps - small offset to consider for cpu cycle time // 60fps - small offset to consider for cpu cycle time
thread::sleep(Duration::new(0, 1_000_000_000u32 / 60 )); thread::sleep(Duration::new(0, 1_000_000_000u32 / 60));
} }
compute_handle.join().expect("Failed to close compute thread"); compute_handle.join().expect("Failed to close compute thread");
Ok(()) Ok(())
} }
fn do_device_loop(mut timer: Timer, frame_buffer: Arc<Mutex<Box<[bool; 2048]>>>, receiver: Receiver<()>, device_keyboard: Keyboard) { fn do_device_loop(mut timer: Timer, frame_buffer: Arc<Mutex<Box<[bool; 2048]>>>, receiver: Receiver<()>, device_keyboard: Keyboard, rom_file_location_option: Option<String>) {
let mut device = Device::new(timer, frame_buffer, device_keyboard); let mut device = Device::new(timer, frame_buffer, device_keyboard);
device.set_default_font(); device.set_default_font();
{
let rom = load_rom(); if let Some(rom_file_location) = rom_file_location_option {
let rom = load_rom(rom_file_location);
device.load_rom(&rom); device.load_rom(&rom);
} }
loop { loop {
@@ -118,14 +123,14 @@ fn do_device_loop(mut timer: Timer, frame_buffer: Arc<Mutex<Box<[bool; 2048]>>>,
fn get_frame_buffer_references() -> (Arc<Mutex<Box<[bool; 2048]>>>, Arc<Mutex<Box<[bool; 2048]>>>) { fn get_frame_buffer_references() -> (Arc<Mutex<Box<[bool; 2048]>>>, Arc<Mutex<Box<[bool; 2048]>>>) {
let arc = Arc::new(Mutex::new(vec![false; Device::FRAME_BUFFER_SIZE].into_boxed_slice().try_into().unwrap())); let arc = Arc::new(Mutex::new(vec![false; Device::FRAME_BUFFER_SIZE].into_boxed_slice().try_into().unwrap()));
let arc2 = Arc::clone(&arc); let arc2 = Arc::clone(&arc);
(arc,arc2) (arc, arc2)
} }
const ROM_SIZE: usize = 4096 - 0x200; const ROM_SIZE: usize = 4096 - 0x200;
fn load_rom() -> [u8; ROM_SIZE] { fn load_rom(rom_file_location: String) -> [u8; ROM_SIZE] {
let mut rom_slice = [0u8; ROM_SIZE]; let mut rom_slice = [0u8; ROM_SIZE];
let mut file = File::open("roms/ibm_logo.ch8").expect("could not open"); let mut file = File::open(rom_file_location).expect("could not open");
file.read(&mut rom_slice).expect("Unwrap"); file.read(&mut rom_slice).expect("Unwrap");
rom_slice rom_slice
} }