atarigen: Move interrupt handling down into drivers (nw)

This commit is contained in:
AJR 2020-04-19 21:22:01 -04:00
parent 5ceea9a2e0
commit 4507e788e3
33 changed files with 307 additions and 400 deletions

View File

@ -35,22 +35,9 @@
*
*************************************/
void atarig1_state::update_interrupts()
void atarig1_state::video_int_ack_w(uint16_t data)
{
m_maincpu->set_input_line(1, m_video_int_state ? ASSERT_LINE : CLEAR_LINE);
}
MACHINE_START_MEMBER(atarig1_state,atarig1)
{
atarigen_state::machine_start();
}
MACHINE_RESET_MEMBER(atarig1_state,atarig1)
{
atarigen_state::machine_reset();
scanline_timer_reset(*m_screen, 8);
m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE);
}
@ -404,11 +391,10 @@ void atarig1_state::atarig1(machine_config &config)
M68000(config, m_maincpu, ATARI_CLOCK_14MHz);
m_maincpu->set_addrmap(AS_PROGRAM, &atarig1_state::main_map);
MCFG_MACHINE_START_OVERRIDE(atarig1_state,atarig1)
MCFG_MACHINE_RESET_OVERRIDE(atarig1_state,atarig1)
EEPROM_2816(config, "eeprom").lock_after_write(true);
TIMER(config, "scantimer").configure_scanline(FUNC(atarig1_state::scanline_update), m_screen, 0, 8);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
@ -425,7 +411,7 @@ void atarig1_state::atarig1(machine_config &config)
m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
m_screen->set_screen_update(FUNC(atarig1_state::screen_update_atarig1));
m_screen->set_palette("palette");
m_screen->screen_vblank().set(FUNC(atarig1_state::video_int_write_line));
m_screen->screen_vblank().set_inputline(m_maincpu, M68K_IRQ_1, ASSERT_LINE);
MCFG_VIDEO_START_OVERRIDE(atarig1_state,atarig1)

View File

@ -35,9 +35,9 @@
*
*************************************/
void atarig42_state::update_interrupts()
void atarig42_state::video_int_ack_w(uint16_t data)
{
m_maincpu->set_input_line(4, m_video_int_state ? ASSERT_LINE : CLEAR_LINE);
m_maincpu->set_input_line(M68K_IRQ_4, CLEAR_LINE);
}
@ -52,13 +52,6 @@ void atarig42_state::machine_start()
}
void atarig42_state::machine_reset()
{
atarigen_state::machine_reset();
scanline_timer_reset(*m_screen, 8);
}
/*************************************
*
@ -523,6 +516,8 @@ void atarig42_state::atarig42(machine_config &config)
M68000(config, m_maincpu, ATARI_CLOCK_14MHz);
m_maincpu->set_addrmap(AS_PROGRAM, &atarig42_state::main_map);
TIMER(config, "scantimer").configure_scanline(FUNC(atarig42_state::scanline_update), m_screen, 0, 8);
EEPROM_2816(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog");
@ -543,7 +538,7 @@ void atarig42_state::atarig42(machine_config &config)
m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
m_screen->set_screen_update(FUNC(atarig42_state::screen_update_atarig42));
m_screen->set_palette("palette");
m_screen->screen_vblank().set(FUNC(atarig42_state::video_int_write_line));
m_screen->screen_vblank().set_inputline(m_maincpu, M68K_IRQ_4, ASSERT_LINE);
MCFG_VIDEO_START_OVERRIDE(atarig42_state,atarig42)

View File

@ -70,16 +70,34 @@
*
*************************************/
void atarigt_state::update_interrupts()
INTERRUPT_GEN_MEMBER(atarigt_state::scanline_int_gen)
{
m_maincpu->set_input_line(4, m_video_int_state ? ASSERT_LINE : CLEAR_LINE);
m_maincpu->set_input_line(6, m_scanline_int_state ? ASSERT_LINE : CLEAR_LINE);
m_scanline_int_state = true;
m_maincpu->set_input_line(M68K_IRQ_6, ASSERT_LINE);
}
INTERRUPT_GEN_MEMBER(atarigt_state::scanline_int_gen)
WRITE_LINE_MEMBER(atarigt_state::video_int_write_line)
{
scanline_int_write_line(1);
if (state)
{
m_video_int_state = true;
m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE);
}
}
void atarigt_state::scanline_int_ack_w(uint32_t data)
{
m_scanline_int_state = false;
m_maincpu->set_input_line(M68K_IRQ_6, CLEAR_LINE);
}
void atarigt_state::video_int_ack_w(uint32_t data)
{
m_video_int_state = false;
m_maincpu->set_input_line(M68K_IRQ_4, CLEAR_LINE);
}
@ -89,10 +107,15 @@ INTERRUPT_GEN_MEMBER(atarigt_state::scanline_int_gen)
*
*************************************/
MACHINE_RESET_MEMBER(atarigt_state,atarigt)
void atarigt_state::machine_start()
{
atarigen_state::machine_reset();
scanline_timer_reset(*m_screen, 8);
atarigen_state::machine_start();
m_scanline_int_state = false;
m_video_int_state = false;
save_item(NAME(m_scanline_int_state));
save_item(NAME(m_video_int_state));
}
@ -814,7 +837,7 @@ void atarigt_state::atarigt(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &atarigt_state::main_map);
m_maincpu->set_periodic_int(FUNC(atarigt_state::scanline_int_gen), attotime::from_hz(250));
MCFG_MACHINE_RESET_OVERRIDE(atarigt_state,atarigt)
TIMER(config, "scantimer").configure_scanline(FUNC(atarigt_state::scanline_update), m_screen, 0, 8);
EEPROM_2816(config, "eeprom").lock_after_write(true);

View File

@ -41,16 +41,9 @@
*
*************************************/
void atarigx2_state::update_interrupts()
void atarigx2_state::video_int_ack_w(uint32_t data)
{
m_maincpu->set_input_line(4, m_video_int_state ? ASSERT_LINE : CLEAR_LINE);
}
void atarigx2_state::machine_reset()
{
atarigen_state::machine_reset();
scanline_timer_reset(*m_screen, 8);
m_maincpu->set_input_line(M68K_IRQ_4, CLEAR_LINE);
}
@ -1495,6 +1488,8 @@ void atarigx2_state::atarigx2(machine_config &config)
M68EC020(config, m_maincpu, ATARI_CLOCK_14MHz);
m_maincpu->set_addrmap(AS_PROGRAM, &atarigx2_state::main_map);
TIMER(config, "scantimer").configure_scanline(FUNC(atarigx2_state::scanline_update), m_screen, 0, 8);
ADC0809(config, m_adc, ATARI_CLOCK_14MHz/16);
m_adc->in_callback<0>().set_ioport("A2D0");
m_adc->in_callback<1>().set_ioport("A2D1");
@ -1523,7 +1518,7 @@ void atarigx2_state::atarigx2(machine_config &config)
m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
m_screen->set_screen_update(FUNC(atarigx2_state::screen_update_atarigx2));
m_screen->set_palette("palette");
m_screen->screen_vblank().set(FUNC(atarigx2_state::video_int_write_line));
m_screen->screen_vblank().set_inputline(m_maincpu, M68K_IRQ_4, ASSERT_LINE);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();

View File

@ -210,20 +210,15 @@ RoadBlasters (aka Future Vette):005*
*
*************************************/
void atarisy1_state::update_interrupts()
void atarisy1_state::video_int_ack_w(uint16_t data)
{
m_maincpu->set_input_line(2, m_joystick_int ? ASSERT_LINE : CLEAR_LINE);
m_maincpu->set_input_line(3, m_scanline_int_state ? ASSERT_LINE : CLEAR_LINE);
m_maincpu->set_input_line(4, m_video_int_state ? ASSERT_LINE : CLEAR_LINE);
m_maincpu->set_input_line(M68K_IRQ_4, CLEAR_LINE);
}
MACHINE_START_MEMBER(atarisy1_state,atarisy1)
{
atarigen_state::machine_start();
m_joystick_int = 0;
save_item(NAME(m_joystick_int));
}
@ -242,13 +237,6 @@ MACHINE_RESET_MEMBER(atarisy1_state,atarisy1)
*
*************************************/
WRITE_LINE_MEMBER(atarisy1_state::joystick_int)
{
m_joystick_int = state;
update_interrupts();
}
template<int Input>
READ8_MEMBER(atarisy1_state::digital_joystick_r)
{
@ -721,7 +709,7 @@ void atarisy1_state::add_adc(machine_config &config)
// IN0 = J102 pin 5
INPUT_MERGER_ALL_HIGH(config, m_ajsint);
m_ajsint->output_handler().set(FUNC(atarisy1_state::joystick_int));
m_ajsint->output_handler().set_inputline(m_maincpu, M68K_IRQ_2);
}
void atarisy1_state::atarisy1(machine_config &config)
@ -769,7 +757,7 @@ void atarisy1_state::atarisy1(machine_config &config)
m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
m_screen->set_screen_update(FUNC(atarisy1_state::screen_update_atarisy1));
m_screen->set_palette(m_palette);
m_screen->screen_vblank().set(FUNC(atarisy1_state::video_int_write_line));
m_screen->screen_vblank().set_inputline(m_maincpu, M68K_IRQ_4, ASSERT_LINE);
MCFG_VIDEO_START_OVERRIDE(atarisy1_state,atarisy1)

View File

@ -169,6 +169,20 @@ void atarisy2_state::update_interrupts()
}
void atarisy2_state::scanline_int_ack_w(uint16_t data)
{
m_scanline_int_state = false;
update_interrupts();
}
void atarisy2_state::video_int_ack_w(uint16_t data)
{
m_video_int_state = false;
update_interrupts();
}
/*************************************
*
@ -176,14 +190,18 @@ void atarisy2_state::update_interrupts()
*
*************************************/
void atarisy2_state::scanline_update(screen_device &screen, int scanline)
TIMER_DEVICE_CALLBACK_MEMBER(atarisy2_state::scanline_update)
{
if (scanline <= screen.height())
int scanline = param;
if (scanline <= m_screen->height())
{
/* generate the 32V interrupt (IRQ 2) */
if ((scanline % 64) == 0)
if (m_interrupt_enable & 4)
scanline_int_write_line(1);
{
m_scanline_int_state = true;
update_interrupts();
}
}
}
@ -201,7 +219,12 @@ MACHINE_START_MEMBER(atarisy2_state,atarisy2)
m_leds.resolve();
m_scanline_int_state = false;
m_video_int_state = false;
save_item(NAME(m_interrupt_enable));
save_item(NAME(m_scanline_int_state));
save_item(NAME(m_video_int_state));
save_item(NAME(m_p2portwr_state));
save_item(NAME(m_p2portrd_state));
save_item(NAME(m_sound_reset_state));
@ -215,10 +238,9 @@ MACHINE_RESET_MEMBER(atarisy2_state,atarisy2)
{
atarigen_state::machine_reset();
m_slapstic->slapstic_reset();
scanline_timer_reset(*m_screen, 64);
m_p2portwr_state = 0;
m_p2portrd_state = 0;
m_p2portwr_state = false;
m_p2portrd_state = false;
}
@ -233,23 +255,25 @@ WRITE_LINE_MEMBER(atarisy2_state::vblank_int)
{
/* clock the VBLANK through */
if (state && BIT(m_interrupt_enable, 3))
video_int_write_line(1);
{
m_video_int_state = true;
update_interrupts();
}
}
WRITE16_MEMBER(atarisy2_state::int0_ack_w)
void atarisy2_state::int0_ack_w(uint16_t data)
{
/* reset sound IRQ */
m_p2portrd_state = 0;
m_p2portrd_state = false;
update_interrupts();
}
WRITE16_MEMBER(atarisy2_state::int1_ack_w)
void atarisy2_state::int1_ack_w(uint8_t data)
{
/* reset sound CPU */
if (ACCESSING_BITS_0_7)
m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 1) ? ASSERT_LINE : CLEAR_LINE);
m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 1) ? ASSERT_LINE : CLEAR_LINE);
}
@ -259,10 +283,9 @@ TIMER_CALLBACK_MEMBER(atarisy2_state::delayed_int_enable_w)
}
WRITE16_MEMBER(atarisy2_state::int_enable_w)
void atarisy2_state::int_enable_w(uint8_t data)
{
if (offset == 0 && ACCESSING_BITS_0_7)
machine().scheduler().synchronize(timer_expired_delegate(FUNC(atarisy2_state::delayed_int_enable_w),this), data);
machine().scheduler().synchronize(timer_expired_delegate(FUNC(atarisy2_state::delayed_int_enable_w),this), data);
}
@ -659,7 +682,7 @@ WRITE8_MEMBER(atarisy2_state::sound_reset_w)
READ16_MEMBER(atarisy2_state::sound_r)
{
/* clear the p2portwr state on a p1portrd */
m_p2portwr_state = 0;
m_p2portwr_state = false;
update_interrupts();
/* handle it normally otherwise */
@ -741,10 +764,10 @@ void atarisy2_state::main_map(address_map &map)
map(0x1400, 0x1403).mirror(0x007c).w(FUNC(atarisy2_state::bankselect_w));
map(0x1480, 0x148f).mirror(0x0070).w("adc", FUNC(adc0808_device::address_offset_start_w)).umask16(0x00ff);
map(0x1580, 0x1581).mirror(0x001e).w(FUNC(atarisy2_state::int0_ack_w));
map(0x15a0, 0x15a1).mirror(0x001e).w(FUNC(atarisy2_state::int1_ack_w));
map(0x15a0, 0x15a0).mirror(0x001e).w(FUNC(atarisy2_state::int1_ack_w));
map(0x15c0, 0x15c1).mirror(0x001e).w(FUNC(atarisy2_state::scanline_int_ack_w));
map(0x15e0, 0x15e1).mirror(0x001e).w(FUNC(atarisy2_state::video_int_ack_w));
map(0x1600, 0x1601).mirror(0x007e).w(FUNC(atarisy2_state::int_enable_w));
map(0x1600, 0x1600).mirror(0x007e).w(FUNC(atarisy2_state::int_enable_w));
map(0x1680, 0x1680).mirror(0x007e).w(m_soundcomm, FUNC(atari_sound_comm_device::main_command_w));
map(0x1700, 0x1701).mirror(0x007e).w(FUNC(atarisy2_state::xscroll_w)).share("xscroll");
map(0x1780, 0x1781).mirror(0x007e).w(FUNC(atarisy2_state::yscroll_w)).share("yscroll");
@ -1208,6 +1231,8 @@ void atarisy2_state::atarisy2(machine_config &config)
EEPROM_2804(config, "eeprom");
TIMER(config, "scantimer").configure_scanline(FUNC(atarisy2_state::scanline_update), m_screen, 0, 64);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */

View File

@ -36,14 +36,19 @@
*
*************************************/
void blstroid_state::update_interrupts()
void blstroid_state::scanline_int_ack_w(uint16_t data)
{
m_maincpu->set_input_line(1, m_scanline_int_state ? ASSERT_LINE : CLEAR_LINE);
m_maincpu->set_input_line(2, m_video_int_state ? ASSERT_LINE : CLEAR_LINE);
m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE);
}
WRITE16_MEMBER(blstroid_state::blstroid_halt_until_hblank_0_w)
void blstroid_state::video_int_ack_w(uint16_t data)
{
m_maincpu->set_input_line(M68K_IRQ_2, CLEAR_LINE);
}
void blstroid_state::halt_until_hblank_0_w(uint16_t data)
{
halt_until_hblank_0(*m_maincpu, *m_screen);
}
@ -52,7 +57,6 @@ WRITE16_MEMBER(blstroid_state::blstroid_halt_until_hblank_0_w)
void blstroid_state::machine_reset()
{
atarigen_state::machine_reset();
scanline_timer_reset(*m_screen, 8);
}
@ -76,7 +80,7 @@ void blstroid_state::main_map(address_map &map)
map(0x800800, 0x8009ff).mirror(0x038000).writeonly().share("priorityram");
map(0x800a01, 0x800a01).mirror(0x0381fe).w(m_jsa, FUNC(atari_jsa_i_device::main_command_w));
map(0x800c00, 0x800c01).mirror(0x0381fe).w(m_jsa, FUNC(atari_jsa_i_device::sound_reset_w));
map(0x800e00, 0x800e01).mirror(0x0381fe).w(FUNC(blstroid_state::blstroid_halt_until_hblank_0_w));
map(0x800e00, 0x800e01).mirror(0x0381fe).w(FUNC(blstroid_state::halt_until_hblank_0_w));
map(0x801401, 0x801401).mirror(0x0383fe).r(m_jsa, FUNC(atari_jsa_i_device::main_response_r));
map(0x801800, 0x801801).mirror(0x0383f8).portr("DIAL0");
map(0x801804, 0x801805).mirror(0x0383f8).portr("DIAL1");
@ -183,6 +187,8 @@ void blstroid_state::blstroid(machine_config &config)
EEPROM_2804(config, "eeprom").lock_after_write(true);
TIMER(config, "scantimer").configure_scanline(FUNC(blstroid_state::scanline_update), m_screen, 0, 8);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
@ -202,7 +208,7 @@ void blstroid_state::blstroid(machine_config &config)
m_screen->set_raw(ATARI_CLOCK_14MHz, 456*2, 0, 320*2, 262, 0, 240);
m_screen->set_screen_update(FUNC(blstroid_state::screen_update_blstroid));
m_screen->set_palette("palette");
m_screen->screen_vblank().set(FUNC(blstroid_state::video_int_write_line));
m_screen->screen_vblank().set_inputline(m_maincpu, M68K_IRQ_2, ASSERT_LINE);
MCFG_VIDEO_START_OVERRIDE(blstroid_state,blstroid)

View File

@ -38,14 +38,27 @@
*
*************************************/
void cyberbal2p_state::update_interrupts()
WRITE_LINE_MEMBER(cyberbal2p_state::video_int_write_line)
{
m_maincpu->set_input_line(1, m_video_int_state ? ASSERT_LINE : CLEAR_LINE);
if (state)
m_maincpu->set_input_line(M68K_IRQ_1, ASSERT_LINE);
}
void cyberbal_state::update_interrupts()
WRITE_LINE_MEMBER(cyberbal_state::video_int_write_line)
{
m_extracpu->set_input_line(1, m_video_int_state ? ASSERT_LINE : CLEAR_LINE);
if (state)
m_extracpu->set_input_line(M68K_IRQ_1, ASSERT_LINE);
}
void cyberbal2p_state::video_int_ack_w(uint16_t data)
{
m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE);
}
void cyberbal_state::video_int_ack_w(uint16_t data)
{
m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE);
}
@ -66,9 +79,7 @@ void cyberbal_state::machine_start()
void cyberbal_state::machine_reset()
{
cyberbal_base_state::machine_reset();
scanline_timer_reset(*m_lscreen, 8);
cyberbal_sound_reset();
@ -80,7 +91,6 @@ void cyberbal_state::machine_reset()
void cyberbal2p_state::machine_reset()
{
cyberbal_base_state::machine_reset();
scanline_timer_reset(*m_screen, 8);
}
@ -411,6 +421,8 @@ void cyberbal_state::cyberbal_base(machine_config &config)
config.set_maximum_quantum(attotime::from_hz(600));
TIMER(config, "scantimer").configure_scanline(FUNC(cyberbal_state::scanline_update), m_lscreen, 0, 8);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
@ -495,6 +507,8 @@ void cyberbal2p_state::cyberbal2p(machine_config &config)
EEPROM_2816(config, "eeprom").lock_after_write(true);
TIMER(config, "scantimer").configure_scanline(FUNC(cyberbal2p_state::scanline_update), m_screen, 0, 8);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */

View File

@ -140,16 +140,16 @@
*
*************************************/
void gauntlet_state::update_interrupts()
void gauntlet_state::video_int_ack_w(uint16_t data)
{
m_maincpu->set_input_line(4, m_video_int_state ? ASSERT_LINE : CLEAR_LINE);
m_maincpu->set_input_line(M68K_IRQ_4, CLEAR_LINE);
}
void gauntlet_state::scanline_update(screen_device &screen, int scanline)
TIMER_DEVICE_CALLBACK_MEMBER(gauntlet_state::scanline_update)
{
/* sound IRQ is on 32V */
if (scanline & 32)
if (param & 32)
m_soundcomm->sound_irq_gen(*m_audiocpu);
else
m_soundcomm->sound_irq_ack_w();
@ -168,7 +168,6 @@ void gauntlet_state::machine_reset()
m_sound_reset_val = 1;
atarigen_state::machine_reset();
scanline_timer_reset(*m_screen, 32);
}
@ -497,6 +496,8 @@ void gauntlet_state::gauntlet_base(machine_config &config)
EEPROM_2804(config, "eeprom").lock_after_write(true);
TIMER(config, "scantimer").configure_scanline(FUNC(gauntlet_state::scanline_update), m_screen, 0, 32);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
@ -517,7 +518,7 @@ void gauntlet_state::gauntlet_base(machine_config &config)
m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
m_screen->set_screen_update(FUNC(gauntlet_state::screen_update_gauntlet));
m_screen->set_palette("palette");
m_screen->screen_vblank().set(FUNC(gauntlet_state::video_int_write_line));
m_screen->screen_vblank().set_inputline(m_maincpu, M68K_IRQ_4, ASSERT_LINE);
/* sound hardware */
ATARI_SOUND_COMM(config, m_soundcomm, m_audiocpu)

View File

@ -43,17 +43,17 @@
*
*************************************/
void rampart_state::update_interrupts()
TIMER_DEVICE_CALLBACK_MEMBER(rampart_state::scanline_interrupt)
{
m_maincpu->set_input_line(4, m_scanline_int_state ? ASSERT_LINE : CLEAR_LINE);
/* generate 32V signals */
if ((param & 32) == 0)
m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE);
}
void rampart_state::scanline_update(screen_device &screen, int scanline)
void rampart_state::scanline_int_ack_w(uint16_t data)
{
/* generate 32V signals */
if ((scanline & 32) == 0)
scanline_int_write_line(1);
m_maincpu->set_input_line(M68K_IRQ_4, CLEAR_LINE);
}
@ -66,8 +66,6 @@ void rampart_state::scanline_update(screen_device &screen, int scanline)
void rampart_state::machine_reset()
{
atarigen_state::machine_reset();
scanline_timer_reset(*m_screen, 32);
}
@ -344,6 +342,8 @@ void rampart_state::rampart(machine_config &config)
SLAPSTIC(config, m_slapstic_device, 118, true);
TIMER(config, "scantimer").configure_scanline(FUNC(rampart_state::scanline_interrupt), m_screen, 0, 32);
EEPROM_2816(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog").set_vblank_count(m_screen, 8);
@ -362,7 +362,7 @@ void rampart_state::rampart(machine_config &config)
m_screen->set_raw(MASTER_CLOCK/2, 456, 0+12, 336+12, 262, 0, 240);
m_screen->set_screen_update(FUNC(rampart_state::screen_update_rampart));
m_screen->set_palette("palette");
m_screen->screen_vblank().set(FUNC(rampart_state::video_int_write_line));
//m_screen->screen_vblank().set(FUNC(rampart_state::video_int_write_line));
/* sound hardware */
SPEAKER(config, "mono").front_center();

View File

@ -36,29 +36,35 @@
*
*************************************/
void skullxbo_state::update_interrupts()
TIMER_CALLBACK_MEMBER(skullxbo_state::scanline_interrupt)
{
m_maincpu->set_input_line(1, m_scanline_int_state ? ASSERT_LINE : CLEAR_LINE);
m_maincpu->set_input_line(2, m_video_int_state ? ASSERT_LINE : CLEAR_LINE);
m_maincpu->set_input_line(M68K_IRQ_1, ASSERT_LINE);
}
void skullxbo_state::scanline_int_ack_w(uint16_t data)
{
m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE);
}
void skullxbo_state::video_int_ack_w(uint16_t data)
{
m_maincpu->set_input_line(M68K_IRQ_2, CLEAR_LINE);
}
TIMER_DEVICE_CALLBACK_MEMBER(skullxbo_state::scanline_timer)
{
scanline_int_write_line(1);
}
void skullxbo_state::scanline_update(screen_device &screen, int scanline)
{
/* check for interrupts in the alpha ram */
/* the interrupt occurs on the HBLANK of the 6th scanline following */
int scanline = param;
int offset = (scanline / 8) * 64 + 42;
if (offset < 0x7c0 && (m_alpha_tilemap->basemem_read(offset) & 0x8000))
{
int width = screen.width();
attotime period = screen.time_until_pos(screen.vpos() + 6, width * 0.9);
m_scanline_timer->adjust(period);
int width = m_screen->width();
attotime period = m_screen->time_until_pos(m_screen->vpos() + 6, width * 0.9);
m_scanline_int_timer->adjust(period);
}
/* update the playfield and motion objects */
@ -72,10 +78,13 @@ WRITE16_MEMBER(skullxbo_state::skullxbo_halt_until_hblank_0_w)
}
void skullxbo_state::machine_reset()
void skullxbo_state::machine_start()
{
atarigen_state::machine_reset();
scanline_timer_reset(*m_screen, 8);
atarigen_state::machine_start();
m_scanline_int_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(skullxbo_state::scanline_interrupt), this));
save_item(NAME(m_scanline_int_state));
}
@ -232,7 +241,7 @@ void skullxbo_state::skullxbo(machine_config &config)
M68000(config, m_maincpu, ATARI_CLOCK_14MHz/2);
m_maincpu->set_addrmap(AS_PROGRAM, &skullxbo_state::main_map);
TIMER(config, m_scanline_timer).configure_generic(FUNC(skullxbo_state::scanline_timer));
TIMER(config, "scantimer").configure_scanline(FUNC(skullxbo_state::scanline_timer), m_screen, 0, 8);
EEPROM_2816(config, "eeprom").lock_after_write(true);
@ -255,7 +264,7 @@ void skullxbo_state::skullxbo(machine_config &config)
m_screen->set_raw(ATARI_CLOCK_14MHz, 456*2, 0, 336*2, 262, 0, 240);
m_screen->set_screen_update(FUNC(skullxbo_state::screen_update_skullxbo));
m_screen->set_palette("palette");
m_screen->screen_vblank().set(FUNC(skullxbo_state::video_int_write_line));
m_screen->screen_vblank().set_inputline(m_maincpu, M68K_IRQ_2, ASSERT_LINE);
/* sound hardware */
SPEAKER(config, "mono").front_center();

View File

@ -36,9 +36,9 @@
*
*************************************/
void xybots_state::update_interrupts()
void xybots_state::video_int_ack_w(uint16_t data)
{
m_maincpu->set_input_line(1, m_video_int_state ? ASSERT_LINE : CLEAR_LINE);
m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE);
}
@ -204,7 +204,7 @@ void xybots_state::xybots(machine_config &config)
m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
m_screen->set_screen_update(FUNC(xybots_state::screen_update_xybots));
m_screen->set_palette("palette");
m_screen->screen_vblank().set(FUNC(xybots_state::video_int_write_line));
m_screen->screen_vblank().set_inputline(m_maincpu, M68K_IRQ_1, ASSERT_LINE);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();

View File

@ -9,6 +9,7 @@
#include "audio/atarijsa.h"
#include "machine/adc0808.h"
#include "machine/atarigen.h"
#include "machine/timer.h"
#include "video/atarirle.h"
#include "cpu/m68000/m68000.h"
#include "tilemap.h"
@ -50,8 +51,8 @@ public:
uint16_t m_playfield_yscroll;
virtual void device_post_load() override;
virtual void update_interrupts() override;
virtual void scanline_update(screen_device &screen, int scanline) override;
void video_int_ack_w(uint16_t data = 0);
TIMER_DEVICE_CALLBACK_MEMBER(scanline_update);
DECLARE_WRITE16_MEMBER(mo_command_w);
DECLARE_WRITE16_MEMBER(a2d_select_w);
DECLARE_READ16_MEMBER(a2d_data_r);
@ -63,8 +64,6 @@ public:
void init_pitfightb();
TILE_GET_INFO_MEMBER(get_alpha_tile_info);
TILE_GET_INFO_MEMBER(get_playfield_tile_info);
DECLARE_MACHINE_START(atarig1);
DECLARE_MACHINE_RESET(atarig1);
DECLARE_VIDEO_START(atarig1);
uint32_t screen_update_atarig1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void atarig1(machine_config &config);

View File

@ -16,6 +16,7 @@
#include "cpu/m68000/m68000.h"
#include "machine/adc0808.h"
#include "machine/asic65.h"
#include "machine/timer.h"
#include "tilemap.h"
class atarig42_state : public atarigen_state
@ -34,9 +35,8 @@ public:
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void update_interrupts() override;
virtual void scanline_update(screen_device &screen, int scanline) override;
void video_int_ack_w(uint16_t data = 0);
TIMER_DEVICE_CALLBACK_MEMBER(scanline_update);
DECLARE_WRITE8_MEMBER(a2d_select_w);
DECLARE_READ8_MEMBER(a2d_data_r);
DECLARE_WRITE16_MEMBER(io_latch_w);

View File

@ -9,6 +9,7 @@
#include "audio/cage.h"
#include "machine/adc0808.h"
#include "machine/atarigen.h"
#include "machine/timer.h"
#include "video/atarirle.h"
#include "emupal.h"
#include "tilemap.h"
@ -51,6 +52,9 @@ public:
optional_ioport m_coin_io;
optional_ioport m_fake_io;
bool m_scanline_int_state;
bool m_video_int_state;
bitmap_ind16 m_pf_bitmap;
bitmap_ind16 m_an_bitmap;
@ -73,9 +77,11 @@ public:
uint16_t m_protresult;
std::unique_ptr<uint8_t[]> m_protdata;
virtual void update_interrupts() override;
INTERRUPT_GEN_MEMBER(scanline_int_gen);
virtual void scanline_update(screen_device &screen, int scanline) override;
DECLARE_WRITE_LINE_MEMBER(video_int_write_line);
void scanline_int_ack_w(uint32_t data = 0);
void video_int_ack_w(uint32_t data = 0);
TIMER_DEVICE_CALLBACK_MEMBER(scanline_update);
DECLARE_READ32_MEMBER(special_port2_r);
DECLARE_READ32_MEMBER(special_port3_r);
DECLARE_READ8_MEMBER(analog_port_r);
@ -97,8 +103,7 @@ public:
TILE_GET_INFO_MEMBER(get_alpha_tile_info);
TILE_GET_INFO_MEMBER(get_playfield_tile_info);
TILEMAP_MAPPER_MEMBER(atarigt_playfield_scan);
DECLARE_MACHINE_START(atarigt);
DECLARE_MACHINE_RESET(atarigt);
virtual void machine_start() override;
DECLARE_VIDEO_START(atarigt);
uint32_t screen_update_atarigt(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void atarigt(machine_config &config);

View File

@ -14,6 +14,7 @@
#include "machine/adc0808.h"
#include "machine/atarigen.h"
#include "machine/atarixga.h"
#include "machine/timer.h"
#include "video/atarirle.h"
#include "tilemap.h"
@ -39,10 +40,9 @@ public:
void atarigx2_0x400(machine_config &config);
protected:
virtual void machine_reset() override;
virtual void video_start() override;
virtual void update_interrupts() override;
virtual void scanline_update(screen_device &screen, int scanline) override;
void video_int_ack_w(uint32_t data = 0);
TIMER_DEVICE_CALLBACK_MEMBER(scanline_update);
DECLARE_READ32_MEMBER(special_port2_r);
DECLARE_READ32_MEMBER(special_port3_r);
DECLARE_READ8_MEMBER(a2d_data_r);

View File

@ -54,7 +54,6 @@ public:
optional_device<adc0808_device> m_adc;
optional_device<input_merger_device> m_ajsint;
uint8_t m_joystick_int;
/* playfield parameters */
required_device<tilemap_device> m_playfield_tilemap;
@ -68,6 +67,7 @@ public:
int m_next_timer_scanline;
required_device<timer_device> m_scanline_timer;
required_device<timer_device> m_int3off_timer;
uint8_t m_scanline_int_state;
/* speech */
required_device<tms5220_device> m_tms;
@ -79,7 +79,8 @@ public:
uint8_t m_bank_color_shift[MAX_GFX_ELEMENTS];
uint8_t m_cur[2][2];
virtual void update_interrupts() override;
void video_int_ack_w(uint16_t data = 0);
template<int Input> DECLARE_READ8_MEMBER(digital_joystick_r);
DECLARE_READ8_MEMBER(adc_r);
DECLARE_WRITE8_MEMBER(adc_w);
@ -102,7 +103,6 @@ public:
DECLARE_MACHINE_RESET(atarisy1);
DECLARE_VIDEO_START(atarisy1);
uint32_t screen_update_atarisy1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(joystick_int);
TIMER_DEVICE_CALLBACK_MEMBER(atarisy1_reset_yscroll_callback);
TIMER_DEVICE_CALLBACK_MEMBER(atarisy1_int3off_callback);
TIMER_DEVICE_CALLBACK_MEMBER(atarisy1_int3_callback);

View File

@ -7,14 +7,15 @@
*************************************************************************/
#include "machine/atarigen.h"
#include "video/atarimo.h"
#include "cpu/m6502/m6502.h"
#include "cpu/t11/t11.h"
#include "machine/bankdev.h"
#include "machine/timer.h"
#include "machine/watchdog.h"
#include "sound/ym2151.h"
#include "sound/pokey.h"
#include "sound/tms5220.h"
#include "video/atarimo.h"
#include "emupal.h"
#include "slapstic.h"
#include "tilemap.h"
@ -55,10 +56,10 @@ public:
protected:
virtual void device_post_load() override;
virtual void update_interrupts() override;
virtual void scanline_update(screen_device &screen, int scanline) override;
private:
void update_interrupts();
required_device<t11_device> m_maincpu;
required_device<m6502_device> m_audiocpu;
required_device<atari_motion_objects_device> m_mob;
@ -77,8 +78,10 @@ private:
required_device_array<pokey_device, 2> m_pokey;
optional_device<tms5220_device> m_tms5220;
uint8_t m_p2portwr_state;
uint8_t m_p2portrd_state;
bool m_scanline_int_state;
bool m_video_int_state;
bool m_p2portwr_state;
bool m_p2portrd_state;
required_memory_bank_array<2> m_rombank;
required_device<atari_slapstic_device> m_slapstic;
@ -99,9 +102,11 @@ private:
output_finder<2> m_leds;
DECLARE_WRITE16_MEMBER(int0_ack_w);
DECLARE_WRITE16_MEMBER(int1_ack_w);
DECLARE_WRITE16_MEMBER(int_enable_w);
void scanline_int_ack_w(uint16_t data);
void video_int_ack_w(uint16_t data);
void int0_ack_w(uint16_t data);
void int1_ack_w(uint8_t data);
void int_enable_w(uint8_t data);
DECLARE_WRITE16_MEMBER(bankselect_w);
DECLARE_READ16_MEMBER(switch_r);
DECLARE_READ8_MEMBER(switch_6502_r);
@ -116,6 +121,8 @@ private:
DECLARE_WRITE8_MEMBER(tms5220_strobe_w);
DECLARE_WRITE8_MEMBER(coincount_w);
TIMER_DEVICE_CALLBACK_MEMBER(scanline_update);
TILE_GET_INFO_MEMBER(get_alpha_tile_info);
TILE_GET_INFO_MEMBER(get_playfield_tile_info);
DECLARE_MACHINE_START(atarisy2);

View File

@ -11,6 +11,7 @@
#pragma once
#include "machine/atarigen.h"
#include "machine/timer.h"
#include "audio/atarijsa.h"
#include "video/atarimo.h"
#include "tilemap.h"
@ -37,18 +38,20 @@ public:
protected:
virtual void machine_reset() override;
virtual void update_interrupts() override;
virtual void scanline_update(screen_device &screen, int scanline) override;
DECLARE_WRITE16_MEMBER(blstroid_halt_until_hblank_0_w);
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
private:
TIMER_DEVICE_CALLBACK_MEMBER(scanline_update);
void scanline_int_ack_w(uint16_t data = 0);
void video_int_ack_w(uint16_t data = 0);
void halt_until_hblank_0_w(uint16_t data = 0);
TILE_GET_INFO_MEMBER(get_playfield_tile_info);
DECLARE_VIDEO_START(blstroid);
uint32_t screen_update_blstroid(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void main_map(address_map &map);
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
private:
required_device<tilemap_device> m_playfield_tilemap;
required_device<atari_jsa_i_device> m_jsa;
required_device<atari_motion_objects_device> m_mob;
@ -58,6 +61,8 @@ private:
emu_timer *m_irq_on_timer;
static const atari_motion_objects_config s_mob_config;
bool m_scanline_int_state;
};
#endif // MAME_INCLUDES_BLSTROID_H

View File

@ -15,6 +15,7 @@
#include "video/atarimo.h"
#include "cpu/m68000/m68000.h"
#include "cpu/m6502/m6502.h"
#include "machine/timer.h"
#include "sound/dac.h"
#include "sound/ym2151.h"
#include "emupal.h"
@ -67,8 +68,6 @@ public:
protected:
DECLARE_READ16_MEMBER(sound_state_r);
virtual void update_interrupts() override;
virtual void scanline_update(screen_device &screen, int scanline) override;
virtual void machine_reset() override;
virtual void video_start() override;
uint32_t screen_update_cyberbal2p(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@ -77,6 +76,11 @@ protected:
void cyberbal2p_map(address_map &map);
private:
DECLARE_WRITE_LINE_MEMBER(video_int_write_line);
void video_int_ack_w(uint16_t data = 0);
TIMER_DEVICE_CALLBACK_MEMBER(scanline_update);
required_device<atari_jsa_ii_device> m_jsa;
};
@ -111,8 +115,6 @@ protected:
TILE_GET_INFO_MEMBER(get_alpha2_tile_info);
TILE_GET_INFO_MEMBER(get_playfield2_tile_info);
virtual void update_interrupts() override;
virtual void scanline_update(screen_device &screen, int scanline) override;
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
@ -140,6 +142,11 @@ protected:
void sound_68k_map(address_map &map);
private:
DECLARE_WRITE_LINE_MEMBER(video_int_write_line);
void video_int_ack_w(uint16_t data = 0);
TIMER_DEVICE_CALLBACK_MEMBER(scanline_update);
required_device<m6502_device> m_audiocpu;
required_device<cpu_device> m_extracpu;
required_device<cpu_device> m_daccpu;

View File

@ -12,6 +12,7 @@
#include "machine/atarigen.h"
#include "machine/74259.h"
#include "machine/timer.h"
#include "video/atarimo.h"
#include "sound/ym2151.h"
#include "sound/pokey.h"
@ -41,12 +42,14 @@ public:
void gaunt2p(machine_config &config);
void gauntlet2(machine_config &config);
private:
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
virtual void update_interrupts() override;
virtual void scanline_update(screen_device &screen, int scanline) override;
private:
void video_int_ack_w(uint16_t data = 0);
TIMER_DEVICE_CALLBACK_MEMBER(scanline_update);
DECLARE_WRITE16_MEMBER(sound_reset_w);
DECLARE_READ8_MEMBER(switch_6502_r);
DECLARE_WRITE_LINE_MEMBER(speech_squeak_w);

View File

@ -11,6 +11,7 @@
#pragma once
#include "machine/atarigen.h"
#include "machine/timer.h"
#include "sound/okim6295.h"
#include "sound/ym2413.h"
#include "video/atarimo.h"
@ -32,15 +33,16 @@ public:
protected:
virtual void machine_reset() override;
virtual void video_start() override;
virtual void update_interrupts() override;
virtual void scanline_update(screen_device &screen, int scanline) override;
private:
TIMER_DEVICE_CALLBACK_MEMBER(scanline_interrupt);
void scanline_int_ack_w(uint16_t data);
DECLARE_WRITE16_MEMBER(latch_w);
uint32_t screen_update_rampart(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void rampart_bitmap_render(bitmap_ind16 &bitmap, const rectangle &cliprect);
void main_map(address_map &map);
private:
required_device<atari_motion_objects_device> m_mob;
required_device<okim6295_device> m_oki;
required_device<ym2413_device> m_ym2413;

View File

@ -22,21 +22,21 @@ public:
skullxbo_state(const machine_config &mconfig, device_type type, const char *tag) :
atarigen_state(mconfig, type, tag),
m_jsa(*this, "jsa"),
m_scanline_timer(*this, "scan_timer"),
m_playfield_tilemap(*this, "playfield"),
m_alpha_tilemap(*this, "alpha"),
m_mob(*this, "mob"),
m_playfield_latch(-1)
m_playfield_latch(-1),
m_scanline_int_state(0)
{ }
void skullxbo(machine_config &config);
void init_skullxbo();
protected:
virtual void machine_start() override;
private:
virtual void machine_reset() override;
virtual void update_interrupts() override;
virtual void scanline_update(screen_device &screen, int scanline) override;
DECLARE_WRITE16_MEMBER(skullxbo_halt_until_hblank_0_w);
DECLARE_WRITE16_MEMBER(skullxbo_mobwr_w);
TILE_GET_INFO_MEMBER(get_alpha_tile_info);
@ -44,6 +44,9 @@ private:
WRITE16_MEMBER(playfield_latch_w);
WRITE16_MEMBER(playfield_latched_w);
uint32_t screen_update_skullxbo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_CALLBACK_MEMBER(scanline_interrupt);
void scanline_int_ack_w(uint16_t data = 0);
void video_int_ack_w(uint16_t data = 0);
TIMER_DEVICE_CALLBACK_MEMBER(scanline_timer);
void skullxbo_scanline_update(int scanline);
DECLARE_WRITE16_MEMBER( skullxbo_xscroll_w );
@ -53,13 +56,15 @@ private:
void main_map(address_map &map);
required_device<atari_jsa_ii_device> m_jsa;
required_device<timer_device> m_scanline_timer;
required_device<tilemap_device> m_playfield_tilemap;
required_device<tilemap_device> m_alpha_tilemap;
required_device<atari_motion_objects_device> m_mob;
int m_playfield_latch;
static const atari_motion_objects_config s_mob_config;
emu_timer *m_scanline_int_timer;
bool m_scanline_int_state;
};
#endif // MAME_INCLUDES_SKULLXBO_H

View File

@ -31,7 +31,7 @@ public:
void init_xybots();
private:
virtual void update_interrupts() override;
void video_int_ack_w(uint16_t data = 0);
DECLARE_READ16_MEMBER(special_port1_r);
TILE_GET_INFO_MEMBER(get_alpha_tile_info);
TILE_GET_INFO_MEMBER(get_playfield_tile_info);

View File

@ -23,26 +23,6 @@
/***************************************************************************
INLINE FUNCTIONS
***************************************************************************/
inline const atarigen_screen_timer *atarigen_state::get_screen_timer(screen_device &screen)
{
atarigen_state *state = screen.machine().driver_data<atarigen_state>();
int i;
// find the index of the timer that matches the screen
for (i = 0; i < ARRAY_LENGTH(state->m_screen_timer); i++)
if (state->m_screen_timer[i].screen == &screen)
return &state->m_screen_timer[i];
fatalerror("Unexpected: no atarivc_eof_update_timer for screen '%s'\n", screen.tag());
return nullptr;
}
//**************************************************************************
// SOUND COMMUNICATIONS DEVICE
//**************************************************************************
@ -336,8 +316,6 @@ void atari_sound_comm_device::delayed_6502_write(int data)
atarigen_state::atarigen_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_scanline_int_state(0)
, m_video_int_state(0)
, m_xscroll(*this, "xscroll")
, m_yscroll(*this, "yscroll")
, m_slapstic_num(0)
@ -347,7 +325,6 @@ atarigen_state::atarigen_state(const machine_config &mconfig, device_type type,
, m_slapstic_last_address(0)
, m_slapstic_base(0)
, m_slapstic_mirror(0)
, m_scanlines_per_callback(0)
, m_maincpu(*this, "maincpu")
, m_gfxdecode(*this, "gfxdecode")
, m_screen(*this, "screen")
@ -357,33 +334,15 @@ atarigen_state::atarigen_state(const machine_config &mconfig, device_type type,
void atarigen_state::machine_start()
{
// allocate timers for all screens
int i = 0;
for (screen_device &screen : screen_device_iterator(*this))
{
assert(i <= ARRAY_LENGTH(m_screen_timer));
m_screen_timer[i].screen = &screen;
m_screen_timer[i].scanline_timer = timer_alloc(TID_SCANLINE_TIMER, (void *)&screen);
i++;
}
save_item(NAME(m_scanline_int_state));
save_item(NAME(m_video_int_state));
save_item(NAME(m_slapstic_num));
save_item(NAME(m_slapstic_bank));
save_item(NAME(m_slapstic_last_pc));
save_item(NAME(m_slapstic_last_address));
save_item(NAME(m_scanlines_per_callback));
}
void atarigen_state::machine_reset()
{
// reset the interrupt states
m_video_int_state = m_scanline_int_state = 0;
// reset the slapstic
if (m_slapstic_num != 0)
{
@ -400,10 +359,6 @@ void atarigen_state::device_timer(emu_timer &timer, device_timer_id id, int para
{
switch (id)
{
case TID_SCANLINE_TIMER:
scanline_timer(timer, *reinterpret_cast<screen_device *>(ptr), param);
break;
// unhalt the CPU that was passed as a pointer
case TID_UNHALT_CPU:
reinterpret_cast<device_t *>(ptr)->execute().set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
@ -412,67 +367,6 @@ void atarigen_state::device_timer(emu_timer &timer, device_timer_id id, int para
}
void atarigen_state::scanline_update(screen_device &screen, int scanline)
{
}
/***************************************************************************
INTERRUPT HANDLING
***************************************************************************/
//-------------------------------------------------
// scanline_int_write_line: Standard write line
// callback for the scanline interrupt
//-------------------------------------------------
WRITE_LINE_MEMBER(atarigen_state::scanline_int_write_line)
{
m_scanline_int_state = state;
update_interrupts();
}
//-------------------------------------------------
// scanline_int_ack_w: Resets the state of the
// scanline interrupt.
//-------------------------------------------------
void atarigen_state::scanline_int_ack_w(u16 data)
{
m_scanline_int_state = 0;
update_interrupts();
}
//-------------------------------------------------
// video_int_write_line: Standard write line
// callback for the video interrupt.
//-------------------------------------------------
WRITE_LINE_MEMBER(atarigen_state::video_int_write_line)
{
if (state)
{
m_video_int_state = 1;
update_interrupts();
}
}
//-------------------------------------------------
// video_int_ack_w: Resets the state of the video
// interrupt.
//-------------------------------------------------
void atarigen_state::video_int_ack_w(u16 data)
{
m_video_int_state = 0;
update_interrupts();
}
/***************************************************************************
SLAPSTIC HANDLING
***************************************************************************/
@ -576,46 +470,6 @@ READ16_MEMBER(atarigen_state::slapstic_r)
/***************************************************************************
SCANLINE TIMING
***************************************************************************/
//-------------------------------------------------
// scanline_timer_reset: Sets up the scanline timer.
//-------------------------------------------------
void atarigen_state::scanline_timer_reset(screen_device &screen, int frequency)
{
// set the scanline callback
m_scanlines_per_callback = frequency;
// set a timer to go off at scanline 0
if (frequency != 0)
get_screen_timer(screen)->scanline_timer->adjust(screen.time_until_pos(0));
}
//-------------------------------------------------
// scanline_timer: Called once every n scanlines
// to generate the periodic callback to the main
// system.
//-------------------------------------------------
void atarigen_state::scanline_timer(emu_timer &timer, screen_device &screen, int scanline)
{
// callback
scanline_update(screen, scanline);
// generate another
scanline += m_scanlines_per_callback;
if (scanline >= screen.height())
scanline = 0;
timer.adjust(screen.time_until_pos(scanline), scanline);
}
/***************************************************************************
VIDEO HELPERS
***************************************************************************/

View File

@ -119,13 +119,6 @@ private:
TYPES & STRUCTURES
***************************************************************************/
struct atarigen_screen_timer
{
screen_device *screen;
emu_timer * scanline_timer;
};
class atarigen_state : public driver_device
{
public:
@ -139,27 +132,12 @@ protected:
virtual void device_post_load() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
// callbacks provided by the derived class
virtual void update_interrupts() = 0;
virtual void scanline_update(screen_device &screen, int scanline);
// interrupt handling
DECLARE_WRITE_LINE_MEMBER(scanline_int_write_line);
void scanline_int_ack_w(u16 data = 0);
DECLARE_WRITE_LINE_MEMBER(video_int_write_line);
void video_int_ack_w(u16 data = 0);
// slapstic helpers
void slapstic_configure(cpu_device &device, offs_t base, offs_t mirror, u8 *mem);
void slapstic_update_bank(int bank);
DECLARE_WRITE16_MEMBER(slapstic_w);
DECLARE_READ16_MEMBER(slapstic_r);
// scanline timing
void scanline_timer_reset(screen_device &screen, int frequency);
void scanline_timer(emu_timer &timer, screen_device &screen, int scanline);
// video helpers
void halt_until_hblank_0(device_t &device, screen_device &screen);
@ -169,14 +147,10 @@ protected:
// timer IDs
enum
{
TID_SCANLINE_TIMER,
TID_UNHALT_CPU,
TID_ATARIGEN_LAST
};
u8 m_scanline_int_state;
u8 m_video_int_state;
optional_shared_ptr<u16> m_xscroll;
optional_shared_ptr<u16> m_yscroll;
@ -190,18 +164,12 @@ protected:
offs_t m_slapstic_base;
offs_t m_slapstic_mirror;
u32 m_scanlines_per_callback;
atarigen_screen_timer m_screen_timer[2];
required_device<cpu_device> m_maincpu;
optional_device<gfxdecode_device> m_gfxdecode;
optional_device<screen_device> m_screen;
optional_device<atari_slapstic_device> m_slapstic_device;
private:
static const atarigen_screen_timer *get_screen_timer(screen_device &screen);
};

View File

@ -67,9 +67,9 @@ VIDEO_START_MEMBER(atarig1_state,atarig1)
*
*************************************/
void atarig1_state::scanline_update(screen_device &screen, int scanline)
TIMER_DEVICE_CALLBACK_MEMBER(atarig1_state::scanline_update)
{
int i;
int scanline = param;
//if (scanline == 0) logerror("-------\n");
@ -77,10 +77,10 @@ void atarig1_state::scanline_update(screen_device &screen, int scanline)
int offset = (scanline / 8) * 64 + 48;
if (offset >= 0x800)
return;
screen.update_partial(std::max(scanline - 1, 0));
m_screen->update_partial(std::max(scanline - 1, 0));
/* update the playfield scrolls */
for (i = 0; i < 8; i++)
for (int i = 0; i < 8; i++)
{
uint16_t word;
@ -91,7 +91,7 @@ void atarig1_state::scanline_update(screen_device &screen, int scanline)
int newscroll = ((word >> 6) + m_pfscroll_xoffset) & 0x1ff;
if (newscroll != m_playfield_xscroll)
{
screen.update_partial(std::max(scanline + i - 1, 0));
m_screen->update_partial(std::max(scanline + i - 1, 0));
m_playfield_tilemap->set_scrollx(0, newscroll);
m_playfield_xscroll = newscroll;
}
@ -105,13 +105,13 @@ void atarig1_state::scanline_update(screen_device &screen, int scanline)
int newbank = word & 7;
if (newscroll != m_playfield_yscroll)
{
screen.update_partial(std::max(scanline + i - 1, 0));
m_screen->update_partial(std::max(scanline + i - 1, 0));
m_playfield_tilemap->set_scrolly(0, newscroll);
m_playfield_yscroll = newscroll;
}
if (newbank != m_playfield_tile_bank)
{
screen.update_partial(std::max(scanline + i - 1, 0));
m_screen->update_partial(std::max(scanline + i - 1, 0));
m_playfield_tilemap->mark_all_dirty();
m_playfield_tile_bank = newbank;
}

View File

@ -88,9 +88,9 @@ VIDEO_START_MEMBER(atarig42_state,atarig42)
*
*************************************/
void atarig42_state::scanline_update(screen_device &screen, int scanline)
TIMER_DEVICE_CALLBACK_MEMBER(atarig42_state::scanline_update)
{
int i;
int scanline = param;
if (scanline == 0) logerror("-------\n");
@ -100,7 +100,7 @@ void atarig42_state::scanline_update(screen_device &screen, int scanline)
return;
/* update the playfield scrolls */
for (i = 0; i < 8; i++)
for (int i = 0; i < 8; i++)
{
uint16_t word;
@ -112,14 +112,14 @@ void atarig42_state::scanline_update(screen_device &screen, int scanline)
if (newscroll != m_playfield_xscroll)
{
if (scanline + i > 0)
screen.update_partial(scanline + i - 1);
m_screen->update_partial(scanline + i - 1);
m_playfield_tilemap->set_scrollx(0, newscroll);
m_playfield_xscroll = newscroll;
}
if (newbank != m_playfield_color_bank)
{
if (scanline + i > 0)
screen.update_partial(scanline + i - 1);
m_screen->update_partial(scanline + i - 1);
m_playfield_tilemap->mark_all_dirty();
m_playfield_color_bank = newbank;
}
@ -133,14 +133,14 @@ void atarig42_state::scanline_update(screen_device &screen, int scanline)
if (newscroll != m_playfield_yscroll)
{
if (scanline + i > 0)
screen.update_partial(scanline + i - 1);
m_screen->update_partial(scanline + i - 1);
m_playfield_tilemap->set_scrolly(0, newscroll);
m_playfield_yscroll = newscroll;
}
if (newbank != m_playfield_tile_bank)
{
if (scanline + i > 0)
screen.update_partial(scanline + i - 1);
m_screen->update_partial(scanline + i - 1);
m_playfield_tilemap->mark_all_dirty();
m_playfield_tile_bank = newbank;
}

View File

@ -141,9 +141,9 @@ uint16_t atarigt_state::atarigt_colorram_r(offs_t address)
*
*************************************/
void atarigt_state::scanline_update(screen_device &screen, int scanline)
TIMER_DEVICE_CALLBACK_MEMBER(atarigt_state::scanline_update)
{
int i;
int scanline = param;
/* keep in range */
int offset = ((scanline & ~7) << 3) + 48;
@ -151,7 +151,7 @@ void atarigt_state::scanline_update(screen_device &screen, int scanline)
return;
/* update the playfield scrolls */
for (i = 0; i < 8; i++)
for (int i = 0; i < 8; i++)
{
uint16_t word = m_alpha_tilemap->basemem_read(offset++);
@ -162,14 +162,14 @@ void atarigt_state::scanline_update(screen_device &screen, int scanline)
if (newscroll != m_playfield_xscroll)
{
if (scanline + i > 0)
screen.update_partial(scanline + i - 1);
m_screen->update_partial(scanline + i - 1);
m_playfield_tilemap->set_scrollx(0, newscroll);
m_playfield_xscroll = newscroll;
}
if (newbank != m_playfield_color_bank)
{
if (scanline + i > 0)
screen.update_partial(scanline + i - 1);
m_screen->update_partial(scanline + i - 1);
m_playfield_tilemap->set_palette_offset((newbank & 0x1f) << 8);
m_playfield_color_bank = newbank;
}
@ -183,14 +183,14 @@ void atarigt_state::scanline_update(screen_device &screen, int scanline)
if (newscroll != m_playfield_yscroll)
{
if (scanline + i > 0)
screen.update_partial(scanline + i - 1);
m_screen->update_partial(scanline + i - 1);
m_playfield_tilemap->set_scrolly(0, newscroll);
m_playfield_yscroll = newscroll;
}
if (newbank != m_playfield_tile_bank)
{
if (scanline + i > 0)
screen.update_partial(scanline + i - 1);
m_screen->update_partial(scanline + i - 1);
m_playfield_tilemap->mark_all_dirty();
m_playfield_tile_bank = newbank;
}

View File

@ -97,9 +97,9 @@ WRITE16_MEMBER( atarigx2_state::atarigx2_mo_control_w )
}
void atarigx2_state::scanline_update(screen_device &screen, int scanline)
TIMER_DEVICE_CALLBACK_MEMBER(atarigx2_state::scanline_update)
{
int i;
int scanline = param;
if (scanline == 0) logerror("-------\n");
@ -109,7 +109,7 @@ void atarigx2_state::scanline_update(screen_device &screen, int scanline)
return;
/* update the playfield scrolls */
for (i = 0; i < 8; i++)
for (int i = 0; i < 8; i++)
{
uint16_t word = m_alpha_tilemap->basemem_read(offset++);
@ -120,14 +120,14 @@ void atarigx2_state::scanline_update(screen_device &screen, int scanline)
if (newscroll != m_playfield_xscroll)
{
if (scanline + i > 0)
screen.update_partial(scanline + i - 1);
m_screen->update_partial(scanline + i - 1);
m_playfield_tilemap->set_scrollx(0, newscroll);
m_playfield_xscroll = newscroll;
}
if (newbank != m_playfield_color_bank)
{
if (scanline + i > 0)
screen.update_partial(scanline + i - 1);
m_screen->update_partial(scanline + i - 1);
m_playfield_tilemap->mark_all_dirty();
m_playfield_color_bank = newbank;
}
@ -141,14 +141,14 @@ void atarigx2_state::scanline_update(screen_device &screen, int scanline)
if (newscroll != m_playfield_yscroll)
{
if (scanline + i > 0)
screen.update_partial(scanline + i - 1);
m_screen->update_partial(scanline + i - 1);
m_playfield_tilemap->set_scrolly(0, newscroll);
m_playfield_yscroll = newscroll;
}
if (newbank != m_playfield_tile_bank)
{
if (scanline + i > 0)
screen.update_partial(scanline + i - 1);
m_screen->update_partial(scanline + i - 1);
m_playfield_tilemap->mark_all_dirty();
m_playfield_tile_bank = newbank;
}

View File

@ -8,6 +8,7 @@
#include "emu.h"
#include "includes/atarisy1.h"
#include "cpu/m68000/m68000.h"
@ -166,11 +167,13 @@ VIDEO_START_MEMBER(atarisy1_state,atarisy1)
/* reset the statics */
m_mob->set_yscroll(256);
m_next_timer_scanline = -1;
m_scanline_int_state = 0;
/* save state */
save_item(NAME(m_playfield_tile_bank));
save_item(NAME(m_playfield_priority_pens));
save_item(NAME(m_next_timer_scanline));
save_item(NAME(m_scanline_int_state));
}
@ -354,7 +357,8 @@ WRITE16_MEMBER( atarisy1_state::atarisy1_spriteram_w )
TIMER_DEVICE_CALLBACK_MEMBER(atarisy1_state::atarisy1_int3off_callback)
{
/* clear the state */
scanline_int_ack_w();
m_scanline_int_state = 0;
m_maincpu->set_input_line(M68K_IRQ_3, CLEAR_LINE);
}
@ -363,7 +367,8 @@ TIMER_DEVICE_CALLBACK_MEMBER(atarisy1_state::atarisy1_int3_callback)
int scanline = param;
/* update the state */
scanline_int_write_line(1);
m_scanline_int_state = 1;
m_maincpu->set_input_line(M68K_IRQ_3, ASSERT_LINE);
/* set a timer to turn it off */
m_int3off_timer->adjust(m_screen->scan_period());

View File

@ -7,6 +7,7 @@
****************************************************************************/
#include "emu.h"
#include "cpu/m68000/m68000.h"
#include "machine/atarigen.h"
#include "video/atarimo.h"
#include "includes/blstroid.h"
@ -73,6 +74,10 @@ VIDEO_START_MEMBER(blstroid_state,blstroid)
{
m_irq_off_timer = timer_alloc(TIMER_IRQ_OFF);
m_irq_on_timer = timer_alloc(TIMER_IRQ_ON);
m_scanline_int_state = false;
save_item(NAME(m_scanline_int_state));
}
@ -89,12 +94,11 @@ void blstroid_state::device_timer(emu_timer &timer, device_timer_id id, int para
{
case TIMER_IRQ_OFF:
/* clear the interrupt */
scanline_int_ack_w();
m_maincpu->set_input_line(M68K_IRQ_1, CLEAR_LINE);
break;
case TIMER_IRQ_ON:
/* generate the interrupt */
scanline_int_write_line(1);
update_interrupts();
m_maincpu->set_input_line(M68K_IRQ_1, ASSERT_LINE);
break;
default:
atarigen_state::device_timer(timer, id, param, ptr);
@ -103,8 +107,9 @@ void blstroid_state::device_timer(emu_timer &timer, device_timer_id id, int para
}
void blstroid_state::scanline_update(screen_device &screen, int scanline)
TIMER_DEVICE_CALLBACK_MEMBER(blstroid_state::scanline_update)
{
int scanline = param;
int offset = (scanline / 8) * 64 + 40;
/* check for interrupts */
@ -118,10 +123,10 @@ void blstroid_state::scanline_update(screen_device &screen, int scanline)
/* set a timer to turn the interrupt on at HBLANK of the 7th scanline */
/* and another to turn it off one scanline later */
int width = screen.width();
int vpos = screen.vpos();
attotime period_on = screen.time_until_pos(vpos + 7, width * 0.9);
attotime period_off = screen.time_until_pos(vpos + 8, width * 0.9);
int width = m_screen->width();
int vpos = m_screen->vpos();
attotime period_on = m_screen->time_until_pos(vpos + 7, width * 0.9);
attotime period_off = m_screen->time_until_pos(vpos + 8, width * 0.9);
m_irq_on_timer->adjust(period_on);
m_irq_off_timer->adjust(period_off);

View File

@ -202,15 +202,15 @@ void cyberbal_base_state::scanline_update_one(screen_device &screen, int scanlin
i++;
}
void cyberbal_state::scanline_update(screen_device &screen, int scanline)
TIMER_DEVICE_CALLBACK_MEMBER(cyberbal_state::scanline_update)
{
scanline_update_one(*m_lscreen, scanline, 0, *m_playfield, *m_alpha);
scanline_update_one(*m_rscreen, scanline, 1, *m_playfield2, *m_alpha2);
scanline_update_one(*m_lscreen, param, 0, *m_playfield, *m_alpha);
scanline_update_one(*m_rscreen, param, 1, *m_playfield2, *m_alpha2);
}
void cyberbal2p_state::scanline_update(screen_device &screen, int scanline)
TIMER_DEVICE_CALLBACK_MEMBER(cyberbal2p_state::scanline_update)
{
scanline_update_one(*m_screen, scanline, 0, *m_playfield, *m_alpha);
scanline_update_one(*m_screen, param, 0, *m_playfield, *m_alpha);
}