diff --git a/devices/video/atimach64gx.cpp b/devices/video/atimach64gx.cpp
index bd21f30..862879c 100644
--- a/devices/video/atimach64gx.cpp
+++ b/devices/video/atimach64gx.cpp
@@ -35,6 +35,94 @@ along with this program. If not, see .
#include
+/* Human readable Mach64 HW register names for easier debugging. */
+static const std::map mach64_reg_names = {
+ #define one_reg_name(x) {ATI_ ## x, #x}
+ one_reg_name(CRTC_H_TOTAL_DISP),
+ one_reg_name(CRTC_H_SYNC_STRT_WID),
+ one_reg_name(CRTC_V_TOTAL_DISP),
+ one_reg_name(CRTC_V_SYNC_STRT_WID),
+ one_reg_name(CRTC_VLINE_CRNT_VLINE),
+ one_reg_name(CRTC_OFF_PITCH),
+ one_reg_name(CRTC_INT_CNTL),
+ one_reg_name(CRTC_GEN_CNTL),
+ one_reg_name(DSP_CONFIG),
+ one_reg_name(DSP_ON_OFF),
+ one_reg_name(MEM_BUF_CNTL),
+ one_reg_name(MEM_ADDR_CFG),
+ one_reg_name(OVR_CLR),
+ one_reg_name(OVR_WID_LEFT_RIGHT),
+ one_reg_name(OVR_WID_TOP_BOTTOM),
+ one_reg_name(CUR_CLR0),
+ one_reg_name(CUR_CLR1),
+ one_reg_name(CUR_OFFSET),
+ one_reg_name(CUR_HORZ_VERT_POSN),
+ one_reg_name(CUR_HORZ_VERT_OFF),
+ one_reg_name(GP_IO),
+ one_reg_name(HW_DEBUG),
+ one_reg_name(SCRATCH_REG0),
+ one_reg_name(SCRATCH_REG1),
+ one_reg_name(SCRATCH_REG2),
+ one_reg_name(SCRATCH_REG3),
+ one_reg_name(CLOCK_CNTL),
+ one_reg_name(BUS_CNTL),
+ one_reg_name(EXT_MEM_CNTL),
+ one_reg_name(MEM_CNTL),
+ one_reg_name(DAC_REGS),
+ one_reg_name(DAC_CNTL),
+ one_reg_name(GEN_TEST_CNTL),
+ one_reg_name(CUSTOM_MACRO_CNTL),
+ one_reg_name(CONFIG_CNTL),
+ one_reg_name(CONFIG_CHIP_ID),
+ one_reg_name(CONFIG_STAT0),
+ one_reg_name(DST_OFF_PITCH),
+ one_reg_name(DST_X),
+ one_reg_name(DST_Y),
+ one_reg_name(DST_WIDTH),
+ one_reg_name(DST_HEIGHT),
+ one_reg_name(SRC_CNTL),
+ one_reg_name(SCALE_3D_CNTL),
+ one_reg_name(PAT_REG0),
+ one_reg_name(PAT_REG1),
+ one_reg_name(SC_LEFT),
+ one_reg_name(SC_RIGHT),
+ one_reg_name(SC_TOP),
+ one_reg_name(SC_BOTTOM),
+ one_reg_name(DP_BKGD_CLR),
+ one_reg_name(DP_FRGD_CLR), // also DP_FOG_CLR for GT
+ one_reg_name(DP_WRITE_MSK),
+ one_reg_name(DP_PIX_WIDTH),
+ one_reg_name(DP_MIX),
+ one_reg_name(DP_SRC),
+ one_reg_name(CLR_CMP_CNTL),
+ one_reg_name(FIFO_STAT),
+ one_reg_name(GUI_TRAJ_CNTL),
+ one_reg_name(GUI_STAT),
+ one_reg_name(MPP_CONFIG),
+ one_reg_name(MPP_STROBE_SEQ),
+ one_reg_name(MPP_ADDR),
+ one_reg_name(MPP_DATA),
+ one_reg_name(TVO_CNTL),
+ one_reg_name(SETUP_CNTL),
+ #undef one_reg_name
+};
+
+static const std::map rgb514_reg_names = {
+ #define one_reg_name(x) {Rgb514::x, #x}
+ one_reg_name(MISC_CLK_CNTL),
+ one_reg_name(HOR_SYNC_POS),
+ one_reg_name(PWR_MNMGMT),
+ one_reg_name(PIX_FORMAT),
+ one_reg_name(PLL_CTL_1),
+ one_reg_name(F0_M0),
+ one_reg_name(F1_N0),
+ one_reg_name(MISC_CNTL_1),
+ one_reg_name(MISC_CNTL_2),
+ one_reg_name(VRAM_MASK_LO),
+ one_reg_name(VRAM_MASK_HI),
+ #undef one_reg_name
+};
+
AtiMach64Gx::AtiMach64Gx()
: PCIDevice("ati-mach64-gx"), VideoCtrlBase(1024, 768)
{
@@ -188,6 +276,15 @@ bool AtiMach64Gx::pci_io_write(uint32_t offset, uint32_t value, uint32_t size)
return true;
}
+const char* AtiMach64Gx::get_reg_name(uint32_t reg_num) {
+ auto iter = mach64_reg_names.find(reg_num);
+ if (iter != mach64_reg_names.end()) {
+ return iter->second.c_str();
+ } else {
+ return "unknown Mach64 register";
+ }
+}
+
uint32_t AtiMach64Gx::read_reg(uint32_t reg_offset, uint32_t size)
{
uint32_t offset = reg_offset & 3;
@@ -383,6 +480,16 @@ void AtiMach64Gx::rgb514_write_reg(uint8_t reg_addr, uint8_t value)
}
}
+const char* AtiMach64Gx::rgb514_get_reg_name(uint32_t reg_addr)
+{
+ auto iter = rgb514_reg_names.find(reg_addr);
+ if (iter != rgb514_reg_names.end()) {
+ return iter->second.c_str();
+ } else {
+ return "unknown rgb514 register";
+ }
+}
+
void AtiMach64Gx::rgb514_write_ind_reg(uint8_t reg_addr, uint8_t value)
{
this->dac_regs[reg_addr] = value;
diff --git a/devices/video/atimach64gx.h b/devices/video/atimach64gx.h
index 2f2795a..2a44cf3 100644
--- a/devices/video/atimach64gx.h
+++ b/devices/video/atimach64gx.h
@@ -1,6 +1,6 @@
/*
DingusPPC - The Experimental PowerPC Macintosh emulator
-Copyright (C) 2018-23 divingkatae and maximum
+Copyright (C) 2018-24 divingkatae and maximum
(theweirdo) spatium
(Contact divingkatae#1017 or powermax#2286 on Discord for more info)
@@ -55,6 +55,8 @@ public:
protected:
void notify_bar_change(int bar_num);
+ const char* get_reg_name(uint32_t reg_offset);
+ const char* rgb514_get_reg_name(uint32_t reg_offset);
uint32_t read_reg(uint32_t reg_offset, uint32_t size);
void write_reg(uint32_t reg_offset, uint32_t value, uint32_t size);
void enable_crtc_internal();