use crate::isa::{An, Dn};
use crate::vm::{Int, Sr};
#[derive(Debug)]
pub struct Regs {
data: [Int<4>; 8],
address: [Int<4>; 8],
pc: Int<4>,
sr: Sr,
}
impl Regs {
#[inline]
#[must_use]
pub const fn new() -> Self {
Self {
data: [Default::default(); _],
address: [Default::default(); _],
pc: Default::default(),
sr: Default::default(),
}
}
#[inline]
#[must_use]
pub const fn data(&self, index: Dn) -> Int<4> {
self.data[index.as_usize()]
}
#[inline]
pub const fn data_mut(&mut self, index: Dn) -> &mut Int<4> {
&mut self.data[index.as_usize()]
}
#[inline]
#[must_use]
pub const fn address(&self, index: An) -> Int<4> {
self.address[index.as_usize()]
}
#[inline]
pub const fn address_mut(&mut self, index: An) -> &mut Int<4> {
&mut self.address[index.as_usize()]
}
#[inline(always)]
#[must_use]
pub const fn pc(&self) -> Int<4> {
self.pc
}
#[inline(always)]
#[must_use]
pub const fn pc_mut(&mut self) -> &mut Int<4> {
&mut self.pc
}
#[inline]
pub const fn inc_pc(&mut self, value: u32) {
let result = self.pc.as_u32().wrapping_add(value);
self.pc = Int::from_u32(result);
}
#[inline(always)]
#[must_use]
pub const fn sr(&self) -> Sr {
self.sr
}
#[inline(always)]
#[must_use]
pub const fn sr_mut(&mut self) -> &mut Sr {
&mut self.sr
}
#[inline]
pub const fn clear(&mut self) {
*self = Self::new();
}
}
const impl Default for Regs {
#[inline(always)]
fn default() -> Self {
const { Self::new() }
}
}