Skip to main content

k580_core/
registers.rs

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/// Programmer-visible registers plus the internal `W`/`Z` scratch pair.
15/// `W`/`Z` are not in `RegisterName` – no 8080 instruction addresses
16/// them directly. They sit on `Registers` only so the UI can show the
17/// address residue the microcode parks there. Treated as write-only
18/// from the core's perspective.
19#[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    /// 8080 microcode order: high byte → `W`, low byte → `Z` (low
88    /// arrives first into Z, high into W).
89    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}