Separate various drivers from atarigen_state (nw)

This commit is contained in:
AJR 2020-04-19 19:07:02 -04:00
parent 63882d086c
commit 464052e514
16 changed files with 165 additions and 158 deletions

View File

@ -88,17 +88,17 @@
*
*************************************/
void sparkz_state::update_interrupts()
TIMER_DEVICE_CALLBACK_MEMBER(sparkz_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 sparkz_state::scanline_update(screen_device &screen, int scanline)
void sparkz_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);
}
@ -111,8 +111,6 @@ void sparkz_state::scanline_update(screen_device &screen, int scanline)
void sparkz_state::machine_reset()
{
atarigen_state::machine_reset();
scanline_timer_reset(*m_screen, 32);
}
@ -123,7 +121,7 @@ void sparkz_state::machine_reset()
*
*************************************/
WRITE16_MEMBER(sparkz_state::latch_w)
void sparkz_state::latch_w(uint8_t data)
{
/* bit layout in this register:
@ -131,12 +129,8 @@ WRITE16_MEMBER(sparkz_state::latch_w)
0x001F == volume
*/
/* lower byte being modified? */
if (ACCESSING_BITS_0_7)
{
m_oki->set_rom_bank((data >> 7) & 1);
m_oki->set_output_gain(ALL_OUTPUTS, (data & 0x001f) / 31.0f);
}
m_oki->set_rom_bank((data >> 7) & 1);
m_oki->set_output_gain(ALL_OUTPUTS, (data & 0x001f) / 31.0f);
}
@ -163,11 +157,11 @@ void sparkz_state::main_map(address_map &map)
map(0x640022, 0x640023).portr("TRACKY2");
map(0x640024, 0x640025).portr("TRACKX1");
map(0x640026, 0x640027).portr("TRACKY1");
map(0x640040, 0x64004f).w(FUNC(sparkz_state::latch_w));
map(0x640041, 0x640041).mirror(0xe).w(FUNC(sparkz_state::latch_w));
map(0x640060, 0x64006f).w("eeprom", FUNC(eeprom_parallel_28xx_device::unlock_write16));
map(0x641000, 0x641fff).rw("eeprom", FUNC(eeprom_parallel_28xx_device::read), FUNC(eeprom_parallel_28xx_device::write)).umask16(0x00ff);
map(0x642000, 0x642000).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0x646000, 0x646fff).w(FUNC(sparkz_state::scanline_int_ack_w));
map(0x646000, 0x646001).mirror(0xffe).w(FUNC(sparkz_state::scanline_int_ack_w));
map(0x647000, 0x647fff).w("watchdog", FUNC(watchdog_timer_device::reset16_w));
}
@ -326,6 +320,8 @@ void sparkz_state::sparkz(machine_config &config)
M68000(config, m_maincpu, MASTER_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &sparkz_state::main_map);
TIMER(config, "scantimer").configure_scanline(FUNC(sparkz_state::scanline_interrupt), m_screen, 0, 32);
EEPROM_2804(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog");
@ -343,7 +339,7 @@ void sparkz_state::sparkz(machine_config &config)
m_screen->set_raw(MASTER_CLOCK/2, 456, 0+12, 336+12, 262, 0, 240);
m_screen->set_screen_update(FUNC(sparkz_state::screen_update));
m_screen->set_palette("palette");
m_screen->screen_vblank().set(FUNC(sparkz_state::video_int_write_line));
//m_screen->screen_vblank().set(FUNC(sparkz_state::video_int_write_line));
/* sound hardware */
SPEAKER(config, "mono").front_center();

View File

@ -41,23 +41,22 @@
*
*************************************/
void eprom_state::update_interrupts()
void eprom_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);
}
if (m_extra.found())
m_extra->set_input_line(4, m_video_int_state ? ASSERT_LINE : CLEAR_LINE);
void eprom_state::video_int_ack_extra_w(uint16_t data)
{
m_extra->set_input_line(M68K_IRQ_4, CLEAR_LINE);
}
void eprom_state::machine_start()
{
atarigen_state::machine_start();
}
void eprom_state::machine_reset()
{
atarigen_state::machine_reset();
scanline_timer_reset(*m_screen, 8);
m_share1[0xcc00/2] = 0;
}
@ -69,7 +68,7 @@ void eprom_state::machine_reset()
*
*************************************/
READ8_MEMBER(eprom_state::adc_r)
uint8_t eprom_state::adc_r(offs_t offset)
{
if (!m_adc.found())
return 0xff;
@ -88,9 +87,9 @@ READ8_MEMBER(eprom_state::adc_r)
*
*************************************/
WRITE16_MEMBER(eprom_state::eprom_latch_w)
void eprom_state::eprom_latch_w(uint8_t data)
{
if (ACCESSING_BITS_0_7 && (m_extra != nullptr))
if (m_extra.found())
{
/* bit 0: reset extra CPU */
if (data & 1)
@ -144,7 +143,7 @@ void eprom_state::main_map(address_map &map)
map(0x260031, 0x260031).r(m_jsa, FUNC(atari_jsa_base_device::main_response_r));
map(0x2e0000, 0x2e0001).w("watchdog", FUNC(watchdog_timer_device::reset16_w));
map(0x360000, 0x360001).w(FUNC(eprom_state::video_int_ack_w));
map(0x360010, 0x360011).w(FUNC(eprom_state::eprom_latch_w));
map(0x360011, 0x360011).w(FUNC(eprom_state::eprom_latch_w));
map(0x360020, 0x360021).w(m_jsa, FUNC(atari_jsa_base_device::sound_reset_w));
map(0x360031, 0x360031).w(m_jsa, FUNC(atari_jsa_base_device::main_command_w));
map(0x3e0000, 0x3e0fff).ram().share("paletteram");
@ -170,7 +169,7 @@ void eprom_state::guts_map(address_map &map)
map(0x260031, 0x260031).r(m_jsa, FUNC(atari_jsa_ii_device::main_response_r));
map(0x2e0000, 0x2e0001).w("watchdog", FUNC(watchdog_timer_device::reset16_w));
map(0x360000, 0x360001).w(FUNC(eprom_state::video_int_ack_w));
// map(0x360010, 0x360011).w(FUNC(eprom_state::eprom_latch_w));
// map(0x360011, 0x360011).w(FUNC(eprom_state::eprom_latch_w));
map(0x360020, 0x360021).w(m_jsa, FUNC(atari_jsa_ii_device::sound_reset_w));
map(0x360031, 0x360031).w(m_jsa, FUNC(atari_jsa_ii_device::main_command_w));
map(0x3e0000, 0x3e0fff).ram().share("paletteram");
@ -199,8 +198,8 @@ void eprom_state::extra_map(address_map &map)
map(0x260010, 0x26001f).portr("260010");
map(0x260020, 0x260027).mirror(0x8).r(FUNC(eprom_state::adc_r)).umask16(0x00ff);
map(0x260031, 0x260031).r(m_jsa, FUNC(atari_jsa_base_device::main_response_r));
map(0x360000, 0x360001).w(FUNC(eprom_state::video_int_ack_w));
map(0x360010, 0x360011).w(FUNC(eprom_state::eprom_latch_w));
map(0x360000, 0x360001).w(FUNC(eprom_state::video_int_ack_extra_w));
map(0x360011, 0x360011).w(FUNC(eprom_state::eprom_latch_w));
map(0x360020, 0x360021).w(m_jsa, FUNC(atari_jsa_base_device::sound_reset_w));
map(0x360031, 0x360031).w(m_jsa, FUNC(atari_jsa_base_device::main_command_w));
}
@ -377,6 +376,8 @@ void eprom_state::eprom(machine_config &config)
config.set_maximum_quantum(attotime::from_hz(6000));
TIMER(config, "scantimer").configure_scanline(FUNC(eprom_state::scanline_update), m_screen, 0, 8);
ADC0809(config, m_adc, ATARI_CLOCK_14MHz/16);
m_adc->in_callback<0>().set_ioport("ADC0");
m_adc->in_callback<1>().set_ioport("ADC1");
@ -404,7 +405,8 @@ void eprom_state::eprom(machine_config &config)
m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
m_screen->set_screen_update(FUNC(eprom_state::screen_update_eprom));
m_screen->set_palette(m_palette);
m_screen->screen_vblank().set(FUNC(eprom_state::video_int_write_line));
m_screen->screen_vblank().set_inputline(m_maincpu, M68K_IRQ_4, ASSERT_LINE);
m_screen->screen_vblank().append_inputline(m_extra, M68K_IRQ_4, ASSERT_LINE);
MCFG_VIDEO_START_OVERRIDE(eprom_state,eprom)
@ -427,6 +429,8 @@ void eprom_state::klaxp(machine_config &config)
config.set_maximum_quantum(attotime::from_hz(600));
TIMER(config, "scantimer").configure_scanline(FUNC(eprom_state::scanline_update), m_screen, 0, 8);
EEPROM_2804(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog");
@ -448,7 +452,7 @@ void eprom_state::klaxp(machine_config &config)
m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
m_screen->set_screen_update(FUNC(eprom_state::screen_update_eprom));
m_screen->set_palette(m_palette);
m_screen->screen_vblank().set(FUNC(eprom_state::video_int_write_line));
m_screen->screen_vblank().set_inputline(m_maincpu, M68K_IRQ_4, ASSERT_LINE);
MCFG_VIDEO_START_OVERRIDE(eprom_state,eprom)
@ -470,6 +474,8 @@ void eprom_state::guts(machine_config &config)
config.set_maximum_quantum(attotime::from_hz(600));
TIMER(config, "scantimer").configure_scanline(FUNC(eprom_state::scanline_update), m_screen, 0, 8);
ADC0809(config, m_adc, ATARI_CLOCK_14MHz/16);
m_adc->in_callback<0>().set_ioport("ADC0");
m_adc->in_callback<1>().set_ioport("ADC1");
@ -497,7 +503,7 @@ void eprom_state::guts(machine_config &config)
m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
m_screen->set_screen_update(FUNC(eprom_state::screen_update_guts));
m_screen->set_palette(m_palette);
m_screen->screen_vblank().set(FUNC(eprom_state::video_int_write_line));
m_screen->screen_vblank().set_inputline(m_maincpu, M68K_IRQ_4, ASSERT_LINE);
MCFG_VIDEO_START_OVERRIDE(eprom_state,guts)

View File

@ -38,24 +38,19 @@
*
*************************************/
void klax_state::update_interrupts()
TIMER_DEVICE_CALLBACK_MEMBER(klax_state::scanline_update)
{
m_maincpu->set_input_line(4, m_video_int_state || m_scanline_int_state ? ASSERT_LINE : CLEAR_LINE);
}
int scanline = param;
void klax_state::scanline_update(screen_device &screen, int scanline)
{
/* generate 32V signals */
if ((scanline & 32) == 0 && !m_screen->vblank() && !(m_p1->read() & 0x800))
scanline_int_write_line(1);
m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE);
}
void klax_state::interrupt_ack_w(u16 data)
{
scanline_int_ack_w();
video_int_ack_w();
m_maincpu->set_input_line(M68K_IRQ_4, CLEAR_LINE);
}
@ -67,8 +62,6 @@ void klax_state::interrupt_ack_w(u16 data)
void klax_state::machine_reset()
{
atarigen_state::machine_reset();
scanline_timer_reset(*m_screen, 32);
}
@ -194,9 +187,11 @@ GFXDECODE_END
void klax_state::klax(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, ATARI_CLOCK_14MHz/2);
M68000(config, m_maincpu, 14.318181_MHz_XTAL/2);
m_maincpu->set_addrmap(AS_PROGRAM, &klax_state::klax_map);
TIMER(config, "scantimer").configure_scanline(FUNC(klax_state::scanline_update), m_screen, 0, 32);
EEPROM_2816(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog");
@ -215,15 +210,15 @@ void klax_state::klax(machine_config &config)
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses an SOS-2 chip to generate video signals */
m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
m_screen->set_raw(14.318181_MHz_XTAL/2, 456, 0, 336, 262, 0, 240);
m_screen->set_screen_update(FUNC(klax_state::screen_update));
m_screen->set_palette("palette");
m_screen->screen_vblank().set(FUNC(klax_state::video_int_write_line));
m_screen->screen_vblank().set_inputline(m_maincpu, M68K_IRQ_4, ASSERT_LINE);
/* sound hardware */
SPEAKER(config, "mono").front_center();
OKIM6295(config, "oki", ATARI_CLOCK_14MHz/4/4, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
OKIM6295(config, "oki", 14.318181_MHz_XTAL/4/4, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
}
void klax_state::bootleg_sound_map(address_map &map)

View File

@ -35,19 +35,6 @@ void shuuz_state::machine_start()
save_item(NAME(m_cur));
}
/*************************************
*
* Interrupt handling
*
*************************************/
void shuuz_state::update_interrupts()
{
m_maincpu->set_input_line(4, m_scanline_int_state ? ASSERT_LINE : CLEAR_LINE);
}
/*************************************
*
* Initialization
@ -236,7 +223,7 @@ GFXDECODE_END
void shuuz_state::shuuz(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, ATARI_CLOCK_14MHz/2);
M68000(config, m_maincpu, 14.318181_MHz_XTAL/2);
m_maincpu->set_addrmap(AS_PROGRAM, &shuuz_state::main_map);
EEPROM_2816(config, "eeprom").lock_after_write(true);
@ -248,7 +235,7 @@ void shuuz_state::shuuz(machine_config &config)
PALETTE(config, "palette").set_format(palette_device::IRGB_1555, 1024);
ATARI_VAD(config, m_vad, 0, m_screen);
m_vad->scanline_int_cb().set(FUNC(shuuz_state::scanline_int_write_line));
m_vad->scanline_int_cb().set_inputline(m_maincpu, M68K_IRQ_4);
TILEMAP(config, "vad:playfield", m_gfxdecode, 2, 8, 8, TILEMAP_SCAN_COLS, 64, 64).set_info_callback(FUNC(shuuz_state::get_playfield_tile_info));
ATARI_MOTION_OBJECTS(config, "vad:mob", 0, m_screen, shuuz_state::s_mob_config).set_gfxdecode(m_gfxdecode);
@ -256,14 +243,14 @@ void shuuz_state::shuuz(machine_config &config)
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
/* note: these parameters are from published specs, not derived */
/* the board uses a VAD chip to generate video signals */
m_screen->set_raw(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240);
m_screen->set_raw(14.318181_MHz_XTAL/2, 456, 0, 336, 262, 0, 240);
m_screen->set_screen_update(FUNC(shuuz_state::screen_update));
m_screen->set_palette("palette");
/* sound hardware */
SPEAKER(config, "mono").front_center();
OKIM6295(config, "oki", ATARI_CLOCK_14MHz/16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
OKIM6295(config, "oki", 14.318181_MHz_XTAL/16, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
}

View File

@ -37,23 +37,15 @@ static constexpr XTAL MASTER_CLOCK = 32_MHz_XTAL;
*
*************************************/
WRITE_LINE_MEMBER(toobin_state::sound_int_write_line)
TIMER_CALLBACK_MEMBER(toobin_state::scanline_interrupt)
{
m_sound_int_state = state;
update_interrupts();
}
void toobin_state::update_interrupts()
{
m_maincpu->set_input_line(1, m_scanline_int_state ? ASSERT_LINE : CLEAR_LINE);
m_maincpu->set_input_line(2, m_sound_int_state ? ASSERT_LINE : CLEAR_LINE);
m_maincpu->set_input_line(3, m_scanline_int_state && m_sound_int_state ? ASSERT_LINE : CLEAR_LINE);
m_maincpu->set_input_line(M68K_IRQ_IPL0, ASSERT_LINE);
m_scanline_interrupt_timer->adjust(m_screen->frame_period());
}
void toobin_state::machine_start()
{
atarigen_state::machine_start();
save_item(NAME(m_sound_int_state));
m_scanline_interrupt_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(toobin_state::scanline_interrupt), this));
}
@ -74,10 +66,15 @@ WRITE16_MEMBER(toobin_state::interrupt_scan_w)
if (oldword != newword)
{
m_interrupt_scan[offset] = newword;
scanline_int_set(*m_screen, newword & 0x1ff);
m_scanline_interrupt_timer->adjust(m_screen->time_until_pos(newword & 0x1ff));
}
}
void toobin_state::scanline_int_ack_w(uint16_t data)
{
m_maincpu->set_input_line(M68K_IRQ_IPL0, CLEAR_LINE);
}
/*************************************
@ -206,8 +203,9 @@ GFXDECODE_END
void toobin_state::toobin(machine_config &config)
{
/* basic machine hardware */
M68010(config, m_maincpu, MASTER_CLOCK/4);
m_maincpu->set_addrmap(AS_PROGRAM, &toobin_state::main_map);
m68010_device &maincpu(M68010(config, m_maincpu, MASTER_CLOCK/4));
maincpu.set_addrmap(AS_PROGRAM, &toobin_state::main_map);
maincpu.disable_interrupt_mixer();
EEPROM_2804(config, "eeprom").lock_after_write(true);
@ -233,7 +231,7 @@ void toobin_state::toobin(machine_config &config)
SPEAKER(config, "rspeaker").front_right();
ATARI_JSA_I(config, m_jsa, 0);
m_jsa->main_int_cb().set(FUNC(toobin_state::sound_int_write_line));
m_jsa->main_int_cb().set_inputline(m_maincpu, M68K_IRQ_IPL1);
m_jsa->test_read_cb().set_ioport("FF9000").bit(12);
m_jsa->add_route(0, "lspeaker", 1.0);
m_jsa->add_route(1, "rspeaker", 1.0);

View File

@ -35,16 +35,20 @@
*
*************************************/
void vindictr_state::update_interrupts()
void vindictr_state::scanline_interrupt()
{
m_maincpu->set_input_line(4, m_scanline_int_state ? ASSERT_LINE : CLEAR_LINE);
m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE);
}
void vindictr_state::scanline_int_ack_w(uint16_t data)
{
m_maincpu->set_input_line(M68K_IRQ_4, CLEAR_LINE);
}
void vindictr_state::machine_reset()
{
atarigen_state::machine_reset();
scanline_timer_reset(*m_screen, 8);
}
@ -188,6 +192,8 @@ void vindictr_state::vindictr(machine_config &config)
M68010(config, m_maincpu, ATARI_CLOCK_14MHz/2);
m_maincpu->set_addrmap(AS_PROGRAM, &vindictr_state::main_map);
TIMER(config, "scantimer").configure_scanline(FUNC(vindictr_state::scanline_update), m_screen, 0, 8);
EEPROM_2804(config, "eeprom").lock_after_write(true);
WATCHDOG_TIMER(config, "watchdog");

View File

@ -10,15 +10,19 @@
#pragma once
#include "machine/atarigen.h"
#include "machine/timer.h"
#include "video/atarimo.h"
#include "sound/okim6295.h"
#include "screen.h"
class sparkz_state : public atarigen_state
class sparkz_state : public driver_device
{
public:
sparkz_state(const machine_config &mconfig, device_type type, const char *tag)
: atarigen_state(mconfig, type, tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_gfxdecode(*this, "gfxdecode")
, m_screen(*this, "screen")
, m_oki(*this, "oki")
, m_bitmap(*this, "bitmap")
{ }
@ -27,13 +31,15 @@ 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(latch_w);
TIMER_DEVICE_CALLBACK_MEMBER(scanline_interrupt);
void scanline_int_ack_w(uint16_t data);
void latch_w(uint8_t data);
virtual uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void main_map(address_map &map);
private:
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<okim6295_device> m_oki;
required_shared_ptr<uint16_t> m_bitmap;
};

View File

@ -11,17 +11,21 @@
#pragma once
#include "machine/adc0808.h"
#include "machine/atarigen.h"
#include "machine/timer.h"
#include "audio/atarijsa.h"
#include "video/atarimo.h"
#include "emupal.h"
#include "screen.h"
#include "tilemap.h"
class eprom_state : public atarigen_state
class eprom_state : public driver_device
{
public:
eprom_state(const machine_config &mconfig, device_type type, const char *tag) :
atarigen_state(mconfig, type, tag),
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_playfield_tilemap(*this, "playfield"),
m_alpha_tilemap(*this, "alpha"),
m_mob(*this, "mob"),
@ -40,10 +44,11 @@ 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;
DECLARE_READ8_MEMBER(adc_r);
DECLARE_WRITE16_MEMBER(eprom_latch_w);
void video_int_ack_w(uint16_t data);
void video_int_ack_extra_w(uint16_t data);
TIMER_DEVICE_CALLBACK_MEMBER(scanline_update);
uint8_t adc_r(offs_t offset);
void eprom_latch_w(uint8_t data);
template<bool maincpu> DECLARE_WRITE16_MEMBER(sync_w);
TILE_GET_INFO_MEMBER(get_alpha_tile_info);
TILE_GET_INFO_MEMBER(get_playfield_tile_info);
@ -58,6 +63,9 @@ protected:
void main_map(address_map &map);
private:
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<tilemap_device> m_playfield_tilemap;
required_device<tilemap_device> m_alpha_tilemap;
required_device<atari_motion_objects_device> m_mob;

View File

@ -10,15 +10,19 @@
#pragma once
#include "machine/atarigen.h"
#include "machine/timer.h"
#include "video/atarimo.h"
#include "screen.h"
#include "tilemap.h"
class klax_state : public atarigen_state
class klax_state : public driver_device
{
public:
klax_state(const machine_config &mconfig, device_type type, const char *tag)
: atarigen_state(mconfig, type, tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_gfxdecode(*this, "gfxdecode")
, m_screen(*this, "screen")
, m_playfield_tilemap(*this, "playfield")
, m_mob(*this, "mob")
, m_p1(*this, "P1")
@ -30,9 +34,8 @@ public:
private:
virtual void machine_reset() override;
virtual void scanline_update(screen_device &screen, int scanline) override;
TIMER_DEVICE_CALLBACK_MEMBER(scanline_update);
virtual void update_interrupts() override;
void interrupt_ack_w(u16 data = 0);
void latch_w(u16 data);
@ -44,6 +47,9 @@ private:
void klax5bl_map(address_map &map);
void klax_map(address_map &map);
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<tilemap_device> m_playfield_tilemap;
required_device<atari_motion_objects_device> m_mob;

View File

@ -10,36 +10,42 @@
#pragma once
#include "machine/atarigen.h"
#include "video/atarimo.h"
#include "video/atarivad.h"
#include "screen.h"
#include "tilemap.h"
class shuuz_state : public atarigen_state
class shuuz_state : public driver_device
{
public:
shuuz_state(const machine_config &mconfig, device_type type, const char *tag)
: atarigen_state(mconfig, type, tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_gfxdecode(*this, "gfxdecode")
, m_screen(*this, "screen")
, m_vad(*this, "vad")
{ }
void shuuz(machine_config &config);
private:
virtual void update_interrupts() override;
DECLARE_WRITE16_MEMBER(latch_w);
DECLARE_READ16_MEMBER(leta_r);
DECLARE_READ16_MEMBER(special_port0_r);
virtual void machine_start() override;
int get_hblank(screen_device &screen) const { return (screen.hpos() > (screen.width() * 9 / 10)); }
TILE_GET_INFO_MEMBER(get_playfield_tile_info);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void main_map(address_map &map);
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<atari_vad_device> m_vad;
int m_cur[2];

View File

@ -10,17 +10,20 @@
#pragma once
#include "machine/atarigen.h"
#include "audio/atarijsa.h"
#include "video/atarimo.h"
#include "emupal.h"
#include "screen.h"
#include "tilemap.h"
class toobin_state : public atarigen_state
class toobin_state : public driver_device
{
public:
toobin_state(const machine_config &mconfig, device_type type, const char *tag) :
atarigen_state(mconfig, type, tag),
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_jsa(*this, "jsa"),
m_playfield_tilemap(*this, "playfield"),
m_alpha_tilemap(*this, "alpha"),
@ -28,7 +31,8 @@ public:
m_palette(*this, "palette"),
m_paletteram(*this, "paletteram"),
m_interrupt_scan(*this, "interrupt_scan"),
m_sound_int_state(0)
m_xscroll(*this, "xscroll"),
m_yscroll(*this, "yscroll")
{ }
void toobin(machine_config &config);
@ -36,9 +40,9 @@ public:
private:
virtual void machine_start() override;
virtual void video_start() override;
virtual void update_interrupts() override;
DECLARE_WRITE_LINE_MEMBER(sound_int_write_line);
TIMER_CALLBACK_MEMBER(scanline_interrupt);
void scanline_int_ack_w(uint16_t data);
DECLARE_WRITE16_MEMBER(interrupt_scan_w);
DECLARE_WRITE16_MEMBER(paletteram_w);
@ -54,6 +58,9 @@ private:
void main_map(address_map &map);
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<atari_jsa_i_device> m_jsa;
required_device<tilemap_device> m_playfield_tilemap;
required_device<tilemap_device> m_alpha_tilemap;
@ -62,11 +69,13 @@ private:
required_shared_ptr<uint16_t> m_paletteram;
required_shared_ptr<uint16_t> m_interrupt_scan;
required_shared_ptr<uint16_t> m_xscroll;
required_shared_ptr<uint16_t> m_yscroll;
double m_brightness;
bitmap_ind16 m_pfbitmap;
uint8_t m_sound_int_state;
emu_timer *m_scanline_interrupt_timer;
static const atari_motion_objects_config s_mob_config;
};

View File

@ -10,17 +10,21 @@
#pragma once
#include "machine/atarigen.h"
#include "machine/timer.h"
#include "audio/atarijsa.h"
#include "video/atarimo.h"
#include "emupal.h"
#include "screen.h"
#include "tilemap.h"
class vindictr_state : public atarigen_state
class vindictr_state : public driver_device
{
public:
vindictr_state(const machine_config &mconfig, device_type type, const char *tag) :
atarigen_state(mconfig, type, tag),
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_playfield_tilemap(*this, "playfield"),
m_alpha_tilemap(*this, "alpha"),
m_mob(*this, "mob"),
@ -36,8 +40,9 @@ public:
private:
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 scanline_interrupt();
void scanline_int_ack_w(uint16_t data);
TIMER_DEVICE_CALLBACK_MEMBER(scanline_update);
DECLARE_READ16_MEMBER(port1_r);
TILE_GET_INFO_MEMBER(get_alpha_tile_info);
TILE_GET_INFO_MEMBER(get_playfield_tile_info);
@ -47,6 +52,9 @@ private:
static const atari_motion_objects_config s_mob_config;
void main_map(address_map &map);
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<tilemap_device> m_playfield_tilemap;
required_device<tilemap_device> m_alpha_tilemap;
required_device<atari_motion_objects_device> m_mob;

View File

@ -363,7 +363,6 @@ void atarigen_state::machine_start()
{
assert(i <= ARRAY_LENGTH(m_screen_timer));
m_screen_timer[i].screen = &screen;
m_screen_timer[i].scanline_interrupt_timer = timer_alloc(TID_SCANLINE_INTERRUPT, (void *)&screen);
m_screen_timer[i].scanline_timer = timer_alloc(TID_SCANLINE_TIMER, (void *)&screen);
i++;
}
@ -401,14 +400,6 @@ void atarigen_state::device_timer(emu_timer &timer, device_timer_id id, int para
{
switch (id)
{
case TID_SCANLINE_INTERRUPT:
{
scanline_int_write_line(1);
screen_device *screen = reinterpret_cast<screen_device *>(ptr);
timer.adjust(screen->frame_period());
break;
}
case TID_SCANLINE_TIMER:
scanline_timer(timer, *reinterpret_cast<screen_device *>(ptr), param);
break;
@ -430,17 +421,6 @@ void atarigen_state::scanline_update(screen_device &screen, int scanline)
INTERRUPT HANDLING
***************************************************************************/
//-------------------------------------------------
// scanline_int_set: Sets the scanline when the next
// scanline interrupt should be generated.
//-------------------------------------------------
void atarigen_state::scanline_int_set(screen_device &screen, int scanline)
{
get_screen_timer(screen)->scanline_interrupt_timer->adjust(screen.time_until_pos(scanline));
}
//-------------------------------------------------
// scanline_int_write_line: Standard write line
// callback for the scanline interrupt

View File

@ -122,7 +122,6 @@ private:
struct atarigen_screen_timer
{
screen_device *screen;
emu_timer * scanline_interrupt_timer;
emu_timer * scanline_timer;
};
@ -145,7 +144,6 @@ protected:
virtual void scanline_update(screen_device &screen, int scanline);
// interrupt handling
void scanline_int_set(screen_device &screen, int scanline);
DECLARE_WRITE_LINE_MEMBER(scanline_int_write_line);
void scanline_int_ack_w(u16 data = 0);
@ -163,7 +161,6 @@ protected:
void scanline_timer(emu_timer &timer, screen_device &screen, int scanline);
// video helpers
int get_hblank(screen_device &screen) const { return (screen.hpos() > (screen.width() * 9 / 10)); }
void halt_until_hblank_0(device_t &device, screen_device &screen);
// misc helpers
@ -172,7 +169,6 @@ protected:
// timer IDs
enum
{
TID_SCANLINE_INTERRUPT,
TID_SCANLINE_TIMER,
TID_UNHALT_CPU,
TID_ATARIGEN_LAST

View File

@ -179,10 +179,10 @@ VIDEO_START_MEMBER(eprom_state,guts)
*
*************************************/
void eprom_state::scanline_update(screen_device &screen, int scanline)
TIMER_DEVICE_CALLBACK_MEMBER(eprom_state::scanline_update)
{
/* update the playfield */
if (scanline == 0)
if (param == 0)
{
int xscroll = (m_alpha_tilemap->basemem_read(0x780) >> 7) & 0x1ff;
int yscroll = (m_alpha_tilemap->basemem_read(0x781) >> 7) & 0x1ff;

View File

@ -123,9 +123,9 @@ WRITE16_MEMBER( vindictr_state::vindictr_paletteram_w )
*
*************************************/
void vindictr_state::scanline_update(screen_device &screen, int scanline)
TIMER_DEVICE_CALLBACK_MEMBER(vindictr_state::scanline_update)
{
int x;
int scanline = param;
/* keep in range */
int offset = ((scanline - 8) / 8) * 64 + 42;
@ -135,7 +135,7 @@ void vindictr_state::scanline_update(screen_device &screen, int scanline)
return;
/* update the current parameters */
for (x = 42; x < 64; x++)
for (int x = 42; x < 64; x++)
{
uint16_t data = m_alpha_tilemap->basemem_read(offset++);
@ -144,7 +144,7 @@ void vindictr_state::scanline_update(screen_device &screen, int scanline)
case 2: /* /PFB */
if (m_playfield_tile_bank != (data & 7))
{
screen.update_partial(scanline - 1);
m_screen->update_partial(scanline - 1);
m_playfield_tile_bank = data & 7;
m_playfield_tilemap->mark_all_dirty();
}
@ -153,7 +153,7 @@ void vindictr_state::scanline_update(screen_device &screen, int scanline)
case 3: /* /PFHSLD */
if (m_playfield_xscroll != (data & 0x1ff))
{
screen.update_partial(scanline - 1);
m_screen->update_partial(scanline - 1);
m_playfield_tilemap->set_scrollx(0, data);
m_playfield_xscroll = data & 0x1ff;
}
@ -162,7 +162,7 @@ void vindictr_state::scanline_update(screen_device &screen, int scanline)
case 4: /* /MOHS */
if (m_mob->xscroll() != (data & 0x1ff))
{
screen.update_partial(scanline - 1);
m_screen->update_partial(scanline - 1);
m_mob->set_xscroll(data & 0x1ff);
}
break;
@ -171,20 +171,20 @@ void vindictr_state::scanline_update(screen_device &screen, int scanline)
break;
case 6: /* /VIRQ */
scanline_int_write_line(1);
scanline_interrupt();
break;
case 7: /* /PFVS */
{
/* a new vscroll latches the offset into a counter; we must adjust for this */
int offset = scanline;
const rectangle &visible_area = screen.visible_area();
const rectangle &visible_area = m_screen->visible_area();
if (offset > visible_area.bottom())
offset -= visible_area.bottom() + 1;
if (m_playfield_yscroll != ((data - offset) & 0x1ff))
{
screen.update_partial(scanline - 1);
m_screen->update_partial(scanline - 1);
m_playfield_tilemap->set_scrolly(0, data - offset);
m_mob->set_yscroll((data - offset) & 0x1ff);
}