Skip to main content

i8051_disassembler/
lib.rs

1pub mod address;
2#[cfg(feature = "analysis")]
3pub mod analysis;
4pub mod command;
5pub mod db;
6pub mod labels;
7pub mod note;
8pub mod pattern;
9pub mod region;
10pub mod render;
11
12#[cfg(test)]
13mod tests {
14    use std::process::{Command, Stdio};
15
16    use crate::{address::AddressSpace, db::Db};
17
18    static MATH_BIN: &[u8] = &hex_literal::hex!(
19        "
20        02 00 4c 00 00 00 00 00  00 00 e2 fb ea f2 80 2c
21        00 00 e0 fb ea f0 80 24  e6 b5 02 02 eb f6 22 00
22        e2 b5 02 02 eb f2 22 00  e0 b5 02 02 eb f0 22 30
23        f6 e0 a8 82 20 f5 d3 ea  c6 f5 82 22 8b 82 22 30
24        f6 e6 a8 82 20 f5 d9 80  cf 02 00 a8 75 81 11 12
25        02 04 e5 82 60 03 02 00  49 79 00 e9 44 00 60 1b
26        7a 00 90 02 08 78 01 75  a0 00 e4 93 f2 a3 08 b8
27        00 02 05 a0 d9 f4 da f2  75 a0 ff e4 78 ff f6 d8
28        fd 78 00 e8 44 00 60 0a  79 01 75 a0 00 e4 f3 09
29        d8 fc 78 00 e8 44 00 60  0c 79 00 90 00 01 e4 f0
30        a3 d8 fc d9 fa 02 00 49  75 08 0a 75 09 00 85 08
31        10 85 09 11 90 00 19 12  01 03 85 82 0a 85 83 0b
32        75 10 0a 75 11 00 85 0a  82 85 0b 83 12 01 cc 85
33        82 0c 85 83 0d 85 0c 82  85 0d 83 a3 75 10 0a 75
34        11 00 12 01 96 85 82 0e  85 83 0f af 08 90 80 00
35        ef f0 af 0a a3 ef f0 af  0c a3 ef f0 af 0e a3 ef
36        f0 80 fe e5 82 85 10 f0  a4 c5 82 c0 f0 85 11 f0
37        a4 d0 f0 25 f0 c5 83 85  10 f0 a4 25 83 f5 83 22
38        e5 10 45 11 60 46 7a 01  e5 10 25 e0 f5 10 e5 11
39        33 40 12 f5 11 e5 82 95  10 e5 83 95 11 40 03 0a
40        80 e6 c3 e5 11 13 f5 11  e5 10 13 f5 10 c3 e5 82
41        95 10 f5 f0 e5 83 95 11  40 05 f5 83 85 f0 82 c3
42        e5 11 13 f5 11 e5 10 13  f5 10 da e1 22 7a 10 e4
43        fb fc e5 82 25 e0 f5 82  e5 83 33 f5 83 eb 33 fb
44        ec 33 fc eb 95 10 f5 f0  ec 95 11 40 06 fc ab f0
45        43 82 01 da dd 22 c2 d5  e5 83 30 e7 0d d2 d5 e4
46        c3 95 82 f5 82 e4 95 83  f5 83 e5 11 30 e7 0b e4
47        c3 95 10 f5 10 e4 95 11  f5 11 12 01 20 30 d5 0b
48        e4 c3 95 82 f5 82 e4 95  83 f5 83 22 c2 d5 e5 83
49        30 e7 0d d2 d5 e4 c3 95  82 f5 82 e4 95 83 f5 83
50        e5 11 30 e7 0d b2 d5 e4  c3 95 10 f5 10 e4 95 11
51        f5 11 12 01 6d 30 d5 0b  e4 c3 95 82 f5 82 e4 95
52        83 f5 83 22 75 82 00 22"
53    );
54
55    #[test]
56    fn test_asm_examples() {
57        let mut db = Db::new();
58        db.region_mut(AddressSpace::Code)
59            .set_bytes("test.bin", 0, 0, MATH_BIN);
60
61        db.region_mut(AddressSpace::Code)
62            .auto_disassemble(0)
63            .unwrap_success();
64        db.region_mut(AddressSpace::Code)
65            .auto_disassemble(3)
66            .unwrap_success();
67        db.region_mut(AddressSpace::Code)
68            .auto_disassemble(0xa)
69            .unwrap_success();
70        db.region_mut(AddressSpace::Code)
71            .auto_disassemble(0x10)
72            .unwrap_success();
73        db.region_mut(AddressSpace::Code)
74            .auto_disassemble(0x18)
75            .unwrap_success();
76        db.region_mut(AddressSpace::Code)
77            .auto_disassemble(0x1F)
78            .unwrap_success();
79        db.region_mut(AddressSpace::Code)
80            .auto_disassemble(0x27)
81            .unwrap_success();
82        db.region_mut(AddressSpace::Code)
83            .auto_disassemble(0x2F)
84            .unwrap_success();
85        db.region_mut(AddressSpace::Code)
86            .auto_disassemble(0x3F)
87            .unwrap_success();
88
89        let code = db.to_sdas();
90        for (i, line) in code.lines().enumerate() {
91            eprintln!("{}: {line}", i + 1);
92        }
93
94        try_sdas_compile(&code).unwrap();
95    }
96
97    fn try_sdas_compile(code: &str) -> Result<(), String> {
98        let tempdir = tempfile::tempdir().unwrap();
99        let temp = tempfile::NamedTempFile::new().unwrap();
100        std::fs::write(&temp, code).unwrap();
101
102        let mut process = Command::new("sdas8051");
103        process.arg("-l");
104        process.arg(tempdir.path().join("snippet.lst"));
105        // process.arg("-o");
106        // process.arg(tempdir.path().join("snippet.rel"));
107        // process.arg("-s");
108        // process.arg(tempdir.path().join("snippet.sym"));
109        process.arg(temp.path());
110        process.stdout(Stdio::piped());
111        process.stderr(Stdio::piped());
112        match process.output() {
113            Err(e) => {
114                eprintln!("WARNING: sdas8051 did not run: {e}");
115                return Ok(());
116            }
117            Ok(child) => {
118                if !child.status.success() {
119                    eprintln!("WARNING: sdas8051 failed: {:?}", child.status);
120                    eprintln!("{}", String::from_utf8_lossy(&child.stdout));
121                    eprintln!("{}", String::from_utf8_lossy(&child.stderr));
122                    return Ok(());
123                }
124            }
125        }
126        Ok(())
127    }
128}