1use crate::registers::SystemRegisters;
2use std::array;
3
4impl SystemRegisters {
5    pub fn dump(
6        &self,
7        h_interrupt_in_vblank: bool,
8        h_interrupt_interval: u16,
9        mut callback: impl FnMut(&str, &[(&str, &str)]),
10    ) {
11        callback(
12            "$4000 / $A15100",
13            &[
14                ("Adapter enabled", bool_str(self.adapter_enabled)),
15                ("SH-2 reset", bool_str(self.reset_sh2)),
16                ("M PWM interrupt enabled", bool_str(self.master_interrupts.pwm_enabled)),
17                ("S PWM interrupt enabled", bool_str(self.slave_interrupts.pwm_enabled)),
18                ("M command interrupt enabled", bool_str(self.master_interrupts.command_enabled)),
19                ("S command interrupt enabled", bool_str(self.slave_interrupts.command_enabled)),
20                ("M horizontal interrupt enabled", bool_str(self.master_interrupts.h_enabled)),
21                ("S horizontal interrupt enabled", bool_str(self.slave_interrupts.h_enabled)),
22                ("M vertical interrupt enabled", bool_str(self.master_interrupts.v_enabled)),
23                ("S vertical interrupt enabled", bool_str(self.slave_interrupts.v_enabled)),
24                ("H interrupts during VBlank", bool_str(h_interrupt_in_vblank)),
25                ("FM (VDP access)", &self.vdp_access.to_string()),
26            ],
27        );
28
29        callback(
30            "$4002 / $A15102",
31            &[
32                ("M command interrupt pending", bool_str(self.master_interrupts.command_pending)),
33                ("S command interrupt pending", bool_str(self.slave_interrupts.command_pending)),
34            ],
35        );
36
37        callback("$4004", &[("H interrupt interval", &h_interrupt_interval.to_string())]);
38
39        callback("$A15104", &[("68000 cartridge ROM bank", &rom_bank_str(self.m68k_rom_bank))]);
40
41        callback(
42            "$4006 / $A15106",
43            &[
44                ("RV (ROM-to-VRAM DMA allowed)", bool_str(self.dma.rom_to_vram)),
45                ("DREQ active", bool_str(self.dma.active)),
46            ],
47        );
48
49        callback(
50            "$A15108-$A1510A",
51            &[("DREQ source address", &format!("${:06X}", self.dma.source_address))],
52        );
53
54        callback(
55            "$A1510C-$A1510E",
56            &[("DREQ destination address", &format!("${:06X}", self.dma.destination_address))],
57        );
58
59        callback("$A15110", &[("DREQ length", &format!("0x{:04X}", self.dma.length))]);
60
61        let comm_port_strings: [_; 8] = array::from_fn(|i| {
62            (format!("Communication port {i}"), format!("0x{:04X}", self.communication_ports[i]))
63        });
64        let comm_port_strs: [_; 8] =
65            array::from_fn(|i| (comm_port_strings[i].0.as_str(), comm_port_strings[i].1.as_str()));
66
67        callback("Communication ports", &comm_port_strs);
68    }
69}
70
71fn bool_str(b: bool) -> &'static str {
72    if b { "true" } else { "false" }
73}
74
75fn rom_bank_str(bank: u8) -> String {
76    format!("{bank} (${bank:X}00000-${bank:X}FFFFF)")
77}