summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2025-09-17 05:00:16 +1000
committer Vas Crabb <vas@vastheman.com>2025-09-17 05:00:16 +1000
commit21f7e1362052ca7ff49399cd48002d5d7792e1be (patch)
treebfc9b3205e46df279defec740752bf58aae460e7
parent2a7a8dee16ca078c2e1d82902f1ac4a8dee187e6 (diff)
-cpu/drcbearm64.cpp: Improved code generation a bit:
* Avoid unnecessary operand loads for add/subtract operations where both sources are identical. * Improved code generation for rotate through carry with immediate shift count and/or immediate zero source. -cpu/uml.cpp: Fixed potential assertion failure when a degenerate rotate through carry is converted to a move. -dynax/ddenlovr.cpp: Fixed DIP switch labels and added locations for Mahjong Dai Touyouken and Return of Sel Jan 2. -docs: Documented DRC UML rotate through carry instructions.
-rw-r--r--docs/source/techspecs/uml_instructions.rst144
-rw-r--r--src/devices/cpu/drcbearm64.cpp199
-rw-r--r--src/devices/cpu/uml.cpp3
-rw-r--r--src/mame/dynax/ddenlovr.cpp392
-rw-r--r--src/mame/dynax/dynax.cpp2
-rw-r--r--src/mame/dynax/royalmah.cpp2
6 files changed, 465 insertions, 277 deletions
diff --git a/docs/source/techspecs/uml_instructions.rst b/docs/source/techspecs/uml_instructions.rst
index 3f724dbbe11..343c3cb1d81 100644
--- a/docs/source/techspecs/uml_instructions.rst
+++ b/docs/source/techspecs/uml_instructions.rst
@@ -2847,6 +2847,150 @@ Simplification rules
* Immediate values for the ``count`` operand are truncated to five or
six bits for 32-bit or 64-bit operands, respectively.
+.. _umlinst-rolc:
+
+ROLC
+^^^^
+
+Rotate an integer value concatenated with the carry flag to the left
+(toward the most significant bit position). For each step, the carry
+flag is shifted into the least significant bit position, and the carry
+flag is set to the bit shifted out of the most significant bit position.
+
++---------------------------+----------------------------------------+
+| Disassembly | Usage |
++===========================+========================================+
+| .. code-block:: | .. code-block:: |
+| | |
+| rolc dst,src,count | UML_ROLC(block, dst, src, count); |
+| drolc dst,src,count | UML_DROLC(block, dst, src, count); |
++---------------------------+----------------------------------------+
+
+Sets ``dst`` to the value of ``src`` concatenated with the carry flag
+rotated left by ``count`` bit positions modulo the operand size in bits.
+For each shift step, the current value of the carry flag is shifted into
+the least significant bit position, and the carry flag is set to the
+value of the bit shifted out of the most significant bit position.
+
+Note that although this instruction rotates a 33-bit or 65-bit value
+(including the carry flag), the shift count is interpreted modulo 32 or
+64.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the rotated value will be stored.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The value to rotated.
+count (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The number of bit positions to rotate by. Only the least
+ significant five bits or six bits of this operand are used,
+ depending on the instruction size.
+
+Flags
+^^^^^
+
+carry (C)
+ Set to the value of the last bit shifted out of the least
+ significant bit position if the shift count modulo the operand size
+ in bits is non-zero, or unchanged if the shift count modulo the
+ operand size in bits is zero.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>` or :ref:`NOP <umlinst-nop>` if
+ the ``count`` operand is the immediate value zero and the zero and
+ sign flags are not required.
+* Immediate values for the ``src`` operand are truncated to the
+ instruction size.
+* Immediate values for the ``count`` operand are truncated to five or
+ six bits for 32-bit or 64-bit operands, respectively.
+
+.. _umlinst-rorc:
+
+RORC
+^^^^
+
+Rotate an integer value concatenated with the carry flag to the right
+(toward the least significant bit position). For each step, the carry
+flag is shifted into the most significant bit position, and the carry
+flag is set to the bit shifted out of the least significant bit
+position.
+
++---------------------------+----------------------------------------+
+| Disassembly | Usage |
++===========================+========================================+
+| .. code-block:: | .. code-block:: |
+| | |
+| rorc dst,src,count | UML_RORC(block, dst, src, count); |
+| drorc dst,src,count | UML_DRORC(block, dst, src, count); |
++---------------------------+----------------------------------------+
+
+Sets ``dst`` to the value of ``src`` concatenated with the carry flag
+rotated right by ``count`` bit positions modulo the operand size in
+bits. For each shift step, the current value of the carry flag is
+shifted into the most significant bit position, and the carry flag is
+set to the value of the bit shifted out of the least significant bit
+position.
+
+Note that although this instruction rotates a 33-bit or 65-bit value
+(including the carry flag), the shift count is interpreted modulo 32 or
+64.
+
+Operands
+^^^^^^^^
+
+dst (32-bit or 64-bit – memory, integer register)
+ The destination where the rotated value will be stored.
+src (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The value to rotated.
+count (32-bit or 64-bit – memory, integer register, immediate, map variable)
+ The number of bit positions to rotate by. Only the least
+ significant five bits or six bits of this operand are used,
+ depending on the instruction size.
+
+Flags
+^^^^^
+
+carry (C)
+ Set to the value of the last bit shifted out of the least
+ significant bit position if the shift count modulo the operand size
+ in bits is non-zero, or unchanged if the shift count modulo the
+ operand size in bits is zero.
+overflow (V)
+ Undefined.
+zero (Z)
+ Set if the result is zero, or cleared otherwise.
+sign (S)
+ Set to the value of the most significant bit of the result (set if
+ the result is a negative signed integer value, or cleared
+ otherwise).
+unordered (U)
+ Undefined.
+
+Simplification rules
+^^^^^^^^^^^^^^^^^^^^
+
+* Converted to :ref:`MOV <umlinst-mov>` or :ref:`NOP <umlinst-nop>` if
+ the ``count`` operand is the immediate value zero and the zero and
+ sign flags are not required.
+* Immediate values for the ``src`` operand are truncated to the
+ instruction size.
+* Immediate values for the ``count`` operand are truncated to five or
+ six bits for 32-bit or 64-bit operands, respectively.
+
.. _umlinst-fparith:
diff --git a/src/devices/cpu/drcbearm64.cpp b/src/devices/cpu/drcbearm64.cpp
index 5d917d8aaa9..392763e20ad 100644
--- a/src/devices/cpu/drcbearm64.cpp
+++ b/src/devices/cpu/drcbearm64.cpp
@@ -3567,8 +3567,15 @@ template <bool CarryIn> void drcbe_arm64::op_add(a64::Assembler &a, const uml::i
const a64::Gp src2 = src2p.select_register(TEMP_REG2, inst.size());
mov_reg_param(a, inst.size(), src1, src1p);
- mov_reg_param(a, inst.size(), src2, src2p);
- a.emit(opcode, output, src1, src2);
+ if (src1p == src2p)
+ {
+ a.emit(opcode, output, src1, src1);
+ }
+ else
+ {
+ mov_reg_param(a, inst.size(), src2, src2p);
+ a.emit(opcode, output, src1, src2);
+ }
mov_param_reg(a, inst.size(), dstp, output);
}
@@ -3606,36 +3613,35 @@ template <bool CarryIn> void drcbe_arm64::op_sub(a64::Assembler &a, const uml::i
const a64::Gp zero = select_register(a64::xzr, inst.size());
const a64::Gp output = dstp.select_register(TEMP_REG3, inst.size());
- if (src2p.is_immediate_value(0))
+ if (src1p == src2p)
{
- if (src1p.is_immediate_value(0))
+ if (CarryIn || (inst.flags() && dstp.is_int_register()))
{
- if (CarryIn)
- {
- a.emit(opcode, output, zero, zero);
- mov_param_reg(a, inst.size(), dstp, output);
- }
- else
- {
- mov_param_reg(a, inst.size(), dstp, zero);
- a.emit(opcode, zero, zero, zero);
- }
+ a.emit(opcode, output, zero, zero);
+ mov_param_reg(a, inst.size(), dstp, output);
}
else
{
- const a64::Gp src = src1p.select_register(output, inst.size());
+ mov_param_reg(a, inst.size(), dstp, zero);
+ if (inst.flags())
+ a.emit(opcode, zero, zero, zero);
+ }
+ }
+ else if (src2p.is_immediate_value(0))
+ {
+ const a64::Gp src = src1p.select_register(output, inst.size());
- mov_reg_param(a, inst.size(), src, src1p);
- if (CarryIn)
- {
- a.emit(opcode, output, src, zero);
- mov_param_reg(a, inst.size(), dstp, output);
- }
- else
- {
- mov_param_reg(a, inst.size(), dstp, src);
+ mov_reg_param(a, inst.size(), src, src1p);
+ if (CarryIn || (inst.flags() && dstp.is_int_register()))
+ {
+ a.emit(opcode, output, src, zero);
+ mov_param_reg(a, inst.size(), dstp, output);
+ }
+ else
+ {
+ mov_param_reg(a, inst.size(), dstp, src);
+ if (inst.flags())
a.emit(opcode, zero, src, zero);
- }
}
}
else if (!CarryIn && src2p.is_immediate() && is_valid_immediate_addsub(src2p.immediate()))
@@ -4493,7 +4499,7 @@ void drcbe_arm64::op_rolc(a64::Assembler &a, const uml::instruction &inst)
be_parameter src1p(*this, inst.param(1), PTYPE_MRI);
be_parameter src2p(*this, inst.param(2), PTYPE_MRI);
- size_t const maxBits = inst.size() * 8 - 1;
+ size_t const maxBits = (inst.size() * 8) - 1;
bool can_use_dst_reg = dstp.is_int_register();
if (can_use_dst_reg && src1p.is_int_register())
@@ -4503,40 +4509,95 @@ void drcbe_arm64::op_rolc(a64::Assembler &a, const uml::instruction &inst)
const a64::Gp param1 = src1p.select_register(TEMP_REG3, inst.size());
const a64::Gp output = can_use_dst_reg ? dstp.select_register(TEMP_REG1, inst.size()) : select_register(TEMP_REG1, inst.size());
- const a64::Gp carry = select_register(SCRATCH_REG2, inst.size());
- mov_reg_param(a, inst.size(), param1, src1p);
+ bool zs_flags_done = false;
// shift > 1: src = (PARAM1 << shift) | (carry << (shift - 1)) | (PARAM1 >> (33 - shift))
// shift = 1: src = (PARAM1 << shift) | carry
if (src2p.is_immediate())
{
- const auto shift = src2p.immediate() % (inst.size() * 8);
+ const auto si = src2p.immediate() & maxBits;
- if (shift != 0)
+ if (!si)
{
- a.ubfx(carry, param1, (inst.size() * 8) - shift, 1);
- if (shift > 1)
- a.ubfx(output, param1, (inst.size() * 8) - shift + 1, shift - 1);
- a.bfi(output.x(), FLAGS_REG, shift - 1, 1);
- a.bfi(output, param1, shift, (inst.size() * 8) - shift);
- a.bfi(FLAGS_REG, carry.x(), 0, 1);
+ mov_reg_param(a, inst.size(), output, src1p);
+ }
+ else if (src1p.is_immediate_value(0))
+ {
+ // this depends on carry being the least significant bit of the flags
+ a.ubfiz(output, select_register(FLAGS_REG, inst.size()), si - 1, 1);
if (inst.flags() & FLAG_C)
- calculate_carry_shift_left_imm(a, param1, shift, maxBits);
+ store_carry_reg(a, a64::xzr);
+
+ m_carry_state = carry_state::POISON;
+ }
+ else if ((si == 1) && (m_carry_state == carry_state::CANONICAL))
+ {
+ mov_reg_param(a, inst.size(), param1, src1p);
+
+ if (inst.flags())
+ {
+ a.adcs(output, param1, param1);
+
+ if (inst.flags() & FLAG_C)
+ store_carry(a);
+ else
+ m_carry_state = carry_state::POISON;
+ }
+ else
+ {
+ a.adc(output, param1, param1);
+ }
+
+ zs_flags_done = true;
}
else
{
- a.mov(output, param1);
+ mov_reg_param(a, inst.size(), param1, src1p);
+
+ // this depends on carry being the least significant bit of the flags
+ if (si > 1)
+ a.lsr(output, param1, (inst.size() * 8) + 1 - si);
+ a.bfi(output, select_register(FLAGS_REG, inst.size()), si - 1, 1);
+ a.bfi(output, param1, si, (inst.size() * 8) - si);
+
+ if (inst.flags() & FLAG_C)
+ calculate_carry_shift_left_imm(a, param1, si, maxBits);
+ }
+ }
+ else if (src1p.is_immediate_value(0))
+ {
+ const a64::Gp scratch = select_register(TEMP_REG2, inst.size());
+ const a64::Gp shift = src2p.select_register(scratch, inst.size());
+ const a64::Gp zero = select_register(a64::xzr, inst.size());
+
+ mov_reg_param(a, inst.size(), shift, src2p);
+
+ a.ands(scratch, shift, maxBits);
+ get_carry(a, output);
+ a.sub(scratch, scratch, 1);
+ a.lsl(output, output, scratch);
+ a.csel(output, zero, output, a64::CondCode::kZero);
+
+ if (inst.flags() & FLAG_C)
+ {
+ // this depends on carry being the least significant bit of the flags
+ a.csel(scratch.x(), FLAGS_REG, a64::xzr, a64::CondCode::kZero);
+ store_carry_reg(a, scratch);
+
+ m_carry_state = carry_state::POISON;
}
}
else
{
const a64::Gp shift = src2p.select_register(TEMP_REG2, inst.size());
const a64::Gp scratch = select_register(SCRATCH_REG1, inst.size());
+ const a64::Gp carry = select_register(SCRATCH_REG2, inst.size());
const a64::Gp scratch2 = select_register(FUNC_SCRATCH_REG, inst.size());
+ mov_reg_param(a, inst.size(), param1, src1p);
mov_reg_param(a, inst.size(), shift, src2p);
a.and_(scratch2, shift, maxBits);
@@ -4570,7 +4631,7 @@ void drcbe_arm64::op_rolc(a64::Assembler &a, const uml::instruction &inst)
a.bind(skip3);
}
- if (inst.flags() & (FLAG_Z | FLAG_S))
+ if (!zs_flags_done && (inst.flags() & (FLAG_Z | FLAG_S)))
a.tst(output, output);
mov_param_reg(a, inst.size(), dstp, output);
@@ -4588,7 +4649,7 @@ void drcbe_arm64::op_rorc(a64::Assembler &a, const uml::instruction &inst)
be_parameter src1p(*this, inst.param(1), PTYPE_MRI);
be_parameter src2p(*this, inst.param(2), PTYPE_MRI);
- size_t const maxBits = inst.size() * 8 - 1;
+ size_t const maxBits = (inst.size() * 8) - 1;
bool can_use_dst_reg = dstp.is_int_register();
if (can_use_dst_reg && src1p.is_int_register())
@@ -4598,9 +4659,6 @@ void drcbe_arm64::op_rorc(a64::Assembler &a, const uml::instruction &inst)
const a64::Gp param1 = src1p.select_register(TEMP_REG3, inst.size());
const a64::Gp output = can_use_dst_reg ? dstp.select_register(TEMP_REG1, inst.size()) : select_register(TEMP_REG1, inst.size());
- const a64::Gp carry = select_register(SCRATCH_REG2, inst.size());
-
- mov_reg_param(a, inst.size(), param1, src1p);
// if (shift > 1)
// src = (PARAM1 >> shift) | (((flags & FLAG_C) << 31) >> (shift - 1)) | (PARAM1 << (33 - shift));
@@ -4609,31 +4667,66 @@ void drcbe_arm64::op_rorc(a64::Assembler &a, const uml::instruction &inst)
if (src2p.is_immediate())
{
- const auto shift = src2p.immediate() % (inst.size() * 8);
+ const auto si = src2p.immediate() & maxBits;
- if (shift != 0)
+ if (!si)
+ {
+ mov_reg_param(a, inst.size(), output, src1p);
+ }
+ else if (src1p.is_immediate_value(0))
{
- a.ubfx(carry, param1, shift - 1, 1);
- a.ubfx(output, param1, shift, (inst.size() * 8) - shift);
- a.bfi(output.x(), FLAGS_REG, (inst.size() * 8) - shift, 1);
- if (shift > 1)
- a.bfi(output, param1, (inst.size() * 8) - shift + 1, shift - 1);
- a.bfi(FLAGS_REG, carry.x(), 0, 1);
+ // this depends on carry being the least significant bit of the flags
+ a.ubfiz(output, select_register(FLAGS_REG, inst.size()), (inst.size() * 8) - si, 1);
if (inst.flags() & FLAG_C)
- calculate_carry_shift_right_imm(a, param1, shift);
+ store_carry_reg(a, a64::xzr);
+
+ m_carry_state = carry_state::POISON;
}
else
{
- a.mov(output, param1);
+ mov_reg_param(a, inst.size(), param1, src1p);
+
+ // this depends on carry being the least significant bit of the flags
+ a.lsr(output, param1, si);
+ a.bfi(output, select_register(FLAGS_REG, inst.size()), (inst.size() * 8) - si, 1);
+ if (si > 1)
+ a.bfi(output, param1, (inst.size() * 8) + 1 - si, si - 1);
+
+ if (inst.flags() & FLAG_C)
+ calculate_carry_shift_right_imm(a, param1, si);
+ }
+ }
+ else if (src1p.is_immediate_value(0))
+ {
+ const a64::Gp scratch = select_register(TEMP_REG2, inst.size());
+ const a64::Gp shift = src2p.select_register(scratch, inst.size());
+ const a64::Gp zero = select_register(a64::xzr, inst.size());
+
+ mov_reg_param(a, inst.size(), shift, src2p);
+
+ a.ands(scratch, shift, maxBits);
+ get_carry(a, output);
+ a.ror(output, output, scratch);
+ a.csel(output, zero, output, a64::CondCode::kZero);
+
+ if (inst.flags() & FLAG_C)
+ {
+ // this depends on carry being the least significant bit of the flags
+ a.csel(scratch.x(), FLAGS_REG, a64::xzr, a64::CondCode::kZero);
+ store_carry_reg(a, scratch);
+
+ m_carry_state = carry_state::POISON;
}
}
else
{
const a64::Gp shift = src2p.select_register(TEMP_REG2, inst.size());
const a64::Gp scratch = select_register(SCRATCH_REG1, inst.size());
+ const a64::Gp carry = select_register(SCRATCH_REG2, inst.size());
const a64::Gp scratch2 = select_register(FUNC_SCRATCH_REG, inst.size());
+ mov_reg_param(a, inst.size(), param1, src1p);
mov_reg_param(a, inst.size(), shift, src2p);
a.and_(scratch2, shift, maxBits);
diff --git a/src/devices/cpu/uml.cpp b/src/devices/cpu/uml.cpp
index cfe7735c437..21fe744cc76 100644
--- a/src/devices/cpu/uml.cpp
+++ b/src/devices/cpu/uml.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Aaron Giles
/***************************************************************************
- uml.c
+ uml.cpp
Universal machine language definitions and classes.
@@ -1119,6 +1119,7 @@ public:
// convert to NOP or MOV if there's no rotation
if (inst.param(2).is_immediate_value(0))
{
+ inst.m_flags &= ~FLAG_C; // carry flag unchanged after zero-bit rotate, MOV and NOP won't change carry flag
if ((inst.param(0) == inst.param(1)) && (!inst.param(0).is_int_register() || (inst.size() == 8)))
{
inst.nop();
diff --git a/src/mame/dynax/ddenlovr.cpp b/src/mame/dynax/ddenlovr.cpp
index 9a106e8fe99..6a64433fc86 100644
--- a/src/mame/dynax/ddenlovr.cpp
+++ b/src/mame/dynax/ddenlovr.cpp
@@ -42,8 +42,8 @@ Year + Game Board CPU Sound
1996 Mj Seiryu Densetsu NM5020403 Z80 YMZ284 YM2413 M6295 70C160F011?
1996 Mj Janshin Plus NM7001004 Z80 YMZ284 YM2413 M6295 TZ-2053P
1996 Mj Dai Touyouken NM7001004 Z80 YMZ284 YM2413 M6295 TZ-2053P
-1996 Return Of Sel Jan II NM504-2 Z80 YM2149 YM2413 M6295 TZ-2053P?
-1996 Return Of Sel Jan II NM5020403 Z80 YMZ284 YM2413 M6295 70C160F011?
+1996 Return of Sel Jan II NM504-2 Z80 YM2149 YM2413 M6295 TZ-2053P?
+1996 Return of Sel Jan II NM5020403 Z80 YMZ284 YM2413 M6295 70C160F011?
1997 Hana Kagerou KC80 YM2413 M6295 70C160F011
1997 Kkotbinyeo 9090123-2 KC80 YM2413 M6295 70C160F011 A1010
1997 Kkotbinyeo Special 9090123-3 KC80 YM2413 M6295 ?
@@ -4287,7 +4287,7 @@ void ddenlovr_state::janshinp_portmap(address_map &map)
/***************************************************************************
- Return Of Sel Jan II
+ Return of Sel Jan II
***************************************************************************/
void ddenlovr_state::seljan2_rombank_w(uint8_t data)
@@ -8354,6 +8354,12 @@ static INPUT_PORTS_START( sryudens )
INPUT_PORTS_END
static INPUT_PORTS_START( seljan2 )
+ // The manual provides four sets of standard settings:
+ // 標準設定 コインプールタイプ A 標準設定 コインプールタイプ B 標準設定 メダルコーナータイプ 標準設定 アミューズコーナータイプ
+ // SW 1 OFF OFF OFF ON ON ON OFF ON ON OFF OFF OFF OFF ON ON ON OFF ON ON OFF OFF OFF OFF ON ON ON OFF ON ON OFF ON OFF OFF ON OFF OFF ON OFF ON OFF
+ // SW 2 OFF OFF OFF OFF ON ON ON ON ON OFF OFF OFF OFF OFF ON ON ON ON ON OFF OFF OFF OFF OFF ON ON ON ON OFF ON OFF OFF OFF OFF ON ON ON ON OFF ON
+ // SW 3 ON ON OFF ON OFF ON OFF OFF OFF OFF ON ON OFF ON OFF ON OFF OFF OFF OFF OFF OFF ON ON OFF OFF OFF OFF OFF OFF ON OFF ON ON OFF OFF OFF ON ON OFF
+ // SW 4 OFF ON ON ON ON ON OFF OFF OFF OFF ON ON ON OFF ON ON ON OFF OFF OFF ON ON ON OFF ON ON ON OFF OFF OFF OFF OFF ON ON ON OFF OFF OFF ON OFF
PORT_START("SYSTEM")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) // pay
@@ -8368,133 +8374,105 @@ static INPUT_PORTS_START( seljan2 )
PORT_INCLUDE( mahjong_matrix_2p_bet_wup )
PORT_START("DSW1")
- PORT_DIPNAME( 0x0f, 0x07, "Pay Out Rate (%)" )
- PORT_DIPSETTING( 0x00, "50" )
- PORT_DIPSETTING( 0x01, "53" )
- PORT_DIPSETTING( 0x02, "56" )
- PORT_DIPSETTING( 0x03, "59" )
- PORT_DIPSETTING( 0x04, "62" )
- PORT_DIPSETTING( 0x05, "65" )
- PORT_DIPSETTING( 0x06, "68" )
- PORT_DIPSETTING( 0x07, "71" )
- PORT_DIPSETTING( 0x08, "75" )
- PORT_DIPSETTING( 0x09, "78" )
- PORT_DIPSETTING( 0x0a, "81" )
- PORT_DIPSETTING( 0x0b, "84" )
- PORT_DIPSETTING( 0x0c, "87" )
- PORT_DIPSETTING( 0x0d, "90" )
- PORT_DIPSETTING( 0x0e, "93" )
- PORT_DIPSETTING( 0x0f, "96" )
- PORT_DIPNAME( 0x30, 0x00, "Odds Rate" )
+ MAHJONG_PAYOUT_RATE(0, "DIP-SW1:1,2,3,4") // PAY OUT RATE
+ PORT_DIPNAME( 0x30, 0x00, "Odds Rate" ) PORT_DIPLOCATION("DIP-SW1:5,6") // ODDS RATE
PORT_DIPSETTING( 0x30, "1 2 4 8 12 16 24 32" )
PORT_DIPSETTING( 0x00, "1 2 3 5 8 15 30 50" )
PORT_DIPSETTING( 0x20, "2 3 6 8 12 15 30 50" )
PORT_DIPSETTING( 0x10, "1 2 3 5 10 25 50 100" )
- PORT_DIPNAME( 0xc0, 0x40, "Max Rate" )
+ PORT_DIPNAME( 0xc0, 0x40, "Maximum Bet" ) PORT_DIPLOCATION("DIP-SW1:7,8") // BET-MAX
PORT_DIPSETTING( 0xc0, "1" )
PORT_DIPSETTING( 0x80, "5" )
PORT_DIPSETTING( 0x40, "10" )
PORT_DIPSETTING( 0x00, "20" )
PORT_START("DSW2")
- PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) )
- PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
- PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
- PORT_DIPSETTING( 0x01, DEF_STR( 1C_5C ) )
- PORT_DIPSETTING( 0x00, DEF_STR( 1C_10C ) )
- PORT_DIPNAME( 0x0c, 0x0c, "Min Rate To Play" )
- PORT_DIPSETTING( 0x0c, "1" )
- PORT_DIPSETTING( 0x08, "2" )
- PORT_DIPSETTING( 0x04, "3" )
- PORT_DIPSETTING( 0x00, "5" )
- PORT_DIPNAME( 0x30, 0x00, "Payout" )
+ MAHJONG_COINAGE(0, "DIP-SW2:1,2") // COIN RATE
+ PORT_DIPNAME( 0x0c, 0x0c, "Minimum Bet" ) PORT_DIPLOCATION("DIP-SW2:3,4") // ゲーム・スタート時の最低レート数
+ PORT_DIPSETTING( 0x0c, "1" ) // レート1
+ PORT_DIPSETTING( 0x08, "2" ) // レート2
+ PORT_DIPSETTING( 0x04, "3" ) // レート3
+ PORT_DIPSETTING( 0x00, "5" ) // レート5
+ PORT_DIPNAME( 0x30, 0x00, "Credit Limit" ) PORT_DIPLOCATION("DIP-SW2:5,6") // クレジット・コインリミット
PORT_DIPSETTING( 0x30, "300" )
PORT_DIPSETTING( 0x20, "500" )
PORT_DIPSETTING( 0x10, "700" )
PORT_DIPSETTING( 0x00, "1000" )
- PORT_DIPNAME( 0x40, 0x00, "W-Bet" )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x00, "Last Chance" )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x00, "Double Bet" ) PORT_DIPLOCATION("DIP-SW2:7") // W-BET機能
+ PORT_DIPSETTING( 0x40, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有
+ PORT_DIPNAME( 0x80, 0x00, "Last Chance" ) PORT_DIPLOCATION("DIP-SW2:8") // ラストチャンス有無
+ PORT_DIPSETTING( 0x80, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有
PORT_START("DSW3")
- PORT_DIPNAME( 0x07, 0x07, "YAKUMAN Bonus" )
- PORT_DIPSETTING( 0x07, "Cut" )
- PORT_DIPSETTING( 0x06, "1 T" )
- PORT_DIPSETTING( 0x05, "300" )
- PORT_DIPSETTING( 0x04, "500" )
- PORT_DIPSETTING( 0x03, "700" )
- PORT_DIPSETTING( 0x02, "1000" )
-// PORT_DIPSETTING( 0x01, "1000" )
-// PORT_DIPSETTING( 0x00, "1000" )
- PORT_DIPNAME( 0x08, 0x00, "YAKUMAN Times" )
- PORT_DIPSETTING( 0x00, "1" )
- PORT_DIPSETTING( 0x08, "2" )
- PORT_DIPNAME( 0x10, 0x10, "Auto Tsumo" )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x00, "DonDen Key" )
- PORT_DIPSETTING( 0x20, "Start" )
- PORT_DIPSETTING( 0x00, "Flip Flop" )
- PORT_DIPNAME( 0x40, 0x40, "Digital Clock" )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, "Game Style" )
- PORT_DIPSETTING( 0x80, "Credit" )
- PORT_DIPSETTING( 0x00, "Credit Time" )
+ PORT_DIPNAME( 0x07, 0x04, "Yakuman Chance Cycle" ) PORT_DIPLOCATION("DIP-SW3:1,2,3") // 役満チャンスの周期
+ PORT_DIPSETTING( 0x07, "None" ) // 無
+ PORT_DIPSETTING( 0x06, "First time only" ) // 初回のみ
+ PORT_DIPSETTING( 0x05, "Every 300 coins" ) // 300コイン毎
+ PORT_DIPSETTING( 0x04, "Every 500 coins" ) // 500コイン毎
+ PORT_DIPSETTING( 0x03, "Every 700 coins" ) // 700コイン毎
+ PORT_DIPSETTING( 0x02, "Every 1000 coins" ) // 1000コイン毎
+// PORT_DIPSETTING( 0x01, "Every 1000 coins" )
+// PORT_DIPSETTING( 0x00, "Every 1000 coins" )
+ PORT_DIPNAME( 0x08, 0x00, "Yakuman Chances Per Cycle" ) PORT_DIPLOCATION("DIP-SW3:4") // 役満チャンスの回数設定周期毎に
+ PORT_DIPSETTING( 0x00, "1" ) // 1回
+ PORT_DIPSETTING( 0x08, "2" ) // 2回
+ PORT_DIPNAME( 0x10, 0x10, "Auto Reach" ) PORT_DIPLOCATION("DIP-SW3:5") // オートリーチの有無
+ PORT_DIPSETTING( 0x10, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有
+ PORT_DIPNAME( 0x20, 0x00, "Don Den Button" ) PORT_DIPLOCATION("DIP-SW3:6") // Don・Den機能ボタン変更
+ PORT_DIPSETTING( 0x20, "Start" ) // スタート
+ PORT_DIPSETTING( 0x00, "Flip Flop" ) // F/F
+ PORT_DIPNAME( 0x40, 0x40, "Medal Timer" ) PORT_DIPLOCATION("DIP-SW3:7") // メダルタイマーの設定
+ PORT_DIPSETTING( 0x40, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有
+ PORT_DIPNAME( 0x80, 0x80, "Game Style" ) PORT_DIPLOCATION("DIP-SW3:8") // ゲームスタイル
+ PORT_DIPSETTING( 0x80, "Credit" ) // クレジット
+ PORT_DIPSETTING( 0x00, "Credit Timer" ) // クレジットタイマー
PORT_START("DSW4")
- PORT_DIPNAME( 0x01, 0x00, DEF_STR( Demo_Sounds ) )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x00, "In Game Music" )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) // used
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) // used
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x00, "More Revealing Attract Mode" )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) ) // 3
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) // used
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) // used
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) // used
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x01, 0x00, DEF_STR(Demo_Sounds) ) PORT_DIPLOCATION("DIP-SW4:1") // デモサウンド
+ PORT_DIPSETTING( 0x01, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有
+ PORT_DIPNAME( 0x02, 0x00, "In-Game Music" ) PORT_DIPLOCATION("DIP-SW4:2") // ゲームサウンド
+ PORT_DIPSETTING( 0x02, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有
+ PORT_DIPNAME( 0x04, 0x00, "Show Renchan Gal" ) PORT_DIPLOCATION("DIP-SW4:3") // 連荘ギャル表示
+ PORT_DIPSETTING( 0x04, DEF_STR(No) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(Yes) ) // 有
+ PORT_DIPNAME( 0x08, 0x00, "Renchan Gal Display") PORT_DIPLOCATION("DIP-SW4:4") // 連荘ギャル表示方法
+ PORT_DIPSETTING( 0x08, "After Every Win" ) // 勝つ毎
+ PORT_DIPSETTING( 0x00, "After 3 Consecutive Wins" ) // 3連荘後
+ PORT_DIPNAME( 0x10, 0x00, "Game Screen Gal Action" ) PORT_DIPLOCATION("DIP-SW4:5") // ゲーム画面のギャルアクションの有無
+ PORT_DIPSETTING( 0x10, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有
+ PORT_DIPNAME( 0x20, 0x00, "In-Game Voice" ) PORT_DIPLOCATION("DIP-SW4:6") // ゲーム中のボイス有無
+ PORT_DIPSETTING( 0x20, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有
+ PORT_DIPNAME( 0x40, 0x40, "Winning Yakuman Display Voice" ) PORT_DIPLOCATION("DIP-SW4:7") // あがり役満表示のボイス
+ PORT_DIPSETTING( 0x40, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有
+ PORT_DIPNAME( 0x80, 0x80, "Hopper Polarity" ) PORT_DIPLOCATION("DIP-SW4:8") // ホッパーアクティブ
+ PORT_DIPSETTING( 0x80, DEF_STR(Normal) ) // 通常
+ PORT_DIPSETTING( 0x00, "Inverted" ) // 反転
PORT_START("DSWTOP")
- PORT_DIPNAME( 0x01, 0x00, "Credits Per Note" )
- PORT_DIPSETTING( 0x01, "5" )
- PORT_DIPSETTING( 0x00, "10" )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x0c, 0x04, "Computer Strength" )
- PORT_DIPSETTING( 0x00, "Weak" )
- PORT_DIPSETTING( 0x04, DEF_STR( Normal ))
- PORT_DIPSETTING( 0x0c, "Strong" )
- PORT_DIPSETTING( 0x08, "Very Strong" )
- PORT_DIPNAME( 0x10, 0x10, "Timer Speed?" )
- PORT_DIPSETTING( 0x10, "Normal?" )
- PORT_DIPSETTING( 0x00, "Variable Rate?" )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ MAHJONG_NOTE_CREDITS(0, "DIP-SW1:9", "DSW2", 0) // NOTE RATE
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR(Flip_Screen) ) PORT_DIPLOCATION("DIP-SW1:10") // モニター画面反転
+ PORT_DIPSETTING( 0x02, DEF_STR(Off) ) // 通常
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 反転
+ PORT_DIPNAME( 0x0c, 0x08, "Computer Strength" ) PORT_DIPLOCATION("DIP-SW2:9,10") // コンピュタの強さ(放銃パターンの確率)
+ PORT_DIPSETTING( 0x00, "Weak" ) // 弱い
+ PORT_DIPSETTING( 0x04, DEF_STR(Normal) ) // 普通
+ PORT_DIPSETTING( 0x08, "Somewhat Strong" ) // やや強い
+ PORT_DIPSETTING( 0x0c, "Strong" ) // 強い
+ PORT_DIPNAME( 0x10, 0x10, "Start Method With Credit Timer" ) PORT_DIPLOCATION("DIP-SW3:9") // クレジットタイマー時のスタート方式
+ PORT_DIPSETTING( 0x10, DEF_STR(Normal) ) // 通常
+ PORT_DIPSETTING( 0x00, "Always Minimum Bet" ) // 最低RATE固定
+ PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "DIP-SW3:10" ) // OFF固定
+ PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "DIP-SW4:9" ) // OFF固定
+ PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "DIP-SW4:10" ) // OFF固定
PORT_START("BET")
PORT_DIPNAME( 0x40, 0x40, "Bets?" )
@@ -8663,6 +8641,12 @@ static INPUT_PORTS_START( janshinp )
INPUT_PORTS_END
static INPUT_PORTS_START( dtoyoken )
+ // The manual provides two sets of standard settings:
+ // 標準設定 メダルコーナータイプA メダルコーナータイプB
+ // SW 1 OFF OFF OFF ON ON ON OFF ON ON OFF OFF OFF OFF ON OFF ON OFF ON ON OFF
+ // SW 2 OFF OFF OFF OFF ON ON ON ON OFF ON OFF OFF OFF OFF ON ON ON ON OFF ON
+ // SW 3 ON OFF ON OFF ON OFF OFF OFF OFF OFF ON OFF ON ON ON OFF OFF OFF OFF OFF
+ // SW 4 ON ON ON OFF ON ON ON OFF OFF OFF ON ON ON OFF ON ON ON OFF OFF OFF
PORT_START("SYSTEM")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) // pay
@@ -8677,133 +8661,99 @@ static INPUT_PORTS_START( dtoyoken )
PORT_INCLUDE( mahjong_matrix_2p_bet_wup )
PORT_START("DSW1")
- PORT_DIPNAME( 0x0f, 0x07, "Pay Out Rate (%)" )
- PORT_DIPSETTING( 0x00, "50" )
- PORT_DIPSETTING( 0x01, "53" )
- PORT_DIPSETTING( 0x02, "56" )
- PORT_DIPSETTING( 0x03, "59" )
- PORT_DIPSETTING( 0x04, "62" )
- PORT_DIPSETTING( 0x05, "65" )
- PORT_DIPSETTING( 0x06, "68" )
- PORT_DIPSETTING( 0x07, "71" )
- PORT_DIPSETTING( 0x08, "75" )
- PORT_DIPSETTING( 0x09, "78" )
- PORT_DIPSETTING( 0x0a, "81" )
- PORT_DIPSETTING( 0x0b, "84" )
- PORT_DIPSETTING( 0x0c, "87" )
- PORT_DIPSETTING( 0x0d, "90" )
- PORT_DIPSETTING( 0x0e, "93" )
- PORT_DIPSETTING( 0x0f, "96" )
- PORT_DIPNAME( 0x30, 0x00, "Odds Rate" )
+ MAHJONG_PAYOUT_RATE(0, "DIP-SW1:1,2,3,4") // PAY OUT RATE
+ PORT_DIPNAME( 0x30, 0x00, "Odds Rate" ) PORT_DIPLOCATION("DIP-SW1:5,6") // ODDS RATE
PORT_DIPSETTING( 0x30, "1 2 4 8 12 16 24 32" )
PORT_DIPSETTING( 0x00, "1 2 3 5 8 15 30 50" )
PORT_DIPSETTING( 0x20, "2 3 6 8 12 15 30 50" )
PORT_DIPSETTING( 0x10, "1 2 3 5 10 25 50 100" )
- PORT_DIPNAME( 0xc0, 0x40, "Max Rate" )
+ PORT_DIPNAME( 0xc0, 0x40, "Maximum Bet" ) PORT_DIPLOCATION("DIP-SW1:7,8") // BET-MAX
PORT_DIPSETTING( 0xc0, "1" )
PORT_DIPSETTING( 0x80, "5" )
PORT_DIPSETTING( 0x40, "10" )
PORT_DIPSETTING( 0x00, "20" )
PORT_START("DSW2")
- PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) )
- PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
- PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
- PORT_DIPSETTING( 0x01, DEF_STR( 1C_5C ) )
- PORT_DIPSETTING( 0x00, DEF_STR( 1C_10C ) )
- PORT_DIPNAME( 0x0c, 0x0c, "Min Rate To Play" )
- PORT_DIPSETTING( 0x0c, "1" )
- PORT_DIPSETTING( 0x08, "2" )
- PORT_DIPSETTING( 0x04, "3" )
- PORT_DIPSETTING( 0x00, "5" )
- PORT_DIPNAME( 0x30, 0x00, "Payout" )
+ MAHJONG_COINAGE(0, "DIP-SW2:1,2") // COIN RATE
+ PORT_DIPNAME( 0x0c, 0x0c, "Minimum Bet" ) PORT_DIPLOCATION("DIP-SW2:3,4") // ゲーム・スタート時の最低レート枚
+ PORT_DIPSETTING( 0x0c, "1" ) // レート1
+ PORT_DIPSETTING( 0x08, "2" ) // レート2
+ PORT_DIPSETTING( 0x04, "3" ) // レート3
+ PORT_DIPSETTING( 0x00, "5" ) // レート5
+ PORT_DIPNAME( 0x30, 0x00, "Credit Limit" ) PORT_DIPLOCATION("DIP-SW2:5,6") // クレジット・コインリミット
PORT_DIPSETTING( 0x30, "300" )
PORT_DIPSETTING( 0x20, "500" )
PORT_DIPSETTING( 0x10, "700" )
PORT_DIPSETTING( 0x00, "1000" )
- PORT_DIPNAME( 0x40, 0x00, "W-Bet" )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x00, "Last Chance" )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x00, "Double Bet" ) PORT_DIPLOCATION("DIP-SW2:7") // W-BET機能
+ PORT_DIPSETTING( 0x40, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有
+ PORT_DIPNAME( 0x80, 0x00, "Last Chance" ) PORT_DIPLOCATION("DIP-SW2:8") // ラストチャンス有無
+ PORT_DIPSETTING( 0x80, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有
PORT_START("DSW3")
- PORT_DIPNAME( 0x07, 0x07, "YAKUMAN Bonus" )
- PORT_DIPSETTING( 0x07, "Cut" )
- PORT_DIPSETTING( 0x06, "1 T" )
- PORT_DIPSETTING( 0x05, "300" )
- PORT_DIPSETTING( 0x04, "500" )
- PORT_DIPSETTING( 0x03, "700" )
- PORT_DIPSETTING( 0x02, "1000" )
-// PORT_DIPSETTING( 0x01, "1000" )
-// PORT_DIPSETTING( 0x00, "1000" )
- PORT_DIPNAME( 0x08, 0x00, "YAKUMAN Times" )
- PORT_DIPSETTING( 0x00, "1" )
- PORT_DIPSETTING( 0x08, "2" )
- PORT_DIPNAME( 0x10, 0x10, "Auto Tsumo" )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x00, "DonDen Key" )
- PORT_DIPSETTING( 0x20, "Start" )
- PORT_DIPSETTING( 0x00, "Flip Flop" )
- PORT_DIPNAME( 0x40, 0x40, "Digital Clock" )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x07, 0x02, "Yakuman Chance Cycle" ) PORT_DIPLOCATION("DIP-SW3:1,2,3") // 役満チャンスの周期
+ PORT_DIPSETTING( 0x07, "None" ) // 無
+ PORT_DIPSETTING( 0x06, "First time only" ) // 初回のみ
+ PORT_DIPSETTING( 0x05, "Every 300 coins" ) // 300コイン毎
+ PORT_DIPSETTING( 0x04, "Every 500 coins" ) // 500コイン毎
+ PORT_DIPSETTING( 0x03, "Every 700 coins" ) // 700コイン毎
+ PORT_DIPSETTING( 0x02, "Every 1000 coins" ) // 1000コイン毎
+// PORT_DIPSETTING( 0x01, "Every 1000 coins" )
+// PORT_DIPSETTING( 0x00, "Every 1000 coins" )
+ PORT_DIPNAME( 0x08, 0x08, "Yakuman Chances Per Cycle" ) PORT_DIPLOCATION("DIP-SW3:4") // 役満チャンスの回数設定周期毎に
+ PORT_DIPSETTING( 0x00, "1" ) // 1回
+ PORT_DIPSETTING( 0x08, "2" ) // 2回
+ PORT_DIPNAME( 0x10, 0x00, "Auto Reach" ) PORT_DIPLOCATION("DIP-SW3:5") // オートリーチの有無
+ PORT_DIPSETTING( 0x10, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有
+ PORT_DIPNAME( 0x20, 0x20, "Don Den Button" ) PORT_DIPLOCATION("DIP-SW3:6") // Don・Den機能ボタン変更
+ PORT_DIPSETTING( 0x20, "Start" ) // スタート
+ PORT_DIPSETTING( 0x00, "Flip Flop" ) // F/F
+ PORT_DIPNAME( 0x40, 0x40, "Medal Timer" ) PORT_DIPLOCATION("DIP-SW3:7") // メダルタイマーの設定
+ PORT_DIPSETTING( 0x40, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有
+ PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "DIP-SW3:8" ) // OFF固定
PORT_START("DSW4")
- PORT_DIPNAME( 0x01, 0x00, DEF_STR( Demo_Sounds ) )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x00, "In Game Music" )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) // used
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) // used
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x00, "Undress Girl" )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) ) // 3
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) // used
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) // used
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) // used
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x01, 0x00, DEF_STR(Demo_Sounds) ) PORT_DIPLOCATION("DIP-SW4:1") // デモサウンド
+ PORT_DIPSETTING( 0x01, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有
+ PORT_DIPNAME( 0x02, 0x00, "In-Game Music" ) PORT_DIPLOCATION("DIP-SW4:2") // ゲームサウンド
+ PORT_DIPSETTING( 0x02, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有
+ PORT_DIPNAME( 0x04, 0x00, "Show Renchan Gal" ) PORT_DIPLOCATION("DIP-SW4:3") // 連荘ギャル表示
+ PORT_DIPSETTING( 0x04, DEF_STR(No) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(Yes) ) // 有
+ PORT_DIPNAME( 0x08, 0x08, "Renchan Gal Display") PORT_DIPLOCATION("DIP-SW4:4") // 連荘ギャル表示方法
+ PORT_DIPSETTING( 0x08, "After Every Win" ) // 勝つ毎
+ PORT_DIPSETTING( 0x00, "After 3 Consecutive Wins" ) // 3連荘後
+ PORT_DIPNAME( 0x10, 0x00, "Game Screen Gal Action" ) PORT_DIPLOCATION("DIP-SW4:5") // ゲーム画面のギャルアクションの有無
+ PORT_DIPSETTING( 0x10, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有
+ PORT_DIPNAME( 0x20, 0x00, "In-Game Voice" ) PORT_DIPLOCATION("DIP-SW4:6") // ゲーム中のボイス有無
+ PORT_DIPSETTING( 0x20, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有
+ PORT_DIPNAME( 0x40, 0x00, "Winning Yakuman Display Voice" ) PORT_DIPLOCATION("DIP-SW4:7") // あがり役満表示のボイス
+ PORT_DIPSETTING( 0x40, DEF_STR(Off) ) // 無
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有
+ PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "DIP-SW4:8" ) // OFF固定
PORT_START("DSWTOP")
- PORT_DIPNAME( 0x01, 0x00, "Credits Per Note" )
- PORT_DIPSETTING( 0x01, "5" )
- PORT_DIPSETTING( 0x00, "10" )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x0c, 0x04, "Computer Strength" )
- PORT_DIPSETTING( 0x00, "Weak" )
- PORT_DIPSETTING( 0x04, DEF_STR( Normal ))
- PORT_DIPSETTING( 0x0c, "Strong" )
- PORT_DIPSETTING( 0x08, "Very Strong" )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ MAHJONG_NOTE_CREDITS(0, "DIP-SW1:9", "DSW2", 0) // NOTE RATE
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR(Flip_Screen) ) PORT_DIPLOCATION("DIP-SW1:10") // モニター画面反転
+ PORT_DIPSETTING( 0x02, DEF_STR(Off) ) // 通常
+ PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 反転
+ PORT_DIPNAME( 0x0c, 0x04, "Computer Strength" ) PORT_DIPLOCATION("DIP-SW2:9,10") // コンピュタの強さ
+ PORT_DIPSETTING( 0x00, "Weak" ) // 弱い
+ PORT_DIPSETTING( 0x04, DEF_STR(Normal) ) // 普通
+ PORT_DIPSETTING( 0x08, "Somewhat Strong" ) // やや強い
+ PORT_DIPSETTING( 0x0c, "Strong" ) // 強い
+ PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "DIP-SW3:9" ) // OFF固定
+ PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "DIP-SW3:10" ) // OFF固定
+ PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "DIP-SW4:9" ) // OFF固定
+ PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "DIP-SW4:10" ) // OFF固定
PORT_START("BET")
PORT_DIPNAME( 0x40, 0x40, "Bets?" )
@@ -10202,7 +10152,7 @@ void ddenlovr_state::dtoyoken(machine_config &config)
/***************************************************************************
- Return Of Sel Jan II
+ Return of Sel Jan II
***************************************************************************/
MACHINE_START_MEMBER(ddenlovr_state,seljan2)
@@ -12776,7 +12726,7 @@ ROM_END
/***************************************************************************
-Return Of Sel Jan II
+Return of Sel Jan II
PCB is NM504-2:
@@ -13037,8 +12987,8 @@ GAME( 1996, dtoyoken, 0, dtoyoken, dtoyoken, ddenlovr_state, empty_
GAME( 1996, sryudens, 0, sryudens, sryudens, ddenlovr_state, empty_init, ROT0, "Dynax / Face", "Mahjong Seiryu Densetsu (Japan, NM502)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1996, seljan2, 0, seljan2, seljan2, ddenlovr_state, empty_init, ROT0, "Dynax / Face", "Return Of Sel Jan II (Japan, NM557)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1996, seljan2a, seljan2, sryudens, seljan2, ddenlovr_state, empty_init, ROT0, "Dynax / Face", "Return Of Sel Jan II (Japan, NM508)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, seljan2, 0, seljan2, seljan2, ddenlovr_state, empty_init, ROT0, "Dynax / Face", "Return of Sel Jan II (Japan, NM557)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1996, seljan2a, seljan2, sryudens, seljan2, ddenlovr_state, empty_init, ROT0, "Dynax / Face", "Return of Sel Jan II (Japan, NM508)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
GAME( 1996, mjflove, 0, mjflove, mjflove, ddenlovr_state, empty_init, ROT0, "Nakanihon", "Mahjong Fantasic Love (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/dynax/dynax.cpp b/src/mame/dynax/dynax.cpp
index 729cf84be94..405d7c58179 100644
--- a/src/mame/dynax/dynax.cpp
+++ b/src/mame/dynax/dynax.cpp
@@ -3503,7 +3503,7 @@ static INPUT_PORTS_START( mjreach )
PORT_DIPSETTING( 0x20, "Small" ) // 小さい
PORT_DIPSETTING( 0x00, DEF_STR(Normal) ) // 通常
PORT_DIPNAME( 0x40, 0x40, "Renchan Gal Display" ) PORT_DIPLOCATION("DIP-SW4:9") // 連荘ギャルの表示の方式
- PORT_DIPSETTING( 0x40, "After Each Win" ) // 勝つごとに表示 (= On according to manual page?)
+ PORT_DIPSETTING( 0x40, "After Every Win" ) // 勝つごとに表示 (= On according to manual page?)
PORT_DIPSETTING( 0x00, "After 3 Consecutive Wins" ) // 3連荘のみ表示 (= Off according to manual page?)
PORT_DIPNAME( 0x80, 0x80, DEF_STR(Unknown) ) PORT_DIPLOCATION("DIP-SW4:10") // OFF固定
PORT_DIPSETTING( 0x80, DEF_STR(Off) )
diff --git a/src/mame/dynax/royalmah.cpp b/src/mame/dynax/royalmah.cpp
index 6cf045d28d4..705c41cbf9f 100644
--- a/src/mame/dynax/royalmah.cpp
+++ b/src/mame/dynax/royalmah.cpp
@@ -3454,7 +3454,7 @@ static INPUT_PORTS_START( cafebrk )
PORT_DIPNAME( 0x02, 0x02, DEF_STR(Flip_Screen) ) PORT_DIPLOCATION("SW 1:10") // モニター画面反転
PORT_DIPSETTING( 0x02, DEF_STR(Off) ) // 通常
PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 反転
- PORT_DIPNAME( 0x0c, 0x08, "Computer Strength" ) PORT_DIPLOCATION("SW 2:9,10") // コンピューターの強さ
+ PORT_DIPNAME( 0x0c, 0x08, "Computer Strength" ) PORT_DIPLOCATION("SW 2:9,10") // コンピュータの強さ
PORT_DIPSETTING( 0x00, "Weak" ) // 弱い
PORT_DIPSETTING( 0x04, DEF_STR(Normal) ) // 普通
PORT_DIPSETTING( 0x08, "Somewhat Strong" ) // やや強い