Skip to main content

disasm_text/
disasm_text.rs

1//! Disassemble raw little-endian SH text read from stdin.
2
3use std::io::Read;
4
5use superh::{DecodeOptions, FormatOptions, ParseEndian, ParseMode, ParsedValue, Parser};
6
7fn main() {
8    let args: Vec<String> = std::env::args().collect();
9    let base_address = args.get(1).map_or(0, |value| {
10        let value = value.strip_prefix("0x").unwrap_or(value);
11        u32::from_str_radix(value, 16).expect("base address must be hexadecimal")
12    });
13
14    let mut bytes = Vec::new();
15    std::io::stdin().read_to_end(&mut bytes).expect("read stdin");
16
17    let format = FormatOptions::default();
18    let mut parser =
19        Parser::new(&bytes, ParseMode::Instruction, ParseEndian::Little, DecodeOptions::default());
20    parser.set_address(base_address);
21
22    for item in parser {
23        match item.value {
24            ParsedValue::Instruction { result, .. } => {
25                println!("{:08x}: {}", item.address, result.display_at(item.address, &format));
26            }
27            ParsedValue::Data(data) => println!("{:08x}: {}", item.address, data.display()),
28            _ => {}
29        }
30    }
31}