From 57e6041f5f322fc6e063821a5d7ee7cb5e1a9088 Mon Sep 17 00:00:00 2001 From: Franco Colmenarez Date: Sun, 14 Jan 2024 15:57:56 -0500 Subject: [PATCH] show upcoming instruction --- snes-core/src/emulator.rs | 4 --- snes-frontend/src/emu_state/debug_options.rs | 4 +++ snes-frontend/src/emu_ui/debug/cpu.rs | 37 ++++++++++++++++---- snes-frontend/src/emu_ui/debug/memory_map.rs | 14 ++++++-- snes-frontend/src/emu_ui/menu.rs | 2 +- 5 files changed, 46 insertions(+), 15 deletions(-) diff --git a/snes-core/src/emulator.rs b/snes-core/src/emulator.rs index db39ec1..edf9040 100644 --- a/snes-core/src/emulator.rs +++ b/snes-core/src/emulator.rs @@ -1,12 +1,9 @@ use crate::cpu::CPU; use crate::cpu::bus::Bus; -use crate::rom::ROM; -use crate::rom::lo_rom::LoROM; pub struct Emulator { pub cpu: CPU, pub bus: Bus, - pub rom: Box, } impl Emulator { @@ -14,7 +11,6 @@ impl Emulator { Self { cpu: CPU::new(), bus: Bus::new(), - rom: Box::new(LoROM::new()), } } diff --git a/snes-frontend/src/emu_state/debug_options.rs b/snes-frontend/src/emu_state/debug_options.rs index 0793c0d..0ae20e9 100644 --- a/snes-frontend/src/emu_state/debug_options.rs +++ b/snes-frontend/src/emu_state/debug_options.rs @@ -27,6 +27,7 @@ impl DebugOptions { pub struct MemoryMapControlOptions { pub is_enabled: bool, pub inputs: MemoryMapInputs, + pub inputs_result: MemoryMapInputs, } impl MemoryMapControlOptions { @@ -34,6 +35,7 @@ impl MemoryMapControlOptions { Self { is_enabled: true, inputs: MemoryMapInputs::new(), + inputs_result: MemoryMapInputs::new(), } } } @@ -59,6 +61,7 @@ impl MemoryMapInputs { pub struct CPUDebugControlOptions { pub is_enabled: bool, pub show_registers: bool, + pub show_upcoming_instruction: bool, } impl CPUDebugControlOptions { @@ -66,6 +69,7 @@ impl CPUDebugControlOptions { Self { is_enabled: true, show_registers: true, + show_upcoming_instruction: true, } } } diff --git a/snes-frontend/src/emu_ui/debug/cpu.rs b/snes-frontend/src/emu_ui/debug/cpu.rs index bc9b30d..c3f42fd 100644 --- a/snes-frontend/src/emu_ui/debug/cpu.rs +++ b/snes-frontend/src/emu_ui/debug/cpu.rs @@ -1,5 +1,5 @@ use eframe::egui; -use snes_core::emulator::Emulator; +use snes_core::{emulator::Emulator, cpu::instructions::mapper::map_opcode_to_instruction}; use crate::emu_state::{debug_options::CPUDebugControlOptions, emulation::EmulationState}; @@ -32,15 +32,24 @@ pub fn build_cpu_debug_controls(ctx: &egui::Context, cpu_debug_options: &mut CPU } }); ui.separator(); - if ui.selectable_label( - cpu_debug_options.show_registers, - "Show registers" - ).clicked() { - cpu_debug_options.show_registers = !cpu_debug_options.show_registers; - } + ui.horizontal(|ui| { + if ui.selectable_label( + cpu_debug_options.show_registers, + "Show registers" + ).clicked() { + cpu_debug_options.show_registers = !cpu_debug_options.show_registers; + } + if ui.selectable_label( + cpu_debug_options.show_upcoming_instruction, + "Show upcoming instruction" + ).clicked() { + cpu_debug_options.show_upcoming_instruction = !cpu_debug_options.show_upcoming_instruction; + } + }); }); build_cpu_registers_window(ctx, cpu_debug_options, emulator); + build_upcoming_instruction_window(ctx, cpu_debug_options, emulator); } fn build_cpu_registers_window(ctx: &egui::Context, cpu_debug_options: &mut CPUDebugControlOptions, emulator: &Emulator) { @@ -67,3 +76,17 @@ fn build_cpu_registers_window(ctx: &egui::Context, cpu_debug_options: &mut CPUDe }); }); } + +fn build_upcoming_instruction_window(ctx: &egui::Context, cpu_debug_options: &mut CPUDebugControlOptions, emulator: &Emulator) { + egui::Window::new("Upcoming CPU Instruction") + .auto_sized() + .min_width(150.0) + .open(&mut cpu_debug_options.show_upcoming_instruction) + .show(ctx, |ui| { + let opcode = emulator.bus.read_external(emulator.cpu.registers.get_pc_address()); + let instruction = map_opcode_to_instruction(opcode); + ui.monospace( + instruction.mnemonic(&emulator.cpu.registers, &emulator.bus, opcode) + ); + }); +} diff --git a/snes-frontend/src/emu_ui/debug/memory_map.rs b/snes-frontend/src/emu_ui/debug/memory_map.rs index 295d780..e3b976d 100644 --- a/snes-frontend/src/emu_ui/debug/memory_map.rs +++ b/snes-frontend/src/emu_ui/debug/memory_map.rs @@ -14,19 +14,23 @@ pub fn build_memory_map_window(ctx: &egui::Context, memory_map_control_options: .min_size([400.0, 400.0]) .open(&mut memory_map_control_options.is_enabled) .show(ctx, |ui| { - build_inputs(ui, &mut memory_map_control_options.inputs); + build_inputs( + ui, + &mut memory_map_control_options.inputs, + &mut memory_map_control_options.inputs_result, + ); ui.separator(); egui::ScrollArea::both().show(ui, |ui| { build_memory_map_text( ui, - &memory_map_control_options.inputs, + &memory_map_control_options.inputs_result, emulator, ); }); }); } -fn build_inputs(ui: &mut egui::Ui, input_values: &mut MemoryMapInputs) { +fn build_inputs(ui: &mut egui::Ui, input_values: &mut MemoryMapInputs, input_result: &mut MemoryMapInputs) { ui.horizontal(|ui| { ui.label("Page Start: "); ui.text_edit_singleline(&mut input_values.page_start); @@ -48,6 +52,10 @@ fn build_inputs(ui: &mut egui::Ui, input_values: &mut MemoryMapInputs) { sanitize_input(&mut input_values.page_end, true); sanitize_input(&mut input_values.address_start, false); sanitize_input(&mut input_values.address_end, false); + input_result.page_start = format!("{}", input_values.page_start); + input_result.page_end = format!("{}", input_values.page_end); + input_result.address_start = format!("{}", input_values.address_start); + input_result.address_end = format!("{}", input_values.address_end); } } diff --git a/snes-frontend/src/emu_ui/menu.rs b/snes-frontend/src/emu_ui/menu.rs index 2944d26..989e370 100644 --- a/snes-frontend/src/emu_ui/menu.rs +++ b/snes-frontend/src/emu_ui/menu.rs @@ -10,7 +10,7 @@ pub fn build_menu_bar(emulator: &mut Emulator, ui: &mut egui::Ui, state: &mut Ap if ui.button("Load ROM file").clicked() { if let Some(path) = rfd::FileDialog::new().pick_file() { let picked_path = path.display().to_string(); - match emulator.rom.load(&picked_path) { + match emulator.bus.rom.load(&picked_path) { Ok(_) => println!("Loaded ROM"), Err(err) => println!("Error loading the ROM: {}", err), }