]> Witch of Git - jade-rose/blob - toolchain/src/inst.rs
Add an instruction parser
[jade-rose] / toolchain / src / inst.rs
1 pub mod decode;
2 pub mod encode;
3 pub mod parse;
4 #[cfg(test)]
5 pub mod test;
6
7 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
8 #[repr(u8)]
9 pub enum Op1 {
10 Zero,
11 Lsl1,
12 Lsr1,
13 Asr1,
14 Incr,
15 Decr,
16 Comp,
17 Negt,
18 }
19
20 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
21 #[repr(u8)]
22 pub enum OpR {
23 Add,
24 Sub,
25 And,
26 Ior,
27 Xor,
28 Lsl,
29 Lsr,
30 Asr,
31 }
32
33 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
34 #[repr(u8)]
35 pub enum OpI3 {
36 Rol,
37 Lsl,
38 Lsr,
39 Asr,
40 Clr,
41 Set,
42 Tog,
43 Ext,
44 }
45
46 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
47 #[repr(u8)]
48 pub enum Data {
49 D1,
50 D2,
51 }
52
53 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
54 pub enum Special {
55 Data(Data),
56 Code,
57 }
58
59 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
60 pub struct Reg(U3);
61 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
62 pub struct U3(u8);
63 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
64 pub struct AddImm(i8);
65
66 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
67 pub enum AluI {
68 And(u8),
69 Ior(u8),
70 Xor(u8),
71 Add(AddImm),
72 Compact(OpI3, U3),
73 }
74
75 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
76 pub enum Inst {
77 Trap,
78 JAbs,
79 CAbs,
80 JOff,
81 COff,
82 Swap(Reg),
83 GetR(Reg),
84 SetR(Reg),
85 Get(Special),
86 Set(Special),
87 Alu1(Op1),
88 IsLt(Reg),
89 AluR(OpR, Reg),
90 LdD(Data, Reg, bool),
91 StD(Data, Reg, bool),
92 AluI(AluI),
93 BEzI(i8),
94 JOfI(i8),
95 COfI(i8),
96 }
97
98 impl Reg {
99 pub fn new(x: u8) -> Option<Reg> {
100 U3::new(x).map(Reg)
101 }
102 }
103
104 impl U3 {
105 pub fn new(x: u8) -> Option<U3> {
106 match x {
107 0..=7 => Some(U3(x)),
108 _ => None,
109 }
110 }
111 }
112
113 impl AddImm {
114 pub fn new(x: i8) -> Option<AddImm> {
115 match x {
116 -64..=127 => Some(AddImm(x)),
117 _ => None,
118 }
119 }
120 }