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