Playmatic Pinballs : WIP

This commit is contained in:
Robbbert 2016-08-14 00:38:28 +10:00
parent 8d5c5edbc5
commit 15fcefa4d5
7 changed files with 1170 additions and 138 deletions

View File

@ -18,6 +18,8 @@ Status:
#include "machine/genpin.h"
#include "cpu/cosmac/cosmac.h"
#include "machine/clock.h"
#include "sound/speaker.h"
#include "play_1.lh"
class play_1_state : public driver_device
{
@ -25,12 +27,10 @@ public:
play_1_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_dips(*this, "X")
, m_monotone(*this, "monotone")
{ }
DECLARE_DRIVER_INIT(play_1);
DECLARE_READ8_MEMBER(port00_r);
DECLARE_READ8_MEMBER(port01_r);
DECLARE_READ8_MEMBER(port06_r);
DECLARE_READ8_MEMBER(port07_r);
DECLARE_WRITE8_MEMBER(port01_w);
DECLARE_WRITE8_MEMBER(port02_w);
@ -38,7 +38,6 @@ public:
DECLARE_WRITE8_MEMBER(port04_w);
DECLARE_WRITE8_MEMBER(port05_w);
DECLARE_WRITE8_MEMBER(port06_w);
DECLARE_WRITE8_MEMBER(port07_w);
DECLARE_READ_LINE_MEMBER(clear_r);
DECLARE_READ_LINE_MEMBER(ef2_r);
DECLARE_READ_LINE_MEMBER(ef3_r);
@ -47,96 +46,261 @@ public:
private:
UINT16 m_resetcnt;
UINT8 m_segment;
UINT8 m_digit;
UINT8 m_match;
virtual void machine_reset() override;
required_device<cosmac_device> m_maincpu;
required_ioport_array<4> m_dips;
required_device<clock_device> m_monotone;
};
static ADDRESS_MAP_START( play_1_map, AS_PROGRAM, 8, play_1_state )
ADDRESS_MAP_GLOBAL_MASK(0xfff)
AM_RANGE(0x0000, 0x07ff) AM_ROM
AM_RANGE(0x0800, 0x081f) AM_RAM
AM_RANGE(0x0800, 0x081f) AM_RAM AM_SHARE("nvram") // capacitor acting as a 3-month "battery"
AM_RANGE(0x0c00, 0x0c1f) AM_RAM
ADDRESS_MAP_END
static ADDRESS_MAP_START( chance_map, AS_PROGRAM, 8, play_1_state )
ADDRESS_MAP_GLOBAL_MASK(0xfff)
AM_RANGE(0x0000, 0x0bff) AM_ROM
AM_RANGE(0x0c00, 0x0c1f) AM_RAM
AM_RANGE(0x0c00, 0x0c1f) AM_RAM AM_SHARE("nvram") // capacitor acting as a 3-month "battery"
AM_RANGE(0x0e00, 0x0e1f) AM_RAM
ADDRESS_MAP_END
static ADDRESS_MAP_START( play_1_io, AS_IO, 8, play_1_state )
AM_RANGE(0x00, 0x00) AM_READ(port00_r)
AM_RANGE(0x01, 0x01) AM_READWRITE(port01_r,port01_w) //segments
AM_RANGE(0x02, 0x02) AM_WRITE(port02_w) // N1-8
AM_RANGE(0x03, 0x03) AM_WRITE(port03_w) // D1-4
AM_RANGE(0x04, 0x04) AM_WRITE(port04_w) // U1-8
AM_RANGE(0x05, 0x05) AM_WRITE(port05_w) // V1-8
AM_RANGE(0x06, 0x06) AM_READWRITE(port06_r,port06_w) // W1-8, input selector
AM_RANGE(0x07, 0x07) AM_READ(port07_r) // another input selector
AM_RANGE(0x01, 0x01) AM_READ_PORT("IN1") AM_WRITE(port01_w) //segments
AM_RANGE(0x02, 0x02) AM_READ_PORT("IN2") AM_WRITE(port02_w) // N1-8
AM_RANGE(0x03, 0x03) AM_READ_PORT("IN3") AM_WRITE(port03_w) // D1-4
AM_RANGE(0x04, 0x04) AM_READ_PORT("IN4") AM_WRITE(port04_w) // U1-8
AM_RANGE(0x05, 0x05) AM_READ_PORT("IN5") AM_WRITE(port05_w) // V1-8
AM_RANGE(0x06, 0x06) AM_READ_PORT("IN6") AM_WRITE(port06_w) // W1-8
AM_RANGE(0x07, 0x07) AM_READ(port07_r)
ADDRESS_MAP_END
static INPUT_PORTS_START( play_1 )
PORT_START("DSW0")
PORT_DIPNAME(0x01, 0x01, DEF_STR( Coinage ) ) // this is something else, don't know what yet
PORT_DIPSETTING ( 0x00, DEF_STR( 1C_3C ) )
PORT_DIPSETTING ( 0x01, DEF_STR( 1C_1C ) )
PORT_START("X.0")
// PORT_DIPNAME(0x01, 0x01, DEF_STR( Coinage ) ) // this is something else, don't know what yet
// PORT_DIPSETTING ( 0x00, DEF_STR( 1C_3C ) )
// PORT_DIPSETTING ( 0x01, DEF_STR( 1C_1C ) )
PORT_DIPNAME(0x02, 0x00, "Balls")
PORT_DIPSETTING ( 0x00, "3" )
PORT_DIPSETTING ( 0x02, "5" )
PORT_DIPNAME(0x04, 0x00, "Special award")
PORT_DIPSETTING ( 0x00, "Free game" )
PORT_DIPSETTING ( 0x04, "Extra ball" )
// rotary switches for credits per coin
PORT_START("X.1")
PORT_DIPNAME(0xff, 0x20, "Coinage for slot 2" )
PORT_DIPSETTING ( 0x01, DEF_STR( 2C_1C ) )
PORT_DIPSETTING ( 0x02, DEF_STR( 1C_1C ) )
PORT_DIPSETTING ( 0x04, DEF_STR( 2C_3C ) )
PORT_DIPSETTING ( 0x08, DEF_STR( 1C_2C ) )
PORT_DIPSETTING ( 0x10, DEF_STR( 1C_3C ) )
PORT_DIPSETTING ( 0x20, DEF_STR( 1C_4C ) )
PORT_DIPSETTING ( 0x40, DEF_STR( 1C_5C ) )
PORT_DIPSETTING ( 0x80, DEF_STR( 1C_6C ) )
PORT_START("X.2")
PORT_DIPNAME(0xff, 0x20, "Coinage for slot 3" )
PORT_DIPSETTING ( 0x01, DEF_STR( 1C_3C ) )
PORT_DIPSETTING ( 0x02, DEF_STR( 1C_4C ) )
PORT_DIPSETTING ( 0x04, DEF_STR( 1C_5C ) )
PORT_DIPSETTING ( 0x08, DEF_STR( 1C_6C ) )
PORT_DIPSETTING ( 0x10, DEF_STR( 1C_7C ) )
PORT_DIPSETTING ( 0x20, DEF_STR( 1C_8C ) )
PORT_DIPSETTING ( 0x40, DEF_STR( 1C_9C ) )
PORT_DIPSETTING ( 0x80, "1 coin 10 credits" )
PORT_START("IN1") // 11-18
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_1_PAD)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_2_PAD)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_3_PAD)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_4_PAD)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_5_PAD)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_6_PAD)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_7_PAD)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_8_PAD)
PORT_START("IN2") // 21-28
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_9_PAD)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_S)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_D)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_F)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_G)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_H)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_J)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_K)
PORT_START("IN3") // 31-38
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_L)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_Z)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_C)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_V)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_B)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_N)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_M)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_COMMA)
PORT_START("IN4") // 41-48
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_STOP)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_SLASH)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_COLON)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_QUOTE)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_A)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_MINUS)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_EQUALS)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_BACKSPACE)
PORT_START("IN5") // 51-58
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_OPENBRACE)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_CLOSEBRACE)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_BACKSLASH)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_ENTER)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_LEFT)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_RIGHT)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_UP)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_DOWN)
PORT_START("IN6") // 61-68
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Q)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_W)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_E)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_R)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Y)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_U)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_I)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_O)
PORT_START("X.3") // 71-78
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_1)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_2)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_3)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_4)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_5)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_6)
INPUT_PORTS_END
void play_1_state::machine_reset()
{
m_resetcnt = 0;
}
READ8_MEMBER( play_1_state::port00_r )
{
return 0;
}
READ8_MEMBER( play_1_state::port01_r )
{
return 0;
}
READ8_MEMBER( play_1_state::port06_r )
{
return 0xff; // Big Town etc check this at boot
m_segment = 0;
m_digit = 0;
m_match = 0;
}
READ8_MEMBER( play_1_state::port07_r )
{
return 0;
UINT8 data = m_dips[3]->read();
data |= (m_segment & m_dips[1]->read()) ? 0x40 : 0;
data |= (m_segment & m_dips[2]->read()) ? 0x80 : 0;
return data;
}
WRITE8_MEMBER( play_1_state::port01_w )
{
static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0, 0, 0, 0, 0, 0 }; // 4511
// d0-1 via 4013 to match-game board
// d4-7 via 4511 to match-game board
if BIT(data, 0)
output().set_digit_value(40, patterns[1]);
else
output().set_digit_value(40, 0);
if BIT(data, 1)
output().set_digit_value(45, patterns[0]);
else
output().set_digit_value(45, 0);
m_match = patterns[data>>4] & 0x7f;
}
WRITE8_MEMBER( play_1_state::port02_w )
{
// N1-8, segments and other
m_segment = data;
}
WRITE8_MEMBER( play_1_state::port03_w )
{
static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0, 0, 0, 0, 0, 0 }; // 4511
// D1-4, digit select
// according to the schematic, there's nothing to light up the tens and units for players 2,3,4
m_digit = data & 15;
switch (m_digit)
{
case 1:
// a combination of bits could set higher frequencies, but that isn't documented
if BIT(m_segment, 0)
m_monotone->set_unscaled_clock(523);
else
if BIT(m_segment, 1)
m_monotone->set_unscaled_clock(659);
else
if BIT(m_segment, 2)
m_monotone->set_unscaled_clock(784);
else
if BIT(m_segment, 3)
m_monotone->set_unscaled_clock(988);
else
m_monotone->set_unscaled_clock(0);
break;
case 2:
output().set_digit_value(0, patterns[m_segment>>4]);
output().set_digit_value(1, patterns[m_segment&15]);
break;
case 3:
output().set_digit_value(2, patterns[m_segment>>4]);
output().set_digit_value(3, patterns[m_segment&15]);
break;
case 4:
output().set_digit_value(4, patterns[m_segment>>4]);
output().set_digit_value(5, patterns[m_segment&15]);
break;
case 5:
output().set_digit_value(10, patterns[m_segment>>4]);
output().set_digit_value(11, patterns[m_segment&15]);
break;
case 6:
output().set_digit_value(12, patterns[m_segment>>4]);
output().set_digit_value(13, patterns[m_segment&15]);
break;
case 7:
output().set_digit_value(20, patterns[m_segment>>4]);
output().set_digit_value(21, patterns[m_segment&15]);
break;
case 8:
output().set_digit_value(22, patterns[m_segment>>4]);
output().set_digit_value(23, patterns[m_segment&15]);
break;
case 9:
output().set_digit_value(30, patterns[m_segment>>4]);
output().set_digit_value(31, patterns[m_segment&15]);
break;
case 10:
case 11:
output().set_digit_value(32, patterns[m_segment>>4]);
output().set_digit_value(33, patterns[m_segment&15]);
break;
default:
break;
}
}
WRITE8_MEMBER( play_1_state::port04_w )
{
// U1-8
}
WRITE8_MEMBER( play_1_state::port05_w )
{
// V1-8
}
WRITE8_MEMBER( play_1_state::port06_w )
{
// W1-8
}
READ_LINE_MEMBER( play_1_state::clear_r )
@ -149,29 +313,30 @@ READ_LINE_MEMBER( play_1_state::clear_r )
READ_LINE_MEMBER( play_1_state::ef2_r )
{
return BIT(ioport("DSW0")->read(), 0); // 1 or 3 games dip (1=1 game)
return !BIT(m_dips[0]->read(), 0); // 1 or 3 games dip (1=1 game) inverted
}
READ_LINE_MEMBER( play_1_state::ef3_r )
{
return BIT(ioport("DSW0")->read(), 1); // 3 or 5 balls dip (1=5 balls)
return !BIT(m_dips[0]->read(), 1); // 3 or 5 balls dip (1=5 balls) inverted
}
READ_LINE_MEMBER( play_1_state::ef4_r )
{
return BIT(ioport("DSW0")->read(), 2); // extra ball or game dip (1=extra ball)
return !BIT(m_dips[0]->read(), 2); // extra ball or game dip (1=extra ball) inverted
}
WRITE_LINE_MEMBER( play_1_state::clock_w )
{
m_maincpu->int_w(1);
m_maincpu->int_w(0); // INT is a pulse-line
m_maincpu->ef1_w(state);
// also, state and !state go to display panel
}
m_maincpu->int_w(0);
m_maincpu->ef1_w(!state); // inverted
if (state)
output().set_digit_value(41, m_match);
else
output().set_digit_value(44, m_match);
m_maincpu->int_w(1); // INT is a pulse-line - inverted
DRIVER_INIT_MEMBER(play_1_state,play_1)
{
// also, state and !state go to display panel
}
static MACHINE_CONFIG_START( play_1, play_1_state )
@ -185,11 +350,21 @@ static MACHINE_CONFIG_START( play_1, play_1_state )
MCFG_COSMAC_EF3_CALLBACK(READLINE(play_1_state, ef3_r))
MCFG_COSMAC_EF4_CALLBACK(READLINE(play_1_state, ef4_r))
MCFG_NVRAM_ADD_0FILL("nvram")
/* Video */
MCFG_DEFAULT_LAYOUT(layout_play_1)
MCFG_DEVICE_ADD("xpoint", CLOCK, 60) // crossing-point detector
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(play_1_state, clock_w))
/* Sound */
MCFG_FRAGMENT_ADD( genpin_audio )
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
MCFG_DEVICE_ADD("monotone", CLOCK, 0) // sound device
MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("speaker", speaker_sound_device, level_w))
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( chance, play_1 )
@ -245,8 +420,8 @@ ROM_END
/* Big Town, Last Lap and Party all reportedly share the same roms with different playfield/machine artworks */
GAME(1978, bigtown, 0, play_1, play_1, play_1_state, play_1, ROT0, "Playmatic", "Big Town", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1978, chance, 0, chance, play_1, play_1_state, play_1, ROT0, "Playmatic", "Chance", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1978, lastlap, 0, play_1, play_1, play_1_state, play_1, ROT0, "Playmatic", "Last Lap", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1978, spcgambl, 0, play_1, play_1, play_1_state, play_1, ROT0, "Playmatic", "Space Gambler", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1979, party, 0, play_1, play_1, play_1_state, play_1, ROT0, "Playmatic", "Party", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1978, bigtown, 0, play_1, play_1, driver_device, 0, ROT0, "Playmatic", "Big Town", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
GAME(1978, chance, 0, chance, play_1, driver_device, 0, ROT0, "Playmatic", "Chance", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
GAME(1978, lastlap, bigtown, play_1, play_1, driver_device, 0, ROT0, "Playmatic", "Last Lap", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
GAME(1978, spcgambl, 0, play_1, play_1, driver_device, 0, ROT0, "Playmatic", "Space Gambler", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
GAME(1979, party, bigtown, play_1, play_1, driver_device, 0, ROT0, "Playmatic", "Party", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)

View File

@ -6,11 +6,11 @@ PINBALL
Playmatic MPU 2
Status:
- Main board is emulated and working (currently runs the initial test mode)
- Displays to add
- Switches, lamps, solenoids to add
- Sound board to emulate
- Lamps, Solenoids to add
- AY chips output port adds various components across the analog outputs (including muting)
- Mechanical sounds to add
- Sound board to add
- Most games work
***********************************************************************************/
@ -19,6 +19,8 @@ Status:
#include "cpu/cosmac/cosmac.h"
#include "machine/clock.h"
#include "machine/7474.h"
#include "sound/ay8910.h"
#include "play_2.lh"
class play_2_state : public driver_device
{
@ -26,11 +28,12 @@ public:
play_2_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_4013a(*this, "4013a")
, m_4013b(*this, "4013b")
, m_keyboard(*this, "X")
{ }
DECLARE_DRIVER_INIT(play_2);
DECLARE_WRITE8_MEMBER(port01_w);
DECLARE_WRITE8_MEMBER(port02_w);
DECLARE_WRITE8_MEMBER(port03_w);
@ -44,14 +47,26 @@ public:
DECLARE_WRITE_LINE_MEMBER(q4013a_w);
DECLARE_WRITE_LINE_MEMBER(clock_w);
DECLARE_WRITE_LINE_MEMBER(clock2_w);
DECLARE_WRITE8_MEMBER(port01_a_w);
DECLARE_READ8_MEMBER(port02_a_r);
DECLARE_READ_LINE_MEMBER(clear_a_r);
private:
UINT16 m_clockcnt;
UINT16 m_resetcnt;
UINT16 m_resetcnt_a;
UINT8 m_soundlatch;
UINT8 m_a_irqset;
UINT16 m_a_irqcnt;
UINT8 m_kbdrow;
UINT8 m_segment[5];
bool m_disp_sw;
virtual void machine_reset() override;
required_device<cosmac_device> m_maincpu;
required_device<cosmac_device> m_audiocpu;
required_device<ttl7474_device> m_4013a;
required_device<ttl7474_device> m_4013b;
required_ioport_array<8> m_keyboard;
};
@ -70,41 +85,156 @@ static ADDRESS_MAP_START( play_2_io, AS_IO, 8, play_2_state )
AM_RANGE(0x07, 0x07) AM_WRITE(port07_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( play_2_audio_map, AS_PROGRAM, 8, play_2_state )
AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x4000, 0x4001) AM_MIRROR(0x1ffe) AM_DEVREADWRITE("aysnd1", ay8910_device, data_r, address_data_w)
AM_RANGE(0x6000, 0x6001) AM_MIRROR(0x1ffe) AM_DEVREADWRITE("aysnd2", ay8910_device, data_r, address_data_w)
AM_RANGE(0x8000, 0x80ff) AM_RAM
ADDRESS_MAP_END
static ADDRESS_MAP_START( play_2_audio_io, AS_IO, 8, play_2_state )
AM_RANGE(0x01, 0x01) AM_WRITE(port01_a_w) // irq counter
AM_RANGE(0x02, 0x02) AM_READ(port02_a_r) // sound code
ADDRESS_MAP_END
static INPUT_PORTS_START( play_2 )
PORT_START("X.0") // 11-18
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_1_PAD)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_2_PAD)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_3_PAD)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_4_PAD)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_5_PAD)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_6_PAD)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_7_PAD)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_8_PAD)
PORT_START("X.1") // 21-28
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_9_PAD)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_S)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_D)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_F)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_G)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_H)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_J)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_K)
PORT_START("X.2") // 31-38
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_L)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_Z)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_C)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_V)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_B)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_N)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_M)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_COMMA)
PORT_START("X.3") // 41-48
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_STOP)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_SLASH)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_COLON)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_QUOTE)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_A)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_MINUS)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_EQUALS)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_BACKSPACE)
PORT_START("X.4") // 51-58
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_OPENBRACE)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_CLOSEBRACE)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_BACKSLASH)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_ENTER)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_LEFT)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_RIGHT)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_UP)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_DOWN)
PORT_START("X.5") // 61-68
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_Q)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_W)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_E)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_R)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_Y)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_U)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_I)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_O)
PORT_START("X.6")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_X) // outhole
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_8) // zone select (door switch)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_TILT )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_9) // reset button on the ios board
PORT_START("X.7")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE ) // reset button on main cpu EF4
INPUT_PORTS_END
void play_2_state::machine_reset()
{
m_clockcnt = 0;
m_resetcnt = 0;
m_resetcnt_a = 0;
m_4013b->d_w(1);
m_a_irqset = 54; // default value of the CDP1863
m_a_irqcnt = (m_a_irqset << 3) | 7;
m_soundlatch = 0;
m_kbdrow = 0;
m_disp_sw = 0;
for (UINT8 i = 0; i < 5; i++)
m_segment[i] = 0;
}
WRITE8_MEMBER( play_2_state::port01_w )
{
}
WRITE8_MEMBER( play_2_state::port02_w )
{
}
WRITE8_MEMBER( play_2_state::port03_w )
{
}
READ8_MEMBER( play_2_state::port04_r )
{
return 0xff;
}
READ8_MEMBER( play_2_state::port05_r )
{
return 0xff;
m_kbdrow = data;
if (m_kbdrow && m_disp_sw)
{
m_disp_sw = 0;
for (UINT8 j = 0; j < 6; j++)
if BIT(m_kbdrow, j)
for (UINT8 i = 0; i < 5; i++)
output().set_digit_value(j*10 + i, m_segment[i]);
}
}
WRITE8_MEMBER( play_2_state::port06_w )
{
//m_soundlatch = data;
}
WRITE8_MEMBER( play_2_state::port03_w )
{
if BIT(data, 6)
m_audiocpu->ef1_w(1); // inverted
}
READ8_MEMBER( play_2_state::port04_r )
{
if (m_kbdrow & 0x3f)
for (UINT8 i = 0; i < 6; i++)
if BIT(m_kbdrow, i)
return m_keyboard[i]->read();
return 0;
}
READ8_MEMBER( play_2_state::port05_r )
{
return m_keyboard[6]->read();
}
WRITE8_MEMBER( play_2_state::port02_w )
{
m_segment[4] = m_segment[3];
m_segment[3] = m_segment[2];
m_segment[2] = m_segment[1];
m_segment[1] = m_segment[0];
m_segment[0] = data;
m_disp_sw = 1;
}
WRITE8_MEMBER( play_2_state::port07_w )
@ -113,6 +243,18 @@ WRITE8_MEMBER( play_2_state::port07_w )
m_4013b->clear_w(1);
}
WRITE8_MEMBER( play_2_state::port01_a_w )
{
m_a_irqset = data;
m_a_irqcnt = (m_a_irqset << 3) | 7;
}
READ8_MEMBER( play_2_state::port02_a_r )
{
m_audiocpu->ef1_w(0); // inverted
return m_soundlatch;
}
READ_LINE_MEMBER( play_2_state::clear_r )
{
// A hack to make the machine reset itself on boot
@ -121,18 +263,22 @@ READ_LINE_MEMBER( play_2_state::clear_r )
return (m_resetcnt == 0xff00) ? 0 : 1;
}
READ_LINE_MEMBER( play_2_state::clear_a_r )
{
// A hack to make the machine reset itself on boot
if (m_resetcnt_a < 0xffff)
m_resetcnt_a++;
return (m_resetcnt_a == 0xff00) ? 0 : 1;
}
READ_LINE_MEMBER( play_2_state::ef1_r )
{
return BIT(m_clockcnt, 10);
return (!BIT(m_clockcnt, 10)); // inverted
}
READ_LINE_MEMBER( play_2_state::ef4_r )
{
return 1; // test button
}
DRIVER_INIT_MEMBER( play_2_state, play_2 )
{
return BIT(m_keyboard[7]->read(), 0); // inverted test button - doesn't seem to do anything
}
WRITE_LINE_MEMBER( play_2_state::clock_w )
@ -145,13 +291,24 @@ WRITE_LINE_MEMBER( play_2_state::clock_w )
// simulate 4020 chip
if ((m_clockcnt & 0x3ff) == 0)
m_4013b->preset_w(BIT(m_clockcnt, 10)); // Q10 output
// sound irq
m_a_irqcnt--;
if (m_a_irqcnt == 1)
m_audiocpu->int_w(1); // inverted
else
if (m_a_irqcnt == 0)
{
m_a_irqcnt = (m_a_irqset << 3) | 7;
m_audiocpu->int_w(0); // inverted
}
}
}
WRITE_LINE_MEMBER( play_2_state::clock2_w )
{
m_4013b->clock_w(state);
m_maincpu->ef3_w(!state);
m_maincpu->ef3_w(state); // inverted
}
WRITE_LINE_MEMBER( play_2_state::q4013a_w )
@ -172,6 +329,9 @@ static MACHINE_CONFIG_START( play_2, play_2_state )
MCFG_NVRAM_ADD_0FILL("nvram")
/* Video */
MCFG_DEFAULT_LAYOUT(layout_play_2)
MCFG_DEVICE_ADD("tpb_clock", CLOCK, 2950000 / 8) // TPB line from CPU
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(play_2_state, clock_w))
@ -189,6 +349,18 @@ static MACHINE_CONFIG_START( play_2, play_2_state )
/* Sound */
MCFG_FRAGMENT_ADD( genpin_audio )
MCFG_CPU_ADD("audiocpu", CDP1802, XTAL_3_579545MHz)
MCFG_CPU_PROGRAM_MAP(play_2_audio_map)
MCFG_CPU_IO_MAP(play_2_audio_io)
MCFG_COSMAC_WAIT_CALLBACK(VCC)
MCFG_COSMAC_CLEAR_CALLBACK(READLINE(play_2_state, clear_a_r))
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
MCFG_SOUND_ADD("aysnd1", AY8910, XTAL_3_579545MHz / 2)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.00)
MCFG_SOUND_ADD("aysnd2", AY8910, XTAL_3_579545MHz / 2)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.00)
MACHINE_CONFIG_END
/*-------------------------------------------------------------------
@ -200,6 +372,8 @@ ROM_START(antar)
ROM_LOAD("antar09.bin", 0x0400, 0x0400, CRC(2c954f1a) SHA1(fa83a5f1c269ea28d4eeff181f493cbb4dc9bc47))
ROM_LOAD("antar10.bin", 0x0800, 0x0400, CRC(a6ce5667) SHA1(85ecd4fce94dc419e4c210262f867310b0889cd3))
ROM_LOAD("antar11.bin", 0x0c00, 0x0400, CRC(6474b17f) SHA1(e4325ceff820393b06eb2e8e4a85412b0d01a385))
ROM_REGION(0x10000, "audiocpu", ROMREGION_ERASEFF)
ROM_END
ROM_START(antar2)
@ -208,6 +382,8 @@ ROM_START(antar2)
ROM_LOAD("antar09.bin", 0x0400, 0x0400, CRC(2c954f1a) SHA1(fa83a5f1c269ea28d4eeff181f493cbb4dc9bc47))
ROM_LOAD("antar10a.bin", 0x0800, 0x0400, CRC(520eb401) SHA1(1d5e3f829a7e7f38c7c519c488e6b7e1a4d34321))
ROM_LOAD("antar11a.bin", 0x0c00, 0x0400, CRC(17ad38bf) SHA1(e2c9472ed8fbe9d5965a5c79515a1b7ea9edaa79))
ROM_REGION(0x10000, "audiocpu", ROMREGION_ERASEFF)
ROM_END
@ -220,6 +396,8 @@ ROM_START(evlfight)
ROM_LOAD("evfg09.bin", 0x0400, 0x0400, CRC(5232dc4c) SHA1(6f95a578e9f09688e6ce8b0a622bcee887936c82))
ROM_LOAD("evfg10.bin", 0x0800, 0x0400, CRC(de2f754d) SHA1(0287a9975095bcbf03ddb2b374ff25c080c8020f))
ROM_LOAD("evfg11.bin", 0x0c00, 0x0400, CRC(5eb8ac02) SHA1(31c80e74a4272becf7014aa96eaf7de555e26cd6))
ROM_REGION(0x10000, "audiocpu", ROMREGION_ERASEFF)
ROM_END
/*-------------------------------------------------------------------
@ -246,6 +424,8 @@ ROM_START(attack)
ROM_LOAD("attack9.bin", 0x0400, 0x0400, CRC(bbd086b4) SHA1(6fc94b94beea482d8c8f5b3c69d3f218e2b2dfc4))
ROM_LOAD("attack10.bin", 0x0800, 0x0400, CRC(764925e4) SHA1(2f207ef87786d27d0d856c5816a570a59d89b718))
ROM_LOAD("attack11.bin", 0x0c00, 0x0400, CRC(972157b4) SHA1(23c90f23a34b34acfe445496a133b6022a749ccc))
ROM_REGION(0x10000, "audiocpu", ROMREGION_ERASEFF)
ROM_END
/*-------------------------------------------------------------------
@ -257,6 +437,8 @@ ROM_START(blkfever)
ROM_LOAD("blackf9.bin", 0x0400, 0x0400, CRC(ecb72fdc) SHA1(d3598031b7170fab39727b3402b7053d4f9e1ca7))
ROM_LOAD("blackf10.bin", 0x0800, 0x0400, CRC(b3fae788) SHA1(e14e09cc7da1098abf2f60f26a8ec507e123ff7c))
ROM_LOAD("blackf11.bin", 0x0c00, 0x0400, CRC(5a97c1b4) SHA1(b9d7eb0dd55ef6d959c0fab48f710e4b1c8d8003))
ROM_REGION(0x10000, "audiocpu", ROMREGION_ERASEFF)
ROM_END
/*-------------------------------------------------------------------
@ -267,7 +449,7 @@ ROM_START(zira)
ROM_LOAD("zira_u8.bin", 0x0000, 0x0800, CRC(53f8bf17) SHA1(5eb74f27bc65374a85dd44bbc8f6142488c226a2))
ROM_LOAD("zira_u9.bin", 0x0800, 0x0800, CRC(d50a2419) SHA1(81b157f579a433389506817b1b6e02afaa2cf0d5))
ROM_REGION(0x10000, "audiocpu", 0)
ROM_REGION(0x10000, "audiocpu", ROMREGION_ERASEFF)
ROM_LOAD("zira.snd", 0x0000, 0x0400, NO_DUMP)
ROM_END
@ -284,19 +466,12 @@ ROM_START(cerberup)
ROM_LOAD("cerb.snd", 0x0000, 0x2000, CRC(8af53a23) SHA1(a80b57576a1eb1b4544b718b9abba100531e3942))
ROM_END
// ??/84 Nautilus
// ??/84 The Raid
// ??/85 Stop Ship
// ??/86 Flash Dragon
// ??/87 Phantom Ship
// ??/87 Skill Flight
GAME(1979, antar, 0, play_2, play_2, play_2_state, play_2, ROT0, "Playmatic", "Antar (set 1)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1979, antar2, antar, play_2, play_2, play_2_state, play_2, ROT0, "Playmatic", "Antar (set 2)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1980, evlfight, 0, play_2, play_2, play_2_state, play_2, ROT0, "Playmatic", "Evil Fight", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1980, attack, 0, play_2, play_2, play_2_state, play_2, ROT0, "Playmatic", "Attack", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1980, blkfever, 0, play_2, play_2, play_2_state, play_2, ROT0, "Playmatic", "Black Fever", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1982, cerberup, 0, play_2, play_2, play_2_state, play_2, ROT0, "Playmatic", "Cerberus (Pinball)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1985, madrace, 0, play_2, play_2, play_2_state, play_2, ROT0, "Playmatic", "Mad Race", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1980, zira, 0, play_2, play_2, play_2_state, play_2, ROT0, "Playmatic", "Zira", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1979, antar, 0, play_2, play_2, driver_device, 0, ROT0, "Playmatic", "Antar (set 1)", MACHINE_MECHANICAL | MACHINE_NO_SOUND)
GAME(1979, antar2, antar, play_2, play_2, driver_device, 0, ROT0, "Playmatic", "Antar (set 2)", MACHINE_MECHANICAL | MACHINE_NO_SOUND)
GAME(1980, evlfight, 0, play_2, play_2, driver_device, 0, ROT0, "Playmatic", "Evil Fight", MACHINE_MECHANICAL | MACHINE_NO_SOUND)
GAME(1980, attack, 0, play_2, play_2, driver_device, 0, ROT0, "Playmatic", "Attack", MACHINE_MECHANICAL | MACHINE_NO_SOUND)
GAME(1980, blkfever, 0, play_2, play_2, driver_device, 0, ROT0, "Playmatic", "Black Fever", MACHINE_MECHANICAL | MACHINE_NO_SOUND)
GAME(1982, cerberup, 0, play_2, play_2, driver_device, 0, ROT0, "Playmatic", "Cerberus (Pinball)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
GAME(1985, madrace, 0, play_2, play_2, driver_device, 0, ROT0, "Playmatic", "Mad Race", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
GAME(1980, zira, 0, play_2, play_2, driver_device, 0, ROT0, "Playmatic", "Zira", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)

View File

@ -13,7 +13,7 @@ Status:
- Mechanical sounds to add
***********************************************************************************/
#if 0
#include "machine/genpin.h"
#include "cpu/cosmac/cosmac.h"
@ -217,3 +217,4 @@ ROM_END
GAME(1983, megaaton, 0, play_3, play_3, play_3_state, play_3, ROT0, "Playmatic", "Meg-Aaton", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1983, megaatona, megaaton, play_3, play_3, play_3_state, play_3, ROT0, "Playmatic", "Meg-Aaton (alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
#endif

View File

@ -1,28 +1,53 @@
// license:BSD-3-Clause
// copyright-holders:Miodrag Milanovic, Robbbert
/**********************************************************************************
/*********************************************************************************************
PINBALL
Playmatic MPU 5
Playmatic MPU 3,4,5
Status:
- Main board is emulated and working (currently runs the initial test mode)
- Displays to add
- Switches, lamps, solenoids to add
- Sound board to emulate
- Lamps, Solenoids to add
- AY chips output port adds various components across the analog outputs (including muting)
- Mechanical sounds to add
- Most games work
-- Spain82: not working
-- Nautilus: sound is broken (runs into the weeds)
-- Skill Flight: not working, no sound roms
-- Flash Dragon: no sound roms
-- Meg Aaton: not working (No Ball)
(note to self: MPU3 and MPU5 appear at first glance to be identical apart from
cpu clock. MPU2 also appears to be identical to MPU3 apart from the RAM address.
If the sound cards are sufficiently similar, we should be able to merge all 3.)
Note: The input lines INT, EF1-4 are inverted (not true voltage).
***********************************************************************************/
First time:
- The default settings are fine, so start with a clean slate
- Wait for it to say No Ball, then hold down X.
- Keep holding X, insert credits, and press start. When it says ball 1, let go immediately.
- If you hold down X longer than you should, it says Coil Error, and the game is ended. You
should let go the instant the ball number increments.
- Any games marked working actually do work, but like most pinballs they are a pain to play
with the keyboard.
Setting up:
The manual is not that clear, there's a lot we don't know, this *seems* to work...
- Start machine, wait for it to say No Ball, and it plays a tune
- Press 8 (to simulate opening the front door)
- Press 1, it says BooP (Bookkeeping)
- Press 8 and the credits number increments to 8, then 01 and on to 17 (2 pushes per number)
- When it gets to 01, the display says Adjust
- To adjust a setting, press 1 to choose a digit, then tap 9 until it is correct.
- The settings in the manual do not fully line up with what we see in the display.
***********************************************************************************************/
#include "machine/genpin.h"
#include "cpu/cosmac/cosmac.h"
#include "machine/clock.h"
#include "machine/7474.h"
#include "sound/ay8910.h"
#include "play_5.lh"
class play_5_state : public driver_device
{
@ -30,11 +55,12 @@ public:
play_5_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_4013a(*this, "4013a")
, m_4013b(*this, "4013b")
, m_keyboard(*this, "X")
{ }
DECLARE_DRIVER_INIT(play_5);
DECLARE_WRITE8_MEMBER(port01_w);
DECLARE_WRITE8_MEMBER(port02_w);
DECLARE_WRITE8_MEMBER(port03_w);
@ -48,14 +74,26 @@ public:
DECLARE_WRITE_LINE_MEMBER(q4013a_w);
DECLARE_WRITE_LINE_MEMBER(clock_w);
DECLARE_WRITE_LINE_MEMBER(clock2_w);
DECLARE_WRITE8_MEMBER(port01_a_w);
DECLARE_READ8_MEMBER(port02_a_r);
DECLARE_READ_LINE_MEMBER(clear_a_r);
private:
UINT16 m_clockcnt;
UINT16 m_resetcnt;
UINT16 m_resetcnt_a;
UINT8 m_soundlatch;
UINT8 m_a_irqset;
UINT16 m_a_irqcnt;
UINT8 m_kbdrow;
UINT8 m_segment[5];
bool m_disp_sw;
virtual void machine_reset() override;
required_device<cosmac_device> m_maincpu;
required_device<cosmac_device> m_audiocpu;
required_device<ttl7474_device> m_4013a;
required_device<ttl7474_device> m_4013b;
required_ioport_array<10> m_keyboard;
};
@ -65,50 +103,181 @@ static ADDRESS_MAP_START( play_5_map, AS_PROGRAM, 8, play_5_state )
ADDRESS_MAP_END
static ADDRESS_MAP_START( play_5_io, AS_IO, 8, play_5_state )
AM_RANGE(0x01, 0x01) AM_WRITE(port01_w) // digits
AM_RANGE(0x02, 0x02) AM_WRITE(port02_w)
AM_RANGE(0x03, 0x03) AM_WRITE(port03_w)
AM_RANGE(0x04, 0x04) AM_READ(port04_r)
AM_RANGE(0x05, 0x05) AM_READ(port05_r)
AM_RANGE(0x01, 0x01) AM_WRITE(port01_w) // digits, scan-lines
AM_RANGE(0x02, 0x02) AM_WRITE(port02_w) // sound code
AM_RANGE(0x03, 0x03) AM_WRITE(port03_w) //
AM_RANGE(0x04, 0x04) AM_READ(port04_r) // switches
AM_RANGE(0x05, 0x05) AM_READ(port05_r) // more switches
AM_RANGE(0x06, 0x06) AM_WRITE(port06_w) // segments
AM_RANGE(0x07, 0x07) AM_WRITE(port07_w)
AM_RANGE(0x07, 0x07) AM_WRITE(port07_w) // flipflop clear
ADDRESS_MAP_END
static ADDRESS_MAP_START( play_5_audio_map, AS_PROGRAM, 8, play_5_state )
AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x4000, 0x4001) AM_MIRROR(0x1ffe) AM_DEVREADWRITE("aysnd1", ay8910_device, data_r, address_data_w)
AM_RANGE(0x6000, 0x6001) AM_MIRROR(0x1ffe) AM_DEVREADWRITE("aysnd2", ay8910_device, data_r, address_data_w)
AM_RANGE(0x8000, 0x80ff) AM_RAM
ADDRESS_MAP_END
static ADDRESS_MAP_START( play_5_audio_io, AS_IO, 8, play_5_state )
AM_RANGE(0x01, 0x01) AM_WRITE(port01_a_w) // irq counter
AM_RANGE(0x02, 0x02) AM_READ(port02_a_r) // sound code
ADDRESS_MAP_END
static INPUT_PORTS_START( play_5 )
PORT_START("X.0") // 11-18
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_1_PAD)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_2_PAD)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_3_PAD)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_4_PAD)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_5_PAD)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_6_PAD)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_7_PAD)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_8_PAD)
PORT_START("X.1") // 21-28
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_9_PAD)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_S)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_D)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_F)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_G)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_H)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_J)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_K)
PORT_START("X.2") // 31-38
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_L)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_Z)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_C)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_V)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_B)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_N)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_M)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_COMMA)
PORT_START("X.3") // 41-48
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_STOP)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_SLASH)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_COLON)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_QUOTE)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_A)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_MINUS)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_EQUALS)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_BACKSPACE)
PORT_START("X.4") // 51-58
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_OPENBRACE)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_CLOSEBRACE)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_BACKSLASH)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_ENTER)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_LEFT)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_RIGHT)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_UP)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_DOWN)
PORT_START("X.5") // 61-68
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_Q)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_W)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_E)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_R)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_Y)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_U)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_I)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_O)
PORT_START("X.6")
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_8) PORT_TOGGLE // zone select (door switch)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_X) // outhole
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_START )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_9) PORT_TOGGLE // test button
PORT_START("X.7")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_TILT )
PORT_BIT( 0xE0, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("X.8")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("X.9")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE )
INPUT_PORTS_END
void play_5_state::machine_reset()
{
m_clockcnt = 0;
m_resetcnt = 0;
m_resetcnt_a = 0;
m_4013b->d_w(1);
m_a_irqset = 54; // default value of the CDP1863
m_a_irqcnt = (m_a_irqset << 3) | 7;
m_soundlatch = 0;
m_kbdrow = 0;
m_disp_sw = 0;
for (UINT8 i = 0; i < 5; i++)
m_segment[i] = 0;
}
WRITE8_MEMBER( play_5_state::port01_w )
{
m_kbdrow = data;
if (m_kbdrow && m_disp_sw)
{
m_disp_sw = 0;
for (UINT8 j = 0; j < 6; j++)
if BIT(m_kbdrow, j)
for (UINT8 i = 0; i < 5; i++)
{
output().set_digit_value(j*10 + i, m_segment[i] & 0x7f);
// decimal dot on tens controls if last 0 shows or not
if ((j == 5) && BIT(m_segment[i], 7))
output().set_digit_value(60 + i, 0x3f);
}
}
}
WRITE8_MEMBER( play_5_state::port02_w )
{
m_soundlatch = data;
}
WRITE8_MEMBER( play_5_state::port03_w )
{
if BIT(data, 6)
m_audiocpu->ef1_w(1); // inverted
}
READ8_MEMBER( play_5_state::port04_r )
{
return 0xff;
if (m_kbdrow & 0x3f)
for (UINT8 i = 0; i < 6; i++)
if BIT(m_kbdrow, i)
return m_keyboard[i]->read();
return 0;
}
READ8_MEMBER( play_5_state::port05_r )
{
return 0xff;
UINT8 data = 0, key8 = m_keyboard[8]->read() & 0x0f;
if BIT(m_kbdrow, 0)
data |= m_keyboard[6]->read();
if BIT(m_kbdrow, 1)
data |= m_keyboard[7]->read();
return (data & 0xf0) | key8;
}
WRITE8_MEMBER( play_5_state::port06_w )
{
m_segment[4] = m_segment[3];
m_segment[3] = m_segment[2];
m_segment[2] = m_segment[1];
m_segment[1] = m_segment[0];
m_segment[0] = data;
m_disp_sw = 1;
}
WRITE8_MEMBER( play_5_state::port07_w )
@ -117,6 +286,18 @@ WRITE8_MEMBER( play_5_state::port07_w )
m_4013b->clear_w(1);
}
WRITE8_MEMBER( play_5_state::port01_a_w )
{
m_a_irqset = data;
m_a_irqcnt = (m_a_irqset << 3) | 7;
}
READ8_MEMBER( play_5_state::port02_a_r )
{
m_audiocpu->ef1_w(0); // inverted
return m_soundlatch;
}
READ_LINE_MEMBER( play_5_state::clear_r )
{
// A hack to make the machine reset itself on boot
@ -125,18 +306,22 @@ READ_LINE_MEMBER( play_5_state::clear_r )
return (m_resetcnt == 0xff00) ? 0 : 1;
}
READ_LINE_MEMBER( play_5_state::clear_a_r )
{
// A hack to make the machine reset itself on boot
if (m_resetcnt_a < 0xffff)
m_resetcnt_a++;
return (m_resetcnt_a == 0xff00) ? 0 : 1;
}
READ_LINE_MEMBER( play_5_state::ef1_r )
{
return BIT(m_clockcnt, 10);
return (!BIT(m_clockcnt, 10)); // inverted
}
READ_LINE_MEMBER( play_5_state::ef4_r )
{
return 1; // reset button
}
DRIVER_INIT_MEMBER( play_5_state, play_5 )
{
return BIT(m_keyboard[9]->read(), 0); // inverted test button - doesn't seem to do anything
}
WRITE_LINE_MEMBER( play_5_state::clock_w )
@ -149,13 +334,24 @@ WRITE_LINE_MEMBER( play_5_state::clock_w )
// simulate 4020 chip
if ((m_clockcnt & 0x3ff) == 0)
m_4013b->preset_w(BIT(m_clockcnt, 10)); // Q10 output
// sound irq
m_a_irqcnt--;
if (m_a_irqcnt == 1)
m_audiocpu->int_w(1); // inverted
else
if (m_a_irqcnt == 0)
{
m_a_irqcnt = (m_a_irqset << 3) | 7;
m_audiocpu->int_w(0); // inverted
}
}
}
WRITE_LINE_MEMBER( play_5_state::clock2_w )
{
m_4013b->clock_w(state);
m_maincpu->ef3_w(!state);
m_maincpu->ef3_w(state); // inverted
}
WRITE_LINE_MEMBER( play_5_state::q4013a_w )
@ -176,6 +372,10 @@ static MACHINE_CONFIG_START( play_5, play_5_state )
MCFG_NVRAM_ADD_0FILL("nvram")
/* Video */
MCFG_DEFAULT_LAYOUT(layout_play_5)
// Devices
MCFG_DEVICE_ADD("tpb_clock", CLOCK, XTAL_3_579545MHz / 8) // TPB line from CPU
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(play_5_state, clock_w))
@ -184,17 +384,30 @@ static MACHINE_CONFIG_START( play_5, play_5_state )
// This is actually a 4013 chip (has 2 RS flipflops)
MCFG_DEVICE_ADD("4013a", TTL7474, 0)
MCFG_7474_COMP_OUTPUT_CB(DEVWRITELINE("4013a", ttl7474_device, d_w))
MCFG_7474_OUTPUT_CB(WRITELINE(play_5_state, q4013a_w))
MCFG_7474_COMP_OUTPUT_CB(DEVWRITELINE("4013a", ttl7474_device, d_w))
MCFG_DEVICE_ADD("4013b", TTL7474, 0)
MCFG_7474_OUTPUT_CB(DEVWRITELINE("maincpu", cosmac_device, ef2_w))
MCFG_7474_COMP_OUTPUT_CB(DEVWRITELINE("maincpu", cosmac_device, int_w)) MCFG_DEVCB_INVERT // int is reversed in mame
MCFG_7474_OUTPUT_CB(DEVWRITELINE("maincpu", cosmac_device, ef2_w)) MCFG_DEVCB_INVERT // inverted
MCFG_7474_COMP_OUTPUT_CB(DEVWRITELINE("maincpu", cosmac_device, int_w)) MCFG_DEVCB_INVERT // inverted
/* Sound */
MCFG_FRAGMENT_ADD( genpin_audio )
MCFG_CPU_ADD("audiocpu", CDP1802, XTAL_3_579545MHz)
MCFG_CPU_PROGRAM_MAP(play_5_audio_map)
MCFG_CPU_IO_MAP(play_5_audio_io)
MCFG_COSMAC_WAIT_CALLBACK(VCC)
MCFG_COSMAC_CLEAR_CALLBACK(READLINE(play_5_state, clear_a_r))
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
MCFG_SOUND_ADD("aysnd1", AY8910, XTAL_3_579545MHz / 2)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.00)
MCFG_SOUND_ADD("aysnd2", AY8910, XTAL_3_579545MHz / 2)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.00)
MACHINE_CONFIG_END
/*-------------------------------------------------------------------
/ KZ-26 (1984)
/-------------------------------------------------------------------*/
@ -331,14 +544,38 @@ ROM_START(trailer)
ROM_LOAD("trsndu4.rom", 0x2000, 0x0800, CRC(bda2a735) SHA1(134b5abb813ed8bf2eeac0861b4c88c7176582d8))
ROM_END
GAME(1982, spain82, 0, play_5, play_5, play_5_state, play_5, ROT0, "Playmatic", "Spain '82", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1984, nautilus, 0, play_5, play_5, play_5_state, play_5, ROT0, "Playmatic", "Nautilus", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1984, theraid, 0, play_5, play_5, play_5_state, play_5, ROT0, "Playmatic", "The Raid", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1984, ufo_x, 0, play_5, play_5, play_5_state, play_5, ROT0, "Playmatic", "UFO-X", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1984, kz26, 0, play_5, play_5, play_5_state, play_5, ROT0, "Playmatic", "KZ-26", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1985, rock2500, 0, play_5, play_5, play_5_state, play_5, ROT0, "Playmatic", "Rock 2500", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1985, starfirp, 0, play_5, play_5, play_5_state, play_5, ROT0, "Playmatic", "Star Fire", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1985, starfirpa, starfirp, play_5, play_5, play_5_state, play_5, ROT0, "Playmatic", "Star Fire (alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1985, trailer, 0, play_5, play_5, play_5_state, play_5, ROT0, "Playmatic", "Trailer", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1986, fldragon, 0, play_5, play_5, play_5_state, play_5, ROT0, "Playmatic", "Flash Dragon", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1987, sklflite, 0, play_5, play_5, play_5_state, play_5, ROT0, "Playmatic", "Skill Flight (Playmatic)", MACHINE_IS_SKELETON_MECHANICAL)
/*-------------------------------------------------------------------
/ Meg Aaton
/-------------------------------------------------------------------*/
ROM_START(megaaton)
ROM_REGION(0x10000, "maincpu", 0)
ROM_LOAD("cpumegat.bin", 0x0000, 0x2000, CRC(7e7a4ede) SHA1(3194b367cbbf6e0cb2629cd5d82ddee6fe36985a))
ROM_REGION(0x10000, "audiocpu", 0)
ROM_LOAD("smogot.bin", 0x0000, 0x2000, CRC(fefc3ab2) SHA1(e748d9b443a69fcdd587f22c87d41818b6c0e436))
ROM_LOAD("smegat.bin", 0x2000, 0x1000, CRC(910ab7fe) SHA1(0ddfd15c9c25f43b8fcfc4e11bc8ea180f6bd761))
ROM_END
ROM_START(megaatona)
ROM_REGION(0x10000, "maincpu", 0)
ROM_LOAD("mega_u12.bin", 0x0000, 0x1000, CRC(65761b02) SHA1(dd9586eaf70698ef7a80ce1be293322f64829aea))
ROM_LOAD("mega_u11.bin", 0x1000, 0x1000, CRC(513f3683) SHA1(0f080a33426df1ffdb14e9b2e6382304e201e335))
ROM_REGION(0x10000, "audiocpu", 0)
ROM_LOAD("smogot.bin", 0x0000, 0x2000, CRC(fefc3ab2) SHA1(e748d9b443a69fcdd587f22c87d41818b6c0e436))
ROM_LOAD("smegat.bin", 0x2000, 0x1000, CRC(910ab7fe) SHA1(0ddfd15c9c25f43b8fcfc4e11bc8ea180f6bd761))
ROM_END
GAME(1982, spain82, 0, play_5, play_5, driver_device, 0, ROT0, "Playmatic", "Spain '82", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
GAME(1983, megaaton, 0, play_5, play_5, driver_device, 0, ROT0, "Playmatic", "Meg-Aaton", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
GAME(1983, megaatona, megaaton, play_5, play_5, driver_device, 0, ROT0, "Playmatic", "Meg-Aaton (alternate set)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
GAME(1984, nautilus, 0, play_5, play_5, driver_device, 0, ROT0, "Playmatic", "Nautilus", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
GAME(1984, theraid, 0, play_5, play_5, driver_device, 0, ROT0, "Playmatic", "The Raid", MACHINE_MECHANICAL | MACHINE_IMPERFECT_SOUND)
GAME(1984, ufo_x, 0, play_5, play_5, driver_device, 0, ROT0, "Playmatic", "UFO-X", MACHINE_MECHANICAL | MACHINE_IMPERFECT_SOUND)
GAME(1984, kz26, 0, play_5, play_5, driver_device, 0, ROT0, "Playmatic", "KZ-26", MACHINE_MECHANICAL | MACHINE_IMPERFECT_SOUND)
GAME(1985, rock2500, 0, play_5, play_5, driver_device, 0, ROT0, "Playmatic", "Rock 2500", MACHINE_MECHANICAL | MACHINE_IMPERFECT_SOUND)
GAME(1985, starfirp, 0, play_5, play_5, driver_device, 0, ROT0, "Playmatic", "Star Fire", MACHINE_MECHANICAL | MACHINE_IMPERFECT_SOUND)
GAME(1985, starfirpa, starfirp, play_5, play_5, driver_device, 0, ROT0, "Playmatic", "Star Fire (alternate set)", MACHINE_MECHANICAL | MACHINE_IMPERFECT_SOUND)
GAME(1985, trailer, 0, play_5, play_5, driver_device, 0, ROT0, "Playmatic", "Trailer", MACHINE_MECHANICAL | MACHINE_IMPERFECT_SOUND)
GAME(1986, fldragon, 0, play_5, play_5, driver_device, 0, ROT0, "Playmatic", "Flash Dragon", MACHINE_MECHANICAL | MACHINE_NO_SOUND)
GAME(1987, sklflite, 0, play_5, play_5, driver_device, 0, ROT0, "Playmatic", "Skill Flight (Playmatic)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)

145
src/mame/layout/play_1.lay Normal file
View File

@ -0,0 +1,145 @@
<!-- play_1.lay -->
<!-- 2016-08-13: Initial version. [Robbbert] -->
<mamelayout version="2">
<element name="digit" defstate="0">
<led7seg>
<color red="1.0" green="0.0" blue="0.0" />
</led7seg>
</element>
<element name="background">
<rect>
<bounds left="0" top="0" right="1" bottom="1" />
<color red="0.0" green="0.0" blue="0.0" />
</rect>
</element>
<element name="P0"><text string="Ball/Match"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P1"><text string="Credits"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P2"><text string="Extra"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P3"><text string="Player 1"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P4"><text string="Player 2"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P5"><text string="Player 3"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P6"><text string="Player 4"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<view name="Default Layout">
<!-- Background -->
<backdrop element="background">
<bounds left="0" top="20" right="274" bottom="394" />
</backdrop>
<!-- LEDs -->
<!-- Player 1 Score -->
<bezel name="digit0" element="digit">
<bounds left="10" top="45" right="44" bottom="84" />
</bezel>
<bezel name="digit1" element="digit">
<bounds left="54" top="45" right="88" bottom="84" />
</bezel>
<bezel name="digit2" element="digit">
<bounds left="98" top="45" right="132" bottom="84" />
</bezel>
<bezel name="digit3" element="digit">
<bounds left="142" top="45" right="176" bottom="84" />
</bezel>
<bezel name="digit4" element="digit">
<bounds left="186" top="45" right="220" bottom="84" />
</bezel>
<bezel name="digit5" element="digit">
<bounds left="230" top="45" right="264" bottom="84" />
</bezel>
<!-- Player 2 Score -->
<bezel name="digit10" element="digit">
<bounds left="10" top="105" right="44" bottom="144" />
</bezel>
<bezel name="digit11" element="digit">
<bounds left="54" top="105" right="88" bottom="144" />
</bezel>
<bezel name="digit12" element="digit">
<bounds left="98" top="105" right="132" bottom="144" />
</bezel>
<bezel name="digit13" element="digit">
<bounds left="142" top="105" right="176" bottom="144" />
</bezel>
<bezel name="digit14" element="digit">
<bounds left="186" top="105" right="220" bottom="144" />
</bezel>
<bezel name="digit15" element="digit">
<bounds left="230" top="105" right="264" bottom="144" />
</bezel>
<!-- Player 3 Score -->
<bezel name="digit20" element="digit">
<bounds left="10" top="165" right="44" bottom="204" />
</bezel>
<bezel name="digit21" element="digit">
<bounds left="54" top="165" right="88" bottom="204" />
</bezel>
<bezel name="digit22" element="digit">
<bounds left="98" top="165" right="132" bottom="204" />
</bezel>
<bezel name="digit23" element="digit">
<bounds left="142" top="165" right="176" bottom="204" />
</bezel>
<bezel name="digit24" element="digit">
<bounds left="186" top="165" right="220" bottom="204" />
</bezel>
<bezel name="digit25" element="digit">
<bounds left="230" top="165" right="264" bottom="204" />
</bezel>
<!-- Player 4 Score -->
<bezel name="digit30" element="digit">
<bounds left="10" top="225" right="44" bottom="264" />
</bezel>
<bezel name="digit31" element="digit">
<bounds left="54" top="225" right="88" bottom="264" />
</bezel>
<bezel name="digit32" element="digit">
<bounds left="98" top="225" right="132" bottom="264" />
</bezel>
<bezel name="digit33" element="digit">
<bounds left="142" top="225" right="176" bottom="264" />
</bezel>
<bezel name="digit34" element="digit">
<bounds left="186" top="225" right="220" bottom="264" />
</bezel>
<bezel name="digit35" element="digit">
<bounds left="230" top="225" right="264" bottom="264" />
</bezel>
<!-- Credits and Balls -->
<bezel name="digit40" element="digit">
<bounds left="10" top="345" right="44" bottom="384" />
</bezel>
<bezel name="digit41" element="digit">
<bounds left="54" top="345" right="88" bottom="384" />
</bezel>
<bezel name="digit42" element="digit">
<bounds left="98" top="345" right="132" bottom="384" />
</bezel>
<bezel name="digit43" element="digit">
<bounds left="142" top="345" right="176" bottom="384" />
</bezel>
<bezel name="digit44" element="digit">
<bounds left="186" top="345" right="220" bottom="384" />
</bezel>
<bezel name="digit45" element="digit">
<bounds left="230" top="345" right="264" bottom="384" />
</bezel>
<bezel element="P0"><bounds left="60" right="130" top="330" bottom="342" /></bezel>
<bezel element="P1"><bounds left="200" right="260" top="330" bottom="342" /></bezel>
<bezel element="P2"><bounds left="10" right="48" top="330" bottom="342" /></bezel>
<bezel element="P3"><bounds left="100" right="180" top="30" bottom="42" /></bezel>
<bezel element="P4"><bounds left="100" right="180" top="90" bottom="102" /></bezel>
<bezel element="P5"><bounds left="100" right="180" top="150" bottom="162" /></bezel>
<bezel element="P6"><bounds left="100" right="180" top="210" bottom="222" /></bezel>
</view>
</mamelayout>

145
src/mame/layout/play_2.lay Normal file
View File

@ -0,0 +1,145 @@
<!-- play_2.lay -->
<!-- 2016-08-12: Initial version. [Robbbert] -->
<mamelayout version="2">
<element name="digit" defstate="0">
<led7seg>
<color red="1.0" green="0.0" blue="0.0" />
</led7seg>
</element>
<element name="background">
<rect>
<bounds left="0" top="0" right="1" bottom="1" />
<color red="0.0" green="0.0" blue="0.0" />
</rect>
</element>
<element name="P0"><text string="Ball/Match"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P1"><text string="Credits"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P2"><text string="Extra"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P3"><text string="Player 1"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P4"><text string="Player 2"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P5"><text string="Player 3"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P6"><text string="Player 4"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<view name="Default Layout">
<!-- Background -->
<backdrop element="background">
<bounds left="0" top="20" right="274" bottom="394" />
</backdrop>
<!-- LEDs -->
<!-- Player 1 Score -->
<bezel name="digit0" element="digit">
<bounds left="10" top="45" right="44" bottom="84" />
</bezel>
<bezel name="digit10" element="digit">
<bounds left="54" top="45" right="88" bottom="84" />
</bezel>
<bezel name="digit20" element="digit">
<bounds left="98" top="45" right="132" bottom="84" />
</bezel>
<bezel name="digit30" element="digit">
<bounds left="142" top="45" right="176" bottom="84" />
</bezel>
<bezel name="digit40" element="digit">
<bounds left="186" top="45" right="220" bottom="84" />
</bezel>
<bezel name="digit50" element="digit">
<bounds left="230" top="45" right="264" bottom="84" />
</bezel>
<!-- Player 2 Score -->
<bezel name="digit1" element="digit">
<bounds left="10" top="105" right="44" bottom="144" />
</bezel>
<bezel name="digit11" element="digit">
<bounds left="54" top="105" right="88" bottom="144" />
</bezel>
<bezel name="digit21" element="digit">
<bounds left="98" top="105" right="132" bottom="144" />
</bezel>
<bezel name="digit31" element="digit">
<bounds left="142" top="105" right="176" bottom="144" />
</bezel>
<bezel name="digit41" element="digit">
<bounds left="186" top="105" right="220" bottom="144" />
</bezel>
<bezel name="digit51" element="digit">
<bounds left="230" top="105" right="264" bottom="144" />
</bezel>
<!-- Player 3 Score -->
<bezel name="digit2" element="digit">
<bounds left="10" top="165" right="44" bottom="204" />
</bezel>
<bezel name="digit12" element="digit">
<bounds left="54" top="165" right="88" bottom="204" />
</bezel>
<bezel name="digit22" element="digit">
<bounds left="98" top="165" right="132" bottom="204" />
</bezel>
<bezel name="digit32" element="digit">
<bounds left="142" top="165" right="176" bottom="204" />
</bezel>
<bezel name="digit42" element="digit">
<bounds left="186" top="165" right="220" bottom="204" />
</bezel>
<bezel name="digit52" element="digit">
<bounds left="230" top="165" right="264" bottom="204" />
</bezel>
<!-- Player 4 Score -->
<bezel name="digit3" element="digit">
<bounds left="10" top="225" right="44" bottom="264" />
</bezel>
<bezel name="digit13" element="digit">
<bounds left="54" top="225" right="88" bottom="264" />
</bezel>
<bezel name="digit23" element="digit">
<bounds left="98" top="225" right="132" bottom="264" />
</bezel>
<bezel name="digit33" element="digit">
<bounds left="142" top="225" right="176" bottom="264" />
</bezel>
<bezel name="digit43" element="digit">
<bounds left="186" top="225" right="220" bottom="264" />
</bezel>
<bezel name="digit53" element="digit">
<bounds left="230" top="225" right="264" bottom="264" />
</bezel>
<!-- Credits and Balls -->
<bezel name="digit4" element="digit">
<bounds left="10" top="345" right="44" bottom="384" />
</bezel>
<bezel name="digit14" element="digit">
<bounds left="54" top="345" right="88" bottom="384" />
</bezel>
<bezel name="digit24" element="digit">
<bounds left="98" top="345" right="132" bottom="384" />
</bezel>
<bezel name="digit34" element="digit">
<bounds left="142" top="345" right="176" bottom="384" />
</bezel>
<bezel name="digit44" element="digit">
<bounds left="186" top="345" right="220" bottom="384" />
</bezel>
<bezel name="digit54" element="digit">
<bounds left="230" top="345" right="264" bottom="384" />
</bezel>
<bezel element="P0"><bounds left="60" right="130" top="330" bottom="342" /></bezel>
<bezel element="P1"><bounds left="200" right="260" top="330" bottom="342" /></bezel>
<bezel element="P2"><bounds left="10" right="48" top="330" bottom="342" /></bezel>
<bezel element="P3"><bounds left="100" right="180" top="30" bottom="42" /></bezel>
<bezel element="P4"><bounds left="100" right="180" top="90" bottom="102" /></bezel>
<bezel element="P5"><bounds left="100" right="180" top="150" bottom="162" /></bezel>
<bezel element="P6"><bounds left="100" right="180" top="210" bottom="222" /></bezel>
</view>
</mamelayout>

154
src/mame/layout/play_5.lay Normal file
View File

@ -0,0 +1,154 @@
<!-- play_5.lay -->
<!-- 2016-08-12: Initial version. [Robbbert] -->
<mamelayout version="2">
<element name="digit" defstate="0">
<led7seg>
<color red="1.0" green="0.0" blue="0.0" />
</led7seg>
</element>
<element name="background">
<rect>
<bounds left="0" top="0" right="1" bottom="1" />
<color red="0.0" green="0.0" blue="0.0" />
</rect>
</element>
<element name="P0"><text string="Ball/Match"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P1"><text string="Credits"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P2"><text string="Extra"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P3"><text string="Player 1"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P4"><text string="Player 2"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P5"><text string="Player 3"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P6"><text string="Player 4"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<view name="Default Layout">
<!-- Background -->
<backdrop element="background">
<bounds left="0" top="20" right="318" bottom="394" />
</backdrop>
<!-- LEDs -->
<!-- Player 1 Score -->
<bezel name="digit0" element="digit">
<bounds left="10" top="45" right="44" bottom="84" />
</bezel>
<bezel name="digit10" element="digit">
<bounds left="54" top="45" right="88" bottom="84" />
</bezel>
<bezel name="digit20" element="digit">
<bounds left="98" top="45" right="132" bottom="84" />
</bezel>
<bezel name="digit30" element="digit">
<bounds left="142" top="45" right="176" bottom="84" />
</bezel>
<bezel name="digit40" element="digit">
<bounds left="186" top="45" right="220" bottom="84" />
</bezel>
<bezel name="digit50" element="digit">
<bounds left="230" top="45" right="264" bottom="84" />
</bezel>
<bezel name="digit60" element="digit">
<bounds left="274" top="45" right="308" bottom="84" />
</bezel>
<!-- Player 2 Score -->
<bezel name="digit1" element="digit">
<bounds left="10" top="105" right="44" bottom="144" />
</bezel>
<bezel name="digit11" element="digit">
<bounds left="54" top="105" right="88" bottom="144" />
</bezel>
<bezel name="digit21" element="digit">
<bounds left="98" top="105" right="132" bottom="144" />
</bezel>
<bezel name="digit31" element="digit">
<bounds left="142" top="105" right="176" bottom="144" />
</bezel>
<bezel name="digit41" element="digit">
<bounds left="186" top="105" right="220" bottom="144" />
</bezel>
<bezel name="digit51" element="digit">
<bounds left="230" top="105" right="264" bottom="144" />
</bezel>
<bezel name="digit61" element="digit">
<bounds left="274" top="105" right="308" bottom="144" />
</bezel>
<!-- Player 3 Score -->
<bezel name="digit2" element="digit">
<bounds left="10" top="165" right="44" bottom="204" />
</bezel>
<bezel name="digit12" element="digit">
<bounds left="54" top="165" right="88" bottom="204" />
</bezel>
<bezel name="digit22" element="digit">
<bounds left="98" top="165" right="132" bottom="204" />
</bezel>
<bezel name="digit32" element="digit">
<bounds left="142" top="165" right="176" bottom="204" />
</bezel>
<bezel name="digit42" element="digit">
<bounds left="186" top="165" right="220" bottom="204" />
</bezel>
<bezel name="digit52" element="digit">
<bounds left="230" top="165" right="264" bottom="204" />
</bezel>
<bezel name="digit62" element="digit">
<bounds left="274" top="165" right="308" bottom="204" />
</bezel>
<!-- Player 4 Score -->
<bezel name="digit3" element="digit">
<bounds left="10" top="225" right="44" bottom="264" />
</bezel>
<bezel name="digit13" element="digit">
<bounds left="54" top="225" right="88" bottom="264" />
</bezel>
<bezel name="digit23" element="digit">
<bounds left="98" top="225" right="132" bottom="264" />
</bezel>
<bezel name="digit33" element="digit">
<bounds left="142" top="225" right="176" bottom="264" />
</bezel>
<bezel name="digit43" element="digit">
<bounds left="186" top="225" right="220" bottom="264" />
</bezel>
<bezel name="digit53" element="digit">
<bounds left="230" top="225" right="264" bottom="264" />
</bezel>
<bezel name="digit63" element="digit">
<bounds left="274" top="225" right="308" bottom="264" />
</bezel>
<!-- Credits and Balls -->
<bezel name="digit4" element="digit">
<bounds left="10" top="345" right="44" bottom="384" />
</bezel>
<bezel name="digit14" element="digit">
<bounds left="54" top="345" right="88" bottom="384" />
</bezel>
<bezel name="digit34" element="digit">
<bounds left="142" top="345" right="176" bottom="384" />
</bezel>
<bezel name="digit54" element="digit">
<bounds left="230" top="345" right="264" bottom="384" />
</bezel>
<bezel name="digit64" element="digit">
<bounds left="274" top="345" right="308" bottom="384" />
</bezel>
<bezel element="P0"><bounds left="240" right="298" top="330" bottom="342" /></bezel>
<bezel element="P1"><bounds left="30" right="88" top="330" bottom="342" /></bezel>
<bezel element="P2"><bounds left="120" right="200" top="330" bottom="342" /></bezel>
<bezel element="P3"><bounds left="100" right="180" top="30" bottom="42" /></bezel>
<bezel element="P4"><bounds left="100" right="180" top="90" bottom="102" /></bezel>
<bezel element="P5"><bounds left="100" right="180" top="150" bottom="162" /></bezel>
<bezel element="P6"><bounds left="100" right="180" top="210" bottom="222" /></bezel>
</view>
</mamelayout>