diff --git a/src/mame/drivers/atarig1.cpp b/src/mame/drivers/atarig1.cpp index b079c927777..ddfd20bda65 100644 --- a/src/mame/drivers/atarig1.cpp +++ b/src/mame/drivers/atarig1.cpp @@ -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) diff --git a/src/mame/drivers/atarig42.cpp b/src/mame/drivers/atarig42.cpp index 277cca66f7e..9b772160c9c 100644 --- a/src/mame/drivers/atarig42.cpp +++ b/src/mame/drivers/atarig42.cpp @@ -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) diff --git a/src/mame/drivers/atarigt.cpp b/src/mame/drivers/atarigt.cpp index 7b753688ec3..5a482216913 100644 --- a/src/mame/drivers/atarigt.cpp +++ b/src/mame/drivers/atarigt.cpp @@ -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); diff --git a/src/mame/drivers/atarigx2.cpp b/src/mame/drivers/atarigx2.cpp index b0b5efd1ac6..2ed0ba0201a 100644 --- a/src/mame/drivers/atarigx2.cpp +++ b/src/mame/drivers/atarigx2.cpp @@ -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(); diff --git a/src/mame/drivers/atarisy1.cpp b/src/mame/drivers/atarisy1.cpp index eaf5dc76ccb..2bc47b54c0d 100644 --- a/src/mame/drivers/atarisy1.cpp +++ b/src/mame/drivers/atarisy1.cpp @@ -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 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) diff --git a/src/mame/drivers/atarisy2.cpp b/src/mame/drivers/atarisy2.cpp index 5eea006c356..e14fd15143e 100644 --- a/src/mame/drivers/atarisy2.cpp +++ b/src/mame/drivers/atarisy2.cpp @@ -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 */ diff --git a/src/mame/drivers/blstroid.cpp b/src/mame/drivers/blstroid.cpp index 2cb3789e2f1..d7e7e4dc1f5 100644 --- a/src/mame/drivers/blstroid.cpp +++ b/src/mame/drivers/blstroid.cpp @@ -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) diff --git a/src/mame/drivers/cyberbal.cpp b/src/mame/drivers/cyberbal.cpp index 90ebdc47c27..799951c7d95 100644 --- a/src/mame/drivers/cyberbal.cpp +++ b/src/mame/drivers/cyberbal.cpp @@ -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 */ diff --git a/src/mame/drivers/gauntlet.cpp b/src/mame/drivers/gauntlet.cpp index c32e3920c50..421cbd189f5 100644 --- a/src/mame/drivers/gauntlet.cpp +++ b/src/mame/drivers/gauntlet.cpp @@ -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) diff --git a/src/mame/drivers/rampart.cpp b/src/mame/drivers/rampart.cpp index eeaa3b0a3d8..ed549ba116c 100644 --- a/src/mame/drivers/rampart.cpp +++ b/src/mame/drivers/rampart.cpp @@ -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(); diff --git a/src/mame/drivers/skullxbo.cpp b/src/mame/drivers/skullxbo.cpp index 7dd479a6eac..55af11f0f50 100644 --- a/src/mame/drivers/skullxbo.cpp +++ b/src/mame/drivers/skullxbo.cpp @@ -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(); diff --git a/src/mame/drivers/xybots.cpp b/src/mame/drivers/xybots.cpp index 96dc31fb701..52a0e1acc02 100644 --- a/src/mame/drivers/xybots.cpp +++ b/src/mame/drivers/xybots.cpp @@ -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(); diff --git a/src/mame/includes/atarig1.h b/src/mame/includes/atarig1.h index 04d31106dca..330e8b27d58 100644 --- a/src/mame/includes/atarig1.h +++ b/src/mame/includes/atarig1.h @@ -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); diff --git a/src/mame/includes/atarig42.h b/src/mame/includes/atarig42.h index 05f8f6469fe..92edd38aa69 100644 --- a/src/mame/includes/atarig42.h +++ b/src/mame/includes/atarig42.h @@ -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); diff --git a/src/mame/includes/atarigt.h b/src/mame/includes/atarigt.h index 8add09e4d9d..e4a3f741e6d 100644 --- a/src/mame/includes/atarigt.h +++ b/src/mame/includes/atarigt.h @@ -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 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); diff --git a/src/mame/includes/atarigx2.h b/src/mame/includes/atarigx2.h index 3da9f15394a..2ff617ae91e 100644 --- a/src/mame/includes/atarigx2.h +++ b/src/mame/includes/atarigx2.h @@ -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); diff --git a/src/mame/includes/atarisy1.h b/src/mame/includes/atarisy1.h index 7dcd0d514e7..7f3a0a46144 100644 --- a/src/mame/includes/atarisy1.h +++ b/src/mame/includes/atarisy1.h @@ -54,7 +54,6 @@ public: optional_device m_adc; optional_device m_ajsint; - uint8_t m_joystick_int; /* playfield parameters */ required_device m_playfield_tilemap; @@ -68,6 +67,7 @@ public: int m_next_timer_scanline; required_device m_scanline_timer; required_device m_int3off_timer; + uint8_t m_scanline_int_state; /* speech */ required_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 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); diff --git a/src/mame/includes/atarisy2.h b/src/mame/includes/atarisy2.h index 4be2bb7faf1..03a965fa513 100644 --- a/src/mame/includes/atarisy2.h +++ b/src/mame/includes/atarisy2.h @@ -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 m_maincpu; required_device m_audiocpu; required_device m_mob; @@ -77,8 +78,10 @@ private: required_device_array m_pokey; optional_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 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); diff --git a/src/mame/includes/blstroid.h b/src/mame/includes/blstroid.h index 7f6ef7803aa..d4e1cefa6ac 100644 --- a/src/mame/includes/blstroid.h +++ b/src/mame/includes/blstroid.h @@ -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 m_playfield_tilemap; required_device m_jsa; required_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 diff --git a/src/mame/includes/cyberbal.h b/src/mame/includes/cyberbal.h index 64b4fd1551d..c66b8cdc746 100644 --- a/src/mame/includes/cyberbal.h +++ b/src/mame/includes/cyberbal.h @@ -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 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 m_audiocpu; required_device m_extracpu; required_device m_daccpu; diff --git a/src/mame/includes/gauntlet.h b/src/mame/includes/gauntlet.h index cc659577ff3..b0d71469119 100644 --- a/src/mame/includes/gauntlet.h +++ b/src/mame/includes/gauntlet.h @@ -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); diff --git a/src/mame/includes/rampart.h b/src/mame/includes/rampart.h index d6a73c3a2b7..426b53bbd2c 100644 --- a/src/mame/includes/rampart.h +++ b/src/mame/includes/rampart.h @@ -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 m_mob; required_device m_oki; required_device m_ym2413; diff --git a/src/mame/includes/skullxbo.h b/src/mame/includes/skullxbo.h index f0f63570766..90cd36a4c54 100644 --- a/src/mame/includes/skullxbo.h +++ b/src/mame/includes/skullxbo.h @@ -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 m_jsa; - required_device m_scanline_timer; required_device m_playfield_tilemap; required_device m_alpha_tilemap; required_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 diff --git a/src/mame/includes/xybots.h b/src/mame/includes/xybots.h index 0153b3c62b1..e00b8910660 100644 --- a/src/mame/includes/xybots.h +++ b/src/mame/includes/xybots.h @@ -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); diff --git a/src/mame/machine/atarigen.cpp b/src/mame/machine/atarigen.cpp index fc211ed41b3..64d6a928501 100644 --- a/src/mame/machine/atarigen.cpp +++ b/src/mame/machine/atarigen.cpp @@ -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(); - 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(ptr), param); - break; - // unhalt the CPU that was passed as a pointer case TID_UNHALT_CPU: reinterpret_cast(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 ***************************************************************************/ diff --git a/src/mame/machine/atarigen.h b/src/mame/machine/atarigen.h index 76b0e449a6b..740ed821231 100644 --- a/src/mame/machine/atarigen.h +++ b/src/mame/machine/atarigen.h @@ -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 m_xscroll; optional_shared_ptr 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 m_maincpu; optional_device m_gfxdecode; optional_device m_screen; optional_device m_slapstic_device; - -private: - static const atarigen_screen_timer *get_screen_timer(screen_device &screen); }; diff --git a/src/mame/video/atarig1.cpp b/src/mame/video/atarig1.cpp index 86874d0648e..4d22f154fec 100644 --- a/src/mame/video/atarig1.cpp +++ b/src/mame/video/atarig1.cpp @@ -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; } diff --git a/src/mame/video/atarig42.cpp b/src/mame/video/atarig42.cpp index bf971e011af..b3b8b197ba5 100644 --- a/src/mame/video/atarig42.cpp +++ b/src/mame/video/atarig42.cpp @@ -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; } diff --git a/src/mame/video/atarigt.cpp b/src/mame/video/atarigt.cpp index 387793779ca..711b792ec6d 100644 --- a/src/mame/video/atarigt.cpp +++ b/src/mame/video/atarigt.cpp @@ -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; } diff --git a/src/mame/video/atarigx2.cpp b/src/mame/video/atarigx2.cpp index 6378bc5c32b..aff4e83dfb6 100644 --- a/src/mame/video/atarigx2.cpp +++ b/src/mame/video/atarigx2.cpp @@ -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; } diff --git a/src/mame/video/atarisy1.cpp b/src/mame/video/atarisy1.cpp index 9f6dd777bab..2c8690b33a5 100644 --- a/src/mame/video/atarisy1.cpp +++ b/src/mame/video/atarisy1.cpp @@ -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()); diff --git a/src/mame/video/blstroid.cpp b/src/mame/video/blstroid.cpp index 3be7deda4b9..116f3a101f1 100644 --- a/src/mame/video/blstroid.cpp +++ b/src/mame/video/blstroid.cpp @@ -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); diff --git a/src/mame/video/cyberbal.cpp b/src/mame/video/cyberbal.cpp index 1314c32f032..d53bd7a3287 100644 --- a/src/mame/video/cyberbal.cpp +++ b/src/mame/video/cyberbal.cpp @@ -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); }