dragrace: Add raw parameters for screen and correct IRQ timing

This commit is contained in:
AJR 2023-05-14 22:32:58 -04:00
parent c63155b86c
commit f64d568f8e
2 changed files with 24 additions and 4 deletions

View File

@ -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");

View File

@ -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 -----------