mirror of
https://github.com/holub/mame
synced 2025-04-22 16:31:49 +03:00
machine/icd2061a: Fix out of bounds array access (#12207)
* machine/icd2061a: Fix out of bounds array access. Add error messages for unimplemented clock settings
This commit is contained in:
parent
c61a23e0dd
commit
092e75bb07
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user