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