gst80,gts80a,gts80b: WIP. Some games can be played.

This commit is contained in:
Robbbert 2021-10-18 13:36:22 +11:00
parent 1a5fe419c2
commit 2c82ebae0d
7 changed files with 1326 additions and 945 deletions

View File

@ -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));
}

View File

@ -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);

View File

@ -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("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("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("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_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("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("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_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();
}
return data;
m_riot2->porta_in_set(newval ? 0x80 : 0, 0x80);
}
uint8_t gts80_state::port2a_r()
u8 gts80_state::port1a_r()
{
return m_port2 | 0x80; // slam tilt off
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)
}
u8 gts80_state::port2a_r()
{
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,34 +351,137 @@ 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;
//pb0-3 = sound; pb4-7 = lamprow
void gts80_state::port3b_w(offs_t offset, uint8_t data)
{
uint8_t sndcmd = data & 15;
m_lamprow = data >> 4;
if (m_r0_sound)
m_r0_sound->write(offset, sndcmd);
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_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 gts80_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)
}
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::machine_reset()
{
genpin_class::machine_reset();
m_lamprow = 0;
m_swrow = 0;
m_segment = 0;
m_soundex = 0;
}
void gts80_state::init_gts80()
{
}
/* 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(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_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(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_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_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(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, 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(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 )

View File

@ -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("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("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("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_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("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_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();
}
return data;
m_riot2->porta_in_set(newval ? 0x80 : 0, 0x80);
}
uint8_t gts80a_state::port2a_r()
u8 gts80a_state::port1a_r()
{
return m_port2 | 0x80; // slam tilt off
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)
}
u8 gts80a_state::port2a_r()
{
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,34 +344,137 @@ 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;
//pb0-3 = sound; pb4-7 = lamprow
void gts80a_state::port3b_w(offs_t offset, uint8_t data)
{
uint8_t sndcmd = data & 15;
m_lamprow = data >> 4;
if (m_r0_sound)
m_r0_sound->write(offset, sndcmd);
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_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 gts80a_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)
}
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::machine_reset()
{
genpin_class::machine_reset();
m_lamprow = 0;
m_swrow = 0;
m_segment = 0;
m_soundex = 0;
}
void gts80a_state::init_gts80a()
{
}
/* 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(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_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(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_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_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")
{ }
uint32_t screen_update_caveman(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void caveman(machine_config &config);
private:
uint32_t screen_update_caveman(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
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
} // Anonymous namespace
/* 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)
/* 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)

View File

@ -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("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("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("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_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("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_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;
}
}
}
//pb0-3 = sound; pb4-7 = lamprow
void gts80b_state::port3b_w(offs_t offset, uint8_t data)
// Lamps
void gts80b_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 gts80b_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 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)

View File

@ -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>

View File

@ -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>