z80emu/z80/
debug.rs

1/*
2    z80emu: ZiLOG Z80 microprocessor emulation library.
3    Copyright (C) 2019-2024  Rafal Michalski
4
5    For the full copyright notice, see the lib.rs file.
6*/
7use 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}