pub enum ProgramCountState {
Next,
Jump(u16),
Skip
}
impl Default for ProgramCountState {
fn default() -> Self {
ProgramCountState::Next
}
}
pub const OPCODE_SIZE: u16 = 2;
pub struct ProgramCount {
pub value: u16,
pub state: ProgramCountState
}
impl ProgramCount {
pub fn reset_state(&mut self) {
self.state = ProgramCountState::default();
}
pub fn set_state(&mut self, state: ProgramCountState) {
self.state = state;
}
pub fn step(&mut self) {
match self.state {
ProgramCountState::Next => self.value += OPCODE_SIZE,
ProgramCountState::Jump(addr) => self.value = addr,
ProgramCountState::Skip => self.value += OPCODE_SIZE * 2,
}
}
}
impl From<u16> for ProgramCount {
fn from(value: u16) -> Self {
Self {
value,
state: ProgramCountState::default()
}
}
}