diff options
Diffstat (limited to 'src/mame/drivers/segajw.cpp')
-rw-r--r-- | src/mame/drivers/segajw.cpp | 450 |
1 files changed, 0 insertions, 450 deletions
diff --git a/src/mame/drivers/segajw.cpp b/src/mame/drivers/segajw.cpp deleted file mode 100644 index 6eba9fb6db0..00000000000 --- a/src/mame/drivers/segajw.cpp +++ /dev/null @@ -1,450 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Sandro Ronco -/*************************************************************************** - -============================================================================ - -SEGA GOLDEN POKER SERIES "JOKER'S WILD" (REV.B) -(c) SEGA - -MAIN CPU : 68000 Z-80 -CRTC : HITACHI HD63484 (24KHz OUTPUT) -SOUND : YM3438 - -14584B.EPR ; MAIN BOARD IC20 EPR-14584B (27C1000 MAIN-ODD) -14585B.EPR ; MAIN BOARD IC22 EPR-14585B (27C1000 MAIN-EVEN) -14586.EPR ; MAIN BOARD IC26 EPR-14586 (27C4096 BG) -14587A.EPR ; SOUND BOARD IC51 EPR-14587A (27C1000 SOUND) - ------------------------------------------------------------------- - -***************************************************************************/ - -/* -Also seem to be running on the same/similar hardware: -* Deuce's Wild (http://topline.royalflush.jp/modules/contents/?%A5%DE%A5%B7%A5%F3%A5%C7%A1%BC%A5%BF%A5%D9%A1%BC%A5%B9%2F%A5%D3%A5%C7%A5%AA%A5%DD%A1%BC%A5%AB%A1%BC%2FSEGA%2FDEUCE%27S_WILD) -* Draw Poker (http://topline.royalflush.jp/modules/contents/?%A5%DE%A5%B7%A5%F3%A5%C7%A1%BC%A5%BF%A5%D9%A1%BC%A5%B9%2F%A5%D3%A5%C7%A5%AA%A5%DD%A1%BC%A5%AB%A1%BC%2FSEGA%2FDRAW_POKER) -*/ - - -#include "emu.h" -#include "cpu/m68000/m68000.h" -#include "cpu/z80/z80.h" -#include "machine/gen_latch.h" -#include "machine/nvram.h" -#include "machine/315_5296.h" -#include "sound/2612intf.h" -#include "video/hd63484.h" -#include "video/ramdac.h" -#include "screen.h" -#include "speaker.h" - -#include "segajw.lh" - -class segajw_state : public driver_device -{ -public: - segajw_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_audiocpu(*this, "audiocpu") - , m_soundlatch(*this, "soundlatch") - , m_lamps(*this, "lamp%u", 0U) - , m_towerlamps(*this, "towerlamp%u", 0U) - { } - - void segajw(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(coin_drop_start); - DECLARE_CUSTOM_INPUT_MEMBER(coin_sensors_r); - DECLARE_READ_LINE_MEMBER(hopper_sensors_r); - -private: - DECLARE_READ8_MEMBER(coin_counter_r); - DECLARE_WRITE8_MEMBER(coin_counter_w); - DECLARE_WRITE8_MEMBER(hopper_w); - DECLARE_WRITE8_MEMBER(lamps1_w); - DECLARE_WRITE8_MEMBER(lamps2_w); - DECLARE_WRITE8_MEMBER(coinlockout_w); - - // driver_device overrides - virtual void machine_start() override; - virtual void machine_reset() override; - - void ramdac_map(address_map &map); - void segajw_audiocpu_io_map(address_map &map); - void segajw_audiocpu_map(address_map &map); - void segajw_hd63484_map(address_map &map); - void segajw_map(address_map &map); - - // devices - required_device<cpu_device> m_maincpu; - required_device<cpu_device> m_audiocpu; - required_device<generic_latch_8_device> m_soundlatch; - output_finder<16> m_lamps; - output_finder<3> m_towerlamps; - - uint64_t m_coin_start_cycles; - uint64_t m_hopper_start_cycles; - uint8_t m_coin_counter; -}; - - -READ8_MEMBER(segajw_state::coin_counter_r) -{ - return m_coin_counter ^ 0xff; -} - -WRITE8_MEMBER(segajw_state::coin_counter_w) -{ - m_coin_counter = data; -} - -WRITE8_MEMBER(segajw_state::hopper_w) -{ - m_hopper_start_cycles = data & 0x02 ? 0 : m_maincpu->total_cycles(); -} - -WRITE8_MEMBER(segajw_state::lamps1_w) -{ - for (int i = 0; i < 8; i++) - m_lamps[i] = BIT(data, i); -} - -WRITE8_MEMBER(segajw_state::lamps2_w) -{ - for (int i = 0; i < 8; i++) - m_lamps[8 + i] = BIT(data, i); -} - -WRITE8_MEMBER(segajw_state::coinlockout_w) -{ - machine().bookkeeping().coin_lockout_w(0, data & 1); - - for (int i = 0; i < 3; i++) - m_towerlamps[i] = BIT(data, 3 + i); -} - -INPUT_CHANGED_MEMBER( segajw_state::coin_drop_start ) -{ - if (newval && !m_coin_start_cycles) - m_coin_start_cycles = m_maincpu->total_cycles(); -} - -READ_LINE_MEMBER( segajw_state::hopper_sensors_r ) -{ - uint8_t data = 0; - - // if the hopper is active simulate the coin-out sensor - if (m_hopper_start_cycles) - { - attotime diff = m_maincpu->cycles_to_attotime(m_maincpu->total_cycles() - m_hopper_start_cycles); - - if (diff > attotime::from_msec(100)) - data |= 0x01; - - if (diff > attotime::from_msec(200)) - m_hopper_start_cycles = m_maincpu->total_cycles(); - } - - return data; -} - -CUSTOM_INPUT_MEMBER( segajw_state::coin_sensors_r ) -{ - uint8_t data = 0; - - // simulates the passage of coins through multiple sensors - if (m_coin_start_cycles) - { - attotime diff = m_maincpu->cycles_to_attotime(m_maincpu->total_cycles() - m_coin_start_cycles); - - if (diff > attotime::from_msec(20) && diff < attotime::from_msec(100)) - data |= 0x01; - if (diff > attotime::from_msec(80) && diff < attotime::from_msec(200)) - data |= 0x02; - if (diff <= attotime::from_msec(100)) - data |= 0x04; - - if (diff > attotime::from_msec(200)) - m_coin_start_cycles = 0; - } - - return data; -} - -void segajw_state::segajw_map(address_map &map) -{ - map(0x000000, 0x03ffff).rom(); - - map(0x080000, 0x080001).rw("hd63484", FUNC(hd63484_device::status16_r), FUNC(hd63484_device::address16_w)); - map(0x080002, 0x080003).rw("hd63484", FUNC(hd63484_device::data16_r), FUNC(hd63484_device::data16_w)); - - map(0x180000, 0x180001).portr("DSW0"); - map(0x180005, 0x180005).r("soundlatch2", FUNC(generic_latch_8_device::read)).w(m_soundlatch, FUNC(generic_latch_8_device::write)).umask16(0x00ff); - map(0x180008, 0x180009).portr("DSW1"); - map(0x18000a, 0x18000b).portr("DSW3"); - map(0x18000c, 0x18000d).portr("DSW2"); - - map(0x1a0000, 0x1a001f).rw("io1a", FUNC(sega_315_5296_device::read), FUNC(sega_315_5296_device::write)).umask16(0x00ff); - - map(0x1c0000, 0x1c001f).rw("io1c", FUNC(sega_315_5296_device::read), FUNC(sega_315_5296_device::write)).umask16(0x00ff); - - map(0x280001, 0x280001).w("ramdac", FUNC(ramdac_device::index_w)); - map(0x280003, 0x280003).w("ramdac", FUNC(ramdac_device::pal_w)); - map(0x280005, 0x280005).w("ramdac", FUNC(ramdac_device::mask_w)); - - map(0xff0000, 0xffffff).ram().share("nvram"); -} - -void segajw_state::segajw_audiocpu_map(address_map &map) -{ - map(0x0000, 0x7fff).rom(); - map(0xe000, 0xffff).ram(); -} - -void segajw_state::segajw_audiocpu_io_map(address_map &map) -{ - map.global_mask(0xff); - map(0x80, 0x83).rw("ymsnd", FUNC(ym3438_device::read), FUNC(ym3438_device::write)); - map(0xc0, 0xc0).r(m_soundlatch, FUNC(generic_latch_8_device::read)).w("soundlatch2", FUNC(generic_latch_8_device::write)); -} - -void segajw_state::segajw_hd63484_map(address_map &map) -{ - map(0x00000, 0x3ffff).ram(); - map(0x80000, 0xbffff).rom().region("gfx1", 0); -} - - -static INPUT_PORTS_START( segajw ) - PORT_START("IN0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_POKER_HOLD4 ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_BET ) PORT_NAME("1 Bet") - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Max Bet") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Deal / Draw") - - PORT_START("IN1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Double") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Change") - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Reset") PORT_CODE(KEYCODE_R) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN2") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_SERVICE ) PORT_NAME("Meter") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Last Game") PORT_CODE(KEYCODE_T) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("M-Door") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("D-Door") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(segajw_state, hopper_sensors_r) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Hopper Full") - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Hopper Fill") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN3") - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(segajw_state, coin_sensors_r) - PORT_BIT( 0xf8, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("COIN1") // start the coin drop sequence (see coin_sensors_r) - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, segajw_state, coin_drop_start, 0) - - PORT_START("DSW1") - PORT_DIPNAME( 0x0001, 0x0000, "Progressive" ) PORT_DIPLOCATION("SW1:1") - PORT_DIPSETTING( 0x0001, "Normal" ) - PORT_DIPSETTING( 0x0000, "Progressive" ) - PORT_DIPNAME( 0x0002, 0x0000, "Double Down" ) PORT_DIPLOCATION("SW1:2") - PORT_DIPSETTING( 0x0002, "With D.D" ) - PORT_DIPSETTING( 0x0000, "Without D.D" ) - PORT_DIPNAME( 0x0004, 0x0000, "Draw Cards" ) PORT_DIPLOCATION("SW1:3") - PORT_DIPSETTING( 0x0004, "Display" ) - PORT_DIPSETTING( 0x0000, "No Display" ) - PORT_DIPNAME( 0x0008, 0x0000, "Color Change" ) PORT_DIPLOCATION("SW1:4") - PORT_DIPSETTING( 0x0008, "Change" ) - PORT_DIPSETTING( 0x0000, "No Change" ) - PORT_DIPNAME( 0x0010, 0x0000, "Odds Table" ) PORT_DIPLOCATION("SW1:5") - PORT_DIPSETTING( 0x0010, "No Display" ) - PORT_DIPSETTING( 0x0000, "Display" ) - PORT_DIPNAME( 0x0060, 0x0000, "Play Mode" ) PORT_DIPLOCATION("SW1:6,7") - PORT_DIPSETTING( 0x0000, "Coin" ) - PORT_DIPSETTING( 0x0020, "Coin/Credit" ) - // PORT_DIPSETTING( 0x0040, "Coin/Credit" ) - PORT_DIPSETTING( 0x0060, "Credit" ) - PORT_DIPNAME( 0x0080, 0x0000, "Best Choice" ) PORT_DIPLOCATION("SW1:8") - PORT_DIPSETTING( 0x0080, "Display" ) - PORT_DIPSETTING( 0x0000, "No Display" ) - - PORT_START("DSW2") - PORT_DIPNAME( 0x0007, 0x0000, "Denomination" ) PORT_DIPLOCATION("SW2:1,2,3") - PORT_DIPSETTING( 0x0000, "$25" ) - PORT_DIPSETTING( 0x0001, "$5" ) - PORT_DIPSETTING( 0x0002, "$1" ) - PORT_DIPSETTING( 0x0003, "50c" ) - PORT_DIPSETTING( 0x0004, "25c" ) - PORT_DIPSETTING( 0x0005, "10c" ) - PORT_DIPSETTING( 0x0006, "5c" ) - PORT_DIPSETTING( 0x0007, "Medal" ) - PORT_DIPNAME( 0x0008, 0x0000, "Max. Pay" ) PORT_DIPLOCATION("SW2:4") - PORT_DIPSETTING( 0x0008, "500" ) - PORT_DIPSETTING( 0x0000, "1000" ) - PORT_DIPNAME( 0x0010, 0x0000, "Max. Credit" ) PORT_DIPLOCATION("SW2:5") - PORT_DIPSETTING( 0x0010, "5000" ) - PORT_DIPSETTING( 0x0000, "1000" ) - PORT_DIPNAME( 0x0020, 0x0000, "$1200" ) PORT_DIPLOCATION("SW2:6") - PORT_DIPSETTING( 0x0020, "At. Pay" ) - PORT_DIPSETTING( 0x0000, "Credit/At. Pay" ) - PORT_DIPNAME( 0x00c0, 0x0000, "Max. Bet" ) PORT_DIPLOCATION("SW2:7,8") - PORT_DIPSETTING( 0x0000, "10" ) - PORT_DIPSETTING( 0x00c0, "5" ) - PORT_DIPSETTING( 0x0040, "3" ) - PORT_DIPSETTING( 0x0080, "1" ) - - PORT_START("DSW3") - PORT_DIPNAME( 0x0001, 0x0001, "Meter" ) PORT_DIPLOCATION("SW3:1") - PORT_DIPSETTING( 0x0001, "Nevada" ) - PORT_DIPSETTING( 0x0000, "New Jersey" ) - PORT_DIPNAME( 0x0002, 0x0002, "Card Face" ) PORT_DIPLOCATION("SW3:2") - PORT_DIPSETTING( 0x0002, "Changeable" ) - PORT_DIPSETTING( 0x0000, "Original" ) - PORT_DIPNAME( 0x0004, 0x0004, "Card Back" ) PORT_DIPLOCATION("SW3:3") - PORT_DIPSETTING( 0x0004, "Changeable" ) - PORT_DIPSETTING( 0x0000, "Original" ) - PORT_DIPUNUSED( 0x0008, 0x0008) PORT_DIPLOCATION("SW3:4") - PORT_DIPUNUSED( 0x0010, 0x0010) PORT_DIPLOCATION("SW3:5") - PORT_DIPUNUSED( 0x0020, 0x0020) PORT_DIPLOCATION("SW3:6") - PORT_DIPUNUSED( 0x0040, 0x0040) PORT_DIPLOCATION("SW3:7") - PORT_DIPUNUSED( 0x0080, 0x0080) PORT_DIPLOCATION("SW3:8") - - PORT_START("DSW0") - PORT_DIPNAME( 0x0001, 0x0000, "Jumper 1" ) PORT_DIPLOCATION("SW4:1") - PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0002, 0x0000, "Jumper 2" ) PORT_DIPLOCATION("SW4:2") - PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0004, 0x0000, "Jumper 3" ) PORT_DIPLOCATION("SW4:3") - PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0008, 0x0000, "Jumper 4" ) PORT_DIPLOCATION("SW4:4") - PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0010, 0x0000, "Jumper 5" ) PORT_DIPLOCATION("SW4:5") - PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0020, 0x0000, "Jumper 6" ) PORT_DIPLOCATION("SW4:6") - PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0040, 0x0000, "Jumper 7" ) PORT_DIPLOCATION("SW4:7") - PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0080, 0x0000, "Jumper 8" ) PORT_DIPLOCATION("SW4:8") - PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) -INPUT_PORTS_END - - -void segajw_state::machine_start() -{ - m_lamps.resolve(); - m_towerlamps.resolve(); - - save_item(NAME(m_coin_start_cycles)); - save_item(NAME(m_hopper_start_cycles)); - save_item(NAME(m_coin_counter)); -} - - -void segajw_state::machine_reset() -{ - m_coin_start_cycles = 0; - m_hopper_start_cycles = 0; - m_coin_counter = 0xff; -} - -void segajw_state::ramdac_map(address_map &map) -{ - map(0x000, 0x3ff).rw("ramdac", FUNC(ramdac_device::ramdac_pal_r), FUNC(ramdac_device::ramdac_rgb666_w)); -} - -void segajw_state::segajw(machine_config &config) -{ - /* basic machine hardware */ - M68000(config, m_maincpu, 8000000); // unknown clock - m_maincpu->set_addrmap(AS_PROGRAM, &segajw_state::segajw_map); - m_maincpu->set_vblank_int("screen", FUNC(segajw_state::irq4_line_hold)); - - Z80(config, m_audiocpu, 4000000); // unknown clock - m_audiocpu->set_addrmap(AS_PROGRAM, &segajw_state::segajw_audiocpu_map); - m_audiocpu->set_addrmap(AS_IO, &segajw_state::segajw_audiocpu_io_map); - - config.set_maximum_quantum(attotime::from_hz(2000)); - - NVRAM(config, "nvram", nvram_device::DEFAULT_NONE); - - sega_315_5296_device &io1a(SEGA_315_5296(config, "io1a", 0)); // unknown clock - io1a.out_pa_callback().set(FUNC(segajw_state::coin_counter_w)); - io1a.out_pb_callback().set(FUNC(segajw_state::lamps1_w)); - io1a.out_pc_callback().set(FUNC(segajw_state::lamps2_w)); - io1a.out_pd_callback().set(FUNC(segajw_state::hopper_w)); - io1a.in_pf_callback().set(FUNC(segajw_state::coin_counter_r)); - - sega_315_5296_device &io1c(SEGA_315_5296(config, "io1c", 0)); // unknown clock - io1c.in_pa_callback().set_ioport("IN0"); - io1c.in_pb_callback().set_ioport("IN1"); - io1c.in_pc_callback().set_ioport("IN2"); - io1c.in_pd_callback().set_ioport("IN3"); - io1c.out_pg_callback().set(FUNC(segajw_state::coinlockout_w)); - - /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - screen.set_screen_update("hd63484", FUNC(hd63484_device::update_screen)); - screen.set_size(720, 480); - screen.set_visarea(0, 720-1, 0, 448-1); - screen.set_palette("palette"); - - PALETTE(config, "palette").set_entries(16); - ramdac_device &ramdac(RAMDAC(config, "ramdac", 0, "palette")); - ramdac.set_addrmap(0, &segajw_state::ramdac_map); - - hd63484_device &hd63484(HD63484(config, "hd63484", 8000000)); - hd63484.set_addrmap(0, &segajw_state::segajw_hd63484_map); // unknown clock - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - - GENERIC_LATCH_8(config, m_soundlatch); - m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI); - - GENERIC_LATCH_8(config, "soundlatch2"); - - ym3438_device &ymsnd(YM3438(config, "ymsnd", 8000000)); // unknown clock - ymsnd.irq_handler().set_inputline("maincpu", 5); - ymsnd.add_route(ALL_OUTPUTS, "mono", 0.50); -} - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -ROM_START( segajw ) - ROM_REGION( 0x40000, "maincpu", 0 ) - ROM_LOAD16_BYTE( "14584b.epr", 0x00001, 0x20000, CRC(d3a6d63d) SHA1(ce9d4769b7514294a91af1dfd7cd10ee40b3572c) ) - ROM_LOAD16_BYTE( "14585b.epr", 0x00000, 0x20000, CRC(556d0a62) SHA1(d2def433a511cbdebbe2cd0c8e51fc8c4ff1ed7b) ) - - ROM_REGION( 0x20000, "audiocpu", 0 ) - ROM_LOAD( "14587a.epr", 0x00000, 0x20000, CRC(66163b6c) SHA1(88e994bcad86c58dc730a93b48226e9296df7667) ) - - ROM_REGION16_BE( 0x80000, "gfx1", 0 ) - ROM_LOAD16_WORD_SWAP( "14586.epr", 0x00000, 0x80000, CRC(daeb0616) SHA1(17a8bb7137ad46a7c3ac07d22cbc4430e76e2f71) ) -ROM_END - - -GAMEL( 1991, segajw, 0, segajw, segajw, segajw_state, empty_init, ROT0, "Sega", "Joker's Wild (Rev. B)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE, layout_segajw ) |