From fdc538eb29b74ec2b88cb84a875fa2f1a7d8b195 Mon Sep 17 00:00:00 2001 From: Fabio Priuli Date: Sat, 22 Mar 2014 14:18:05 +0000 Subject: [PATCH] (MESS) sms.c: fixed behavior of the TH pin in the Japanese SMS consoles. [Enik Land] --- src/mess/drivers/sms.c | 24 ++++++++++++++++++------ src/mess/machine/sms.c | 31 ++++++++++++++++++++++--------- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/mess/drivers/sms.c b/src/mess/drivers/sms.c index 4f6eb2de086..ffa2b4848df 100644 --- a/src/mess/drivers/sms.c +++ b/src/mess/drivers/sms.c @@ -21,6 +21,16 @@ - Emulate SRAM cartridges? (for use with Bock's dump tool) - Support for other DE-9 compatible controllers, like the Mega Drive 6-Button that has software support (at least a test tool made by Charles MacDonald) + - Figure out how korean SMS versions have support for the Light Phaser gun + + Light Phaser support of korean SMS consoles is shown in some korean adverts: + www.smspower.org/forums/viewtopic.php?p=45903#45903 + The support requires read of TH input state through the 2 upper bits of + port $dd. Because the korean driver is set to Japan region, it behaves like + the japanese SMS, which sets those bits with TH direction state, not input. + The first korean SMS is derivered from the japanese SMS, but only the units + with plug-in AC adaptor have the FM chip. Games only play FM sound when detect + the japanese region by testing how the 2 upper bits of port $dd behave. The Game Gear SIO hardware is not emulated but has some placeholders in 'machine/sms.c' @@ -757,6 +767,14 @@ static MACHINE_CONFIG_DERIVED( sms_fm, sms1_ntsc ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_IO_MAP(smsj_io) + // Mark III does not have TH connected. Also, according with Enri's docs + // (http://www43.tok2.com/home/cmpslv/Sms/EnrSms.htm), the Japanese SMS + // only allows read of TH direction, through port $dd, not its input state. + MCFG_SMS_CONTROL_PORT_MODIFY(CONTROL1_TAG) + MCFG_SMS_CONTROL_PORT_TH_INPUT_HANDLER(NULL) + MCFG_SMS_CONTROL_PORT_MODIFY(CONTROL2_TAG) + MCFG_SMS_CONTROL_PORT_TH_INPUT_HANDLER(NULL) + MCFG_SOUND_ADD("ym2413", YM2413, XTAL_53_693175MHz/15) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) MACHINE_CONFIG_END @@ -765,12 +783,6 @@ static MACHINE_CONFIG_DERIVED( sg1000m3, sms_fm ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_IO_MAP(sg1000m3_io) - // Mark III does not have TH input - MCFG_SMS_CONTROL_PORT_MODIFY(CONTROL1_TAG) - MCFG_SMS_CONTROL_PORT_TH_INPUT_HANDLER(NULL) - MCFG_SMS_CONTROL_PORT_MODIFY(CONTROL2_TAG) - MCFG_SMS_CONTROL_PORT_TH_INPUT_HANDLER(NULL) - MCFG_DEVICE_REMOVE("slot") MCFG_SG1000MK3_CARTRIDGE_ADD("slot", sg1000mk3_cart, NULL) MACHINE_CONFIG_END diff --git a/src/mess/machine/sms.c b/src/mess/machine/sms.c index c61f7c4ee8b..e1df494f450 100644 --- a/src/mess/machine/sms.c +++ b/src/mess/machine/sms.c @@ -86,7 +86,8 @@ void sms_state::sms_get_inputs( address_space &space ) m_port_dd_reg &= ~0x08 | (data2 >> 4); // TR (Button 2) // Sega Mark III does not have TH line connected. - if (!m_is_mark_iii) + // Also, the japanese Master System does not set port $dd with TH input. + if (!m_is_region_japan) { m_port_dd_reg &= ~0x40 | data1; // TH ctrl1 m_port_dd_reg &= ~0x80 | (data2 << 1); // TH ctrl2 @@ -268,12 +269,6 @@ READ8_MEMBER(sms_state::sms_input_port_dd_r) sms_get_inputs(space); - // Reset Button - if ( m_port_reset ) - { - m_port_dd_reg &= ~0x10 | (m_port_reset->read() & 0x01) << 4; - } - // Check if TR of controller port 2 is set to output (0) if (!(m_io_ctrl_reg & 0x04)) { @@ -281,6 +276,24 @@ READ8_MEMBER(sms_state::sms_input_port_dd_r) m_port_dd_reg &= ~0x08 | ((m_io_ctrl_reg & 0x40) >> 3); } + if (m_is_region_japan) + { + // For japanese Master System, set upper 4 bits with TH/TR + // direction bits of IO control register, according to Enri's + // docs (http://www43.tok2.com/home/cmpslv/Sms/EnrSms.htm). + m_port_dd_reg &= ~0x10 | ((m_io_ctrl_reg & 0x01) << 4); + m_port_dd_reg &= ~0x20 | ((m_io_ctrl_reg & 0x04) << 3); + m_port_dd_reg &= ~0x40 | ((m_io_ctrl_reg & 0x02) << 5); + m_port_dd_reg &= ~0x80 | ((m_io_ctrl_reg & 0x08) << 4); + return m_port_dd_reg; + } + + // Reset Button + if ( m_port_reset ) + { + m_port_dd_reg &= ~0x10 | (m_port_reset->read() & 0x01) << 4; + } + // Check if TH of controller port 1 is set to output (0) if (!(m_io_ctrl_reg & 0x02)) { @@ -334,8 +347,8 @@ WRITE8_MEMBER(sms_state::sms_ym2413_data_port_w) READ8_MEMBER(sms_state::gg_input_port_2_r) { - //logerror("joy 2 read, val: %02x, pc: %04x\n", ((m_is_region_japan ? 0x00 : 0x40) | (m_port_start->read() & 0x80)), activecpu_get_pc()); - return ((m_is_region_japan ? 0x00 : 0x40) | (m_port_start->read() & 0x80)); + //logerror("joy 2 read, val: %02x, pc: %04x\n", (m_is_region_japan ? 0x00 : 0x40) | (m_port_start->read() & 0x80), activecpu_get_pc()); + return (m_is_region_japan ? 0x00 : 0x40) | (m_port_start->read() & 0x80); }