1use super::isa::Instruction;
4use core::fmt::{self, Display};
5
6impl Display for Instruction {
11 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
12 use Instruction::*;
13 match self {
14 AddReg { dr, sr1, sr2 } => write!(fmt, "ADD {}, {}, {}", dr, sr1, sr2),
15 AddImm { dr, sr1, imm5 } => write!(fmt, "ADD {}, {}, #{}", dr, sr1, imm5),
16 AndReg { dr, sr1, sr2 } => write!(fmt, "AND {}, {}, {}", dr, sr1, sr2),
17 AndImm { dr, sr1, imm5 } => write!(fmt, "AND {}, {}, #{}", dr, sr1, imm5),
18 Br { n, z, p, offset9 } => {
19 let spaces =
20 if *n { 0 } else { 1 } + if *z { 0 } else { 1 } + if *p { 0 } else { 1 };
21
22 write!(fmt, "BR")
23 .and_then(|_| if *n { write!(fmt, "n") } else { Ok(()) })
24 .and_then(|_| if *z { write!(fmt, "z") } else { Ok(()) })
25 .and_then(|_| if *p { write!(fmt, "p") } else { Ok(()) })
26 .and_then(|_| {
27 for _ in 0..=spaces {
28 write!(fmt, " ")?
29 }
30 write!(fmt, "#{}", offset9)
31 })
32 }
33 Jmp { base } => write!(fmt, "JMP {}", base),
34 Jsr { offset11 } => write!(fmt, "JSR #{}", offset11),
35 Jsrr { base } => write!(fmt, "JSRR {}", base),
36 Ld { dr, offset9 } => write!(fmt, "LD {}, #{}", dr, offset9),
37 Ldi { dr, offset9 } => write!(fmt, "LDI {}, #{}", dr, offset9),
38 Ldr { dr, base, offset6 } => write!(fmt, "LDR {}, {}, #{}", dr, base, offset6),
39 Lea { dr, offset9 } => write!(fmt, "LEA {}, #{}", dr, offset9),
40 Not { dr, sr } => write!(fmt, "NOT {}, {}", dr, sr),
41 Ret => write!(fmt, "RET"),
42 Rti => write!(fmt, "RTI"),
43 St { sr, offset9 } => write!(fmt, "ST {}, #{}", sr, offset9),
44 Sti { sr, offset9 } => write!(fmt, "STI {}, #{}", sr, offset9),
45 Str { sr, base, offset6 } => write!(fmt, "STR {}, {}, #{}", sr, base, offset6),
46 Trap { trapvec } => write!(fmt, "TRAP x{:X}", trapvec),
47 }
48 }
49}