summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2023-05-14 22:32:58 -0400
committer AJR <ajrhacker@users.noreply.github.com>2023-05-14 22:32:58 -0400
commitf64d568f8e68fd922e9060e18caa961baf2819ef (patch)
tree1badcbf1fe5dc5fedd7a772bf30429f248a1dc34
parentc63155b86cc31ef47b126b383797de5735f44fbc (diff)
dragrace: Add raw parameters for screen and correct IRQ timing
-rw-r--r--src/mame/atari/dragrace.cpp24
-rw-r--r--src/mame/atari/dragrace.h4
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 -----------