Krolyxon
Commit 1504706

Branches

Tags

Refs →

bench51cratesbench51-guisrcpanesregisters.rs

105 lines · 4.0 KB · Rust

1//! Keil's register window. The program counter is the screen's hero.
2
3use bench51_core::session::Session;
4use bench51_core::sfr::{ACC, B, DPH, DPL, PSW, SP};
5use bench51_core::sim::disasm;
6use eframe::egui::{self, RichText, Ui};
7
8use super::{sfr_changed, sfr_chip};
9use crate::theme::{HERO, WARNING, palette};
10use crate::widgets;
11
12pub fn show(ui: &mut Ui, s: &mut Session) {
13 let p = palette(ui.ctx());
14 egui::ScrollArea::vertical()
15 .auto_shrink([false; 2])
16 .show(ui, |ui| {
17 ui.label(p.label("Program counter"));
18 ui.label(p.hero(format!("{:04X}", s.sim.pc), HERO));
19 let here = disasm::disassemble(&s.sim.code, s.sim.pc);
20 let state = if s.sim.power_down {
21 "power-down"
22 } else if s.sim.idle {
23 "idle"
24 } else {
25 ""
26 };
27 ui.horizontal(|ui| {
28 ui.label(p.data(here.text).color(p.text_secondary));
29 if !state.is_empty() {
30 ui.label(p.label(state).color(WARNING));
31 }
32 });
33
34 widgets::section(ui, "Registers");
35 let value = |v: String, changed: bool| {
36 p.data(v)
37 .color(if changed { WARNING } else { p.text_primary })
38 };
39 let iram_changed = |a: u8| s.sim.iram[a as usize] != s.prev_iram[a as usize];
40 egui::Grid::new("regs")
41 .num_columns(4)
42 .spacing([16.0, 6.0])
43 .show(ui, |ui| {
44 let pairs: [(&str, String, bool); 4] = [
45 ("A", format!("{:02X}", s.sim.acc()), sfr_changed(s, ACC)),
46 ("B", format!("{:02X}", s.sim.b()), sfr_changed(s, B)),
47 ("SP", format!("{:02X}", s.sim.sp()), sfr_changed(s, SP)),
48 (
49 "DPTR",
50 format!("{:04X}", s.sim.dptr()),
51 sfr_changed(s, DPL) || sfr_changed(s, DPH),
52 ),
53 ];
54 for row in pairs.chunks(2) {
55 for (name, v, ch) in row {
56 ui.label(p.label(*name));
57 ui.label(value(v.clone(), *ch));
58 }
59 ui.end_row();
60 }
61 for r in 0..4u8 {
62 for n in [r, r + 4] {
63 let a = s.sim.reg_addr(n);
64 ui.label(p.label(format!("R{n}")));
65 ui.label(value(
66 format!("{:02X}", s.sim.iram[a as usize]),
67 iram_changed(a),
68 ));
69 }
70 ui.end_row();
71 }
72 });
73
74 widgets::section(ui, "PSW");
75 ui.horizontal_wrapped(|ui| {
76 ui.spacing_mut().item_spacing.x = 4.0;
77 ui.label(value(format!("{:02X}", s.sim.psw()), sfr_changed(s, PSW)));
78 ui.add_space(6.0);
79 for (name, mask) in [
80 ("CY", 0x80),
81 ("AC", 0x40),
82 ("F0", 0x20),
83 ("RS1", 0x10),
84 ("RS0", 0x08),
85 ("OV", 0x04),
86 ("P", 0x01),
87 ] {
88 sfr_chip(ui, s, name, PSW, mask);
89 }
90 });
91 ui.add_space(4.0);
92 widgets::stat_row(ui, "Bank", p.data(s.sim.bank().to_string()));
93
94 widgets::section(ui, "Time");
95 widgets::stat_row(ui, "Cycles", p.data(s.sim.cycles.to_string()));
96 widgets::stat_row(ui, "Elapsed", p.data(s.elapsed()));
97 widgets::stat_row(
98 ui,
99 "Clock",
100 RichText::new(format!("{} MHz", s.clock_mhz))
101 .font(crate::theme::mono(crate::theme::LABEL + 1.0))
102 .color(p.text_secondary),
103 );
104 });
105}