seta/srmp2.cpp: Cleaned up inputs a little, and suppress side effects of reads for debugger.

This commit is contained in:
Vas Crabb 2023-04-18 06:25:23 +10:00
parent bb1cf9aa1f
commit c589600375
2 changed files with 60 additions and 64 deletions

View File

@ -266,19 +266,12 @@ uint8_t srmp2_state::vox_status_r()
uint8_t srmp2_state::iox_key_matrix_calc(uint8_t p_side)
{
static const char *const keynames[] = { "KEY0", "KEY1", "KEY2", "KEY3", "KEY4", "KEY5", "KEY6", "KEY7" };
int i, j, t;
for (i = 0x00 ; i < 0x20 ; i += 8)
for (int i = 0; i < 4; i++)
{
j = (i / 0x08);
for (t = 0 ; t < 8 ; t ++)
for (int t = 0; t < 8; t ++)
{
if (!(ioport(keynames[j+p_side])->read() & ( 1 << t )))
{
return (i + t) | (p_side ? 0x20 : 0x00);
}
if (!BIT(m_keys[i | (p_side << 2)]->read(), t))
return (i << 3) | t | (p_side << 5);
}
}
@ -288,44 +281,41 @@ uint8_t srmp2_state::iox_key_matrix_calc(uint8_t p_side)
uint8_t srmp2_state::iox_mux_r()
{
/* first off check any pending protection value */
for (int i = 0; i < 4; i++)
{
int i;
if (m_iox.protcheck[i] == -1)
continue; //skip
for(i=0;i<4;i++)
if (m_iox.data == m_iox.protcheck[i])
{
if(m_iox.protcheck[i] == -1)
continue; //skip
if(m_iox.data == m_iox.protcheck[i])
{
if (!machine().side_effects_disabled())
m_iox.data = 0; //clear write latch
return m_iox.protlatch[i];
}
return m_iox.protlatch[i];
}
}
if(m_iox.ff == 0)
if (m_iox.ff == 0)
{
if(m_iox.mux != 1 && m_iox.mux != 2 && m_iox.mux != 4)
if (m_iox.mux != 1 && m_iox.mux != 2 && m_iox.mux != 4)
return 0xff; //unknown command
/* both side checks */
if(m_iox.mux == 1)
if (m_iox.mux == 1)
{
uint8_t p1_side = iox_key_matrix_calc(0);
uint8_t p2_side = iox_key_matrix_calc(4);
uint8_t const p1_side = iox_key_matrix_calc(0);
uint8_t const p2_side = iox_key_matrix_calc(1);
if(p1_side != 0)
if (p1_side != 0)
return p1_side;
return p2_side;
else
return p2_side;
}
/* check individual input side */
return iox_key_matrix_calc((m_iox.mux == 2) ? 0 : 4);
return iox_key_matrix_calc((m_iox.mux == 2) ? 0 : 1);
}
return ioport("SERVICE")->read() & 0xff;
return m_service->read() & 0xff;
}
uint8_t srmp2_state::iox_status_r()
@ -336,10 +326,10 @@ uint8_t srmp2_state::iox_status_r()
void srmp2_state::iox_command_w(uint8_t data)
{
/*
bit wise command port apparently
bitwise command port apparently
0x01: selects both sides
0x02: selects p1 side
0x04: selects p2 side
0x02: selects 1P side
0x04: selects 2P side
*/
m_iox.mux = data;
@ -411,16 +401,18 @@ void srmp2_state::srmp2_map(address_map &map)
map(0xf00000, 0xf00003).w("aysnd", FUNC(ay8910_device::address_data_w)).umask16(0x00ff);
}
uint8_t srmp2_state::mjyuugi_irq2_ack_r()
uint8_t srmp2_state::mjyuugi_irq2_ack_r(address_space &space)
{
m_maincpu->set_input_line(2, CLEAR_LINE);
return 0xff; // value returned doesn't matter
if (!machine().side_effects_disabled())
m_maincpu->set_input_line(2, CLEAR_LINE);
return space.unmap(); // value returned doesn't matter
}
uint8_t srmp2_state::mjyuugi_irq4_ack_r()
uint8_t srmp2_state::mjyuugi_irq4_ack_r(address_space &space)
{
m_maincpu->set_input_line(4, CLEAR_LINE);
return 0xff; // value returned doesn't matter
if (!machine().side_effects_disabled())
m_maincpu->set_input_line(4, CLEAR_LINE);
return space.unmap(); // value returned doesn't matter
}
void srmp2_state::mjyuugi_map(address_map &map)
@ -765,9 +757,9 @@ static INPUT_PORTS_START( srmp3 )
PORT_START("SERVICE")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE3 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MEMORY_RESET )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE2 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Analyzer")
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
@ -786,10 +778,10 @@ static INPUT_PORTS_START( rmgoldyh )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("SERVICE")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_SERVICE4 ) PORT_NAME("Payout")
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Memory Clear")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_SERVICE3 ) PORT_NAME("Payout")
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MEMORY_RESET )
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Test Mode")
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_SERVICE3 ) PORT_NAME("Analyzer")
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Analyzer")
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN )
@ -798,7 +790,7 @@ static INPUT_PORTS_START( rmgoldyh )
PORT_INCLUDE( seta_mjctrl )
// dip sheets available at MameTesters (MT05599)
// DIP switch sheets available at MameTesters (MT05599)
PORT_START("DSW1")
PORT_DIPNAME( 0x03, 0x00, "Distribution list" ) PORT_DIPLOCATION("SW1:1,2")
PORT_DIPSETTING( 0x03, "32:24:16:12:8:4:2:1" )
@ -1596,11 +1588,11 @@ ROM_END
GAME( 1987, srmp1, 0, srmp2, srmp2, srmp2_state, empty_init, ROT0, "Seta", "Super Real Mahjong Part 1 (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, srmp2, 0, srmp2, srmp2, srmp2_state, empty_init, ROT0, "Seta", "Super Real Mahjong Part 2 (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, srmp3, 0, srmp3, srmp3, srmp2_state, empty_init, ROT0, "Seta", "Super Real Mahjong Part 3 (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, rmgoldyh, srmp3, rmgoldyh, rmgoldyh, srmp2_state, empty_init, ROT0, "Seta (Alba license)", "Real Mahjong Gold Yumehai / Super Real Mahjong GOLD part.2 [BET] (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1990, mjyuugi, 0, mjyuugi, mjyuugi, srmp2_state, empty_init, ROT0, "Visco", "Mahjong Yuugi (Japan set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1990, mjyuugia, mjyuugi, mjyuugi, mjyuugi, srmp2_state, empty_init, ROT0, "Visco", "Mahjong Yuugi (Japan set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1991, ponchin, 0, mjyuugi, ponchin, srmp2_state, empty_init, ROT0, "Visco", "Mahjong Pon Chin Kan (Japan set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1991, ponchina, ponchin, mjyuugi, ponchin, srmp2_state, empty_init, ROT0, "Visco", "Mahjong Pon Chin Kan (Japan set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, srmp1, 0, srmp2, srmp2, srmp2_state, empty_init, ROT0, "Seta", "Super Real Mahjong Part 1 (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, srmp2, 0, srmp2, srmp2, srmp2_state, empty_init, ROT0, "Seta", "Super Real Mahjong Part 2 (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, srmp3, 0, srmp3, srmp3, srmp2_state, empty_init, ROT0, "Seta", "Super Real Mahjong Part 3 (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, rmgoldyh, srmp3, rmgoldyh, rmgoldyh, srmp2_state, empty_init, ROT0, "Seta (Alba license)", "Real Mahjong Gold Yumehai / Super Real Mahjong GOLD part.2 [BET] (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1990, mjyuugi, 0, mjyuugi, mjyuugi, srmp2_state, empty_init, ROT0, "Visco", "Mahjong Yuugi (Japan set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1990, mjyuugia, mjyuugi, mjyuugi, mjyuugi, srmp2_state, empty_init, ROT0, "Visco", "Mahjong Yuugi (Japan set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1991, ponchin, 0, mjyuugi, ponchin, srmp2_state, empty_init, ROT0, "Visco", "Mahjong Pon Chin Kan (Japan set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1991, ponchina, ponchin, mjyuugi, ponchin, srmp2_state, empty_init, ROT0, "Visco", "Mahjong Pon Chin Kan (Japan set 2)", MACHINE_SUPPORTS_SAVE )

View File

@ -12,21 +12,15 @@
class srmp2_state : public driver_device
{
public:
struct iox_t
{
int reset = 0, ff_event,ff_1 = 0, protcheck[4]{}, protlatch[4]{};
uint8_t data = 0;
uint8_t mux = 0;
uint8_t ff = 0;
};
srmp2_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_spritegen(*this, "spritegen"),
m_msm(*this, "msm"),
m_adpcm_rom(*this, "adpcm"),
m_mainbank(*this, "mainbank")
m_mainbank(*this, "mainbank"),
m_keys(*this, "KEY%u", 0U),
m_service(*this, "SERVICE")
{ }
void mjyuugi(machine_config &config);
@ -35,11 +29,21 @@ public:
void srmp3(machine_config &config);
private:
struct iox_t
{
int reset = 0, ff_event,ff_1 = 0, protcheck[4]{}, protlatch[4]{};
uint8_t data = 0;
uint8_t mux = 0;
uint8_t ff = 0;
};
required_device<cpu_device> m_maincpu;
required_device<x1_001_device> m_spritegen;
required_device<msm5205_device> m_msm;
required_region_ptr<uint8_t> m_adpcm_rom;
optional_memory_bank m_mainbank;
required_ioport_array<8> m_keys;
required_ioport m_service;
uint8_t m_color_bank = 0;
uint8_t m_gfx_bank = 0;
@ -60,8 +64,8 @@ private:
// mjuugi
void mjyuugi_flags_w(uint16_t data);
void mjyuugi_adpcm_bank_w(uint16_t data);
uint8_t mjyuugi_irq2_ack_r();
uint8_t mjyuugi_irq4_ack_r();
uint8_t mjyuugi_irq2_ack_r(address_space &space);
uint8_t mjyuugi_irq4_ack_r(address_space &space);
// rmgoldyh
void rmgoldyh_rombank_w(uint8_t data);