use crate::emu::{Address, Data, TraceMode};
#[derive(Debug)]
pub struct Stack {
data: [u32; 8],
address: [u32; 8],
pc: u32,
sr: u16,
}
impl Stack {
#[inline]
#[must_use]
pub const fn new() -> Self {
Self {
sr: Default::default(),
pc: Default::default(),
data: [0; _],
address: [0; _],
}
}
#[inline]
#[must_use]
pub const fn load_data(&self, index: Data) -> u32 {
self.data[index.as_usize()]
}
#[inline]
pub const fn store_data(&mut self, index: Data, value: u32) {
self.data[index.as_usize()] = value;
}
#[inline]
#[must_use]
pub const fn load_address(&self, index: Address) -> u32 {
self.address[index.as_usize()]
}
#[inline]
pub const fn store_address(&mut self, index: Address, value: u32) {
self.address[index.as_usize()] = value;
}
#[inline(always)]
#[must_use]
pub const fn load_pc(&self) -> u32 {
self.pc
}
#[inline(always)]
pub const fn store_pc(&mut self, value: u32) {
self.pc = value;
}
#[inline]
#[must_use]
pub const fn trace_mode(&self) -> TraceMode {
TraceMode::from_u16(self.sr)
}
#[inline]
pub const fn set_trace_mode(&mut self, mode: TraceMode) {
self.sr &= 0b0011_1111_1111_1111;
self.sr |= mode.as_u16();
}
#[inline]
pub const fn clear(&mut self) {
*self = Self::new();
}
}
const impl Default for Stack {
#[inline(always)]
fn default() -> Self {
const { Self::new() }
}
}