From 092e75bb07553ccccedd82fc5cb04ca17296eb77 Mon Sep 17 00:00:00 2001 From: 987123879113 <63495610+987123879113@users.noreply.github.com> Date: Tue, 2 Apr 2024 21:21:00 +0900 Subject: [PATCH] machine/icd2061a: Fix out of bounds array access (#12207) * machine/icd2061a: Fix out of bounds array access. Add error messages for unimplemented clock settings --- src/devices/machine/icd2061a.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/devices/machine/icd2061a.cpp b/src/devices/machine/icd2061a.cpp index 62c90f72055..1dfe44a1e06 100644 --- a/src/devices/machine/icd2061a.cpp +++ b/src/devices/machine/icd2061a.cpp @@ -24,11 +24,15 @@ #define LOG_PINS (1 << 1) #define LOG_STATE (1 << 2) +#define LOG_TODO (1 << 3) -// #define VERBOSE (LOG_GENERAL | LOG_PINS | LOG_STATE) +// #define VERBOSE (LOG_GENERAL | LOG_PINS | LOG_STATE | LOG_TODO) +#define VERBOSE (LOG_TODO) #include "logmacro.h" +#define LOGTODO(...) LOGMASKED(LOG_TODO, __VA_ARGS__) + DEFINE_DEVICE_TYPE(ICD2061A, icd2061a_device, "icd2061a", "IC Designs 2061A Dual Programmable Graphics Clock Generator") @@ -168,6 +172,8 @@ TIMER_CALLBACK_MEMBER( icd2061a_device::update_clock_callback ) const int m = BIT(m_regs[MREG], 7, 3); // post-vco divisor const int q = BIT(m_regs[MREG], 0, 7) + 2; // q counter value m_reg_clocks[MREG] = (clock() * m_prescale[a] * (p / double(q))) / (1 << m); + } else { + LOGTODO("unimplemented mclkout selected %d\n", m_mclkout_select); } if (m_reg_clocks[MREG] != m_mclkout_clock) { @@ -189,18 +195,23 @@ TIMER_CALLBACK_MEMBER( icd2061a_device::update_clock_callback ) else if (m_outdis == 1 && m_pwrdwn == 1 && m_sel1 == 1 && (m_intclk == 1 || m_sel0 == 1)) m_vclkout_select = VCLKOUT_REG2; + uint32_t vclkout_clock = m_vclkout_clock; if (m_vclkout_select == VCLKOUT_FEATCLK) { - m_reg_clocks[m_vclkout_select] = m_featclock; + vclkout_clock = m_featclock; } else if (m_vclkout_select >= VCLKOUT_REG0 && m_vclkout_select <= VCLKOUT_REG2) { const int a = BIT(m_regs[m_vclkout_select], 21, 2); // register addr const int p = BIT(m_regs[m_vclkout_select], 10, 7) + 3; // p counter value const int m = BIT(m_regs[m_vclkout_select], 7, 3); // post-vco divisor const int q = BIT(m_regs[m_vclkout_select], 0, 7) + 2; // q counter value - m_reg_clocks[m_vclkout_select] = (clock() * m_prescale[a] * (p / double(q))) / (1 << m); + vclkout_clock = m_reg_clocks[m_vclkout_select] = (clock() * m_prescale[a] * (p / double(q))) / (1 << m); + } else { + LOGTODO("unimplemented vclkout selected %d\n", m_vclkout_select); } - m_vclkout_changed_cb(m_reg_clocks[m_vclkout_select]); - m_vclkout_clock = m_reg_clocks[m_vclkout_select]; + if (vclkout_clock != m_vclkout_clock) { + m_vclkout_clock = vclkout_clock; + m_vclkout_changed_cb(vclkout_clock); + } } void icd2061a_device::update_clock()