refactoring!
This commit is contained in:
parent
001d3e434c
commit
4f0615b563
|
@ -0,0 +1,121 @@
|
|||
use std::{
|
||||
env,
|
||||
fs::File,
|
||||
io::{ErrorKind, Read},
|
||||
process::exit,
|
||||
};
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::memory::Mem;
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
struct Config {
|
||||
char_rom: Option<String>,
|
||||
rom: String,
|
||||
}
|
||||
|
||||
pub fn get_input(memory: &mut Mem) {
|
||||
let args: Vec<String> = env::args().collect();
|
||||
|
||||
match args.len() {
|
||||
0 => {
|
||||
println!("george-emu must be run in the terminal, don't know what went wrong here!");
|
||||
exit(1)
|
||||
}
|
||||
1 => {
|
||||
let config: Config = match File::open("./george.toml") {
|
||||
Ok(mut file) => {
|
||||
let mut string = String::new();
|
||||
file.read_to_string(&mut string).unwrap();
|
||||
toml::from_str(string.as_str()).unwrap()
|
||||
}
|
||||
Err(_) => {
|
||||
println!("couldn't find a `george.toml` in the current directory!");
|
||||
exit(1);
|
||||
}
|
||||
};
|
||||
let rom = match std::fs::File::open(config.rom) {
|
||||
Ok(file) => file,
|
||||
Err(error) => panic!("Couldn't open main rom! {:?}", error),
|
||||
};
|
||||
if let Err(error) = memory.load_rom(rom) {
|
||||
println!("{:?}", error);
|
||||
};
|
||||
}
|
||||
2 => match &args[1] as &str {
|
||||
"help" => {
|
||||
println!("ʕ·ᴥ·ʔ- george-emu is an emulator for george:");
|
||||
println!("https://git.augustkline.com/august/george\n");
|
||||
println!("commands:");
|
||||
println!(" help: print this help screen");
|
||||
println!(" help <command>: print help info for any command");
|
||||
println!(" rom <path>: load a rom/binary from path\n");
|
||||
println!("configuration:");
|
||||
println!(" george-emu searches for a `george.toml` in the current directory. in `george.toml` you can specify a path for the character rom using the key `char_rom` and the main rom/binary with the key `rom`");
|
||||
exit(0);
|
||||
}
|
||||
_ => {
|
||||
println!(
|
||||
"{:?} isn't a valid command!\n\nuse `{} help` to see all valid commands",
|
||||
&args[1], &args[0]
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
},
|
||||
3 => match &args[1] as &str {
|
||||
"help" => match &args[2] as &str {
|
||||
"rom" => {
|
||||
println!("{:?} rom <path>\nload a rom/binary from path", &args[0]);
|
||||
}
|
||||
_ => {
|
||||
println!(
|
||||
"{:?} isn't a valid command!\n\nuse `{} help` to see all valid commands",
|
||||
&args[2], &args[0]
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
},
|
||||
"rom" => {
|
||||
let rom = match std::fs::File::open(&args[2]) {
|
||||
Ok(file) => file,
|
||||
Err(error) => {
|
||||
match error.kind() {
|
||||
ErrorKind::NotFound => {
|
||||
println!("couldn't find the rom at {:?}", &args[2]);
|
||||
}
|
||||
ErrorKind::PermissionDenied => {
|
||||
println!(
|
||||
"didn't have sufficient permissions to open the rom at {:?}",
|
||||
&args[2]
|
||||
);
|
||||
}
|
||||
_ => {
|
||||
println!("something went wrong! try again in a moment? really not sure why you're getting this error");
|
||||
}
|
||||
}
|
||||
exit(1);
|
||||
}
|
||||
};
|
||||
if let Err(error) = memory.load_rom(rom) {
|
||||
println!("oh no! this rom couldn't be loaded: {:?}", error);
|
||||
exit(1);
|
||||
};
|
||||
}
|
||||
_ => {
|
||||
println!(
|
||||
"{:?} isn't a valid command!\n\nuse `{} help` to see all valid commands",
|
||||
&args[1], &args[0]
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
},
|
||||
_ => {
|
||||
println!(
|
||||
"too many arguments were provided!\n\nuse `{} help` to see all valid commands",
|
||||
&args[0]
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
190
src/main.rs
190
src/main.rs
|
@ -1,5 +1,4 @@
|
|||
// #![allow(dead_code)]
|
||||
|
||||
mod cli;
|
||||
mod cpu;
|
||||
mod error;
|
||||
mod instructions;
|
||||
|
@ -13,24 +12,15 @@ use crate::keyboard::Keyboard;
|
|||
use crate::memory::Mem;
|
||||
use crate::video::{Screen, TerminalRenderer};
|
||||
|
||||
use cli::get_input;
|
||||
use crossterm::execute;
|
||||
use crossterm::terminal::{size, Clear, ClearType, SetSize};
|
||||
// use cpu::CpuController;
|
||||
use memory::MemHandle;
|
||||
// use minifb::{Scale, ScaleMode, Window, WindowOptions};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use std::env;
|
||||
use std::io::ErrorKind;
|
||||
use std::process::exit;
|
||||
use std::io::{stdout, Result};
|
||||
use std::thread::{self, sleep};
|
||||
use std::time::Duration;
|
||||
use std::{
|
||||
fs::File,
|
||||
io::{stdout, Read, Result},
|
||||
path::PathBuf,
|
||||
str::FromStr,
|
||||
};
|
||||
|
||||
use crossterm::{
|
||||
cursor,
|
||||
|
@ -38,159 +28,51 @@ use crossterm::{
|
|||
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
|
||||
};
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
struct Config {
|
||||
char_rom: Option<String>,
|
||||
rom: String,
|
||||
}
|
||||
// For when we want to leave the terminal again :sigh:
|
||||
//
|
||||
// thread::spawn(move || {
|
||||
// let mut screen = Crtc::new(
|
||||
// screen_memory,
|
||||
// config.char_rom.as_ref(),
|
||||
// CpuController::new(screen_cpu_tx),
|
||||
// window_tx,
|
||||
// );
|
||||
// screen.run();
|
||||
// });
|
||||
|
||||
// let mut window = Window::new(
|
||||
// "ʕ·ᴥ·ʔ-☆",
|
||||
// 512,
|
||||
// 380,
|
||||
// WindowOptions {
|
||||
// resize: true,
|
||||
// borderless: true,
|
||||
// title: true,
|
||||
// transparency: false,
|
||||
// scale: Scale::X2,
|
||||
// scale_mode: ScaleMode::AspectRatioStretch,
|
||||
// topmost: false,
|
||||
// none: true,
|
||||
// },
|
||||
// )
|
||||
// .unwrap();
|
||||
|
||||
fn main() -> Result<()> {
|
||||
let args: Vec<String> = env::args().collect();
|
||||
|
||||
let mut memory = Mem::new();
|
||||
match args.len() {
|
||||
0 => {
|
||||
println!("george-emu must be run in the terminal, don't know what went wrong here!");
|
||||
exit(1)
|
||||
}
|
||||
1 => {
|
||||
let config: Config = match File::open("./george.toml") {
|
||||
Ok(mut file) => {
|
||||
let mut string = String::new();
|
||||
file.read_to_string(&mut string).unwrap();
|
||||
toml::from_str(string.as_str()).unwrap()
|
||||
}
|
||||
Err(_) => {
|
||||
println!("couldn't find a `george.toml` in the current directory!");
|
||||
exit(1);
|
||||
}
|
||||
};
|
||||
let rom = match std::fs::File::open(config.rom) {
|
||||
Ok(file) => file,
|
||||
Err(error) => panic!("Couldn't open main rom! {:?}", error),
|
||||
};
|
||||
if let Err(error) = memory.load_rom(rom) {
|
||||
println!("{:?}", error);
|
||||
};
|
||||
}
|
||||
2 => match &args[1] as &str {
|
||||
"help" => {
|
||||
println!("ʕ·ᴥ·ʔ- george-emu is an emulator for george:");
|
||||
println!("https://git.augustkline.com/august/george\n");
|
||||
println!("commands:");
|
||||
println!(" help: print this help screen");
|
||||
println!(" help <command>: print help info for any command");
|
||||
println!(" rom <path>: load a rom/binary from path\n");
|
||||
println!("configuration:");
|
||||
println!(" george-emu searches for a `george.toml` in the current directory. in `george.toml` you can specify a path for the character rom using the key `char_rom` and the main rom/binary with the key `rom`");
|
||||
exit(0);
|
||||
}
|
||||
_ => {
|
||||
println!(
|
||||
"{:?} isn't a valid command!\n\nuse `{} help` to see all valid commands",
|
||||
&args[1], &args[0]
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
},
|
||||
3 => match &args[1] as &str {
|
||||
"help" => match &args[2] as &str {
|
||||
"rom" => {
|
||||
println!("{:?} rom <path>\nload a rom/binary from path", &args[0]);
|
||||
}
|
||||
_ => {
|
||||
println!(
|
||||
"{:?} isn't a valid command!\n\nuse `{} help` to see all valid commands",
|
||||
&args[2], &args[0]
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
},
|
||||
"rom" => {
|
||||
let rom = match std::fs::File::open(&args[2]) {
|
||||
Ok(file) => file,
|
||||
Err(error) => {
|
||||
match error.kind() {
|
||||
ErrorKind::NotFound => {
|
||||
println!("couldn't find the rom at {:?}", &args[2]);
|
||||
}
|
||||
ErrorKind::PermissionDenied => {
|
||||
println!(
|
||||
"didn't have sufficient permissions to open the rom at {:?}",
|
||||
&args[2]
|
||||
);
|
||||
}
|
||||
_ => {
|
||||
println!("something went wrong! try again in a moment? really not sure why you're getting this error");
|
||||
}
|
||||
}
|
||||
exit(1);
|
||||
}
|
||||
};
|
||||
if let Err(error) = memory.load_rom(rom) {
|
||||
println!("oh no! this rom couldn't be loaded: {:?}", error);
|
||||
exit(1);
|
||||
};
|
||||
}
|
||||
_ => {
|
||||
println!(
|
||||
"{:?} isn't a valid command!\n\nuse `{} help` to see all valid commands",
|
||||
&args[1], &args[0]
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
},
|
||||
_ => {
|
||||
println!(
|
||||
"too many arguments were provided!\n\nuse `{} help` to see all valid commands",
|
||||
&args[0]
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
let mut stdout = stdout();
|
||||
let (cols, rows) = size()?;
|
||||
|
||||
let mut memory = Mem::new();
|
||||
|
||||
get_input(&mut memory);
|
||||
|
||||
execute!(stdout, SetSize(64, 29), cursor::Hide, EnterAlternateScreen)?;
|
||||
enable_raw_mode()?;
|
||||
|
||||
memory
|
||||
.dump(PathBuf::from_str("./coredump.bin").unwrap())
|
||||
.unwrap();
|
||||
|
||||
let shared_memory = MemHandle::new(memory);
|
||||
let screen_memory = shared_memory.clone();
|
||||
let cpu_memory = shared_memory.clone();
|
||||
let keyboard_memory = shared_memory.clone();
|
||||
|
||||
// For when we want to leave the terminal again :sigh:
|
||||
//
|
||||
// thread::spawn(move || {
|
||||
// let mut screen = Crtc::new(
|
||||
// screen_memory,
|
||||
// config.char_rom.as_ref(),
|
||||
// CpuController::new(screen_cpu_tx),
|
||||
// window_tx,
|
||||
// );
|
||||
// screen.run();
|
||||
// });
|
||||
|
||||
// let mut window = Window::new(
|
||||
// "ʕ·ᴥ·ʔ-☆",
|
||||
// 512,
|
||||
// 380,
|
||||
// WindowOptions {
|
||||
// resize: true,
|
||||
// borderless: true,
|
||||
// title: true,
|
||||
// transparency: false,
|
||||
// scale: Scale::X2,
|
||||
// scale_mode: ScaleMode::AspectRatioStretch,
|
||||
// topmost: false,
|
||||
// none: true,
|
||||
// },
|
||||
// )
|
||||
// .unwrap();
|
||||
|
||||
let keyboard = Keyboard::new(keyboard_memory);
|
||||
|
||||
let (mut cpu, cpu_controller) = Cpu::new_with_control(cpu_memory);
|
||||
|
|
Loading…
Reference in New Issue