Files
rasp/src/main.rs

61 lines
1.6 KiB
Rust
Raw Normal View History

#![allow(dead_code)]
mod common;
mod vm;
use std::{convert::TryFrom, env, fs, io, process};
type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
fn get_input_string() -> io::Result<String> {
let args: Vec<String> = env::args().collect();
if args.len() <= 1 {
println!(
"usage: {} file.asm",
args.get(0).map(String::as_str).unwrap_or("rasp")
);
process::exit(1);
} else {
fs::read_to_string(&args[1])
}
}
fn main() -> Result<()> {
use vm::obj::syn::parser::SectionsParser;
let contents = get_input_string()?;
let ast = match SectionsParser::new().parse(&contents) {
Ok(ast) => ast,
Err(err) => {
eprintln!("{}", err);
process::exit(1);
}
};
let obj = vm::obj::obj::Object::try_from(&ast)?;
//dump(&obj)?;
let mut vm = vm::vm::Vm::new();
vm.load_object(obj, 1024 * 1024 * 64)?; // 64mb
let status = vm.run()?;
println!("{}", status);
Ok(())
}
fn dump(obj: &vm::obj::obj::Object) -> Result<()> {
use vm::obj::obj::Section;
use vm::visit::VisitInst;
let mut stdout = io::stdout();
for section in &obj.sections {
let mut disasm = match section {
Section::Code { start, contents, .. } => {
vm::disassemble::Disassemble::new(&mut stdout, contents, *start)
}
Section::Meta { .. } | Section::Data { .. } => continue,
};
while !disasm.is_done() {
disasm.visit_inst()?;
}
println!();
}
Ok(())
}