1use core::num::Wrapping;
8use crate::cpu::{Prefix, CpuDebug, CpuDebugCode, CpuDebugArgs};
9use super::flavours::Flavour;
10use super::Z80;
11
12impl<Q: Flavour> core::fmt::Debug for Z80<Q> {
13 #[inline(never)]
14 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
15 f.debug_struct("Z80")
16 .field("pc", &self.pc.get16())
17 .field("sp", &self.sp.get16())
18 .field("af", &self.af.get16())
19 .field("bc", &self.regs.bc.get16())
20 .field("de", &self.regs.de.get16())
21 .field("hl", &self.regs.hl.get16())
22 .field("af'", &self.af_alt.get16())
23 .field("bc'", &self.regs_alt.bc.get16())
24 .field("de'", &self.regs_alt.de.get16())
25 .field("hl'", &self.regs_alt.hl.get16())
26 .field("ix", &self.index.ix.get16())
27 .field("iy", &self.index.iy.get16())
28 .field("ir", &self.ir.get16())
29 .field("r", &self.r.0)
30 .field("im", &self.im)
31 .field("iff1", &self.iff1)
32 .field("iff2", &self.iff2)
33 .field("halt", &self.halt)
34 .field("ei", &self.last_ei)
35 .field("mp", &self.memptr.get16())
36 .field("prefix", &self.prefix)
37 .finish()
38 }
39}
40
41impl CpuDebug {
42 #[inline(never)]
43 pub(super) fn debug_instruction<F>(
44 mnemonic: &'static str,
45 args: CpuDebugArgs,
46 prefix: Option<Prefix>,
47 bytes: &[u8],
48 pc: Wrapping<u16>,
49 debugger: F
50 )
51 where F: FnOnce(CpuDebug)
52 {
53 let mut code = CpuDebugCode::new();
54 if let Some(pfx) = prefix {
55 code.push(pfx.to_code());
56 }
57 code.extend(bytes.iter().copied());
58 let pc = (pc - Wrapping(code.len() as u16)).0;
59 debugger(CpuDebug {
60 code,
61 mnemonic,
62 pc,
63 prefix,
64 args
65 });
66 }
67}