mirror of
https://github.com/holub/mame
synced 2025-07-04 09:28:51 +03:00
- Change SMS/GG master clocks to match service manuals. [Enik]
- Fix TH handling and audio control of the SMSJ, based on Charles' findings. [Enik]
This commit is contained in:
parent
ff7bea6544
commit
30d03575f3
@ -14,10 +14,7 @@ Release data from the Sega Retro project:
|
|||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
|
|
||||||
The Light Phaser gun doesn't work with the Japanese SMS and Sega Mark III.
|
The Light Phaser gun doesn't work with the Sega Mark III.
|
||||||
There are reports about Light Phaser working on the second Korean SMS
|
|
||||||
version, and a Korean advert shows support on the first version (Gam*Boy I,
|
|
||||||
although based on Japanese SMS).
|
|
||||||
|
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
|
@ -20,8 +20,9 @@
|
|||||||
- Sega SK-1100 keyboard support for Sega Mark III (sg1000m3 driver)
|
- Sega SK-1100 keyboard support for Sega Mark III (sg1000m3 driver)
|
||||||
- Link between two Mark III's through keyboard, supported by F-16 Fighting Falcon
|
- Link between two Mark III's through keyboard, supported by F-16 Fighting Falcon
|
||||||
- Mark III expansion slot, used by keyboard and FM Sound Unit
|
- Mark III expansion slot, used by keyboard and FM Sound Unit
|
||||||
- Verify if the SN76489 chip can be disabled on sg1000m3 and sms1krfm consoles
|
|
||||||
- Rapid button of smsj, sms1krfm and sms1kr consoles
|
- Rapid button of smsj, sms1krfm and sms1kr consoles
|
||||||
|
- Accurate GG vertical scaling in SMS mode (h-scaling seems right for subpixel rendering)
|
||||||
|
- SMS drivers for other versions (one has a 10.746168MHz XTAL)
|
||||||
- Software compatibility flags, by region and/or BIOS
|
- Software compatibility flags, by region and/or BIOS
|
||||||
- Samsung modem for Gam*Boy Securities Information Service System
|
- Samsung modem for Gam*Boy Securities Information Service System
|
||||||
- Sega Demo Unit II (kiosk expansion device)
|
- Sega Demo Unit II (kiosk expansion device)
|
||||||
@ -56,14 +57,8 @@ General compatibility issues on real hardware (not emulation bugs):
|
|||||||
region;
|
region;
|
||||||
- Many Japanese, Korean and 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;
|
BIOSes of consoles sold overseas;
|
||||||
- Paddle games need to detect the system region as Japanese to work with the
|
|
||||||
Paddle controller;
|
|
||||||
- Few games of the ones with FM support need to detect the system region as
|
- Few games of the ones with FM support need to detect the system region as
|
||||||
Japanese to play FM sound;
|
Japanese to play FM sound;
|
||||||
- The Light Phaser gun doesn't work with the Japanese SMS and Sega Mark III;
|
|
||||||
- There are reports about Light Phaser working on the second Korean SMS
|
|
||||||
version, and a Korean advert shows support on the first version (Gam*Boy I,
|
|
||||||
although based on Japanese SMS);
|
|
||||||
- The Korean SMS versions have Japanese-format cartridge slot, but only on the
|
- The Korean SMS versions have Japanese-format cartridge slot, but only on the
|
||||||
first (Gam*Boy I) the region is detected as Japanese;
|
first (Gam*Boy I) the region is detected as Japanese;
|
||||||
- Some SMS ROMs don't run when are plugged-in to SMS expansion slot, through
|
- Some SMS ROMs don't run when are plugged-in to SMS expansion slot, through
|
||||||
@ -262,6 +257,7 @@ DC00 - Selection buttons #2, 9-16 (R)
|
|||||||
#include "sms1.lh"
|
#include "sms1.lh"
|
||||||
|
|
||||||
#define MASTER_CLOCK_PAL 53203425 /* 12 * subcarrier freq. (4.43361875MHz) */
|
#define MASTER_CLOCK_PAL 53203425 /* 12 * subcarrier freq. (4.43361875MHz) */
|
||||||
|
#define MASTER_CLOCK_GG 32215905
|
||||||
|
|
||||||
|
|
||||||
static ADDRESS_MAP_START( sms1_mem, AS_PROGRAM, 8, sms_state )
|
static ADDRESS_MAP_START( sms1_mem, AS_PROGRAM, 8, sms_state )
|
||||||
@ -322,11 +318,8 @@ static ADDRESS_MAP_START( sms_io, AS_IO, 8, sms_state )
|
|||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
|
|
||||||
// It seems the Korean versions do some more strict decoding on the I/O
|
// Mirrors for I/O ports $3E/$3F don't exist on the Japanese SMS.
|
||||||
// addresses.
|
// It seems the Korean versions do the same decoding on those I/O addresses.
|
||||||
// At least the mirrors for I/O ports $3E/$3F don't seem to exist there.
|
|
||||||
// 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.
|
// Leaving the mirrors breaks the Korean cartridge bublboky.
|
||||||
static ADDRESS_MAP_START( smsj_io, AS_IO, 8, sms_state )
|
static ADDRESS_MAP_START( smsj_io, AS_IO, 8, sms_state )
|
||||||
AM_IMPORT_FROM(sg1000m3_io)
|
AM_IMPORT_FROM(sg1000m3_io)
|
||||||
@ -335,19 +328,6 @@ static ADDRESS_MAP_START( smsj_io, AS_IO, 8, sms_state )
|
|||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
|
|
||||||
// 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 behaviour. 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 behaviour of the
|
|
||||||
// Japanese SMS. If it had the behaviour 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)
|
|
||||||
ADDRESS_MAP_END
|
|
||||||
|
|
||||||
|
|
||||||
// It seems the mirrors for I/O ports $3E/$3F also don't seem to exist on the
|
// It seems the mirrors for I/O ports $3E/$3F also don't seem to exist on the
|
||||||
// Game Gear. Leaving the mirrors breaks 'gloc' (it freezes after 1st stage).
|
// Game Gear. Leaving the mirrors breaks 'gloc' (it freezes after 1st stage).
|
||||||
static ADDRESS_MAP_START( gg_io, AS_IO, 8, sms_state )
|
static ADDRESS_MAP_START( gg_io, AS_IO, 8, sms_state )
|
||||||
@ -488,7 +468,7 @@ WRITE_LINE_MEMBER(sms_state::sms_int_callback)
|
|||||||
|
|
||||||
static MACHINE_CONFIG_START( sms_ntsc_base, sms_state )
|
static MACHINE_CONFIG_START( sms_ntsc_base, sms_state )
|
||||||
/* basic machine hardware */
|
/* basic machine hardware */
|
||||||
MCFG_CPU_ADD("maincpu", Z80, XTAL_53_693175MHz/15)
|
MCFG_CPU_ADD("maincpu", Z80, XTAL_10_738635MHz/3)
|
||||||
MCFG_CPU_PROGRAM_MAP(sms_mem)
|
MCFG_CPU_PROGRAM_MAP(sms_mem)
|
||||||
MCFG_CPU_IO_MAP(sms_io)
|
MCFG_CPU_IO_MAP(sms_io)
|
||||||
|
|
||||||
@ -500,7 +480,7 @@ static MACHINE_CONFIG_START( sms_ntsc_base, sms_state )
|
|||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||||
|
|
||||||
MCFG_SOUND_ADD("segapsg", SEGAPSG, XTAL_53_693175MHz/15)
|
MCFG_SOUND_ADD("segapsg", SEGAPSG, XTAL_10_738635MHz/3)
|
||||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
|
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
|
||||||
|
|
||||||
MCFG_SMS_CARTRIDGE_ADD("slot", sms_cart, nullptr)
|
MCFG_SMS_CARTRIDGE_ADD("slot", sms_cart, nullptr)
|
||||||
@ -536,10 +516,10 @@ MACHINE_CONFIG_END
|
|||||||
static MACHINE_CONFIG_DERIVED( sms2_ntsc, sms_ntsc_base )
|
static MACHINE_CONFIG_DERIVED( sms2_ntsc, sms_ntsc_base )
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
MCFG_SCREEN_ADD("screen", RASTER)
|
MCFG_SCREEN_ADD("screen", RASTER)
|
||||||
MCFG_SCREEN_RAW_PARAMS(XTAL_53_693175MHz/10, \
|
MCFG_SCREEN_RAW_PARAMS(XTAL_10_738635MHz/2, \
|
||||||
SEGA315_5124_WIDTH , SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH - 2, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256 + 10, \
|
SEGA315_5124_WIDTH , SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH - 2, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256 + 10, \
|
||||||
SEGA315_5124_HEIGHT_NTSC, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT + 224)
|
SEGA315_5124_HEIGHT_NTSC, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT + 224)
|
||||||
MCFG_SCREEN_REFRESH_RATE((double) XTAL_53_693175MHz/10 / (SEGA315_5124_WIDTH * SEGA315_5124_HEIGHT_NTSC))
|
MCFG_SCREEN_REFRESH_RATE((double) XTAL_10_738635MHz/2 / (SEGA315_5124_WIDTH * SEGA315_5124_HEIGHT_NTSC))
|
||||||
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms)
|
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms)
|
||||||
|
|
||||||
MCFG_DEVICE_ADD("sms_vdp", SEGA315_5246, 0)
|
MCFG_DEVICE_ADD("sms_vdp", SEGA315_5246, 0)
|
||||||
@ -558,24 +538,24 @@ static MACHINE_CONFIG_DERIVED( sms1_ntsc, sms_ntsc_base )
|
|||||||
|
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
MCFG_SCREEN_ADD("screen", RASTER)
|
MCFG_SCREEN_ADD("screen", RASTER)
|
||||||
MCFG_SCREEN_RAW_PARAMS(XTAL_53_693175MHz/10, \
|
MCFG_SCREEN_RAW_PARAMS(XTAL_10_738635MHz/2, \
|
||||||
SEGA315_5124_WIDTH, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH - 2, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256 + 10, \
|
SEGA315_5124_WIDTH, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH - 2, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256 + 10, \
|
||||||
SEGA315_5124_HEIGHT_NTSC, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT + 224)
|
SEGA315_5124_HEIGHT_NTSC, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT + 224)
|
||||||
MCFG_SCREEN_REFRESH_RATE((double) XTAL_53_693175MHz/10 / (SEGA315_5124_WIDTH * SEGA315_5124_HEIGHT_NTSC))
|
MCFG_SCREEN_REFRESH_RATE((double) XTAL_10_738635MHz/2 / (SEGA315_5124_WIDTH * SEGA315_5124_HEIGHT_NTSC))
|
||||||
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms1)
|
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms1)
|
||||||
|
|
||||||
MCFG_SCREEN_ADD("left_lcd", LCD) // This is needed for SegaScope Left LCD
|
MCFG_SCREEN_ADD("left_lcd", LCD) // This is needed for SegaScope Left LCD
|
||||||
MCFG_SCREEN_RAW_PARAMS(XTAL_53_693175MHz/10, \
|
MCFG_SCREEN_RAW_PARAMS(XTAL_10_738635MHz/2, \
|
||||||
SEGA315_5124_WIDTH, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH - 2, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256 + 10, \
|
SEGA315_5124_WIDTH, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH - 2, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256 + 10, \
|
||||||
SEGA315_5124_HEIGHT_NTSC, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT + 224)
|
SEGA315_5124_HEIGHT_NTSC, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT + 224)
|
||||||
MCFG_SCREEN_REFRESH_RATE((double) XTAL_53_693175MHz/10 / (SEGA315_5124_WIDTH * SEGA315_5124_HEIGHT_NTSC))
|
MCFG_SCREEN_REFRESH_RATE((double) XTAL_10_738635MHz/2 / (SEGA315_5124_WIDTH * SEGA315_5124_HEIGHT_NTSC))
|
||||||
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms1)
|
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms1)
|
||||||
|
|
||||||
MCFG_SCREEN_ADD("right_lcd", LCD) // This is needed for SegaScope Right LCD
|
MCFG_SCREEN_ADD("right_lcd", LCD) // This is needed for SegaScope Right LCD
|
||||||
MCFG_SCREEN_RAW_PARAMS(XTAL_53_693175MHz/10, \
|
MCFG_SCREEN_RAW_PARAMS(XTAL_10_738635MHz/2, \
|
||||||
SEGA315_5124_WIDTH, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH - 2, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256 + 10, \
|
SEGA315_5124_WIDTH, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH - 2, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256 + 10, \
|
||||||
SEGA315_5124_HEIGHT_NTSC, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT + 224)
|
SEGA315_5124_HEIGHT_NTSC, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT + 224)
|
||||||
MCFG_SCREEN_REFRESH_RATE((double) XTAL_53_693175MHz/10 / (SEGA315_5124_WIDTH * SEGA315_5124_HEIGHT_NTSC))
|
MCFG_SCREEN_REFRESH_RATE((double) XTAL_10_738635MHz/2 / (SEGA315_5124_WIDTH * SEGA315_5124_HEIGHT_NTSC))
|
||||||
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms1)
|
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms1)
|
||||||
|
|
||||||
MCFG_SCREEN_VBLANK_DRIVER(sms_state, screen_vblank_sms1)
|
MCFG_SCREEN_VBLANK_DRIVER(sms_state, screen_vblank_sms1)
|
||||||
@ -601,7 +581,7 @@ static MACHINE_CONFIG_DERIVED_CLASS( sms_sdisp, sms1_ntsc, smssdisp_state )
|
|||||||
MCFG_DEVICE_MODIFY("sms_vdp")
|
MCFG_DEVICE_MODIFY("sms_vdp")
|
||||||
MCFG_SEGA315_5124_INT_CB(WRITELINE(smssdisp_state, sms_store_int_callback))
|
MCFG_SEGA315_5124_INT_CB(WRITELINE(smssdisp_state, sms_store_int_callback))
|
||||||
|
|
||||||
MCFG_CPU_ADD("control", Z80, XTAL_53_693175MHz/15)
|
MCFG_CPU_ADD("control", Z80, XTAL_10_738635MHz/3)
|
||||||
MCFG_CPU_PROGRAM_MAP(sms_store_mem)
|
MCFG_CPU_PROGRAM_MAP(sms_store_mem)
|
||||||
/* Both CPUs seem to communicate with the VDP etc? */
|
/* Both CPUs seem to communicate with the VDP etc? */
|
||||||
MCFG_CPU_IO_MAP(sms_io)
|
MCFG_CPU_IO_MAP(sms_io)
|
||||||
@ -738,22 +718,17 @@ MACHINE_CONFIG_END
|
|||||||
|
|
||||||
static MACHINE_CONFIG_DERIVED( sms1_kr, sms1_ntsc )
|
static MACHINE_CONFIG_DERIVED( sms1_kr, sms1_ntsc )
|
||||||
MCFG_CPU_MODIFY("maincpu")
|
MCFG_CPU_MODIFY("maincpu")
|
||||||
MCFG_CPU_IO_MAP(sms1kr_io)
|
MCFG_CPU_IO_MAP(smsj_io)
|
||||||
|
|
||||||
MCFG_DEVICE_REMOVE("slot")
|
MCFG_DEVICE_REMOVE("slot")
|
||||||
MCFG_SG1000MK3_CARTRIDGE_ADD("slot", sg1000mk3_cart, nullptr)
|
MCFG_SG1000MK3_CARTRIDGE_ADD("slot", sg1000mk3_cart, nullptr)
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
static MACHINE_CONFIG_DERIVED( sms1_krfm, sms1_kr )
|
static MACHINE_CONFIG_DERIVED( smsj, sms1_kr )
|
||||||
MCFG_SOUND_ADD("ym2413", YM2413, XTAL_53_693175MHz/15)
|
MCFG_SOUND_ADD("ym2413", YM2413, XTAL_10_738635MHz/3)
|
||||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
|
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
static MACHINE_CONFIG_DERIVED( smsj, sms1_krfm )
|
|
||||||
MCFG_CPU_MODIFY("maincpu")
|
|
||||||
MCFG_CPU_IO_MAP(smsj_io)
|
|
||||||
MACHINE_CONFIG_END
|
|
||||||
|
|
||||||
static MACHINE_CONFIG_DERIVED( sg1000m3, smsj )
|
static MACHINE_CONFIG_DERIVED( sg1000m3, smsj )
|
||||||
MCFG_CPU_MODIFY("maincpu")
|
MCFG_CPU_MODIFY("maincpu")
|
||||||
MCFG_CPU_IO_MAP(sg1000m3_io)
|
MCFG_CPU_IO_MAP(sg1000m3_io)
|
||||||
@ -775,7 +750,7 @@ MACHINE_CONFIG_END
|
|||||||
|
|
||||||
static MACHINE_CONFIG_START( gamegear, sms_state )
|
static MACHINE_CONFIG_START( gamegear, sms_state )
|
||||||
/* basic machine hardware */
|
/* basic machine hardware */
|
||||||
MCFG_CPU_ADD("maincpu", Z80, XTAL_53_693175MHz/15)
|
MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK_GG/9)
|
||||||
MCFG_CPU_PROGRAM_MAP(sms_mem)
|
MCFG_CPU_PROGRAM_MAP(sms_mem)
|
||||||
MCFG_CPU_IO_MAP(gg_io)
|
MCFG_CPU_IO_MAP(gg_io)
|
||||||
|
|
||||||
@ -786,10 +761,10 @@ static MACHINE_CONFIG_START( gamegear, sms_state )
|
|||||||
|
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
MCFG_SCREEN_ADD("screen", LCD)
|
MCFG_SCREEN_ADD("screen", LCD)
|
||||||
MCFG_SCREEN_RAW_PARAMS(XTAL_53_693175MHz/10, \
|
MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK_GG/6, \
|
||||||
SEGA315_5124_WIDTH, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 6*8, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 26*8, \
|
SEGA315_5124_WIDTH, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 6*8, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 26*8, \
|
||||||
SEGA315_5124_HEIGHT_NTSC, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_192_TBORDER_HEIGHT + 3*8, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_192_TBORDER_HEIGHT + 21*8 )
|
SEGA315_5124_HEIGHT_NTSC, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_192_TBORDER_HEIGHT + 3*8, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_192_TBORDER_HEIGHT + 21*8 )
|
||||||
MCFG_SCREEN_REFRESH_RATE((double) XTAL_53_693175MHz/10 / (SEGA315_5124_WIDTH * SEGA315_5124_HEIGHT_NTSC))
|
MCFG_SCREEN_REFRESH_RATE((double) MASTER_CLOCK_GG/6 / (SEGA315_5124_WIDTH * SEGA315_5124_HEIGHT_NTSC))
|
||||||
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_gamegear)
|
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_gamegear)
|
||||||
|
|
||||||
MCFG_VIDEO_START_OVERRIDE(sms_state,gamegear)
|
MCFG_VIDEO_START_OVERRIDE(sms_state,gamegear)
|
||||||
@ -804,7 +779,7 @@ static MACHINE_CONFIG_START( gamegear, sms_state )
|
|||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker","rspeaker")
|
MCFG_SPEAKER_STANDARD_STEREO("lspeaker","rspeaker")
|
||||||
|
|
||||||
MCFG_SOUND_ADD("gamegear", GAMEGEAR, XTAL_53_693175MHz/15)
|
MCFG_SOUND_ADD("gamegear", GAMEGEAR, MASTER_CLOCK_GG/9)
|
||||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.00)
|
MCFG_SOUND_ROUTE(0, "lspeaker", 1.00)
|
||||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.00)
|
MCFG_SOUND_ROUTE(1, "rspeaker", 1.00)
|
||||||
|
|
||||||
@ -815,7 +790,8 @@ static MACHINE_CONFIG_START( gamegear, sms_state )
|
|||||||
|
|
||||||
MCFG_GG_EXT_PORT_ADD("ext", gg_ext_port_devices, nullptr)
|
MCFG_GG_EXT_PORT_ADD("ext", gg_ext_port_devices, nullptr)
|
||||||
MCFG_GG_EXT_PORT_TH_INPUT_HANDLER(WRITELINE(sms_state, gg_ext_th_input))
|
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
|
// only for GG-TV mod (may be simulated with a driver modified with SMS screen settings)
|
||||||
|
//MCFG_GG_EXT_PORT_PIXEL_HANDLER(READ32(sms_state, sms_pixel_color))
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
|
|
||||||
@ -1003,14 +979,14 @@ ROM_END
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
|
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
|
||||||
CONS( 1985, sg1000m3, sms, 0, sg1000m3, sg1000m3, sms_state, sg1000m3, "Sega", "SG-1000 Mark III", MACHINE_SUPPORTS_SAVE )
|
CONS( 1985, sg1000m3, sms, 0, sg1000m3, sg1000m3, sms_state, sg1000m3, "Sega", "Mark III", MACHINE_SUPPORTS_SAVE )
|
||||||
CONS( 1986, sms1, sms, 0, sms1_ntsc, sms1, sms_state, sms1, "Sega", "Master System I", MACHINE_SUPPORTS_SAVE )
|
CONS( 1986, sms1, sms, 0, sms1_ntsc, sms1, sms_state, sms1, "Sega", "Master System I", MACHINE_SUPPORTS_SAVE )
|
||||||
CONS( 1986, sms1pal, sms, 0, sms1_pal, sms1, sms_state, sms1, "Sega", "Master System I (PAL)" , MACHINE_SUPPORTS_SAVE )
|
CONS( 1986, sms1pal, sms, 0, sms1_pal, sms1, sms_state, sms1, "Sega", "Master System I (PAL)" , MACHINE_SUPPORTS_SAVE )
|
||||||
CONS( 1986, smssdisp, sms, 0, sms_sdisp, smssdisp, smssdisp_state, smssdisp, "Sega", "Master System Store Display Unit", MACHINE_SUPPORTS_SAVE )
|
CONS( 1986, smssdisp, sms, 0, sms_sdisp, smssdisp, smssdisp_state, smssdisp, "Sega", "Master System Store Display Unit", MACHINE_SUPPORTS_SAVE )
|
||||||
CONS( 1987, smsj, sms, 0, smsj, smsj, sms_state, smsj, "Sega", "Master System (Japan)", MACHINE_SUPPORTS_SAVE )
|
CONS( 1987, smsj, sms, 0, smsj, smsj, sms_state, smsj, "Sega", "Master System (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||||
CONS( 1990, sms, 0, 0, sms2_ntsc, sms, sms_state, sms1, "Sega", "Master System II", MACHINE_SUPPORTS_SAVE )
|
CONS( 1990, sms, 0, 0, sms2_ntsc, sms, sms_state, sms1, "Sega", "Master System II", MACHINE_SUPPORTS_SAVE )
|
||||||
CONS( 1990, smspal, sms, 0, sms2_pal, sms, sms_state, sms1, "Sega", "Master System II (PAL)", MACHINE_SUPPORTS_SAVE )
|
CONS( 1990, smspal, sms, 0, sms2_pal, sms, sms_state, sms1, "Sega", "Master System II (PAL)", MACHINE_SUPPORTS_SAVE )
|
||||||
CONS( 1989, sms1krfm, sms, 0, sms1_krfm, smsj, sms_state, sms1krfm, "Samsung", "Gam*Boy I - FM (Korea)", MACHINE_SUPPORTS_SAVE )
|
CONS( 1989, sms1krfm, sms, 0, smsj, smsj, sms_state, smsj, "Samsung", "Gam*Boy I (Korea) (FM)", MACHINE_SUPPORTS_SAVE )
|
||||||
CONS( 19??, sms1kr, sms, 0, sms1_kr, smsj, sms_state, sms1kr, "Samsung", "Gam*Boy I (Korea)", MACHINE_SUPPORTS_SAVE )
|
CONS( 19??, sms1kr, sms, 0, sms1_kr, smsj, sms_state, sms1kr, "Samsung", "Gam*Boy I (Korea)", MACHINE_SUPPORTS_SAVE )
|
||||||
CONS( 1991, smskr, sms, 0, sms2_kr, sms, sms_state, smskr, "Samsung", "Gam*Boy II (Korea)", MACHINE_SUPPORTS_SAVE )
|
CONS( 1991, smskr, sms, 0, sms2_kr, sms, sms_state, smskr, "Samsung", "Gam*Boy II (Korea)", MACHINE_SUPPORTS_SAVE )
|
||||||
|
|
||||||
|
@ -167,7 +167,7 @@ ADDRESS_MAP_END
|
|||||||
|
|
||||||
static MACHINE_CONFIG_START( sms_supergame, smsbootleg_state )
|
static MACHINE_CONFIG_START( sms_supergame, smsbootleg_state )
|
||||||
/* basic machine hardware */
|
/* basic machine hardware */
|
||||||
MCFG_CPU_ADD("maincpu", Z80, XTAL_53_693175MHz/15) // check - I can only see a 10.738635 on this PCB
|
MCFG_CPU_ADD("maincpu", Z80, XTAL_10_738635MHz/3)
|
||||||
MCFG_CPU_PROGRAM_MAP(sms_supergame_map)
|
MCFG_CPU_PROGRAM_MAP(sms_supergame_map)
|
||||||
MCFG_CPU_IO_MAP(sms_supergame_io)
|
MCFG_CPU_IO_MAP(sms_supergame_io)
|
||||||
|
|
||||||
@ -179,14 +179,14 @@ static MACHINE_CONFIG_START( sms_supergame, smsbootleg_state )
|
|||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||||
|
|
||||||
MCFG_SOUND_ADD("segapsg", SEGAPSG, XTAL_53_693175MHz/15)
|
MCFG_SOUND_ADD("segapsg", SEGAPSG, XTAL_10_738635MHz/3)
|
||||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
|
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
|
||||||
|
|
||||||
MCFG_SCREEN_ADD("screen", RASTER)
|
MCFG_SCREEN_ADD("screen", RASTER)
|
||||||
MCFG_SCREEN_RAW_PARAMS(XTAL_53_693175MHz/10, \
|
MCFG_SCREEN_RAW_PARAMS(XTAL_10_738635MHz/2, \
|
||||||
SEGA315_5124_WIDTH , SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH - 2, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256 + 10, \
|
SEGA315_5124_WIDTH , SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH - 2, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256 + 10, \
|
||||||
SEGA315_5124_HEIGHT_NTSC, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT + 224)
|
SEGA315_5124_HEIGHT_NTSC, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT + 224)
|
||||||
MCFG_SCREEN_REFRESH_RATE((double) XTAL_53_693175MHz/10 / (SEGA315_5124_WIDTH * SEGA315_5124_HEIGHT_NTSC))
|
MCFG_SCREEN_REFRESH_RATE((double) XTAL_10_738635MHz/2 / (SEGA315_5124_WIDTH * SEGA315_5124_HEIGHT_NTSC))
|
||||||
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms)
|
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms)
|
||||||
|
|
||||||
MCFG_DEVICE_ADD("sms_vdp", SEGA315_5246, 0)
|
MCFG_DEVICE_ADD("sms_vdp", SEGA315_5246, 0)
|
||||||
|
@ -78,8 +78,6 @@ WRITE_LINE_MEMBER(sms_state::gg_ext_th_input)
|
|||||||
|
|
||||||
void sms_state::sms_get_inputs()
|
void sms_state::sms_get_inputs()
|
||||||
{
|
{
|
||||||
bool port_dd_has_th_input = true;
|
|
||||||
|
|
||||||
UINT8 data1 = 0xff;
|
UINT8 data1 = 0xff;
|
||||||
UINT8 data2 = 0xff;
|
UINT8 data2 = 0xff;
|
||||||
|
|
||||||
@ -92,11 +90,6 @@ void sms_state::sms_get_inputs()
|
|||||||
|
|
||||||
if (m_is_gamegear)
|
if (m_is_gamegear)
|
||||||
{
|
{
|
||||||
// Assume the Japanese Game Gear behaves as the
|
|
||||||
// Japanese Master System, regarding TH input.
|
|
||||||
if (m_is_gg_region_japan)
|
|
||||||
port_dd_has_th_input = false;
|
|
||||||
|
|
||||||
// For Game Gear, this function is used only if SMS mode is
|
// For Game Gear, this function is used only if SMS mode is
|
||||||
// enabled, else only register $dc receives input data, through
|
// enabled, else only register $dc receives input data, through
|
||||||
// direct read of the m_port_gg_dc I/O port.
|
// direct read of the m_port_gg_dc I/O port.
|
||||||
@ -108,11 +101,6 @@ void sms_state::sms_get_inputs()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Sega Mark III does not have TH lines connected.
|
|
||||||
// The Japanese Master System does not set port $dd with TH input.
|
|
||||||
if (m_is_mark_iii || m_is_smsj)
|
|
||||||
port_dd_has_th_input = false;
|
|
||||||
|
|
||||||
data1 = m_port_ctrl1->port_r();
|
data1 = m_port_ctrl1->port_r();
|
||||||
m_port_dc_reg &= ~0x0f | data1; // Up, Down, Left, Right
|
m_port_dc_reg &= ~0x0f | data1; // Up, Down, Left, Right
|
||||||
m_port_dc_reg &= ~0x10 | (data1 >> 1); // TL (Button 1)
|
m_port_dc_reg &= ~0x10 | (data1 >> 1); // TL (Button 1)
|
||||||
@ -126,7 +114,7 @@ void sms_state::sms_get_inputs()
|
|||||||
m_port_dd_reg &= ~0x04 | (data2 >> 3); // TL (Button 1)
|
m_port_dd_reg &= ~0x04 | (data2 >> 3); // TL (Button 1)
|
||||||
m_port_dd_reg &= ~0x08 | (data2 >> 4); // TR (Button 2)
|
m_port_dd_reg &= ~0x08 | (data2 >> 4); // TR (Button 2)
|
||||||
|
|
||||||
if (port_dd_has_th_input)
|
if (!m_is_mark_iii)
|
||||||
{
|
{
|
||||||
m_port_dd_reg &= ~0x40 | data1; // TH ctrl1
|
m_port_dd_reg &= ~0x40 | data1; // TH ctrl1
|
||||||
m_port_dd_reg &= ~0x80 | (data2 << 1); // TH ctrl2
|
m_port_dd_reg &= ~0x80 | (data2 << 1); // TH ctrl2
|
||||||
@ -328,20 +316,6 @@ READ8_MEMBER(sms_state::sms_input_port_dd_r)
|
|||||||
m_port_dd_reg &= ~0x08 | ((m_io_ctrl_reg & 0x40) >> 3);
|
m_port_dd_reg &= ~0x08 | ((m_io_ctrl_reg & 0x40) >> 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_is_smsj || (m_is_gamegear && m_is_gg_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 ).
|
|
||||||
// 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);
|
|
||||||
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
|
// Reset Button
|
||||||
if ( m_port_reset )
|
if ( m_port_reset )
|
||||||
{
|
{
|
||||||
@ -351,8 +325,15 @@ READ8_MEMBER(sms_state::sms_input_port_dd_r)
|
|||||||
// Check if TH of controller port 1 is set to output (0)
|
// Check if TH of controller port 1 is set to output (0)
|
||||||
if (!(m_io_ctrl_reg & 0x02))
|
if (!(m_io_ctrl_reg & 0x02))
|
||||||
{
|
{
|
||||||
// Read TH state set through IO control port
|
if (m_is_smsj || (m_is_gamegear && m_is_gg_region_japan))
|
||||||
m_port_dd_reg &= ~0x40 | ((m_io_ctrl_reg & 0x20) << 1);
|
{
|
||||||
|
m_port_dd_reg &= ~0x40;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Read TH state set through IO control port
|
||||||
|
m_port_dd_reg &= ~0x40 | ((m_io_ctrl_reg & 0x20) << 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else // TH set to input (1)
|
else // TH set to input (1)
|
||||||
{
|
{
|
||||||
@ -366,8 +347,15 @@ READ8_MEMBER(sms_state::sms_input_port_dd_r)
|
|||||||
// Check if TH of controller port 2 is set to output (0)
|
// Check if TH of controller port 2 is set to output (0)
|
||||||
if (!(m_io_ctrl_reg & 0x08))
|
if (!(m_io_ctrl_reg & 0x08))
|
||||||
{
|
{
|
||||||
// Read TH state set through IO control port
|
if (m_is_smsj || (m_is_gamegear && m_is_gg_region_japan))
|
||||||
m_port_dd_reg &= ~0x80 | (m_io_ctrl_reg & 0x80);
|
{
|
||||||
|
m_port_dd_reg &= ~0x80;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Read TH state set through IO control port
|
||||||
|
m_port_dd_reg &= ~0x80 | (m_io_ctrl_reg & 0x80);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else // TH set to input (1)
|
else // TH set to input (1)
|
||||||
{
|
{
|
||||||
@ -397,9 +385,12 @@ WRITE8_MEMBER(sms_state::sms_audio_control_w)
|
|||||||
READ8_MEMBER(sms_state::sms_audio_control_r)
|
READ8_MEMBER(sms_state::sms_audio_control_r)
|
||||||
{
|
{
|
||||||
if (m_has_fm)
|
if (m_has_fm)
|
||||||
// The register reference on SMSPower states that just the
|
{
|
||||||
// first bit written is returned on reads (even for smsj?).
|
if (m_is_smsj)
|
||||||
return m_audio_control & 0x01;
|
return m_audio_control & 0x03;
|
||||||
|
else
|
||||||
|
return m_audio_control & 0x01;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
return sms_input_port_dc_r(space, offset);
|
return sms_input_port_dc_r(space, offset);
|
||||||
}
|
}
|
||||||
@ -407,26 +398,34 @@ READ8_MEMBER(sms_state::sms_audio_control_r)
|
|||||||
|
|
||||||
WRITE8_MEMBER(sms_state::sms_ym2413_register_port_w)
|
WRITE8_MEMBER(sms_state::sms_ym2413_register_port_w)
|
||||||
{
|
{
|
||||||
if (m_has_fm && (m_audio_control & 0x01))
|
if (m_has_fm)
|
||||||
m_ym->write(space, 0, data & 0x3f);
|
{
|
||||||
|
if (m_audio_control == 0x01 || m_audio_control == 0x03)
|
||||||
|
m_ym->write(space, 0, data & 0x3f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
WRITE8_MEMBER(sms_state::sms_ym2413_data_port_w)
|
WRITE8_MEMBER(sms_state::sms_ym2413_data_port_w)
|
||||||
{
|
{
|
||||||
if (m_has_fm && (m_audio_control & 0x01))
|
if (m_has_fm)
|
||||||
{
|
{
|
||||||
//logerror("data_port_w %x %x\n", offset, data);
|
if (m_audio_control == 0x01 || m_audio_control == 0x03)
|
||||||
m_ym->write(space, 1, data);
|
{
|
||||||
|
//logerror("data_port_w %x %x\n", offset, data);
|
||||||
|
m_ym->write(space, 1, data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
WRITE8_MEMBER(sms_state::sms_psg_w)
|
WRITE8_MEMBER(sms_state::sms_psg_w)
|
||||||
{
|
{
|
||||||
// On Japanese SMS, if FM is enabled, PSG must be explicitly enabled too.
|
if (m_is_smsj)
|
||||||
if (m_is_smsj && (m_audio_control & 0x01) && !(m_audio_control & 0x02))
|
{
|
||||||
return;
|
if (m_audio_control != 0x00 && m_audio_control != 0x03)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
m_psg_sms->write(space, offset, data, mem_mask);
|
m_psg_sms->write(space, offset, data, mem_mask);
|
||||||
}
|
}
|
||||||
@ -1108,14 +1107,6 @@ DRIVER_INIT_MEMBER(sms_state,smsj)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DRIVER_INIT_MEMBER(sms_state,sms1krfm)
|
|
||||||
{
|
|
||||||
m_has_bios_2000 = 1;
|
|
||||||
m_has_fm = 1;
|
|
||||||
m_has_jpn_sms_cart_slot = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
DRIVER_INIT_MEMBER(sms_state,sms1kr)
|
DRIVER_INIT_MEMBER(sms_state,sms1kr)
|
||||||
{
|
{
|
||||||
m_has_bios_2000 = 1;
|
m_has_bios_2000 = 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user