summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--docs/source/advanced/bgfx.rst5
-rw-r--r--docs/source/luascript/ref-devices.rst4
-rw-r--r--src/emu/emuopts.cpp2
-rw-r--r--src/emu/emuopts.h4
-rw-r--r--src/frontend/mame/ui/mainmenu.cpp7
-rw-r--r--src/frontend/mame/ui/sndmenu.cpp13
-rw-r--r--src/frontend/mame/ui/sndmenu.h3
-rw-r--r--src/mame/excellent/es9501.cpp28
-rw-r--r--src/mame/igs/igs011.cpp17
-rw-r--r--src/mame/mame.lst4
-rw-r--r--src/mame/misc/gms.cpp703
-rw-r--r--src/mame/misc/umipoker.cpp24
-rw-r--r--src/mame/wing/luckgrln.cpp27
-rw-r--r--src/osd/modules/sound/pipewire_sound.cpp17
-rw-r--r--src/osd/modules/sound/sdl_sound.cpp9
15 files changed, 508 insertions, 359 deletions
diff --git a/docs/source/advanced/bgfx.rst b/docs/source/advanced/bgfx.rst
index bb6e4205fa3..2b492265d84 100644
--- a/docs/source/advanced/bgfx.rst
+++ b/docs/source/advanced/bgfx.rst
@@ -86,8 +86,8 @@ bgfx_path
the *bgfx* folder in your MAME installation folder.
bgfx_backend
Selects a rendering backend for BGFX to use. Possible choices include
- ``d3d9``, ``d3d11``, ``d3d12``, ``opengl``, ``gles``, ``metal``, and
- ```vulkan``. The default is ``**auto**``, which will let MAME choose the
+ ``auto``, ``d3d9``, ``d3d11``, ``d3d12``, ``opengl``, ``gles``, ``metal``, and
+ ``vulkan``. The default is ``auto``, which will let MAME choose the
best selection for you.
* ``d3d9`` -- Direct3D 9.0 Renderer (Requires Windows XP or higher)
@@ -101,6 +101,7 @@ bgfx_backend
newer)
* ``vulkan`` -- Vulkan Renderer (Requires Windows or Linux with compatible
GPU drivers.
+ * ``auto`` -- MAME will automatically choose the best selection for you.
bgfx_debug
Enables BGFX debugging features. Most users will not need to use this.
bgfx_screen_chains
diff --git a/docs/source/luascript/ref-devices.rst b/docs/source/luascript/ref-devices.rst
index fe25e0b0591..e4e4ba9f328 100644
--- a/docs/source/luascript/ref-devices.rst
+++ b/docs/source/luascript/ref-devices.rst
@@ -630,7 +630,7 @@ image.device (read-only)
.. _luascript-ref-disound:
Sound device interface
----------------------
+----------------------
Wraps MAME’s ``device_sound_interface`` class which is a mix-in implemented by
devices that input and/or output sound.
@@ -664,7 +664,7 @@ sound.io_positions[] (read-only)
sound.io_names[] (read-only)
Non-empty only for microphones and speakers, indicates the positions of
the inputs or outputs as strings (e.g. Front Left)
-
+
sound.hook
A boolean indicating whether to tap the output samples of this device in
the global sound hook.
diff --git a/src/emu/emuopts.cpp b/src/emu/emuopts.cpp
index 18b37734465..ba8fa0ec265 100644
--- a/src/emu/emuopts.cpp
+++ b/src/emu/emuopts.cpp
@@ -144,8 +144,6 @@ const options_entry emu_options::s_option_entries[] =
{ OPTION_SAMPLERATE ";sr(1000-1000000)", "48000", core_options::option_type::INTEGER, "set sound output sample rate" },
{ OPTION_SAMPLES, "1", core_options::option_type::BOOLEAN, "enable the use of external samples if available" },
{ OPTION_VOLUME ";vol", "0", core_options::option_type::INTEGER, "sound volume in decibels (-32 min, 0 max)" },
- { OPTION_COMPRESSOR, "1", core_options::option_type::BOOLEAN, "enable compressor for sound" },
- { OPTION_SPEAKER_REPORT "(0-4)", "0", core_options::option_type::INTEGER, "print report of speaker ouput maxima (0=none, or 1-4 for more detail)" },
// input options
{ nullptr, nullptr, core_options::option_type::HEADER, "CORE INPUT OPTIONS" },
diff --git a/src/emu/emuopts.h b/src/emu/emuopts.h
index 0a1b1dcf413..a4db1e0e57e 100644
--- a/src/emu/emuopts.h
+++ b/src/emu/emuopts.h
@@ -119,8 +119,6 @@
#define OPTION_SAMPLERATE "samplerate"
#define OPTION_SAMPLES "samples"
#define OPTION_VOLUME "volume"
-#define OPTION_COMPRESSOR "compressor"
-#define OPTION_SPEAKER_REPORT "speaker_report"
// core input options
#define OPTION_COIN_LOCKOUT "coin_lockout"
@@ -405,8 +403,6 @@ public:
int sample_rate() const { return int_value(OPTION_SAMPLERATE); }
bool samples() const { return bool_value(OPTION_SAMPLES); }
int volume() const { return int_value(OPTION_VOLUME); }
- bool compressor() const { return bool_value(OPTION_COMPRESSOR); }
- int speaker_report() const { return int_value(OPTION_SPEAKER_REPORT); }
// core input options
bool coin_lockout() const { return bool_value(OPTION_COIN_LOCKOUT); }
diff --git a/src/frontend/mame/ui/mainmenu.cpp b/src/frontend/mame/ui/mainmenu.cpp
index 84eee41f239..bef3b5a2bfb 100644
--- a/src/frontend/mame/ui/mainmenu.cpp
+++ b/src/frontend/mame/ui/mainmenu.cpp
@@ -161,9 +161,12 @@ void menu_main::populate()
if (network_interface_enumerator(machine().root_device()).first() != nullptr)
item_append(_("menu-main", "Network Devices"), 0, (void*)NETWORK_DEVICES);
- item_append(_("menu-main", "Audio Mixer"), 0, (void *)AUDIO_MIXER);
+ if (sound_interface_enumerator(machine().root_device()).first() != nullptr)
+ {
+ item_append(_("menu-main", "Audio Mixer"), 0, (void *)AUDIO_MIXER);
- item_append(_("menu-main", "Audio Effects"), 0, (void *)AUDIO_EFFECTS);
+ item_append(_("menu-main", "Audio Effects"), 0, (void *)AUDIO_EFFECTS);
+ }
if (!ui().get_slider_list().empty())
item_append(_("menu-main", "Slider Controls"), 0, (void *)SLIDERS);
diff --git a/src/frontend/mame/ui/sndmenu.cpp b/src/frontend/mame/ui/sndmenu.cpp
index 32a590b9730..0b05d4148ad 100644
--- a/src/frontend/mame/ui/sndmenu.cpp
+++ b/src/frontend/mame/ui/sndmenu.cpp
@@ -34,7 +34,6 @@ menu_sound_options::menu_sound_options(mame_ui_manager &mui, render_container &c
m_sample_rate = mui.machine().options().sample_rate();
m_sound = (strcmp(options.sound(), OSDOPTVAL_NONE) && strcmp(options.sound(), "0"));
m_samples = mui.machine().options().samples();
- m_compressor = mui.machine().options().compressor();
int total = std::size(m_sound_rate);
@@ -57,9 +56,6 @@ void menu_sound_options::menu_dismissed()
if (strcmp(moptions.value(OSDOPTION_SOUND), m_sound ? OSDOPTVAL_AUTO : OSDOPTVAL_NONE))
moptions.set_value(OSDOPTION_SOUND, m_sound ? OSDOPTVAL_AUTO : OSDOPTVAL_NONE, OPTION_PRIORITY_CMDLINE);
- if (moptions.bool_value(OPTION_COMPRESSOR) != m_compressor)
- moptions.set_value(OPTION_COMPRESSOR, m_compressor, OPTION_PRIORITY_CMDLINE);
-
if (moptions.int_value(OPTION_SAMPLERATE) != m_sound_rate[m_cur_rates])
moptions.set_value(OPTION_SAMPLERATE, m_sound_rate[m_cur_rates], OPTION_PRIORITY_CMDLINE);
@@ -88,14 +84,6 @@ bool menu_sound_options::handle(event const *ev)
}
break;
- case ENABLE_COMPRESSOR:
- if (ev->iptkey == IPT_UI_LEFT || ev->iptkey == IPT_UI_RIGHT || ev->iptkey == IPT_UI_SELECT)
- {
- m_compressor = !m_compressor;
- changed = true;
- }
- break;
-
case SAMPLE_RATE:
if (ev->iptkey == IPT_UI_LEFT || ev->iptkey == IPT_UI_RIGHT)
{
@@ -146,7 +134,6 @@ void menu_sound_options::populate()
// add options items
item_append_on_off(_("Sound"), m_sound, 0, (void *)(uintptr_t)ENABLE_SOUND);
- item_append_on_off(_("Compressor"), m_compressor, 0, (void *)(uintptr_t)ENABLE_COMPRESSOR);
item_append(_("Sample Rate"), string_format("%d", m_sample_rate), arrow_flags, (void *)(uintptr_t)SAMPLE_RATE);
item_append_on_off(_("Use External Samples"), m_samples, 0, (void *)(uintptr_t)ENABLE_SAMPLES);
item_append(menu_item_type::SEPARATOR);
diff --git a/src/frontend/mame/ui/sndmenu.h b/src/frontend/mame/ui/sndmenu.h
index 01d69f6d8ff..4a5eadfc581 100644
--- a/src/frontend/mame/ui/sndmenu.h
+++ b/src/frontend/mame/ui/sndmenu.h
@@ -33,7 +33,6 @@ private:
enum
{
ENABLE_SOUND = 1,
- ENABLE_COMPRESSOR,
SAMPLE_RATE,
ENABLE_SAMPLES
};
@@ -44,7 +43,7 @@ private:
uint16_t m_cur_rates;
static const int m_sound_rate[];
int m_sample_rate;
- bool m_samples, m_sound, m_compressor;
+ bool m_samples, m_sound;
};
} // namespace ui
diff --git a/src/mame/excellent/es9501.cpp b/src/mame/excellent/es9501.cpp
index 627d5675102..2b4fc9a09d9 100644
--- a/src/mame/excellent/es9501.cpp
+++ b/src/mame/excellent/es9501.cpp
@@ -3,6 +3,7 @@
/*
Excellent System's ES-9501 PCB
+Also seen as ES9901 with same components / locations
Main components:
TMP68HC000-P16 CPU
@@ -173,8 +174,7 @@ void es9501_state::es9501(machine_config &config)
ymz.add_route(1, "speaker", 1.0, 1);
ymz284_device & ymz284(YMZ284(config, "ymz284", 28.636363_MHz_XTAL / 8)); // divider not verified
- ymz284.add_route(0, "speaker", 1.0, 0);
- ymz284.add_route(1, "speaker", 1.0, 1);
+ ymz284.add_route(ALL_OUTPUTS, "speaker", 1.0);
}
@@ -197,6 +197,25 @@ ROM_START( d9flower ) // Dream 9 Flower string, but images seem more Flower 9 Dr
ROM_LOAD( "3.u37", 0x000, 0x117, BAD_DUMP CRC(bea4cb24) SHA1(09987e6b903cc3bd202a9d933474b36bdbb99d9a) ) // not dumped for this set, but marked same
ROM_END
+ROM_START( d9flowera ) // same GFX / sound ROMs as d9flower, updated program (but version string unchanged)
+ ROM_REGION( 0x80000, "maincpu", 0 )
+ ROM_LOAD16_BYTE( "2.u33", 0x00000, 0x40000, CRC(803efc2d) SHA1(1e9c6b4c8adb2c8c837fe36f8c9c7c2aa3e675d8) ) // 1xxxxxxxxxxxxxxxxx = 0xFF
+ ROM_LOAD16_BYTE( "1.u31", 0x00001, 0x40000, CRC(37186597) SHA1(b67c9fd057b7cc115866f73ecfdd57bb8dd09d7b) ) // 1xxxxxxxxxxxxxxxxx = 0xFF
+
+ ROM_REGION( 0x200000, "gfx", ROMREGION_ERASE00 )
+ ROM_LOAD( "j3.u50", 0x000000, 0x080000, CRC(0f1f8b61) SHA1(d33d73dcdbf06a84e6be28ac1c3273dd21d0ad17) )
+ ROM_LOAD( "j4.u51", 0x080000, 0x080000, CRC(c2a06ed5) SHA1(ffb07982f9ad91ce28bf3eacb8deedcc957bbbc1) )
+
+ ROM_REGION( 0x200000, "ymz", ROMREGION_ERASE00 )
+ ROM_LOAD( "j5.u23", 0x000000, 0x080000, CRC(b6ad2e58) SHA1(84c0cdc155f641d4e5d8ae99acbfa5b297762418) )
+
+ ROM_REGION16_BE( 0x100, "eeprom", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "93c56.u12", 0x000, 0x100, NO_DUMP )
+
+ ROM_REGION( 0x117, "plds", 0 )
+ ROM_LOAD( "003.u37", 0x000, 0x117, BAD_DUMP CRC(bea4cb24) SHA1(09987e6b903cc3bd202a9d933474b36bdbb99d9a) ) // not dumped for this set, but probably same
+ROM_END
+
ROM_START( specd9 )
ROM_REGION( 0x80000, "maincpu", 0 )
ROM_LOAD16_BYTE( "3.u33", 0x00000, 0x40000, CRC(e4b00f37) SHA1(4c33912b7c38399ba2ca5e4dc0335458d929bd52) )
@@ -219,5 +238,6 @@ ROM_END
} // anonymous namespace
-GAME( 1998, d9flower, 0, es9501, specd9, es9501_state, empty_init, ROT0, "Cadence Technology", "Dream 9 Flower (v1.00c)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
-GAME( 1997, specd9, 0, es9501, specd9, es9501_state, empty_init, ROT0, "Excellent System", "Special Dream 9 (v1.0.5G)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 1998, d9flower, 0, es9501, specd9, es9501_state, empty_init, ROT0, "Cadence Technology", "Dream 9 Flower (v1.00c, set 1)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 1998, d9flowera, d9flower, es9501, specd9, es9501_state, empty_init, ROT0, "Cadence Technology", "Dream 9 Flower (v1.00c, set 2)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 1997, specd9, 0, es9501, specd9, es9501_state, empty_init, ROT0, "Excellent System", "Special Dream 9 (v1.0.5G)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
diff --git a/src/mame/igs/igs011.cpp b/src/mame/igs/igs011.cpp
index a10619ea2b5..93ccbd5d338 100644
--- a/src/mame/igs/igs011.cpp
+++ b/src/mame/igs/igs011.cpp
@@ -64,6 +64,8 @@ To do:
- xymga: stop during attract mode with 'RECORD ERROR 3'
+- lhb2cpgs: decryption and protection simulation
+
Notes:
- In most games, keep test button pressed during boot for another test mode
@@ -4871,6 +4873,20 @@ ROM_START( lhb2 )
ROM_LOAD( "igss0503.u38", 0x00000, 0x80000, CRC(c9609c9c) SHA1(f036e682b792033409966e84292a69275eaa05e5) ) // 2 banks
ROM_END
+ROM_START( lhb2cpgs )
+ ROM_REGION( 0x80000, "maincpu", 0 )
+ ROM_LOAD16_WORD_SWAP( "v127c.u29", 0x00000, 0x80000, CRC(c9609c9c) SHA1(f036e682b792033409966e84292a69275eaa05e5) )
+
+ ROM_REGION( 0x200000, "blitter", 0 )
+ ROM_LOAD( "igsm0501.u7", 0x00000, 0x200000, CRC(1c952bd6) SHA1(a6b6f1cdfb29647e81c032ffe59c94f1a10ceaf8) )
+
+ ROM_REGION( 0x80000, "blitter_hi", 0 )
+ ROM_LOAD( "igsm0502.u4", 0x00000, 0x80000, CRC(5d73ae99) SHA1(7283aa3d6b15ceb95db80756892be46eb997ef15) )
+
+ ROM_REGION( 0x80000, "oki", 0 )
+ ROM_LOAD( "igss0503.u38", 0x00000, 0x80000, CRC(c9609c9c) SHA1(f036e682b792033409966e84292a69275eaa05e5) ) // 2 banks
+ROM_END
+
ROM_START( lhb3 ) // 龍虎榜III 搓牌高手 (Lóng Hǔ Bǎng III Cuō Pái Gāoshǒu) very similar to lhb2's, but not original?
ROM_REGION( 0x80000, "maincpu", 0 )
ROM_LOAD16_WORD_SWAP( "rom.u29", 0x00000, 0x80000, CRC(c5985452) SHA1(f1f0c2b1b8c509b2a0a72a4f3387eccb0f25008a) )
@@ -5139,6 +5155,7 @@ GAME( 1995, lhbv33c, lhb, lhb, lhb, igs011_state, i
GAME( 1995, dbc, lhb, lhb, lhb, igs011_state, init_dbc, ROT0, "IGS", "Daai Baan Sing (Hong Kong, V027H)", MACHINE_SUPPORTS_SAVE )
GAME( 1995, ryukobou, lhb, lhb, lhb, igs011_state, init_ryukobou, ROT0, "IGS / Alta", "Mahjong Ryukobou (Japan, V030J)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, lhb2, 0, lhb2, lhb2, igs011_state, init_lhb2, ROT0, "IGS", "Lung Fu Bong II (Hong Kong, V185H)", MACHINE_SUPPORTS_SAVE )
+GAME( 1996, lhb2cpgs, lhb2, lhb2, lhb2, igs011_state, empty_init, ROT0, "IGS", "Long Hu Bang II: Cuo Pai Gaoshou (China, V127C)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) // missing decryption / protection simulation
GAME( 1996, tygn, lhb2, tygn, tygn, igs011_state, init_tygn, ROT0, "IGS", "Te Yi Gong Neng (China, V632C)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION ) // ROM patches
GAME( 1996, lhb3, lhb2, nkishusp, lhb2, igs011_state, init_lhb3, ROT0, "IGS", "Long Hu Bang III: Cuo Pai Gaoshou (China, V242C)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION ) // ROM patches
GAME( 1996, xymg, 0, xymg, xymg, igs011_state, init_xymg, ROT0, "IGS", "Xingyun Manguan (China, V651C, set 1)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 659f86c2ac8..70ec12aa4db 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -18066,6 +18066,7 @@ dream9
@source:excellent/es9501.cpp
d9flower
+d9flowera
specd9
@source:excellent/gcpinbal.cpp
@@ -20535,6 +20536,7 @@ drgnwrldv30
drgnwrldv40k
lhb
lhb2
+lhb2cpgs
lhb3
lhbv33c
nkishusp
@@ -32765,6 +32767,7 @@ twinbskt
saiyukip
umipoker
umipokera
+vparadis
@source:misc/unkgolf.cpp
unkgolf
@@ -47617,6 +47620,7 @@ wicat
7smash
luckgrln
luckstrn
+luckstrna
@source:wing/lucky37.cpp
bingo75
diff --git a/src/mame/misc/gms.cpp b/src/mame/misc/gms.cpp
index 50ad5cd4c23..9c6f93d435a 100644
--- a/src/mame/misc/gms.cpp
+++ b/src/mame/misc/gms.cpp
@@ -65,23 +65,31 @@ Notes:
S1 - 27C2000 / 232000 mask ROM (OKI samples)
Hold test (F2) and press reset (F3) to enter service mode.
+The default password is usually Start eight times.
TODO:
- work out how Flip Flop input is read in mahjong games in mahjong keyboard mode
- in baile, Payout key doesn't work in mahjong keyboard mode (input test
recognises it as both Payout and Flip Flop)
+- sc2in1 recognises the Payout key in the input test but it appears to have no
+ effect in the game
- correct EEPROM hookup for all games (this would get rid of a lot of ROM
patches)
- hookup MCU and YM2151 / YM3812 sound for the mahjong games
- hookup PIC16F84 for rbspm
- emulate protection devices correctly instead of patching
-- hookup lamps and do layouts
+- work out remaining magslot lamps
+- work out remaining sball2k1 I/O
+- complete inputs and work out lamps for ballch and cots
+- do layouts
- use real values for reel tilemaps offsets instead of hardcoded ones (would fix
magslot)
- game logic seems broken in mahjong games (Reach permitted when it shouldn't
be, Chi not permitted when it should be, other issues)
- broken title GFX in yyhm (transparent pen problem?)
- the newer games seem to use range 0x9e1000-0x9e1fff during gameplay
+- if sball2k1 "Comma" DIP switch is set to "No. 6", the game will give a hopper
+ error on start - probably expects hopper on a different bit
Video references:
rbspm: https://www.youtube.com/watch?v=pPk-6N1wXoE
@@ -136,6 +144,7 @@ public:
, m_counters(*this, "COUNTERS")
, m_dsw(*this, "DSW%u", 1U)
, m_key(*this, "KEY%u", 0U)
+ , m_lamps(*this, "lamp%u", 1U)
{
}
@@ -159,6 +168,7 @@ public:
template <unsigned N> void counter_w(int state);
protected:
+ virtual void machine_start() override ATTR_COLD;
virtual void video_start() override ATTR_COLD;
optional_shared_ptr_array<uint16_t, 2> m_vidram;
@@ -177,6 +187,8 @@ protected:
optional_ioport_array<4> m_dsw;
optional_ioport_array<5> m_key;
+ output_finder<8> m_lamps;
+
uint16_t m_reels_toggle = 0;
uint16_t m_tilebank = 0;
tilemap_t *m_reel_tilemap[4];
@@ -184,6 +196,7 @@ protected:
void super555_mem(address_map &map) ATTR_COLD;
+ void lamps_w(uint16_t data);
template <uint8_t Which> void vram_w(offs_t offset, uint16_t data, uint16_t mem_mask);
template <uint8_t Which> void reelram_w(offs_t offset, uint16_t data, uint16_t mem_mask);
@@ -325,6 +338,32 @@ void gms_2layers_state::input_matrix_w(uint16_t data)
m_oki->set_rom_bank(BIT(data, 15));
}
+void gms_2layers_state::lamps_w(uint16_t data)
+{
+ // There seem to be eight lamps on the low eight bits (active high):
+ // +------+----------------------+----------+------------------+
+ // | lamp | sball2k1 | sc2in1 | magslot |
+ // +------+----------------------+----------+------------------+
+ // | 1 | Start | Start | Start |
+ // | 2 | Hold 2 | Hold 2 | ? |
+ // | 3 | Hold 4 | Hold 4 | ? |
+ // | 4 | Hold 1 | Hold 1 | ? |
+ // | 5 | Hold 3 | Hold 3 | ? |
+ // | 6 | Hold 5 | Hold 5 | Stop Reel 3 |
+ // | 7 | used in attract mode | credited | ? |
+ // | 8 | | Bet | ? |
+ // +------+----------------------+----------+------------------+
+ // sball2k1 attract mode "chase" is 4, 2, 5, 3, 6, 7
+ // magslot lamp 2 is Stop Reel 4, Stop Reel 5, Bet or Bet Max
+ // magslot lamp 3 is Stop Reel 4, Stop Reel 5, Bet or Bet Max
+ // magslot lamp 4 is Stop Reel 4, Stop Reel 5, Bet or Bet Max
+ // magslot lamp 5 is Stop Reel 1 or Stop Reel 2
+ // magslot lamp 7 is Stop Reel 1 or Stop Reel 2
+ // magslot lamp 8 is Stop Reel 4, Stop Reel 5, Bet or Bet Max
+ for (unsigned i = 0; 8 > i; ++i)
+ m_lamps[i] = BIT(data, i);
+}
+
void gms_2layers_state::eeprom_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
if (ACCESSING_BITS_0_7)
@@ -427,7 +466,7 @@ void gms_2layers_state::super555_mem(address_map &map)
map(0x620000, 0x620000).r(m_oki, FUNC(okim6295_device::read)); // Oki controlled through a GAL at 18C
// map(0x620080, 0x620081).lw16(NAME([this] (uint16_t data) { m_prot_data = data; })); // writes something here that expects to read above
map(0x628000, 0x628000).w(m_oki, FUNC(okim6295_device::write));
- map(0x638000, 0x638001).nopw(); // lamps / outputs?
+ map(0x638000, 0x638001).w(FUNC(gms_2layers_state::lamps_w));
map(0x900000, 0x900fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x940000, 0x9403ff).ram().w(FUNC(gms_2layers_state::reelram_w<0>)).share(m_reelram[0]);
map(0x940400, 0x9407ff).ram().w(FUNC(gms_2layers_state::reelram_w<1>)).share(m_reelram[1]);
@@ -519,7 +558,6 @@ void gms_2layers_state::mcu_io(address_map &map)
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) PORT_CONDITION(dsw_port, dsw_bit, NOTEQUALS, dsw_on) \
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) PORT_CONDITION(dsw_port, dsw_bit, NOTEQUALS, dsw_on) \
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_GAMBLE_KEYIN ) PORT_CONDITION(dsw_port, dsw_bit, NOTEQUALS, dsw_on) \
- PORT_BIT( 0x00f8, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION(dsw_port, dsw_bit, NOTEQUALS, dsw_on) \
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) PORT_CONDITION(dsw_port, dsw_bit, NOTEQUALS, dsw_on) \
PORT_BIT( 0x0600, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION(dsw_port, dsw_bit, NOTEQUALS, dsw_on) \
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT ) PORT_CONDITION(dsw_port, dsw_bit, NOTEQUALS, dsw_on) \
@@ -580,7 +618,9 @@ void gms_2layers_state::mcu_io(address_map &map)
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CONDITION(dsw_port, dsw_bit, NOTEQUALS, dsw_on) \
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CONDITION(dsw_port, dsw_bit, NOTEQUALS, dsw_on) \
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CONDITION(dsw_port, dsw_bit, NOTEQUALS, dsw_on) \
- PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CONDITION(dsw_port, dsw_bit, NOTEQUALS, dsw_on)
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CONDITION(dsw_port, dsw_bit, NOTEQUALS, dsw_on) \
+ PORT_MODIFY("IN2") \
+ PORT_BIT( 0x00f8, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION(dsw_port, dsw_bit, NOTEQUALS, dsw_on)
#define GMS_MAHJONG_COINAGE(tag, loc) \
PORT_DIPNAME( 0x0007, 0x0000, DEF_STR(Coinage) ) PORT_DIPLOCATION(loc ":1,2,3") /* 投幣比例 */ \
@@ -946,49 +986,49 @@ INPUT_PORTS_END
static INPUT_PORTS_START( magslot )
PORT_START("COUNTERS")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<1>)) // key-in
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<0>)) // coin in
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<1>)) // coin 2 in
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<0>)) // coin 1 in
PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("hopper", FUNC(hopper_device::motor_w))
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<3>)) // key-out
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<2>)) // coin out
PORT_START("IN1")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_SERVICE )
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN1 )
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_START1 )
- PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("Bet Max") // seems to be used to bet the allowed maximum
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Start / Stop All / Take Score")
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_SLOT_STOP_ALL ) PORT_NAME("Bet Max") // seems to be used to bet the allowed maximum
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_GAMBLE_BET )
- PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("Show Info")
- PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("9 Lines")
- PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("3 Lines")
- PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("5 Lines")
- PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("1 Line")
- PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("7 Lines")
- PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
- PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
- PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Show Odds")
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_SLOT_STOP5 ) PORT_NAME("Stop 5 / Bet on 9 Lines")
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_SLOT_STOP2 ) PORT_NAME("Stop 2 / Bet on 3 Lines")
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_SLOT_STOP3 ) PORT_NAME("Stop 3 / Bet on 5 Lines / Double Up")
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_SLOT_STOP1 ) PORT_NAME("Stop 1 / Bet on 1 Line")
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_SLOT_STOP4 ) PORT_NAME("Stop 4 / Bet on 7 Lines")
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
PORT_START("IN2")
- PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) PORT_TOGGLE
- PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) PORT_TOGGLE
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MEMORY_RESET )
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT )
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
- PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
- PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT )
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("hopper", FUNC(hopper_device::line_r))
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // but recognized for password entering
PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", FUNC(eeprom_serial_93cxx_device::do_read)) // TODO: verify
- // 3 8-dip banks on PCB
+ // 3 8-switch banks on PCB
PORT_START("DSW1") // Game setup is password protected, needs reverse engineering of the password
PORT_DIPNAME( 0x0001, 0x0000, "Game Password" )
PORT_DIPSETTING( 0x0000, DEF_STR( Normal ) )
@@ -1071,11 +1111,11 @@ INPUT_PORTS_END
static INPUT_PORTS_START( super555 )
PORT_START("COUNTERS")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<1>)) // key-in
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<0>)) // coin in
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<1>)) // note in
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<0>)) // credit in
PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("hopper", FUNC(hopper_device::motor_w))
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<3>)) // key-out
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<2>)) // coin out
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<2>)) // credit out
PORT_START("IN1")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -1087,7 +1127,7 @@ static INPUT_PORTS_START( super555 )
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_NAME(u8"Hold 1 / Double Up × 2 / Big")
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) PORT_NAME(u8"Hold 3 / Double Up × ½ / Small")
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_POKER_HOLD4 )
- PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_POKER_HOLD5 )
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) PORT_NAME("Hold 5 / Draw Again")
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_GAMBLE_BET )
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -1114,32 +1154,32 @@ static INPUT_PORTS_START( super555 )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
//PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", FUNC(eeprom_serial_93cxx_device::do_read)) // TODO: verify
-
- // There are 4 banks of 8 DIP switches on the PCB but only 3 are shown in test mode. DIP switch settings as per test mode.
+ // There are 4 banks of 8 DIP switches on the PCB but only 3 are shown in test mode.
+ // DIP switch settings as per test mode.
PORT_START("DSW1")
- PORT_DIPNAME( 0x0003, 0x0000, "Main Game Rate" ) PORT_DIPLOCATION("SW1:1,2")
- PORT_DIPSETTING( 0x0003, DEF_STR( Easy ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( Normal ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Hard ) )
- PORT_DIPSETTING( 0x0001, DEF_STR( Hardest ) )
- PORT_DIPNAME( 0x0004, 0x0000, "Limit Over Score" ) PORT_DIPLOCATION("SW1:3")
- PORT_DIPSETTING( 0x0000, "100.000" )
- PORT_DIPSETTING( 0x0004, "200.000" )
- PORT_DIPNAME( 0x0008, 0x0000, "Coin/Key In Over Score" ) PORT_DIPLOCATION("SW1:4")
- PORT_DIPSETTING( 0x0000, "30.000" )
- PORT_DIPSETTING( 0x0008, "50.000" )
- PORT_DIPNAME( 0x0010, 0x0000, "W-Up Game" ) PORT_DIPLOCATION("SW1:5")
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0000, "W-Up Game Rate" ) PORT_DIPLOCATION("SW1:6") // only has effect if the above one is on.
- PORT_DIPSETTING( 0x0020, DEF_STR( Easy ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( Normal ) )
- PORT_DIPNAME( 0x0040, 0x0000, "Auto Mode" ) PORT_DIPLOCATION("SW1:7")
+ PORT_DIPNAME( 0x0003, 0x0000, "Main Game Payout Rate" ) PORT_DIPLOCATION("SW1:1,2")
+ PORT_DIPSETTING( 0x0003, DEF_STR(Easy) )
+ PORT_DIPSETTING( 0x0000, DEF_STR(Normal) )
+ PORT_DIPSETTING( 0x0002, DEF_STR(Hard) )
+ PORT_DIPSETTING( 0x0001, DEF_STR(Hardest) )
+ PORT_DIPNAME( 0x0004, 0x0000, "Score Limit" ) PORT_DIPLOCATION("SW1:3")
+ PORT_DIPSETTING( 0x0000, "100,000" )
+ PORT_DIPSETTING( 0x0004, "200,000" )
+ PORT_DIPNAME( 0x0008, 0x0000, "Credit Limit" ) PORT_DIPLOCATION("SW1:4")
+ PORT_DIPSETTING( 0x0000, "30,000" )
+ PORT_DIPSETTING( 0x0008, "50,000" )
+ PORT_DIPNAME( 0x0010, 0x0000, "Double Up Game" ) PORT_DIPLOCATION("SW1:5")
+ PORT_DIPSETTING( 0x0010, DEF_STR(Off) )
+ PORT_DIPSETTING( 0x0000, DEF_STR(On) )
+ PORT_DIPNAME( 0x0020, 0x0000, "Double Up Game Payout Rate" ) PORT_DIPLOCATION("SW1:6") // only has effect if the above one is on.
+ PORT_DIPSETTING( 0x0020, DEF_STR(Easy) )
+ PORT_DIPSETTING( 0x0000, DEF_STR(Normal) )
+ PORT_DIPNAME( 0x0040, 0x0000, "Auto Mode" ) PORT_DIPLOCATION("SW1:7")
PORT_DIPSETTING( 0x0040, "Good" )
PORT_DIPSETTING( 0x0000, "Hits" )
- PORT_DIPNAME( 0x0080, 0x0000, "Five Bars" ) PORT_DIPLOCATION("SW1:8")
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0000, "Five Bars" ) PORT_DIPLOCATION("SW1:8")
+ PORT_DIPSETTING( 0x0080, DEF_STR(Off) )
+ PORT_DIPSETTING( 0x0000, DEF_STR(On) )
PORT_DIPUNKNOWN_DIPLOC( 0x0100, 0x0000, "SW4:1" )
PORT_DIPUNKNOWN_DIPLOC( 0x0200, 0x0000, "SW4:2" )
PORT_DIPUNKNOWN_DIPLOC( 0x0400, 0x0000, "SW4:3" )
@@ -1150,53 +1190,81 @@ static INPUT_PORTS_START( super555 )
PORT_DIPUNKNOWN_DIPLOC( 0x8000, 0x0000, "SW4:8" )
PORT_START("DSW2")
- PORT_DIPNAME( 0x0007, 0x0000, "Coin Rate" ) PORT_DIPLOCATION("SW2:1,2,3")
- PORT_DIPSETTING( 0x0001, "5" )
- PORT_DIPSETTING( 0x0002, "10" )
- PORT_DIPSETTING( 0x0003, "20" )
- PORT_DIPSETTING( 0x0004, "30" )
- PORT_DIPSETTING( 0x0000, "50" )
- PORT_DIPSETTING( 0x0005, "100" )
- PORT_DIPSETTING( 0x0006, "200" )
- PORT_DIPSETTING( 0x0007, "300" )
- PORT_DIPNAME( 0x0018, 0x0000, "Coin x Times Rate" ) PORT_DIPLOCATION("SW2:4,5")
- PORT_DIPSETTING( 0x0000, "2" )
- PORT_DIPSETTING( 0x0008, "5" )
- PORT_DIPSETTING( 0x0010, "10" )
- PORT_DIPSETTING( 0x0018, "20" )
- PORT_DIPNAME( 0x0020, 0x0000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:6")
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0000, "Counter Jumping" ) PORT_DIPLOCATION("SW2:7")
+ PORT_DIPNAME( 0x0007, 0x0000, DEF_STR(Coinage) ) PORT_DIPLOCATION("SW2:1,2,3")
+ PORT_DIPSETTING( 0x0001, DEF_STR(1C_5C) )
+ PORT_DIPSETTING( 0x0002, "1 Coin/10 Credits" )
+ PORT_DIPSETTING( 0x0003, "1 Coin/20 Credits" )
+ PORT_DIPSETTING( 0x0004, "1 Coin/30 Credits" )
+ PORT_DIPSETTING( 0x0000, "1 Coin/50 Credits" )
+ PORT_DIPSETTING( 0x0005, "1 Coin/100 Credits" )
+ PORT_DIPSETTING( 0x0006, "1 Coin/200 Credits" )
+ PORT_DIPSETTING( 0x0007, "1 Coin/300 Credits" )
+ PORT_DIPNAME( 0x0018, 0x0000, "Credits Per Note" ) PORT_DIPLOCATION("SW2:4,5")
+ PORT_DIPSETTING( 0x0018, "10" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0001)
+ PORT_DIPSETTING( 0x0000, "25" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0001)
+ PORT_DIPSETTING( 0x0008, "50" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0001)
+ PORT_DIPSETTING( 0x0010, "100" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0001)
+ PORT_DIPSETTING( 0x0018, "20" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0002)
+ PORT_DIPSETTING( 0x0000, "50" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0002)
+ PORT_DIPSETTING( 0x0008, "100" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0002)
+ PORT_DIPSETTING( 0x0010, "200" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0002)
+ PORT_DIPSETTING( 0x0018, "40" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0003)
+ PORT_DIPSETTING( 0x0000, "100" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0003)
+ PORT_DIPSETTING( 0x0008, "200" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0003)
+ PORT_DIPSETTING( 0x0010, "400" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0003)
+ PORT_DIPSETTING( 0x0018, "60" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0004)
+ PORT_DIPSETTING( 0x0000, "150" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0004)
+ PORT_DIPSETTING( 0x0008, "300" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0004)
+ PORT_DIPSETTING( 0x0010, "600" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0004)
+ PORT_DIPSETTING( 0x0018, "100" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0000)
+ PORT_DIPSETTING( 0x0000, "250" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0000)
+ PORT_DIPSETTING( 0x0008, "500" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0000)
+ PORT_DIPSETTING( 0x0010, "1000" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0000)
+ PORT_DIPSETTING( 0x0018, "200" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0005)
+ PORT_DIPSETTING( 0x0000, "500" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0005)
+ PORT_DIPSETTING( 0x0008, "1000" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0005)
+ PORT_DIPSETTING( 0x0010, "2000" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0005)
+ PORT_DIPSETTING( 0x0018, "400" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0006)
+ PORT_DIPSETTING( 0x0000, "1000" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0006)
+ PORT_DIPSETTING( 0x0008, "2000" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0006)
+ PORT_DIPSETTING( 0x0010, "4000" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0006)
+ PORT_DIPSETTING( 0x0018, "600" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0007)
+ PORT_DIPSETTING( 0x0000, "1500" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0007)
+ PORT_DIPSETTING( 0x0008, "3000" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0007)
+ PORT_DIPSETTING( 0x0010, "6000" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0007)
+ PORT_DIPNAME( 0x0020, 0x0000, DEF_STR(Demo_Sounds) ) PORT_DIPLOCATION("SW2:6")
+ PORT_DIPSETTING( 0x0020, DEF_STR(Off) )
+ PORT_DIPSETTING( 0x0000, DEF_STR(On) )
+ PORT_DIPNAME( 0x0040, 0x0000, "Counter Jumping" ) PORT_DIPLOCATION("SW2:7")
PORT_DIPSETTING( 0x0040, "By Keyin Rate" )
PORT_DIPSETTING( 0x0000, "By Coin Rate" )
- PORT_DIPNAME( 0x0080, 0x0000, "Cards Voice" ) PORT_DIPLOCATION("SW2:8")
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0000, "Gal Voice" ) PORT_DIPLOCATION("SW2:8") // announces winning hands
+ PORT_DIPSETTING( 0x0080, DEF_STR(Off) )
+ PORT_DIPSETTING( 0x0000, DEF_STR(On) )
PORT_START("DSW3")
- PORT_DIPNAME( 0x0003, 0x0000, "Min. Bet" ) PORT_DIPLOCATION("SW3:1,2")
+ PORT_DIPNAME( 0x0003, 0x0000, "Minimum Bet" ) PORT_DIPLOCATION("SW3:1,2")
PORT_DIPSETTING( 0x0000, "10" )
PORT_DIPSETTING( 0x0001, "20" )
PORT_DIPSETTING( 0x0002, "30" )
PORT_DIPSETTING( 0x0003, "50" )
- PORT_DIPNAME( 0x000c, 0x0000, "Max. Bet" ) PORT_DIPLOCATION("SW3:3,4")
+ PORT_DIPNAME( 0x000c, 0x0000, "Maximum Bet" ) PORT_DIPLOCATION("SW3:3,4")
PORT_DIPSETTING( 0x0000, "50" )
PORT_DIPSETTING( 0x0004, "100" )
PORT_DIPSETTING( 0x0008, "150" )
PORT_DIPSETTING( 0x000c, "200" )
- PORT_DIPNAME( 0x0010, 0x0000, "Connector" ) PORT_DIPLOCATION("SW3:5") // Hardcoded to JAMMA
+ PORT_DIPNAME( 0x0010, 0x0000, "Connector" ) PORT_DIPLOCATION("SW3:5") // hard-coded to JAMMA (no suport for mahjong matrix)
PORT_DIPSETTING( 0x0010, "JAMMA" )
PORT_DIPSETTING( 0x0000, "JAMMA" )
- PORT_DIPNAME( 0x0020, 0x0000, "Card Choice" ) PORT_DIPLOCATION("SW3:6") // also changes title screen
- PORT_DIPSETTING( 0x0020, "Car" ) // city skyline title screen
- PORT_DIPSETTING( 0x0000, "Poker" ) // lady in red with card title screen
- PORT_DIPNAME( 0x0040, 0x0000, "Last Game Mode" ) PORT_DIPLOCATION("SW3:7")
- PORT_DIPSETTING( 0x0040, "Rechoice Card" )
- PORT_DIPSETTING( 0x0000, "Only 6 Card" )
- PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:8") // not shown in test mode
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0000, "Card Display" ) PORT_DIPLOCATION("SW3:6") // also changes title screen
+ PORT_DIPSETTING( 0x0020, "Car Cards" ) // city skyline title screen
+ PORT_DIPSETTING( 0x0000, "Poker Cards" ) // lady in red with card title screen
+ PORT_DIPNAME( 0x0040, 0x0000, "Draw Again Mode" ) PORT_DIPLOCATION("SW3:7") // controls what happens if you press Hold 5 (LAST) with a winning hand
+ PORT_DIPSETTING( 0x0040, "Discard and Draw" ) // choose cards to hold and deal replacements
+ PORT_DIPSETTING( 0x0000, "Deal Sixth Card" ) // deal one additional card
+ PORT_DIPNAME( 0x0080, 0x0000, DEF_STR(Unknown) ) PORT_DIPLOCATION("SW3:8") // not shown in test mode
+ PORT_DIPSETTING( 0x0080, DEF_STR(Off) )
+ PORT_DIPSETTING( 0x0000, DEF_STR(On) )
INPUT_PORTS_END
static INPUT_PORTS_START( sscs )
@@ -1214,6 +1282,7 @@ static INPUT_PORTS_START( sscs )
// Double Up Double Up × 1
// Big Double Up × ½ Small
// Small Take Score
+ // Counters are credit in, key-in, credit out, key-out
GMS_MAHJONG_KEYBOARD("DSW2", 0x80, 0x80)
PORT_MODIFY("IN1")
@@ -1233,6 +1302,7 @@ static INPUT_PORTS_START( sscs )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW2", 0x80, NOTEQUALS, 0x80)
PORT_MODIFY("IN2")
+ PORT_BIT( 0x00f8, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW2", 0x80, NOTEQUALS, 0x80)
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -1352,6 +1422,15 @@ static INPUT_PORTS_START( sscs )
INPUT_PORTS_END
static INPUT_PORTS_START( sc2in1 )
+ // Controls for the games (double up game is the same for both games):
+ // Show Hand 5 Poker Double Up
+ // Start Start Start Deal Take Score Take Score
+ // Bet Bet Bet
+ // Hold 1 Exit Exit Hold 1
+ // Hold 2 Up Hold 2 Up
+ // Hold 3 Select/Confirm Hold 3 Big
+ // Hold 4 Down Hold 4 Double Up Down
+ // Hold 5 View Hole Card Hold 5 Draw Again Small
PORT_START("COUNTERS")
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<1>)) // key-in
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<0>)) // coin in
@@ -1363,12 +1442,12 @@ static INPUT_PORTS_START( sc2in1 )
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_SERVICE_NO_TOGGLE(0x02, IP_ACTIVE_LOW)
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN1 )
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME( "Start / Take" )
- PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) PORT_NAME( "Hold 2 / Double Up" )
- PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_POKER_HOLD4 )
- PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_NAME( "Hold 1 / Double Up / Big" )
- PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) PORT_NAME( "Hold 3 / Double Up / Small" )
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_POKER_HOLD5 )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Start / Take Score" )
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) PORT_NAME("Hold 2 / Up" )
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_POKER_HOLD4 ) PORT_NAME("Hold 4 / Down / Double Up")
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_NAME("Hold 1 / Exit" )
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) PORT_NAME("Hold 3 / Select / Big" )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) PORT_NAME("Hold 5 / View Hole Card / Draw Again / Small")
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_GAMBLE_BET )
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -1380,17 +1459,17 @@ static INPUT_PORTS_START( sc2in1 )
PORT_START("IN2")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MEMORY_RESET )
- PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_GAMBLE_KEYIN )
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT )
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT )
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("hopper", FUNC(hopper_device::line_r))
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -1431,7 +1510,7 @@ static INPUT_PORTS_START( jinpaish )
// Double Up Down Double Up Select Opponent
// Big View Hole Card Small Select Opponent
// Small Take Score Select Opponent
- // Seems to be no Up control in mahjong keyboard mode.
+ // There seems to be no Up control in mahjong keyboard mode.
GMS_MAHJONG_KEYBOARD("DSW1", 0x80, 0x80)
PORT_MODIFY("IN1")
@@ -1451,6 +1530,7 @@ static INPUT_PORTS_START( jinpaish )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW1", 0x80, NOTEQUALS, 0x80)
PORT_MODIFY("IN2")
+ PORT_BIT( 0x00f8, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW1", 0x80, NOTEQUALS, 0x80)
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -1468,7 +1548,7 @@ static INPUT_PORTS_START( jinpaish )
PORT_DIPSETTING( 0x0000, DEF_STR(On) ) // 有
PORT_DIPNAME( 0x0040, 0x0000, DEF_STR(Service_Mode) ) PORT_DIPLOCATION("SW1:7") // 遊戲設定
PORT_DIPSETTING( 0x0000, DEF_STR(Off) ) // 正常
- PORT_DIPSETTING( 0x0040, "Power On" ) // 開機進入 (boots to setup menu - default password is Start eight times)
+ PORT_DIPSETTING( 0x0040, "Power On" ) // 開機進入 (boots to setup menu)
PORT_DIPNAME( 0x0080, 0x0000, DEF_STR(Controls) ) PORT_DIPLOCATION("SW1:8") // 操作介面
PORT_DIPSETTING( 0x0000, DEF_STR(Joystick) ) // 娛樂
PORT_DIPSETTING( 0x0080, "Mahjong" ) // 麻將
@@ -1506,6 +1586,7 @@ static INPUT_PORTS_START( baile )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW1", 0x80, NOTEQUALS, 0x80)
PORT_MODIFY("IN2")
+ PORT_BIT( 0x00f8, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW1", 0x80, NOTEQUALS, 0x80)
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -1551,7 +1632,7 @@ static INPUT_PORTS_START( yyhm )
PORT_DIPNAME( 0x0004, 0x0004, DEF_STR(Demo_Sounds) ) PORT_DIPLOCATION("SW1:3") // 示範音樂
PORT_DIPSETTING( 0x0000, DEF_STR(Off) ) // 無
PORT_DIPSETTING( 0x0004, DEF_STR(On) ) // 有
- PORT_DIPNAME( 0x0008, 0x0008, "Score Display" ) PORT_DIPLOCATION("SW1:4") // 計分方式
+ PORT_DIPNAME( 0x0008, 0x0008, "Score Display Mode" ) PORT_DIPLOCATION("SW1:4") // 計分方式
PORT_DIPSETTING( 0x0008, "Numbers" ) // 數字計分
PORT_DIPSETTING( 0x0000, "Circle Tiles" ) // 筒子計分
PORT_DIPUNUSED_DIPLOC( 0x0010, 0x0010, "SW1:5") // No effect listed in test mode
@@ -1813,34 +1894,39 @@ static INPUT_PORTS_START( cots )
INPUT_PORTS_END
-static INPUT_PORTS_START( sball2k1 ) // default password for accessing game settings is all Start
+static INPUT_PORTS_START( sball2k1 )
+ // Recognises payout/key-out in input test, but doesn't seem to use them (probably an "amusement only" game).
+ // TODO: the game shows a 7th button, but when is it used and which bit is it?
+ // TODO: IN1 0x0008 and IN1 0x0400 in attract mode cause the game to show top 10 and last 10 score lists - what are these inputs for?
PORT_START("COUNTERS")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<1>)) // key-in
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<0>)) // coin in
+ //PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OUTPUT ) what is this? high when "PARTITE" (games/credits) is 9 or lower
+ //PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_OUTPUT ) what is this? used for something
PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("hopper", FUNC(hopper_device::motor_w))
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<3>)) // key-out
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<2>)) // coin out
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<2>)) // coin out
+ //PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_OUTPUT ) what is this? high when "PARTITE" (games/credits) is 10 or higher
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<0>)) // coin 1 in
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<1>)) // coin 2 in
PORT_START("IN1")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) // input test calls this "TEST" but it functions as bookkeeping
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN1 )
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_POKER_HOLD3 )
- PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_POKER_HOLD4 )
- PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_POKER_HOLD2 )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // what is this? shows top ten and last ten scores in attract mode
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) PORT_NAME("Hold 3 / Double Up")
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_POKER_HOLD4 ) PORT_NAME("Hold 4 / Small")
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) PORT_NAME("Hold 2 / Big")
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_POKER_HOLD1 )
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_POKER_HOLD5 )
- PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_START1 )
- PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) PORT_NAME("Hold 5 / Bet / Draw Again")
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Start / Take Score")
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) // what is this? shows top ten and last ten scores in attract mode
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("hopper", FUNC(hopper_device::line_r))
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("IN2")
- PORT_SERVICE_NO_TOGGLE(0x01, IP_ACTIVE_LOW)
+ PORT_SERVICE_NO_TOGGLE(0x01, IP_ACTIVE_LOW) // input test calls this "ANALYZER" but it functions as test
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MEMORY_RESET )
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -1848,31 +1934,31 @@ static INPUT_PORTS_START( sball2k1 ) // default password for accessing game sett
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT )
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT )
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
//PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", FUNC(eeprom_serial_93cxx_device::do_read)) // TODO: verify
-
- // There are 4 banks of 8 DIP switches on the PCB but only 1 is shown in test mode. DIP switch settings as per test mode. Other settings seem to be determined by software.
+ // There are 4 banks of 8 DIP switches on the PCB but only 1 is shown in test mode.
+ // DIP switch settings as per test mode. Other settings seem to be determined by software.
PORT_START("DSW1")
- PORT_DIPNAME( 0x0001, 0x0000, "Play Mode" ) PORT_DIPLOCATION("SW1:1")
+ PORT_DIPNAME( 0x0001, 0x0000, "Play Mode" ) PORT_DIPLOCATION("SW1:1")
PORT_DIPSETTING( 0x0001, "Games" )
- PORT_DIPSETTING( 0x0000, DEF_STR( Lives ) )
- PORT_DIPNAME( 0x0002, 0x0000, DEF_STR ( Unused ) ) PORT_DIPLOCATION("SW1:2") // 'No Use' according to test mode
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0000, "Ability Game" ) PORT_DIPLOCATION("SW1:3")
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0000, "Reg. Ability" ) PORT_DIPLOCATION("SW1:4") // sic. Regulate?
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR(Lives) )
+ PORT_DIPNAME( 0x0002, 0x0000, DEF_STR(Unused) ) PORT_DIPLOCATION("SW1:2") // 'No Use' according to test mode
+ PORT_DIPSETTING( 0x0002, DEF_STR(Off) )
+ PORT_DIPSETTING( 0x0000, DEF_STR(On) )
+ PORT_DIPNAME( 0x0004, 0x0000, "Ability Game" ) PORT_DIPLOCATION("SW1:3") // controls whether the "hit the red ball" game is required when starting
+ PORT_DIPSETTING( 0x0004, DEF_STR(Off) )
+ PORT_DIPSETTING( 0x0000, DEF_STR(On) )
+ PORT_DIPNAME( 0x0008, 0x0000, "Double Up Game" ) PORT_DIPLOCATION("SW1:4")
+ PORT_DIPSETTING( 0x0008, DEF_STR(Off) )
+ PORT_DIPSETTING( 0x0000, DEF_STR(On) )
PORT_DIPNAME( 0x0010, 0x0000, "One Game" ) PORT_DIPLOCATION("SW1:5") // "One Partite" in test mode, seems a mix of English and Italian
PORT_DIPSETTING( 0x0000, "10 Lives" )
PORT_DIPSETTING( 0x0010, "20 Lives" )
@@ -2036,197 +2122,190 @@ static INPUT_PORTS_START( cjdlz )
INPUT_PORTS_END
static INPUT_PORTS_START( hgly )
- PORT_START("COUNTERS")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<1>)) // key-in
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<0>)) // coin in
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("hopper", FUNC(hopper_device::motor_w))
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<3>)) // key-out
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(FUNC(gms_2layers_state::counter_w<2>)) // coin out
+ // Mahjong keyboard controls:
+ // A Hold Reel 1 Stop Reel 1
+ // B Hold Reel 2 Stop Reel 2
+ // C Hold Reel 3 Stop Reel 3
+ // Start Start Stop All Reels Take Score
+ // Bet Bet
+ // Take Score Double Up × 2 Big
+ // Double Up Double Up × 1
+ // Big Double Up × ½ Small
+ // Small Take Score
+ // There seems to be no Show Odds control in mahjong keyboard mode.
+ // Counters are credit in, key-in, credit out, key-out
+ GMS_MAHJONG_KEYBOARD("DSW3", 0x0040, 0x0040)
- PORT_START("IN1")
- PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_SERVICE_NO_TOGGLE(0x02, IP_ACTIVE_LOW)
- PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN1 )
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_START1 ) // start in test mode
- PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_POKER_HOLD2 )
- PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME( "Paytable" )
- PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_POKER_HOLD1 )
- PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_POKER_HOLD3 )
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNKNOWN ) // no evident effect
- PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME( "Start Slot" )
- PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) // no evident effect
- PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) // no evident effect
- PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // no evident effect
- PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // no evident effect
- PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // no evident effect
- PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // no evident effect
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Start / Stop All") PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040) // also functions as Take Score
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_SLOT_STOP2 ) PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_SLOT_STOP_ALL ) PORT_NAME("Show Odds") PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_SLOT_STOP1 ) PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_SLOT_STOP3 ) PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_GAMBLE_BET ) PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_GAMBLE_TAKE ) PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
- PORT_START("IN2")
- PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )
- PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MEMORY_RESET )
- PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN2 )
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_MODIFY("IN2")
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_GAMBLE_D_UP ) PORT_NAME(u8"Double Up × 1") PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_GAMBLE_HIGH ) PORT_NAME(u8"Double Up × 2 / Big") PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_GAMBLE_LOW ) PORT_NAME(u8"Double Up × ½ / Small") PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSW3", 0x0040, NOTEQUALS, 0x0040)
//PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", FUNC(eeprom_serial_93cxx_device::do_read)) // TODO: verify
// Only 4 DIP banks are actually populated on PCBs but test mode reads all 6.
- // TODO: DIPs
- PORT_START("DSW1") // 16bit, in test mode first 8 are recognized as dsw1, second 8 as dsw4.
- PORT_DIPNAME( 0x0007, 0x0000, "Card Play Rate" ) PORT_DIPLOCATION("DSW1:1,2,3")
- PORT_DIPSETTING( 0x0001, "91" )
- PORT_DIPSETTING( 0x0002, "92" )
- PORT_DIPSETTING( 0x0003, "93" )
- PORT_DIPSETTING( 0x0004, "94" )
- PORT_DIPSETTING( 0x0005, "95" )
- PORT_DIPSETTING( 0x0000, "96" )
- PORT_DIPSETTING( 0x0006, "97" )
- PORT_DIPSETTING( 0x0007, "98" )
- PORT_DIPNAME( 0x0008, 0x0000, "Hold Card" ) PORT_DIPLOCATION("DSW1:4")
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0000, "Direct Double Up" ) PORT_DIPLOCATION("DSW1:5")
- PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0000, "Double Up Option" ) PORT_DIPLOCATION("DSW1:6")
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x00c0, 0x0000, "Double Up Probability" ) PORT_DIPLOCATION("DSW1:7,8")
- PORT_DIPSETTING( 0x0040, DEF_STR( Easy ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( Medium ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Difficult ) )
- PORT_DIPSETTING( 0x00c0, DEF_STR( Very_Difficult ) )
- PORT_DIPNAME( 0x0100, 0x0000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("DSW4:1")
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0e00, 0x0000, "Break Taiwan Restrictions" ) PORT_DIPLOCATION("DSW4:2,3,4") // TODO: fishy machine translations
- PORT_DIPSETTING( 0x0600, "5000" )
- PORT_DIPSETTING( 0x0800, "10000" )
- PORT_DIPSETTING( 0x0a00, "20000" )
- PORT_DIPSETTING( 0x0000, "30000" )
- PORT_DIPSETTING( 0x0c00, "50000" )
- PORT_DIPSETTING( 0x0e00, "90000" )
- PORT_DIPSETTING( 0x0200, "200000" )
- PORT_DIPSETTING( 0x0400, "500000" )
- PORT_DIPNAME( 0x3000, 0x0000, "Score Limit" ) PORT_DIPLOCATION("DSW4:5,6")
- PORT_DIPSETTING( 0x0000, "5000" )
- PORT_DIPSETTING( 0x1000, "10000" )
- PORT_DIPSETTING( 0x2000, "30000" )
- PORT_DIPSETTING( 0x3000, "50000" )
- PORT_DIPNAME( 0x4000, 0x0000, "Double-Up Game Jackpot" ) PORT_DIPLOCATION("DSW4:7")
- PORT_DIPSETTING( 0x4000, "10000" )
- PORT_DIPSETTING( 0x0000, "Unlimited" )
- PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:8") // not defined in test mode
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-
+ PORT_START("DSW1") // 16bit, in test mode first 8 are recognized as DSW1, second 8 as DSW4.
+ PORT_DIPNAME( 0x0007, 0x0000, "Payout Rate" ) PORT_DIPLOCATION("DSW1:1,2,3") // 出牌率
+ PORT_DIPSETTING( 0x0001, "91%" )
+ PORT_DIPSETTING( 0x0002, "92%" )
+ PORT_DIPSETTING( 0x0003, "93%" )
+ PORT_DIPSETTING( 0x0004, "94%" )
+ PORT_DIPSETTING( 0x0005, "95%" )
+ PORT_DIPSETTING( 0x0000, "96%" )
+ PORT_DIPSETTING( 0x0006, "97%" )
+ PORT_DIPSETTING( 0x0007, "98%" )
+ PORT_DIPNAME( 0x0008, 0x0000, "Hold Function" ) PORT_DIPLOCATION("DSW1:4") // HOLD 牌功能
+ PORT_DIPSETTING( 0x0008, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x0000, DEF_STR(On) ) // 有
+ PORT_DIPNAME( 0x0010, 0x0000, "Direct Double Up" ) PORT_DIPLOCATION("DSW1:5") // 直接比倍
+ PORT_DIPSETTING( 0x0000, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x0010, DEF_STR(On) ) // 有
+ PORT_DIPNAME( 0x0020, 0x0000, "Double Up Game" ) PORT_DIPLOCATION("DSW1:6") // 比倍有無
+ PORT_DIPSETTING( 0x0020, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x0000, DEF_STR(On) ) // 有
+ PORT_DIPNAME( 0x00c0, 0x0000, "Double Up Game Payout Rate" ) PORT_DIPLOCATION("DSW1:7,8") // 比倍機率
+ PORT_DIPSETTING( 0x0040, DEF_STR(Easy) ) // 易
+ PORT_DIPSETTING( 0x0000, DEF_STR(Medium) ) // 中
+ PORT_DIPSETTING( 0x0080, DEF_STR(Difficult) ) // 難
+ PORT_DIPSETTING( 0x00c0, DEF_STR(Very_Difficult) ) // 困難
+ PORT_DIPNAME( 0x0100, 0x0000, DEF_STR(Demo_Sounds) ) PORT_DIPLOCATION("DSW4:1") // 示範音樂
+ PORT_DIPSETTING( 0x0100, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x0000, DEF_STR(On) ) // 有
+ PORT_DIPNAME( 0x0e00, 0x0000, "Jackpot Limit" ) PORT_DIPLOCATION("DSW4:2,3,4") // 破台限制
+ PORT_DIPSETTING( 0x0600, "5,000" )
+ PORT_DIPSETTING( 0x0800, "10,000" )
+ PORT_DIPSETTING( 0x0a00, "20,000" )
+ PORT_DIPSETTING( 0x0000, "30,000" )
+ PORT_DIPSETTING( 0x0c00, "50,000" )
+ PORT_DIPSETTING( 0x0e00, "90,000" )
+ PORT_DIPSETTING( 0x0200, "200,000" )
+ PORT_DIPSETTING( 0x0400, "500,000" )
+ PORT_DIPNAME( 0x3000, 0x0000, "Credit Limit" ) PORT_DIPLOCATION("DSW4:5,6") // 進分上限
+ PORT_DIPSETTING( 0x0000, "5,000" )
+ PORT_DIPSETTING( 0x1000, "1,0000" )
+ PORT_DIPSETTING( 0x2000, "30,000" )
+ PORT_DIPSETTING( 0x3000, "50,000" )
+ PORT_DIPNAME( 0x4000, 0x0000, "Double Up Game Jackpot" ) PORT_DIPLOCATION("DSW4:7") // 比倍爆機
+ PORT_DIPSETTING( 0x4000, "10,000" )
+ PORT_DIPSETTING( 0x0000, "Unlimited" ) // 無限制
+ PORT_DIPNAME( 0x8000, 0x0000, DEF_STR(Unknown) ) PORT_DIPLOCATION("DSW4:8") // not defined in test mode
+ PORT_DIPSETTING( 0x8000, DEF_STR(Off) )
+ PORT_DIPSETTING( 0x0000, DEF_STR(On) )
- PORT_START("DSW2") // 16bit, in test mode first 8 are recognized as dsw2, second 8 as dsw5
- PORT_DIPNAME( 0x0007, 0x0000, "Coin Ratio" ) PORT_DIPLOCATION("DSW2:1,2,3")
- PORT_DIPSETTING( 0x0001, "1" )
- PORT_DIPSETTING( 0x0002, "2" )
- PORT_DIPSETTING( 0x0003, "5" )
- PORT_DIPSETTING( 0x0000, "10" )
- PORT_DIPSETTING( 0x0004, "20" )
- PORT_DIPSETTING( 0x0005, "50" )
- PORT_DIPSETTING( 0x0006, "100" )
- PORT_DIPSETTING( 0x0007, "300" )
- PORT_DIPNAME( 0x0018, 0x0000, "Coin x Score Multiplier" ) PORT_DIPLOCATION("DSW2:4,5")
- PORT_DIPSETTING( 0x0008, "2" )
- PORT_DIPSETTING( 0x0010, "5" )
- PORT_DIPSETTING( 0x0000, "10" )
- PORT_DIPSETTING( 0x0018, "20" )
- PORT_DIPNAME( 0x0020, 0x0000, "Bonus Minimum Bet" ) PORT_DIPLOCATION("DSW2:6")
+ PORT_START("DSW2") // 16bit, in test mode first 8 are recognized as DSW2, second 8 as DSW5
+ PORT_DIPNAME( 0x0007, 0x0000, DEF_STR(Coinage) ) PORT_DIPLOCATION("DSW2:1,2,3") // 投幣比例
+ PORT_DIPSETTING( 0x0001, DEF_STR(1C_1C) )
+ PORT_DIPSETTING( 0x0002, DEF_STR(1C_2C) )
+ PORT_DIPSETTING( 0x0003, DEF_STR(1C_5C) )
+ PORT_DIPSETTING( 0x0000, "1 Coin/10 Credits" )
+ PORT_DIPSETTING( 0x0004, "1 Coin/20 Credits" )
+ PORT_DIPSETTING( 0x0005, "1 Coin/50 Credits" )
+ PORT_DIPSETTING( 0x0006, "1 Coin/100 Credits" )
+ PORT_DIPSETTING( 0x0007, "1 Coin/300 Credits" )
+ PORT_DIPNAME( 0x0018, 0x0000, "Key-In Rate" ) PORT_DIPLOCATION("DSW2:4,5") // 投幣×開分倍率
+ PORT_DIPSETTING( 0x0008, "2" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0001)
+ PORT_DIPSETTING( 0x0010, "5" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0001)
+ PORT_DIPSETTING( 0x0000, "10" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0001)
+ PORT_DIPSETTING( 0x0018, "20" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0001)
+ PORT_DIPSETTING( 0x0008, "4" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0002)
+ PORT_DIPSETTING( 0x0010, "10" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0002)
+ PORT_DIPSETTING( 0x0000, "20" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0002)
+ PORT_DIPSETTING( 0x0018, "40" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0002)
+ PORT_DIPSETTING( 0x0008, "10" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0003)
+ PORT_DIPSETTING( 0x0010, "25" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0003)
+ PORT_DIPSETTING( 0x0000, "50" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0003)
+ PORT_DIPSETTING( 0x0018, "100" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0003)
+ PORT_DIPSETTING( 0x0008, "20" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0000)
+ PORT_DIPSETTING( 0x0010, "50" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0000)
+ PORT_DIPSETTING( 0x0000, "100" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0000)
+ PORT_DIPSETTING( 0x0018, "200" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0000)
+ PORT_DIPSETTING( 0x0008, "40" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0004)
+ PORT_DIPSETTING( 0x0010, "100" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0004)
+ PORT_DIPSETTING( 0x0000, "200" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0004)
+ PORT_DIPSETTING( 0x0018, "400" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0004)
+ PORT_DIPSETTING( 0x0008, "100" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0005)
+ PORT_DIPSETTING( 0x0010, "250" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0005)
+ PORT_DIPSETTING( 0x0000, "500" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0005)
+ PORT_DIPSETTING( 0x0018, "1000" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0005)
+ PORT_DIPSETTING( 0x0008, "200" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0006)
+ PORT_DIPSETTING( 0x0010, "500" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0006)
+ PORT_DIPSETTING( 0x0000, "1000" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0006)
+ PORT_DIPSETTING( 0x0018, "2000" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0006)
+ PORT_DIPSETTING( 0x0008, "600" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0007)
+ PORT_DIPSETTING( 0x0010, "1500" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0007)
+ PORT_DIPSETTING( 0x0000, "3000" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0007)
+ PORT_DIPSETTING( 0x0018, "6000" ) PORT_CONDITION("DSW2", 0x0007, EQUALS, 0x0007)
+ PORT_DIPNAME( 0x0020, 0x0000, "Minimum Bet for Bonus" ) PORT_DIPLOCATION("DSW2:6") // BONUS 最小押分
PORT_DIPSETTING( 0x0000, "32" )
PORT_DIPSETTING( 0x0020, "64" )
- PORT_DIPNAME( 0x0040, 0x0000, "Payout Model" ) PORT_DIPLOCATION("DSW2:7")
- PORT_DIPSETTING( 0x0040, "Key Out" )
- PORT_DIPSETTING( 0x0000, "Coin" )
- PORT_DIPNAME( 0x0080, 0x0000, "Pool Initial Score" ) PORT_DIPLOCATION("DSW2:8")
+ PORT_DIPNAME( 0x0040, 0x0000, "Payout Mode" ) PORT_DIPLOCATION("DSW2:7") // 退幣退票方式
+ PORT_DIPSETTING( 0x0000, "Return Coins" ) // 以投幣計
+ PORT_DIPSETTING( 0x0040, "Key-Out" ) // 以開分計
+ PORT_DIPNAME( 0x0080, 0x0000, "Initial Pool Points" ) PORT_DIPLOCATION("DSW2:8") // POOL 起始分數
PORT_DIPSETTING( 0x0080, "500" )
PORT_DIPSETTING( 0x0000, "1000" )
- PORT_DIPNAME( 0x0100, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:1")
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:2")
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:3")
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:4")
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:5")
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:6")
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:7")
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:8")
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) // DSW5 shown in input test but not physically present
+ //PORT_DIPUNUSED_DIPLOC( 0x0100, 0x0000, "DSW5:1")
+ //PORT_DIPUNUSED_DIPLOC( 0x0200, 0x0000, "DSW5:2")
+ //PORT_DIPUNUSED_DIPLOC( 0x0400, 0x0000, "DSW5:3")
+ //PORT_DIPUNUSED_DIPLOC( 0x0800, 0x0000, "DSW5:4")
+ //PORT_DIPUNUSED_DIPLOC( 0x1000, 0x0000, "DSW5:5")
+ //PORT_DIPUNUSED_DIPLOC( 0x2000, 0x0000, "DSW5:6")
+ //PORT_DIPUNUSED_DIPLOC( 0x4000, 0x0000, "DSW5:7")
+ //PORT_DIPUNUSED_DIPLOC( 0x8000, 0x0000, "DSW5:8")
- PORT_START("DSW3") // 16bit, in test mode first 8 are recognized as dsw3, second 8 as dsw6
- PORT_DIPNAME( 0x0003, 0x0000, "Minimum Bet" ) PORT_DIPLOCATION("DSW3:1,2") // hard-coded
+ PORT_START("DSW3") // 16bit, in test mode first 8 are recognized as DSW3, second 8 as DSW6
+ PORT_DIPNAME( 0x0003, 0x0000, "Minimum Bet" ) PORT_DIPLOCATION("DSW3:1,2") // 最小押分 (only one setting)
PORT_DIPSETTING( 0x0000, "32" )
- PORT_DIPSETTING( 0x0001, "32 (duplicate)" )
- PORT_DIPSETTING( 0x0002, "32 (duplicate)" )
- PORT_DIPSETTING( 0x0003, "32 (duplicate)" )
- PORT_DIPNAME( 0x000c, 0x0000, "Minimum Bet" ) PORT_DIPLOCATION("DSW3:3,4") // semi hard-coded
+ PORT_DIPSETTING( 0x0001, "32" )
+ PORT_DIPSETTING( 0x0002, "32" )
+ PORT_DIPSETTING( 0x0003, "32" )
+ PORT_DIPNAME( 0x000c, 0x0000, "Minimum Bet" ) PORT_DIPLOCATION("DSW3:3,4") // 最大押分 (only two settings)
PORT_DIPSETTING( 0x0000, "200" )
- PORT_DIPSETTING( 0x0004, "200 (duplicate)" )
- PORT_DIPSETTING( 0x0008, "200 (duplicate)" )
+ PORT_DIPSETTING( 0x0004, "200" )
+ PORT_DIPSETTING( 0x0008, "200" )
PORT_DIPSETTING( 0x000c, "360" )
- PORT_DIPNAME( 0x0010, 0x0000, "Bet Every Time" ) PORT_DIPLOCATION("DSW3:5") // hard-coded
+ PORT_DIPNAME( 0x0010, 0x0000, "Bet Increment" ) PORT_DIPLOCATION("DSW3:5") // 每次押分 (only one setting)
+ PORT_DIPSETTING( 0x0000, "4" )
PORT_DIPSETTING( 0x0010, "4" )
- PORT_DIPSETTING( 0x0000, "4 (duplicate)" )
- PORT_DIPNAME( 0x0020, 0x0000, "Scoring" ) PORT_DIPLOCATION("DSW3:6")
- PORT_DIPSETTING( 0x0020, "Numbers" )
- PORT_DIPSETTING( 0x0000, "Circle Tiles" )
- PORT_DIPNAME( 0x0040, 0x0000, "Controls" ) PORT_DIPLOCATION("DSW3:7")
- PORT_DIPSETTING( 0x0000, DEF_STR( Joystick ) )
- PORT_DIPSETTING( 0x0040, "Keyboard" )
- PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:8") // not defined in test mode
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW6:1")
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW6:2")
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW6:3")
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW6:4")
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW6:5")
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW6:6")
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW6:7")
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW6:8")
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0000, "Score Display Mode" ) PORT_DIPLOCATION("DSW3:6") // 計分方式
+ PORT_DIPSETTING( 0x0020, "Numbers" ) // 數字
+ PORT_DIPSETTING( 0x0000, "Circle Tiles" ) // 筒子
+ PORT_DIPNAME( 0x0040, 0x0000, DEF_STR(Controls) ) PORT_DIPLOCATION("DSW3:7") // 操作介面
+ PORT_DIPSETTING( 0x0000, DEF_STR(Joystick) ) // 娛樂
+ PORT_DIPSETTING( 0x0040, "Mahjong" ) // 麻將
+ PORT_DIPNAME( 0x0080, 0x0000, DEF_STR(Unknown) ) PORT_DIPLOCATION("DSW3:8") // not defined in test mode
+ PORT_DIPSETTING( 0x0080, DEF_STR(Off) )
+ PORT_DIPSETTING( 0x0000, DEF_STR(On) )
+ PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) // DSW6 shown in input test but not physically present
+ //PORT_DIPUNUSED_DIPLOC( 0x0100, 0x0000, "DSW6:1")
+ //PORT_DIPUNUSED_DIPLOC( 0x0200, 0x0000, "DSW6:2")
+ //PORT_DIPUNUSED_DIPLOC( 0x0400, 0x0000, "DSW6:3")
+ //PORT_DIPUNUSED_DIPLOC( 0x0800, 0x0000, "DSW6:4")
+ //PORT_DIPUNUSED_DIPLOC( 0x1000, 0x0000, "DSW6:5")
+ //PORT_DIPUNUSED_DIPLOC( 0x2000, 0x0000, "DSW6:6")
+ //PORT_DIPUNUSED_DIPLOC( 0x4000, 0x0000, "DSW6:7")
+ //PORT_DIPUNUSED_DIPLOC( 0x8000, 0x0000, "DSW6:8")
INPUT_PORTS_END
@@ -2266,6 +2345,16 @@ static GFXDECODE_START( gfx_magslot )
GFXDECODE_ENTRY( "gfx3", 0, gfx_8x8x4_packed_lsb, 0x400, 16 )
GFXDECODE_END
+void gms_2layers_state::machine_start()
+{
+ m_lamps.resolve();
+
+ save_item(NAME(m_reels_toggle));
+ save_item(NAME(m_tilebank));
+ save_item(NAME(m_mux_data));
+ save_item(NAME(m_input_matrix));
+}
+
void gms_2layers_state::video_start()
{
m_reel_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(gms_2layers_state::get_reel_tile_info<0>)), TILEMAP_SCAN_ROWS, 8, 32, 64, 8);
@@ -2282,11 +2371,6 @@ void gms_2layers_state::video_start()
//m_tilemap[0]->set_transparent_pen(0);
m_tilemap[0]->set_transparent_pen(0);
-
- save_item(NAME(m_reels_toggle));
- save_item(NAME(m_tilebank));
- save_item(NAME(m_mux_data));
- save_item(NAME(m_input_matrix));
}
void gms_3layers_state::video_start()
@@ -3103,7 +3187,6 @@ void gms_2layers_state::init_cjdlz()
{
uint16_t *rom = (uint16_t *)memregion("maincpu")->base();
-
rom[0x00518 / 2] = 0x4e71; // 0xD REPAIR
rom[0x0c628 / 2] = 0x6000; // 0x99 REPAIR
rom[0x0c8e6 / 2] = 0x4e71; // loop
diff --git a/src/mame/misc/umipoker.cpp b/src/mame/misc/umipoker.cpp
index 2b264d9ca7a..69537f50642 100644
--- a/src/mame/misc/umipoker.cpp
+++ b/src/mame/misc/umipoker.cpp
@@ -15,8 +15,10 @@
TODO:
- Verify clocks (XTALs are 14.3181 and 2.000MHz)
+ - vparais stops at 'renewal is necessary' screen. Find out
+ how / where it checks the expiration
- TMP68HC000-16 + z80 + YM3812 + OKI6295
+ TMP68HC000-16 + Z80 + YM3812 + OKI6295
***************************************************************************/
@@ -736,6 +738,25 @@ ROM_START( saiyukip )
ROM_CONTINUE( 0x000000, 0x040000 )
ROM_END
+ROM_START( vparadis )
+ ROM_REGION( 0x40000, "maincpu", 0 )
+ ROM_LOAD16_BYTE( "vp8.u61", 0x00000, 0x20000, CRC(90fdd735) SHA1(45cf9f4cba66edd504fdb6bb80ca55a718258001) )
+ ROM_LOAD16_BYTE( "vp7.u60", 0x00001, 0x20000, CRC(8142c769) SHA1(d40321f0b0186b87b7c3502919e094afd279b7d7) )
+
+ ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_LOAD( "vp6.u8", 0x00000, 0x10000, CRC(97b37149) SHA1(592e5f451d3417961c64b49a32eb863fc9d7d9b9) ) // 11xxxxxxxxxxxxxx = 0xFF
+
+ ROM_REGION( 0x80000, "gfx1", 0 )
+ ROM_LOAD( "vp1.u39", 0x00000, 0x20000, CRC(6c969a60) SHA1(b9ef74840f88de23e97e3ef26f8a478187e8cdf1) )
+ ROM_LOAD( "vp2.u40", 0x20000, 0x20000, CRC(cd915bad) SHA1(37752f94cc0edbca666b8a6f231513e1e9ac3eeb) )
+ ROM_LOAD( "vp3.u41", 0x40000, 0x20000, CRC(383e74ad) SHA1(662c57756df43ef6455b0bf56c3e170bd7dd8733) )
+ ROM_LOAD( "vp4.u42", 0x60000, 0x20000, CRC(7bdeba05) SHA1(3add05d409caf4474bd2912a97109e00e6711827) )
+
+ ROM_REGION( 0x40000, "oki", 0 )
+ ROM_LOAD( "vp5.u17", 0x00000, 0x40000, CRC(3826a230) SHA1(f55c565dc105dfb11668936ca86b1b84d0dd1610) )
+ ROM_IGNORE( 0x40000 ) // 1ST AND 2ND HALF IDENTICAL
+ROM_END
+
} // anonymous namespace
@@ -747,3 +768,4 @@ ROM_END
GAME( 1997, umipoker, 0, umipoker, umipoker, umipoker_state, empty_init, ROT0, "World Station Co.,LTD", "Umi de Poker / Marine Paradise (Japan, newer)", MACHINE_SUPPORTS_SAVE ) // title screen is toggleable thru a dsw
GAME( 1997, umipokera, umipoker, umipoker, umipoker, umipoker_state, empty_init, ROT0, "World Station Co.,LTD", "Umi de Poker / Marine Paradise (Japan, older)", MACHINE_SUPPORTS_SAVE ) // title screen is toggleable thru a dsw
GAMEL( 1998, saiyukip, 0, saiyukip, saiyukip, saiyukip_state, empty_init, ROT0, "World Station Co.,LTD", "Slot Poker Saiyuki (Japan)", MACHINE_SUPPORTS_SAVE, layout_saiyukip )
+GAME( 2002, vparadis, 0, umipoker, umipoker, umipoker_state, empty_init, ROT0, "Paradise", "Victory Paradise (V9)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/wing/luckgrln.cpp b/src/mame/wing/luckgrln.cpp
index 40a805d52a6..899721fc066 100644
--- a/src/mame/wing/luckgrln.cpp
+++ b/src/mame/wing/luckgrln.cpp
@@ -940,6 +940,24 @@ ROM_START( luckstrn )
ROM_LOAD( "6.r1", 0x40000, 0x20000, CRC(16823fb7) SHA1(e62b5fbf7a105df128dd9dd6d45e59f0ffef5bb8) )
ROM_END
+ROM_START( luckstrna )
+ ROM_REGION( 0x4000, "maincpu", 0 ) // internal Z180 ROM
+ ROM_LOAD( "internal_rom", 0x0000, 0x4000, NO_DUMP )
+
+ ROM_REGION( 0x20000, "rom_data", 0 ) // external data / CPU ROM
+ ROM_LOAD( "16.t1", 0x00000, 0x20000, CRC(1906dd3e) SHA1(35c7d5a6f2dc6291ab5e40ab56951ac7b384ff16) )
+
+ ROM_REGION( 0x60000, "reels", 0 )
+ ROM_LOAD( "1.c1", 0x00000, 0x20000, CRC(1fca2f4f) SHA1(e54595e387c3a742ebf777a2c2795c2d64ec166b) ) // 1ST AND 2ND HALF IDENTICAL, half unused, 5bpp
+ ROM_LOAD( "2.e1", 0x20000, 0x20000, CRC(311a1801) SHA1(ed822dc5b38408221dfbde767abd675c53a766f8) )
+ ROM_LOAD( "3.h1", 0x40000, 0x20000, CRC(ae557bbd) SHA1(4b4ddb5fbb36019c4bd0cfab6a229f3ad09ac95a) )
+
+ ROM_REGION( 0x60000, "gfx2", 0 )
+ ROM_LOAD( "4.l1", 0x00000, 0x20000, CRC(00a1b66d) SHA1(107306689032d5a56fc9337e22a447bad4c371e4) ) // half unused, 5bpp
+ ROM_LOAD( "5.n1", 0x20000, 0x20000, CRC(df29763e) SHA1(5468cccae98aa7e5b141cdb1fc899f418c79f6e7) )
+ ROM_LOAD( "6.r1", 0x40000, 0x20000, CRC(16823fb7) SHA1(e62b5fbf7a105df128dd9dd6d45e59f0ffef5bb8) )
+ROM_END
+
ROM_START( 7smash )
ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD( "eagle.8", 0x000000, 0x020000, CRC(b115c5d5) SHA1(3f80613886b7f8092ec914c9bfb416078aca82a3) )
@@ -967,7 +985,8 @@ ROM_END
* Game Drivers *
**********************************************/
-// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULL NAME FLAGS LAYOUT
-GAMEL( 1991, luckgrln, 0, luckgrln, luckgrln, luckgrln_state, init_luckgrln, ROT0, "Wing Co., Ltd.", "Lucky Girl (newer Z180-based hardware)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE, layout_luckgrln )
-GAMEL( 1991, luckstrn, 0, luckgrln, luckgrln, luckgrln_state, init_luckgrln, ROT0, "Wing Co., Ltd.", "Lucky Star (newer Z180-based hardware)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE, layout_luckgrln ) // missing internal ROM dump
-GAMEL( 1993, 7smash, 0, _7smash, _7smash, luckgrln_state, empty_init, ROT0, "Sovic", "7 Smash", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE, layout_7smash )
+// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULL NAME FLAGS LAYOUT
+GAMEL( 1991, luckgrln, 0, luckgrln, luckgrln, luckgrln_state, init_luckgrln, ROT0, "Wing Co., Ltd.", "Lucky Girl (newer Z180-based hardware)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE, layout_luckgrln )
+GAMEL( 1991, luckstrn, 0, luckgrln, luckgrln, luckgrln_state, init_luckgrln, ROT0, "Wing Co., Ltd.", "Lucky Star (newer Z180-based hardware, set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE, layout_luckgrln ) // missing internal ROM dump
+GAMEL( 1991, luckstrna, luckstrn, luckgrln, luckgrln, luckgrln_state, init_luckgrln, ROT0, "Wing Co., Ltd.", "Lucky Star (newer Z180-based hardware, set 2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE, layout_luckgrln ) // missing internal ROM dump
+GAMEL( 1993, 7smash, 0, _7smash, _7smash, luckgrln_state, empty_init, ROT0, "Sovic", "7 Smash", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE, layout_7smash )
diff --git a/src/osd/modules/sound/pipewire_sound.cpp b/src/osd/modules/sound/pipewire_sound.cpp
index 8bf5b8e0afa..c597a81fdb3 100644
--- a/src/osd/modules/sound/pipewire_sound.cpp
+++ b/src/osd/modules/sound/pipewire_sound.cpp
@@ -90,6 +90,7 @@ private:
struct stream_info {
sound_pipewire *m_wire;
bool m_is_output;
+ bool m_wait_stream;
uint32_t m_osdid;
uint32_t m_node_id;
node_info *m_node;
@@ -98,7 +99,7 @@ private:
std::vector<float> m_volumes;
abuffer m_buffer;
- stream_info(sound_pipewire *wire, bool is_output, uint32_t osdid, uint32_t channels) : m_wire(wire), m_is_output(is_output), m_osdid(osdid), m_channels(channels), m_stream(nullptr), m_buffer(channels) {}
+ stream_info(sound_pipewire *wire, bool is_output, uint32_t osdid, uint32_t channels) : m_wire(wire), m_is_output(is_output), m_wait_stream(true), m_osdid(osdid), m_channels(channels), m_stream(nullptr), m_buffer(channels) {}
};
static const pw_core_events core_events;
@@ -127,7 +128,7 @@ private:
uint32_t m_node_current_id, m_stream_current_id;
uint32_t m_generation;
- bool m_wait_sync, m_wait_stream;
+ bool m_wait_sync;
void sync();
@@ -483,7 +484,6 @@ int sound_pipewire::init(osd_interface &osd, osd_options const &options)
m_generation = 1;
m_wait_sync = false;
- m_wait_stream = false;
pw_init(nullptr, nullptr);
m_loop = pw_thread_loop_new(nullptr, nullptr);
@@ -630,15 +630,14 @@ void sound_pipewire::stream_event_param_changed(stream_info *stream, uint32_t id
if(id == SPA_PARAM_Props) {
const spa_pod_prop *vols = spa_pod_find_prop(param, nullptr, SPA_PROP_channelVolumes);
if(vols) {
- bool initial = stream->m_volumes.empty();
stream->m_volumes.clear();
float *entry;
SPA_POD_ARRAY_FOREACH((spa_pod_array *)(&vols->value), entry) {
stream->m_volumes.push_back(osd::linear_to_db(*entry));
}
if(!stream->m_volumes.empty()) {
- if(initial) {
- m_wait_stream = false;
+ if(stream->m_wait_stream) {
+ stream->m_wait_stream = false;
pw_thread_loop_signal(m_loop, false);
} else
m_generation++;
@@ -697,8 +696,7 @@ uint32_t sound_pipewire::stream_sink_open(uint32_t node, std::string name, uint3
pw_stream_flags(PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_MAP_BUFFERS | PW_STREAM_FLAG_RT_PROCESS),
&params, 1);
- m_wait_stream = true;
- while(m_wait_stream)
+ while(stream.m_wait_stream)
pw_thread_loop_wait(m_loop);
stream.m_node_id = pw_stream_get_node_id(stream.m_stream);
@@ -751,8 +749,7 @@ uint32_t sound_pipewire::stream_source_open(uint32_t node, std::string name, uin
pw_stream_flags(PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_MAP_BUFFERS | PW_STREAM_FLAG_RT_PROCESS),
&params, 1);
- m_wait_stream = true;
- while(m_wait_stream)
+ while(stream.m_wait_stream)
pw_thread_loop_wait(m_loop);
stream.m_node_id = pw_stream_get_node_id(stream.m_stream);
diff --git a/src/osd/modules/sound/sdl_sound.cpp b/src/osd/modules/sound/sdl_sound.cpp
index 35c11eae86d..6fbbbf14f4b 100644
--- a/src/osd/modules/sound/sdl_sound.cpp
+++ b/src/osd/modules/sound/sdl_sound.cpp
@@ -58,7 +58,8 @@ private:
std::string m_name;
int m_freq;
uint8_t m_channels;
- device_info(const char *name, int freq, uint8_t channels) : m_name(name), m_freq(freq), m_channels(channels) {}
+ bool m_def;
+ device_info(const char *name, int freq, uint8_t channels, bool def = false) : m_name(name), m_freq(freq), m_channels(channels), m_def(def) {}
};
struct stream_info {
@@ -100,6 +101,7 @@ int sound_sdl::init(osd_interface &osd, const osd_options &options)
for(int i=0; i != dev_count; i++) {
SDL_AudioSpec spec;
const char *name = SDL_GetAudioDeviceName(i, 0);
+ fprintf(stderr, "Device name %s\n", name);
int err = SDL_GetAudioDeviceSpec(i, 0, &spec);
if(!err)
m_devices.emplace_back(name, spec.freq, spec.channels);
@@ -107,10 +109,11 @@ int sound_sdl::init(osd_interface &osd, const osd_options &options)
char *def_name;
SDL_AudioSpec def_spec;
if(!SDL_GetDefaultAudioInfo(&def_name, &def_spec, 0)) {
+ fprintf(stderr, "Default name %s\n", def_name);
uint32_t idx;
for(idx = 0; idx != m_devices.size() && m_devices[idx].m_name != def_name; idx++);
if(idx == m_devices.size())
- m_devices.emplace_back(def_name, def_spec.freq, def_spec.channels);
+ m_devices.emplace_back(def_name, def_spec.freq, def_spec.channels, true);
m_default_sink = idx+1;
SDL_free(def_name);
} else
@@ -190,7 +193,7 @@ uint32_t sound_sdl::stream_sink_open(uint32_t node, std::string name, uint32_t r
dspec.callback = sink_callback;
dspec.userdata = stream.get();
- stream->m_sdl_id = SDL_OpenAudioDevice(dev.m_name.c_str(), 0, &dspec, &ospec, 0);
+ stream->m_sdl_id = SDL_OpenAudioDevice(dev.m_def ? nullptr : dev.m_name.c_str(), 0, &dspec, &ospec, 0);
if(!stream->m_sdl_id)
return 0;
SDL_PauseAudioDevice(stream->m_sdl_id, 0);