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 cpu;
|
||||||
mod error;
|
mod error;
|
||||||
mod instructions;
|
mod instructions;
|
||||||
|
@ -13,24 +12,15 @@ use crate::keyboard::Keyboard;
|
||||||
use crate::memory::Mem;
|
use crate::memory::Mem;
|
||||||
use crate::video::{Screen, TerminalRenderer};
|
use crate::video::{Screen, TerminalRenderer};
|
||||||
|
|
||||||
|
use cli::get_input;
|
||||||
use crossterm::execute;
|
use crossterm::execute;
|
||||||
use crossterm::terminal::{size, Clear, ClearType, SetSize};
|
use crossterm::terminal::{size, Clear, ClearType, SetSize};
|
||||||
// use cpu::CpuController;
|
// use cpu::CpuController;
|
||||||
use memory::MemHandle;
|
use memory::MemHandle;
|
||||||
// use minifb::{Scale, ScaleMode, Window, WindowOptions};
|
// use minifb::{Scale, ScaleMode, Window, WindowOptions};
|
||||||
use serde::{Deserialize, Serialize};
|
use std::io::{stdout, Result};
|
||||||
|
|
||||||
use std::env;
|
|
||||||
use std::io::ErrorKind;
|
|
||||||
use std::process::exit;
|
|
||||||
use std::thread::{self, sleep};
|
use std::thread::{self, sleep};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use std::{
|
|
||||||
fs::File,
|
|
||||||
io::{stdout, Read, Result},
|
|
||||||
path::PathBuf,
|
|
||||||
str::FromStr,
|
|
||||||
};
|
|
||||||
|
|
||||||
use crossterm::{
|
use crossterm::{
|
||||||
cursor,
|
cursor,
|
||||||
|
@ -38,159 +28,51 @@ use crossterm::{
|
||||||
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
|
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug)]
|
// For when we want to leave the terminal again :sigh:
|
||||||
struct Config {
|
//
|
||||||
char_rom: Option<String>,
|
// thread::spawn(move || {
|
||||||
rom: String,
|
// 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<()> {
|
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 mut stdout = stdout();
|
||||||
let (cols, rows) = size()?;
|
let (cols, rows) = size()?;
|
||||||
|
|
||||||
|
let mut memory = Mem::new();
|
||||||
|
|
||||||
|
get_input(&mut memory);
|
||||||
|
|
||||||
execute!(stdout, SetSize(64, 29), cursor::Hide, EnterAlternateScreen)?;
|
execute!(stdout, SetSize(64, 29), cursor::Hide, EnterAlternateScreen)?;
|
||||||
enable_raw_mode()?;
|
enable_raw_mode()?;
|
||||||
|
|
||||||
memory
|
|
||||||
.dump(PathBuf::from_str("./coredump.bin").unwrap())
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let shared_memory = MemHandle::new(memory);
|
let shared_memory = MemHandle::new(memory);
|
||||||
let screen_memory = shared_memory.clone();
|
let screen_memory = shared_memory.clone();
|
||||||
let cpu_memory = shared_memory.clone();
|
let cpu_memory = shared_memory.clone();
|
||||||
let keyboard_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 keyboard = Keyboard::new(keyboard_memory);
|
||||||
|
|
||||||
let (mut cpu, cpu_controller) = Cpu::new_with_control(cpu_memory);
|
let (mut cpu, cpu_controller) = Cpu::new_with_control(cpu_memory);
|
||||||
|
|
Loading…
Reference in New Issue