2023-05-08 12:37:27 +02:00
|
|
|
use dekejit::assembler::parser;
|
2023-05-05 21:04:13 +02:00
|
|
|
use dekejit::cli::{Cli, Subc::*};
|
2023-04-28 12:18:07 +02:00
|
|
|
use dekejit::cpu::IOBuffer;
|
|
|
|
use dekejit::cpu::CPU;
|
2023-05-08 12:37:27 +02:00
|
|
|
use dekejit::pretty_printers::*;
|
2023-05-02 14:13:49 +02:00
|
|
|
|
2023-05-05 21:04:13 +02:00
|
|
|
use clap::Parser;
|
|
|
|
use dekejit::loader::loader::read_binary;
|
2023-11-13 00:06:16 +01:00
|
|
|
use dekejit::loader::loader::{self, prepare_memory};
|
2023-05-05 21:04:13 +02:00
|
|
|
use dekejit::transmute_to_vecu8_as_is;
|
2023-11-13 00:06:16 +01:00
|
|
|
use log::{debug, info};
|
2023-05-03 08:40:47 +02:00
|
|
|
|
2022-12-29 01:15:59 +01:00
|
|
|
fn main() {
|
2023-05-05 21:04:13 +02:00
|
|
|
let cli: Cli = Cli::parse();
|
2023-05-03 08:40:47 +02:00
|
|
|
|
2023-05-05 21:04:13 +02:00
|
|
|
let loglevel = match cli.debug {
|
|
|
|
0 => log::Level::Error,
|
|
|
|
1 => log::Level::Warn,
|
|
|
|
2 => log::Level::Info,
|
|
|
|
3 => log::Level::Debug,
|
|
|
|
_ => log::Level::Trace,
|
|
|
|
// anything higher than 4 or equal is trace.
|
|
|
|
};
|
2023-05-03 08:40:47 +02:00
|
|
|
|
2023-05-05 21:04:13 +02:00
|
|
|
simple_logger::init_with_level(loglevel).unwrap();
|
2023-05-03 08:40:47 +02:00
|
|
|
|
2023-05-05 21:04:13 +02:00
|
|
|
match cli.comm {
|
|
|
|
Some(Run { filename }) => {
|
|
|
|
info!("Trying to read {}", filename);
|
|
|
|
|
|
|
|
let Ok(content) = std::fs::read(&filename) else {
|
|
|
|
println!("File {} does not exist or cannot be read.", &filename);
|
|
|
|
return;
|
|
|
|
};
|
|
|
|
|
|
|
|
let bytes = dekejit::transmute_to_vecu16_as_is(content.to_vec());
|
2023-05-02 16:26:04 +02:00
|
|
|
|
2023-05-05 21:04:13 +02:00
|
|
|
info!("Begin parsing file {}", &filename);
|
|
|
|
let sections = match read_binary(&bytes) {
|
|
|
|
Ok(k) => k,
|
|
|
|
Err(p) => {
|
|
|
|
println!("Parsing error: {:?}", p);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
let bin = prepare_memory(sections);
|
|
|
|
|
2023-05-08 12:37:27 +02:00
|
|
|
// trace!("{:?}", bin);
|
2023-05-05 21:04:13 +02:00
|
|
|
|
|
|
|
let mut env = IOBuffer::default();
|
|
|
|
//
|
|
|
|
let mut cpu = CPU::new(&mut env);
|
|
|
|
|
|
|
|
match cpu.run_code_raw(&bin) {
|
|
|
|
Ok(_) => {
|
|
|
|
println!("Result: {}", env.output)
|
|
|
|
}
|
|
|
|
Err(e) => println!("Err: {:?}", e),
|
|
|
|
};
|
2023-05-02 16:26:04 +02:00
|
|
|
}
|
2023-05-05 21:04:13 +02:00
|
|
|
Some(Build { filename, output }) => {
|
|
|
|
let Ok(inp_content) = std::fs::read_to_string(filename.clone()) else {
|
|
|
|
println!("Could not read file {}", &filename);
|
|
|
|
return;
|
|
|
|
};
|
|
|
|
|
2023-11-13 00:06:16 +01:00
|
|
|
let prs = dekejit::assembler::parser::Parser::new(inp_content);
|
2023-05-05 21:04:13 +02:00
|
|
|
|
|
|
|
let sections = match prs.parse_sections() {
|
|
|
|
Ok(s) => s,
|
|
|
|
Err(p_err) => {
|
|
|
|
println!("Parser error: {:?}", p_err);
|
|
|
|
return;
|
2023-11-13 00:06:16 +01:00
|
|
|
}
|
2023-05-05 21:04:13 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
let Some(bin) = dekejit::assembler::to_binary(sections) else {
|
|
|
|
println!("Unspecified error while converting file to binary. Must fix.");
|
|
|
|
return;
|
|
|
|
};
|
|
|
|
|
|
|
|
info!("{:?}", bin);
|
|
|
|
|
|
|
|
let out_bin = dekejit::loader::unloader::make_binary(&bin);
|
|
|
|
|
|
|
|
info!("{:?}", out_bin);
|
|
|
|
|
|
|
|
let out_bin = transmute_to_vecu8_as_is(out_bin);
|
|
|
|
|
|
|
|
info!("{:?}", out_bin);
|
2023-04-28 12:18:07 +02:00
|
|
|
|
2023-05-05 21:04:13 +02:00
|
|
|
match std::fs::write(output.clone(), out_bin) {
|
2023-11-13 00:06:16 +01:00
|
|
|
Ok(_) => {}
|
2023-05-05 21:04:13 +02:00
|
|
|
Err(_) => {
|
2023-11-13 00:06:16 +01:00
|
|
|
println!("could not write file {}", output);
|
|
|
|
}
|
2023-05-05 21:04:13 +02:00
|
|
|
};
|
|
|
|
}
|
2023-11-13 00:06:16 +01:00
|
|
|
Some(View { filename, format }) => {
|
2023-05-05 21:04:13 +02:00
|
|
|
info!("Trying to read {}", filename);
|
|
|
|
|
2023-05-08 12:37:27 +02:00
|
|
|
let Ok(content) = std::fs::read_to_string(&filename) else {
|
|
|
|
println!("File {} does not exist or cannot be read", &filename);
|
2023-05-05 21:04:13 +02:00
|
|
|
return;
|
|
|
|
};
|
|
|
|
|
2023-05-08 12:37:27 +02:00
|
|
|
let p = parser::Parser::new(content);
|
2023-05-05 21:04:13 +02:00
|
|
|
|
2023-05-08 12:37:27 +02:00
|
|
|
let s = p.parse_sections().unwrap();
|
|
|
|
|
2023-11-13 00:06:16 +01:00
|
|
|
println!(
|
|
|
|
"{}",
|
|
|
|
format_code(dekejit::pretty_printers::CodeWrapper::Asm(s), format).unwrap()
|
|
|
|
);
|
2023-05-08 12:37:27 +02:00
|
|
|
|
|
|
|
// let Ok(content) = std::fs::read(&filename) else {
|
|
|
|
// println!("File {} does not exist or cannot be read.", &filename);
|
|
|
|
// return;
|
|
|
|
// };
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// let bytes = dekejit::transmute_to_vecu16_as_is(content.to_vec());
|
|
|
|
//
|
|
|
|
// info!("{:?}", bytes);
|
|
|
|
//
|
|
|
|
// info!("Begin parsing file {}", &filename);
|
|
|
|
// let sections = match read_binary(&bytes) {
|
|
|
|
// Ok(k) => k,
|
|
|
|
// Err(p) => {
|
|
|
|
// println!("Parsing error: {:?}", p);
|
|
|
|
// return;
|
|
|
|
// }
|
|
|
|
// };
|
|
|
|
//
|
|
|
|
// println!("{:?}", sections);
|
2023-05-05 21:04:13 +02:00
|
|
|
}
|
2023-11-13 00:06:16 +01:00
|
|
|
Some(Debug) => {}
|
2023-05-05 21:04:13 +02:00
|
|
|
None => {}
|
|
|
|
}
|
2023-04-28 12:18:07 +02:00
|
|
|
|
2023-05-05 21:04:13 +02:00
|
|
|
// let parser = parser::Parser::new(code);
|
|
|
|
//
|
|
|
|
// let r = parser.parse_sections().unwrap();
|
|
|
|
//
|
|
|
|
// // println!("Parsed sections: {:?}", r);
|
|
|
|
//
|
|
|
|
// let code = to_binary(r).unwrap();
|
2023-05-02 14:13:49 +02:00
|
|
|
|
|
|
|
// let mut k = make_string("Hello world!");
|
|
|
|
//
|
|
|
|
// let mut code: Vec<u16> = vec![
|
|
|
|
// 0b0111000100000011, // addi ra 3
|
|
|
|
// 0b1110000100000011, // ecall ra 3
|
|
|
|
// 0b1111000000000000, // HALT.
|
|
|
|
// ];
|
|
|
|
//
|
|
|
|
// code.append(&mut k);
|
|
|
|
//
|
2023-05-05 21:04:13 +02:00
|
|
|
// let mut env = IOBuffer::default();
|
|
|
|
// //
|
|
|
|
// let mut cpu = CPU::new(&mut env);
|
|
|
|
// //
|
|
|
|
// // for c in &code[..] {
|
|
|
|
// // // println!("{:#018b}", c);
|
|
|
|
// // }
|
|
|
|
// //
|
|
|
|
// match cpu.run_code_raw(&code) {
|
|
|
|
// Ok(_) => {
|
|
|
|
// println!("Result: {}", env.output)
|
|
|
|
// }
|
|
|
|
// Err(e) => println!("Err: {:?}", e),
|
|
|
|
// };
|
2022-12-29 01:15:59 +01:00
|
|
|
}
|