From a551fdc7ed7b114259b0aaa9b516eb59a088a08e Mon Sep 17 00:00:00 2001 From: Federico Guerinoni Date: Thu, 21 Sep 2023 10:51:21 +0200 Subject: [PATCH] UI: Make disassambler a feature opt-in In this way we can skip the slow part of formatting ASM in the widget if we don't care about it. Signed-off-by: Federico Guerinoni --- Cargo.toml | 1 + emu/Cargo.toml | 1 + emu/src/cpu/arm/instructions.rs | 1 + emu/src/cpu/arm7tdmi.rs | 36 ++++++++++++++++++++------------ emu/src/cpu/thumb/instruction.rs | 2 ++ justfile | 3 +++ ui/Cargo.toml | 3 +++ ui/src/app.rs | 15 ++++++++++--- ui/src/disassembler.rs | 6 ++---- ui/src/lib.rs | 1 + 10 files changed, 49 insertions(+), 20 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 31dd6a69..c3b9e194 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,3 +27,4 @@ rand = "0.8.5" [features] logger = ["logger/logger", "emu/logger"] +disassembler = ["emu/disassembler", "ui/disassembler"] diff --git a/emu/Cargo.toml b/emu/Cargo.toml index 5911b349..5d02a852 100644 --- a/emu/Cargo.toml +++ b/emu/Cargo.toml @@ -16,3 +16,4 @@ rand = "0.8.5" [features] logger = [] +disassembler = [] diff --git a/emu/src/cpu/arm/instructions.rs b/emu/src/cpu/arm/instructions.rs index 048bd76a..3c9685e9 100644 --- a/emu/src/cpu/arm/instructions.rs +++ b/emu/src/cpu/arm/instructions.rs @@ -215,6 +215,7 @@ impl std::fmt::Display for ArmModeMultiplyLongVariant { } impl ArmModeInstruction { + #[cfg(feature = "disassembler")] pub(crate) fn disassembler(&self) -> String { match self { Self::DataProcessing { diff --git a/emu/src/cpu/arm7tdmi.rs b/emu/src/cpu/arm7tdmi.rs index a16f7650..b08e377c 100644 --- a/emu/src/cpu/arm7tdmi.rs +++ b/emu/src/cpu/arm7tdmi.rs @@ -2,6 +2,8 @@ use std::convert::TryInto; #[cfg(feature = "logger")] use logger::log; + +#[cfg(feature = "disassembler")] use vecfixed::VecFixed; use crate::bitwise::Bits; @@ -27,6 +29,7 @@ pub struct Arm7tdmi { pub register_bank: RegisterBank, + #[cfg(feature = "disassembler")] pub disassembler_buffer: VecFixed<1000, String>, fetched_arm: Option, @@ -113,6 +116,7 @@ impl Default for Arm7tdmi { spsr: Psr::default(), registers: Registers::default(), register_bank: RegisterBank::default(), + #[cfg(feature = "disassembler")] disassembler_buffer: VecFixed::new(), fetched_arm: None, decoded_arm: None, @@ -169,13 +173,16 @@ impl Arm7tdmi { return; } - let decimal_value = self.registers.program_counter(); - let padded_hex_value = format!("{decimal_value:#04X}"); - self.disassembler_buffer.push(format!( - "{}: {}", - padded_hex_value, - op_code.instruction.disassembler() - )); + #[cfg(feature = "disassembler")] + { + let decimal_value = self.registers.program_counter(); + let padded_hex_value = format!("{decimal_value:#04X}"); + self.disassembler_buffer.push(format!( + "{}: {}", + padded_hex_value, + op_code.instruction.disassembler() + )); + } match op_code.instruction { ArmModeInstruction::DataProcessing { @@ -302,12 +309,15 @@ impl Arm7tdmi { } pub fn execute_thumb(&mut self, op_code: ThumbModeOpcode) { - let decimal_value = self.registers.program_counter(); - let padded_hex_value = format!("{decimal_value:#04X}"); - self.disassembler_buffer.push(format!( - "{padded_hex_value}: {}", - op_code.instruction.disassembler() - )); + #[cfg(feature = "disassembler")] + { + let decimal_value = self.registers.program_counter(); + let padded_hex_value = format!("{decimal_value:#04X}"); + self.disassembler_buffer.push(format!( + "{padded_hex_value}: {}", + op_code.instruction.disassembler() + )); + } match op_code.instruction { ThumbModeInstruction::MoveShiftedRegister { diff --git a/emu/src/cpu/thumb/instruction.rs b/emu/src/cpu/thumb/instruction.rs index f9a02912..4a38a761 100644 --- a/emu/src/cpu/thumb/instruction.rs +++ b/emu/src/cpu/thumb/instruction.rs @@ -1,6 +1,7 @@ use crate::bitwise::Bits; use crate::cpu::condition::Condition; use crate::cpu::flags::{LoadStoreKind, OperandKind, Operation, ReadWriteKind, ShiftKind}; +#[cfg(feature = "disassembler")] use crate::cpu::registers::REG_PROGRAM_COUNTER; use crate::cpu::thumb::alu_instructions::{ThumbHighRegisterOperation, ThumbModeAluInstruction}; use logger::log; @@ -240,6 +241,7 @@ impl std::fmt::Display for ThumbModeInstruction { } impl ThumbModeInstruction { + #[cfg(feature = "disassembler")] pub(crate) fn disassembler(&self) -> String { match self { Self::MoveShiftedRegister { diff --git a/justfile b/justfile index 5ca54ffd..dd579bda 100644 --- a/justfile +++ b/justfile @@ -37,3 +37,6 @@ run rom: run-logger rom: @cargo run --features logger $1 + +run-disassembler rom: + @cargo run --features disassembler $1 diff --git a/ui/Cargo.toml b/ui/Cargo.toml index 5a7af613..cfb23cbe 100644 --- a/ui/Cargo.toml +++ b/ui/Cargo.toml @@ -12,3 +12,6 @@ egui = { version = "0.22.0", default-features = false } egui_extras = { version = "0.22.0", features = ["image"] } emu = { path = "../emu"} image = { version = "0.24.5", features = ["png"], optional = true} + +[features] +disassembler = [] diff --git a/ui/src/app.rs b/ui/src/app.rs index a09defb7..d6e2d678 100644 --- a/ui/src/app.rs +++ b/ui/src/app.rs @@ -1,3 +1,4 @@ +#[cfg(feature = "disassembler")] use crate::disassembler::Disassembler; use emu::{cartridge_header::CartridgeHeader, gba::Gba}; use logger::log; @@ -47,16 +48,23 @@ impl ClementineApp { data, ))); + #[cfg(feature = "disassembler")] let disassembler = Disassembler::new(Arc::clone(&arc_gba)); - Self::from_tools(vec![ + let tools: Vec> = vec![ Box::::default(), Box::new(CpuRegisters::new(Arc::clone(&arc_gba))), Box::new(CpuHandler::new(Arc::clone(&arc_gba))), Box::new(GbaDisplay::new(Arc::clone(&arc_gba))), Box::new(PaletteVisualizer::new(arc_gba)), - Box::new(disassembler), - ]) + ]; + + #[cfg(feature = "disassembler")] + let mut tools = tools; + #[cfg(feature = "disassembler")] + tools.push(Box::new(disassembler)); + + Self::from_tools(tools) } fn from_tools(tools: Vec>) -> Self { @@ -64,6 +72,7 @@ impl ClementineApp { open.insert(tools[1].name().to_owned()); open.insert(tools[2].name().to_owned()); + #[cfg(feature = "disassembler")] open.insert(tools[5].name().to_owned()); Self { tools, open } diff --git a/ui/src/disassembler.rs b/ui/src/disassembler.rs index 568804bb..f34fa61c 100644 --- a/ui/src/disassembler.rs +++ b/ui/src/disassembler.rs @@ -1,9 +1,7 @@ -use std::sync::{Arc, Mutex}; - +use crate::ui_traits::UiTool; use egui::{ScrollArea, TextEdit, TextStyle}; use emu::gba::Gba; - -use crate::ui_traits::UiTool; +use std::sync::{Arc, Mutex}; pub struct Disassembler { gba: Arc>, diff --git a/ui/src/lib.rs b/ui/src/lib.rs index 614b6fec..e3bf5c69 100644 --- a/ui/src/lib.rs +++ b/ui/src/lib.rs @@ -2,6 +2,7 @@ mod about; pub mod app; mod cpu_handler; mod cpu_registers; +#[cfg(feature = "disassembler")] mod disassembler; mod gba_color; mod gba_display;