mirror of
https://github.com/holub/mame
synced 2025-05-24 23:05:32 +03:00
ics2115: update stream before r/w, some irq flag fixes
This commit is contained in:
parent
debe1e0592
commit
f35880d60f
@ -225,7 +225,6 @@ device_memory_interface::space_config_vector ics2115_device::memory_space_config
|
||||
*/
|
||||
int ics2115_device::ics2115_voice::update_volume_envelope()
|
||||
{
|
||||
|
||||
// test for boundary cross
|
||||
bool bc = false;
|
||||
if (vol.acc >= vol.end || vol.acc <= vol.end)
|
||||
@ -520,12 +519,13 @@ void ics2115_device::sound_stream_update(sound_stream &stream, std::vector<read_
|
||||
|
||||
if (irq_invalid)
|
||||
recalc_irq();
|
||||
|
||||
}
|
||||
|
||||
//Helper Function (Reads off current register)
|
||||
u16 ics2115_device::reg_read()
|
||||
{
|
||||
m_stream->update();
|
||||
|
||||
u16 ret = 0;
|
||||
ics2115_voice& voice = m_voice[m_osc_select];
|
||||
|
||||
@ -632,9 +632,6 @@ u16 ics2115_device::reg_read()
|
||||
if (v.osc_conf.bitflags.irq_pending || v.vol_ctrl.bitflags.irq_pending)
|
||||
{
|
||||
ret = i | 0xe0;
|
||||
ret &= v.vol_ctrl.bitflags.irq_pending ? (~0x40) : 0xff;
|
||||
ret &= v.osc_conf.bitflags.irq_pending ? (~0x80) : 0xff;
|
||||
recalc_irq();
|
||||
if (v.osc_conf.bitflags.irq_pending)
|
||||
{
|
||||
v.osc_conf.bitflags.irq_pending = 0;
|
||||
@ -645,6 +642,7 @@ u16 ics2115_device::reg_read()
|
||||
v.vol_ctrl.bitflags.irq_pending = 0;
|
||||
ret &= ~0x40;
|
||||
}
|
||||
recalc_irq();
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -710,6 +708,8 @@ u16 ics2115_device::reg_read()
|
||||
|
||||
void ics2115_device::reg_write(u16 data, u16 mem_mask)
|
||||
{
|
||||
m_stream->update();
|
||||
|
||||
ics2115_voice& voice = m_voice[m_osc_select];
|
||||
if (m_reg_select < 0x20)
|
||||
COMBINE_DATA(&voice.regs[m_reg_select]);
|
||||
@ -723,6 +723,7 @@ void ics2115_device::reg_write(u16 data, u16 mem_mask)
|
||||
{
|
||||
voice.osc_conf.value &= 0x80;
|
||||
voice.osc_conf.value |= (data >> 8) & 0x7f;
|
||||
recalc_irq();
|
||||
}
|
||||
break;
|
||||
|
||||
@ -822,6 +823,7 @@ void ics2115_device::reg_write(u16 data, u16 mem_mask)
|
||||
{
|
||||
voice.vol_ctrl.value &= 0x80;
|
||||
voice.vol_ctrl.value |= (data >> 8) & 0x7f;
|
||||
recalc_irq();
|
||||
}
|
||||
break;
|
||||
|
||||
@ -942,6 +944,7 @@ u8 ics2115_device::read(offs_t offset)
|
||||
{
|
||||
case 0:
|
||||
//TODO: check this suspect code
|
||||
m_stream->update();
|
||||
if (m_irq_on)
|
||||
{
|
||||
ret |= 0x80;
|
||||
@ -1086,7 +1089,10 @@ void ics2115_device::recalc_irq()
|
||||
//Suspect
|
||||
bool irq = (m_irq_pending & m_irq_enabled);
|
||||
for (int i = 0; (!irq) && (i < 32); i++)
|
||||
irq |= m_voice[i].vol_ctrl.bitflags.irq_pending || m_voice[i].osc_conf.bitflags.irq_pending;
|
||||
{
|
||||
irq |= m_voice[i].osc_conf.bitflags.irq && m_voice[i].osc_conf.bitflags.irq_pending;
|
||||
irq |= m_voice[i].vol_ctrl.bitflags.irq && m_voice[i].vol_ctrl.bitflags.irq_pending;
|
||||
}
|
||||
m_irq_on = irq;
|
||||
m_irq_cb(irq ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user