parser/instructions/
operand.rs

1use 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}