use crate::flags::Flags;
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct Registers {
pub a: u8,
pub f: Flags,
pub b: u8,
pub c: u8,
pub d: u8,
pub e: u8,
pub h: u8,
pub l: u8,
pub a2: u8,
pub f2: Flags,
pub b2: u8,
pub c2: u8,
pub d2: u8,
pub e2: u8,
pub h2: u8,
pub l2: u8,
pub ix: u16,
pub iy: u16,
pub sp: u16,
pub pc: u16,
pub i: u8,
pub r: u8,
pub wz: u16,
}
impl Registers {
#[inline(always)]
pub fn af(&self) -> u16 {
((self.a as u16) << 8) | (self.f.bits() as u16)
}
#[inline(always)]
pub fn set_af(&mut self, val: u16) {
self.a = (val >> 8) as u8;
self.f = Flags::from_bits_retain(val as u8);
}
#[inline(always)]
pub fn bc(&self) -> u16 {
((self.b as u16) << 8) | (self.c as u16)
}
#[inline(always)]
pub fn set_bc(&mut self, val: u16) {
self.b = (val >> 8) as u8;
self.c = val as u8;
}
#[inline(always)]
pub fn de(&self) -> u16 {
((self.d as u16) << 8) | (self.e as u16)
}
#[inline(always)]
pub fn set_de(&mut self, val: u16) {
self.d = (val >> 8) as u8;
self.e = val as u8;
}
#[inline(always)]
pub fn hl(&self) -> u16 {
((self.h as u16) << 8) | (self.l as u16)
}
#[inline(always)]
pub fn set_hl(&mut self, val: u16) {
self.h = (val >> 8) as u8;
self.l = val as u8;
}
#[inline(always)]
pub fn hlx(&self, idx: u8) -> u16 {
match idx {
0 => self.hl(),
1 => self.ix,
_ => self.iy,
}
}
#[inline(always)]
pub fn set_hlx(&mut self, idx: u8, val: u16) {
match idx {
0 => self.set_hl(val),
1 => self.ix = val,
_ => self.iy = val,
}
}
#[inline(always)]
pub fn hlx_h(&self, idx: u8) -> u8 {
(self.hlx(idx) >> 8) as u8
}
#[inline(always)]
pub fn hlx_l(&self, idx: u8) -> u8 {
self.hlx(idx) as u8
}
#[inline(always)]
pub fn set_hlx_h(&mut self, idx: u8, val: u8) {
let v = (self.hlx(idx) & 0x00FF) | ((val as u16) << 8);
self.set_hlx(idx, v);
}
#[inline(always)]
pub fn set_hlx_l(&mut self, idx: u8, val: u8) {
let v = (self.hlx(idx) & 0xFF00) | (val as u16);
self.set_hlx(idx, v);
}
#[inline(always)]
pub fn wz_l(&self) -> u8 {
self.wz as u8
}
#[inline(always)]
pub fn wz_h(&self) -> u8 {
(self.wz >> 8) as u8
}
#[inline(always)]
pub fn set_wz_l(&mut self, val: u8) {
self.wz = (self.wz & 0xFF00) | (val as u16);
}
#[inline(always)]
pub fn set_wz_h(&mut self, val: u8) {
self.wz = (self.wz & 0x00FF) | ((val as u16) << 8);
}
#[inline(always)]
pub fn sp_l(&self) -> u8 {
self.sp as u8
}
#[inline(always)]
pub fn sp_h(&self) -> u8 {
(self.sp >> 8) as u8
}
#[inline(always)]
pub fn set_sp_l(&mut self, val: u8) {
self.sp = (self.sp & 0xFF00) | (val as u16);
}
#[inline(always)]
pub fn set_sp_h(&mut self, val: u8) {
self.sp = (self.sp & 0x00FF) | ((val as u16) << 8);
}
#[inline(always)]
pub fn pc_l(&self) -> u8 {
self.pc as u8
}
#[inline(always)]
pub fn pc_h(&self) -> u8 {
(self.pc >> 8) as u8
}
#[inline(always)]
pub fn set_pc_l(&mut self, val: u8) {
self.pc = (self.pc & 0xFF00) | (val as u16);
}
#[inline(always)]
pub fn set_pc_h(&mut self, val: u8) {
self.pc = (self.pc & 0x00FF) | ((val as u16) << 8);
}
#[inline(always)]
pub fn swap_af(&mut self) {
core::mem::swap(&mut self.a, &mut self.a2);
core::mem::swap(&mut self.f, &mut self.f2);
}
#[inline(always)]
pub fn swap_exx(&mut self) {
core::mem::swap(&mut self.b, &mut self.b2);
core::mem::swap(&mut self.c, &mut self.c2);
core::mem::swap(&mut self.d, &mut self.d2);
core::mem::swap(&mut self.e, &mut self.e2);
core::mem::swap(&mut self.h, &mut self.h2);
core::mem::swap(&mut self.l, &mut self.l2);
}
}