This commit is contained in:
2025-06-19 15:18:48 +01:00
parent 5784beafbc
commit e308362533
9 changed files with 128 additions and 55 deletions
+22 -4
View File
@@ -10,7 +10,7 @@ use std::{
use crate::emulator::misc::rpc::{Activity, RpcClient};
use crate::emulator::system::{
model::{Command, Running, State},
model::{Command, PersistentState, Running, State},
processor::Processor,
};
@@ -70,10 +70,26 @@ pub fn run_emulator(
Command::Stop => {
running = Running::Paused;
}
Command::Reset => {
Command::Reset(x) => {
running = Running::Paused;
match x {
0 => {
processor.clear();
processor.reset();
instruction_count = 0;
}
1 => {
processor.reset();
instruction_count = 0;
}
2 => {
processor.clear();
}
_ => unreachable!(),
}
processor.reset();
instruction_count = 0;
}
Command::Step => {
running = Running::Paused;
@@ -158,6 +174,8 @@ pub fn run_emulator(
memory_view,
&mut history,
);
println!("running state");
// println!("state!!! {:?}", state.history);
let _ = state_tx.send(state);
}
} else {
@@ -185,6 +203,6 @@ fn state(
memory_view,
display_view: cpu_lock.display(),
error: None,
history: hsclone,
persistent: PersistentState { history: hsclone },
}
}
+25 -3
View File
@@ -19,7 +19,7 @@ pub enum Command {
Start,
Stop,
Step,
Reset,
Reset(usize),
Interrupt(Interrupt),
// Performs direct read/write operations on the emulator's memory.
@@ -205,8 +205,9 @@ pub struct State {
pub stack_view: Vec<u8>,
pub memory_view: Vec<u8>,
pub display_view: Vec<u8>,
pub history: Vec<(u32, Instruction)>,
pub error: Option<String>,
pub persistent: PersistentState,
}
impl Default for State {
@@ -218,8 +219,29 @@ impl Default for State {
stack_view: vec![],
memory_view: vec![],
display_view: vec![],
history: vec![],
persistent: PersistentState::default(),
error: None,
}
}
}
#[derive(Clone, Debug)]
pub struct PersistentState {
pub history: Vec<(u32, Instruction)>,
}
impl Default for PersistentState {
fn default() -> Self {
Self { history: vec![] }
}
}
impl PersistentState {
pub fn update(&mut self, new_state: &PersistentState) {
self.history.extend(new_state.history.clone());
if self.history.len() > 32768 {
let len = self.history.len() - 32768;
self.history.drain(..len);
}
}
}
@@ -35,6 +35,9 @@ impl Processor {
// set all registers to zero
// run memory.reset()
self.registers.reset();
}
pub fn clear(&mut self) {
self.memory.reset();
}
+21
View File
@@ -64,6 +64,27 @@ impl Component for ControlPanel {
});
}
// Resets the emulator and all attached devices
if ui.button("Reset All").clicked() {
self.sender.send(Command::Reset(0)).unwrap_or_else(|_| {
state.error = Some("Failed to send command".to_string());
});
}
// Resets the emulator and all attached devices
if ui.button("Clear Registers").clicked() {
self.sender.send(Command::Reset(1)).unwrap_or_else(|_| {
state.error = Some("Failed to send command".to_string());
});
}
// Resets the emulator and all attached devices
if ui.button("Clear RAM").clicked() {
self.sender.send(Command::Reset(2)).unwrap_or_else(|_| {
state.error = Some("Failed to send command".to_string());
});
}
ui.separator();
// Status info
+12 -12
View File
@@ -12,17 +12,24 @@ use crate::emulator::{
};
pub struct Editor {
// editor state
path: Option<PathBuf>,
unsaved: bool,
text: String,
buffer: String,
unsaved: bool,
// output / loading
output: Vec<u8>,
sender: Sender<Command>,
cursor_col: usize,
cursor_line: usize,
visible: bool,
load_offset: u32,
offset_str: String,
// cursor - currently unused
cursor_col: usize,
cursor_line: usize,
// other
visible: bool,
sender: Sender<Command>,
error: Option<String>,
}
@@ -372,13 +379,6 @@ impl Editor {
self.error = Some("Invalid offset".to_string());
}
}
// Resets the emulator and all attached devices
if ui.button("Reset Emulator").clicked() {
self.sender.send(Command::Reset).unwrap_or_else(|_| {
self.error = Some("Failed to send command".to_string());
});
}
});
}
}
+8 -30
View File
@@ -1,19 +1,9 @@
use std::{ffi::OsStr, path::PathBuf, sync::mpsc::Sender};
use egui::{Context, Ui};
use common::prelude::Instruction;
use egui::{Align, Context, Key, Layout, Ui};
use rfd::FileDialog;
use dsa_editor::{CodeEditor, ColorTheme, Syntax};
use crate::emulator::{
system::model::{Command, State},
ui::interface::Component,
};
use crate::emulator::{system::model::State, ui::interface::Component};
pub struct History {
visible: bool,
history: Vec<(u32, Instruction)>,
}
impl Component for History {
@@ -29,14 +19,12 @@ impl Component for History {
super::interface::Category::Control
}
fn render(&mut self, state: &mut State, ui: &mut Ui, ctx: &Context) {
self.update(state);
fn render(&mut self, state: &mut State, ui: &mut Ui, _ctx: &Context) {
egui::ScrollArea::vertical()
.id_salt("output_scroll")
.max_width(400.0)
.show(ui, |ui| {
if self.history.is_empty() {
if state.persistent.history.is_empty() {
ui.label(
egui::RichText::new("No output data")
.font(egui::FontId::monospace(12.0))
@@ -51,7 +39,9 @@ impl Component for History {
.striped(false)
.show(ui, |ui| {
// Process bytes in chunks of 4
for (idx, instruction) in self.history.iter().enumerate() {
for (idx, instruction) in
state.persistent.history.iter().enumerate()
{
ui.label(format!("{}: ", idx));
// Hex column
@@ -78,18 +68,6 @@ impl Component for History {
impl History {
#[must_use]
pub fn new() -> Self {
Self {
visible: false,
history: Vec::with_capacity(1000),
}
}
fn update(&mut self, state: &mut State) {
self.history.extend(state.history.clone());
state.history.clear();
if self.history.len() > 1000 {
let len = self.history.len() - 1000;
self.history.drain(..len);
}
Self { visible: false }
}
}
+31 -3
View File
@@ -1,4 +1,4 @@
use crate::emulator::system::model::{Command, Running, State};
use crate::emulator::system::model::{Command, PersistentState, Running, State};
use std::sync::mpsc::{Receiver, Sender};
pub trait Component {
@@ -37,6 +37,7 @@ pub struct EmulatorUI {
pub sender: Sender<Command>,
pub receiver: Receiver<State>,
pub state: State,
pub persistent: PersistentState,
pub components: Vec<Box<dyn Component>>,
}
@@ -47,6 +48,7 @@ impl EmulatorUI {
sender,
receiver,
state: State::default(),
persistent: PersistentState::default(),
components: vec![],
}
}
@@ -58,6 +60,8 @@ impl EmulatorUI {
fn update_state(&mut self) {
while let Ok(state) = self.receiver.try_recv() {
self.state = state;
self.persistent.update(&self.state.persistent);
self.state.persistent = self.persistent.clone();
}
}
}
@@ -105,8 +109,32 @@ impl eframe::App for EmulatorUI {
});
});
egui::TopBottomPanel::bottom("bottom_panel").show(ctx, |_ui| {
// interface::bottompanel::render_bottom_panel(self, ui, ctx);
egui::TopBottomPanel::bottom("bottom_panel").show(ctx, |ui| {
ui.horizontal_centered(|ui| {
ui.group(|ui| {
ui.add_space(10.0);
ui.strong("Authors:");
ui.add_space(5.0);
ui.label("zxq5");
ui.label("nullndvoid");
ui.add_space(10.0);
ui.separator();
ui.add_space(10.0);
ui.strong("Version");
ui.add_space(5.0);
ui.label("1.0.0");
ui.add_space(10.0);
ui.separator();
ui.add_space(10.0);
ui.strong("Source:");
ui.add_space(5.0);
ui.hyperlink_to(
"https://git.zxq5.dev/LowLevelDevs/damn_simple_architecture",
"https://git.zxq5.dev/LowLevelDevs/damn_simple_architecture",
);
ui.add_space(10.0);
});
});
});
}
}