mirror of
https://github.com/holub/mame
synced 2025-04-21 07:52:35 +03:00
atarigen: Move interrupt handling down into drivers (nw)
This commit is contained in:
parent
5ceea9a2e0
commit
4507e788e3
@ -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)
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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)
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
***************************************************************************/
|
||||
|
@ -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);
|
||||
};
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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());
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user