summaryrefslogtreecommitdiffstats
path: root/src/mame/machine/tsconf.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/tsconf.cpp')
-rw-r--r--src/mame/machine/tsconf.cpp71
1 files changed, 31 insertions, 40 deletions
diff --git a/src/mame/machine/tsconf.cpp b/src/mame/machine/tsconf.cpp
index 3540708fbf8..1204fa16140 100644
--- a/src/mame/machine/tsconf.cpp
+++ b/src/mame/machine/tsconf.cpp
@@ -767,56 +767,47 @@ void tsconf_state::dma_ready(int line)
}
}
-void tsconf_state::device_timer(emu_timer &timer, device_timer_id id, int param)
+TIMER_CALLBACK_MEMBER(tsconf_state::irq_frame)
{
- switch (id)
+ if (BIT(m_regs[INT_MASK], 0))
{
- case TIMER_IRQ_FRAME:
+ m_maincpu->set_input_line_and_vector(0, ASSERT_LINE, 0xff);
+ m_irq_off_timer->adjust(m_maincpu->clocks_to_attotime(32 * (1 << (m_regs[SYS_CONFIG] & 0x03))));
+ }
+}
+
+TIMER_CALLBACK_MEMBER(tsconf_state::irq_scanline)
+{
+ u16 screen_vpos = m_screen->vpos();
+ m_line_irq_timer->adjust(m_screen->time_until_pos(screen_vpos + 1));
+ if (BIT(m_regs[INT_MASK], 1))
{
- if (BIT(m_regs[INT_MASK], 0))
- {
- m_maincpu->set_input_line_and_vector(0, ASSERT_LINE, 0xff);
- m_irq_off_timer->adjust(m_maincpu->clocks_to_attotime(32 * (1 << (m_regs[SYS_CONFIG] & 0x03))));
- }
- break;
+ m_maincpu->set_input_line_and_vector(0, ASSERT_LINE, 0xfd);
+ // Not quite precise. Scanline can't be skipped.
+ m_irq_off_timer->adjust(m_maincpu->clocks_to_attotime(32 * (1 << (m_regs[SYS_CONFIG] & 0x03))));
}
- case TIMER_IRQ_SCANLINE:
+ if (BIT(m_regs[INT_MASK], 0) && OFFS_512(VS_INT_L) == screen_vpos && m_regs[HS_INT] == 0)
{
- u16 screen_vpos = m_screen->vpos();
- m_line_irq_timer->adjust(m_screen->time_until_pos(screen_vpos + 1));
- if (BIT(m_regs[INT_MASK], 1))
- {
- m_maincpu->set_input_line_and_vector(0, ASSERT_LINE, 0xfd);
- // Not quite precise. Scanline can't be skipped.
- m_irq_off_timer->adjust(m_maincpu->clocks_to_attotime(32 * (1 << (m_regs[SYS_CONFIG] & 0x03))));
- }
- if (BIT(m_regs[INT_MASK], 0) && OFFS_512(VS_INT_L) == screen_vpos && m_regs[HS_INT] == 0)
- {
- m_maincpu->set_input_line_and_vector(0, ASSERT_LINE, 0xff);
- m_irq_off_timer->adjust(m_maincpu->clocks_to_attotime(32 * (1 << (m_regs[SYS_CONFIG] & 0x03))));
- }
+ m_maincpu->set_input_line_and_vector(0, ASSERT_LINE, 0xff);
+ m_irq_off_timer->adjust(m_maincpu->clocks_to_attotime(32 * (1 << (m_regs[SYS_CONFIG] & 0x03))));
+ }
- m_screen->update_now();
- for (const auto &[reg, val] : m_scanline_delayed_regs_update)
+ m_screen->update_now();
+ for (const auto &[reg, val] : m_scanline_delayed_regs_update)
+ {
+ m_regs[reg] = val;
+ switch (reg)
{
- m_regs[reg] = val;
- switch (reg)
- {
- case G_Y_OFFS_L:
- case G_Y_OFFS_H:
- m_gfx_y_frame_offset = get_screen_area().top() - m_screen->vpos();
- break;
+ case G_Y_OFFS_L:
+ case G_Y_OFFS_H:
+ m_gfx_y_frame_offset = get_screen_area().top() - m_screen->vpos();
+ break;
- default:
- break;
- }
+ default:
+ break;
}
- m_scanline_delayed_regs_update.clear();
- break;
- }
- default:
- spectrum_state::device_timer(timer, id, param);
}
+ m_scanline_delayed_regs_update.clear();
}
u8 tsconf_state::beta_neutral_r(offs_t offset)