show upcoming instruction

This commit is contained in:
2024-01-14 15:57:56 -05:00
parent a7780712d8
commit 57e6041f5f
5 changed files with 46 additions and 15 deletions
-4
View File
@@ -1,12 +1,9 @@
use crate::cpu::CPU; use crate::cpu::CPU;
use crate::cpu::bus::Bus; use crate::cpu::bus::Bus;
use crate::rom::ROM;
use crate::rom::lo_rom::LoROM;
pub struct Emulator { pub struct Emulator {
pub cpu: CPU, pub cpu: CPU,
pub bus: Bus, pub bus: Bus,
pub rom: Box<dyn ROM>,
} }
impl Emulator { impl Emulator {
@@ -14,7 +11,6 @@ impl Emulator {
Self { Self {
cpu: CPU::new(), cpu: CPU::new(),
bus: Bus::new(), bus: Bus::new(),
rom: Box::new(LoROM::new()),
} }
} }
@@ -27,6 +27,7 @@ impl DebugOptions {
pub struct MemoryMapControlOptions { pub struct MemoryMapControlOptions {
pub is_enabled: bool, pub is_enabled: bool,
pub inputs: MemoryMapInputs, pub inputs: MemoryMapInputs,
pub inputs_result: MemoryMapInputs,
} }
impl MemoryMapControlOptions { impl MemoryMapControlOptions {
@@ -34,6 +35,7 @@ impl MemoryMapControlOptions {
Self { Self {
is_enabled: true, is_enabled: true,
inputs: MemoryMapInputs::new(), inputs: MemoryMapInputs::new(),
inputs_result: MemoryMapInputs::new(),
} }
} }
} }
@@ -59,6 +61,7 @@ impl MemoryMapInputs {
pub struct CPUDebugControlOptions { pub struct CPUDebugControlOptions {
pub is_enabled: bool, pub is_enabled: bool,
pub show_registers: bool, pub show_registers: bool,
pub show_upcoming_instruction: bool,
} }
impl CPUDebugControlOptions { impl CPUDebugControlOptions {
@@ -66,6 +69,7 @@ impl CPUDebugControlOptions {
Self { Self {
is_enabled: true, is_enabled: true,
show_registers: true, show_registers: true,
show_upcoming_instruction: true,
} }
} }
} }
+24 -1
View File
@@ -1,5 +1,5 @@
use eframe::egui; 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}; 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(); ui.separator();
ui.horizontal(|ui| {
if ui.selectable_label( if ui.selectable_label(
cpu_debug_options.show_registers, cpu_debug_options.show_registers,
"Show registers" "Show registers"
).clicked() { ).clicked() {
cpu_debug_options.show_registers = !cpu_debug_options.show_registers; 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_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) { 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)
);
});
}
+11 -3
View File
@@ -14,19 +14,23 @@ pub fn build_memory_map_window(ctx: &egui::Context, memory_map_control_options:
.min_size([400.0, 400.0]) .min_size([400.0, 400.0])
.open(&mut memory_map_control_options.is_enabled) .open(&mut memory_map_control_options.is_enabled)
.show(ctx, |ui| { .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(); ui.separator();
egui::ScrollArea::both().show(ui, |ui| { egui::ScrollArea::both().show(ui, |ui| {
build_memory_map_text( build_memory_map_text(
ui, ui,
&memory_map_control_options.inputs, &memory_map_control_options.inputs_result,
emulator, 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.horizontal(|ui| {
ui.label("Page Start: "); ui.label("Page Start: ");
ui.text_edit_singleline(&mut input_values.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.page_end, true);
sanitize_input(&mut input_values.address_start, false); sanitize_input(&mut input_values.address_start, false);
sanitize_input(&mut input_values.address_end, 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);
} }
} }
+1 -1
View File
@@ -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 ui.button("Load ROM file").clicked() {
if let Some(path) = rfd::FileDialog::new().pick_file() { if let Some(path) = rfd::FileDialog::new().pick_file() {
let picked_path = path.display().to_string(); let picked_path = path.display().to_string();
match emulator.rom.load(&picked_path) { match emulator.bus.rom.load(&picked_path) {
Ok(_) => println!("Loaded ROM"), Ok(_) => println!("Loaded ROM"),
Err(err) => println!("Error loading the ROM: {}", err), Err(err) => println!("Error loading the ROM: {}", err),
} }