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}