diff options
-rw-r--r-- | src/audio.rs | 6 | ||||
-rw-r--r-- | src/desktop/audio.rs | 12 | ||||
-rw-r--r-- | src/desktop/input.rs | 43 | ||||
-rw-r--r-- | src/desktop/load_save.rs | 17 | ||||
-rw-r--r-- | src/desktop/serial.rs | 92 | ||||
-rw-r--r-- | src/desktop/window.rs | 117 | ||||
-rw-r--r-- | src/display.rs | 2 | ||||
-rw-r--r-- | src/io.rs | 28 | ||||
-rw-r--r-- | src/logs.rs | 24 | ||||
-rw-r--r-- | src/main.rs | 28 | ||||
-rw-r--r-- | src/mmio.rs | 23 | ||||
-rw-r--r-- | src/opcodes.rs | 15 | ||||
-rw-r--r-- | src/state.rs | 22 |
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]; @@ -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 + ), + ); } } } |