parser/instructions/
operand.rs1use super::super::error;
2
3
4#[derive(Debug, PartialEq, Copy, Clone)]
5pub enum Reg8 {
6 A,
7 F,
8 B,
9 C,
10 D,
11 E,
12 H,
13 L,
14}
15
16impl std::fmt::Display for Reg8 {
17 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
18 write!(f, "{:?}", self)
19 }
20}
21
22#[derive(Debug, PartialEq, Copy, Clone)]
23pub enum Reg16 {
24 AF,
25 BC,
26 DE,
27 HL,
28 SP,
29 PC,
30}
31
32impl std::fmt::Display for Reg16 {
33 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
34 write!(f, "{:?}", self)
35 }
36}
37
38#[derive(Debug, PartialEq, Copy, Clone)]
39pub enum Operand {
40 Imm8(u8),
41 Imm16(u16),
42 Reg8(Reg8),
43 Reg16(Reg16),
44 DerefReg(Reg16),
45}
46
47impl Operand {
48 pub fn imm8_from_bytes(bytes: &[u8]) -> Result<Operand, error::ParserError> {
49 if bytes.len() < 1 {
50 return Err(error::ParserError::NotEnoughBytes(bytes.len()));
51 }
52
53 Ok(Operand::Imm8(u8::from_le_bytes([bytes[0]])))
54 }
55
56 pub fn imm16_from_bytes(bytes: &[u8]) -> Result<Operand, error::ParserError> {
57 if bytes.len() < 2 {
58 return Err(error::ParserError::NotEnoughBytes(bytes.len()));
59 }
60
61 Ok(Operand::Imm16(u16::from_le_bytes([bytes[0], bytes[1]])))
62 }
63
64 pub fn is_immediate(&self) -> bool {
65 match self {
66 Self::Imm8(_) | Self::Imm16(_) => true,
67 _ => false,
68 }
69 }
70
71 pub fn is_register(&self) -> bool {
72 match self {
73 Self::Reg8(_) | Self::Reg16(_) => true,
74 _ => false,
75 }
76 }
77}
78
79impl Operand {
80 pub fn encoding_size(&self) -> usize {
81 match self {
82 Self::Imm8(_) => 1,
83 _ => 0,
84 }
85 }
86}
87
88impl std::fmt::Display for Operand {
89 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
90 match self {
91 Self::Imm8(byte) => write!(f, "{:#X}", byte),
92 Self::Imm16(word) => write!(f, "{:#X}", word),
93 Self::Reg8(reg8) => write!(f, "{}", reg8),
94 Self::Reg16(reg16) => write!(f, "{}", reg16),
95 Self::DerefReg(reg16) => write!(f, "{}", reg16),
96 }
97 }
98}