diff options
-rw-r--r-- | src/mame/atari/dragrace.cpp | 24 | ||||
-rw-r--r-- | src/mame/atari/dragrace.h | 4 |
2 files changed, 24 insertions, 4 deletions
diff --git a/src/mame/atari/dragrace.cpp b/src/mame/atari/dragrace.cpp index 0fb85b02dda..fa8dee874e4 100644 --- a/src/mame/atari/dragrace.cpp +++ b/src/mame/atari/dragrace.cpp @@ -38,6 +38,21 @@ TIMER_DEVICE_CALLBACK_MEMBER(dragrace_state::frame_callback) m_watchdog->watchdog_enable(m_in[0]->read() & 0x20); } +TIMER_CALLBACK_MEMBER(dragrace_state::scanline_irq) +{ + m_maincpu->set_input_line(M6800_IRQ_LINE, ASSERT_LINE); + m_irq_off_timer->adjust(m_screen->scan_period() * 3); + + // Four IRQs per frame (vpos = 64, 128, 192, 240) + int scanline = m_screen->vpos(); + m_scan_timer->adjust(m_screen->time_until_pos(scanline < 240 ? std::min(scanline + 64, 240) : 64)); +} + +TIMER_CALLBACK_MEMBER(dragrace_state::irq_off) +{ + m_maincpu->set_input_line(M6800_IRQ_LINE, CLEAR_LINE); +} + void dragrace_state::speed1_w(uint8_t data) { @@ -263,6 +278,10 @@ void dragrace_state::machine_start() m_gear_sel.resolve(); m_tacho_sel.resolve(); + m_scan_timer = timer_alloc(FUNC(dragrace_state::scanline_irq), this); + m_irq_off_timer = timer_alloc(FUNC(dragrace_state::irq_off), this); + m_scan_timer->adjust(m_screen->time_until_pos(64)); + save_item(NAME(m_gear)); } @@ -277,7 +296,6 @@ void dragrace_state::dragrace(machine_config &config) // basic machine hardware M6800(config, m_maincpu, 12.096_MHz_XTAL / 12); m_maincpu->set_addrmap(AS_PROGRAM, &dragrace_state::main_map); - m_maincpu->set_periodic_int(FUNC(dragrace_state::irq0_line_hold), attotime::from_hz(4*60)); WATCHDOG_TIMER(config, m_watchdog).set_vblank_count("screen", 8); @@ -285,9 +303,7 @@ void dragrace_state::dragrace(machine_config &config) // video hardware SCREEN(config, m_screen, SCREEN_TYPE_RASTER); - m_screen->set_refresh_hz(60); - m_screen->set_size(256, 262); - m_screen->set_visarea(0, 255, 0, 239); + m_screen->set_raw(12.096_MHz_XTAL / 2, 384, 0, 256, 262, 0, 240); // vertical timings determined by sync PROM m_screen->set_screen_update(FUNC(dragrace_state::screen_update)); m_screen->set_palette("palette"); diff --git a/src/mame/atari/dragrace.h b/src/mame/atari/dragrace.h index beabb0ca558..c624e7da325 100644 --- a/src/mame/atari/dragrace.h +++ b/src/mame/atari/dragrace.h @@ -70,6 +70,8 @@ private: void palette(palette_device &palette) const; uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); TIMER_DEVICE_CALLBACK_MEMBER(frame_callback); + TIMER_CALLBACK_MEMBER(scanline_irq); + TIMER_CALLBACK_MEMBER(irq_off); void main_map(address_map &map); @@ -96,6 +98,8 @@ private: // misc uint8_t m_gear[2]{}; + emu_timer *m_scan_timer; + emu_timer *m_irq_off_timer; }; //----------- defined in audio/dragrace.cpp ----------- |