labast/src/instructions/flow_control.rs

75 lines
1.8 KiB
Rust

use crate::{errors::RunError, stack::StackVec};
pub fn jmp(labels: &mut [Option<i16>; 256], program_counter: &mut u16, data: u16) {
if labels[data as usize].is_none() {
eprintln!("{}", RunError::UnknownLabel(data));
std::process::exit(2);
}
*program_counter = (labels[data as usize].unwrap() - 1) as u16;
}
pub fn jnz(
memory: &mut StackVec,
labels: &mut [Option<i16>; 256],
program_counter: &mut u16,
data: u16,
) {
if labels[data as usize].is_none() {
eprintln!("{}", RunError::UnknownLabel(data));
std::process::exit(2);
}
if memory.pop() != 0 {
*program_counter = (labels[data as usize].unwrap() - 1) as u16;
}
}
pub fn jz(
memory: &mut StackVec,
labels: &mut [Option<i16>; 256],
program_counter: &mut u16,
data: u16,
) {
if labels[data as usize].is_none() {
eprintln!("{}", RunError::UnknownLabel(data));
std::process::exit(2);
}
if memory.pop() == 0 {
*program_counter = (labels[data as usize].unwrap() - 1) as u16;
}
}
pub fn kjnz(
memory: &mut StackVec,
labels: &mut [Option<i16>; 256],
program_counter: &mut u16,
data: u16,
) {
if labels[data as usize].is_none() {
eprintln!("{}", RunError::UnknownLabel(data));
std::process::exit(2);
}
if memory.last() != 0 {
*program_counter = (labels[data as usize].unwrap() - 1) as u16;
}
}
pub fn kjz(
memory: &mut StackVec,
labels: &mut [Option<i16>; 256],
program_counter: &mut u16,
data: u16,
) {
if labels[data as usize].is_none() {
eprintln!("{}", RunError::UnknownLabel(data));
std::process::exit(2);
}
if memory.last() == 0 {
*program_counter = (labels[data as usize].unwrap() - 1) as u16;
}
}