1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
use self::super::super::super::super::isa::{GeneralPurposeRegisterBank, SpecialPurposeRegister};
use bear_lib_terminal::terminal::{with_colors, print_xy, put_xy};
use self::super::super::super::super::rw::ReadWritable;
use num_traits::{Unsigned, PrimInt, Num};
use self::super::colours_for_rw;
use std::fmt::UpperHex;
use std::mem::size_of;
pub fn gp_write(x_start: usize, y_start: usize, registers: &mut GeneralPurposeRegisterBank) {
let x_start = x_start as i32;
let y_start = y_start as i32;
print_xy(x_start + 1, y_start, "General-purpose registers");
for reg in registers {
let y_offset = reg.address() / 4;
let x_offset = (reg.address() % 4) * (1 + 1 + 2 + 2 + 1);
print_xy(x_start + x_offset as i32,
y_start + 1 + y_offset as i32,
&format!("{} {:#04X}", reg.letter(), **reg));
reg.reset_rw();
}
}
pub fn gp_update(x_start: usize, y_start: usize, registers: &mut GeneralPurposeRegisterBank) {
let x_start = x_start as i32;
let y_start = y_start as i32;
for reg in registers {
let y_offset = reg.address() / 4;
let x_offset = (reg.address() % 4) * (1 + 1 + 2 + 2 + 1);
let r = reg.was_read();
let w = reg.was_written();
let (fg, bg) = colours_for_rw(r, w);
with_colors(fg, bg, || put_xy(x_start + x_offset as i32, y_start + 1 + y_offset as i32, reg.letter()));
if w {
print_xy(x_start + x_offset as i32 + 1 + 1, y_start + 1 + y_offset as i32, &format!("{:#04X}", **reg))
}
reg.reset_rw();
}
}
pub fn sp_write(x_start: usize, y_start: usize, pc: &mut SpecialPurposeRegister<u16>, sp: &mut SpecialPurposeRegister<u16>,
adr: &mut SpecialPurposeRegister<u16>, ins: &mut SpecialPurposeRegister<u8>) {
let x_start = x_start as i32;
let y_start = y_start as i32;
print_xy(x_start + 1, y_start, "Special-purpose registers");
write_sp_register(x_start, y_start + 1, pc);
write_sp_register(x_start + 3 + 1 + 6 + 7, y_start + 1, sp);
write_sp_register(x_start, y_start + 2, adr);
write_sp_register(x_start + 3 + 1 + 6 + 7, y_start + 2, ins);
}
fn write_sp_register<T: Num + Unsigned + PrimInt + UpperHex>(x: i32, y: i32, reg: &mut SpecialPurposeRegister<T>) {
print_xy(x as i32,
y as i32,
&format!("{}{:sw$} {:#0dw$X}",
reg.short_name(),
"",
**reg,
sw = 3 - reg.short_name().len().min(3),
dw = 2 + size_of::<T>() * 2));
reg.reset_rw();
}
pub fn sp_update(x_start: usize, y_start: usize, pc: &mut SpecialPurposeRegister<u16>, sp: &mut SpecialPurposeRegister<u16>,
adr: &mut SpecialPurposeRegister<u16>, ins: &mut SpecialPurposeRegister<u8>) {
let x_start = x_start as i32;
let y_start = y_start as i32;
update_sp_register(x_start, y_start + 1, pc);
update_sp_register(x_start + 3 + 1 + 6 + 7, y_start + 1, sp);
update_sp_register(x_start, y_start + 2, adr);
update_sp_register(x_start + 3 + 1 + 6 + 7, y_start + 2, ins);
}
fn update_sp_register<T: Num + Unsigned + PrimInt + UpperHex>(x: i32, y: i32, reg: &mut SpecialPurposeRegister<T>) {
let r = reg.was_read();
let w = reg.was_written();
let (fg, bg) = colours_for_rw(r, w);
with_colors(fg, bg, || print_xy(x, y, reg.short_name()));
if w {
print_xy(x + 3 + 1, y, &format!("{:#0dw$X}", **reg, dw = 2 + size_of::<T>() * 2))
}
reg.reset_rw();
}