diff options
-rw-r--r-- | src/emu/bus/sega8/sega8_slot.c | 4 | ||||
-rw-r--r-- | src/mess/drivers/sms.c | 44 | ||||
-rw-r--r-- | src/mess/includes/sms.h | 1 | ||||
-rw-r--r-- | src/mess/machine/sms.c | 28 |
4 files changed, 45 insertions, 32 deletions
diff --git a/src/emu/bus/sega8/sega8_slot.c b/src/emu/bus/sega8/sega8_slot.c index 997b622aa14..0aa73d2c6c2 100644 --- a/src/emu/bus/sega8/sega8_slot.c +++ b/src/emu/bus/sega8/sega8_slot.c @@ -56,7 +56,7 @@ device_sega8_cart_interface::device_sega8_cart_interface(const machine_config &m m_rom_page_count(0), has_battery(FALSE), m_late_battery_enable(FALSE), - m_lphaser_xoffs(0), + m_lphaser_xoffs(-1), m_sms_mode(0) { } @@ -247,7 +247,7 @@ void sega8_cart_slot_device::set_lphaser_xoffset( UINT8 *rom, int size ) { 0x54, 0x4d, 0x52, 0x20, 0x53, 0x45, 0x47, 0x41, 0x41, 0x4c, 0x15, 0x4a, 0x01, 0x80, 0x00, 0x4f } }; - int xoff = 36; + int xoff = -1; if (size >= 0x8000) { diff --git a/src/mess/drivers/sms.c b/src/mess/drivers/sms.c index b9970348435..bd7c6f37c8d 100644 --- a/src/mess/drivers/sms.c +++ b/src/mess/drivers/sms.c @@ -18,6 +18,7 @@ - Support for other DE-9 compatible controllers, like the Mega Drive 6-Button that has homebrew software support - Rapid button of Japanese Master System + - Verify if disabling of the SN76489 PSG chip is possible on sms1krfm console - Keyboard support for Sega Mark III (sg1000m3 driver) - Link between two Mark III's through keyboard, supported by F-16 Fighting Falcon - Mark III expansion slot, used by keyboard and FM module @@ -52,7 +53,7 @@ General compatibility issues on real hardware (not emulation bugs): - Some ROMs have issues or don't work when running on a console of different region; -- Many Japanese/Korean or homebrew ROMs don't have the signature required by +- Many Japanese, Korean and homebrew ROMs don't have the signature required by BIOSes of consoles sold overseas; - Paddle games need to detect the system region as Japanese to work with the Paddle controller; @@ -229,10 +230,10 @@ SMS Store Unit memory map for the second CPU: 8000 - System Control Register (R/W) Reading: bit7 - ready (0 = ready, 1 = not ready) - bit6 - active timer bit switch (0 = selection 2, 1 = selection 1) + bit6 - active timer bit switch (0 = timer 2, 1 = timer 1) bit5 - unknown - bit4-bit3 - timer selection 2 bit switches (10s-25s) - bit2-bit0 - timer selection 1 bit switches (30s-135s) + bit4-bit3 - timer 2 length bit switches (10s-25s) + bit2-bit0 - timer 1 length bit switches (30s-135s) Writing: bit7-bit4 - led of selected game to set bit3 - unknown, 1 seems to be written all the time @@ -322,7 +323,8 @@ ADDRESS_MAP_END // It seems the Korean versions do some more strict decoding on the I/O // addresses. // At least the mirrors for I/O ports $3E/$3F don't seem to exist there. -// Enri's doc about the Japanese SMS also doesn't mention them. +// Enri's doc ( http://www43.tok2.com/home/cmpslv/Sms/EnrSms.htm ) about +// the Japanese SMS also doesn't mention them. // Leaving the mirrors breaks the Korean cartridge bublboky. static ADDRESS_MAP_START( smsj_io, AS_IO, 8, sms_state ) AM_IMPORT_FROM(sg1000m3_io) @@ -331,13 +333,13 @@ static ADDRESS_MAP_START( smsj_io, AS_IO, 8, sms_state ) ADDRESS_MAP_END -// The first Korean SMS version also seems to lack I/O port $3F. -// Games detect the first version as Japanese region (opposite to the second -// version). The region detection tests the behavior of the TH bits of port -// $DD. Port $3F sets the mode used by those bits. If the first version would -// use the same mode used by Japanese SMS, it would't support the Light Phaser, -// as it does. If it would use the standard mode of other SMS versions, the -// system would be detected as Export region. +// The first Korean SMS version also seems to lack I/O port $3F. Games execute +// a region detection procedure that, through that port, sets the mode used by +// the TH bits of port $DD and tests their behavior. The region of the first SMS +// version is detected as Japanese (opposite to the second version). However, +// as it supports Light Phaser games, it doesn't have the same behavior of the +// Japanese SMS. If it had the behavior of other SMS versions, the system +// region would be detected as Export, so it probably lacks the port. static ADDRESS_MAP_START( sms1kr_io, AS_IO, 8, sms_state ) AM_IMPORT_FROM(sg1000m3_io) AM_RANGE(0x3e, 0x3e) AM_WRITE(sms_mem_control_w) @@ -748,19 +750,17 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( smsj, sms1_krfm ) 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) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( sg1000m3, smsj ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_IO_MAP(sg1000m3_io) + + // Mark III does not have TH connected. + 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) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( sms2_kr, sms2_ntsc ) @@ -812,7 +812,7 @@ static MACHINE_CONFIG_START( gamegear, sms_state ) MCFG_SOFTWARE_LIST_ADD("cart_list", "gamegear") MCFG_GG_EXT_PORT_ADD("ext", gg_ext_port_devices, NULL) - MCFG_GG_EXT_PORT_TH_INPUT_HANDLER(WRITELINE(sms_state, sms_ctrl2_th_input)) // not verified + MCFG_GG_EXT_PORT_TH_INPUT_HANDLER(WRITELINE(sms_state, gg_ext_th_input)) //MCFG_GG_EXT_PORT_PIXEL_HANDLER(READ32(sms_state, sms_pixel_color)) // only for GG-TV mod MACHINE_CONFIG_END @@ -1012,5 +1012,5 @@ CONS( 1989, sms1krfm, sms, 0, sms1_krfm, smsj, sms_state, CONS( 19??, sms1kr, sms, 0, sms1_kr, smsj, sms_state, sms1kr, "Samsung", "Gam*Boy I (Korea)", GAME_SUPPORTS_SAVE ) CONS( 1991, smskr, sms, 0, sms2_kr, sms, sms_state, smskr, "Samsung", "Gam*Boy II (Korea)", GAME_SUPPORTS_SAVE ) -CONS( 1990, gamegear, 0, sms, gamegear, gg, sms_state, gamegear, "Sega", "Game Gear (Europe/America)", GAME_SUPPORTS_SAVE ) +CONS( 1991, gamegear, 0, sms, gamegear, gg, sms_state, gamegear, "Sega", "Game Gear (Europe/America)", GAME_SUPPORTS_SAVE ) CONS( 1990, gamegeaj, gamegear, 0, gamegear, gg, sms_state, gamegeaj, "Sega", "Game Gear (Japan)", GAME_SUPPORTS_SAVE ) diff --git a/src/mess/includes/sms.h b/src/mess/includes/sms.h index e6ffac8173f..4f2efcdbbd3 100644 --- a/src/mess/includes/sms.h +++ b/src/mess/includes/sms.h @@ -184,6 +184,7 @@ public: DECLARE_WRITE_LINE_MEMBER(sms_pause_callback); DECLARE_WRITE_LINE_MEMBER(sms_ctrl1_th_input); DECLARE_WRITE_LINE_MEMBER(sms_ctrl2_th_input); + DECLARE_WRITE_LINE_MEMBER(gg_ext_th_input); DECLARE_READ32_MEMBER(sms_pixel_color); DECLARE_DRIVER_INIT(sg1000m3); diff --git a/src/mess/machine/sms.c b/src/mess/machine/sms.c index de9d8983145..89e478c9ba2 100644 --- a/src/mess/machine/sms.c +++ b/src/mess/machine/sms.c @@ -48,9 +48,6 @@ WRITE_LINE_MEMBER(sms_state::sms_ctrl1_th_input) WRITE_LINE_MEMBER(sms_state::sms_ctrl2_th_input) { - if (m_is_gamegear && !(m_cartslot->exists() && m_cartslot->m_cart->get_sms_mode())) - return; - // Check if TH of controller port 2 is set to input (1) if (m_io_ctrl_reg & 0x08) { @@ -69,6 +66,16 @@ WRITE_LINE_MEMBER(sms_state::sms_ctrl2_th_input) } +WRITE_LINE_MEMBER(sms_state::gg_ext_th_input) +{ + if (!(m_cartslot->exists() && m_cartslot->m_cart->get_sms_mode())) + return; + + // The EXT port act as the controller port 2 on SMS compatibility mode. + sms_ctrl2_th_input(state); +} + + void sms_state::sms_get_inputs() { bool port_dd_has_th_input = true; @@ -182,7 +189,7 @@ WRITE8_MEMBER(sms_state::sms_io_control_w) if (!m_is_gamegear) m_port_ctrl2->port_w(ctrl2_port_data); else - m_port_gg_ext->port_w(ctrl2_port_data); // not verified + m_port_gg_ext->port_w(ctrl2_port_data); } // check if TH is set to input (1). if (data & 0x08) @@ -190,7 +197,7 @@ WRITE8_MEMBER(sms_state::sms_io_control_w) if (!m_is_gamegear) ctrl2_port_data &= ~0x40 | m_port_ctrl2->port_r(); else - ctrl2_port_data &= ~0x40 | m_port_gg_ext->port_r(); // not verified + ctrl2_port_data &= ~0x40 | m_port_gg_ext->port_r(); // check if TH input level is high (1) and was output/low (0) if ((ctrl2_port_data & 0x40) && !(m_io_ctrl_reg & 0x88)) @@ -325,7 +332,7 @@ READ8_MEMBER(sms_state::sms_input_port_dd_r) { // 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). + // docs ( http://www43.tok2.com/home/cmpslv/Sms/EnrSms.htm ). // This makes the console incapable of using the Light Phaser. // Assume the same for a Japanese Game Gear. m_port_dd_reg &= ~0x10 | ((m_io_ctrl_reg & 0x01) << 4); @@ -390,7 +397,9 @@ WRITE8_MEMBER(sms_state::sms_audio_control_w) READ8_MEMBER(sms_state::sms_audio_control_r) { if (m_has_fm) - return m_audio_control & 0x01; // just one bit even for smsj. + // The register reference on SMSPower states that just the + // first bit written is returned on reads (even for smsj?). + return m_audio_control & 0x01; else return sms_input_port_dc_r(space, offset); } @@ -825,7 +834,7 @@ void sms_state::setup_media_slots() // Set offset for Light Phaser if (!m_is_mark_iii) { - m_lphaser_x_offs = 36; + m_lphaser_x_offs = -1; // same value returned for ROMs without custom offset. if (m_mem_device_enabled & ENABLE_CART) m_lphaser_x_offs = m_cartslot->m_cart->get_lphaser_xoffs(); @@ -833,6 +842,9 @@ void sms_state::setup_media_slots() m_lphaser_x_offs = m_cardslot->m_cart->get_lphaser_xoffs(); else if (m_mem_device_enabled & ENABLE_EXPANSION) m_lphaser_x_offs = m_expslot->m_device->get_lphaser_xoffs(); + + if (m_lphaser_x_offs == -1) + m_lphaser_x_offs = 36; } } |