strawberryvm 0.2.0

A fantasy virtual machine with limits on resources.
Documentation
use strawberryvm::prelude::*;

use std::env;
use std::fs::File;
use std::io::Read;
use std::path::Path;

fn sig_halt(vm: &mut Machine) {
    vm.machine_halted = true;
}

fn log_reg_a(vm: &mut Machine) {
    println!("A = {}", vm.get_register(Register::A));
}

fn log_regs(vm: &mut Machine) {
    println!("{}", vm.status());
}

/// Gets the inputted program as a vector of bytes
/// to be loaded into the machines memory
fn load_program() -> Vec<u8> {
    let args: Vec<String> = env::args().collect();
    assert!(args.len() >= 2);

    let mut file = match File::open(Path::new(&args[1])) {
        Err(e) => panic!("Failed to open file: {e}"),
        Ok(file) => file,
    };

    let mut program: Vec<u8> = Vec::new();
    file.read_to_end(&mut program).unwrap();

    program
}

/// Usage: ./machine <prog.bin>
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut vm = Machine::new();

    vm.define_handler(0xF0, sig_halt);
    vm.define_handler(0xF1, log_reg_a);
    vm.define_handler(0xF2, log_regs);

    vm.memory.load(&load_program(), 0)?;

    while !vm.machine_halted {
        vm.step()?;
    }

    Ok(())
}