use super::variable::VariableData;
use crate::virtualmachine::instruction::generation::InstructionGenerator;
use std::collections::HashMap;
pub struct VirtualProgram {
pub label_map: HashMap<String, usize>,
pub stack: Vec<VariableData>,
pub registers: [VariableData; 7],
pub current_instruction: usize,
}
pub const STACK_SIZE: usize = 10240; pub const STACK_POINTER_REGISTER: usize = 6; pub const STACK_POINTER_BASE_REGISTER: usize = 5; pub const TEXT_SIZE_REGISTER: usize = 4; pub const RAX: usize = 0; pub const RBX: usize = 1; pub const RCX: usize = 2; pub const RDX: usize = 3; impl VirtualProgram {
pub fn new() -> VirtualProgram {
let mut ret = VirtualProgram {
label_map: HashMap::new(),
stack: Vec::new(),
registers: [
VariableData::UInt64(0), VariableData::UInt64(0), VariableData::UInt64(0), VariableData::UInt64(0), VariableData::UInt64(0), VariableData::UInt64(0), VariableData::UInt64(0), ],
current_instruction: 0,
};
ret.stack.resize(STACK_SIZE, VariableData::UInt64(0));
ret
}
pub fn execute(&mut self, instructions: &InstructionGenerator) {
self.label_map = instructions.labels.clone();
self.current_instruction = instructions.start_address;
self.registers[TEXT_SIZE_REGISTER] =
VariableData::UInt64(instructions.text_section.len() as u64);
self.registers[STACK_POINTER_REGISTER] =
VariableData::UInt64(instructions.text_section.len() as u64);
self.registers[STACK_POINTER_BASE_REGISTER] =
VariableData::UInt64(instructions.text_section.len() as u64);
for (i, ch) in instructions.text_section.iter().enumerate() {
self.stack[i] = VariableData::Int8(*ch as i8);
}
while self.current_instruction < instructions.instructions.len() {
instructions.instructions[self.current_instruction].execute(self);
self.current_instruction += 1;
}
}
}