1use crate::emulate::*;
2use crate::jxx::*;
3use crate::single_operand::*;
4use crate::two_operand::*;
5
6use std::fmt;
7
8#[derive(Debug, Clone, Copy, PartialEq)]
10pub enum Instruction {
11 Rrc(Rrc),
13 Swpb(Swpb),
14 Rra(Rra),
15 Sxt(Sxt),
16 Push(Push),
17 Call(Call),
18 Reti(Reti),
19
20 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 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 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}