1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
4pub enum RegisterName {
5 A,
6 B,
7 C,
8 D,
9 E,
10 H,
11 L,
12}
13
14#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
20pub struct Registers {
21 pub a: u8,
22 pub b: u8,
23 pub c: u8,
24 pub d: u8,
25 pub e: u8,
26 pub h: u8,
27 pub l: u8,
28 pub w: u8,
29 pub z: u8,
30}
31
32impl Registers {
33 pub fn get(&self, name: RegisterName) -> u8 {
34 match name {
35 RegisterName::A => self.a,
36 RegisterName::B => self.b,
37 RegisterName::C => self.c,
38 RegisterName::D => self.d,
39 RegisterName::E => self.e,
40 RegisterName::H => self.h,
41 RegisterName::L => self.l,
42 }
43 }
44
45 pub fn set(&mut self, name: RegisterName, value: u8) {
46 match name {
47 RegisterName::A => self.a = value,
48 RegisterName::B => self.b = value,
49 RegisterName::C => self.c = value,
50 RegisterName::D => self.d = value,
51 RegisterName::E => self.e = value,
52 RegisterName::H => self.h = value,
53 RegisterName::L => self.l = value,
54 }
55 }
56
57 pub fn bc(&self) -> u16 {
58 u16::from_be_bytes([self.b, self.c])
59 }
60
61 pub fn de(&self) -> u16 {
62 u16::from_be_bytes([self.d, self.e])
63 }
64
65 pub fn hl(&self) -> u16 {
66 u16::from_be_bytes([self.h, self.l])
67 }
68
69 pub fn set_bc(&mut self, value: u16) {
70 let [hi, lo] = value.to_be_bytes();
71 self.b = hi;
72 self.c = lo;
73 }
74
75 pub fn set_de(&mut self, value: u16) {
76 let [hi, lo] = value.to_be_bytes();
77 self.d = hi;
78 self.e = lo;
79 }
80
81 pub fn set_hl(&mut self, value: u16) {
82 let [hi, lo] = value.to_be_bytes();
83 self.h = hi;
84 self.l = lo;
85 }
86
87 pub fn set_wz(&mut self, value: u16) {
90 let [hi, lo] = value.to_be_bytes();
91 self.w = hi;
92 self.z = lo;
93 }
94}