feat: Add real-time data display for CPU registers, RAM, and ROM

This commit is contained in:
Jan-Peter von Hunnius 2026-02-26 19:36:59 +01:00
parent 3530ea5f28
commit 6636417d18
22 changed files with 1233 additions and 188 deletions

View file

@ -108,7 +108,7 @@ mod gui_system_integration_tests {
// Test that GUI state has proper structure for synchronization
assert_eq!(app.gui_state.memory_state.ram_contents.len(), 4);
assert_eq!(app.gui_state.register_state.index_registers.len(), 16);
assert_eq!(app.gui_state.register_state.index_registers.len(), 16); // Intel 4004 has 16 index registers (R0-R15)
}
#[test]
@ -252,7 +252,7 @@ mod gui_system_integration_tests {
assert_eq!(gui_state.register_state.accumulator, 0);
assert!(!gui_state.register_state.carry_flag);
assert_eq!(gui_state.register_state.program_counter, 0);
assert_eq!(gui_state.register_state.index_registers.len(), 16);
assert_eq!(gui_state.register_state.index_registers.len(), 16); // Intel 4004 has 16 index registers (R0-R15)
assert_eq!(gui_state.register_state.stack_pointer, 0);
}
@ -295,7 +295,7 @@ mod gui_system_integration_tests {
// Test that GUI state is properly initialized for the system
assert_eq!(app.gui_state.memory_state.ram_contents.len(), 4);
assert_eq!(app.gui_state.register_state.index_registers.len(), 16);
assert_eq!(app.gui_state.register_state.index_registers.len(), 16); // Intel 4004 has 16 index registers (R0-R15)
}
#[test]
@ -359,7 +359,7 @@ mod gui_system_integration_tests {
// For now, we verify the state structure remains consistent
assert_eq!(app.gui_state.memory_state.ram_contents.len(), 4);
assert_eq!(app.gui_state.register_state.index_registers.len(), 16);
assert_eq!(app.gui_state.register_state.index_registers.len(), 16); // Intel 4004 has 16 index registers (R0-R15)
// Simulate state change
app.gui_state.cycle_count = i;
@ -565,7 +565,7 @@ mod gui_real_time_tests {
let mut gui_state = rusty_emu::gui::state::GuiState::new();
// Verify register layout matches Intel 4004 structure
assert_eq!(gui_state.register_state.index_registers.len(), 16); // 16 index registers
assert_eq!(gui_state.register_state.index_registers.len(), 16); // Intel 4004 has 16 index registers (R0-R15)
// Test register value bounds
gui_state.register_state.accumulator = 0x0F; // 4-bit value (0-15)

View file

@ -307,10 +307,10 @@ mod gui_integration_tests {
components.render_control_panel(&mut create_test_ui(&ctx), &mut state);
// Test memory viewer rendering
components.render_memory_viewer(&mut create_test_ui(&ctx), &state);
components.render_memory_viewer(&mut create_test_ui(&ctx), &mut state);
// Test register viewer rendering
components.render_register_viewer(&mut create_test_ui(&ctx), &state);
components.render_register_viewer(&mut create_test_ui(&ctx), &mut state);
// Test status bar rendering
components.render_status_bar(&mut create_test_ui(&ctx), &state);

View file

@ -49,42 +49,6 @@ fn wait_for_pin_settlement() {
thread::sleep(Duration::from_nanos(10)); // 10ns settlement time
}
/// Test helper to set control pins for RAM operation
/// RAM requires: SYNC=1, CM=1 (chip_select), CI=1 (io_select for RAM vs ROM)
fn setup_ram_operation(ram: &Intel4002, sync_high: bool, cm_high: bool) {
let sync_pin = ram.get_pin("SYNC").unwrap();
let cm_pin = ram.get_pin("CM").unwrap();
let ci_pin = ram.get_pin("CI").unwrap();
// Set control pins
{
let mut sync_guard = sync_pin.lock().unwrap();
let mut cm_guard = cm_pin.lock().unwrap();
let mut ci_guard = ci_pin.lock().unwrap();
sync_guard.set_driver(
Some("TEST".to_string()),
if sync_high {
PinValue::High
} else {
PinValue::Low
},
);
cm_guard.set_driver(
Some("TEST".to_string()),
if cm_high {
PinValue::High
} else {
PinValue::Low
},
);
// CI must be HIGH for RAM operations (distinguishes RAM from ROM)
ci_guard.set_driver(Some("TEST".to_string()), PinValue::High);
}
wait_for_pin_settlement();
}
/// Test helper to set data bus value
fn set_data_bus(ram: &Intel4002, value: u8) {
let nibble = value & 0x0F; // Only lower 4 bits

View file

@ -2,6 +2,7 @@ use rusty_emu::component::{BaseComponent, Component};
use rusty_emu::components::common::intel_400x::*;
use rusty_emu::components::memory::intel_4001::{Intel4001, IoDirection, IoMode};
use rusty_emu::pin::{Pin, PinValue};
use std::any::Any;
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
use std::time::Instant;
@ -45,6 +46,10 @@ impl Component for MockComponent {
fn is_running(&self) -> bool {
false
}
fn as_any(&self) -> &dyn Any {
self
}
}
impl Intel400xAddressHandling for MockComponent {