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 // 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 // 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; uint8_t pb4_7 = ioport("SB0")->read() & 0x90;
m_sndcmd = pb0_3 | pb4_7; 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) void gottlieb_sound_r0_device::gottlieb_sound_r0_map(address_map &map)
{ {
map.global_mask(0x0fff); map.global_mask(0x0fff);
map(0x0000, 0x003f).ram().mirror(0x1c0); map.unmap_value_high();
map(0x0200, 0x020f).rw(m_r6530, FUNC(mos6530_device::read), FUNC(mos6530_device::write)); map(0x0000, 0x017f).ram();
map(0x0200, 0x03ff).rw(m_r6530, FUNC(mos6530_device::read), FUNC(mos6530_device::write));
map(0x0400, 0x0fff).rom(); 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 ) INPUT_PORTS_START( gottlieb_sound_r0 )
PORT_START("SB0") 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( 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_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Attract") PORT_CODE(KEYCODE_F1) PORT_TOGGLE PORT_DIPNAME( 0x10, 0x00, "Sound during game" )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Music") PORT_CODE(KEYCODE_F2) PORT_TOGGLE 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 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 ) INPUT_CHANGED_MEMBER( gottlieb_sound_r0_device::audio_nmi )
{ {
// Diagnostic button sends a pulse to NMI pin // 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() 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); gottlieb_sound_r0_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
// read/write // read/write
void write(offs_t offset, uint8_t data); void write(uint8_t data);
// internal communications // internal communications
DECLARE_INPUT_CHANGED_MEMBER(audio_nmi); DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);

View File

@ -2,29 +2,42 @@
// copyright-holders:Robbbert // copyright-holders:Robbbert
/*********************************************************************************************************** /***********************************************************************************************************
PINBALL PINBALL
Gottlieb System 80 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: Status:
- Games boot up, score alternates between 0 and high score (currently blank as there is no high score yet) - Machines boot up, coins can be inserted, and a game begun.
- Dips are read and stored to ram - These work: Panthera, Grand8, Spiderman, Circus, Counterforce, Star Race, James Bond, Timeline, Marspf,
- Switches are not being read, therefore unable to play, or enter setup/test menu Haunted House.
- Original sound card added, it continuously produces weird noises
- 2nd version of sound card not coded yet 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: ToDO:
- Switches - Sounds are not correct. The games only seem to use 2 or 3 sounds each.
- Outputs - The Sound & Speech board has extra control lines (Sound16 and Sound32). Sound16 comes from a lamp output,
- Mechanical sounds while Sound32 hasn't been tracked down yet.
- Sound - None of the "talking" machines talk.
************************************************************************************************************/ ************************************************************************************************************/
#include "emu.h" #include "emu.h"
#include "machine/input_merger.h"
#include "machine/genpin.h" #include "machine/genpin.h"
#include "audio/gottlieb.h" #include "audio/gottlieb.h"
#include "speaker.h" #include "speaker.h"
@ -36,44 +49,57 @@ public:
gts80_state(const machine_config &mconfig, device_type type, const char *tag) gts80_state(const machine_config &mconfig, device_type type, const char *tag)
: genpin_class(mconfig, type, tag) : genpin_class(mconfig, type, tag)
, m_maincpu(*this, "maincpu") , 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_r0_sound(*this, "r0sound")
, m_r1_sound(*this, "r1sound") , m_r1_sound(*this, "r1sound")
, m_digits(*this, "digit%u", 0U) , m_digits(*this, "digit%u", 0U)
, m_io_outputs(*this, "out%u", 0U)
{ } { }
void gts80(machine_config &config); void gts80(machine_config &config);
void gts80_ss(machine_config &config); void gts80_ss(machine_config &config);
void gts80_s(machine_config &config); void gts80_s(machine_config &config);
void gts80_hh(machine_config &config); void gts80_hh(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(slam_w);
void init_gts80();
private: private:
uint8_t port1a_r(); u8 port1a_r();
uint8_t port2a_r(); u8 port2a_r();
void port1b_w(uint8_t data); void port1b_w(u8 data);
void port2a_w(uint8_t data); void port2a_w(u8 data);
void port2b_w(uint8_t data); void port2b_w(u8 data);
void port3a_w(uint8_t data); void port3a_w(u8 data);
void port3b_w(offs_t offset, uint8_t data); void port3b_w(u8 data);
void gts80_map(address_map &map); void gts80_map(address_map &map);
uint8_t m_port2; u8 m_segment = 0;
uint8_t m_segment; u8 m_lamprow = 0;
uint8_t m_lamprow; u8 m_swrow = 0;
uint8_t m_swrow; u8 m_soundex = 0;
u8 m_sol_state[9][2];
virtual void machine_reset() override; virtual void machine_reset() override;
virtual void machine_start() override { m_digits.resolve(); } virtual void machine_start() override;
required_device<cpu_device> m_maincpu; 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_r0_device> m_r0_sound;
optional_device<gottlieb_sound_r1_device> m_r1_sound; optional_device<gottlieb_sound_r1_device> m_r1_sound;
output_finder<56> m_digits; 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) void gts80_state::gts80_map(address_map &map)
{ {
map.global_mask(0x3fff); map.global_mask(0x3fff);
map(0x0000, 0x017f).ram(); 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(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(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(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 ) static INPUT_PORTS_START( gts80 )
PORT_START("DSW.0") PORT_START("DSW0")
PORT_DIPNAME( 0x80, 0x00, "SW 1") PORT_DIPNAME( 0x80, 0x80, "SW 01")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x80, DEF_STR(On)) PORT_DIPSETTING( 0x80, DEF_STR(Off))
PORT_DIPNAME( 0x40, 0x00, "SW 2") PORT_DIPNAME( 0x40, 0x40, "SW 02")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x40, DEF_STR(On)) PORT_DIPSETTING( 0x40, DEF_STR(Off))
PORT_DIPNAME( 0x20, 0x00, "SW 3") PORT_DIPNAME( 0x20, 0x20, "SW 03")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x20, DEF_STR(On)) PORT_DIPSETTING( 0x20, DEF_STR(Off))
PORT_DIPNAME( 0x10, 0x00, "SW 4") PORT_DIPNAME( 0x10, 0x10, "SW 04")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x10, DEF_STR(On)) PORT_DIPSETTING( 0x10, DEF_STR(Off))
PORT_DIPNAME( 0x08, 0x00, "SW 5") PORT_DIPNAME( 0x08, 0x08, "SW 05")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x08, DEF_STR(On)) PORT_DIPSETTING( 0x08, DEF_STR(Off))
PORT_DIPNAME( 0x04, 0x00, "SW 6") PORT_DIPNAME( 0x04, 0x04, "SW 06")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x04, DEF_STR(On)) PORT_DIPSETTING( 0x04, DEF_STR(Off))
PORT_DIPNAME( 0x02, 0x00, "SW 7") PORT_DIPNAME( 0x02, 0x02, "SW 07")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x02, DEF_STR(On)) PORT_DIPSETTING( 0x02, DEF_STR(Off))
PORT_DIPNAME( 0x01, 0x00, "SW 8") PORT_DIPNAME( 0x01, 0x01, "SW 08")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x01, DEF_STR(On)) PORT_DIPSETTING( 0x01, DEF_STR(Off))
PORT_START("DSW.1") PORT_START("DSW1")
PORT_DIPNAME( 0x80, 0x00, "SW 9") PORT_DIPNAME( 0x80, 0x80, "SW 09")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x80, DEF_STR(On)) PORT_DIPSETTING( 0x80, DEF_STR(Off))
PORT_DIPNAME( 0x40, 0x00, "SW 10") PORT_DIPNAME( 0x40, 0x40, "SW 10")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x40, DEF_STR(On)) PORT_DIPSETTING( 0x40, DEF_STR(Off))
PORT_DIPNAME( 0x20, 0x00, "SW 11") PORT_DIPNAME( 0x20, 0x20, "SW 11")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x20, DEF_STR(On)) PORT_DIPSETTING( 0x20, DEF_STR(Off))
PORT_DIPNAME( 0x10, 0x00, "SW 12") PORT_DIPNAME( 0x10, 0x10, "SW 12")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x10, DEF_STR(On)) PORT_DIPSETTING( 0x10, DEF_STR(Off))
PORT_DIPNAME( 0x08, 0x00, "SW 13") PORT_DIPNAME( 0x08, 0x08, "SW 13")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x08, DEF_STR(On)) PORT_DIPSETTING( 0x08, DEF_STR(Off))
PORT_DIPNAME( 0x04, 0x00, "SW 14") PORT_DIPNAME( 0x04, 0x00, "SW 14")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x04, DEF_STR(On)) PORT_DIPSETTING( 0x04, DEF_STR(Off))
PORT_DIPNAME( 0x02, 0x02, "SW 15") PORT_DIPNAME( 0x02, 0x00, "SW 15")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x02, DEF_STR(On)) PORT_DIPSETTING( 0x02, DEF_STR(Off))
PORT_DIPNAME( 0x01, 0x00, "SW 16") PORT_DIPNAME( 0x01, 0x00, "SW 16")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x01, DEF_STR(On)) PORT_DIPSETTING( 0x01, DEF_STR(Off))
PORT_START("DSW.2") PORT_START("DSW2")
PORT_DIPNAME( 0x80, 0x80, "SW 17") PORT_DIPNAME( 0x80, 0x00, "SW 17")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x80, DEF_STR(On)) PORT_DIPSETTING( 0x80, DEF_STR(Off))
PORT_DIPNAME( 0x40, 0x40, "SW 18") PORT_DIPNAME( 0x40, 0x00, "SW 18")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x40, DEF_STR(On)) PORT_DIPSETTING( 0x40, DEF_STR(Off))
PORT_DIPNAME( 0x20, 0x00, "SW 19") PORT_DIPNAME( 0x20, 0x20, "SW 19")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x20, DEF_STR(On)) PORT_DIPSETTING( 0x20, DEF_STR(Off))
PORT_DIPNAME( 0x10, 0x00, "SW 20") PORT_DIPNAME( 0x10, 0x10, "SW 20")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x10, DEF_STR(On)) PORT_DIPSETTING( 0x10, DEF_STR(Off))
PORT_DIPNAME( 0x08, 0x00, "SW 21") PORT_DIPNAME( 0x08, 0x08, "SW 21")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x08, DEF_STR(On)) PORT_DIPSETTING( 0x08, DEF_STR(Off))
PORT_DIPNAME( 0x04, 0x00, "SW 22") PORT_DIPNAME( 0x04, 0x04, "SW 22")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x04, DEF_STR(On)) PORT_DIPSETTING( 0x04, DEF_STR(Off))
PORT_DIPNAME( 0x02, 0x02, "SW 23") PORT_DIPNAME( 0x02, 0x00, "SW 23")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x02, DEF_STR(On)) PORT_DIPSETTING( 0x02, DEF_STR(Off))
PORT_DIPNAME( 0x01, 0x01, "SW 24") PORT_DIPNAME( 0x01, 0x00, "SW 24")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x01, DEF_STR(On)) PORT_DIPSETTING( 0x01, DEF_STR(Off))
PORT_START("DSW.3") PORT_START("DSW3")
PORT_DIPNAME( 0x80, 0x80, "SW 25") PORT_DIPNAME( 0x80, 0x00, "SW 25")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x80, DEF_STR(On)) PORT_DIPSETTING( 0x80, DEF_STR(Off))
PORT_DIPNAME( 0x40, 0x40, "SW 26") PORT_DIPNAME( 0x40, 0x00, "SW 26")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x40, DEF_STR(On)) PORT_DIPSETTING( 0x40, DEF_STR(Off))
PORT_DIPNAME( 0x20, 0x20, "SW 27") PORT_DIPNAME( 0x20, 0x00, "SW 27")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x20, DEF_STR(On)) PORT_DIPSETTING( 0x20, DEF_STR(Off))
PORT_DIPNAME( 0x10, 0x10, "SW 28") PORT_DIPNAME( 0x10, 0x00, "SW 28")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x10, DEF_STR(On)) PORT_DIPSETTING( 0x10, DEF_STR(Off))
PORT_DIPNAME( 0x08, 0x08, "SW 29") PORT_DIPNAME( 0x08, 0x00, "SW 29")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x08, DEF_STR(On)) PORT_DIPSETTING( 0x08, DEF_STR(Off))
PORT_DIPNAME( 0x04, 0x04, "SW 30") PORT_DIPNAME( 0x04, 0x00, "SW 30")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x04, DEF_STR(On)) PORT_DIPSETTING( 0x04, DEF_STR(Off))
PORT_DIPNAME( 0x02, 0x00, "SW 31") PORT_DIPNAME( 0x02, 0x02, "SW 31")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x02, DEF_STR(On)) PORT_DIPSETTING( 0x02, DEF_STR(Off))
PORT_DIPNAME( 0x01, 0x00, "SW 32") PORT_DIPNAME( 0x01, 0x01, "SW 32")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x01, DEF_STR(On)) PORT_DIPSETTING( 0x01, DEF_STR(Off))
PORT_START("X0") 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_START("X1")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_1_PAD) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("INP10")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_2_PAD) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("INP11")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_3_PAD) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("INP12")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_4_PAD) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("INP13")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_5_PAD) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("INP14")
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_6_PAD) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("INP15")
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_7_PAD) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP16")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_START("X2") PORT_START("X2")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_A) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("INP20")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_S) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("INP21")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_D) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("INP22")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_F) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME("INP23")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_G) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("INP24")
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_H) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("INP25")
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_J) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP26")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) 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_START("X4")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_L) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("INP40")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_Z) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("INP41")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_C) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("INP42")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_V) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("INP43")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_B) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("INP44")
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_N) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("INP45")
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_M) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("INP46")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN2 ) 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_START("X8")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_STOP) 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)
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)
INPUT_PORTS_END INPUT_PORTS_END
uint8_t gts80_state::port1a_r() INPUT_CHANGED_MEMBER( gts80_state::slam_w )
{ {
char kbdrow[8]; m_riot2->porta_in_set(newval ? 0x80 : 0, 0x80);
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;
} }
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 // 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 // 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 u8 patterns[16] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x58,0x4c,0x62,0x69,0x78,0 }; // 7448
static const uint8_t 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 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) switch (data & 0x70)
{ {
case 0x10: // player 1&2 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 //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 // solenoids and sound
void gts80_state::port3a_w(uint8_t data) 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 sndcmd ^= 15; // inverted again by Z13 on the A3 board
void gts80_state::port3b_w(offs_t offset, uint8_t data) if (m_r0_sound && (sndcmd & 15))
{ m_r0_sound->write(sndcmd);
uint8_t sndcmd = data & 15; else
m_lamprow = data >> 4;
if (m_r0_sound)
m_r0_sound->write(offset, sndcmd);
if (m_r1_sound) 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() 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 */ /* with Sound Board */
void gts80_state::gts80(machine_config &config) 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); M6502(config, m_maincpu, XTAL(3'579'545)/4);
m_maincpu->set_addrmap(AS_PROGRAM, &gts80_state::gts80_map); 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 */ /* Video */
config.set_default_layout(layout_gts80); config.set_default_layout(layout_gts80);
/* Devices */ /* Devices */
riot6532_device &riot1(RIOT6532(config, "riot1", XTAL(3'579'545)/4)); RIOT6532(config, m_riot1, XTAL(3'579'545)/4);
riot1.in_pa_callback().set(FUNC(gts80_state::port1a_r)); // sw_r m_riot1->in_pa_callback().set(FUNC(gts80_state::port1a_r)); // sw_r
//riot1.out_pa_callback().set(FUNC(gts80_state::port1a_w)); m_riot1->out_pb_callback().set(FUNC(gts80_state::port1b_w)); // sw_w
//riot1.in_pb_callback().set(FUNC(gts80_state::port1b_r)); m_riot1->irq_callback().set("irq", FUNC(input_merger_device::in_w<0>));
riot1.out_pb_callback().set(FUNC(gts80_state::port1b_w)); // sw_w
riot1.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE);
riot6532_device &riot2(RIOT6532(config, "riot2", XTAL(3'579'545)/4)); RIOT6532(config, m_riot2, XTAL(3'579'545)/4);
riot2.in_pa_callback().set(FUNC(gts80_state::port2a_r)); // pa7 - slam tilt m_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 m_riot2->out_pa_callback().set(FUNC(gts80_state::port2a_w)); // digit select
//riot2.in_pb_callback().set(FUNC(gts80_state::port2b_r)); m_riot2->out_pb_callback().set(FUNC(gts80_state::port2b_w)); // seg
riot2.out_pb_callback().set(FUNC(gts80_state::port2b_w)); // seg m_riot2->irq_callback().set("irq", FUNC(input_merger_device::in_w<1>));
riot2.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE);
riot6532_device &riot3(RIOT6532(config, "riot3", XTAL(3'579'545)/4)); RIOT6532(config, m_riot3, XTAL(3'579'545)/4);
//riot3.in_pa_callback().set(FUNC(gts80_state::port3a_r)); m_riot3->out_pa_callback().set(FUNC(gts80_state::port3a_w)); // sol, snd
riot3.out_pa_callback().set(FUNC(gts80_state::port3a_w)); // sol, snd m_riot3->out_pb_callback().set(FUNC(gts80_state::port3b_w)); // lamps
//riot3.in_pb_callback().set(FUNC(gts80_state::port3b_r)); m_riot3->irq_callback().set("irq", FUNC(input_merger_device::in_w<2>));
riot3.out_pb_callback().set(FUNC(gts80_state::port3b_w)); // lamps
riot3.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE); INPUT_MERGER_ANY_HIGH(config, "irq").output_handler().set_inputline("maincpu", m6502_device::IRQ_LINE);
/* Sound */ /* Sound */
genpin_audio(config); genpin_audio(config);
@ -397,20 +522,19 @@ void gts80_state::gts80(machine_config &config)
void gts80_state::gts80_s(machine_config &config) void gts80_state::gts80_s(machine_config &config)
{ {
gts80(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) void gts80_state::gts80_hh(machine_config &config)
{ {
gts80(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) void gts80_state::gts80_ss(machine_config &config)
{ {
gts80(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", 0.75);
//GOTTLIEB_SOUND_REV1_VOTRAX(config, m_r1_sound, 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // votrax crashes
} }
/*------------------------------------------------------------------- /*-------------------------------------------------------------------
@ -489,6 +613,7 @@ ROM_END
/*------------------------------------------------------------------- /*-------------------------------------------------------------------
/ Critical Mass / Critical Mass
/-------------------------------------------------------------------*/ /-------------------------------------------------------------------*/
// Prototype, no number
/*------------------------------------------------------------------- /*-------------------------------------------------------------------
/ Eclipse #671 / Eclipse #671
@ -643,7 +768,8 @@ ROM_START(grand8)
ROM_LOAD("u3_80.bin", 0x3000, 0x1000, CRC(1e69f9d0) SHA1(ad738cac2555830257b531e5e533b15362f624b9)) ROM_LOAD("u3_80.bin", 0x3000, 0x1000, CRC(1e69f9d0) SHA1(ad738cac2555830257b531e5e533b15362f624b9))
ROM_LOAD("652.cpu", 0x1000, 0x0800, CRC(5386e5fb) SHA1(822f47951b702f9c6a1ce674baaab0a596f34413)) 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_LOAD("grand8.bin", 0, 0x2000, CRC(b7cfaaae) SHA1(60eb4f9bc7b7d11ec6d353b0ae02484cf1c0c9ee))
ROM_END ROM_END
@ -730,8 +856,9 @@ ROM_START(spidermn)
ROM_END ROM_END
/*------------------------------------------------------------------- /*-------------------------------------------------------------------
/ The Incredible Hulk / The Incredible Hulk (#500)
/-------------------------------------------------------------------*/ /-------------------------------------------------------------------*/
// Prototypes to test System 80 before production.
/*------------------------------------------------------------------- /*-------------------------------------------------------------------
/ Time Line #659 / Time Line #659
@ -812,29 +939,29 @@ ROM_START(s80tst)
ROM_LOAD("80tst-s2.snd", 0x7800, 0x0800, CRC(1a4b1e9d) SHA1(18e7ffbdbdaf83ab1c8daa5fa5201d9f54390758)) ROM_LOAD("80tst-s2.snd", 0x7800, 0x0800, CRC(1a4b1e9d) SHA1(18e7ffbdbdaf83ab1c8daa5fa5201d9f54390758))
ROM_END 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, 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_s, gts80, gts80_state, init_gts80, ROT0, "Christian Tabart", "Le Grand 8", MACHINE_IS_SKELETON_MECHANICAL) // Panthera conversion /* 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, init_gts80, ROT0, "Gottlieb", "The Amazing Spider-Man", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Circus", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Counterforce", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Star Race", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "James Bond (Timed Play)", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "James Bond (3/5-Ball)", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Time Line", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Force II", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Pink Panther", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Mars - God of War", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Mars - God of War (French speech)", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Mars - God of War (Prototype)", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Volcano", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Volcano (Sound Only set 1)", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Volcano (Sound Only set 2)", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Volcano (Sound Only set 3)", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Black Hole (Rev. 4)", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Black Hole (Rev. 2)", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Black Hole (Sound Only)", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Haunted House (Rev. 2)", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Haunted House (Rev. 1)", MACHINE_IS_SKELETON_MECHANICAL) /* 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, init_gts80, ROT0, "Gottlieb", "Eclipse", MACHINE_IS_SKELETON_MECHANICAL) /* 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 // copyright-holders:Robbbert
/**************************************************************************************************************** /****************************************************************************************************************
PINBALL PINBALL
Gottlieb System 80A 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 "emu.h"
#include "machine/input_merger.h"
#include "machine/genpin.h" #include "machine/genpin.h"
#include "audio/gottlieb.h" #include "audio/gottlieb.h"
#include "cpu/i86/i86.h" #include "cpu/i86/i86.h"
@ -22,49 +35,64 @@
#include "gts80a.lh" #include "gts80a.lh"
#include "gts80a_caveman.lh" #include "gts80a_caveman.lh"
namespace {
class gts80a_state : public genpin_class class gts80a_state : public genpin_class
{ {
public: public:
gts80a_state(const machine_config &mconfig, device_type type, const char *tag) gts80a_state(const machine_config &mconfig, device_type type, const char *tag)
: genpin_class(mconfig, type, tag) : genpin_class(mconfig, type, tag)
, m_maincpu(*this, "maincpu") , 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_r0_sound(*this, "r0sound")
, m_r1_sound(*this, "r1sound") , m_r1_sound(*this, "r1sound")
, m_digits(*this, "digit%u", 0U) , m_digits(*this, "digit%u", 0U)
, m_io_outputs(*this, "out%u", 0U)
{ } { }
void gts80a(machine_config &config); void gts80a(machine_config &config);
void gts80a_s(machine_config &config); void gts80a_s(machine_config &config);
void gts80a_ss(machine_config &config); void gts80a_ss(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(slam_w);
void init_gts80a();
private: private:
uint8_t port1a_r(); u8 port1a_r();
uint8_t port2a_r(); u8 port2a_r();
void port1b_w(uint8_t data); void port1b_w(u8 data);
void port2a_w(uint8_t data); void port2a_w(u8 data);
void port2b_w(uint8_t data); void port2b_w(u8 data);
void port3a_w(uint8_t data); void port3a_w(u8 data);
void port3b_w(offs_t offset, uint8_t data); void port3b_w(u8 data);
void gts80a_map(address_map &map); void gts80a_map(address_map &map);
uint8_t m_port2; u8 m_segment = 0;
uint8_t m_segment; u8 m_lamprow = 0;
uint8_t m_lamprow; u8 m_swrow = 0;
uint8_t m_swrow; u8 m_soundex = 0;
u8 m_sol_state[9][2];
virtual void machine_reset() override; virtual void machine_reset() override;
virtual void machine_start() override { m_digits.resolve(); } virtual void machine_start() override;
required_device<cpu_device> m_maincpu; 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_r0_device> m_r0_sound;
optional_device<gottlieb_sound_r1_device> m_r1_sound; optional_device<gottlieb_sound_r1_device> m_r1_sound;
output_finder<60> m_digits; 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) void gts80a_state::gts80a_map(address_map &map)
{ {
map.global_mask(0x3fff); map.global_mask(0x3fff);
map(0x0000, 0x017f).ram(); 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(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(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(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 ) static INPUT_PORTS_START( gts80a )
PORT_START("DSW.0") PORT_START("DSW0")
PORT_DIPNAME( 0x80, 0x00, "SW 1") PORT_DIPNAME( 0x80, 0x80, "SW 01")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x80, DEF_STR(On)) PORT_DIPSETTING( 0x80, DEF_STR(Off))
PORT_DIPNAME( 0x40, 0x00, "SW 2") PORT_DIPNAME( 0x40, 0x40, "SW 02")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x40, DEF_STR(On)) PORT_DIPSETTING( 0x40, DEF_STR(Off))
PORT_DIPNAME( 0x20, 0x00, "SW 3") PORT_DIPNAME( 0x20, 0x20, "SW 03")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x20, DEF_STR(On)) PORT_DIPSETTING( 0x20, DEF_STR(Off))
PORT_DIPNAME( 0x10, 0x00, "SW 4") PORT_DIPNAME( 0x10, 0x10, "SW 04")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x10, DEF_STR(On)) PORT_DIPSETTING( 0x10, DEF_STR(Off))
PORT_DIPNAME( 0x08, 0x00, "SW 5") PORT_DIPNAME( 0x08, 0x08, "SW 05")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x08, DEF_STR(On)) PORT_DIPSETTING( 0x08, DEF_STR(Off))
PORT_DIPNAME( 0x04, 0x00, "SW 6") PORT_DIPNAME( 0x04, 0x04, "SW 06")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x04, DEF_STR(On)) PORT_DIPSETTING( 0x04, DEF_STR(Off))
PORT_DIPNAME( 0x02, 0x00, "SW 7") PORT_DIPNAME( 0x02, 0x02, "SW 07")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x02, DEF_STR(On)) PORT_DIPSETTING( 0x02, DEF_STR(Off))
PORT_DIPNAME( 0x01, 0x00, "SW 8") PORT_DIPNAME( 0x01, 0x01, "SW 08")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x01, DEF_STR(On)) PORT_DIPSETTING( 0x01, DEF_STR(Off))
PORT_START("DSW.1") PORT_START("DSW1")
PORT_DIPNAME( 0x80, 0x00, "SW 9") PORT_DIPNAME( 0x80, 0x80, "SW 09")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x80, DEF_STR(On)) PORT_DIPSETTING( 0x80, DEF_STR(Off))
PORT_DIPNAME( 0x40, 0x00, "SW 10") PORT_DIPNAME( 0x40, 0x40, "SW 10")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x40, DEF_STR(On)) PORT_DIPSETTING( 0x40, DEF_STR(Off))
PORT_DIPNAME( 0x20, 0x00, "SW 11") PORT_DIPNAME( 0x20, 0x20, "SW 11")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x20, DEF_STR(On)) PORT_DIPSETTING( 0x20, DEF_STR(Off))
PORT_DIPNAME( 0x10, 0x00, "SW 12") PORT_DIPNAME( 0x10, 0x10, "SW 12")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x10, DEF_STR(On)) PORT_DIPSETTING( 0x10, DEF_STR(Off))
PORT_DIPNAME( 0x08, 0x00, "SW 13") PORT_DIPNAME( 0x08, 0x08, "SW 13")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x08, DEF_STR(On)) PORT_DIPSETTING( 0x08, DEF_STR(Off))
PORT_DIPNAME( 0x04, 0x00, "SW 14") PORT_DIPNAME( 0x04, 0x00, "SW 14")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x04, DEF_STR(On)) PORT_DIPSETTING( 0x04, DEF_STR(Off))
PORT_DIPNAME( 0x02, 0x02, "SW 15") PORT_DIPNAME( 0x02, 0x00, "SW 15")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x02, DEF_STR(On)) PORT_DIPSETTING( 0x02, DEF_STR(Off))
PORT_DIPNAME( 0x01, 0x00, "SW 16") PORT_DIPNAME( 0x01, 0x00, "SW 16")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x01, DEF_STR(On)) PORT_DIPSETTING( 0x01, DEF_STR(Off))
PORT_START("DSW.2") PORT_START("DSW2")
PORT_DIPNAME( 0x80, 0x80, "SW 17") PORT_DIPNAME( 0x80, 0x80, "SW 17")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x80, DEF_STR(On)) PORT_DIPSETTING( 0x80, DEF_STR(Off))
PORT_DIPNAME( 0x40, 0x40, "SW 18") PORT_DIPNAME( 0x40, 0x40, "SW 18")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x40, DEF_STR(On)) PORT_DIPSETTING( 0x40, DEF_STR(Off))
PORT_DIPNAME( 0x20, 0x00, "SW 19") PORT_DIPNAME( 0x20, 0x20, "SW 19")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x20, DEF_STR(On)) PORT_DIPSETTING( 0x20, DEF_STR(Off))
PORT_DIPNAME( 0x10, 0x00, "SW 20") PORT_DIPNAME( 0x10, 0x10, "SW 20")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x10, DEF_STR(On)) PORT_DIPSETTING( 0x10, DEF_STR(Off))
PORT_DIPNAME( 0x08, 0x00, "SW 21") PORT_DIPNAME( 0x08, 0x08, "SW 21")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x08, DEF_STR(On)) PORT_DIPSETTING( 0x08, DEF_STR(Off))
PORT_DIPNAME( 0x04, 0x00, "SW 22") PORT_DIPNAME( 0x04, 0x04, "SW 22")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x04, DEF_STR(On)) PORT_DIPSETTING( 0x04, DEF_STR(Off))
PORT_DIPNAME( 0x02, 0x02, "SW 23") PORT_DIPNAME( 0x02, 0x00, "SW 23")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x02, DEF_STR(On)) PORT_DIPSETTING( 0x02, DEF_STR(Off))
PORT_DIPNAME( 0x01, 0x01, "SW 24") PORT_DIPNAME( 0x01, 0x00, "SW 24")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x01, DEF_STR(On)) PORT_DIPSETTING( 0x01, DEF_STR(Off))
PORT_START("DSW.3") PORT_START("DSW3")
PORT_DIPNAME( 0x80, 0x80, "SW 25") PORT_DIPNAME( 0x80, 0x00, "SW 25")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x80, DEF_STR(On)) PORT_DIPSETTING( 0x80, DEF_STR(Off))
PORT_DIPNAME( 0x40, 0x40, "SW 26") PORT_DIPNAME( 0x40, 0x00, "SW 26")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x40, DEF_STR(On)) PORT_DIPSETTING( 0x40, DEF_STR(Off))
PORT_DIPNAME( 0x20, 0x20, "SW 27") PORT_DIPNAME( 0x20, 0x20, "SW 27")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x20, DEF_STR(On)) PORT_DIPSETTING( 0x20, DEF_STR(Off))
PORT_DIPNAME( 0x10, 0x10, "SW 28") PORT_DIPNAME( 0x10, 0x10, "SW 28")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x10, DEF_STR(On)) PORT_DIPSETTING( 0x10, DEF_STR(Off))
PORT_DIPNAME( 0x08, 0x08, "SW 29") PORT_DIPNAME( 0x08, 0x08, "SW 29")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x08, DEF_STR(On)) PORT_DIPSETTING( 0x08, DEF_STR(Off))
PORT_DIPNAME( 0x04, 0x04, "SW 30") PORT_DIPNAME( 0x04, 0x04, "SW 30")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x04, DEF_STR(On)) PORT_DIPSETTING( 0x04, DEF_STR(Off))
PORT_DIPNAME( 0x02, 0x00, "SW 31") PORT_DIPNAME( 0x02, 0x02, "SW 31")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x02, DEF_STR(On)) PORT_DIPSETTING( 0x02, DEF_STR(Off))
PORT_DIPNAME( 0x01, 0x00, "SW 32") PORT_DIPNAME( 0x01, 0x01, "SW 32")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x01, DEF_STR(On)) PORT_DIPSETTING( 0x01, DEF_STR(Off))
PORT_START("X0") 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_START("X1")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_1_PAD) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("INP10")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_2_PAD) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("INP11")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_3_PAD) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("INP12")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_4_PAD) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("INP13")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_5_PAD) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("INP14")
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_6_PAD) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("INP15")
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_7_PAD) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP16")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_START("X2") PORT_START("X2")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_A) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("INP20")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_S) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("INP21")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_D) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("INP22")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_F) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME("INP23")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_G) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("INP24")
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_H) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("INP25")
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_J) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP26")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) 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_START("X4")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_L) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("INP40")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_Z) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("INP41")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_C) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("INP42")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_V) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("INP43")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_B) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("INP44")
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_N) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("INP45")
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_M) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("INP46")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN2 ) 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_START("X8")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_STOP) 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)
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)
INPUT_PORTS_END INPUT_PORTS_END
uint8_t gts80a_state::port1a_r() INPUT_CHANGED_MEMBER( gts80a_state::slam_w )
{ {
char kbdrow[8]; m_riot2->porta_in_set(newval ? 0x80 : 0, 0x80);
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;
} }
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 // 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 // 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 u8 patterns[16] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x58,0x4c,0x62,0x69,0x78,0 }; // 7448
static const uint8_t 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 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) switch (data & 0x70)
{ {
case 0x10: // player 1&2 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 //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 // solenoids and sound
void gts80a_state::port3a_w(uint8_t data) 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 sndcmd ^= 15; // inverted again by Z13 on the A3 board
void gts80a_state::port3b_w(offs_t offset, uint8_t data) if (m_r0_sound && (sndcmd & 15))
{ m_r0_sound->write(sndcmd);
uint8_t sndcmd = data & 15; else
m_lamprow = data >> 4;
if (m_r0_sound)
m_r0_sound->write(offset, sndcmd);
if (m_r1_sound) 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() 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 */ /* with Sound Board */
void gts80a_state::gts80a(machine_config &config) 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); M6502(config, m_maincpu, XTAL(3'579'545)/4);
m_maincpu->set_addrmap(AS_PROGRAM, &gts80a_state::gts80a_map); 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 */ /* Video */
config.set_default_layout(layout_gts80a); config.set_default_layout(layout_gts80a);
/* Devices */ /* Devices */
riot6532_device &riot1(RIOT6532(config, "riot1", XTAL(3'579'545)/4)); RIOT6532(config, m_riot1, XTAL(3'579'545)/4);
riot1.in_pa_callback().set(FUNC(gts80a_state::port1a_r)); // sw_r m_riot1->in_pa_callback().set(FUNC(gts80a_state::port1a_r)); // sw_r
//riot1.out_pa_callback().set(FUNC(gts80a_state::port1a_w)); m_riot1->out_pb_callback().set(FUNC(gts80a_state::port1b_w)); // sw_w
//riot1.in_pb_callback().set(FUNC(gts80a_state::port1b_r)); m_riot1->irq_callback().set("irq", FUNC(input_merger_device::in_w<0>));
riot1.out_pb_callback().set(FUNC(gts80a_state::port1b_w)); // sw_w
riot1.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE);
riot6532_device &riot2(RIOT6532(config, "riot2", XTAL(3'579'545)/4)); RIOT6532(config, m_riot2, XTAL(3'579'545)/4);
riot2.in_pa_callback().set(FUNC(gts80a_state::port2a_r)); // pa7 - slam tilt m_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 m_riot2->out_pa_callback().set(FUNC(gts80a_state::port2a_w)); // digit select
//riot2.in_pb_callback().set(FUNC(gts80a_state::port2b_r)); m_riot2->out_pb_callback().set(FUNC(gts80a_state::port2b_w)); // seg
riot2.out_pb_callback().set(FUNC(gts80a_state::port2b_w)); // seg m_riot2->irq_callback().set("irq", FUNC(input_merger_device::in_w<1>));
riot2.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE);
riot6532_device &riot3(RIOT6532(config, "riot3", XTAL(3'579'545)/4)); RIOT6532(config, m_riot3, XTAL(3'579'545)/4);
//riot3.in_pa_callback().set(FUNC(gts80a_state::port3a_r)); m_riot3->out_pa_callback().set(FUNC(gts80a_state::port3a_w)); // sol, snd
riot3.out_pa_callback().set(FUNC(gts80a_state::port3a_w)); // sol, snd m_riot3->out_pb_callback().set(FUNC(gts80a_state::port3b_w)); // lamps
//riot3.in_pb_callback().set(FUNC(gts80a_state::port3b_r)); m_riot3->irq_callback().set("irq", FUNC(input_merger_device::in_w<2>));
riot3.out_pb_callback().set(FUNC(gts80a_state::port3b_w)); // lamps
riot3.irq_callback().set_inputline("maincpu", M6502_IRQ_LINE); INPUT_MERGER_ANY_HIGH(config, "irq").output_handler().set_inputline("maincpu", m6502_device::IRQ_LINE); // wire-or'd
/* Sound */ /* Sound */
genpin_audio(config); genpin_audio(config);
@ -388,17 +515,16 @@ void gts80a_state::gts80a(machine_config &config)
void gts80a_state::gts80a_s(machine_config &config) void gts80a_state::gts80a_s(machine_config &config)
{ {
gts80a(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) void gts80a_state::gts80a_ss(machine_config &config)
{ {
gts80a(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", 0.75);
//GOTTLIEB_SOUND_REV1_VOTRAX(config, m_r1_sound, 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // votrax crashes
} }
//******************* CAVEMAN ****************************************************************
class caveman_state : public gts80a_state class caveman_state : public gts80a_state
{ {
@ -407,16 +533,14 @@ public:
: gts80a_state(mconfig, type, tag) : gts80a_state(mconfig, type, tag)
, m_videocpu(*this, "video_cpu") , m_videocpu(*this, "video_cpu")
, m_vram(*this, "vram") , m_vram(*this, "vram")
{ } { }
uint32_t screen_update_caveman(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void caveman(machine_config &config); 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_io_map(address_map &map);
void video_map(address_map &map); void video_map(address_map &map);
private:
required_device<cpu_device> m_videocpu; required_device<cpu_device> m_videocpu;
required_shared_ptr<uint8_t> m_vram; 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]; uint8_t pix = m_vram[count];
bitmap.pix(y, x+0) = (pix >> 6)&0x3; bitmap.pix(y, x+0) = BIT(pix, 6, 2);
bitmap.pix(y, x+1) = (pix >> 4)&0x3; bitmap.pix(y, x+1) = BIT(pix, 4, 2);
bitmap.pix(y, x+2) = (pix >> 2)&0x3; bitmap.pix(y, x+2) = BIT(pix, 2, 2);
bitmap.pix(y, x+3) = (pix >> 0)&0x3; bitmap.pix(y, x+3) = BIT(pix, 0, 2);
count++; count++;
} }
@ -826,30 +950,31 @@ ROM_START(touchdn)
ROM_LOAD("688-s.snd", 0x0800, 0x0800, CRC(5e9988a6) SHA1(5f531491722d3c30cf4a7c17982813a7c548387a)) ROM_LOAD("688-s.snd", 0x0800, 0x0800, CRC(5e9988a6) SHA1(5f531491722d3c30cf4a7c17982813a7c548387a))
ROM_END 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, 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, init_gts80a, ROT0, "Gottlieb", "Devil's Dare (Sound Only)", 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, init_gts80a, ROT0, "Gottlieb", "Rocky", 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, init_gts80a, ROT0, "Gottlieb", "Rocky (French speech)", 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, init_gts80a, ROT0, "Gottlieb", "Spirit", 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, init_gts80a, ROT0, "Gottlieb", "Punk!", 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, init_gts80a, ROT0, "Gottlieb", "Striker", 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, init_gts80a, ROT0, "Gottlieb", "Krull (Pinball)", 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, init_gts80a, ROT0, "Gottlieb", "Q*Bert's Quest", 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, init_gts80a, ROT0, "Gottlieb", "Super Orbit", 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, init_gts80a, ROT0, "Gottlieb", "Royal Flush Deluxe", 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, init_gts80a, ROT0, "Gottlieb", "Goin' Nuts", 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, init_gts80a, ROT0, "Gottlieb", "Amazon Hunt", 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, init_gts80a, ROT0, "Gottlieb", "Amazon Hunt (alternate set)", 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, init_gts80a, ROT0, "Gottlieb", "Rack 'em Up! (Pinball)", 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, init_gts80a, ROT0, "Gottlieb", "Ready...Aim...Fire!", 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, init_gts80a, ROT0, "Gottlieb", "Jacks to Open", 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, init_gts80a, ROT0, "Gottlieb", "Touchdown", 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, init_gts80a, ROT0, "Gottlieb", "Alien Star", 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, init_gts80a, ROT0, "Gottlieb", "The Games", 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, init_gts80a, ROT0, "Gottlieb", "El Dorado City of Gold", 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, init_gts80a, ROT0, "Gottlieb", "Ice Fever", 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) */ /* 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, 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, init_gts80a, ROT0, "Gottlieb", "Caveman (Pinball/Video Combo, set 2)", 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 // copyright-holders:Robbbert
/**************************************************************************************************************** /****************************************************************************************************************
PINBALL PINBALL
Gottlieb System 80B 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 "emu.h"
#include "machine/input_merger.h"
#include "machine/genpin.h" #include "machine/genpin.h"
#include "audio/gottlieb.h" #include "audio/gottlieb.h"
@ -31,9 +41,15 @@ public:
gts80b_state(const machine_config &mconfig, device_type type, const char *tag) gts80b_state(const machine_config &mconfig, device_type type, const char *tag)
: genpin_class(mconfig, type, tag) : genpin_class(mconfig, type, tag)
, m_maincpu(*this, "maincpu") , 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_r0_sound(*this, "r0sound")
, m_r1_sound(*this, "r1sound") , m_r1_sound(*this, "r1sound")
, m_digits(*this, "digit%u", 0U) , m_digits(*this, "digit%u", 0U)
, m_io_outputs(*this, "out%u", 0U)
{ } { }
void gts80b_s2(machine_config &config); void gts80b_s2(machine_config &config);
@ -42,240 +58,252 @@ public:
void gts80b_s1(machine_config &config); void gts80b_s1(machine_config &config);
void gts80b_s(machine_config &config); void gts80b_s(machine_config &config);
void gts80b(machine_config &config); void gts80b(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(slam_w);
void init_gts80b();
protected:
virtual void machine_reset() override;
virtual void machine_start() override { m_digits.resolve(); }
private: private:
uint8_t port1a_r(); u8 port1a_r();
uint8_t port2a_r(); u8 port2a_r();
void port1b_w(uint8_t data); void port1b_w(u8 data);
void port2a_w(uint8_t data); void port2a_w(u8 data);
void port2b_w(uint8_t data); void port2b_w(u8 data);
void port3a_w(uint8_t data); void port3a_w(u8 data);
void port3b_w(offs_t offset, uint8_t data); void port3b_w(u8 data);
void gts80b_map(address_map &map); void gts80b_map(address_map &map);
uint8_t m_dispcmd; u8 m_segment = 0;
uint8_t m_port2a; u8 m_lamprow = 0;
uint8_t m_port2b; u8 m_swrow = 0;
uint8_t m_lamprow; u8 m_soundex = 0;
uint8_t m_swrow; u8 m_sol_state[9][2];
u8 m_dispcmd;
u8 m_port2b;
bool m_in_cmd_mode[2]; 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_r0_device> m_r0_sound;
optional_device<gottlieb_sound_r1_device> m_r1_sound; optional_device<gottlieb_sound_r1_device> m_r1_sound;
output_finder<40> m_digits; 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) void gts80b_state::gts80b_map(address_map &map)
{ {
map.global_mask(0x3fff); map.global_mask(0xbfff);
map(0x0000, 0x017f).ram(); map(0x0000, 0x017f).mirror(0x8000).ram();
map(0x0200, 0x027f).rw("riot1", FUNC(riot6532_device::read), FUNC(riot6532_device::write)); map(0x01cb, 0x01cb).lr8(NAME([] () { return 0xff; })); // continual read
map(0x0280, 0x02ff).rw("riot2", FUNC(riot6532_device::read), FUNC(riot6532_device::write)); map(0x0200, 0x027f).mirror(0x8000).rw("riot1", FUNC(riot6532_device::read), FUNC(riot6532_device::write));
map(0x0300, 0x037f).rw("riot3", 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(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(0x2000, 0x2fff).rom();
map(0x3000, 0x3fff).rom(); map(0x3000, 0x3fff).mirror(0x8000).rom();
map(0x9000, 0x97ff).rom();
} }
static INPUT_PORTS_START( gts80b ) static INPUT_PORTS_START( gts80b )
PORT_START("DSW.0") PORT_START("DSW0")
PORT_DIPNAME( 0x80, 0x00, "SW 1") PORT_DIPNAME( 0x80, 0x80, "SW 01")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x80, DEF_STR(On)) PORT_DIPSETTING( 0x80, DEF_STR(Off))
PORT_DIPNAME( 0x40, 0x00, "SW 2") PORT_DIPNAME( 0x40, 0x40, "SW 02")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x40, DEF_STR(On)) PORT_DIPSETTING( 0x40, DEF_STR(Off))
PORT_DIPNAME( 0x20, 0x00, "SW 3") PORT_DIPNAME( 0x20, 0x20, "SW 03")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x20, DEF_STR(On)) PORT_DIPSETTING( 0x20, DEF_STR(Off))
PORT_DIPNAME( 0x10, 0x00, "SW 4") PORT_DIPNAME( 0x10, 0x10, "SW 04")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x10, DEF_STR(On)) PORT_DIPSETTING( 0x10, DEF_STR(Off))
PORT_DIPNAME( 0x08, 0x00, "SW 5") PORT_DIPNAME( 0x08, 0x08, "SW 05")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x08, DEF_STR(On)) PORT_DIPSETTING( 0x08, DEF_STR(Off))
PORT_DIPNAME( 0x04, 0x00, "SW 6") PORT_DIPNAME( 0x04, 0x04, "SW 06")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x04, DEF_STR(On)) PORT_DIPSETTING( 0x04, DEF_STR(Off))
PORT_DIPNAME( 0x02, 0x00, "SW 7") PORT_DIPNAME( 0x02, 0x02, "SW 07")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x02, DEF_STR(On)) PORT_DIPSETTING( 0x02, DEF_STR(Off))
PORT_DIPNAME( 0x01, 0x00, "SW 8") PORT_DIPNAME( 0x01, 0x01, "SW 08")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x01, DEF_STR(On)) PORT_DIPSETTING( 0x01, DEF_STR(Off))
PORT_START("DSW.1") PORT_START("DSW1")
PORT_DIPNAME( 0x80, 0x00, "SW 9") PORT_DIPNAME( 0x80, 0x80, "SW 09")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x80, DEF_STR(On)) PORT_DIPSETTING( 0x80, DEF_STR(Off))
PORT_DIPNAME( 0x40, 0x00, "SW 10") PORT_DIPNAME( 0x40, 0x40, "SW 10")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x40, DEF_STR(On)) PORT_DIPSETTING( 0x40, DEF_STR(Off))
PORT_DIPNAME( 0x20, 0x00, "SW 11") PORT_DIPNAME( 0x20, 0x20, "SW 11")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x20, DEF_STR(On)) PORT_DIPSETTING( 0x20, DEF_STR(Off))
PORT_DIPNAME( 0x10, 0x00, "SW 12") PORT_DIPNAME( 0x10, 0x10, "SW 12")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x10, DEF_STR(On)) PORT_DIPSETTING( 0x10, DEF_STR(Off))
PORT_DIPNAME( 0x08, 0x00, "SW 13") PORT_DIPNAME( 0x08, 0x08, "SW 13")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x08, DEF_STR(On)) PORT_DIPSETTING( 0x08, DEF_STR(Off))
PORT_DIPNAME( 0x04, 0x00, "SW 14") PORT_DIPNAME( 0x04, 0x00, "SW 14")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x04, DEF_STR(On)) PORT_DIPSETTING( 0x04, DEF_STR(Off))
PORT_DIPNAME( 0x02, 0x02, "SW 15") PORT_DIPNAME( 0x02, 0x00, "SW 15")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x02, DEF_STR(On)) PORT_DIPSETTING( 0x02, DEF_STR(Off))
PORT_DIPNAME( 0x01, 0x00, "SW 16") PORT_DIPNAME( 0x01, 0x00, "SW 16")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x01, DEF_STR(On)) PORT_DIPSETTING( 0x01, DEF_STR(Off))
PORT_START("DSW.2") PORT_START("DSW2")
PORT_DIPNAME( 0x80, 0x80, "SW 17") PORT_DIPNAME( 0x80, 0x80, "SW 17")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x80, DEF_STR(On)) PORT_DIPSETTING( 0x80, DEF_STR(Off))
PORT_DIPNAME( 0x40, 0x40, "SW 18") PORT_DIPNAME( 0x40, 0x40, "SW 18")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x40, DEF_STR(On)) PORT_DIPSETTING( 0x40, DEF_STR(Off))
PORT_DIPNAME( 0x20, 0x00, "SW 19") PORT_DIPNAME( 0x20, 0x20, "SW 19")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x20, DEF_STR(On)) PORT_DIPSETTING( 0x20, DEF_STR(Off))
PORT_DIPNAME( 0x10, 0x00, "SW 20") PORT_DIPNAME( 0x10, 0x10, "SW 20")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x10, DEF_STR(On)) PORT_DIPSETTING( 0x10, DEF_STR(Off))
PORT_DIPNAME( 0x08, 0x00, "SW 21") PORT_DIPNAME( 0x08, 0x08, "SW 21")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x08, DEF_STR(On)) PORT_DIPSETTING( 0x08, DEF_STR(Off))
PORT_DIPNAME( 0x04, 0x00, "SW 22") PORT_DIPNAME( 0x04, 0x04, "SW 22")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x04, DEF_STR(On)) PORT_DIPSETTING( 0x04, DEF_STR(Off))
PORT_DIPNAME( 0x02, 0x02, "SW 23") PORT_DIPNAME( 0x02, 0x00, "SW 23")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x02, DEF_STR(On)) PORT_DIPSETTING( 0x02, DEF_STR(Off))
PORT_DIPNAME( 0x01, 0x01, "SW 24") PORT_DIPNAME( 0x01, 0x00, "SW 24")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x01, DEF_STR(On)) PORT_DIPSETTING( 0x01, DEF_STR(Off))
PORT_START("DSW.3") PORT_START("DSW3")
PORT_DIPNAME( 0x80, 0x80, "SW 25") PORT_DIPNAME( 0x80, 0x00, "SW 25")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x80, DEF_STR(On)) PORT_DIPSETTING( 0x80, DEF_STR(Off))
PORT_DIPNAME( 0x40, 0x40, "SW 26") PORT_DIPNAME( 0x40, 0x00, "SW 26")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x40, DEF_STR(On)) PORT_DIPSETTING( 0x40, DEF_STR(Off))
PORT_DIPNAME( 0x20, 0x20, "SW 27") PORT_DIPNAME( 0x20, 0x20, "SW 27")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x20, DEF_STR(On)) PORT_DIPSETTING( 0x20, DEF_STR(Off))
PORT_DIPNAME( 0x10, 0x10, "SW 28") PORT_DIPNAME( 0x10, 0x10, "SW 28")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x10, DEF_STR(On)) PORT_DIPSETTING( 0x10, DEF_STR(Off))
PORT_DIPNAME( 0x08, 0x08, "SW 29") PORT_DIPNAME( 0x08, 0x08, "SW 29")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x08, DEF_STR(On)) PORT_DIPSETTING( 0x08, DEF_STR(Off))
PORT_DIPNAME( 0x04, 0x04, "SW 30") PORT_DIPNAME( 0x04, 0x04, "SW 30")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x04, DEF_STR(On)) PORT_DIPSETTING( 0x04, DEF_STR(Off))
PORT_DIPNAME( 0x02, 0x00, "SW 31") PORT_DIPNAME( 0x02, 0x02, "SW 31")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x02, DEF_STR(On)) PORT_DIPSETTING( 0x02, DEF_STR(Off))
PORT_DIPNAME( 0x01, 0x00, "SW 32") PORT_DIPNAME( 0x01, 0x01, "SW 32")
PORT_DIPSETTING( 0x00, DEF_STR(Off)) PORT_DIPSETTING( 0x00, DEF_STR(On))
PORT_DIPSETTING( 0x01, DEF_STR(On)) PORT_DIPSETTING( 0x01, DEF_STR(Off))
PORT_START("X0") 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_START("X1")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_1_PAD) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("INP10")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_2_PAD) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("INP11")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_3_PAD) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("INP12")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_4_PAD) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("INP13")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_5_PAD) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("INP14")
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_6_PAD) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("INP15")
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_7_PAD) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Right Advance Button")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_START("X2") PORT_START("X2")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_A) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("INP20")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_S) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("INP21")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_D) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("INP22")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_F) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME("INP23")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_G) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("INP24")
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_H) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("INP25")
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_J) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP26")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) 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_START("X4")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_L) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("INP40")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_Z) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("INP41")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_C) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("INP42")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_V) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("INP43")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_B) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("INP44")
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_N) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("INP45")
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_M) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("INP46")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN2 ) 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_START("X8")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_STOP) 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)
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)
INPUT_PORTS_END INPUT_PORTS_END
INPUT_CHANGED_MEMBER( gts80b_state::slam_w )
{
m_riot2->porta_in_set(newval ? 0x80 : 0, 0x80);
}
static const uint16_t patterns[] = { static const uint16_t patterns[] = {
/* 0x00-0x07 */ 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, /* 0x00-0x07 */ 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
/* 0x08-0x0f */ 0xffff, 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, /* 0x78-0x7f */ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
}; };
uint8_t gts80b_state::port1a_r() u8 gts80b_state::port1a_r()
{ {
char kbdrow[8]; u8 data = 0xff;
uint8_t data = 0; if ((m_lamprow < 4) && BIT(m_segment, 7))
if ((m_lamprow < 4) && (m_port2b==0x80)) data = m_io_dips[m_lamprow]->read();
{
sprintf(kbdrow,"DSW.%d",m_lamprow);
data = ioport(kbdrow)->read();
}
else
{
sprintf(kbdrow,"X%X",m_swrow);
data = ioport(kbdrow)->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 // 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)) if (BIT(data, 4))
m_dispcmd = (m_dispcmd & 0xf0) | m_port2b; m_dispcmd = (m_dispcmd & 0xf0) | m_port2b;
if (BIT(data, 5)) 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 //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; m_port2b = data & 15;
uint16_t segment; uint16_t segment;
// crude approximation of the Rockwell display chips // 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? if (!BIT(data, i+4)) // are we addressing the chip?
{ {
@ -367,24 +390,130 @@ void gts80b_state::port2b_w(uint8_t data)
} }
} }
// solenoids // solenoids and sound
void gts80b_state::port3a_w(uint8_t data) 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 // Lamps
void gts80b_state::port3b_w(offs_t offset, uint8_t data) void gts80b_state::port3b_w(u8 data)
{ {
uint8_t sndcmd = data & 15; m_lamprow = BIT(data, 4, 4);
m_lamprow = data >> 4; if (m_lamprow && (m_lamprow < 13))
if (m_r0_sound) for (u8 i = 0; i < 4; i++)
m_r0_sound->write(offset, sndcmd); m_io_outputs[m_lamprow*4+i+5] = BIT(data, i);
if (m_r1_sound) m_soundex = m_io_outputs[18] << 4; // Sound16 line (there's a Sound32 line, but haven't found its source)
m_r1_sound->write(sndcmd); }
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() 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[0] = false;
m_in_cmd_mode[1] = false; m_in_cmd_mode[1] = false;
m_dispcmd = 0; m_dispcmd = 0;
@ -392,9 +521,6 @@ void gts80b_state::machine_reset()
m_digit[1] = 0; m_digit[1] = 0;
} }
void gts80b_state::init_gts80b()
{
}
/* with Sound Board */ /* with Sound Board */
void gts80b_state::gts80b(machine_config &config) 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); M6502(config, m_maincpu, XTAL(3'579'545)/4);
m_maincpu->set_addrmap(AS_PROGRAM, &gts80b_state::gts80b_map); 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 */ /* Video */
config.set_default_layout(layout_gts80b); config.set_default_layout(layout_gts80b);
@ -411,24 +537,21 @@ void gts80b_state::gts80b(machine_config &config)
/* Devices */ /* Devices */
riot6532_device &riot1(RIOT6532(config, "riot1", XTAL(3'579'545)/4)); riot6532_device &riot1(RIOT6532(config, "riot1", XTAL(3'579'545)/4));
riot1.in_pa_callback().set(FUNC(gts80b_state::port1a_r)); // sw_r 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.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)); 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.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.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.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)); 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.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.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 */ /* Sound */
genpin_audio(config); genpin_audio(config);
@ -438,14 +561,13 @@ void gts80b_state::gts80b(machine_config &config)
void gts80b_state::gts80b_s(machine_config &config) void gts80b_state::gts80b_s(machine_config &config)
{ {
gts80b(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) //void gts80b_state::gts80b_ss(machine_config &config)
//{ //{
// gts80b(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", 0.75);
// //GOTTLIEB_SOUND_REV1_VOTRAX(config, m_r1_sound, 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // votrax crashes
//} //}
void gts80b_state::gts80b_s1(machine_config &config) void gts80b_state::gts80b_s1(machine_config &config)
@ -1813,74 +1935,74 @@ ROM_END
} // Anonymous namespace } // Anonymous namespace
GAME(1985, bountyh, 0, gts80b_s, gts80b, gts80b_state, init_gts80b, ROT0, "Gottlieb", "Bounty Hunter", 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, init_gts80b, ROT0, "Gottlieb", "Bounty Hunter (German)", 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, init_gts80b, ROT0, "Gottlieb", "Chicago Cubs' Triple Play", 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, init_gts80b, ROT0, "Gottlieb", "Chicago Cubs' Triple Play (alternate set)", 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, init_gts80b, ROT0, "Gottlieb", "Chicago Cubs' Triple Play (German)", 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, init_gts80b, ROT0, "Gottlieb", "Rock", 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, init_gts80b, ROT0, "Gottlieb", "Rock (German)", 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, init_gts80b, ROT0, "Gottlieb", "Tag-Team Wrestling", 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, init_gts80b, ROT0, "Gottlieb", "Tag-Team Wrestling (German)", 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, init_gts80b, ROT0, "Gottlieb", "Tag-Team Wrestling (rev.2)", 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, init_gts80b, ROT0, "Gottlieb", "Raven", 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, init_gts80b, ROT0, "Gottlieb", "Raven (alternate set)", 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, init_gts80b, ROT0, "Gottlieb", "Raven (German)", 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, init_gts80b, ROT0, "Gottlieb", "Hollywood Heat", 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, init_gts80b, ROT0, "Gottlieb", "Hollywood Heat (French)", 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, init_gts80b, ROT0, "Gottlieb", "Hollywood Heat (German)", 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, init_gts80b, ROT0, "Gottlieb", "Rock Encore", 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, init_gts80b, ROT0, "Gottlieb", "Rock Encore (German)", 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, init_gts80b, ROT0, "Gottlieb", "Genesis", 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, init_gts80b, ROT0, "Gottlieb", "Genesis (French)", 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, init_gts80b, ROT0, "Gottlieb", "Genesis (German)", 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, init_gts80b, ROT0, "Gottlieb", "Amazon Hunt II (French)", 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, init_gts80b, ROT0, "Gottlieb", "Spring Break", 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, init_gts80b, ROT0, "Gottlieb", "Spring Break (alternate set)", 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, init_gts80b, ROT0, "Gottlieb", "Spring Break (French)", 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, init_gts80b, ROT0, "Gottlieb", "Spring Break (German)", 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, init_gts80b, ROT0, "Gottlieb", "Spring Break (single ball game)", 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, init_gts80b, ROT0, "Gottlieb", "Gold Wings", 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, init_gts80b, ROT0, "Gottlieb", "Gold Wings (French)", 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, init_gts80b, ROT0, "Gottlieb", "Gold Wings (German)", 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, init_gts80b, ROT0, "Gottlieb", "Monte Carlo (Pinball)", 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, init_gts80b, ROT0, "Gottlieb", "Monte Carlo (Pinball, alternate set)", 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, init_gts80b, ROT0, "Gottlieb", "Monte Carlo (Pinball, French)", 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, init_gts80b, ROT0, "Gottlieb", "Monte Carlo (Pinball, German)", 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, init_gts80b, ROT0, "Gottlieb", "Monte Carlo (Pinball, rev. 2)", 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, init_gts80b, ROT0, "Gottlieb", "Arena", 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, init_gts80b, ROT0, "Gottlieb", "Arena (alternate set)", 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, init_gts80b, ROT0, "Gottlieb", "Arena (French)", 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, init_gts80b, ROT0, "Gottlieb", "Arena (German)", 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, init_gts80b, ROT0, "Gottlieb", "Victory (Pinball)", 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, init_gts80b, ROT0, "Gottlieb", "Victory (Pinball, French)", 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, init_gts80b, ROT0, "Gottlieb", "Victory (Pinball, German)", 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, init_gts80b, ROT0, "Gottlieb", "Diamond Lady", 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, init_gts80b, ROT0, "Gottlieb", "Diamond Lady (French)", 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, init_gts80b, ROT0, "Gottlieb", "Diamond Lady (German)", 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, init_gts80b, ROT0, "Gottlieb", "TX-Sector", 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, init_gts80b, ROT0, "Gottlieb", "TX-Sector (French)", 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, init_gts80b, ROT0, "Gottlieb", "TX-Sector (German)", 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, init_gts80b, ROT0, "Gottlieb", "Big House", 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, init_gts80b, ROT0, "Gottlieb", "Big House (French)", 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, init_gts80b, ROT0, "Gottlieb", "Big House (German)", 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, init_gts80b, ROT0, "Gottlieb", "Robo-War", 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, init_gts80b, ROT0, "Gottlieb", "Robo-War (French)", 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, init_gts80b, ROT0, "Gottlieb", "Excalibur", 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, init_gts80b, ROT0, "Gottlieb", "Excalibur (French)", 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, init_gts80b, ROT0, "Gottlieb", "Excalibur (German)", 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, init_gts80b, ROT0, "Gottlieb", "Bad Girls", 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, init_gts80b, ROT0, "Gottlieb", "Bad Girls (French)", 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, init_gts80b, ROT0, "Gottlieb", "Bad Girls (German)", 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, init_gts80b, ROT0, "Gottlieb", "Hot Shots", 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, init_gts80b, ROT0, "Gottlieb", "Hot Shots (French)", 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, init_gts80b, ROT0, "Gottlieb", "Hot Shots (German)", 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, init_gts80b, ROT0, "Gottlieb", "Bone Busters Inc.", 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, init_gts80b, ROT0, "Gottlieb", "Bone Busters Inc. (French)", 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, init_gts80b, ROT0, "Gottlieb", "Bone Busters Inc. (German)", 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, init_gts80b, ROT0, "International Concepts", "Night Moves", 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, init_gts80b, ROT0, "Gottlieb", "Amazon Hunt III (French)", 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, init_gts80b, ROT0, "Gottlieb", "Amazon Hunt III (rev. 1, 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, init_gts80b, ROT0, "Gottlieb", "System 80B Test", 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, init_gts80b, ROT0, "ManilaMatic", "Master", 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, init_gts80b, ROT0, "ManilaMatic", "Top Sound (French)", 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 --> <!-- Player 1 Score -->
<element name="digit15" ref="digit"> <element name="digit5" ref="digit">
<bounds left="10" top="45" right="44" bottom="84" /> <bounds left="10" top="45" right="44" bottom="84" />
</element> </element>
<element name="digit5" ref="digit"> <element name="digit4" ref="digit">
<bounds left="54" top="45" right="88" bottom="84" /> <bounds left="54" top="45" right="88" bottom="84" />
</element> </element>
<element name="digit4" ref="digit"> <element name="digit3" ref="digit">
<bounds left="98" top="45" right="132" bottom="84" /> <bounds left="98" top="45" right="132" bottom="84" />
</element> </element>
<element name="digit3" ref="digit"> <element name="digit2" ref="digit">
<bounds left="142" top="45" right="176" bottom="84" /> <bounds left="142" top="45" right="176" bottom="84" />
</element> </element>
<element name="digit2" ref="digit"> <element name="digit1" ref="digit">
<bounds left="186" top="45" right="220" bottom="84" /> <bounds left="186" top="45" right="220" bottom="84" />
</element> </element>
<element name="digit1" ref="digit"> <element name="digit0" ref="digit">
<bounds left="230" top="45" right="264" bottom="84" /> <bounds left="230" top="45" right="264" bottom="84" />
</element> </element>
<element name="digit0" ref="digit"> <element name="digit15" ref="digit">
<bounds left="274" top="45" right="308" bottom="84" /> <bounds left="274" top="45" right="308" bottom="84" />
</element> </element>
<!-- Player 2 Score --> <!-- Player 2 Score -->
<element name="digit12" ref="digit"> <element name="digit11" ref="digit">
<bounds left="10" top="105" right="44" bottom="144" /> <bounds left="10" top="105" right="44" bottom="144" />
</element> </element>
<element name="digit11" ref="digit"> <element name="digit10" ref="digit">
<bounds left="54" top="105" right="88" bottom="144" /> <bounds left="54" top="105" right="88" bottom="144" />
</element> </element>
<element name="digit10" ref="digit"> <element name="digit9" ref="digit">
<bounds left="98" top="105" right="132" bottom="144" /> <bounds left="98" top="105" right="132" bottom="144" />
</element> </element>
<element name="digit9" ref="digit"> <element name="digit8" ref="digit">
<bounds left="142" top="105" right="176" bottom="144" /> <bounds left="142" top="105" right="176" bottom="144" />
</element> </element>
<element name="digit8" ref="digit"> <element name="digit7" ref="digit">
<bounds left="186" top="105" right="220" bottom="144" /> <bounds left="186" top="105" right="220" bottom="144" />
</element> </element>
<element name="digit7" ref="digit"> <element name="digit6" ref="digit">
<bounds left="230" top="105" right="264" bottom="144" /> <bounds left="230" top="105" right="264" bottom="144" />
</element> </element>
<element name="digit6" ref="digit"> <element name="digit12" ref="digit">
<bounds left="274" top="105" right="308" bottom="144" /> <bounds left="274" top="105" right="308" bottom="144" />
</element> </element>
<!-- Player 3 Score --> <!-- Player 3 Score -->
<element name="digit35" ref="digit"> <element name="digit25" ref="digit">
<bounds left="10" top="165" right="44" bottom="204" /> <bounds left="10" top="165" right="44" bottom="204" />
</element> </element>
<element name="digit25" ref="digit"> <element name="digit24" ref="digit">
<bounds left="54" top="165" right="88" bottom="204" /> <bounds left="54" top="165" right="88" bottom="204" />
</element> </element>
<element name="digit24" ref="digit"> <element name="digit23" ref="digit">
<bounds left="98" top="165" right="132" bottom="204" /> <bounds left="98" top="165" right="132" bottom="204" />
</element> </element>
<element name="digit23" ref="digit"> <element name="digit22" ref="digit">
<bounds left="142" top="165" right="176" bottom="204" /> <bounds left="142" top="165" right="176" bottom="204" />
</element> </element>
<element name="digit22" ref="digit"> <element name="digit21" ref="digit">
<bounds left="186" top="165" right="220" bottom="204" /> <bounds left="186" top="165" right="220" bottom="204" />
</element> </element>
<element name="digit21" ref="digit"> <element name="digit20" ref="digit">
<bounds left="230" top="165" right="264" bottom="204" /> <bounds left="230" top="165" right="264" bottom="204" />
</element> </element>
<element name="digit20" ref="digit"> <element name="digit35" ref="digit">
<bounds left="274" top="165" right="308" bottom="204" /> <bounds left="274" top="165" right="308" bottom="204" />
</element> </element>
<!-- Player 4 Score --> <!-- Player 4 Score -->
<element name="digit32" ref="digit"> <element name="digit31" ref="digit">
<bounds left="10" top="225" right="44" bottom="264" /> <bounds left="10" top="225" right="44" bottom="264" />
</element> </element>
<element name="digit31" ref="digit"> <element name="digit30" ref="digit">
<bounds left="54" top="225" right="88" bottom="264" /> <bounds left="54" top="225" right="88" bottom="264" />
</element> </element>
<element name="digit30" ref="digit"> <element name="digit29" ref="digit">
<bounds left="98" top="225" right="132" bottom="264" /> <bounds left="98" top="225" right="132" bottom="264" />
</element> </element>
<element name="digit29" ref="digit"> <element name="digit28" ref="digit">
<bounds left="142" top="225" right="176" bottom="264" /> <bounds left="142" top="225" right="176" bottom="264" />
</element> </element>
<element name="digit28" ref="digit"> <element name="digit27" ref="digit">
<bounds left="186" top="225" right="220" bottom="264" /> <bounds left="186" top="225" right="220" bottom="264" />
</element> </element>
<element name="digit27" ref="digit"> <element name="digit26" ref="digit">
<bounds left="230" top="225" right="264" bottom="264" /> <bounds left="230" top="225" right="264" bottom="264" />
</element> </element>
<element name="digit26" ref="digit"> <element name="digit32" ref="digit">
<bounds left="274" top="225" right="308" bottom="264" /> <bounds left="274" top="225" right="308" bottom="264" />
</element> </element>

View File

@ -31,94 +31,94 @@ copyright-holders:Robbbert
<!-- Player 1 Score --> <!-- Player 1 Score -->
<element name="digit15" ref="digit"> <element name="digit5" ref="digit">
<bounds left="10" top="45" right="44" bottom="84" /> <bounds left="10" top="45" right="44" bottom="84" />
</element> </element>
<element name="digit5" ref="digit"> <element name="digit4" ref="digit">
<bounds left="54" top="45" right="88" bottom="84" /> <bounds left="54" top="45" right="88" bottom="84" />
</element> </element>
<element name="digit4" ref="digit"> <element name="digit3" ref="digit">
<bounds left="98" top="45" right="132" bottom="84" /> <bounds left="98" top="45" right="132" bottom="84" />
</element> </element>
<element name="digit3" ref="digit"> <element name="digit2" ref="digit">
<bounds left="142" top="45" right="176" bottom="84" /> <bounds left="142" top="45" right="176" bottom="84" />
</element> </element>
<element name="digit2" ref="digit"> <element name="digit1" ref="digit">
<bounds left="186" top="45" right="220" bottom="84" /> <bounds left="186" top="45" right="220" bottom="84" />
</element> </element>
<element name="digit1" ref="digit"> <element name="digit0" ref="digit">
<bounds left="230" top="45" right="264" bottom="84" /> <bounds left="230" top="45" right="264" bottom="84" />
</element> </element>
<element name="digit0" ref="digit"> <element name="digit15" ref="digit">
<bounds left="274" top="45" right="308" bottom="84" /> <bounds left="274" top="45" right="308" bottom="84" />
</element> </element>
<!-- Player 2 Score --> <!-- Player 2 Score -->
<element name="digit12" ref="digit"> <element name="digit11" ref="digit">
<bounds left="10" top="105" right="44" bottom="144" /> <bounds left="10" top="105" right="44" bottom="144" />
</element> </element>
<element name="digit11" ref="digit"> <element name="digit10" ref="digit">
<bounds left="54" top="105" right="88" bottom="144" /> <bounds left="54" top="105" right="88" bottom="144" />
</element> </element>
<element name="digit10" ref="digit"> <element name="digit9" ref="digit">
<bounds left="98" top="105" right="132" bottom="144" /> <bounds left="98" top="105" right="132" bottom="144" />
</element> </element>
<element name="digit9" ref="digit"> <element name="digit8" ref="digit">
<bounds left="142" top="105" right="176" bottom="144" /> <bounds left="142" top="105" right="176" bottom="144" />
</element> </element>
<element name="digit8" ref="digit"> <element name="digit7" ref="digit">
<bounds left="186" top="105" right="220" bottom="144" /> <bounds left="186" top="105" right="220" bottom="144" />
</element> </element>
<element name="digit7" ref="digit"> <element name="digit6" ref="digit">
<bounds left="230" top="105" right="264" bottom="144" /> <bounds left="230" top="105" right="264" bottom="144" />
</element> </element>
<element name="digit6" ref="digit"> <element name="digit12" ref="digit">
<bounds left="274" top="105" right="308" bottom="144" /> <bounds left="274" top="105" right="308" bottom="144" />
</element> </element>
<!-- Player 3 Score --> <!-- Player 3 Score -->
<element name="digit35" ref="digit"> <element name="digit25" ref="digit">
<bounds left="10" top="165" right="44" bottom="204" /> <bounds left="10" top="165" right="44" bottom="204" />
</element> </element>
<element name="digit25" ref="digit"> <element name="digit24" ref="digit">
<bounds left="54" top="165" right="88" bottom="204" /> <bounds left="54" top="165" right="88" bottom="204" />
</element> </element>
<element name="digit24" ref="digit"> <element name="digit23" ref="digit">
<bounds left="98" top="165" right="132" bottom="204" /> <bounds left="98" top="165" right="132" bottom="204" />
</element> </element>
<element name="digit23" ref="digit"> <element name="digit22" ref="digit">
<bounds left="142" top="165" right="176" bottom="204" /> <bounds left="142" top="165" right="176" bottom="204" />
</element> </element>
<element name="digit22" ref="digit"> <element name="digit21" ref="digit">
<bounds left="186" top="165" right="220" bottom="204" /> <bounds left="186" top="165" right="220" bottom="204" />
</element> </element>
<element name="digit21" ref="digit"> <element name="digit20" ref="digit">
<bounds left="230" top="165" right="264" bottom="204" /> <bounds left="230" top="165" right="264" bottom="204" />
</element> </element>
<element name="digit20" ref="digit"> <element name="digit35" ref="digit">
<bounds left="274" top="165" right="308" bottom="204" /> <bounds left="274" top="165" right="308" bottom="204" />
</element> </element>
<!-- Player 4 Score --> <!-- Player 4 Score -->
<element name="digit32" ref="digit"> <element name="digit31" ref="digit">
<bounds left="10" top="225" right="44" bottom="264" /> <bounds left="10" top="225" right="44" bottom="264" />
</element> </element>
<element name="digit31" ref="digit"> <element name="digit30" ref="digit">
<bounds left="54" top="225" right="88" bottom="264" /> <bounds left="54" top="225" right="88" bottom="264" />
</element> </element>
<element name="digit30" ref="digit"> <element name="digit29" ref="digit">
<bounds left="98" top="225" right="132" bottom="264" /> <bounds left="98" top="225" right="132" bottom="264" />
</element> </element>
<element name="digit29" ref="digit"> <element name="digit28" ref="digit">
<bounds left="142" top="225" right="176" bottom="264" /> <bounds left="142" top="225" right="176" bottom="264" />
</element> </element>
<element name="digit28" ref="digit"> <element name="digit27" ref="digit">
<bounds left="186" top="225" right="220" bottom="264" /> <bounds left="186" top="225" right="220" bottom="264" />
</element> </element>
<element name="digit27" ref="digit"> <element name="digit26" ref="digit">
<bounds left="230" top="225" right="264" bottom="264" /> <bounds left="230" top="225" right="264" bottom="264" />
</element> </element>
<element name="digit26" ref="digit"> <element name="digit32" ref="digit">
<bounds left="274" top="225" right="308" bottom="264" /> <bounds left="274" top="225" right="308" bottom="264" />
</element> </element>