summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame
diff options
context:
space:
mode:
author Robbbert <Robbbert@users.noreply.github.com>2021-10-18 13:36:22 +1100
committer Robbbert <Robbbert@users.noreply.github.com>2021-10-18 13:36:22 +1100
commit2c82ebae0d44c6256bf761ca49a4e5a8fb9a5daf (patch)
tree998d1a714dda7b6cdea98c07125c1c6a03fdc697 /src/mame
parent1a5fe419c24e23fb1bdeec231471e2849ce5bf5d (diff)
gst80,gts80a,gts80b: WIP. Some games can be played.
Diffstat (limited to 'src/mame')
-rw-r--r--src/mame/audio/gottlieb.cpp23
-rw-r--r--src/mame/audio/gottlieb.h2
-rw-r--r--src/mame/drivers/gts80.cpp705
-rw-r--r--src/mame/drivers/gts80a.cpp685
-rw-r--r--src/mame/drivers/gts80b.cpp756
-rw-r--r--src/mame/layout/gts80a.lay56
-rw-r--r--src/mame/layout/gts80a_caveman.lay56
7 files changed, 1332 insertions, 951 deletions
diff --git a/src/mame/audio/gottlieb.cpp b/src/mame/audio/gottlieb.cpp
index 11a8926485b..a0a985e5027 100644
--- a/src/mame/audio/gottlieb.cpp
+++ b/src/mame/audio/gottlieb.cpp
@@ -67,13 +67,13 @@ uint8_t gottlieb_sound_r0_device::r6530b_r()
// write - handle an external command write
//-------------------------------------------------
-void gottlieb_sound_r0_device::write(offs_t offset, uint8_t data)
+void gottlieb_sound_r0_device::write(uint8_t data)
{
// write the command data to the low 4 bits
- uint8_t pb0_3 = data ^ 15;
+ uint8_t pb0_3 = data ^ 15; // U7
uint8_t pb4_7 = ioport("SB0")->read() & 0x90;
m_sndcmd = pb0_3 | pb4_7;
- m_r6530->write(offset, m_sndcmd);
+ m_r6530->write(2, m_sndcmd); // push to portB, but doesn't seem to be needed
}
@@ -84,8 +84,9 @@ void gottlieb_sound_r0_device::write(offs_t offset, uint8_t data)
void gottlieb_sound_r0_device::gottlieb_sound_r0_map(address_map &map)
{
map.global_mask(0x0fff);
- map(0x0000, 0x003f).ram().mirror(0x1c0);
- map(0x0200, 0x020f).rw(m_r6530, FUNC(mos6530_device::read), FUNC(mos6530_device::write));
+ map.unmap_value_high();
+ map(0x0000, 0x017f).ram();
+ map(0x0200, 0x03ff).rw(m_r6530, FUNC(mos6530_device::read), FUNC(mos6530_device::write));
map(0x0400, 0x0fff).rom();
}
@@ -96,11 +97,16 @@ void gottlieb_sound_r0_device::gottlieb_sound_r0_map(address_map &map)
INPUT_PORTS_START( gottlieb_sound_r0 )
PORT_START("SB0")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Audio Diag") PORT_CODE(KEYCODE_0) PORT_CHANGED_MEMBER(DEVICE_SELF, gottlieb_sound_r0_device, audio_nmi, 0)
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Attract") PORT_CODE(KEYCODE_F1) PORT_TOGGLE
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Music") PORT_CODE(KEYCODE_F2) PORT_TOGGLE
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Sound Test") PORT_CODE(KEYCODE_7_PAD) PORT_CHANGED_MEMBER(DEVICE_SELF, gottlieb_sound_r0_device, audio_nmi, 0)
+ PORT_DIPNAME( 0x10, 0x00, "Sound during game" )
+ PORT_DIPSETTING( 0x10, "Continuous" )
+ PORT_DIPSETTING( 0x00, "Scoring only" )
+ PORT_DIPNAME( 0x40, 0x00, "Attract Sound" )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) ) // Makes a sound every 6 minutes
INPUT_PORTS_END
+// The sound test will only work if the 2 above dips are in opposing directions (one off and one on)
INPUT_CHANGED_MEMBER( gottlieb_sound_r0_device::audio_nmi )
{
// Diagnostic button sends a pulse to NMI pin
@@ -146,6 +152,7 @@ ioport_constructor gottlieb_sound_r0_device::device_input_ports() const
void gottlieb_sound_r0_device::device_start()
{
+ save_item(NAME(m_sndcmd));
}
diff --git a/src/mame/audio/gottlieb.h b/src/mame/audio/gottlieb.h
index ab3413e9569..623844845f7 100644
--- a/src/mame/audio/gottlieb.h
+++ b/src/mame/audio/gottlieb.h
@@ -39,7 +39,7 @@ public:
gottlieb_sound_r0_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
// read/write
- void write(offs_t offset, uint8_t data);
+ void write(uint8_t data);
// internal communications
DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
diff --git a/src/mame/drivers/gts80.cpp b/src/mame/drivers/gts80.cpp
index 723592d7c69..969bef08b1c 100644
--- a/src/mame/drivers/gts80.cpp
+++ b/src/mame/drivers/gts80.cpp
@@ -2,29 +2,42 @@
// copyright-holders:Robbbert
/***********************************************************************************************************
- PINBALL
- Gottlieb System 80
+PINBALL
+Gottlieb System 80
+
+An evolution of the original system 1, again plagued by numerous problems. The R6502 and R6532 replaced the
+ancient 4-bit spider chips, but the problems of poor-quality PCBs, bad connectors and no common grounding were
+still there. Like most pinball machines, the leaky battery could destroy everything, as could an unnoticed
+stuck-on solenoid. If the machine was left on was a while, it could lock up, so a reset board (watchdog) was
+added.
Status:
-- Games boot up, score alternates between 0 and high score (currently blank as there is no high score yet)
-- Dips are read and stored to ram
-- Switches are not being read, therefore unable to play, or enter setup/test menu
-- Original sound card added, it continuously produces weird noises
-- 2nd version of sound card not coded yet
+- Machines boot up, coins can be inserted, and a game begun.
+- These work: Panthera, Grand8, Spiderman, Circus, Counterforce, Star Race, James Bond, Timeline, Marspf,
+ Haunted House.
+
+Notes:
+- Jamesb is a timed game and appears to be never-ending.
+- Black Hole: Start game, Hold R until digits flash, then works. After the last ball, hit R to finish the game.
+- Multiball machines: Black Hole, Eclipse, Force II, Mars, Pink Panther, Volcano.
+- Haunted House uses the R1 sound card which doesn't have anything for save-states. If the game has save-state
+ support, it will fatal-error at start.
ToDO:
-- Switches
-- Outputs
-- Mechanical sounds
-- Sound
+- Sounds are not correct. The games only seem to use 2 or 3 sounds each.
+- The Sound & Speech board has extra control lines (Sound16 and Sound32). Sound16 comes from a lamp output,
+ while Sound32 hasn't been tracked down yet.
+- None of the "talking" machines talk.
+
************************************************************************************************************/
#include "emu.h"
+#include "machine/input_merger.h"
#include "machine/genpin.h"
#include "audio/gottlieb.h"
#include "speaker.h"
@@ -36,44 +49,57 @@ public:
gts80_state(const machine_config &mconfig, device_type type, const char *tag)
: genpin_class(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
+ , m_riot1(*this, "riot1")
+ , m_riot2(*this, "riot2")
+ , m_riot3(*this, "riot3")
+ , m_io_dips(*this, "DSW%u", 0U)
+ , m_io_keyboard(*this, "X%u", 0U)
, m_r0_sound(*this, "r0sound")
, m_r1_sound(*this, "r1sound")
, m_digits(*this, "digit%u", 0U)
+ , m_io_outputs(*this, "out%u", 0U)
{ }
void gts80(machine_config &config);
void gts80_ss(machine_config &config);
void gts80_s(machine_config &config);
void gts80_hh(machine_config &config);
-
- void init_gts80();
+ DECLARE_INPUT_CHANGED_MEMBER(slam_w);
private:
- uint8_t port1a_r();
- uint8_t port2a_r();
- void port1b_w(uint8_t data);
- void port2a_w(uint8_t data);
- void port2b_w(uint8_t data);
- void port3a_w(uint8_t data);
- void port3b_w(offs_t offset, uint8_t data);
+ u8 port1a_r();
+ u8 port2a_r();
+ void port1b_w(u8 data);
+ void port2a_w(u8 data);
+ void port2b_w(u8 data);
+ void port3a_w(u8 data);
+ void port3b_w(u8 data);
void gts80_map(address_map &map);
- uint8_t m_port2;
- uint8_t m_segment;
- uint8_t m_lamprow;
- uint8_t m_swrow;
+ u8 m_segment = 0;
+ u8 m_lamprow = 0;
+ u8 m_swrow = 0;
+ u8 m_soundex = 0;
+ u8 m_sol_state[9][2];
virtual void machine_reset() override;
- virtual void machine_start() override { m_digits.resolve(); }
- required_device<cpu_device> m_maincpu;
+ virtual void machine_start() override;
+ required_device<m6502_device> m_maincpu;
+ required_device<riot6532_device> m_riot1;
+ required_device<riot6532_device> m_riot2;
+ required_device<riot6532_device> m_riot3;
+ required_ioport_array<4> m_io_dips;
+ required_ioport_array<9> m_io_keyboard;
optional_device<gottlieb_sound_r0_device> m_r0_sound;
optional_device<gottlieb_sound_r1_device> m_r1_sound;
output_finder<56> m_digits;
+ output_finder<57> m_io_outputs; // 8 solenoids, 1 outhole, 48 lamps
};
void gts80_state::gts80_map(address_map &map)
{
map.global_mask(0x3fff);
map(0x0000, 0x017f).ram();
+ map(0x01cb, 0x01cb).lr8(NAME([] () { return 0xff; })); // continual read
map(0x0200, 0x027f).rw("riot1", FUNC(riot6532_device::read), FUNC(riot6532_device::write));
map(0x0280, 0x02ff).rw("riot2", FUNC(riot6532_device::read), FUNC(riot6532_device::write));
map(0x0300, 0x037f).rw("riot3", FUNC(riot6532_device::read), FUNC(riot6532_device::write));
@@ -84,230 +110,229 @@ void gts80_state::gts80_map(address_map &map)
}
static INPUT_PORTS_START( gts80 )
- PORT_START("DSW.0")
- PORT_DIPNAME( 0x80, 0x00, "SW 1")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x80, DEF_STR(On))
- PORT_DIPNAME( 0x40, 0x00, "SW 2")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x40, DEF_STR(On))
- PORT_DIPNAME( 0x20, 0x00, "SW 3")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x20, DEF_STR(On))
- PORT_DIPNAME( 0x10, 0x00, "SW 4")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x10, DEF_STR(On))
- PORT_DIPNAME( 0x08, 0x00, "SW 5")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x08, DEF_STR(On))
- PORT_DIPNAME( 0x04, 0x00, "SW 6")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x04, DEF_STR(On))
- PORT_DIPNAME( 0x02, 0x00, "SW 7")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x02, DEF_STR(On))
- PORT_DIPNAME( 0x01, 0x00, "SW 8")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x01, DEF_STR(On))
-
- PORT_START("DSW.1")
- PORT_DIPNAME( 0x80, 0x00, "SW 9")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x80, DEF_STR(On))
- PORT_DIPNAME( 0x40, 0x00, "SW 10")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x40, DEF_STR(On))
- PORT_DIPNAME( 0x20, 0x00, "SW 11")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x20, DEF_STR(On))
- PORT_DIPNAME( 0x10, 0x00, "SW 12")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x10, DEF_STR(On))
- PORT_DIPNAME( 0x08, 0x00, "SW 13")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x08, DEF_STR(On))
+ PORT_START("DSW0")
+ PORT_DIPNAME( 0x80, 0x80, "SW 01")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x80, DEF_STR(Off))
+ PORT_DIPNAME( 0x40, 0x40, "SW 02")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x40, DEF_STR(Off))
+ PORT_DIPNAME( 0x20, 0x20, "SW 03")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x20, DEF_STR(Off))
+ PORT_DIPNAME( 0x10, 0x10, "SW 04")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x10, DEF_STR(Off))
+ PORT_DIPNAME( 0x08, 0x08, "SW 05")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x08, DEF_STR(Off))
+ PORT_DIPNAME( 0x04, 0x04, "SW 06")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x04, DEF_STR(Off))
+ PORT_DIPNAME( 0x02, 0x02, "SW 07")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x02, DEF_STR(Off))
+ PORT_DIPNAME( 0x01, 0x01, "SW 08")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x01, DEF_STR(Off))
+
+ PORT_START("DSW1")
+ PORT_DIPNAME( 0x80, 0x80, "SW 09")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x80, DEF_STR(Off))
+ PORT_DIPNAME( 0x40, 0x40, "SW 10")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x40, DEF_STR(Off))
+ PORT_DIPNAME( 0x20, 0x20, "SW 11")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x20, DEF_STR(Off))
+ PORT_DIPNAME( 0x10, 0x10, "SW 12")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x10, DEF_STR(Off))
+ PORT_DIPNAME( 0x08, 0x08, "SW 13")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x08, DEF_STR(Off))
PORT_DIPNAME( 0x04, 0x00, "SW 14")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x04, DEF_STR(On))
- PORT_DIPNAME( 0x02, 0x02, "SW 15")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x02, DEF_STR(On))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x04, DEF_STR(Off))
+ PORT_DIPNAME( 0x02, 0x00, "SW 15")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x02, DEF_STR(Off))
PORT_DIPNAME( 0x01, 0x00, "SW 16")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x01, DEF_STR(On))
-
- PORT_START("DSW.2")
- PORT_DIPNAME( 0x80, 0x80, "SW 17")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x80, DEF_STR(On))
- PORT_DIPNAME( 0x40, 0x40, "SW 18")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x40, DEF_STR(On))
- PORT_DIPNAME( 0x20, 0x00, "SW 19")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x20, DEF_STR(On))
- PORT_DIPNAME( 0x10, 0x00, "SW 20")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x10, DEF_STR(On))
- PORT_DIPNAME( 0x08, 0x00, "SW 21")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x08, DEF_STR(On))
- PORT_DIPNAME( 0x04, 0x00, "SW 22")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x04, DEF_STR(On))
- PORT_DIPNAME( 0x02, 0x02, "SW 23")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x02, DEF_STR(On))
- PORT_DIPNAME( 0x01, 0x01, "SW 24")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x01, DEF_STR(On))
-
- PORT_START("DSW.3")
- PORT_DIPNAME( 0x80, 0x80, "SW 25")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x80, DEF_STR(On))
- PORT_DIPNAME( 0x40, 0x40, "SW 26")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x40, DEF_STR(On))
- PORT_DIPNAME( 0x20, 0x20, "SW 27")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x20, DEF_STR(On))
- PORT_DIPNAME( 0x10, 0x10, "SW 28")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x10, DEF_STR(On))
- PORT_DIPNAME( 0x08, 0x08, "SW 29")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x08, DEF_STR(On))
- PORT_DIPNAME( 0x04, 0x04, "SW 30")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x04, DEF_STR(On))
- PORT_DIPNAME( 0x02, 0x00, "SW 31")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x02, DEF_STR(On))
- PORT_DIPNAME( 0x01, 0x00, "SW 32")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x01, DEF_STR(On))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x01, DEF_STR(Off))
+
+ PORT_START("DSW2")
+ PORT_DIPNAME( 0x80, 0x00, "SW 17")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x80, DEF_STR(Off))
+ PORT_DIPNAME( 0x40, 0x00, "SW 18")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x40, DEF_STR(Off))
+ PORT_DIPNAME( 0x20, 0x20, "SW 19")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x20, DEF_STR(Off))
+ PORT_DIPNAME( 0x10, 0x10, "SW 20")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x10, DEF_STR(Off))
+ PORT_DIPNAME( 0x08, 0x08, "SW 21")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x08, DEF_STR(Off))
+ PORT_DIPNAME( 0x04, 0x04, "SW 22")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x04, DEF_STR(Off))
+ PORT_DIPNAME( 0x02, 0x00, "SW 23")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x02, DEF_STR(Off))
+ PORT_DIPNAME( 0x01, 0x00, "SW 24")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x01, DEF_STR(Off))
+
+ PORT_START("DSW3")
+ PORT_DIPNAME( 0x80, 0x00, "SW 25")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x80, DEF_STR(Off))
+ PORT_DIPNAME( 0x40, 0x00, "SW 26")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x40, DEF_STR(Off))
+ PORT_DIPNAME( 0x20, 0x00, "SW 27")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x20, DEF_STR(Off))
+ PORT_DIPNAME( 0x10, 0x00, "SW 28")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x10, DEF_STR(Off))
+ PORT_DIPNAME( 0x08, 0x00, "SW 29")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x08, DEF_STR(Off))
+ PORT_DIPNAME( 0x04, 0x00, "SW 30")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x04, DEF_STR(Off))
+ PORT_DIPNAME( 0x02, 0x02, "SW 31")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x02, DEF_STR(Off))
+ PORT_DIPNAME( 0x01, 0x01, "SW 32")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x01, DEF_STR(Off))
PORT_START("X0")
- PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("INP00")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("INP01")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("INP02")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("INP03")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("INP04")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("INP05")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP06")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Play/Test")
PORT_START("X1")
- 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_SERVICE1 )
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("INP10")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("INP11")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("INP12")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("INP13")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("INP14")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("INP15")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP16")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_START("X2")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_A)
- 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_COIN1 )
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("INP20")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("INP21")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("INP22")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME("INP23")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("INP24")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("INP25")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP26")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 )
+
+ PORT_START("X3")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("INP30")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("INP31")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("INP32")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("INP33")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("INP34")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("INP35")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP36")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN3 )
PORT_START("X4")
- 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_COIN2 )
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("INP40")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("INP41")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("INP42")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("INP43")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("INP44")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("INP45")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("INP46")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START )
+
+ PORT_START("X5")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("INP50")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("INP51")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("INP52")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("INP53")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME("INP54")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("INP55")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("INP56")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Tilt") // won't boot if closed
+
+ PORT_START("X6")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME("INP60")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("INP61")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("INP62")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("INP63")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("INP64")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_NAME("INP65")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("INP66")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Outhole")
+
+ PORT_START("X7")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("INP70")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("INP71")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("INP72")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("INP73")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("INP74")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("X8")
- 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_COMMA)
- 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_COIN3 )
-
- PORT_START("X10")
- 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_START )
-
- PORT_START("X20")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_K)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_8_PAD)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_9_PAD)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_BACKSPACE)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_ASTERISK)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_MINUS_PAD)
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_PLUS_PAD)
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_TILT ) // won't boot if closed
-
- PORT_START("X40")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_SLASH_PAD)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_ENTER_PAD)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_0_PAD)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_DEL_PAD)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_HOME)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_END)
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_PGUP)
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_X)
-
- PORT_START("X80")
- 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_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("Slam") PORT_CHANGED_MEMBER(DEVICE_SELF, gts80_state, slam_w, 0)
INPUT_PORTS_END
-uint8_t gts80_state::port1a_r()
+INPUT_CHANGED_MEMBER( gts80_state::slam_w )
{
- char kbdrow[8];
- uint8_t data = 0;
- if ((m_lamprow < 4) && (m_segment==0x80))
- {
- sprintf(kbdrow,"DSW.%d",m_lamprow);
- data = ioport(kbdrow)->read();
- }
- else
- {
- sprintf(kbdrow,"X%X",m_swrow);
- data = ioport(kbdrow)->read();
- }
+ m_riot2->porta_in_set(newval ? 0x80 : 0, 0x80);
+}
+
+u8 gts80_state::port1a_r()
+{
+ u8 data = 0xff;
+ if ((m_lamprow < 4) && BIT(m_segment, 7))
+ data = m_io_dips[m_lamprow]->read();
+
+ for (u8 i = 0; i < 7; i++)
+ if (!BIT(m_swrow, i))
+ data &= m_io_keyboard[i]->read();
- return data;
+ return data ^ 0xff; // inverted by Z14 (7400)
}
-uint8_t gts80_state::port2a_r()
+u8 gts80_state::port2a_r()
{
- return m_port2 | 0x80; // slam tilt off
+ return m_io_keyboard[8]->read(); // slam tilt
}
// sw strobes
-void gts80_state::port1b_w(uint8_t data)
+void gts80_state::port1b_w(u8 data)
{
- m_swrow = data;
+ m_swrow = data ^ 0xff; // inverted by Z11 (7404)
}
// schematic and pinmame say '1' is indicated by m_segment !bits 4,5,6, but it is !bit 7
-void gts80_state::port2a_w(uint8_t data)
+void gts80_state::port2a_w(u8 data)
{
- m_port2 = data;
- static const uint8_t patterns[16] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x58,0x4c,0x62,0x69,0x78,0 }; // 7448
+ static const u8 patterns[16] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x58,0x4c,0x62,0x69,0x78,0 }; // 7448
uint16_t seg1 = (uint16_t)patterns[m_segment & 15];
- uint16_t seg2 = bitswap<16>(seg1, 8, 8, 8, 8, 8, 8, 7, 7, 6, 6, 5, 4, 3, 2, 1, 0);
+ uint16_t seg2 = bitswap<10>(seg1, 7, 7, 6, 6, 5, 4, 3, 2, 1, 0);
switch (data & 0x70)
{
case 0x10: // player 1&2
@@ -326,35 +351,138 @@ void gts80_state::port2a_w(uint8_t data)
}
//d0-3 bcd data; d4-6 = centre segment; d7 = dipsw enable
-void gts80_state::port2b_w(uint8_t data)
+void gts80_state::port2b_w(u8 data)
{
- m_segment = data;//printf("%s:%X ",machine().describe_context().c_str(),data);
+ m_segment = data;
}
-// solenoids
-void gts80_state::port3a_w(uint8_t data)
+// solenoids and sound
+void gts80_state::port3a_w(u8 data)
{
+ u8 i;
+ data ^= 0x1f; // Z27 inverter
+ // Sound
+ u8 sndcmd = data & 15;
+ if (BIT(data, 4)) // Z31
+ sndcmd = 0;
+
+ sndcmd ^= 15; // inverted again by Z13 on the A3 board
+ if (m_r0_sound && (sndcmd & 15))
+ m_r0_sound->write(sndcmd);
+ else
+ if (m_r1_sound)
+ m_r1_sound->write(sndcmd | m_soundex);
+
+ // Solenoids group 1
+ if (!BIT(data, 5))
+ for (i = 0; i < 4;i++)
+ m_sol_state[i][0] = (BIT(data, 0, 2) == i) ? 1 : 0;
+ else
+ for (i = 0; i < 4;i++)
+ m_sol_state[i][0] = 0;
+
+ // Solenoids group 2
+ if (!BIT(data, 6))
+ for (i = 0; i < 4;i++)
+ m_sol_state[i+4][0] = (BIT(data, 2, 2) == i) ? 1 : 0;
+ else
+ for (i = 4; i < 8;i++)
+ m_sol_state[i][0] = 0;
+
+ // Outhole
+ m_sol_state[8][0] = BIT(data, 7) ^ 1;
+
+ // Smooth solenoids
+ // Some solenoids get continuously pulsed, which is absorbed by the real thing, but
+ // causes issues for us. So we need to use only the first occurrence of a particular sound.
+ for (i = 0; i < 9; i++)
+ {
+ switch (m_sol_state[i][1])
+ {
+ case 0: // was off
+ if (m_sol_state[i][0] == 1) // was off, coming on
+ {
+ m_io_outputs[i] = 1;
+ m_sol_state[i][1] = 1; // remember
+ }
+ break;
+ case 1: // was on
+ if (m_sol_state[i][0] == 0) // was on, going off
+ {
+ m_io_outputs[i] = 0;
+ m_sol_state[i][1] = 0; // remember
+ }
+ else
+ m_io_outputs[i] = 0; // still on from before
+ break;
+ default:
+ m_sol_state[i][1] = 0;
+ break;
+ }
+ }
+ // Activate solenoids
+ for (i = 0; i < 9; i++)
+ {
+ bool state = m_io_outputs[i] ? 1 : 0;
+ switch (i)
+ {
+ case 2:
+ machine().bookkeeping().coin_counter_w(0, state);
+ break;
+ case 3:
+ machine().bookkeeping().coin_counter_w(1, state);
+ break;
+ case 6:
+ machine().bookkeeping().coin_counter_w(2, state);
+ break;
+ case 7:
+ if (state)
+ m_samples->start(0, 6); // knocker
+ break;
+ case 8:
+ if (state)
+ m_samples->start(0, 9); // outhole
+ break;
+ default:
+ break;
+ }
+ }
}
-//pb0-3 = sound; pb4-7 = lamprow
-void gts80_state::port3b_w(offs_t offset, uint8_t data)
+// Lamps
+void gts80_state::port3b_w(u8 data)
{
- uint8_t sndcmd = data & 15;
- m_lamprow = data >> 4;
- if (m_r0_sound)
- m_r0_sound->write(offset, sndcmd);
- if (m_r1_sound)
- m_r1_sound->write(sndcmd);
+ m_lamprow = BIT(data, 4, 4);
+ if (m_lamprow && (m_lamprow < 13))
+ for (u8 i = 0; i < 4; i++)
+ m_io_outputs[m_lamprow*4+i+5] = BIT(data, i);
+ m_soundex = m_io_outputs[18] << 4; // Sound16 line (there's a Sound32 line, but haven't found its source)
}
-void gts80_state::machine_reset()
+void gts80_state::machine_start()
{
+ genpin_class::machine_start();
+
+ m_digits.resolve();
+ m_io_outputs.resolve();
+
+ save_item(NAME(m_lamprow));
+ save_item(NAME(m_swrow));
+ save_item(NAME(m_segment));
+ save_item(NAME(m_soundex));
+ save_item(NAME(m_sol_state));
}
-void gts80_state::init_gts80()
+void gts80_state::machine_reset()
{
+ genpin_class::machine_reset();
+ m_lamprow = 0;
+ m_swrow = 0;
+ m_segment = 0;
+ m_soundex = 0;
}
+
/* with Sound Board */
void gts80_state::gts80(machine_config &config)
{
@@ -362,32 +490,29 @@ void gts80_state::gts80(machine_config &config)
M6502(config, m_maincpu, XTAL(3'579'545)/4);
m_maincpu->set_addrmap(AS_PROGRAM, &gts80_state::gts80_map);
- NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); // must be 1
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* Video */
config.set_default_layout(layout_gts80);
/* Devices */
- riot6532_device &riot1(RIOT6532(config, "riot1", XTAL(3'579'545)/4));
- riot1.in_pa_callback().set(FUNC(gts80_state::port1a_r)); // sw_r
- //riot1.out_pa_callback().set(FUNC(gts80_state::port1a_w));
- //riot1.in_pb_callback().set(FUNC(gts80_state::port1b_r));
- riot1.out_pb_callback().set(FUNC(gts80_state::port1b_w)); // sw_w
- riot1.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE);
-
- riot6532_device &riot2(RIOT6532(config, "riot2", XTAL(3'579'545)/4));
- riot2.in_pa_callback().set(FUNC(gts80_state::port2a_r)); // pa7 - slam tilt
- riot2.out_pa_callback().set(FUNC(gts80_state::port2a_w)); // digit select
- //riot2.in_pb_callback().set(FUNC(gts80_state::port2b_r));
- riot2.out_pb_callback().set(FUNC(gts80_state::port2b_w)); // seg
- riot2.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE);
-
- riot6532_device &riot3(RIOT6532(config, "riot3", XTAL(3'579'545)/4));
- //riot3.in_pa_callback().set(FUNC(gts80_state::port3a_r));
- riot3.out_pa_callback().set(FUNC(gts80_state::port3a_w)); // sol, snd
- //riot3.in_pb_callback().set(FUNC(gts80_state::port3b_r));
- riot3.out_pb_callback().set(FUNC(gts80_state::port3b_w)); // lamps
- riot3.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE);
+ RIOT6532(config, m_riot1, XTAL(3'579'545)/4);
+ m_riot1->in_pa_callback().set(FUNC(gts80_state::port1a_r)); // sw_r
+ m_riot1->out_pb_callback().set(FUNC(gts80_state::port1b_w)); // sw_w
+ m_riot1->irq_callback().set("irq", FUNC(input_merger_device::in_w<0>));
+
+ RIOT6532(config, m_riot2, XTAL(3'579'545)/4);
+ m_riot2->in_pa_callback().set(FUNC(gts80_state::port2a_r)); // pa7 - slam tilt
+ m_riot2->out_pa_callback().set(FUNC(gts80_state::port2a_w)); // digit select
+ m_riot2->out_pb_callback().set(FUNC(gts80_state::port2b_w)); // seg
+ m_riot2->irq_callback().set("irq", FUNC(input_merger_device::in_w<1>));
+
+ RIOT6532(config, m_riot3, XTAL(3'579'545)/4);
+ m_riot3->out_pa_callback().set(FUNC(gts80_state::port3a_w)); // sol, snd
+ m_riot3->out_pb_callback().set(FUNC(gts80_state::port3b_w)); // lamps
+ m_riot3->irq_callback().set("irq", FUNC(input_merger_device::in_w<2>));
+
+ INPUT_MERGER_ANY_HIGH(config, "irq").output_handler().set_inputline("maincpu", m6502_device::IRQ_LINE);
/* Sound */
genpin_audio(config);
@@ -397,20 +522,19 @@ void gts80_state::gts80(machine_config &config)
void gts80_state::gts80_s(machine_config &config)
{
gts80(config);
- GOTTLIEB_SOUND_REV0(config, m_r0_sound, 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
+ GOTTLIEB_SOUND_REV0(config, m_r0_sound, 0).add_route(ALL_OUTPUTS, "speaker", 0.75);
}
void gts80_state::gts80_hh(machine_config &config)
{
gts80(config);
- GOTTLIEB_SOUND_REV1(config, m_r1_sound, 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
+ GOTTLIEB_SOUND_REV1(config, m_r1_sound, 0).add_route(ALL_OUTPUTS, "speaker", 0.75);
}
void gts80_state::gts80_ss(machine_config &config)
{
gts80(config);
- GOTTLIEB_SOUND_REV1(config, m_r1_sound, 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
- //GOTTLIEB_SOUND_REV1_VOTRAX(config, m_r1_sound, 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // votrax crashes
+ GOTTLIEB_SOUND_REV1_VOTRAX(config, m_r1_sound, 0).add_route(ALL_OUTPUTS, "speaker", 0.75);
}
/*-------------------------------------------------------------------
@@ -489,6 +613,7 @@ ROM_END
/*-------------------------------------------------------------------
/ Critical Mass
/-------------------------------------------------------------------*/
+// Prototype, no number
/*-------------------------------------------------------------------
/ Eclipse #671
@@ -643,7 +768,8 @@ ROM_START(grand8)
ROM_LOAD("u3_80.bin", 0x3000, 0x1000, CRC(1e69f9d0) SHA1(ad738cac2555830257b531e5e533b15362f624b9))
ROM_LOAD("652.cpu", 0x1000, 0x0800, CRC(5386e5fb) SHA1(822f47951b702f9c6a1ce674baaab0a596f34413))
- ROM_REGION(0x2000, "r0sound:audiocpu", 0)
+ ROM_REGION(0x2000, "audiocpu", 0)
+ // Z80 code (0000-048E), unknown (048F-060C), FF (060D-1FFF)
ROM_LOAD("grand8.bin", 0, 0x2000, CRC(b7cfaaae) SHA1(60eb4f9bc7b7d11ec6d353b0ae02484cf1c0c9ee))
ROM_END
@@ -730,8 +856,9 @@ ROM_START(spidermn)
ROM_END
/*-------------------------------------------------------------------
-/ The Incredible Hulk
+/ The Incredible Hulk (#500)
/-------------------------------------------------------------------*/
+// Prototypes to test System 80 before production.
/*-------------------------------------------------------------------
/ Time Line #659
@@ -812,29 +939,29 @@ ROM_START(s80tst)
ROM_LOAD("80tst-s2.snd", 0x7800, 0x0800, CRC(1a4b1e9d) SHA1(18e7ffbdbdaf83ab1c8daa5fa5201d9f54390758))
ROM_END
-/* disp1 */GAME(1981, s80tst, 0, gts80_ss, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "System 80 Test", MACHINE_IS_SKELETON_MECHANICAL)
-
-/* disp1 */GAME(1980, panthera, 0, gts80_s, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Panthera", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp1 */GAME(1980, grand8, panthera, gts80_s, gts80, gts80_state, init_gts80, ROT0, "Christian Tabart", "Le Grand 8", MACHINE_IS_SKELETON_MECHANICAL) // Panthera conversion
-/* disp1 */GAME(1980, spidermn, 0, gts80_s, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "The Amazing Spider-Man", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp1 */GAME(1980, circusp, 0, gts80_s, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Circus", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp1 */GAME(1980, cntforce, 0, gts80_s, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Counterforce", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp1 */GAME(1980, starrace, 0, gts80_s, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Star Race", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp2 */GAME(1980, jamesb, 0, gts80_s, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "James Bond (Timed Play)", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp2 */GAME(1980, jamesb2, jamesb, gts80_s, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "James Bond (3/5-Ball)", MACHINE_IS_SKELETON_MECHANICAL)
-/* cust */GAME(1980, timeline, 0, gts80_s, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Time Line", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp1 */GAME(1981, forceii, 0, gts80_s, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Force II", MACHINE_IS_SKELETON_MECHANICAL)
-/* cust */GAME(1981, pnkpnthr, 0, gts80_s, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Pink Panther", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp1 */GAME(1981, marsp, 0, gts80_ss, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Mars - God of War", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp1 */GAME(1981, marspf, marsp, gts80_ss, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Mars - God of War (French speech)", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp1 */GAME(1981, marspp, marsp, gts80_ss, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Mars - God of War (Prototype)", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp1 */GAME(1981, vlcno_ax, 0, gts80_ss, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Volcano", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp1 */GAME(1981, vlcno_1c, 0, gts80_s, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Volcano (Sound Only set 1)", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp1 */GAME(1981, vlcno_1b, vlcno_1c, gts80_s, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Volcano (Sound Only set 2)", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp1 */GAME(1981, vlcno_1a, vlcno_1c, gts80_s, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Volcano (Sound Only set 3)", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp2 */GAME(1981, blckhole, 0, gts80_ss, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Black Hole (Rev. 4)", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp2 */GAME(1981, blckhole2, blckhole, gts80_ss, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Black Hole (Rev. 2)", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp2 */GAME(1981, blckhols, 0, gts80_s, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Black Hole (Sound Only)", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp2 */GAME(1982, hh, 0, gts80_hh, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Haunted House (Rev. 2)", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp2 */GAME(1982, hh_1, hh, gts80_hh, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Haunted House (Rev. 1)", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp2 */GAME(1981, eclipse, 0, gts80_s, gts80, gts80_state, init_gts80, ROT0, "Gottlieb", "Eclipse", MACHINE_IS_SKELETON_MECHANICAL)
+/* disp1 */GAME(1981, s80tst, 0, gts80_ss, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "System 80 Test", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+
+/* disp1 */GAME(1980, panthera, 0, gts80_s, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Panthera", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* disp1 */GAME(1980, grand8, panthera, gts80, gts80, gts80_state, empty_init, ROT0, "Christian Tabart", "Le Grand 8", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) // Panthera conversion
+/* disp1 */GAME(1980, spidermn, 0, gts80_s, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "The Amazing Spider-Man", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* disp1 */GAME(1980, circusp, 0, gts80_s, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Circus", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* disp1 */GAME(1980, cntforce, 0, gts80_s, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Counterforce", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* disp1 */GAME(1980, starrace, 0, gts80_s, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Star Race", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* disp2 */GAME(1980, jamesb, 0, gts80_s, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "James Bond (Timed Play)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* disp2 */GAME(1980, jamesb2, jamesb, gts80_s, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "James Bond (3/5-Ball)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* cust */GAME(1980, timeline, 0, gts80_s, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Time Line", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* disp1 */GAME(1981, forceii, 0, gts80_s, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Force II", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* cust */GAME(1981, pnkpnthr, 0, gts80_s, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Pink Panther", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* disp1 */GAME(1981, marsp, 0, gts80_ss, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Mars - God of War", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* disp1 */GAME(1981, marspf, marsp, gts80_ss, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Mars - God of War (French speech)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* disp1 */GAME(1981, marspp, marsp, gts80_ss, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Mars - God of War (Prototype)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* disp1 */GAME(1981, vlcno_ax, 0, gts80_ss, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Volcano", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* disp1 */GAME(1981, vlcno_1c, 0, gts80_s, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Volcano (Sound Only set 1)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* disp1 */GAME(1981, vlcno_1b, vlcno_1c, gts80_s, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Volcano (Sound Only set 2)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* disp1 */GAME(1981, vlcno_1a, vlcno_1c, gts80_s, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Volcano (Sound Only set 3)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* disp2 */GAME(1981, blckhole, 0, gts80_ss, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Black Hole (Rev. 4)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* disp2 */GAME(1981, blckhole2, blckhole, gts80_ss, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Black Hole (Rev. 2)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* disp2 */GAME(1981, blckhols, 0, gts80_s, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Black Hole (Sound Only)", MACHINE_IS_SKELETON_MECHANICAL ) // MACHINE_SUPPORTS_SAVE crashes MAME at start
+/* disp2 */GAME(1982, hh, 0, gts80_hh, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Haunted House (Rev. 2)", MACHINE_IS_SKELETON_MECHANICAL ) // MACHINE_SUPPORTS_SAVE crashes MAME at start
+/* disp2 */GAME(1982, hh_1, hh, gts80_hh, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Haunted House (Rev. 1)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
+/* disp2 */GAME(1981, eclipse, 0, gts80_s, gts80, gts80_state, empty_init, ROT0, "Gottlieb", "Eclipse", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/gts80a.cpp b/src/mame/drivers/gts80a.cpp
index 84aa0c5ca58..ce4fcf4438a 100644
--- a/src/mame/drivers/gts80a.cpp
+++ b/src/mame/drivers/gts80a.cpp
@@ -2,16 +2,29 @@
// copyright-holders:Robbbert
/****************************************************************************************************************
- PINBALL
- Gottlieb System 80A
+PINBALL
+Gottlieb System 80A
- Same as system 80, except that the displays have 7 digits.
+Same as system 80, except that the displays have 7 digits.
- Same issues as gts80
+Most games start up and will accept credits, and the test mode works.
+
+Many games are multiball, and therefore may not respond further to inputs.
+
+Caveman is missing its joystick. Need the manual. The video-pinball interface has not been written.
+ If you turn on DIPS6,7,8, you can enter test mode, insert coins and start a game.
+ But once in-game, no inputs work.
+
+Rocky has a habit of locking up. Have to reboot the machine with F3.
+
+Sound is wrong in all games.
+
+Note: If DIP28 is set to Novelty, then Match doesn't work.
*****************************************************************************************************************/
#include "emu.h"
+#include "machine/input_merger.h"
#include "machine/genpin.h"
#include "audio/gottlieb.h"
#include "cpu/i86/i86.h"
@@ -22,49 +35,64 @@
#include "gts80a.lh"
#include "gts80a_caveman.lh"
+namespace {
+
class gts80a_state : public genpin_class
{
public:
gts80a_state(const machine_config &mconfig, device_type type, const char *tag)
: genpin_class(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
+ , m_riot1(*this, "riot1")
+ , m_riot2(*this, "riot2")
+ , m_riot3(*this, "riot3")
+ , m_io_dips(*this, "DSW%u", 0U)
+ , m_io_keyboard(*this, "X%u", 0U)
, m_r0_sound(*this, "r0sound")
, m_r1_sound(*this, "r1sound")
, m_digits(*this, "digit%u", 0U)
+ , m_io_outputs(*this, "out%u", 0U)
{ }
void gts80a(machine_config &config);
void gts80a_s(machine_config &config);
void gts80a_ss(machine_config &config);
-
- void init_gts80a();
+ DECLARE_INPUT_CHANGED_MEMBER(slam_w);
private:
- uint8_t port1a_r();
- uint8_t port2a_r();
- void port1b_w(uint8_t data);
- void port2a_w(uint8_t data);
- void port2b_w(uint8_t data);
- void port3a_w(uint8_t data);
- void port3b_w(offs_t offset, uint8_t data);
+ u8 port1a_r();
+ u8 port2a_r();
+ void port1b_w(u8 data);
+ void port2a_w(u8 data);
+ void port2b_w(u8 data);
+ void port3a_w(u8 data);
+ void port3b_w(u8 data);
void gts80a_map(address_map &map);
- uint8_t m_port2;
- uint8_t m_segment;
- uint8_t m_lamprow;
- uint8_t m_swrow;
+ u8 m_segment = 0;
+ u8 m_lamprow = 0;
+ u8 m_swrow = 0;
+ u8 m_soundex = 0;
+ u8 m_sol_state[9][2];
virtual void machine_reset() override;
- virtual void machine_start() override { m_digits.resolve(); }
- required_device<cpu_device> m_maincpu;
+ virtual void machine_start() override;
+ required_device<m6502_device> m_maincpu;
+ required_device<riot6532_device> m_riot1;
+ required_device<riot6532_device> m_riot2;
+ required_device<riot6532_device> m_riot3;
+ required_ioport_array<4> m_io_dips;
+ required_ioport_array<9> m_io_keyboard;
optional_device<gottlieb_sound_r0_device> m_r0_sound;
optional_device<gottlieb_sound_r1_device> m_r1_sound;
output_finder<60> m_digits;
+ output_finder<57> m_io_outputs; // 8 solenoids, 1 outhole, 48 lamps
};
void gts80a_state::gts80a_map(address_map &map)
{
map.global_mask(0x3fff);
map(0x0000, 0x017f).ram();
+ map(0x01cb, 0x01cb).lr8(NAME([] () { return 0xff; })); // continual read
map(0x0200, 0x027f).rw("riot1", FUNC(riot6532_device::read), FUNC(riot6532_device::write));
map(0x0280, 0x02ff).rw("riot2", FUNC(riot6532_device::read), FUNC(riot6532_device::write));
map(0x0300, 0x037f).rw("riot3", FUNC(riot6532_device::read), FUNC(riot6532_device::write));
@@ -75,230 +103,229 @@ void gts80a_state::gts80a_map(address_map &map)
}
static INPUT_PORTS_START( gts80a )
- PORT_START("DSW.0")
- PORT_DIPNAME( 0x80, 0x00, "SW 1")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x80, DEF_STR(On))
- PORT_DIPNAME( 0x40, 0x00, "SW 2")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x40, DEF_STR(On))
- PORT_DIPNAME( 0x20, 0x00, "SW 3")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x20, DEF_STR(On))
- PORT_DIPNAME( 0x10, 0x00, "SW 4")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x10, DEF_STR(On))
- PORT_DIPNAME( 0x08, 0x00, "SW 5")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x08, DEF_STR(On))
- PORT_DIPNAME( 0x04, 0x00, "SW 6")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x04, DEF_STR(On))
- PORT_DIPNAME( 0x02, 0x00, "SW 7")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x02, DEF_STR(On))
- PORT_DIPNAME( 0x01, 0x00, "SW 8")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x01, DEF_STR(On))
-
- PORT_START("DSW.1")
- PORT_DIPNAME( 0x80, 0x00, "SW 9")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x80, DEF_STR(On))
- PORT_DIPNAME( 0x40, 0x00, "SW 10")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x40, DEF_STR(On))
- PORT_DIPNAME( 0x20, 0x00, "SW 11")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x20, DEF_STR(On))
- PORT_DIPNAME( 0x10, 0x00, "SW 12")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x10, DEF_STR(On))
- PORT_DIPNAME( 0x08, 0x00, "SW 13")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x08, DEF_STR(On))
+ PORT_START("DSW0")
+ PORT_DIPNAME( 0x80, 0x80, "SW 01")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x80, DEF_STR(Off))
+ PORT_DIPNAME( 0x40, 0x40, "SW 02")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x40, DEF_STR(Off))
+ PORT_DIPNAME( 0x20, 0x20, "SW 03")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x20, DEF_STR(Off))
+ PORT_DIPNAME( 0x10, 0x10, "SW 04")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x10, DEF_STR(Off))
+ PORT_DIPNAME( 0x08, 0x08, "SW 05")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x08, DEF_STR(Off))
+ PORT_DIPNAME( 0x04, 0x04, "SW 06")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x04, DEF_STR(Off))
+ PORT_DIPNAME( 0x02, 0x02, "SW 07")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x02, DEF_STR(Off))
+ PORT_DIPNAME( 0x01, 0x01, "SW 08")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x01, DEF_STR(Off))
+
+ PORT_START("DSW1")
+ PORT_DIPNAME( 0x80, 0x80, "SW 09")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x80, DEF_STR(Off))
+ PORT_DIPNAME( 0x40, 0x40, "SW 10")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x40, DEF_STR(Off))
+ PORT_DIPNAME( 0x20, 0x20, "SW 11")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x20, DEF_STR(Off))
+ PORT_DIPNAME( 0x10, 0x10, "SW 12")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x10, DEF_STR(Off))
+ PORT_DIPNAME( 0x08, 0x08, "SW 13")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x08, DEF_STR(Off))
PORT_DIPNAME( 0x04, 0x00, "SW 14")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x04, DEF_STR(On))
- PORT_DIPNAME( 0x02, 0x02, "SW 15")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x02, DEF_STR(On))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x04, DEF_STR(Off))
+ PORT_DIPNAME( 0x02, 0x00, "SW 15")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x02, DEF_STR(Off))
PORT_DIPNAME( 0x01, 0x00, "SW 16")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x01, DEF_STR(On))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x01, DEF_STR(Off))
- PORT_START("DSW.2")
+ PORT_START("DSW2")
PORT_DIPNAME( 0x80, 0x80, "SW 17")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x80, DEF_STR(On))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x80, DEF_STR(Off))
PORT_DIPNAME( 0x40, 0x40, "SW 18")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x40, DEF_STR(On))
- PORT_DIPNAME( 0x20, 0x00, "SW 19")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x20, DEF_STR(On))
- PORT_DIPNAME( 0x10, 0x00, "SW 20")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x10, DEF_STR(On))
- PORT_DIPNAME( 0x08, 0x00, "SW 21")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x08, DEF_STR(On))
- PORT_DIPNAME( 0x04, 0x00, "SW 22")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x04, DEF_STR(On))
- PORT_DIPNAME( 0x02, 0x02, "SW 23")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x02, DEF_STR(On))
- PORT_DIPNAME( 0x01, 0x01, "SW 24")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x01, DEF_STR(On))
-
- PORT_START("DSW.3")
- PORT_DIPNAME( 0x80, 0x80, "SW 25")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x80, DEF_STR(On))
- PORT_DIPNAME( 0x40, 0x40, "SW 26")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x40, DEF_STR(On))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x40, DEF_STR(Off))
+ PORT_DIPNAME( 0x20, 0x20, "SW 19")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x20, DEF_STR(Off))
+ PORT_DIPNAME( 0x10, 0x10, "SW 20")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x10, DEF_STR(Off))
+ PORT_DIPNAME( 0x08, 0x08, "SW 21")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x08, DEF_STR(Off))
+ PORT_DIPNAME( 0x04, 0x04, "SW 22")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x04, DEF_STR(Off))
+ PORT_DIPNAME( 0x02, 0x00, "SW 23")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x02, DEF_STR(Off))
+ PORT_DIPNAME( 0x01, 0x00, "SW 24")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x01, DEF_STR(Off))
+
+ PORT_START("DSW3")
+ PORT_DIPNAME( 0x80, 0x00, "SW 25")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x80, DEF_STR(Off))
+ PORT_DIPNAME( 0x40, 0x00, "SW 26")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x40, DEF_STR(Off))
PORT_DIPNAME( 0x20, 0x20, "SW 27")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x20, DEF_STR(On))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x20, DEF_STR(Off))
PORT_DIPNAME( 0x10, 0x10, "SW 28")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x10, DEF_STR(On))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x10, DEF_STR(Off))
PORT_DIPNAME( 0x08, 0x08, "SW 29")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x08, DEF_STR(On))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x08, DEF_STR(Off))
PORT_DIPNAME( 0x04, 0x04, "SW 30")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x04, DEF_STR(On))
- PORT_DIPNAME( 0x02, 0x00, "SW 31")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x02, DEF_STR(On))
- PORT_DIPNAME( 0x01, 0x00, "SW 32")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x01, DEF_STR(On))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x04, DEF_STR(Off))
+ PORT_DIPNAME( 0x02, 0x02, "SW 31")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x02, DEF_STR(Off))
+ PORT_DIPNAME( 0x01, 0x01, "SW 32")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x01, DEF_STR(Off))
PORT_START("X0")
- PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("INP00")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("INP01")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("INP02")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("INP03")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("INP04")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("INP05")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP06")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Play/Test")
PORT_START("X1")
- 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_SERVICE1 )
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("INP10")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("INP11")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("INP12")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("INP13")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("INP14")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("INP15")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP16")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_START("X2")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_A)
- 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_COIN1 )
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("INP20")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("INP21")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("INP22")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME("INP23")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("INP24")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("INP25")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP26")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 )
+
+ PORT_START("X3")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("INP30")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("INP31")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("INP32")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("INP33")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("INP34")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("INP35")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP36")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN3 )
PORT_START("X4")
- 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_COIN2 )
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("INP40")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("INP41")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("INP42")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("INP43")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("INP44")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("INP45")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("INP46")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START )
+
+ PORT_START("X5")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("INP50")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("INP51")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("INP52")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("INP53")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME("INP54")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("INP55")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("INP56")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Tilt") // won't boot if closed
+
+ PORT_START("X6")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME("INP60")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("INP61")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("INP62")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("INP63")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("INP64")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_NAME("INP65")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("INP66")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Outhole")
+
+ PORT_START("X7")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("INP70")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("INP71")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("INP72")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("INP73")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("INP74")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("X8")
- 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_COMMA)
- 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_COIN3 )
-
- PORT_START("X10")
- 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_START )
-
- PORT_START("X20")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_K)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_8_PAD)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_9_PAD)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_BACKSPACE)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_ASTERISK)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_MINUS_PAD)
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_PLUS_PAD)
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_TILT ) // won't boot if closed
-
- PORT_START("X40")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_SLASH_PAD)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_ENTER_PAD)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_0_PAD)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_DEL_PAD)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_HOME)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_END)
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_PGUP)
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_X)
-
- PORT_START("X80")
- 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_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("Slam") PORT_CHANGED_MEMBER(DEVICE_SELF, gts80a_state, slam_w, 0)
INPUT_PORTS_END
-uint8_t gts80a_state::port1a_r()
+INPUT_CHANGED_MEMBER( gts80a_state::slam_w )
{
- char kbdrow[8];
- uint8_t data = 0;
- if ((m_lamprow < 4) && (m_segment==0x80))
- {
- sprintf(kbdrow,"DSW.%d",m_lamprow);
- data = ioport(kbdrow)->read();
- }
- else
- {
- sprintf(kbdrow,"X%X",m_swrow);
- data = ioport(kbdrow)->read();
- }
+ m_riot2->porta_in_set(newval ? 0x80 : 0, 0x80);
+}
- return data;
+u8 gts80a_state::port1a_r()
+{
+ u8 data = 0xff;
+ if ((m_lamprow < 4) && BIT(m_segment, 7))
+ data = m_io_dips[m_lamprow]->read();
+
+ for (u8 i = 0; i < 7; i++)
+ if (!BIT(m_swrow, i))
+ data &= m_io_keyboard[i]->read();
+
+ return data ^ 0xff; // inverted by Z14 (7400)
}
-uint8_t gts80a_state::port2a_r()
+u8 gts80a_state::port2a_r()
{
- return m_port2 | 0x80; // slam tilt off
+ return m_io_keyboard[8]->read(); // slam tilt
}
// sw strobes
-void gts80a_state::port1b_w(uint8_t data)
+void gts80a_state::port1b_w(u8 data)
{
- m_swrow = data;
+ m_swrow = data ^ 0xff; // inverted by Z11 (7404)
}
// schematic and pinmame say '1' is indicated by m_segment !bits 4,5,6, but it is !bit 7
-void gts80a_state::port2a_w(uint8_t data)
+void gts80a_state::port2a_w(u8 data)
{
- m_port2 = data;
- static const uint8_t patterns[16] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x58,0x4c,0x62,0x69,0x78,0 }; // 7448
+ static const u8 patterns[16] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x58,0x4c,0x62,0x69,0x78,0 }; // 7448
uint16_t seg1 = (uint16_t)patterns[m_segment & 15];
- uint16_t seg2 = bitswap<16>(seg1, 8, 8, 8, 8, 8, 8, 7, 7, 6, 6, 5, 4, 3, 2, 1, 0);
+ uint16_t seg2 = bitswap<10>(seg1, 7, 7, 6, 6, 5, 4, 3, 2, 1, 0);
switch (data & 0x70)
{
case 0x10: // player 1&2
@@ -317,35 +344,138 @@ void gts80a_state::port2a_w(uint8_t data)
}
//d0-3 bcd data; d4-6 = centre segment; d7 = dipsw enable
-void gts80a_state::port2b_w(uint8_t data)
+void gts80a_state::port2b_w(u8 data)
{
- m_segment = data;//printf("%s:%X ",machine().describe_context().c_str(),data);
+ m_segment = data;
}
-// solenoids
-void gts80a_state::port3a_w(uint8_t data)
+// solenoids and sound
+void gts80a_state::port3a_w(u8 data)
{
+ u8 i;
+ data ^= 0x1f; // Z27 inverter
+ // Sound
+ u8 sndcmd = data & 15;
+ if (BIT(data, 4)) // Z31
+ sndcmd = 0;
+
+ sndcmd ^= 15; // inverted again by Z13 on the A3 board
+ if (m_r0_sound && (sndcmd & 15))
+ m_r0_sound->write(sndcmd);
+ else
+ if (m_r1_sound)
+ m_r1_sound->write(sndcmd | m_soundex);
+
+ // Solenoids group 1
+ if (!BIT(data, 5))
+ for (i = 0; i < 4;i++)
+ m_sol_state[i][0] = (BIT(data, 0, 2) == i) ? 1 : 0;
+ else
+ for (i = 0; i < 4;i++)
+ m_sol_state[i][0] = 0;
+
+ // Solenoids group 2
+ if (!BIT(data, 6))
+ for (i = 0; i < 4;i++)
+ m_sol_state[i+4][0] = (BIT(data, 2, 2) == i) ? 1 : 0;
+ else
+ for (i = 4; i < 8;i++)
+ m_sol_state[i][0] = 0;
+
+ // Outhole
+ m_sol_state[8][0] = BIT(data, 7) ^ 1;
+
+ // Smooth solenoids
+ // Some solenoids get continuously pulsed, which is absorbed by the real thing, but
+ // causes issues for us. So we need to use only the first occurrence of a particular sound.
+ for (i = 0; i < 9; i++)
+ {
+ switch (m_sol_state[i][1])
+ {
+ case 0: // was off
+ if (m_sol_state[i][0] == 1) // was off, coming on
+ {
+ m_io_outputs[i] = 1;
+ m_sol_state[i][1] = 1; // remember
+ }
+ break;
+ case 1: // was on
+ if (m_sol_state[i][0] == 0) // was on, going off
+ {
+ m_io_outputs[i] = 0;
+ m_sol_state[i][1] = 0; // remember
+ }
+ else
+ m_io_outputs[i] = 0; // still on from before
+ break;
+ default:
+ m_sol_state[i][1] = 0;
+ break;
+ }
+ }
+ // Activate solenoids
+ for (i = 0; i < 9; i++)
+ {
+ bool state = m_io_outputs[i] ? 1 : 0;
+ switch (i)
+ {
+ case 2:
+ machine().bookkeeping().coin_counter_w(0, state);
+ break;
+ case 3:
+ machine().bookkeeping().coin_counter_w(1, state);
+ break;
+ case 6:
+ machine().bookkeeping().coin_counter_w(2, state);
+ break;
+ case 7:
+ if (state)
+ m_samples->start(0, 6); // knocker
+ break;
+ case 8:
+ if (state)
+ m_samples->start(0, 9); // outhole
+ break;
+ default:
+ break;
+ }
+ }
}
-//pb0-3 = sound; pb4-7 = lamprow
-void gts80a_state::port3b_w(offs_t offset, uint8_t data)
+// Lamps
+void gts80a_state::port3b_w(u8 data)
{
- uint8_t sndcmd = data & 15;
- m_lamprow = data >> 4;
- if (m_r0_sound)
- m_r0_sound->write(offset, sndcmd);
- if (m_r1_sound)
- m_r1_sound->write(sndcmd);
+ m_lamprow = BIT(data, 4, 4);
+ if (m_lamprow && (m_lamprow < 13))
+ for (u8 i = 0; i < 4; i++)
+ m_io_outputs[m_lamprow*4+i+5] = BIT(data, i);
+ m_soundex = m_io_outputs[18] << 4; // Sound16 line (there's a Sound32 line, but haven't found its source)
}
-void gts80a_state::machine_reset()
+void gts80a_state::machine_start()
{
+ genpin_class::machine_start();
+
+ m_digits.resolve();
+ m_io_outputs.resolve();
+
+ save_item(NAME(m_lamprow));
+ save_item(NAME(m_swrow));
+ save_item(NAME(m_segment));
+ save_item(NAME(m_soundex));
+ save_item(NAME(m_sol_state));
}
-void gts80a_state::init_gts80a()
+void gts80a_state::machine_reset()
{
+ genpin_class::machine_reset();
+ m_lamprow = 0;
+ m_swrow = 0;
+ m_segment = 0;
+ m_soundex = 0;
}
+
/* with Sound Board */
void gts80a_state::gts80a(machine_config &config)
{
@@ -353,32 +483,29 @@ void gts80a_state::gts80a(machine_config &config)
M6502(config, m_maincpu, XTAL(3'579'545)/4);
m_maincpu->set_addrmap(AS_PROGRAM, &gts80a_state::gts80a_map);
- NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); // must be 1
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* Video */
config.set_default_layout(layout_gts80a);
/* Devices */
- riot6532_device &riot1(RIOT6532(config, "riot1", XTAL(3'579'545)/4));
- riot1.in_pa_callback().set(FUNC(gts80a_state::port1a_r)); // sw_r
- //riot1.out_pa_callback().set(FUNC(gts80a_state::port1a_w));
- //riot1.in_pb_callback().set(FUNC(gts80a_state::port1b_r));
- riot1.out_pb_callback().set(FUNC(gts80a_state::port1b_w)); // sw_w
- riot1.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE);
-
- riot6532_device &riot2(RIOT6532(config, "riot2", XTAL(3'579'545)/4));
- riot2.in_pa_callback().set(FUNC(gts80a_state::port2a_r)); // pa7 - slam tilt
- riot2.out_pa_callback().set(FUNC(gts80a_state::port2a_w)); // digit select
- //riot2.in_pb_callback().set(FUNC(gts80a_state::port2b_r));
- riot2.out_pb_callback().set(FUNC(gts80a_state::port2b_w)); // seg
- riot2.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE);
-
- riot6532_device &riot3(RIOT6532(config, "riot3", XTAL(3'579'545)/4));
- //riot3.in_pa_callback().set(FUNC(gts80a_state::port3a_r));
- riot3.out_pa_callback().set(FUNC(gts80a_state::port3a_w)); // sol, snd
- //riot3.in_pb_callback().set(FUNC(gts80a_state::port3b_r));
- riot3.out_pb_callback().set(FUNC(gts80a_state::port3b_w)); // lamps
- riot3.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE);
+ RIOT6532(config, m_riot1, XTAL(3'579'545)/4);
+ m_riot1->in_pa_callback().set(FUNC(gts80a_state::port1a_r)); // sw_r
+ m_riot1->out_pb_callback().set(FUNC(gts80a_state::port1b_w)); // sw_w
+ m_riot1->irq_callback().set("irq", FUNC(input_merger_device::in_w<0>));
+
+ RIOT6532(config, m_riot2, XTAL(3'579'545)/4);
+ m_riot2->in_pa_callback().set(FUNC(gts80a_state::port2a_r)); // pa7 - slam tilt
+ m_riot2->out_pa_callback().set(FUNC(gts80a_state::port2a_w)); // digit select
+ m_riot2->out_pb_callback().set(FUNC(gts80a_state::port2b_w)); // seg
+ m_riot2->irq_callback().set("irq", FUNC(input_merger_device::in_w<1>));
+
+ RIOT6532(config, m_riot3, XTAL(3'579'545)/4);
+ m_riot3->out_pa_callback().set(FUNC(gts80a_state::port3a_w)); // sol, snd
+ m_riot3->out_pb_callback().set(FUNC(gts80a_state::port3b_w)); // lamps
+ m_riot3->irq_callback().set("irq", FUNC(input_merger_device::in_w<2>));
+
+ INPUT_MERGER_ANY_HIGH(config, "irq").output_handler().set_inputline("maincpu", m6502_device::IRQ_LINE); // wire-or'd
/* Sound */
genpin_audio(config);
@@ -388,17 +515,16 @@ void gts80a_state::gts80a(machine_config &config)
void gts80a_state::gts80a_s(machine_config &config)
{
gts80a(config);
- GOTTLIEB_SOUND_REV0(config, m_r0_sound, 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
+ GOTTLIEB_SOUND_REV0(config, m_r0_sound, 0).add_route(ALL_OUTPUTS, "speaker", 0.75);
}
-
void gts80a_state::gts80a_ss(machine_config &config)
{
gts80a(config);
- GOTTLIEB_SOUND_REV1(config, m_r1_sound, 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
- //GOTTLIEB_SOUND_REV1_VOTRAX(config, m_r1_sound, 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // votrax crashes
+ GOTTLIEB_SOUND_REV1_VOTRAX(config, m_r1_sound, 0).add_route(ALL_OUTPUTS, "speaker", 0.75);
}
+//******************* CAVEMAN ****************************************************************
class caveman_state : public gts80a_state
{
@@ -407,16 +533,14 @@ public:
: gts80a_state(mconfig, type, tag)
, m_videocpu(*this, "video_cpu")
, m_vram(*this, "vram")
-
{ }
+ void caveman(machine_config &config);
+private:
uint32_t screen_update_caveman(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
-
- void caveman(machine_config &config);
void video_io_map(address_map &map);
void video_map(address_map &map);
-private:
required_device<cpu_device> m_videocpu;
required_shared_ptr<uint8_t> m_vram;
};
@@ -430,10 +554,10 @@ uint32_t caveman_state::screen_update_caveman(screen_device &screen, bitmap_ind1
{
uint8_t pix = m_vram[count];
- bitmap.pix(y, x+0) = (pix >> 6)&0x3;
- bitmap.pix(y, x+1) = (pix >> 4)&0x3;
- bitmap.pix(y, x+2) = (pix >> 2)&0x3;
- bitmap.pix(y, x+3) = (pix >> 0)&0x3;
+ bitmap.pix(y, x+0) = BIT(pix, 6, 2);
+ bitmap.pix(y, x+1) = BIT(pix, 4, 2);
+ bitmap.pix(y, x+2) = BIT(pix, 2, 2);
+ bitmap.pix(y, x+3) = BIT(pix, 0, 2);
count++;
}
@@ -826,30 +950,31 @@ ROM_START(touchdn)
ROM_LOAD("688-s.snd", 0x0800, 0x0800, CRC(5e9988a6) SHA1(5f531491722d3c30cf4a7c17982813a7c548387a))
ROM_END
-
-/* cust */GAME( 1981, dvlsdre, 0, gts80a_ss, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Devil's Dare", MACHINE_IS_SKELETON_MECHANICAL)
-/* cust */GAME( 1981, dvlsdre2, 0, gts80a_s, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Devil's Dare (Sound Only)", MACHINE_IS_SKELETON_MECHANICAL)
-/* cust */GAME( 1982, rocky, 0, gts80a_ss, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Rocky", MACHINE_IS_SKELETON_MECHANICAL)
-/* cust */GAME( 1982, rockyf, rocky, gts80a_ss, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Rocky (French speech)", MACHINE_IS_SKELETON_MECHANICAL)
-/* cust */GAME( 1982, spirit, 0, gts80a_ss, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Spirit", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp3 */GAME( 1982, punk, 0, gts80a_ss, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Punk!", MACHINE_IS_SKELETON_MECHANICAL)
-/* cust */GAME( 1982, striker, 0, gts80a_ss, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Striker", MACHINE_IS_SKELETON_MECHANICAL)
-/* cust */GAME( 1983, krullp, 0, gts80a_ss, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Krull (Pinball)", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp3 */GAME( 1983, qbquest, 0, gts80a_ss, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Q*Bert's Quest", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp3 */GAME( 1983, sorbit, 0, gts80a_ss, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Super Orbit", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp3 */GAME( 1983, rflshdlx, 0, gts80a_ss, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Royal Flush Deluxe", MACHINE_IS_SKELETON_MECHANICAL)
-/* cust */GAME( 1983, goinnuts, 0, gts80a_ss, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Goin' Nuts", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp3 */GAME( 1983, amazonh, 0, gts80a_ss, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Amazon Hunt", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp3 */GAME( 1983, amazonha, amazonh, gts80a_ss, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Amazon Hunt (alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp3 */GAME( 1983, rackempp, 0, gts80a_s, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Rack 'em Up! (Pinball)", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp3 */GAME( 1983, raimfire, 0, gts80a_s, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Ready...Aim...Fire!", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp3 */GAME( 1984, jack2opn, 0, gts80a_s, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Jacks to Open", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp3 */GAME( 1984, touchdn, 0, gts80a_s, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Touchdown", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp3 */GAME( 1984, alienstr, 0, gts80a_s, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Alien Star", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp3 */GAME( 1984, thegames, 0, gts80a_s, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "The Games", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp3 */GAME( 1984, eldorado, 0, gts80a_s, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "El Dorado City of Gold", MACHINE_IS_SKELETON_MECHANICAL)
-/* disp3 */GAME( 1985, icefever, 0, gts80a_s, gts80a, gts80a_state, init_gts80a, ROT0, "Gottlieb", "Ice Fever", MACHINE_IS_SKELETON_MECHANICAL)
+} // Anonymous namespace
+
+/* cust */GAME( 1981, dvlsdre, 0, gts80a_ss, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Devil's Dare", MACHINE_IS_SKELETON_MECHANICAL)
+/* cust */GAME( 1981, dvlsdre2, 0, gts80a_s, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Devil's Dare (Sound Only)", MACHINE_IS_SKELETON_MECHANICAL)
+/* cust */GAME( 1982, rocky, 0, gts80a_ss, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Rocky", MACHINE_IS_SKELETON_MECHANICAL)
+/* cust */GAME( 1982, rockyf, rocky, gts80a_ss, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Rocky (French speech)", MACHINE_IS_SKELETON_MECHANICAL)
+/* cust */GAME( 1982, spirit, 0, gts80a_ss, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Spirit", MACHINE_IS_SKELETON_MECHANICAL)
+/* disp3 */GAME( 1982, punk, 0, gts80a_ss, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Punk!", MACHINE_IS_SKELETON_MECHANICAL)
+/* cust */GAME( 1982, striker, 0, gts80a_ss, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Striker", MACHINE_IS_SKELETON_MECHANICAL)
+/* cust */GAME( 1983, krullp, 0, gts80a_ss, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Krull (Pinball)", MACHINE_IS_SKELETON_MECHANICAL)
+/* disp3 */GAME( 1983, qbquest, 0, gts80a_ss, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Q*Bert's Quest", MACHINE_IS_SKELETON_MECHANICAL)
+/* disp3 */GAME( 1983, sorbit, 0, gts80a_ss, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Super Orbit", MACHINE_IS_SKELETON_MECHANICAL)
+/* disp3 */GAME( 1983, rflshdlx, 0, gts80a_ss, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Royal Flush Deluxe", MACHINE_IS_SKELETON_MECHANICAL)
+/* cust */GAME( 1983, goinnuts, 0, gts80a_ss, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Goin' Nuts", MACHINE_IS_SKELETON_MECHANICAL)
+/* disp3 */GAME( 1983, amazonh, 0, gts80a_ss, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Amazon Hunt", MACHINE_IS_SKELETON_MECHANICAL)
+/* disp3 */GAME( 1983, amazonha, amazonh, gts80a_ss, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Amazon Hunt (alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
+/* disp3 */GAME( 1983, rackempp, 0, gts80a_s, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Rack 'em Up! (Pinball)", MACHINE_IS_SKELETON_MECHANICAL)
+/* disp3 */GAME( 1983, raimfire, 0, gts80a_s, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Ready...Aim...Fire!", MACHINE_IS_SKELETON_MECHANICAL)
+/* disp3 */GAME( 1984, jack2opn, 0, gts80a_s, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Jacks to Open", MACHINE_IS_SKELETON_MECHANICAL)
+/* disp3 */GAME( 1984, touchdn, 0, gts80a_s, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Touchdown", MACHINE_IS_SKELETON_MECHANICAL)
+/* disp3 */GAME( 1984, alienstr, 0, gts80a_s, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Alien Star", MACHINE_IS_SKELETON_MECHANICAL)
+/* disp3 */GAME( 1984, thegames, 0, gts80a_s, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "The Games", MACHINE_IS_SKELETON_MECHANICAL)
+/* disp3 */GAME( 1984, eldorado, 0, gts80a_s, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "El Dorado City of Gold", MACHINE_IS_SKELETON_MECHANICAL)
+/* disp3 */GAME( 1985, icefever, 0, gts80a_s, gts80a, gts80a_state, empty_init, ROT0, "Gottlieb", "Ice Fever", MACHINE_IS_SKELETON_MECHANICAL)
/* custom (+video) */
-GAME( 1981, caveman, 0, caveman, caveman, caveman_state, init_gts80a, ROT0, "Gottlieb", "Caveman (Pinball/Video Combo, set 1)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME( 1981, cavemana, caveman, caveman, caveman, caveman_state, init_gts80a, ROT0, "Gottlieb", "Caveman (Pinball/Video Combo, set 2)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME( 1981, caveman, 0, caveman, caveman, caveman_state, empty_init, ROT0, "Gottlieb", "Caveman (Pinball/Video Combo, set 1)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME( 1981, cavemana, caveman, caveman, caveman, caveman_state, empty_init, ROT0, "Gottlieb", "Caveman (Pinball/Video Combo, set 2)", MACHINE_IS_SKELETON_MECHANICAL)
diff --git a/src/mame/drivers/gts80b.cpp b/src/mame/drivers/gts80b.cpp
index a89b767704e..7040fdc3484 100644
--- a/src/mame/drivers/gts80b.cpp
+++ b/src/mame/drivers/gts80b.cpp
@@ -2,18 +2,28 @@
// copyright-holders:Robbbert
/****************************************************************************************************************
- PINBALL
- Gottlieb System 80B
+PINBALL
+Gottlieb System 80B
- Same as system 80, except that the displays are 20-digit alphanumeric driven by Rockwell 10939/10941 chips.
+Same as system 80, except that the displays are 20-digit alphanumeric driven by Rockwell 10939/10941 chips.
- Nothing works.
+Some games start up and will accept credits, and the test mode works.
- PinMAME used for the display character generator.
+Most games are multiball, and therefore may not respond further to inputs.
+
+Sound is missing/wrong in all games.
+
+Some games have the slam switch as normally open instead of the usual closed.
+ A few of these games can be fooled into starting by holding down the 0 key for a few seconds.
+
+The test rom says U4 is faulty.
+
+PinMAME used for the display character generator.
*****************************************************************************************************************/
#include "emu.h"
+#include "machine/input_merger.h"
#include "machine/genpin.h"
#include "audio/gottlieb.h"
@@ -31,9 +41,15 @@ public:
gts80b_state(const machine_config &mconfig, device_type type, const char *tag)
: genpin_class(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
+ , m_riot1(*this, "riot1")
+ , m_riot2(*this, "riot2")
+ , m_riot3(*this, "riot3")
+ , m_io_dips(*this, "DSW%u", 0U)
+ , m_io_keyboard(*this, "X%u", 0U)
, m_r0_sound(*this, "r0sound")
, m_r1_sound(*this, "r1sound")
, m_digits(*this, "digit%u", 0U)
+ , m_io_outputs(*this, "out%u", 0U)
{ }
void gts80b_s2(machine_config &config);
@@ -42,240 +58,252 @@ public:
void gts80b_s1(machine_config &config);
void gts80b_s(machine_config &config);
void gts80b(machine_config &config);
-
- void init_gts80b();
-
-protected:
- virtual void machine_reset() override;
- virtual void machine_start() override { m_digits.resolve(); }
+ DECLARE_INPUT_CHANGED_MEMBER(slam_w);
private:
- uint8_t port1a_r();
- uint8_t port2a_r();
- void port1b_w(uint8_t data);
- void port2a_w(uint8_t data);
- void port2b_w(uint8_t data);
- void port3a_w(uint8_t data);
- void port3b_w(offs_t offset, uint8_t data);
+ u8 port1a_r();
+ u8 port2a_r();
+ void port1b_w(u8 data);
+ void port2a_w(u8 data);
+ void port2b_w(u8 data);
+ void port3a_w(u8 data);
+ void port3b_w(u8 data);
void gts80b_map(address_map &map);
- uint8_t m_dispcmd;
- uint8_t m_port2a;
- uint8_t m_port2b;
- uint8_t m_lamprow;
- uint8_t m_swrow;
+ u8 m_segment = 0;
+ u8 m_lamprow = 0;
+ u8 m_swrow = 0;
+ u8 m_soundex = 0;
+ u8 m_sol_state[9][2];
+ u8 m_dispcmd;
+ u8 m_port2b;
bool m_in_cmd_mode[2];
- uint8_t m_digit[2];
+ u8 m_digit[2];
- required_device<cpu_device> m_maincpu;
+ virtual void machine_reset() override;
+ virtual void machine_start() override;
+ required_device<m6502_device> m_maincpu;
+ required_device<riot6532_device> m_riot1;
+ required_device<riot6532_device> m_riot2;
+ required_device<riot6532_device> m_riot3;
+ required_ioport_array<4> m_io_dips;
+ required_ioport_array<9> m_io_keyboard;
optional_device<gottlieb_sound_r0_device> m_r0_sound;
optional_device<gottlieb_sound_r1_device> m_r1_sound;
output_finder<40> m_digits;
+ output_finder<57> m_io_outputs; // 8 solenoids, 1 outhole, 48 lamps
};
void gts80b_state::gts80b_map(address_map &map)
{
- map.global_mask(0x3fff);
- map(0x0000, 0x017f).ram();
- map(0x0200, 0x027f).rw("riot1", FUNC(riot6532_device::read), FUNC(riot6532_device::write));
- map(0x0280, 0x02ff).rw("riot2", FUNC(riot6532_device::read), FUNC(riot6532_device::write));
- map(0x0300, 0x037f).rw("riot3", FUNC(riot6532_device::read), FUNC(riot6532_device::write));
+ map.global_mask(0xbfff);
+ map(0x0000, 0x017f).mirror(0x8000).ram();
+ map(0x01cb, 0x01cb).lr8(NAME([] () { return 0xff; })); // continual read
+ map(0x0200, 0x027f).mirror(0x8000).rw("riot1", FUNC(riot6532_device::read), FUNC(riot6532_device::write));
+ map(0x0280, 0x02ff).mirror(0x8000).rw("riot2", FUNC(riot6532_device::read), FUNC(riot6532_device::write));
+ map(0x0300, 0x037f).mirror(0x8000).rw("riot3", FUNC(riot6532_device::read), FUNC(riot6532_device::write));
map(0x1000, 0x17ff).rom();
- map(0x1800, 0x18ff).ram().share("nvram"); // 5101L-1 256x4
+ map(0x1800, 0x18ff).mirror(0x8000).ram().share("nvram"); // 5101L-1 256x4
map(0x2000, 0x2fff).rom();
- map(0x3000, 0x3fff).rom();
+ map(0x3000, 0x3fff).mirror(0x8000).rom();
+ map(0x9000, 0x97ff).rom();
}
static INPUT_PORTS_START( gts80b )
- PORT_START("DSW.0")
- PORT_DIPNAME( 0x80, 0x00, "SW 1")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x80, DEF_STR(On))
- PORT_DIPNAME( 0x40, 0x00, "SW 2")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x40, DEF_STR(On))
- PORT_DIPNAME( 0x20, 0x00, "SW 3")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x20, DEF_STR(On))
- PORT_DIPNAME( 0x10, 0x00, "SW 4")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x10, DEF_STR(On))
- PORT_DIPNAME( 0x08, 0x00, "SW 5")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x08, DEF_STR(On))
- PORT_DIPNAME( 0x04, 0x00, "SW 6")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x04, DEF_STR(On))
- PORT_DIPNAME( 0x02, 0x00, "SW 7")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x02, DEF_STR(On))
- PORT_DIPNAME( 0x01, 0x00, "SW 8")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x01, DEF_STR(On))
-
- PORT_START("DSW.1")
- PORT_DIPNAME( 0x80, 0x00, "SW 9")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x80, DEF_STR(On))
- PORT_DIPNAME( 0x40, 0x00, "SW 10")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x40, DEF_STR(On))
- PORT_DIPNAME( 0x20, 0x00, "SW 11")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x20, DEF_STR(On))
- PORT_DIPNAME( 0x10, 0x00, "SW 12")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x10, DEF_STR(On))
- PORT_DIPNAME( 0x08, 0x00, "SW 13")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x08, DEF_STR(On))
+ PORT_START("DSW0")
+ PORT_DIPNAME( 0x80, 0x80, "SW 01")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x80, DEF_STR(Off))
+ PORT_DIPNAME( 0x40, 0x40, "SW 02")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x40, DEF_STR(Off))
+ PORT_DIPNAME( 0x20, 0x20, "SW 03")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x20, DEF_STR(Off))
+ PORT_DIPNAME( 0x10, 0x10, "SW 04")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x10, DEF_STR(Off))
+ PORT_DIPNAME( 0x08, 0x08, "SW 05")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x08, DEF_STR(Off))
+ PORT_DIPNAME( 0x04, 0x04, "SW 06")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x04, DEF_STR(Off))
+ PORT_DIPNAME( 0x02, 0x02, "SW 07")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x02, DEF_STR(Off))
+ PORT_DIPNAME( 0x01, 0x01, "SW 08")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x01, DEF_STR(Off))
+
+ PORT_START("DSW1")
+ PORT_DIPNAME( 0x80, 0x80, "SW 09")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x80, DEF_STR(Off))
+ PORT_DIPNAME( 0x40, 0x40, "SW 10")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x40, DEF_STR(Off))
+ PORT_DIPNAME( 0x20, 0x20, "SW 11")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x20, DEF_STR(Off))
+ PORT_DIPNAME( 0x10, 0x10, "SW 12")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x10, DEF_STR(Off))
+ PORT_DIPNAME( 0x08, 0x08, "SW 13")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x08, DEF_STR(Off))
PORT_DIPNAME( 0x04, 0x00, "SW 14")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x04, DEF_STR(On))
- PORT_DIPNAME( 0x02, 0x02, "SW 15")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x02, DEF_STR(On))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x04, DEF_STR(Off))
+ PORT_DIPNAME( 0x02, 0x00, "SW 15")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x02, DEF_STR(Off))
PORT_DIPNAME( 0x01, 0x00, "SW 16")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x01, DEF_STR(On))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x01, DEF_STR(Off))
- PORT_START("DSW.2")
+ PORT_START("DSW2")
PORT_DIPNAME( 0x80, 0x80, "SW 17")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x80, DEF_STR(On))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x80, DEF_STR(Off))
PORT_DIPNAME( 0x40, 0x40, "SW 18")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x40, DEF_STR(On))
- PORT_DIPNAME( 0x20, 0x00, "SW 19")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x20, DEF_STR(On))
- PORT_DIPNAME( 0x10, 0x00, "SW 20")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x10, DEF_STR(On))
- PORT_DIPNAME( 0x08, 0x00, "SW 21")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x08, DEF_STR(On))
- PORT_DIPNAME( 0x04, 0x00, "SW 22")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x04, DEF_STR(On))
- PORT_DIPNAME( 0x02, 0x02, "SW 23")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x02, DEF_STR(On))
- PORT_DIPNAME( 0x01, 0x01, "SW 24")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x01, DEF_STR(On))
-
- PORT_START("DSW.3")
- PORT_DIPNAME( 0x80, 0x80, "SW 25")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x80, DEF_STR(On))
- PORT_DIPNAME( 0x40, 0x40, "SW 26")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x40, DEF_STR(On))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x40, DEF_STR(Off))
+ PORT_DIPNAME( 0x20, 0x20, "SW 19")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x20, DEF_STR(Off))
+ PORT_DIPNAME( 0x10, 0x10, "SW 20")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x10, DEF_STR(Off))
+ PORT_DIPNAME( 0x08, 0x08, "SW 21")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x08, DEF_STR(Off))
+ PORT_DIPNAME( 0x04, 0x04, "SW 22")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x04, DEF_STR(Off))
+ PORT_DIPNAME( 0x02, 0x00, "SW 23")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x02, DEF_STR(Off))
+ PORT_DIPNAME( 0x01, 0x00, "SW 24")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x01, DEF_STR(Off))
+
+ PORT_START("DSW3")
+ PORT_DIPNAME( 0x80, 0x00, "SW 25")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x80, DEF_STR(Off))
+ PORT_DIPNAME( 0x40, 0x00, "SW 26")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x40, DEF_STR(Off))
PORT_DIPNAME( 0x20, 0x20, "SW 27")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x20, DEF_STR(On))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x20, DEF_STR(Off))
PORT_DIPNAME( 0x10, 0x10, "SW 28")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x10, DEF_STR(On))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x10, DEF_STR(Off))
PORT_DIPNAME( 0x08, 0x08, "SW 29")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x08, DEF_STR(On))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x08, DEF_STR(Off))
PORT_DIPNAME( 0x04, 0x04, "SW 30")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x04, DEF_STR(On))
- PORT_DIPNAME( 0x02, 0x00, "SW 31")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x02, DEF_STR(On))
- PORT_DIPNAME( 0x01, 0x00, "SW 32")
- PORT_DIPSETTING( 0x00, DEF_STR(Off))
- PORT_DIPSETTING( 0x01, DEF_STR(On))
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x04, DEF_STR(Off))
+ PORT_DIPNAME( 0x02, 0x02, "SW 31")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x02, DEF_STR(Off))
+ PORT_DIPNAME( 0x01, 0x01, "SW 32")
+ PORT_DIPSETTING( 0x00, DEF_STR(On))
+ PORT_DIPSETTING( 0x01, DEF_STR(Off))
PORT_START("X0")
- PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("INP00")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("INP01")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("INP02")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("INP03")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("INP04")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("INP05")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Left Advance Button")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Play/Test")
PORT_START("X1")
- 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_SERVICE1 )
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("INP10")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("INP11")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("INP12")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("INP13")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("INP14")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("INP15")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Right Advance Button")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_START("X2")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_A)
- 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_COIN1 )
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("INP20")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("INP21")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("INP22")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME("INP23")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("INP24")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("INP25")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP26")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 )
+
+ PORT_START("X3")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("INP30")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("INP31")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("INP32")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("INP33")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("INP34")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("INP35")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP36")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN3 )
PORT_START("X4")
- 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_COIN2 )
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("INP40")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("INP41")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("INP42")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("INP43")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("INP44")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("INP45")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("INP46")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START )
+
+ PORT_START("X5")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("INP50")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("INP51")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("INP52")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("INP53")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME("INP54")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("INP55")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("INP56")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Tilt") // won't boot if closed
+
+ PORT_START("X6")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME("INP60")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("INP61")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("INP62")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("INP63")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("INP64")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_NAME("INP65")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("INP66")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Outhole")
+
+ PORT_START("X7")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("INP70")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("INP71")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("INP72")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("INP73")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("INP74")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("X8")
- 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_COMMA)
- 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_COIN3 )
-
- PORT_START("X10")
- 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_START )
-
- PORT_START("X20")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_K)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_8_PAD)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_9_PAD)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_BACKSPACE)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_ASTERISK)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_MINUS_PAD)
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_PLUS_PAD)
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_TILT ) // won't boot if closed
-
- PORT_START("X40")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_SLASH_PAD)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_ENTER_PAD)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_0_PAD)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_DEL_PAD)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_HOME)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_END)
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_PGUP)
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_X)
-
- PORT_START("X80")
- 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_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("Slam") PORT_CHANGED_MEMBER(DEVICE_SELF, gts80b_state, slam_w, 0)
INPUT_PORTS_END
+INPUT_CHANGED_MEMBER( gts80b_state::slam_w )
+{
+ m_riot2->porta_in_set(newval ? 0x80 : 0, 0x80);
+}
+
static const uint16_t patterns[] = {
/* 0x00-0x07 */ 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
/* 0x08-0x0f */ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -295,38 +323,32 @@ static const uint16_t patterns[] = {
/* 0x78-0x7f */ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
};
-uint8_t gts80b_state::port1a_r()
+u8 gts80b_state::port1a_r()
{
- char kbdrow[8];
- uint8_t data = 0;
- if ((m_lamprow < 4) && (m_port2b==0x80))
- {
- sprintf(kbdrow,"DSW.%d",m_lamprow);
- data = ioport(kbdrow)->read();
- }
- else
- {
- sprintf(kbdrow,"X%X",m_swrow);
- data = ioport(kbdrow)->read();
- }
+ u8 data = 0xff;
+ if ((m_lamprow < 4) && BIT(m_segment, 7))
+ data = m_io_dips[m_lamprow]->read();
- return data;
+ for (u8 i = 0; i < 7; i++)
+ if (!BIT(m_swrow, i))
+ data &= m_io_keyboard[i]->read();
+
+ return data ^ 0xff; // inverted by Z14 (7400)
}
-uint8_t gts80b_state::port2a_r()
+u8 gts80b_state::port2a_r()
{
- return m_port2a | 0x80; // slam tilt off
+ return m_io_keyboard[8]->read(); // slam tilt
}
// sw strobes
-void gts80b_state::port1b_w(uint8_t data)
+void gts80b_state::port1b_w(u8 data)
{
- m_swrow = data;
+ m_swrow = data ^ 0xff; // inverted by Z11 (7404)
}
-void gts80b_state::port2a_w(uint8_t data)
+void gts80b_state::port2a_w(u8 data)
{
- m_port2a = data;
if (BIT(data, 4))
m_dispcmd = (m_dispcmd & 0xf0) | m_port2b;
if (BIT(data, 5))
@@ -334,13 +356,14 @@ void gts80b_state::port2a_w(uint8_t data)
}
//d0-3 data; d4-5 = which display enabled; d6 = display reset; d7 = dipsw enable
-void gts80b_state::port2b_w(uint8_t data)
+void gts80b_state::port2b_w(u8 data)
{
+ m_segment = data;
m_port2b = data & 15;
uint16_t segment;
// crude approximation of the Rockwell display chips
- for (uint8_t i = 0; i < 2; i++) // 2 chips
+ for (u8 i = 0; i < 2; i++) // 2 chips
{
if (!BIT(data, i+4)) // are we addressing the chip?
{
@@ -367,24 +390,130 @@ void gts80b_state::port2b_w(uint8_t data)
}
}
-// solenoids
-void gts80b_state::port3a_w(uint8_t data)
+// solenoids and sound
+void gts80b_state::port3a_w(u8 data)
+{
+ u8 i;
+ data ^= 0x1f; // Z27 inverter
+ // Sound
+ u8 sndcmd = data & 15;
+ if (BIT(data, 4)) // Z31
+ sndcmd = 0;
+
+ sndcmd ^= 15; // inverted again by Z13 on the A3 board
+ if (m_r0_sound && (sndcmd & 15))
+ m_r0_sound->write(sndcmd);
+ else
+ if (m_r1_sound)
+ m_r1_sound->write(sndcmd | m_soundex);
+
+ // Solenoids group 1
+ if (!BIT(data, 5))
+ for (i = 0; i < 4;i++)
+ m_sol_state[i][0] = (BIT(data, 0, 2) == i) ? 1 : 0;
+ else
+ for (i = 0; i < 4;i++)
+ m_sol_state[i][0] = 0;
+
+ // Solenoids group 2
+ if (!BIT(data, 6))
+ for (i = 0; i < 4;i++)
+ m_sol_state[i+4][0] = (BIT(data, 2, 2) == i) ? 1 : 0;
+ else
+ for (i = 4; i < 8;i++)
+ m_sol_state[i][0] = 0;
+
+ // Outhole
+ m_sol_state[8][0] = BIT(data, 7) ^ 1;
+
+ // Smooth solenoids
+ // Some solenoids get continuously pulsed, which is absorbed by the real thing, but
+ // causes issues for us. So we need to use only the first occurrence of a particular sound.
+ for (i = 0; i < 9; i++)
+ {
+ switch (m_sol_state[i][1])
+ {
+ case 0: // was off
+ if (m_sol_state[i][0] == 1) // was off, coming on
+ {
+ m_io_outputs[i] = 1;
+ m_sol_state[i][1] = 1; // remember
+ }
+ break;
+ case 1: // was on
+ if (m_sol_state[i][0] == 0) // was on, going off
+ {
+ m_io_outputs[i] = 0;
+ m_sol_state[i][1] = 0; // remember
+ }
+ else
+ m_io_outputs[i] = 0; // still on from before
+ break;
+ default:
+ m_sol_state[i][1] = 0;
+ break;
+ }
+ }
+ // Activate solenoids
+ for (i = 0; i < 9; i++)
+ {
+ bool state = m_io_outputs[i] ? 1 : 0;
+ switch (i)
+ {
+ case 2:
+ machine().bookkeeping().coin_counter_w(0, state);
+ break;
+ case 3:
+ machine().bookkeeping().coin_counter_w(1, state);
+ break;
+ case 6:
+ machine().bookkeeping().coin_counter_w(2, state);
+ break;
+ case 7:
+ if (state)
+ m_samples->start(0, 6); // knocker
+ break;
+ case 8:
+ if (state)
+ m_samples->start(0, 9); // outhole
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+// Lamps
+void gts80b_state::port3b_w(u8 data)
{
+ m_lamprow = BIT(data, 4, 4);
+ if (m_lamprow && (m_lamprow < 13))
+ for (u8 i = 0; i < 4; i++)
+ m_io_outputs[m_lamprow*4+i+5] = BIT(data, i);
+ m_soundex = m_io_outputs[18] << 4; // Sound16 line (there's a Sound32 line, but haven't found its source)
}
-//pb0-3 = sound; pb4-7 = lamprow
-void gts80b_state::port3b_w(offs_t offset, uint8_t data)
+void gts80b_state::machine_start()
{
- uint8_t sndcmd = data & 15;
- m_lamprow = data >> 4;
- if (m_r0_sound)
- m_r0_sound->write(offset, sndcmd);
- if (m_r1_sound)
- m_r1_sound->write(sndcmd);
+ genpin_class::machine_start();
+
+ m_digits.resolve();
+ m_io_outputs.resolve();
+
+ save_item(NAME(m_lamprow));
+ save_item(NAME(m_swrow));
+ save_item(NAME(m_segment));
+ save_item(NAME(m_soundex));
+ save_item(NAME(m_sol_state));
}
void gts80b_state::machine_reset()
{
+ genpin_class::machine_reset();
+ m_lamprow = 0;
+ m_swrow = 0;
+ m_segment = 0;
+ m_soundex = 0;
m_in_cmd_mode[0] = false;
m_in_cmd_mode[1] = false;
m_dispcmd = 0;
@@ -392,9 +521,6 @@ void gts80b_state::machine_reset()
m_digit[1] = 0;
}
-void gts80b_state::init_gts80b()
-{
-}
/* with Sound Board */
void gts80b_state::gts80b(machine_config &config)
@@ -403,7 +529,7 @@ void gts80b_state::gts80b(machine_config &config)
M6502(config, m_maincpu, XTAL(3'579'545)/4);
m_maincpu->set_addrmap(AS_PROGRAM, &gts80b_state::gts80b_map);
- NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); // must be 1
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* Video */
config.set_default_layout(layout_gts80b);
@@ -411,24 +537,21 @@ void gts80b_state::gts80b(machine_config &config)
/* Devices */
riot6532_device &riot1(RIOT6532(config, "riot1", XTAL(3'579'545)/4));
riot1.in_pa_callback().set(FUNC(gts80b_state::port1a_r)); // sw_r
- //riot1.out_pa_callback().set(FUNC(gts80b_state::port1a_w));
- //riot1.in_pb_callback().set(FUNC(gts80b_state::port1b_r));
riot1.out_pb_callback().set(FUNC(gts80b_state::port1b_w)); // sw_w
- riot1.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE);
+ riot1.irq_callback().set("irq", FUNC(input_merger_device::in_w<0>));
riot6532_device &riot2(RIOT6532(config, "riot2", XTAL(3'579'545)/4));
riot2.in_pa_callback().set(FUNC(gts80b_state::port2a_r)); // pa7 - slam tilt
riot2.out_pa_callback().set(FUNC(gts80b_state::port2a_w)); // digit select
- //riot2.in_pb_callback().set(FUNC(gts80b_state::port2b_r));
riot2.out_pb_callback().set(FUNC(gts80b_state::port2b_w)); // seg
- riot2.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE);
+ riot2.irq_callback().set("irq", FUNC(input_merger_device::in_w<1>));
riot6532_device &riot3(RIOT6532(config, "riot3", XTAL(3'579'545)/4));
- //riot3.in_pa_callback().set(FUNC(gts80b_state::port3a_r));
riot3.out_pa_callback().set(FUNC(gts80b_state::port3a_w)); // sol, snd
- //riot3.in_pb_callback().set(FUNC(gts80b_state::port3b_r));
riot3.out_pb_callback().set(FUNC(gts80b_state::port3b_w)); // lamps
- riot3.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE);
+ riot3.irq_callback().set("irq", FUNC(input_merger_device::in_w<2>));
+
+ INPUT_MERGER_ANY_HIGH(config, "irq").output_handler().set_inputline("maincpu", m6502_device::IRQ_LINE);
/* Sound */
genpin_audio(config);
@@ -438,14 +561,13 @@ void gts80b_state::gts80b(machine_config &config)
void gts80b_state::gts80b_s(machine_config &config)
{
gts80b(config);
- GOTTLIEB_SOUND_REV0(config, m_r0_sound, 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
+ GOTTLIEB_SOUND_REV0(config, m_r0_sound, 0).add_route(ALL_OUTPUTS, "speaker", 0.75);
}
//void gts80b_state::gts80b_ss(machine_config &config)
//{
// gts80b(config);
-// GOTTLIEB_SOUND_REV1(config, m_r1_sound, 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
-// //GOTTLIEB_SOUND_REV1_VOTRAX(config, m_r1_sound, 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // votrax crashes
+// GOTTLIEB_SOUND_REV1_VOTRAX(config, m_r1_sound, 0).add_route(ALL_OUTPUTS, "speaker", 0.75);
//}
void gts80b_state::gts80b_s1(machine_config &config)
@@ -1813,74 +1935,74 @@ ROM_END
} // Anonymous namespace
-GAME(1985, bountyh, 0, gts80b_s, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Bounty Hunter", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1985, bountyhg, bountyh, gts80b_s, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Bounty Hunter (German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1985, triplay, 0, gts80b_s, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Chicago Cubs' Triple Play", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1985, triplaya, triplay, gts80b_s, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Chicago Cubs' Triple Play (alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1985, triplayg, triplay, gts80b_s, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Chicago Cubs' Triple Play (German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1985, rock, 0, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Rock", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1985, rockg, rock, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Rock (German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1985, tagteamp, 0, gts80b_s, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Tag-Team Wrestling", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1985, tagteampg, tagteamp, gts80b_s, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Tag-Team Wrestling (German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1985, tagteamp2, tagteamp, gts80b_s, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Tag-Team Wrestling (rev.2)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1986, raven, 0, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Raven", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1986, ravena, raven, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Raven (alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1986, raveng, raven, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Raven (German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1986, hlywoodh, 0, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Hollywood Heat", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1986, hlywoodhf, hlywoodh, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Hollywood Heat (French)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1986, hlywoodhg, hlywoodh, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Hollywood Heat (German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1986, rock_enc, rock, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Rock Encore", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1986, rock_encg, rock, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Rock Encore (German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1986, genesisp, 0, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Genesis", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1986, genesispf, genesisp, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Genesis (French)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1986, genesispg, genesisp, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Genesis (German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, amazonh2, 0, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Amazon Hunt II (French)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, sprbreak, 0, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Spring Break", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, sprbreaka, sprbreak, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Spring Break (alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, sprbreakf, sprbreak, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Spring Break (French)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, sprbreakg, sprbreak, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Spring Break (German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, sprbreaks, sprbreak, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Spring Break (single ball game)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1986, goldwing, 0, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Gold Wings", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1986, goldwingf, goldwing, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Gold Wings (French)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1986, goldwingg, goldwing, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Gold Wings (German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, mntecrlo, 0, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Monte Carlo (Pinball)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, mntecrloa, mntecrlo, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Monte Carlo (Pinball, alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, mntecrlof, mntecrlo, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Monte Carlo (Pinball, French)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, mntecrlog, mntecrlo, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Monte Carlo (Pinball, German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, mntecrlo2, mntecrlo, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Monte Carlo (Pinball, rev. 2)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, arena, 0, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Arena", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, arenaa, arena, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Arena (alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, arenaf, arena, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Arena (French)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, arenag, arena, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Arena (German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, victoryp, 0, gts80b_s2, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Victory (Pinball)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, victorypf, victoryp, gts80b_s2, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Victory (Pinball, French)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, victorypg, victoryp, gts80b_s2, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Victory (Pinball, German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1988, diamondp, 0, gts80b_s2, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Diamond Lady", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1988, diamondpf, diamondp, gts80b_s2, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Diamond Lady (French)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1988, diamondpg, diamondp, gts80b_s2, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Diamond Lady (German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1988, txsector, 0, gts80b_s2, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "TX-Sector", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1988, txsectorf, txsector, gts80b_s2, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "TX-Sector (French)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1988, txsectorg, txsector, gts80b_s2, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "TX-Sector (German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1989, bighouse, 0, gts80b_s3, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Big House", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1989, bighousef, bighouse, gts80b_s3, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Big House (French)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1989, bighouseg, bighouse, gts80b_s3, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Big House (German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1988, robowars, 0, gts80b_s2, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Robo-War", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1988, robowarsf, robowars, gts80b_s2, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Robo-War (French)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1988, excalibr, 0, gts80b_s3, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Excalibur", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1988, excalibrf, excalibr, gts80b_s3, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Excalibur (French)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1988, excalibrg, excalibr, gts80b_s3, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Excalibur (German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1988, badgirls, 0, gts80b_s3, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Bad Girls", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1988, badgirlsf, badgirls, gts80b_s3, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Bad Girls (French)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1988, badgirlsg, badgirls, gts80b_s3, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Bad Girls (German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1989, hotshots, 0, gts80b_s2, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Hot Shots", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1989, hotshotsf, hotshots, gts80b_s2, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Hot Shots (French)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1989, hotshotsg, hotshots, gts80b_s2, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Hot Shots (German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1989, bonebstr, 0, bonebstr, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Bone Busters Inc.", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1989, bonebstrf, bonebstr, bonebstr, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Bone Busters Inc. (French)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1989, bonebstrg, bonebstr, bonebstr, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Bone Busters Inc. (German)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1989, nmoves, 0, gts80b_s2, gts80b, gts80b_state, init_gts80b, ROT0, "International Concepts", "Night Moves", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, amazonh3, 0, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Amazon Hunt III (French)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1987, amazonh3a, amazonh3, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Amazon Hunt III (rev. 1, French)", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(198?, s80btest, 0, gts80b_s2, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "System 80B Test", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1988, mmmaster, 0, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "ManilaMatic", "Master", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1988, topsound, 0, gts80b_s1, gts80b, gts80b_state, init_gts80b, ROT0, "ManilaMatic", "Top Sound (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1985, bountyh, 0, gts80b_s, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Bounty Hunter", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1985, bountyhg, bountyh, gts80b_s, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Bounty Hunter (German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1985, triplay, 0, gts80b_s, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Chicago Cubs' Triple Play", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1985, triplaya, triplay, gts80b_s, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Chicago Cubs' Triple Play (alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1985, triplayg, triplay, gts80b_s, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Chicago Cubs' Triple Play (German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1985, rock, 0, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Rock", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1985, rockg, rock, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Rock (German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1985, tagteamp, 0, gts80b_s, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Tag-Team Wrestling", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1985, tagteampg, tagteamp, gts80b_s, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Tag-Team Wrestling (German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1985, tagteamp2, tagteamp, gts80b_s, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Tag-Team Wrestling (rev.2)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, raven, 0, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Raven", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, ravena, raven, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Raven (alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, raveng, raven, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Raven (German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, hlywoodh, 0, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Hollywood Heat", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, hlywoodhf, hlywoodh, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Hollywood Heat (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, hlywoodhg, hlywoodh, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Hollywood Heat (German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, rock_enc, rock, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Rock Encore", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, rock_encg, rock, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Rock Encore (German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, genesisp, 0, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Genesis", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, genesispf, genesisp, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Genesis (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, genesispg, genesisp, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Genesis (German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, amazonh2, 0, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Amazon Hunt II (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, sprbreak, 0, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Spring Break", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, sprbreaka, sprbreak, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Spring Break (alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, sprbreakf, sprbreak, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Spring Break (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, sprbreakg, sprbreak, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Spring Break (German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, sprbreaks, sprbreak, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Spring Break (single ball game)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, goldwing, 0, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Gold Wings", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, goldwingf, goldwing, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Gold Wings (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, goldwingg, goldwing, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Gold Wings (German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, mntecrlo, 0, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Monte Carlo (Pinball)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, mntecrloa, mntecrlo, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Monte Carlo (Pinball, alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, mntecrlof, mntecrlo, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Monte Carlo (Pinball, French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, mntecrlog, mntecrlo, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Monte Carlo (Pinball, German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, mntecrlo2, mntecrlo, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Monte Carlo (Pinball, rev. 2)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, arena, 0, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Arena", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, arenaa, arena, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Arena (alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, arenaf, arena, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Arena (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, arenag, arena, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Arena (German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, victoryp, 0, gts80b_s2, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Victory (Pinball)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, victorypf, victoryp, gts80b_s2, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Victory (Pinball, French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, victorypg, victoryp, gts80b_s2, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Victory (Pinball, German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, diamondp, 0, gts80b_s2, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Diamond Lady", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, diamondpf, diamondp, gts80b_s2, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Diamond Lady (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, diamondpg, diamondp, gts80b_s2, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Diamond Lady (German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, txsector, 0, gts80b_s2, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "TX-Sector", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, txsectorf, txsector, gts80b_s2, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "TX-Sector (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, txsectorg, txsector, gts80b_s2, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "TX-Sector (German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1989, bighouse, 0, gts80b_s3, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Big House", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1989, bighousef, bighouse, gts80b_s3, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Big House (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1989, bighouseg, bighouse, gts80b_s3, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Big House (German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, robowars, 0, gts80b_s2, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Robo-War", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, robowarsf, robowars, gts80b_s2, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Robo-War (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, excalibr, 0, gts80b_s3, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Excalibur", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, excalibrf, excalibr, gts80b_s3, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Excalibur (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, excalibrg, excalibr, gts80b_s3, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Excalibur (German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, badgirls, 0, gts80b_s3, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Bad Girls", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, badgirlsf, badgirls, gts80b_s3, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Bad Girls (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, badgirlsg, badgirls, gts80b_s3, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Bad Girls (German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1989, hotshots, 0, gts80b_s2, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Hot Shots", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1989, hotshotsf, hotshots, gts80b_s2, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Hot Shots (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1989, hotshotsg, hotshots, gts80b_s2, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Hot Shots (German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1989, bonebstr, 0, bonebstr, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Bone Busters Inc.", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1989, bonebstrf, bonebstr, bonebstr, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Bone Busters Inc. (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1989, bonebstrg, bonebstr, bonebstr, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Bone Busters Inc. (German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1989, nmoves, 0, gts80b_s2, gts80b, gts80b_state, empty_init, ROT0, "International Concepts", "Night Moves", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, amazonh3, 0, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Amazon Hunt III (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, amazonh3a, amazonh3, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Amazon Hunt III (rev. 1, French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(198?, s80btest, 0, gts80b_s2, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "System 80B Test", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, mmmaster, 0, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "ManilaMatic", "Master", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, topsound, 0, gts80b_s1, gts80b, gts80b_state, empty_init, ROT0, "ManilaMatic", "Top Sound (French)", MACHINE_IS_SKELETON_MECHANICAL)
diff --git a/src/mame/layout/gts80a.lay b/src/mame/layout/gts80a.lay
index 9a87b6c7cdd..548c385be00 100644
--- a/src/mame/layout/gts80a.lay
+++ b/src/mame/layout/gts80a.lay
@@ -36,94 +36,94 @@ copyright-holders:Robbbert
<!-- Player 1 Score -->
- <element name="digit15" ref="digit">
+ <element name="digit5" ref="digit">
<bounds left="10" top="45" right="44" bottom="84" />
</element>
- <element name="digit5" ref="digit">
+ <element name="digit4" ref="digit">
<bounds left="54" top="45" right="88" bottom="84" />
</element>
- <element name="digit4" ref="digit">
+ <element name="digit3" ref="digit">
<bounds left="98" top="45" right="132" bottom="84" />
</element>
- <element name="digit3" ref="digit">
+ <element name="digit2" ref="digit">
<bounds left="142" top="45" right="176" bottom="84" />
</element>
- <element name="digit2" ref="digit">
+ <element name="digit1" ref="digit">
<bounds left="186" top="45" right="220" bottom="84" />
</element>
- <element name="digit1" ref="digit">
+ <element name="digit0" ref="digit">
<bounds left="230" top="45" right="264" bottom="84" />
</element>
- <element name="digit0" ref="digit">
+ <element name="digit15" ref="digit">
<bounds left="274" top="45" right="308" bottom="84" />
</element>
<!-- Player 2 Score -->
- <element name="digit12" ref="digit">
+ <element name="digit11" ref="digit">
<bounds left="10" top="105" right="44" bottom="144" />
</element>
- <element name="digit11" ref="digit">
+ <element name="digit10" ref="digit">
<bounds left="54" top="105" right="88" bottom="144" />
</element>
- <element name="digit10" ref="digit">
+ <element name="digit9" ref="digit">
<bounds left="98" top="105" right="132" bottom="144" />
</element>
- <element name="digit9" ref="digit">
+ <element name="digit8" ref="digit">
<bounds left="142" top="105" right="176" bottom="144" />
</element>
- <element name="digit8" ref="digit">
+ <element name="digit7" ref="digit">
<bounds left="186" top="105" right="220" bottom="144" />
</element>
- <element name="digit7" ref="digit">
+ <element name="digit6" ref="digit">
<bounds left="230" top="105" right="264" bottom="144" />
</element>
- <element name="digit6" ref="digit">
+ <element name="digit12" ref="digit">
<bounds left="274" top="105" right="308" bottom="144" />
</element>
<!-- Player 3 Score -->
- <element name="digit35" ref="digit">
+ <element name="digit25" ref="digit">
<bounds left="10" top="165" right="44" bottom="204" />
</element>
- <element name="digit25" ref="digit">
+ <element name="digit24" ref="digit">
<bounds left="54" top="165" right="88" bottom="204" />
</element>
- <element name="digit24" ref="digit">
+ <element name="digit23" ref="digit">
<bounds left="98" top="165" right="132" bottom="204" />
</element>
- <element name="digit23" ref="digit">
+ <element name="digit22" ref="digit">
<bounds left="142" top="165" right="176" bottom="204" />
</element>
- <element name="digit22" ref="digit">
+ <element name="digit21" ref="digit">
<bounds left="186" top="165" right="220" bottom="204" />
</element>
- <element name="digit21" ref="digit">
+ <element name="digit20" ref="digit">
<bounds left="230" top="165" right="264" bottom="204" />
</element>
- <element name="digit20" ref="digit">
+ <element name="digit35" ref="digit">
<bounds left="274" top="165" right="308" bottom="204" />
</element>
<!-- Player 4 Score -->
- <element name="digit32" ref="digit">
+ <element name="digit31" ref="digit">
<bounds left="10" top="225" right="44" bottom="264" />
</element>
- <element name="digit31" ref="digit">
+ <element name="digit30" ref="digit">
<bounds left="54" top="225" right="88" bottom="264" />
</element>
- <element name="digit30" ref="digit">
+ <element name="digit29" ref="digit">
<bounds left="98" top="225" right="132" bottom="264" />
</element>
- <element name="digit29" ref="digit">
+ <element name="digit28" ref="digit">
<bounds left="142" top="225" right="176" bottom="264" />
</element>
- <element name="digit28" ref="digit">
+ <element name="digit27" ref="digit">
<bounds left="186" top="225" right="220" bottom="264" />
</element>
- <element name="digit27" ref="digit">
+ <element name="digit26" ref="digit">
<bounds left="230" top="225" right="264" bottom="264" />
</element>
- <element name="digit26" ref="digit">
+ <element name="digit32" ref="digit">
<bounds left="274" top="225" right="308" bottom="264" />
</element>
diff --git a/src/mame/layout/gts80a_caveman.lay b/src/mame/layout/gts80a_caveman.lay
index ea39780fc8f..7b3690b5241 100644
--- a/src/mame/layout/gts80a_caveman.lay
+++ b/src/mame/layout/gts80a_caveman.lay
@@ -31,94 +31,94 @@ copyright-holders:Robbbert
<!-- Player 1 Score -->
- <element name="digit15" ref="digit">
+ <element name="digit5" ref="digit">
<bounds left="10" top="45" right="44" bottom="84" />
</element>
- <element name="digit5" ref="digit">
+ <element name="digit4" ref="digit">
<bounds left="54" top="45" right="88" bottom="84" />
</element>
- <element name="digit4" ref="digit">
+ <element name="digit3" ref="digit">
<bounds left="98" top="45" right="132" bottom="84" />
</element>
- <element name="digit3" ref="digit">
+ <element name="digit2" ref="digit">
<bounds left="142" top="45" right="176" bottom="84" />
</element>
- <element name="digit2" ref="digit">
+ <element name="digit1" ref="digit">
<bounds left="186" top="45" right="220" bottom="84" />
</element>
- <element name="digit1" ref="digit">
+ <element name="digit0" ref="digit">
<bounds left="230" top="45" right="264" bottom="84" />
</element>
- <element name="digit0" ref="digit">
+ <element name="digit15" ref="digit">
<bounds left="274" top="45" right="308" bottom="84" />
</element>
<!-- Player 2 Score -->
- <element name="digit12" ref="digit">
+ <element name="digit11" ref="digit">
<bounds left="10" top="105" right="44" bottom="144" />
</element>
- <element name="digit11" ref="digit">
+ <element name="digit10" ref="digit">
<bounds left="54" top="105" right="88" bottom="144" />
</element>
- <element name="digit10" ref="digit">
+ <element name="digit9" ref="digit">
<bounds left="98" top="105" right="132" bottom="144" />
</element>
- <element name="digit9" ref="digit">
+ <element name="digit8" ref="digit">
<bounds left="142" top="105" right="176" bottom="144" />
</element>
- <element name="digit8" ref="digit">
+ <element name="digit7" ref="digit">
<bounds left="186" top="105" right="220" bottom="144" />
</element>
- <element name="digit7" ref="digit">
+ <element name="digit6" ref="digit">
<bounds left="230" top="105" right="264" bottom="144" />
</element>
- <element name="digit6" ref="digit">
+ <element name="digit12" ref="digit">
<bounds left="274" top="105" right="308" bottom="144" />
</element>
<!-- Player 3 Score -->
- <element name="digit35" ref="digit">
+ <element name="digit25" ref="digit">
<bounds left="10" top="165" right="44" bottom="204" />
</element>
- <element name="digit25" ref="digit">
+ <element name="digit24" ref="digit">
<bounds left="54" top="165" right="88" bottom="204" />
</element>
- <element name="digit24" ref="digit">
+ <element name="digit23" ref="digit">
<bounds left="98" top="165" right="132" bottom="204" />
</element>
- <element name="digit23" ref="digit">
+ <element name="digit22" ref="digit">
<bounds left="142" top="165" right="176" bottom="204" />
</element>
- <element name="digit22" ref="digit">
+ <element name="digit21" ref="digit">
<bounds left="186" top="165" right="220" bottom="204" />
</element>
- <element name="digit21" ref="digit">
+ <element name="digit20" ref="digit">
<bounds left="230" top="165" right="264" bottom="204" />
</element>
- <element name="digit20" ref="digit">
+ <element name="digit35" ref="digit">
<bounds left="274" top="165" right="308" bottom="204" />
</element>
<!-- Player 4 Score -->
- <element name="digit32" ref="digit">
+ <element name="digit31" ref="digit">
<bounds left="10" top="225" right="44" bottom="264" />
</element>
- <element name="digit31" ref="digit">
+ <element name="digit30" ref="digit">
<bounds left="54" top="225" right="88" bottom="264" />
</element>
- <element name="digit30" ref="digit">
+ <element name="digit29" ref="digit">
<bounds left="98" top="225" right="132" bottom="264" />
</element>
- <element name="digit29" ref="digit">
+ <element name="digit28" ref="digit">
<bounds left="142" top="225" right="176" bottom="264" />
</element>
- <element name="digit28" ref="digit">
+ <element name="digit27" ref="digit">
<bounds left="186" top="225" right="220" bottom="264" />
</element>
- <element name="digit27" ref="digit">
+ <element name="digit26" ref="digit">
<bounds left="230" top="225" right="264" bottom="264" />
</element>
- <element name="digit26" ref="digit">
+ <element name="digit32" ref="digit">
<bounds left="274" top="225" right="308" bottom="264" />
</element>