#![feature(rust_2018_preview)]
#![feature(rust_2018_idioms)]
#![feature(try_from)]
#![warn(missing_docs, missing_debug_implementations)]
pub mod instruction;
pub mod assembled;
pub mod disassembled;
pub mod prelude {
pub use crate::assembled::prelude::*;
pub use crate::disassembled::prelude::*;
pub use crate::instruction::prelude::*;
}
use self::prelude::*;
pub fn main() -> Result<(), Box<std::any::Any + Send>> {
let disassembled = DisassembledRom::from({
let main_addr = 0x0000;
let init_addr = 0x0030;
vec![
RomBlock {
address: Some(main_addr),
content: Code(vec![INC(A), INC(A), INC(A)]),
},
RomBlock {
address: None,
content: Code(vec![DEC(A)]),
},
RomBlock {
address: Some(main_addr + 0x0005),
content: Code(vec![DEC(A), JP(init_addr)]),
},
RomBlock {
address: None,
content: Data(vec![
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x02,
0x03, 0x04, 0x05, 0x06, 0x07, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
]),
},
RomBlock {
address: Some(init_addr),
content: Code(vec![DEC(A), JP(main_addr)]),
},
]
});
println!("=== Input ===");
println!("{:?}\n", disassembled);
println!("{}\n", disassembled);
println!("=== Assembled ===");
let assembled = disassembled.assemble();
println!("{:?}\n", assembled.to_bytes());
println!("=== Redisassembled (using metadata) ===");
let redisassembled = assembled.disassemble();
println!("{:?}\n", redisassembled);
println!("{}\n", redisassembled);
println!("=== Redisassembled (just from the bytes) ===");
let really_disassembled = AssembledRom::new(assembled.to_bytes()).disassemble();
println!("{:?}\n", really_disassembled);
println!("{}\n", really_disassembled);
Ok(())
}
#[test]
fn test_main() -> Result<(), Box<std::any::Any + Send>> {
main()
}