msp430_asm/
instruction.rs

1use crate::emulate::*;
2use crate::jxx::*;
3use crate::single_operand::*;
4use crate::two_operand::*;
5
6use std::fmt;
7
8/// A container that holds all types of instructions (including emulated)
9#[derive(Debug, Clone, Copy, PartialEq)]
10pub enum Instruction {
11    // single operand instructions
12    Rrc(Rrc),
13    Swpb(Swpb),
14    Rra(Rra),
15    Sxt(Sxt),
16    Push(Push),
17    Call(Call),
18    Reti(Reti),
19
20    // Jxx instructions
21    Jnz(Jnz),
22    Jz(Jz),
23    Jlo(Jlo),
24    Jc(Jc),
25    Jn(Jn),
26    Jge(Jge),
27    Jl(Jl),
28    Jmp(Jmp),
29
30    // two operand instructions
31    Mov(Mov),
32    Add(Add),
33    Addc(Addc),
34    Subc(Subc),
35    Sub(Sub),
36    Cmp(Cmp),
37    Dadd(Dadd),
38    Bit(Bit),
39    Bic(Bic),
40    Bis(Bis),
41    Xor(Xor),
42    And(And),
43
44    // emulated
45    Adc(Adc),
46    Br(Br),
47    Clr(Clr),
48    Clrc(Clrc),
49    Clrn(Clrn),
50    Clrz(Clrz),
51    Dadc(Dadc),
52    Dec(Dec),
53    Decd(Decd),
54    Dint(Dint),
55    Eint(Eint),
56    Inc(Inc),
57    Incd(Incd),
58    Inv(Inv),
59    Nop(Nop),
60    Pop(Pop),
61    Ret(Ret),
62    Rla(Rla),
63    Rlc(Rlc),
64    Sbc(Sbc),
65    Setc(Setc),
66    Setn(Setn),
67    Setz(Setz),
68    Tst(Tst),
69}
70
71impl Instruction {
72    pub fn size(&self) -> usize {
73        match self {
74            Self::Rrc(inst) => inst.size(),
75            Self::Swpb(inst) => inst.size(),
76            Self::Rra(inst) => inst.size(),
77            Self::Sxt(inst) => inst.size(),
78            Self::Push(inst) => inst.size(),
79            Self::Call(inst) => inst.size(),
80            Self::Reti(inst) => inst.size(),
81            Self::Jnz(inst) => inst.size(),
82            Self::Jz(inst) => inst.size(),
83            Self::Jlo(inst) => inst.size(),
84            Self::Jc(inst) => inst.size(),
85            Self::Jn(inst) => inst.size(),
86            Self::Jge(inst) => inst.size(),
87            Self::Jl(inst) => inst.size(),
88            Self::Jmp(inst) => inst.size(),
89            Self::Mov(inst) => inst.size(),
90            Self::Add(inst) => inst.size(),
91            Self::Addc(inst) => inst.size(),
92            Self::Subc(inst) => inst.size(),
93            Self::Sub(inst) => inst.size(),
94            Self::Cmp(inst) => inst.size(),
95            Self::Dadd(inst) => inst.size(),
96            Self::Bit(inst) => inst.size(),
97            Self::Bic(inst) => inst.size(),
98            Self::Bis(inst) => inst.size(),
99            Self::Xor(inst) => inst.size(),
100            Self::And(inst) => inst.size(),
101            Self::Adc(inst) => inst.size(),
102            Self::Br(inst) => inst.size(),
103            Self::Clr(inst) => inst.size(),
104            Self::Clrc(inst) => inst.size(),
105            Self::Clrn(inst) => inst.size(),
106            Self::Clrz(inst) => inst.size(),
107            Self::Dadc(inst) => inst.size(),
108            Self::Dec(inst) => inst.size(),
109            Self::Decd(inst) => inst.size(),
110            Self::Dint(inst) => inst.size(),
111            Self::Eint(inst) => inst.size(),
112            Self::Inc(inst) => inst.size(),
113            Self::Incd(inst) => inst.size(),
114            Self::Inv(inst) => inst.size(),
115            Self::Nop(inst) => inst.size(),
116            Self::Pop(inst) => inst.size(),
117            Self::Ret(inst) => inst.size(),
118            Self::Rla(inst) => inst.size(),
119            Self::Rlc(inst) => inst.size(),
120            Self::Sbc(inst) => inst.size(),
121            Self::Setc(inst) => inst.size(),
122            Self::Setn(inst) => inst.size(),
123            Self::Setz(inst) => inst.size(),
124            Self::Tst(inst) => inst.size(),
125        }
126    }
127}
128
129impl fmt::Display for Instruction {
130    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
131        match self {
132            Self::Rrc(inst) => write!(f, "{}", inst),
133            Self::Swpb(inst) => write!(f, "{}", inst),
134            Self::Rra(inst) => write!(f, "{}", inst),
135            Self::Sxt(inst) => write!(f, "{}", inst),
136            Self::Push(inst) => write!(f, "{}", inst),
137            Self::Call(inst) => write!(f, "{}", inst),
138            Self::Reti(inst) => write!(f, "{}", inst),
139            Self::Jnz(inst) => write!(f, "{}", inst),
140            Self::Jz(inst) => write!(f, "{}", inst),
141            Self::Jlo(inst) => write!(f, "{}", inst),
142            Self::Jc(inst) => write!(f, "{}", inst),
143            Self::Jn(inst) => write!(f, "{}", inst),
144            Self::Jge(inst) => write!(f, "{}", inst),
145            Self::Jl(inst) => write!(f, "{}", inst),
146            Self::Jmp(inst) => write!(f, "{}", inst),
147            Self::Mov(inst) => write!(f, "{}", inst),
148            Self::Add(inst) => write!(f, "{}", inst),
149            Self::Addc(inst) => write!(f, "{}", inst),
150            Self::Subc(inst) => write!(f, "{}", inst),
151            Self::Sub(inst) => write!(f, "{}", inst),
152            Self::Cmp(inst) => write!(f, "{}", inst),
153            Self::Dadd(inst) => write!(f, "{}", inst),
154            Self::Bit(inst) => write!(f, "{}", inst),
155            Self::Bic(inst) => write!(f, "{}", inst),
156            Self::Bis(inst) => write!(f, "{}", inst),
157            Self::Xor(inst) => write!(f, "{}", inst),
158            Self::And(inst) => write!(f, "{}", inst),
159            Self::Adc(inst) => write!(f, "{}", inst),
160            Self::Br(inst) => write!(f, "{}", inst),
161            Self::Clr(inst) => write!(f, "{}", inst),
162            Self::Clrc(inst) => write!(f, "{}", inst),
163            Self::Clrn(inst) => write!(f, "{}", inst),
164            Self::Clrz(inst) => write!(f, "{}", inst),
165            Self::Dadc(inst) => write!(f, "{}", inst),
166            Self::Dec(inst) => write!(f, "{}", inst),
167            Self::Decd(inst) => write!(f, "{}", inst),
168            Self::Dint(inst) => write!(f, "{}", inst),
169            Self::Eint(inst) => write!(f, "{}", inst),
170            Self::Inc(inst) => write!(f, "{}", inst),
171            Self::Incd(inst) => write!(f, "{}", inst),
172            Self::Inv(inst) => write!(f, "{}", inst),
173            Self::Nop(inst) => write!(f, "{}", inst),
174            Self::Pop(inst) => write!(f, "{}", inst),
175            Self::Ret(inst) => write!(f, "{}", inst),
176            Self::Rla(inst) => write!(f, "{}", inst),
177            Self::Rlc(inst) => write!(f, "{}", inst),
178            Self::Sbc(inst) => write!(f, "{}", inst),
179            Self::Setc(inst) => write!(f, "{}", inst),
180            Self::Setn(inst) => write!(f, "{}", inst),
181            Self::Setz(inst) => write!(f, "{}", inst),
182            Self::Tst(inst) => write!(f, "{}", inst),
183        }
184    }
185}