aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/audio.rs6
-rw-r--r--src/desktop/audio.rs12
-rw-r--r--src/desktop/input.rs43
-rw-r--r--src/desktop/load_save.rs17
-rw-r--r--src/desktop/serial.rs92
-rw-r--r--src/desktop/window.rs117
-rw-r--r--src/display.rs2
-rw-r--r--src/io.rs28
-rw-r--r--src/logs.rs24
-rw-r--r--src/main.rs28
-rw-r--r--src/mmio.rs23
-rw-r--r--src/opcodes.rs15
-rw-r--r--src/state.rs22
13 files changed, 253 insertions, 176 deletions
diff --git a/src/audio.rs b/src/audio.rs
index 427ca26..50bd2be 100644
--- a/src/audio.rs
+++ b/src/audio.rs
@@ -383,7 +383,7 @@ pub struct AudioSquareChannel {
pub left: bool,
pub right: bool,
pub left_volume: u8,
- pub right_volume: u8
+ pub right_volume: u8,
}
impl AudioSquareChannel {
@@ -455,7 +455,7 @@ pub struct AudioCustomChannel {
pub left: bool,
pub right: bool,
pub left_volume: u8,
- pub right_volume: u8
+ pub right_volume: u8,
}
impl AudioCustomChannel {
@@ -526,7 +526,7 @@ pub struct AudioNoiseChannel {
pub left: bool,
pub right: bool,
pub left_volume: u8,
- pub right_volume: u8
+ pub right_volume: u8,
}
impl AudioNoiseChannel {
diff --git a/src/desktop/audio.rs b/src/desktop/audio.rs
index 486b41c..a6905f8 100644
--- a/src/desktop/audio.rs
+++ b/src/desktop/audio.rs
@@ -1,9 +1,9 @@
use rodio::{OutputStream, Sink, Source};
-use crate::audio::{SAMPLE_RATE, MutableWave};
-use crate::io::{Wave, Audio};
-use std::time::Duration;
+use crate::audio::{MutableWave, SAMPLE_RATE};
+use crate::io::{Audio, Wave};
use std::mem;
+use std::time::Duration;
const BUFFER_SIZE: usize = 1024;
@@ -17,8 +17,7 @@ pub struct RodioAudio {
struct RodioWave<W: Wave + Send + 'static>(W, usize);
-impl<W: Wave + Send + 'static> Iterator for RodioWave<W>
-{
+impl<W: Wave + Send + 'static> Iterator for RodioWave<W> {
type Item = f32;
fn next(&mut self) -> Option<Self::Item> {
@@ -40,8 +39,7 @@ impl<I: Iterator<Item = f32>> Iterator for RodioBuffer<I> {
}
}
-impl<I: Iterator<Item = f32>> Source for RodioBuffer<I>
-{
+impl<I: Iterator<Item = f32>> Source for RodioBuffer<I> {
fn current_frame_len(&self) -> Option<usize> {
None
}
diff --git a/src/desktop/input.rs b/src/desktop/input.rs
index 4653d3c..bc8b29d 100644
--- a/src/desktop/input.rs
+++ b/src/desktop/input.rs
@@ -3,9 +3,9 @@ use std::io::{ErrorKind, Read, Write};
use crate::desktop::window::Keys;
use crate::io::Input;
+use crate::logs::{elog, log, LogLevel};
use gilrs::{Button, GamepadId, Gilrs};
use winit::keyboard::KeyCode;
-use crate::logs::{elog, log, LogLevel};
pub struct Gamepad {
gilrs: Gilrs,
@@ -18,7 +18,10 @@ impl Gamepad {
let gilrs = Gilrs::new().unwrap();
let gamepad_id = if let Some((gamepad_id, _gamepad)) = gilrs.gamepads().next() {
- log(LogLevel::Infos, format!("Gamepad connected: {:?}", gamepad_id));
+ log(
+ LogLevel::Infos,
+ format!("Gamepad connected: {:?}", gamepad_id),
+ );
Some(gamepad_id)
} else {
log(LogLevel::Infos, format!("No gamepad found"));
@@ -45,12 +48,18 @@ impl Input for Gamepad {
fn update_events(&mut self, _cycles: u128) -> Option<u128> {
if let Some(gamepad_id) = self.gamepad_id {
if self.gilrs.connected_gamepad(gamepad_id).is_none() {
- log(LogLevel::Infos, format!("Gamepad disconnected: {:?}", gamepad_id));
+ log(
+ LogLevel::Infos,
+ format!("Gamepad disconnected: {:?}", gamepad_id),
+ );
self.gamepad_id = None;
}
} else {
if let Some((gamepad_id, _gamepad)) = self.gilrs.gamepads().next() {
- log(LogLevel::Infos, format!("Gamepad connected: {:?}", gamepad_id));
+ log(
+ LogLevel::Infos,
+ format!("Gamepad connected: {:?}", gamepad_id),
+ );
self.gamepad_id = Some(gamepad_id);
}
}
@@ -227,21 +236,33 @@ impl Input for GamepadRecorder {
let new_direction_reg = self.input.get_direction_gamepad_reg();
if self.action_reg != new_action_reg || self.direction_reg != new_direction_reg {
- log(LogLevel::Debug, format!(
- "input update on cycle {} ! 0x{:02x} 0x{:02x}",
- cycles, new_action_reg, new_direction_reg
- ));
+ log(
+ LogLevel::Debug,
+ format!(
+ "input update on cycle {} ! 0x{:02x} 0x{:02x}",
+ cycles, new_action_reg, new_direction_reg
+ ),
+ );
if let Err(err) = self.record_file.write_all(&cycles.to_le_bytes()) {
- elog(LogLevel::Error, format!("Failed to write to record file: {}", err));
+ elog(
+ LogLevel::Error,
+ format!("Failed to write to record file: {}", err),
+ );
};
if let Err(err) = self
.record_file
.write_all(&[new_action_reg, new_direction_reg])
{
- elog(LogLevel::Error, format!("Failed to write to record file: {}", err));
+ elog(
+ LogLevel::Error,
+ format!("Failed to write to record file: {}", err),
+ );
}
if let Err(err) = self.record_file.flush() {
- elog(LogLevel::Error, format!("Failed to flush record file writes: {}", err));
+ elog(
+ LogLevel::Error,
+ format!("Failed to flush record file writes: {}", err),
+ );
}
}
diff --git a/src/desktop/load_save.rs b/src/desktop/load_save.rs
index ec99d94..e80e029 100644
--- a/src/desktop/load_save.rs
+++ b/src/desktop/load_save.rs
@@ -1,8 +1,8 @@
use crate::io::{Audio, LoadSave, Serial};
+use crate::logs::{elog, log, LogLevel};
use crate::state::GBState;
use std::fs::File;
use std::io::{Read, Write};
-use crate::logs::{elog, log, LogLevel};
#[derive(Debug)]
pub struct FSLoadSave {
@@ -62,7 +62,10 @@ impl LoadSave for FSLoadSave {
f.read(external_ram)?;
- log(LogLevel::Infos, format!("Save file loaded from \"{}\"!", self.save_file));
+ log(
+ LogLevel::Infos,
+ format!("Save file loaded from \"{}\"!", self.save_file),
+ );
Ok(())
}
@@ -72,7 +75,10 @@ impl LoadSave for FSLoadSave {
f.write_all(&external_ram)?;
- log(LogLevel::Infos, format!("Save written to \"{}\"!", self.save_file));
+ log(
+ LogLevel::Infos,
+ format!("Save written to \"{}\"!", self.save_file),
+ );
Ok(())
}
@@ -147,7 +153,10 @@ impl LoadSave for FSLoadSave {
state_file.write_all(&state.cpu.sp.to_le_bytes())?;
state_file.write_all(&[state.mem.boot_rom_on.into(), state.mem.ime.into()])?;
} else {
- elog(LogLevel::Error, format!("Tried to save state without state_file specified"));
+ elog(
+ LogLevel::Error,
+ format!("Tried to save state without state_file specified"),
+ );
}
Ok(())
}
diff --git a/src/desktop/serial.rs b/src/desktop/serial.rs
index d8fc2e3..36cfba8 100644
--- a/src/desktop/serial.rs
+++ b/src/desktop/serial.rs
@@ -1,11 +1,11 @@
use std::fs::File;
use std::io::{Read, Write};
-use std::sync::mpsc::{self, Receiver, Sender};
use std::net::{TcpListener, TcpStream};
+use std::sync::mpsc::{self, Receiver, Sender};
use std::thread;
-use crate::io::Serial;
use crate::consts::CPU_CLOCK_SPEED;
+use crate::io::Serial;
pub struct UnconnectedSerial {}
@@ -16,10 +16,8 @@ impl Serial for UnconnectedSerial {
fn read_control(&self) -> u8 {
0
}
- fn write_data(&mut self, _data: u8) {
- }
- fn write_control(&mut self, _control: u8) {
- }
+ fn write_data(&mut self, _data: u8) {}
+ fn write_control(&mut self, _control: u8) {}
fn update_serial(&mut self, _cycles: u128) -> bool {
false
}
@@ -82,8 +80,8 @@ impl Serial for FIFOSerial {
}
fn read_control(&self) -> u8 {
- (if self.external_clock { 0 } else { 0x01 }) |
- (if self.transfer_requested { 0x80 } else { 0 })
+ (if self.external_clock { 0 } else { 0x01 })
+ | (if self.transfer_requested { 0x80 } else { 0 })
}
fn write_data(&mut self, data: u8) {
@@ -112,18 +110,17 @@ impl Serial for FIFOSerial {
self.transfer_requested = false;
}
true
- } else if !self.external_clock && !self.current_transfer
- && self.transfer_requested {
- if cycles > self.next_byte_transfer_cycle {
- self.output.send(self.current_data).unwrap();
- self.current_transfer = true;
- if self.no_response {
- self.current_data = 0;
- self.transfer_requested = false;
- self.next_byte_transfer_cycle = cycles + ((CPU_CLOCK_SPEED as u128) / 1024);
- self.current_transfer = false;
- }
+ } else if !self.external_clock && !self.current_transfer && self.transfer_requested {
+ if cycles > self.next_byte_transfer_cycle {
+ self.output.send(self.current_data).unwrap();
+ self.current_transfer = true;
+ if self.no_response {
+ self.current_data = 0;
+ self.transfer_requested = false;
+ self.next_byte_transfer_cycle = cycles + ((CPU_CLOCK_SPEED as u128) / 1024);
+ self.current_transfer = false;
}
+ }
false
} else {
false
@@ -147,22 +144,20 @@ pub struct TcpSerial {
impl TcpSerial {
pub fn handle_stream(mut stream: TcpStream, tx: Sender<u8>, rx: Receiver<u8>) {
- let mut stream_clone = stream.try_clone().unwrap();
- thread::spawn(move || {
- loop {
- let mut byte = [0];
+ let mut stream_clone = stream.try_clone().unwrap();
+ thread::spawn(move || loop {
+ let mut byte = [0];
- stream_clone.read(&mut byte).unwrap();
+ stream_clone.read(&mut byte).unwrap();
- tx.send(byte[0]).unwrap();
- }
- });
+ tx.send(byte[0]).unwrap();
+ });
- thread::spawn(move || {
- for b in rx.iter() {
- stream.write(&[b]).unwrap();
- }
- });
+ thread::spawn(move || {
+ for b in rx.iter() {
+ stream.write(&[b]).unwrap();
+ }
+ });
}
pub fn new_listener(port: u16, no_response: bool) -> Self {
@@ -174,7 +169,7 @@ impl TcpSerial {
println!("Connection on {:?}", addr);
Self::handle_stream(socket, tx, rx);
}
- _ => ()
+ _ => (),
};
});
@@ -197,9 +192,9 @@ impl TcpSerial {
let (tx, input) = mpsc::channel::<u8>();
let (output, rx) = mpsc::channel::<u8>();
thread::spawn(move || {
- if let Ok(socket) = TcpStream::connect(&addr) {
- println!("Connected to {:?}", addr);
- Self::handle_stream(socket, tx, rx);
+ if let Ok(socket) = TcpStream::connect(&addr) {
+ println!("Connected to {:?}", addr);
+ Self::handle_stream(socket, tx, rx);
}
});
@@ -225,8 +220,8 @@ impl Serial for TcpSerial {
}
fn read_control(&self) -> u8 {
- (if self.external_clock { 0 } else { 0x01 }) |
- (if self.transfer_requested { 0x80 } else { 0 })
+ (if self.external_clock { 0 } else { 0x01 })
+ | (if self.transfer_requested { 0x80 } else { 0 })
}
fn write_data(&mut self, data: u8) {
@@ -259,18 +254,17 @@ impl Serial for TcpSerial {
}
self.next_byte_transfer_cycle = cycles + ((CPU_CLOCK_SPEED as u128) / 16384);
true
- } else if !self.external_clock && !self.current_transfer
- && self.transfer_requested {
- if cycles > self.next_byte_transfer_cycle {
- self.output.send(self.current_data).unwrap();
- self.current_transfer = true;
- if self.no_response {
- self.current_data = 0;
- self.transfer_requested = false;
- self.next_byte_transfer_cycle = cycles + ((CPU_CLOCK_SPEED as u128) / 1024);
- self.current_transfer = false;
- }
+ } else if !self.external_clock && !self.current_transfer && self.transfer_requested {
+ if cycles > self.next_byte_transfer_cycle {
+ self.output.send(self.current_data).unwrap();
+ self.current_transfer = true;
+ if self.no_response {
+ self.current_data = 0;
+ self.transfer_requested = false;
+ self.next_byte_transfer_cycle = cycles + ((CPU_CLOCK_SPEED as u128) / 1024);
+ self.current_transfer = false;
}
+ }
false
} else {
false
diff --git a/src/desktop/window.rs b/src/desktop/window.rs
index 93c5aba..0d5bd8c 100644
--- a/src/desktop/window.rs
+++ b/src/desktop/window.rs
@@ -1,6 +1,6 @@
use std::collections::HashSet;
-use std::sync::{Arc, Mutex};
use std::sync::mpsc::{channel, Receiver, Sender};
+use std::sync::{Arc, Mutex};
use std::thread;
use crate::io::{Window, WindowSignal};
@@ -12,7 +12,7 @@ use winit::event::{Event, WindowEvent};
use winit::event_loop::EventLoopBuilder;
use winit::keyboard::{KeyCode, PhysicalKey};
use winit::platform::wayland::EventLoopBuilderExtWayland;
-use winit::window::{WindowBuilder};
+use winit::window::WindowBuilder;
use winit_input_helper::WinitInputHelper;
const WIDTH: u32 = 160;
@@ -37,7 +37,10 @@ impl DesktopWindow {
let key_eventloop = keys.clone();
thread::spawn(move || {
let keys = key_eventloop;
- let event_loop = EventLoopBuilder::new().with_any_thread(true).build().unwrap();
+ let event_loop = EventLoopBuilder::new()
+ .with_any_thread(true)
+ .build()
+ .unwrap();
let mut input = WinitInputHelper::new();
let window = Arc::new({
let size = LogicalSize::new((WIDTH * 4) as f64, (HEIGHT * 4) as f64);
@@ -57,68 +60,71 @@ impl DesktopWindow {
};
let mut fb = Box::new([0; 160 * 144]);
event_loop
- .run(|event, elwt| {
- if let Event::WindowEvent {
- event: WindowEvent::RedrawRequested,
- ..
- } = event
- {
- loop {
- if let Ok(new_fb) = fb_recv.try_recv() {
- fb = new_fb;
- } else {
- break;
- }
- }
- draw(pixels.frame_mut(), &fb);
- if let Err(err) = pixels.render() {
- elog(LogLevel::Error, format!("Error during render: {}", err));
- return;
- }
- }
-
- if let Event::WindowEvent {
- window_id: _,
- event:
- WindowEvent::KeyboardInput {
- device_id: _,
- event: ref keyboard_event,
- is_synthetic: _,
- },
- } = event
- {
- if let Ok(mut keys) = keys.lock() {
- if let PhysicalKey::Code(keycode) = keyboard_event.physical_key {
- if keyboard_event.state.is_pressed() {
- (*keys).insert(keycode);
+ .run(|event, elwt| {
+ if let Event::WindowEvent {
+ event: WindowEvent::RedrawRequested,
+ ..
+ } = event
+ {
+ loop {
+ if let Ok(new_fb) = fb_recv.try_recv() {
+ fb = new_fb;
} else {
- (*keys).remove(&keycode);
+ break;
}
}
+ draw(pixels.frame_mut(), &fb);
+ if let Err(err) = pixels.render() {
+ elog(LogLevel::Error, format!("Error during render: {}", err));
+ return;
+ }
}
- }
- if input.update(&event) {
- if input.close_requested() {
- elwt.exit();
- if let Err(err) = signal_send.send(WindowSignal::Exit) {
- elog(LogLevel::Error, format!("window signal send failed with error {}", err));
+ if let Event::WindowEvent {
+ window_id: _,
+ event:
+ WindowEvent::KeyboardInput {
+ device_id: _,
+ event: ref keyboard_event,
+ is_synthetic: _,
+ },
+ } = event
+ {
+ if let Ok(mut keys) = keys.lock() {
+ if let PhysicalKey::Code(keycode) = keyboard_event.physical_key {
+ if keyboard_event.state.is_pressed() {
+ (*keys).insert(keycode);
+ } else {
+ (*keys).remove(&keycode);
+ }
+ }
}
- return;
}
- if let Some(size) = input.window_resized() {
- if let Err(err) = pixels.resize_surface(size.width, size.height) {
- elog(LogLevel::Error, format!("Error during resize: {}", err));
+ if input.update(&event) {
+ if input.close_requested() {
+ elwt.exit();
+ if let Err(err) = signal_send.send(WindowSignal::Exit) {
+ elog(
+ LogLevel::Error,
+ format!("window signal send failed with error {}", err),
+ );
+ }
return;
}
- }
- window.request_redraw();
- }
- }).unwrap();
- });
+ if let Some(size) = input.window_resized() {
+ if let Err(err) = pixels.resize_surface(size.width, size.height) {
+ elog(LogLevel::Error, format!("Error during resize: {}", err));
+ return;
+ }
+ }
+ window.request_redraw();
+ }
+ })
+ .unwrap();
+ });
Ok(Self {
fb_send,
@@ -131,7 +137,10 @@ impl DesktopWindow {
impl Window for DesktopWindow {
fn update(&mut self, fb: Box<[u32; 160 * 144]>) -> Option<WindowSignal> {
if let Err(err) = self.fb_send.send(fb) {
- elog(LogLevel::Error, format!("Framebuffer channel send failed with error: {}", err));
+ elog(
+ LogLevel::Error,
+ format!("Framebuffer channel send failed with error: {}", err),
+ );
}
if let Ok(signal) = self.signal_recv.try_recv() {
diff --git a/src/display.rs b/src/display.rs
index 7ef95fe..1b76b79 100644
--- a/src/display.rs
+++ b/src/display.rs
@@ -1,8 +1,8 @@
// Very readable, much clean wow.
use crate::consts::DISPLAY_UPDATE_SLEEP_TIME_MICROS;
-use std::time::SystemTime;
use std::mem;
+use std::time::SystemTime;
const COLORS: [u32; 4] = [0x00e0f8d0, 0x0088c070, 0x346856, 0x00081820];
diff --git a/src/io.rs b/src/io.rs
index 8cc7b22..730fc55 100644
--- a/src/io.rs
+++ b/src/io.rs
@@ -3,8 +3,8 @@ use std::{thread, time};
use crate::audio::MutableWave;
use crate::consts;
+use crate::logs::{elog, log, LogLevel};
use crate::state::GBState;
-use crate::logs::{log, elog, LogLevel};
pub trait Input {
fn update_events(&mut self, cycles: u128) -> Option<u128>;
@@ -105,14 +105,22 @@ impl<I: Input, W: Window, S: Serial, A: Audio, LS: LoadSave> Gameboy<I, W, S, A,
load_save,
};
- gb.load_save.load_bootrom(gb.state.mem.boot_rom.as_mut()).unwrap();
+ gb.load_save
+ .load_bootrom(gb.state.mem.boot_rom.as_mut())
+ .unwrap();
gb.load_save.load_rom(gb.state.mem.rom.as_mut()).unwrap();
- if let Err(err) = gb.load_save.load_external_ram(gb.state.mem.external_ram.as_mut()) {
- log(LogLevel::Infos, format!(
- "Loading save failed ({}). Initializing new external ram.",
- err
- ));
+ if let Err(err) = gb
+ .load_save
+ .load_external_ram(gb.state.mem.external_ram.as_mut())
+ {
+ log(
+ LogLevel::Infos,
+ format!(
+ "Loading save failed ({}). Initializing new external ram.",
+ err
+ ),
+ );
}
gb
@@ -123,7 +131,6 @@ impl<I: Input, W: Window, S: Serial, A: Audio, LS: LoadSave> Gameboy<I, W, S, A,
Ok(())
}
-
pub fn dump_state(&mut self) -> Result<(), LS::Error> {
self.load_save.dump_state(&mut self.state)?;
Ok(())
@@ -228,7 +235,10 @@ impl<I: Input, W: Window, S: Serial, A: Audio, LS: LoadSave> Gameboy<I, W, S, A,
if last_ram_bank_enabled && !state.mem.ram_bank_enabled {
if let Err(err) = load_save.save_external_ram(state.mem.external_ram.as_ref()) {
- elog(LogLevel::Error, format!("Failed to save external RAM ({})", err));
+ elog(
+ LogLevel::Error,
+ format!("Failed to save external RAM ({})", err),
+ );
}
}
last_ram_bank_enabled = state.mem.ram_bank_enabled;
diff --git a/src/logs.rs b/src/logs.rs
index dc1dfc1..4eefc3e 100644
--- a/src/logs.rs
+++ b/src/logs.rs
@@ -1,5 +1,5 @@
-use std::sync::OnceLock;
use std::collections::HashSet;
+use std::sync::OnceLock;
#[derive(Debug, PartialEq, Hash, Eq)]
pub enum LogLevel {
@@ -16,12 +16,22 @@ pub fn set_log_level(verbosity: String) {
let mut set: HashSet<LogLevel> = HashSet::new();
for level in verbosity.split(",") {
match level {
- "infos" => { set.insert(LogLevel::Infos); },
- "debug" => { set.insert(LogLevel::Debug); },
- "opcode_dump" => { set.insert(LogLevel::OpcodeDump); },
- "halt_cycles" => { set.insert(LogLevel::HaltCycles); },
- "errors" => { set.insert(LogLevel::Error); },
- "none" => {},
+ "infos" => {
+ set.insert(LogLevel::Infos);
+ }
+ "debug" => {
+ set.insert(LogLevel::Debug);
+ }
+ "opcode_dump" => {
+ set.insert(LogLevel::OpcodeDump);
+ }
+ "halt_cycles" => {
+ set.insert(LogLevel::HaltCycles);
+ }
+ "errors" => {
+ set.insert(LogLevel::Error);
+ }
+ "none" => {}
_ => panic!("Unknown log level \"{}\"", level),
}
}
diff --git a/src/main.rs b/src/main.rs
index d247b77..8303fc3 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,15 +4,15 @@ pub mod desktop;
pub mod display;
pub mod interrupts_timers;
pub mod io;
+pub mod logs;
pub mod mmio;
pub mod opcodes;
pub mod state;
-pub mod logs;
-use crate::logs::{log, LogLevel};
use crate::desktop::input::{Gamepad, GamepadRecorder, GamepadReplay, Keyboard};
use crate::desktop::load_save::FSLoadSave;
-use crate::io::{Serial, Input};
+use crate::io::{Input, Serial};
+use crate::logs::{log, LogLevel};
use clap::Parser;
#[derive(Parser)]
@@ -66,7 +66,7 @@ struct Cli {
title: String,
/// Serial tcp listen port
- #[arg(short='L', long)]
+ #[arg(short = 'L', long)]
listen: Option<u16>,
/// Serial tcp connect address <address:port>
@@ -91,12 +91,20 @@ fn main() {
let window = desktop::window::DesktopWindow::new(cli.title).unwrap();
- let serial: Box<dyn Serial> = match (cli.fifo_input, cli.fifo_output, cli.listen, cli.connect) {
- (_, _, Some(port), _) => Box::new(desktop::serial::TcpSerial::new_listener(port, cli.no_response)),
- (_, _, _, Some(addr)) => Box::new(desktop::serial::TcpSerial::connect(addr, cli.no_response)),
- (Some(fifo_input), Some(fifo_output), _, _) => Box::new(desktop::serial::FIFOSerial::new(fifo_input, fifo_output, cli.no_response)),
- _ => Box::new(desktop::serial::UnconnectedSerial {})
- };
+ let serial: Box<dyn Serial> =
+ match (cli.fifo_input, cli.fifo_output, cli.listen, cli.connect) {
+ (_, _, Some(port), _) => Box::new(desktop::serial::TcpSerial::new_listener(
+ port,
+ cli.no_response,
+ )),
+ (_, _, _, Some(addr)) => {
+ Box::new(desktop::serial::TcpSerial::connect(addr, cli.no_response))
+ }
+ (Some(fifo_input), Some(fifo_output), _, _) => Box::new(
+ desktop::serial::FIFOSerial::new(fifo_input, fifo_output, cli.no_response),
+ ),
+ _ => Box::new(desktop::serial::UnconnectedSerial {}),
+ };
let mut gamepad: Box<dyn Input> = if let Some(record_file) = cli.replay_input {
Box::new(GamepadReplay::new(record_file))
diff --git a/src/mmio.rs b/src/mmio.rs
index 8c8739f..9c7e710 100644
--- a/src/mmio.rs
+++ b/src/mmio.rs
@@ -1,11 +1,14 @@
use crate::io::{Audio, Serial};
-use crate::state::Memory;
use crate::logs::{log, LogLevel};
+use crate::state::Memory;
impl<S: Serial, A: Audio> Memory<S, A> {
pub fn r_io(&self, addr: u8) -> u8 {
if addr > 0x50 {
- log(LogLevel::Debug, format!("Reading from 0xff{:02x} not implemented yet", addr));
+ log(
+ LogLevel::Debug,
+ format!("Reading from 0xff{:02x} not implemented yet", addr),
+ );
}
match addr {
0x00 => {
@@ -56,7 +59,10 @@ impl<S: Serial, A: Audio> Memory<S, A> {
}
}
_ => {
- log(LogLevel::Debug, format!("Reading from 0xff{:02x} not implemented yet", addr));
+ log(
+ LogLevel::Debug,
+ format!("Reading from 0xff{:02x} not implemented yet", addr),
+ );
self.io[addr as usize]
}
}
@@ -296,10 +302,13 @@ impl<S: Serial, A: Audio> Memory<S, A> {
}
_ => {
if addr != 0x25 && addr != 0x24 && addr != 0x26 && addr < 0x30 && addr > 0x3f {
- log(LogLevel::Debug, format!(
- "Writing to 0xff{:02x} not implemented yet ({:02x})",
- addr, value
- ));
+ log(
+ LogLevel::Debug,
+ format!(
+ "Writing to 0xff{:02x} not implemented yet ({:02x})",
+ addr, value
+ ),
+ );
}
}
}
diff --git a/src/opcodes.rs b/src/opcodes.rs
index 6405726..87d921e 100644
--- a/src/opcodes.rs
+++ b/src/opcodes.rs
@@ -1,6 +1,6 @@
use crate::io::{Audio, Serial};
-use crate::state::{flag, reg, GBState};
use crate::logs::{log, LogLevel};
+use crate::state::{flag, reg, GBState};
// The opcodes functions are returning the number of cycles used.
@@ -612,7 +612,7 @@ impl<S: Serial, A: Audio> GBState<S, A> {
0b010 => {
self.is_stopped = true;
4
- },
+ }
0b011 => self.jr8(),
_ => self.jrcc8(n1),
},
@@ -836,10 +836,13 @@ impl<S: Serial, A: Audio> GBState<S, A> {
pub fn exec_opcode(&mut self) -> u64 {
let opcode = self.mem.r(self.cpu.pc);
- log(LogLevel::OpcodeDump, format!(
- "{:02x}:{:04x} = {:02x} (IME: {})",
- self.mem.rom_bank, self.cpu.pc, opcode, self.mem.ime
- ));
+ log(
+ LogLevel::OpcodeDump,
+ format!(
+ "{:02x}:{:04x} = {:02x} (IME: {})",
+ self.mem.rom_bank, self.cpu.pc, opcode, self.mem.ime
+ ),
+ );
self.cpu.pc += 1;
diff --git a/src/state.rs b/src/state.rs
index 8c0832b..2867b15 100644
--- a/src/state.rs
+++ b/src/state.rs
@@ -241,10 +241,13 @@ impl<S: Serial, A: Audio> Memory<S, A> {
} else if addr == 0xffff {
self.interrupts_register
} else {
- log(LogLevel::Debug, format!(
- "Trying to read at address 0x{:04x} which is unimplemented",
- addr
- ));
+ log(
+ LogLevel::Debug,
+ format!(
+ "Trying to read at address 0x{:04x} which is unimplemented",
+ addr
+ ),
+ );
0
}
}
@@ -275,10 +278,13 @@ impl<S: Serial, A: Audio> Memory<S, A> {
} else if addr == 0xffff {
self.interrupts_register = value;
} else {
- log(LogLevel::Debug, format!(
- "Trying to write at address 0x{:04x} which is unimplemented (value: {:02x})",
- addr, value
- ));
+ log(
+ LogLevel::Debug,
+ format!(
+ "Trying to write at address 0x{:04x} which is unimplemented (value: {:02x})",
+ addr, value
+ ),
+ );
}
}
}