lc3_isa/
fmt.rs

1//! Format impls. (TODO)
2
3use super::isa::Instruction;
4use core::fmt::{self, Display};
5
6// TODO: impl UpperHex/LowerHex/Binary? (i.e. have immediates print in the fmt)
7// TODO: when the alternate formatting is specified (`#`), do `x25` style
8// literals instead of the usual `0x25`?
9
10impl 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}