Skip to content

Commit

Permalink
Allow exporting files/directories
Browse files Browse the repository at this point in the history
  • Loading branch information
kelpsyberry committed Apr 15, 2024
1 parent 6d46c05 commit c090910
Show file tree
Hide file tree
Showing 5 changed files with 531 additions and 141 deletions.
12 changes: 12 additions & 0 deletions core/src/ds_slot/rom.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,13 @@ use crate::{
utils::{mem_prelude::*, Savestate},
Model,
};
use core::any::Any;

#[allow(clippy::len_without_is_empty)]
pub trait Contents: Sync {
fn as_any(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;

fn len(&self) -> u64;

fn game_code(&self) -> u32;
Expand Down Expand Up @@ -42,6 +46,14 @@ pub trait Contents: Sync {
}

impl Contents for BoxedByteSlice {
fn as_any(&self) -> &dyn Any {
self
}

fn as_any_mut(&mut self) -> &mut dyn Any {
self
}

fn len(&self) -> u64 {
(**self).len() as u64
}
Expand Down
7 changes: 7 additions & 0 deletions frontend/desktop/src/debug_views/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,13 @@ pub fn format_size(size: u32) -> String {
format!("{amount:.2} {unit}")
}

pub fn format_size_u64(size: u64) -> String {
let log1024 = 63_u32.saturating_sub(size.leading_zeros()) / 10;
let unit = ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB"][log1024 as usize];
let amount = size as f64 / (1 << (log1024 * 10)) as f64;
format!("{amount:.2} {unit}")
}

pub fn format_size_shift(shift: usize) -> String {
let units = ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"];
if let Some(unit) = units.get(shift / 10) {
Expand Down
29 changes: 16 additions & 13 deletions frontend/desktop/src/debug_views/cpu_memory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,24 @@ use dust_core::{
cpu::{self, arm7, arm9, bus},
emu::Emu,
};
use imgui_memory_editor::{Addr, MemoryEditor, RangeInclusive};
use imgui_memory_editor::{MemoryEditor, RangeInclusive};

pub struct MemContents {
visible_addrs: RangeInclusive<Addr>,
visible_addrs: RangeInclusive<u32>,
data: Vec<u32>,
}

pub enum Message {
Write { addr: u32, value: u8 },
UpdateVisibleAddrs(RangeInclusive<Addr>),
UpdateVisibleAddrs(RangeInclusive<u32>),
}

pub struct EmuState<const ARM9: bool> {
visible_addrs: RangeInclusive<Addr>,
visible_addrs: RangeInclusive<u32>,
}

impl<const ARM9: bool> super::FrameViewEmuState for EmuState<ARM9> {
type InitData = RangeInclusive<Addr>;
type InitData = RangeInclusive<u32>;
type Message = Message;
type FrameData = MemContents;

Expand Down Expand Up @@ -64,9 +64,9 @@ impl<const ARM9: bool> super::FrameViewEmuState for EmuState<ARM9> {
.reserve(((self.visible_addrs.end - self.visible_addrs.start) >> 2) as usize);
for addr in (self.visible_addrs.start..=self.visible_addrs.end).step_by(4) {
frame_data.data.push(if ARM9 {
arm9::bus::read_32::<bus::DebugCpuAccess, E, false>(emu, addr as u32)
arm9::bus::read_32::<bus::DebugCpuAccess, E, false>(emu, addr)
} else {
arm7::bus::read_32::<bus::DebugCpuAccess, E>(emu, addr as u32)
arm7::bus::read_32::<bus::DebugCpuAccess, E>(emu, addr)
});
}
frame_data.visible_addrs = self.visible_addrs;
Expand All @@ -77,7 +77,7 @@ impl<const ARM9: bool> InstanceableFrameViewEmuState for EmuState<ARM9> {}

pub struct CpuMemory<const ARM9: bool> {
editor: MemoryEditor,
last_visible_addrs: RangeInclusive<Addr>,
last_visible_addrs: RangeInclusive<u32>,
mem_contents: MemContents,
}

Expand Down Expand Up @@ -144,8 +144,8 @@ impl<const ARM9: bool> FrameView for CpuMemory<ARM9> {
},
&mut (),
|_, addr| {
if self.mem_contents.visible_addrs.contains(&addr) {
let offset = (addr - self.mem_contents.visible_addrs.start) as usize;
if self.mem_contents.visible_addrs.contains(&(addr as u32)) {
let offset = (addr as u32 - self.mem_contents.visible_addrs.start) as usize;
if offset < self.mem_contents.data.len() << 2 {
Some((self.mem_contents.data[offset >> 2] >> ((offset & 3) << 3)) as u8)
} else {
Expand All @@ -163,9 +163,12 @@ impl<const ARM9: bool> FrameView for CpuMemory<ARM9> {
},
);

let mut visible_addrs = self.editor.visible_addrs(1, ui);
visible_addrs.start &= !3;
visible_addrs.end = (visible_addrs.end + 3) & !3;
let visible_addrs = self.editor.visible_addrs(1, ui);
let visible_addrs = (
visible_addrs.start as u32 & !3,
(((visible_addrs.end + 3) & !3) - 1) as u32,
)
.into();
if visible_addrs != self.last_visible_addrs {
self.last_visible_addrs = visible_addrs;
messages.push(Message::UpdateVisibleAddrs(visible_addrs));
Expand Down
Loading

0 comments on commit c090910

Please sign in to comment.