From 285bc28c80222d992c9713e049ea3335265955ea Mon Sep 17 00:00:00 2001 From: Thomas Epperson Date: Wed, 31 Jan 2024 15:21:22 -0600 Subject: [PATCH] Fix nes emulator to allow building without the debugger. --- common/src/input.rs | 2 +- common/src/storage.rs | 2 +- nes/rust/Cargo.toml | 2 +- nes/rust/src/cpu.rs | 6 ++- nes/rust/src/emulator_data.rs | 13 +++-- nes/rust/src/ppu.rs | 17 ++++--- nes/rust/src/windows/main.rs | 50 +++++++++++++++---- .../src/windows/name_table_dump_window.rs | 5 +- nes/rust/src/windows/sprite_dump_window.rs | 32 +++++++----- 9 files changed, 92 insertions(+), 37 deletions(-) diff --git a/common/src/input.rs b/common/src/input.rs index ff923f4..d8fd2f6 100644 --- a/common/src/input.rs +++ b/common/src/input.rs @@ -41,4 +41,4 @@ impl UserInput { UserInput::NoInput => "None".to_string(), } } -} \ No newline at end of file +} diff --git a/common/src/storage.rs b/common/src/storage.rs index f8c9089..2e72b1b 100644 --- a/common/src/storage.rs +++ b/common/src/storage.rs @@ -258,4 +258,4 @@ impl PersistentStorage { PersistentStorage::Volatile(v) => &mut v[..], } } -} \ No newline at end of file +} diff --git a/nes/rust/Cargo.toml b/nes/rust/Cargo.toml index 805daed..103a797 100644 --- a/nes/rust/Cargo.toml +++ b/nes/rust/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] -default = ["egui-multiwin", "debugger", "rom_status"] +default = ["egui-multiwin", "rom_status"] debugger = [] rom_status = [] puffin = ["dep:puffin", "dep:puffin_egui"] diff --git a/nes/rust/src/cpu.rs b/nes/rust/src/cpu.rs index 2744c25..c338b25 100644 --- a/nes/rust/src/cpu.rs +++ b/nes/rust/src/cpu.rs @@ -562,6 +562,7 @@ impl NesCpu { } /// Returns true when a breakpoint is active + #[cfg(feature = "debugger")] pub fn breakpoint(&self) -> bool { let mut b = false; if self.done_fetching { @@ -12549,7 +12550,10 @@ impl NesCpu { }, _ => { if s.subcycle == 1 { - s.copy_debugger(format!("*JAM ${:02x}", o)); + #[cfg(feature = "debugger")] + { + s.copy_debugger(format!("*JAM ${:02x}", o)); + } s.subcycle = 2; } } diff --git a/nes/rust/src/emulator_data.rs b/nes/rust/src/emulator_data.rs index 612d638..bd4ad7c 100644 --- a/nes/rust/src/emulator_data.rs +++ b/nes/rust/src/emulator_data.rs @@ -489,9 +489,16 @@ impl NesEmulatorData { let ppu = NesPpu::new(); let apu = NesApu::new(); - let breakpoints = self.cpu.breakpoints.clone(); - self.cpu = NesCpu::new(); - self.cpu.breakpoints = breakpoints; + #[cfg(feature = "debugger")] + { + let breakpoints = self.cpu.breakpoints.clone(); + self.cpu = NesCpu::new(); + self.cpu.breakpoints = breakpoints; + } + #[cfg(not(feature = "debugger"))] + { + self.cpu = NesCpu::new(); + } self.cpu_peripherals = NesCpuPeripherals::new(ppu, apu); self.mb = mb; diff --git a/nes/rust/src/ppu.rs b/nes/rust/src/ppu.rs index fec1df1..9604ed8 100644 --- a/nes/rust/src/ppu.rs +++ b/nes/rust/src/ppu.rs @@ -1064,14 +1064,16 @@ impl NesPpu { self.attributetable_shift[1] }; let extra_palette_bits = (attribute >> (2 * combined)) & 3; - - if let Some((x, y)) = self.bg_debug { - if cycle == x && self.scanline_number == y as u16 { - //println!("PIXEL {},{} is {:x} {:x}", cycle, self.scanline_number, self.vram_address, self.scrollx) + #[cfg(feature = "debugger")] + { + if let Some((x, y)) = self.bg_debug { + if cycle == x && self.scanline_number == y as u16 { + //println!("PIXEL {},{} is {:x} {:x}", cycle, self.scanline_number, self.vram_address, self.scrollx) + } + } + if cycle == 8 { + //println!("PIXEL2 {},{} is {:x} {:x}", cycle, self.scanline_number, self.vram_address, self.scrollx) } - } - if cycle == 8 { - //println!("PIXEL2 {},{} is {:x} {:x}", cycle, self.scanline_number, self.vram_address, self.scrollx) } let lower_bits = (upper_bit << 1) | lower_bit; @@ -1483,6 +1485,7 @@ impl NesPpu { } /// Renders all sprites + #[cfg(feature = "debugger")] pub fn render_sprites(&self, buf: &mut Box, bus: &NesMotherboard) { let allsprites = self.get_64_sprites(); for (i, pixel) in buf.data.chunks_exact_mut(3).enumerate() { diff --git a/nes/rust/src/windows/main.rs b/nes/rust/src/windows/main.rs index 84aacc2..1f3b45d 100644 --- a/nes/rust/src/windows/main.rs +++ b/nes/rust/src/windows/main.rs @@ -578,8 +578,34 @@ impl TrackedWindow for MainNesWindow { } #[cfg(not(feature = "debugger"))] { - c.cycle_step(&mut self.sound, &mut self.filter); + { + c.cycle_step(&mut sound, &mut self.audio_streaming, &mut self.filter); + } if c.cpu_peripherals.ppu_frame_end() { + if !self.paused { + let image = c + .cpu_peripherals + .ppu_get_frame() + .to_pixels_egui() + .resize(c.local.configuration.scaler); + c.local.image = image; + } + self.recording.send_frame(&c.local.image); + if let Some(olocal) = &mut c.olocal { + if let Some(network) = &mut olocal.network { + if network.role() == NodeRole::PlayerHost { + let _e = network.video_data(&c.local.image); + } + } + } + + if self.mouse_delay > 0 { + self.mouse_delay -= 1; + if self.mouse_delay == 0 { + self.mouse = false; + self.mouse_miss = false; + } + } break 'emulator_loop; } } @@ -925,8 +951,11 @@ impl TrackedWindow for MainNesWindow { if r.hovered() { if let Some(pos) = r.hover_pos() { let coord = pos - r.rect.left_top(); - c.cpu_peripherals.ppu.bg_debug = - Some(((coord.x / zoom) as u8, (coord.y / zoom) as u8)); + #[cfg(feature = "debugger")] + { + c.cpu_peripherals.ppu.bg_debug = + Some(((coord.x / zoom) as u8, (coord.y / zoom) as u8)); + } let pixel = c.local.image.get_pixel(coord / zoom); self.mouse_vision = !self.mouse_miss @@ -957,12 +986,15 @@ impl TrackedWindow for MainNesWindow { } }); - if let Some(s) = &mut self.sound_stream { - if c.paused && !self.paused { - self.paused = s.pause().is_ok(); - } - if !c.paused && self.paused { - self.paused = s.play().is_err(); + #[cfg(feature = "debugger")] + { + if let Some(s) = &mut self.sound_stream { + if c.paused && !self.paused { + self.paused = s.pause().is_ok(); + } + if !c.paused && self.paused { + self.paused = s.play().is_err(); + } } } diff --git a/nes/rust/src/windows/name_table_dump_window.rs b/nes/rust/src/windows/name_table_dump_window.rs index cca1e26..4bb7329 100644 --- a/nes/rust/src/windows/name_table_dump_window.rs +++ b/nes/rust/src/windows/name_table_dump_window.rs @@ -122,7 +122,10 @@ impl TrackedWindow for DumpWindow { if pos.x >= 0.0 && pos.y >= 0.0 { let pixelx = (pos.x / zoom).floor() as u8; let pixely = (pos.y / zoom).floor() as u8; - c.cpu_peripherals.ppu.bg_debug = Some((pixelx, pixely)); + #[cfg(feature = "debugger")] + { + c.cpu_peripherals.ppu.bg_debug = Some((pixelx, pixely)); + } let x = (pos.x / (8.0 * zoom)).floor() as usize; let y = (pos.y / (8.0 * zoom)).floor() as usize; let left = x < 32; diff --git a/nes/rust/src/windows/sprite_dump_window.rs b/nes/rust/src/windows/sprite_dump_window.rs index f7facc0..e58d350 100644 --- a/nes/rust/src/windows/sprite_dump_window.rs +++ b/nes/rust/src/windows/sprite_dump_window.rs @@ -76,7 +76,10 @@ impl TrackedWindow for DumpWindow { egui_multiwin::egui::CentralPanel::default().show(&egui.egui_ctx, |ui| { ui.label("PPU Sprite Dump Window"); egui_multiwin::egui::ScrollArea::vertical().show(ui, |ui| { - c.cpu_peripherals.ppu.render_sprites(&mut self.buf, &c.mb); + #[cfg(feature = "debugger")] + { + c.cpu_peripherals.ppu.render_sprites(&mut self.buf, &c.mb); + } c.cpu_peripherals .ppu .render_palette(&mut self.palette, &c.mb); @@ -137,18 +140,21 @@ impl TrackedWindow for DumpWindow { let num = col + row * 16; ui.label(format!("Sprite number is {:x}", num)); - let sprites = c.cpu_peripherals.ppu.get_64_sprites(); - ui.label(format!( - "Sprite tile is {:x} {:x}, attribute is {:x}", - sprites[num].tile_num(sprites[num].y(), 16), - sprites[num].tile_num(sprites[num].y() + 8, 16), - sprites[num].attribute(), - )); - ui.label(format!( - "Location is {},{}", - sprites[num].x(), - sprites[num].y() - )); + #[cfg(feature = "debugger")] + { + let sprites = c.cpu_peripherals.ppu.get_64_sprites(); + ui.label(format!( + "Sprite tile is {:x} {:x}, attribute is {:x}", + sprites[num].tile_num(sprites[num].y(), 16), + sprites[num].tile_num(sprites[num].y() + 8, 16), + sprites[num].attribute(), + )); + ui.label(format!( + "Location is {},{}", + sprites[num].x(), + sprites[num].y() + )); + } } } }