diff --git a/README.md b/README.md index 4ba9718..ce7ce7d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ About --------- -Genesis Plus GX is an open-source & portable Sega Mega Drive / Genesis emulator, now also emulating SG-1000, Master System, Game Gear and Sega/Mega CD hardware. +Genesis Plus GX is an open-source emulator focused on accuracy and portability, now emulating SG-1000, Master System, Game Gear, Mega Drive / Genesis and Sega / Mega CD hardware. Initially ported and designed to be running on Gamecube / Wii consoles through libogc / devkitPPC, it is also available for many other platforms through various frontends. The source code is based on Genesis Plus 1.3, originally developped by Charles MacDonald (http://cgfm2.emuviews.com). It has been heavily modified, with respect to initial goals and design, in order to improve accuracy of emulation, implementing new features and adding support for extra peripherals, cartridge & systems hardware. @@ -21,7 +21,10 @@ see http://code.google.com/p/genplus-gx/wiki/GettingStarted (*) libretro / Retroarch (Multi Platform) port: -see http://forum.themaister.net/ +see http://www.libretro.com/forums/index.php + + +Current builds are available for download from https://github.com/ekeeke/Genesis-Plus-GX/tree/master/builds Features diff --git a/builds/genesis_plus_gx_libretro.dll b/builds/genesis_plus_gx_libretro.dll new file mode 100644 index 0000000..9f97450 Binary files /dev/null and b/builds/genesis_plus_gx_libretro.dll differ diff --git a/builds/genplus_cube.dol b/builds/genplus_cube.dol new file mode 100644 index 0000000..8fee7a2 Binary files /dev/null and b/builds/genplus_cube.dol differ diff --git a/builds/genplus_wii.dol b/builds/genplus_wii.dol new file mode 100644 index 0000000..cfdce4e Binary files /dev/null and b/builds/genplus_wii.dol differ diff --git a/core/cart_hw/md_cart.c b/core/cart_hw/md_cart.c index c7ddf58..dc19bba 100644 --- a/core/cart_hw/md_cart.c +++ b/core/cart_hw/md_cart.c @@ -2,7 +2,7 @@ * Genesis Plus * Mega Drive cartridge hardware support * - * Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX) + * Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX) * * Many cartridge protections were initially documented by Haze * (http://haze.mameworld.info/) @@ -419,7 +419,7 @@ void md_cart_init(void) if (input.system[1] != SYSTEM_WAYPLAY) { old_system[1] = input.system[1]; - input.system[1] = SYSTEM_MD_GAMEPAD; + input.system[1] = SYSTEM_GAMEPAD; } /* extra connectors mapped at $38xxxx or $3Fxxxx */ diff --git a/core/cart_hw/sms_cart.c b/core/cart_hw/sms_cart.c index e244bd5..47ebfec 100644 --- a/core/cart_hw/sms_cart.c +++ b/core/cart_hw/sms_cart.c @@ -77,151 +77,151 @@ typedef struct static const rominfo_t game_list[] = { /* program requiring Mega Drive VDP (Mode 5) */ - {0x47FA618D, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_PBC, REGION_USA}, /* Charles MacDonald's Mode 5 Demo Program */ + {0x47FA618D, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_PBC, REGION_USA}, /* Charles MacDonald's Mode 5 Demo Program */ /* game requiring SEGA mapper */ - {0xFF67359B, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* DataStorm (homebrew) */ + {0xFF67359B, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* DataStorm (homebrew) */ /* games requiring 315-5124 VDP (Mark-III, Master System I) */ - {0x32759751, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Y's (J) */ + {0x32759751, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Y's (J) */ /* games requiring Sega 315-5235 mapper without bank shifting */ - {0x23BAC434, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA_X, SYSTEM_GG, REGION_USA}, /* Shining Force Gaiden - Final Conflict (JP) [T-Eng] */ + {0x23BAC434, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA_X, SYSTEM_GG, REGION_USA}, /* Shining Force Gaiden - Final Conflict (JP) [T-Eng] */ /* games using various Korean mappers */ - {0x445525E2, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Penguin Adventure (KR) */ - {0x83F0EEDE, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Street Master (KR) */ - {0xA05258F5, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Won-Si-In (KR) */ - {0x06965ED9, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* F-1 Spirit - The way to Formula-1 (KR) */ - {0x77EFE84A, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Cyborg Z (KR) */ - {0xF89AF3CC, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Knightmare II - The Maze of Galious (KR) */ - {0x9195C34C, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Boy 3 (KR) */ - {0xE316C06D, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX_NEMESIS, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Nemesis (KR) */ - {0x0A77FA5E, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Nemesis 2 (KR) */ - {0xA67F2A5C, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MULTI, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* 4-Pak All Action (KR) */ - {0x89B79E77, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_KOREA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Dodgeball King (KR) */ - {0x18FB98A3, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_KOREA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Jang Pung 3 (KR) */ - {0x97D03541, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_KOREA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Sangokushi 3 (KR) */ - {0x192949D5, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_KOREA_8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Janggun-ui Adeul (KR) */ - {0x9FA727A0, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_KOREA_16K, SYSTEM_GGMS, REGION_USA}, /* Street Hero [Proto 0] [SMS-GG] (US) */ - {0xFB481971, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_KOREA_16K, SYSTEM_GGMS, REGION_USA}, /* Street Hero [Proto 1] [SMS-GG] (US) */ + {0x445525E2, 0, 0, SYSTEM_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Penguin Adventure (KR) */ + {0x83F0EEDE, 0, 0, SYSTEM_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Street Master (KR) */ + {0xA05258F5, 0, 0, SYSTEM_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Won-Si-In (KR) */ + {0x06965ED9, 0, 0, SYSTEM_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* F-1 Spirit - The way to Formula-1 (KR) */ + {0x77EFE84A, 0, 0, SYSTEM_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Cyborg Z (KR) */ + {0xF89AF3CC, 0, 0, SYSTEM_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Knightmare II - The Maze of Galious (KR) */ + {0x9195C34C, 0, 0, SYSTEM_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Boy 3 (KR) */ + {0xE316C06D, 0, 0, SYSTEM_GAMEPAD, MAPPER_MSX_NEMESIS, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Nemesis (KR) */ + {0x0A77FA5E, 0, 0, SYSTEM_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Nemesis 2 (KR) */ + {0xA67F2A5C, 0, 0, SYSTEM_GAMEPAD, MAPPER_MULTI, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* 4-Pak All Action (KR) */ + {0x89B79E77, 0, 0, SYSTEM_GAMEPAD, MAPPER_KOREA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Dodgeball King (KR) */ + {0x18FB98A3, 0, 0, SYSTEM_GAMEPAD, MAPPER_KOREA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Jang Pung 3 (KR) */ + {0x97D03541, 0, 0, SYSTEM_GAMEPAD, MAPPER_KOREA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Sangokushi 3 (KR) */ + {0x192949D5, 0, 0, SYSTEM_GAMEPAD, MAPPER_KOREA_8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Janggun-ui Adeul (KR) */ + {0x9FA727A0, 0, 0, SYSTEM_GAMEPAD, MAPPER_KOREA_16K, SYSTEM_GGMS, REGION_USA}, /* Street Hero [Proto 0] [SMS-GG] (US) */ + {0xFB481971, 0, 0, SYSTEM_GAMEPAD, MAPPER_KOREA_16K, SYSTEM_GGMS, REGION_USA}, /* Street Hero [Proto 1] [SMS-GG] (US) */ /* games using Codemaster mapper */ - {0x29822980, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Cosmic Spacehead */ - {0x8813514B, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Excellent Dizzy Collection, The [Proto] */ - {0xB9664AE1, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Fantastic Dizzy */ - {0xA577CE46, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Micro Machines */ - {0xEA5C3A6F, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_USA}, /* Dinobasher - Starring Bignose the Caveman [Proto] */ - {0xAA140C9C, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GGMS, REGION_USA}, /* Excellent Dizzy Collection, The [SMS-GG] */ - {0xC888222B, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GGMS, REGION_USA}, /* Fantastic Dizzy [SMS-GG] */ - {0x76C5BDFB, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GGMS, REGION_USA}, /* Jang Pung 2 [SMS-GG] */ - {0x6CAA625B, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Cosmic Spacehead [GG]*/ - {0x152F0DCC, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Drop Zone */ - {0x5E53C7F7, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Ernie Els Golf */ - {0xD9A7F170, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Man Overboard! */ - {0xF7C524F6, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Micro Machines [GG] */ - {0xDBE8895C, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Micro Machines 2 - Turbo Tournament */ - {0xC1756BEE, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Pete Sampras Tennis */ - {0x72981057, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* CJ Elephant Fugitive */ + {0x29822980, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Cosmic Spacehead */ + {0x8813514B, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Excellent Dizzy Collection, The [Proto] */ + {0xB9664AE1, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Fantastic Dizzy */ + {0xA577CE46, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Micro Machines */ + {0xEA5C3A6F, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_USA}, /* Dinobasher - Starring Bignose the Caveman [Proto] */ + {0xAA140C9C, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GGMS, REGION_USA}, /* Excellent Dizzy Collection, The [SMS-GG] */ + {0xC888222B, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GGMS, REGION_USA}, /* Fantastic Dizzy [SMS-GG] */ + {0x76C5BDFB, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GGMS, REGION_USA}, /* Jang Pung 2 [SMS-GG] */ + {0x6CAA625B, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Cosmic Spacehead [GG]*/ + {0x152F0DCC, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Drop Zone */ + {0x5E53C7F7, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Ernie Els Golf */ + {0xD9A7F170, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Man Overboard! */ + {0xF7C524F6, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Micro Machines [GG] */ + {0xDBE8895C, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Micro Machines 2 - Turbo Tournament */ + {0xC1756BEE, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Pete Sampras Tennis */ + {0x72981057, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* CJ Elephant Fugitive */ /* games using serial EEPROM */ - {0x36EBCD6D, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_93C46, SYSTEM_GG, REGION_USA}, /* Majors Pro Baseball */ - {0x3D8D0DD6, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_93C46, SYSTEM_GG, REGION_USA}, /* World Series Baseball [v0] */ - {0xBB38CFD7, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_93C46, SYSTEM_GG, REGION_USA}, /* World Series Baseball [v1] */ - {0x578A8A38, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_93C46, SYSTEM_GG, REGION_USA}, /* World Series Baseball '95 */ + {0x36EBCD6D, 0, 0, SYSTEM_GAMEPAD, MAPPER_93C46, SYSTEM_GG, REGION_USA}, /* Majors Pro Baseball */ + {0x3D8D0DD6, 0, 0, SYSTEM_GAMEPAD, MAPPER_93C46, SYSTEM_GG, REGION_USA}, /* World Series Baseball [v0] */ + {0xBB38CFD7, 0, 0, SYSTEM_GAMEPAD, MAPPER_93C46, SYSTEM_GG, REGION_USA}, /* World Series Baseball [v1] */ + {0x578A8A38, 0, 0, SYSTEM_GAMEPAD, MAPPER_93C46, SYSTEM_GG, REGION_USA}, /* World Series Baseball '95 */ /* games using Terebi Oekaki graphic board */ - {0xDD4A661B, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_TEREBI, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Terebi Oekaki */ + {0xDD4A661B, 0, 0, SYSTEM_GAMEPAD, MAPPER_TEREBI, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Terebi Oekaki */ /* games using 2KB external RAM (volatile) */ - {0x092F29D6, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_2K, SYSTEM_SG, REGION_JAPAN_NTSC}, /* The Castle (J) */ - {0xAF4F14BC, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_2K, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Othello (J) */ - {0x1D1A0CA3, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_2K, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Othello (TW) */ + {0x092F29D6, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_2K, SYSTEM_SG, REGION_JAPAN_NTSC}, /* The Castle (J) */ + {0xAF4F14BC, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_2K, SYSTEM_SG, REGION_JAPAN_NTSC}, /* Othello (J) */ + {0x1D1A0CA3, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_2K, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Othello (TW) */ /* games requiring SG-1000 II 8K RAM extension adapter */ - {0xCE5648C3, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Bomberman Special [DahJee] (TW) */ - {0x223397A1, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* King's Valley (TW) */ - {0x281D2888, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Knightmare (TW) */ - {0x306D5F78, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Rally-X [DahJee] (TW) */ - {0x29E047CC, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Road Fighter (TW) */ - {0x5CBD1163, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Tank Battalion (TW) */ - {0x2E7166D5, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* The Legend of Kage (TW) */ - {0xC550B4F0, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* TwinBee (TW) */ - {0xFC87463C, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Yie Ar Kung-Fu II (TW) */ - {0x69FC1494, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Bomberman Special (TW) */ - {0xFFC4EE3F, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Magical Kid Wiz (TW) */ - {0x2E366CCF, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* The Castle (TW) */ - {0xAAAC12CF, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Rally-X (TW) */ - {0xD2EDD329, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Road Fighter (TW) */ + {0xCE5648C3, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Bomberman Special [DahJee] (TW) */ + {0x223397A1, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* King's Valley (TW) */ + {0x281D2888, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Knightmare (TW) */ + {0x306D5F78, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Rally-X [DahJee] (TW) */ + {0x29E047CC, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Road Fighter (TW) */ + {0x5CBD1163, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Tank Battalion (TW) */ + {0x2E7166D5, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* The Legend of Kage (TW) */ + {0xC550B4F0, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* TwinBee (TW) */ + {0xFC87463C, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Yie Ar Kung-Fu II (TW) */ + {0x69FC1494, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Bomberman Special (TW) */ + {0xFFC4EE3F, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Magical Kid Wiz (TW) */ + {0x2E366CCF, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* The Castle (TW) */ + {0xAAAC12CF, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Rally-X (TW) */ + {0xD2EDD329, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Road Fighter (TW) */ /* games requiring 2K internal RAM (SG-1000 II clone hardware) */ - {0x7F7F009D, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_NONE, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Circus Charlie (KR) */ - {0x77DB4704, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_NONE, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Q*Bert */ - {0xC5A67B95, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_NONE, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Othello Multivision BIOS */ + {0x7F7F009D, 0, 0, SYSTEM_GAMEPAD, MAPPER_NONE, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Circus Charlie (KR) */ + {0x77DB4704, 0, 0, SYSTEM_GAMEPAD, MAPPER_NONE, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Q*Bert */ + {0xC5A67B95, 0, 0, SYSTEM_GAMEPAD, MAPPER_NONE, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Othello Multivision BIOS */ /* games requiring Japanese region setting */ - {0x71DEBA5A, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GG, REGION_JAPAN_NTSC}, /* Pop Breaker */ - {0xC9DD4E5F, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Woody Pop (Super Arkanoid) */ + {0x71DEBA5A, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GG, REGION_JAPAN_NTSC}, /* Pop Breaker */ + {0xC9DD4E5F, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Woody Pop (Super Arkanoid) */ /* games requiring Japanese Master System I/O chip (315-5297) */ - {0xBD1CC7DF, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Tetris (KR) */ - {0x6D309AC5, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Power Boggle Boggle (KR) */ + {0xBD1CC7DF, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Tetris (KR) */ + {0x6D309AC5, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Power Boggle Boggle (KR) */ /* games requiring random RAM pattern initialization */ - {0x08BF3DE3, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_NONE, SYSTEM_MARKIII, REGION_JAPAN_NTSC}, /* Alibaba and 40 Thieves (KR) */ - {0x643B6B76, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_NONE, SYSTEM_MARKIII, REGION_JAPAN_NTSC}, /* Block Hole (KR) */ + {0x08BF3DE3, 0, 0, SYSTEM_GAMEPAD, MAPPER_NONE, SYSTEM_MARKIII, REGION_JAPAN_NTSC}, /* Alibaba and 40 Thieves (KR) */ + {0x643B6B76, 0, 0, SYSTEM_GAMEPAD, MAPPER_NONE, SYSTEM_MARKIII, REGION_JAPAN_NTSC}, /* Block Hole (KR) */ /* games requiring PAL timings */ - {0x72420F38, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Addams Familly */ - {0x2D48C1D3, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Back to the Future Part III */ - {0x1CBB7BF1, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Battlemaniacs (BR) */ - {0x1B10A951, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Bram Stoker's Dracula */ - {0xC0E25D62, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* California Games II */ - {0x45C50294, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Jogos de Verao II (BR) */ - {0xC9DBF936, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Home Alone */ - {0x0047B615, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Predator2 */ - {0xF42E145C, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Quest for the Shaven Yak Starring Ren Hoek & Stimpy (BR) */ - {0x9F951756, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* RoboCop 3 */ - {0xF8176918, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Sensible Soccer */ - {0x1575581D, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Shadow of the Beast */ - {0x96B3F29E, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Sonic Blast (BR) */ - {0x5B3B922C, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Sonic the Hedgehog 2 [V0] */ - {0xD6F2BFCA, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Sonic the Hedgehog 2 [V1] */ - {0xCA1D3752, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Space Harrier [50 Hz] */ - {0x85CFC9C9, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Taito Chase H.Q. */ - {0x332A847D, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* NBA Jam [Proto] */ + {0x72420F38, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Addams Familly */ + {0x2D48C1D3, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Back to the Future Part III */ + {0x1CBB7BF1, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Battlemaniacs (BR) */ + {0x1B10A951, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Bram Stoker's Dracula */ + {0xC0E25D62, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* California Games II */ + {0x45C50294, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Jogos de Verao II (BR) */ + {0xC9DBF936, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Home Alone */ + {0x0047B615, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Predator2 */ + {0xF42E145C, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Quest for the Shaven Yak Starring Ren Hoek & Stimpy (BR) */ + {0x9F951756, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* RoboCop 3 */ + {0xF8176918, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Sensible Soccer */ + {0x1575581D, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Shadow of the Beast */ + {0x96B3F29E, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Sonic Blast (BR) */ + {0x5B3B922C, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Sonic the Hedgehog 2 [V0] */ + {0xD6F2BFCA, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Sonic the Hedgehog 2 [V1] */ + {0xCA1D3752, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Space Harrier [50 Hz] */ + {0x85CFC9C9, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Taito Chase H.Q. */ + {0x332A847D, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* NBA Jam [Proto] */ /* games running in Game Gear MS compatibility mode */ - {0x59840FD6, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Castle of Illusion - Starring Mickey Mouse [SMS-GG] */ - {0x9C76FB3A, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Rastan Saga [SMS-GG] */ - {0xC8381DEF, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Taito Chase H.Q [SMS-GG] */ - {0xDA8E95A9, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* WWF Wrestlemania Steel Cage Challenge [SMS-GG] */ - {0x1D93246E, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Olympic Gold [A][SMS-GG] */ - {0xA2F9C7AF, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Olympic Gold [B][SMS-GG] */ - {0x01EAB89D, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Out Run Europa [SMS-GG] */ - {0xF037EC00, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Out Run Europa (US) [SMS-GG] */ - {0xE5F789B9, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Predator 2 [SMS-GG] */ - {0x311D2863, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Prince of Persia [A][SMS-GG] */ - {0x45F058D6, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Prince of Persia [B][SMS-GG] */ - {0x56201996, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* R.C. Grand Prix [SMS-GG] */ - {0x10DBBEF4, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Super Kick Off [SMS-GG] */ - {0x9942B69B, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Castle of Illusion - Starring Mickey Mouse (J) [SMS-GG] */ - {0x7BB81E3D, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Taito Chase H.Q (J) [SMS-GG] */ - {0x6F8E46CF, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Alex Kidd in Miracle World (TW) [SMS-GG] */ - {0x3382D73F, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Olympic Gold (TW) [SMS-GG] */ + {0x59840FD6, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Castle of Illusion - Starring Mickey Mouse [SMS-GG] */ + {0x9C76FB3A, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Rastan Saga [SMS-GG] */ + {0xC8381DEF, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Taito Chase H.Q [SMS-GG] */ + {0xDA8E95A9, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* WWF Wrestlemania Steel Cage Challenge [SMS-GG] */ + {0x1D93246E, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Olympic Gold [A][SMS-GG] */ + {0xA2F9C7AF, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Olympic Gold [B][SMS-GG] */ + {0x01EAB89D, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Out Run Europa [SMS-GG] */ + {0xF037EC00, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Out Run Europa (US) [SMS-GG] */ + {0xE5F789B9, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Predator 2 [SMS-GG] */ + {0x311D2863, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Prince of Persia [A][SMS-GG] */ + {0x45F058D6, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Prince of Persia [B][SMS-GG] */ + {0x56201996, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* R.C. Grand Prix [SMS-GG] */ + {0x10DBBEF4, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_USA}, /* Super Kick Off [SMS-GG] */ + {0x9942B69B, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Castle of Illusion - Starring Mickey Mouse (J) [SMS-GG] */ + {0x7BB81E3D, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Taito Chase H.Q (J) [SMS-GG] */ + {0x6F8E46CF, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Alex Kidd in Miracle World (TW) [SMS-GG] */ + {0x3382D73F, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Olympic Gold (TW) [SMS-GG] */ /* games requiring 3-D Glasses */ - {0x6BD5C2BF, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Space Harrier 3-D */ - {0x8ECD201C, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Blade Eagle 3-D */ - {0xFBF96C81, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Blade Eagle 3-D (BR) */ - {0x58D5FC48, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Blade Eagle 3-D [Proto] */ - {0x31B8040B, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Maze Hunter 3-D */ - {0xABD48AD2, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Poseidon Wars 3-D */ - {0xA3EF13CB, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Zaxxon 3-D */ - {0xBBA74147, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Zaxxon 3-D [Proto] */ - {0xD6F43DDA, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Out Run 3-D */ - {0x871562b0, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Maze Walker */ - {0x156948f9, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Space Harrier 3-D (J) */ + {0x6BD5C2BF, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Space Harrier 3-D */ + {0x8ECD201C, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Blade Eagle 3-D */ + {0xFBF96C81, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Blade Eagle 3-D (BR) */ + {0x58D5FC48, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Blade Eagle 3-D [Proto] */ + {0x31B8040B, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Maze Hunter 3-D */ + {0xABD48AD2, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Poseidon Wars 3-D */ + {0xA3EF13CB, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Zaxxon 3-D */ + {0xBBA74147, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Zaxxon 3-D [Proto] */ + {0xD6F43DDA, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Out Run 3-D */ + {0x871562b0, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Maze Walker */ + {0x156948f9, 1, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Space Harrier 3-D (J) */ /* games requiring 3-D Glasses & Sega Light Phaser */ {0xFBE5CFBB, 1, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Missile Defense 3D */ @@ -254,84 +254,88 @@ static const rominfo_t game_list[] = {0xE42E4998, 0, 0, SYSTEM_SPORTSPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Sports Pad Football */ {0x41C948BF, 0, 0, SYSTEM_SPORTSPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Sports Pad Soccer */ + /* games requiring homemade multitap */ + {0xFAB6F52F, 0, 0, SYSTEM_MS4PLAY, MAPPER_NONE, SYSTEM_SMS2, REGION_USA}, /* BOom (v1.0) */ + {0x143AB50B, 0, 0, SYSTEM_MS4PLAY, MAPPER_NONE, SYSTEM_SMS2, REGION_USA}, /* BOom (v1.1) */ + /* games supporting YM2413 FM */ - {0x1C951F8E, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* After Burner */ - {0xC13896D5, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Alex Kidd: The Lost Stars */ - {0x5CBFE997, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Alien Syndrome */ - {0xBBA2FE98, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Altered Beast */ - {0xFF614EB3, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Aztec Adventure */ - {0x3084CF11, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Bomber Raid */ - {0xAC6009A7, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* California Games */ - {0xA4852757, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Captain Silver */ - {0xB81F6FA5, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Captain Silver (U) */ - {0x3CFF6E80, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Casino Games */ - {0xE7F62E6D, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Cloud Master */ - {0x908E7524, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Cyborg Hunter */ - {0xA55D89F3, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Double Dragon */ - {0xB8B141F9, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Fantasy Zone II */ - {0xD29889AD, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Fantasy Zone: The Maze */ - {0xA4AC35D8, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Galaxy Force */ - {0x6C827520, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Galaxy Force (U) */ - {0x1890F407, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Game Box Série Esportes Radicais (BR) */ - {0xB746A6F5, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Global Defense */ - {0x91A0FC4E, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Global Defense [Proto] */ - {0x48651325, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Golfamania */ - {0x5DABFDC3, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Golfamania [Proto] */ - {0xA51376FE, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Golvellius - Valley of Doom */ - {0x98E4AE4A, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Great Golf */ - {0x516ED32E, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Kenseiden */ - {0xE8511B08, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Lord of The Sword */ - {0x0E333B6E, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Miracle Warriors - Seal of The Dark Lord */ - {0x301A59AA, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Miracle Warriors - Seal of The Dark Lord [Proto] */ - {0x01D67C0B, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Mônica no Castelo do Dragão (BR) */ - {0x5589D8D2, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Out Run */ - {0xE030E66C, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Parlour Games */ - {0xF97E9875, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Penguin Land */ - {0x4077EFD9, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Power Strike */ - {0xBB54B6B0, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* R-Type */ - {0x42FC47EE, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Rampage */ - {0xC547EB1B, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Rastan */ - {0x9A8B28EC, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Scramble Spirits */ - {0xAAB67EC3, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Shanghai */ - {0x0C6FAC4E, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Shinobi */ - {0x4752CAE7, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* SpellCaster */ - {0x1A390B93, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Tennis Ace */ - {0xAE920E4B, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Thunder Blade */ - {0x51BD14BE, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Time Soldiers */ - {0x22CCA9BB, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Turma da Mônica em: O Resgate (BR) */ - {0xB52D60C8, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Ultima IV */ - {0xDE9F8517, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Ultima IV [Proto] */ - {0xDFB0B161, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Vigilante */ - {0x679E1676, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Wonder Boy III: The Dragon's Trap */ - {0x8CBEF0C1, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Wonder Boy in Monster Land */ - {0x2F2E3BC9, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Zillion II - The Tri Formation */ - {0x48D44A13, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_NONE, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* BIOS (J) */ - {0xD8C4165B, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Aleste */ - {0x4CC11DF9, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Alien Syndrome (J) */ - {0xE421E466, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Chouon Senshi Borgman */ - {0x2BCDB8FA, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Doki Doki Penguin Land - Uchuu-Daibouken */ - {0x56BD2455, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Doki Doki Penguin Land - Uchuu-Daibouken [Proto] */ - {0xC722FB42, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Fantasy Zone II (J) */ - {0x7ABC70E9, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Family Games (Party Games) */ - {0x6586BD1F, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Masters Golf */ - {0x4847BC91, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Masters Golf [Proto] */ - {0xB9FDF6D9, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Haja no Fuuin */ - {0x955A009E, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hoshi wo Sagashite */ - {0x05EA5353, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Kenseiden (J) */ - {0xD11D32E4, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Kujakuou */ - {0xAA7D6F45, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Lord of Sword */ - {0xBF0411AD, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Maou Golvellius */ - {0x21A21352, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Maou Golvellius [Proto] */ - {0x5B5F9106, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Nekyuu Kousien */ - {0xBEA27D5C, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Opa Opa */ - {0x6605D36A, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Phantasy Star (J) */ - {0xE1FFF1BB, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Shinobi (J) */ - {0x11645549, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Solomon no Kagi - Oujo Rihita no Namida */ - {0x7E0EF8CB, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Racing */ - {0xB1DA6A30, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Wonder Boy Monster World */ - {0x8132AB2C, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Tensai Bakabon */ - {0xC0CE19B1, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Thunder Blade (J) */ - {0x07301F83, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_PBC, REGION_JAPAN_NTSC} /* Phantasy Star [Megadrive] (J) */ + {0x1C951F8E, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* After Burner */ + {0xC13896D5, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Alex Kidd: The Lost Stars */ + {0x5CBFE997, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Alien Syndrome */ + {0xBBA2FE98, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Altered Beast */ + {0xFF614EB3, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Aztec Adventure */ + {0x3084CF11, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Bomber Raid */ + {0xAC6009A7, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* California Games */ + {0xA4852757, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Captain Silver */ + {0xB81F6FA5, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Captain Silver (U) */ + {0x3CFF6E80, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Casino Games */ + {0xE7F62E6D, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Cloud Master */ + {0x908E7524, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Cyborg Hunter */ + {0xA55D89F3, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Double Dragon */ + {0xB8B141F9, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Fantasy Zone II */ + {0xD29889AD, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Fantasy Zone: The Maze */ + {0xA4AC35D8, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Galaxy Force */ + {0x6C827520, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Galaxy Force (U) */ + {0x1890F407, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Game Box Série Esportes Radicais (BR) */ + {0xB746A6F5, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Global Defense */ + {0x91A0FC4E, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Global Defense [Proto] */ + {0x48651325, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Golfamania */ + {0x5DABFDC3, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Golfamania [Proto] */ + {0xA51376FE, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Golvellius - Valley of Doom */ + {0x98E4AE4A, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Great Golf */ + {0x516ED32E, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Kenseiden */ + {0xE8511B08, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Lord of The Sword */ + {0x0E333B6E, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Miracle Warriors - Seal of The Dark Lord */ + {0x301A59AA, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Miracle Warriors - Seal of The Dark Lord [Proto] */ + {0x01D67C0B, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Mônica no Castelo do Dragão (BR) */ + {0x5589D8D2, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Out Run */ + {0xE030E66C, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Parlour Games */ + {0xF97E9875, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Penguin Land */ + {0x4077EFD9, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Power Strike */ + {0xBB54B6B0, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* R-Type */ + {0x42FC47EE, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Rampage */ + {0xC547EB1B, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Rastan */ + {0x9A8B28EC, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Scramble Spirits */ + {0xAAB67EC3, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Shanghai */ + {0x0C6FAC4E, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Shinobi */ + {0x4752CAE7, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* SpellCaster */ + {0x1A390B93, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Tennis Ace */ + {0xAE920E4B, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Thunder Blade */ + {0x51BD14BE, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Time Soldiers */ + {0x22CCA9BB, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Turma da Mônica em: O Resgate (BR) */ + {0xB52D60C8, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Ultima IV */ + {0xDE9F8517, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Ultima IV [Proto] */ + {0xDFB0B161, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Vigilante */ + {0x679E1676, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Wonder Boy III: The Dragon's Trap */ + {0x8CBEF0C1, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Wonder Boy in Monster Land */ + {0x2F2E3BC9, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Zillion II - The Tri Formation */ + {0x48D44A13, 0, 1, SYSTEM_GAMEPAD, MAPPER_NONE, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* BIOS (J) */ + {0xD8C4165B, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Aleste */ + {0x4CC11DF9, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Alien Syndrome (J) */ + {0xE421E466, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Chouon Senshi Borgman */ + {0x2BCDB8FA, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Doki Doki Penguin Land - Uchuu-Daibouken */ + {0x56BD2455, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Doki Doki Penguin Land - Uchuu-Daibouken [Proto] */ + {0xC722FB42, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Fantasy Zone II (J) */ + {0x7ABC70E9, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Family Games (Party Games) */ + {0x6586BD1F, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Masters Golf */ + {0x4847BC91, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Masters Golf [Proto] */ + {0xB9FDF6D9, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Haja no Fuuin */ + {0x955A009E, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hoshi wo Sagashite */ + {0x05EA5353, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Kenseiden (J) */ + {0xD11D32E4, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Kujakuou */ + {0xAA7D6F45, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Lord of Sword */ + {0xBF0411AD, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Maou Golvellius */ + {0x21A21352, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Maou Golvellius [Proto] */ + {0x5B5F9106, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Nekyuu Kousien */ + {0xBEA27D5C, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Opa Opa */ + {0x6605D36A, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Phantasy Star (J) */ + {0xE1FFF1BB, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Shinobi (J) */ + {0x11645549, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Solomon no Kagi - Oujo Rihita no Namida */ + {0x7E0EF8CB, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Racing */ + {0xB1DA6A30, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Wonder Boy Monster World */ + {0x8132AB2C, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Tensai Bakabon */ + {0xC0CE19B1, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Thunder Blade (J) */ + {0x07301F83, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_PBC, REGION_JAPAN_NTSC} /* Phantasy Star [Megadrive] (J) */ }; /* Cartridge & BIOS ROM hardware */ @@ -373,9 +377,6 @@ void sms_cart_init(void) /* game CRC */ uint32 crc = crc32(0, cart.rom, cart.romsize); - /* use Master System controller by default */ - uint8 device = SYSTEM_MS_GAMEPAD; - /* unmapped memory return $FF on read (mapped to unused cartridge areas $510000-$5103FF & $510400-$5107FF) */ memset(cart.rom + 0x510000, 0xFF, 0x800); @@ -408,8 +409,18 @@ void sms_cart_init(void) /* auto-detect cartridge mapper */ cart_rom.mapper = game_list[i].mapper; + /* save current input settings */ + if (old_system[0] == -1) + { + old_system[0] = input.system[0]; + } + if (old_system[1] == -1) + { + old_system[1] = input.system[1]; + } + /* auto-detect required peripherals */ - device = game_list[i].peripheral; + input.system[0] = input.system[1] = game_list[i].peripheral; /* auto-detect 3D glasses support */ cart.special = game_list[i].g_3d; @@ -467,25 +478,11 @@ void sms_cart_init(void) /* enable cartridge backup memory by default */ sram.on = 1; - /* save current settings */ - if (old_system[0] == -1) - { - old_system[0] = input.system[0]; - } - if (old_system[1] == -1) - { - old_system[1] = input.system[1]; - } - - /* force port A & port B configuration */ - input.system[0] = device; - input.system[1] = SYSTEM_MS_GAMEPAD; - - /* default gun offset */ + /* default gun offset for Light Phaser */ input.x_offset = 20; input.y_offset = 0; - /* SpaceGun & Gangster Town use different gun offset */ + /* SpaceGun & Gangster Town use specific gun offset */ if ((crc == 0x5359762D) || (crc == 0x5FC74D2A)) { input.x_offset = 16; diff --git a/core/input_hw/gamepad.c b/core/input_hw/gamepad.c index a523b30..7e6ec58 100644 --- a/core/input_hw/gamepad.c +++ b/core/input_hw/gamepad.c @@ -1,9 +1,9 @@ /*************************************************************************************** * Genesis Plus - * 3-Buttons & 6-Buttons pad support - * Support for J-CART & 4-Way Play adapters + * 2-Buttons, 3-Buttons & 6-Buttons controller support + * Additional support for J-Cart, 4-Way Play & homemade Master System multitap * - * Copyright (C) 2007-2011 Eke-Eke (Genesis Plus GX) + * Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: @@ -47,7 +47,13 @@ static struct uint8 Timeout; } gamepad[MAX_DEVICES]; -static uint8 pad_index; +static struct +{ + uint8 Latch; + uint8 Counter; +} flipflop[2]; + +static uint8 latch; void gamepad_reset(int port) @@ -57,8 +63,12 @@ void gamepad_reset(int port) gamepad[port].Counter = 0; gamepad[port].Timeout = 0; - /* reset pad index (4-WayPlay) */ - pad_index = 0; + /* reset 4-WayPlay latch */ + latch = 0; + + /* reset Master System multitap flip-flop */ + flipflop[port>>2].Latch = 0; + flipflop[port>>2].Counter = 0; } void gamepad_refresh(int port) @@ -192,13 +202,15 @@ void gamepad_2_write(unsigned char data, unsigned char mask) unsigned char wayplay_1_read(void) { - if (pad_index < 4) + /* check if TH on port B is HIGH */ + if (latch & 0x04) { - return gamepad_read(pad_index); + /* 4-WayPlay detection : xxxxx00 */ + return 0x7c; } - /* multitap detection */ - return 0x70; + /* TR & TL on port B select controller # (0-3) */ + return gamepad_read(latch); } unsigned char wayplay_2_read(void) @@ -208,18 +220,14 @@ unsigned char wayplay_2_read(void) void wayplay_1_write(unsigned char data, unsigned char mask) { - if (pad_index < 4) - { - gamepad_write(pad_index, data, mask); - } + /* TR & TL on port B select controller # (0-3) */ + gamepad_write(latch & 0x03, data, mask); } void wayplay_2_write(unsigned char data, unsigned char mask) { - if ((mask & 0x70) == 0x70) - { - pad_index = (data & 0x70) >> 4; - } + /* latch TH, TR & TL state on port B */ + latch = ((data & mask) >> 4) & 0x07; } @@ -239,3 +247,48 @@ void jcart_write(unsigned int address, unsigned int data) gamepad_write(6, (data & 1) << 6, 0x40); return; } + + +/*--------------------------------------------------------------------------*/ +/* Master System multitap ports handler (original design by Furrtek) */ +/* cf. http://www.smspower.org/uploads/Homebrew/BOoM-SMS-sms4p_2.png */ +/*--------------------------------------------------------------------------*/ +unsigned char ms4play_1_read(void) +{ + return gamepad_read(flipflop[0].Counter); +} + +unsigned char ms4play_2_read(void) +{ + return gamepad_read(flipflop[1].Counter + 4); +} + +void ms4play_1_write(unsigned char data, unsigned char mask) +{ + /* update bits set as output only */ + data = (flipflop[0].Latch & ~mask) | (data & mask); + + /* check TH 1->0 transitions */ + if ((flipflop[0].Latch & 0x40) && !(data & 0x40)) + { + flipflop[0].Counter = (flipflop[0].Counter + 1) & 0x03; + } + + /* update internal state */ + flipflop[0].Latch = data; +} + +void ms4play_2_write(unsigned char data, unsigned char mask) +{ + /* update bits set as output only */ + data = (flipflop[1].Latch & ~mask) | (data & mask); + + /* check TH=1 to TH=0 transition */ + if ((flipflop[1].Latch & 0x40) && !(data & 0x40)) + { + flipflop[1].Counter = (flipflop[1].Counter + 1) & 0x03; + } + + /* update internal state */ + flipflop[1].Latch = data; +} diff --git a/core/input_hw/gamepad.h b/core/input_hw/gamepad.h index 5100e01..9c75bde 100644 --- a/core/input_hw/gamepad.h +++ b/core/input_hw/gamepad.h @@ -1,9 +1,9 @@ /*************************************************************************************** * Genesis Plus - * 3-Buttons & 6-Buttons pad support - * Support for J-CART & 4-Way Play adapters + * 2-Buttons, 3-Buttons & 6-Buttons controller support + * Additional support for J-Cart, 4-Way Play & homemade Master System multitap * - * Copyright (C) 2007-2011 Eke-Eke (Genesis Plus GX) + * Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: @@ -53,5 +53,9 @@ extern void wayplay_1_write(unsigned char data, unsigned char mask); extern void wayplay_2_write(unsigned char data, unsigned char mask); extern unsigned int jcart_read(unsigned int address); extern void jcart_write(unsigned int address, unsigned int data); +extern unsigned char ms4play_1_read(void); +extern unsigned char ms4play_2_read(void); +extern void ms4play_1_write(unsigned char data, unsigned char mask); +extern void ms4play_2_write(unsigned char data, unsigned char mask); #endif diff --git a/core/input_hw/input.c b/core/input_hw/input.c index ce82634..3ad7958 100644 --- a/core/input_hw/input.c +++ b/core/input_hw/input.c @@ -3,7 +3,7 @@ * Input peripherals support * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) - * Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX) + * Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: @@ -54,7 +54,7 @@ int old_system[2] = {-1,-1}; void input_init(void) { - int i; + int i, padtype; int player = 0; for (i=0; i RLDU = 0011 */ + case 0: /* initial state: xxx0011 */ { - return 0x73; + /* TL should match TR */ + return ((teamplayer[port].State & 0x20) >> 1) | 0x03; } - case 1: /* start request: TH = 0, TR = 1 -> RLDU = 1111 */ + case 1: /* start request: xxx1111 */ { - return 0x3F; + /* TL should match TR */ + return ((teamplayer[port].State & 0x20) >> 1) | 0x0F; } case 2: - case 3: /* ack request: TH=0, TR=0/1 -> RLDU = 0000 */ + case 3: /* ack request: xxx0000 */ { /* TL should match TR */ return ((teamplayer[port].State & 0x20) >> 1); @@ -107,7 +109,7 @@ INLINE unsigned int teamplayer_read(int port) case 4: case 5: case 6: - case 7: /* PAD type */ + case 7: /* PAD type: xxx0000 (3B), xxx0001 (6B) or xxx1111 (NC)*/ { unsigned int retval = input.dev[(port << 2) + (counter - 4)]; @@ -115,7 +117,7 @@ INLINE unsigned int teamplayer_read(int port) return (((teamplayer[port].State & 0x20) >> 1) | retval); } - default: /* PAD status */ + default: /* PAD status: xxxRLDU -> xxxSACB -> xxxMXYZ */ { unsigned int retval = 0x0F; @@ -136,23 +138,22 @@ INLINE void teamplayer_write(int port, unsigned char data, unsigned char mask) /* update bits set as output only */ unsigned int state = (teamplayer[port].State & ~mask) | (data & mask); - /* TH & TR handshaking */ - if ((teamplayer[port].State ^ state) & 0x60) + /* check if TH is HIGH */ + if (state & 0x40) { - if (state & 0x40) - { - /* TH high -> reset counter */ - teamplayer[port].Counter = 0; - } - else - { - /* increment counter */ - teamplayer[port].Counter++; - } - - /* update internal state */ - teamplayer[port].State = state; + /* reset counter */ + teamplayer[port].Counter = 0; } + + /* TH & TR handshaking */ + else if ((teamplayer[port].State ^ state) & 0x60) + { + /* increment counter */ + teamplayer[port].Counter++; + } + + /* update internal state */ + teamplayer[port].State = state; } unsigned char teamplayer_1_read(void) diff --git a/core/input_hw/teamplayer.h b/core/input_hw/teamplayer.h index 6e53c31..ea0e848 100644 --- a/core/input_hw/teamplayer.h +++ b/core/input_hw/teamplayer.h @@ -2,7 +2,7 @@ * Genesis Plus * Team Player support * - * Copyright (C) 2007-2011 Eke-Eke (Genesis Plus GX) + * Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: diff --git a/core/io_ctrl.c b/core/io_ctrl.c index f221bf5..7dfcf3d 100644 --- a/core/io_ctrl.c +++ b/core/io_ctrl.c @@ -5,7 +5,7 @@ * Support for Master System (315-5216, 315-5237 & 315-5297), Game Gear & Mega Drive I/O chips * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) - * Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX) + * Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: @@ -80,16 +80,9 @@ void io_init(void) /* Initialize IO Ports handlers & connected peripherals */ switch (input.system[0]) { - case SYSTEM_MS_GAMEPAD: + case SYSTEM_GAMEPAD: { - port[0].data_w = dummy_write; - port[0].data_r = gamepad_1_read; - break; - } - - case SYSTEM_MD_GAMEPAD: - { - port[0].data_w = gamepad_1_write; + port[0].data_w = (input.dev[0] == DEVICE_PAD2B) ? dummy_write : gamepad_1_write; port[0].data_r = gamepad_1_read; break; } @@ -129,6 +122,13 @@ void io_init(void) break; } + case SYSTEM_MS4PLAY: + { + port[0].data_w = ms4play_1_write; + port[0].data_r = ms4play_1_read; + break; + } + case SYSTEM_LIGHTPHASER: { port[0].data_w = dummy_write; @@ -160,16 +160,9 @@ void io_init(void) switch (input.system[1]) { - case SYSTEM_MS_GAMEPAD: + case SYSTEM_GAMEPAD: { - port[1].data_w = dummy_write; - port[1].data_r = gamepad_2_read; - break; - } - - case SYSTEM_MD_GAMEPAD: - { - port[1].data_w = gamepad_2_write; + port[1].data_w = (input.dev[4] == DEVICE_PAD2B) ? dummy_write : gamepad_2_write; port[1].data_r = gamepad_2_read; break; } @@ -223,6 +216,13 @@ void io_init(void) break; } + case SYSTEM_MS4PLAY: + { + port[1].data_w = ms4play_2_write; + port[1].data_r = ms4play_2_read; + break; + } + case SYSTEM_LIGHTPHASER: { port[1].data_w = dummy_write; diff --git a/core/io_ctrl.h b/core/io_ctrl.h index addc259..ca3d6be 100644 --- a/core/io_ctrl.h +++ b/core/io_ctrl.h @@ -5,7 +5,7 @@ * Support for Master System (315-5216, 315-5237 & 315-5297), Game Gear & Mega Drive I/O chips * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) - * Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX) + * Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: diff --git a/core/loadrom.c b/core/loadrom.c index 625add9..09e6db2 100644 --- a/core/loadrom.c +++ b/core/loadrom.c @@ -3,7 +3,7 @@ * ROM Loading Support * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) - * Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX) + * Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: @@ -682,9 +682,6 @@ int load_rom(char *filename) } #endif - /* Save auto-detected system hardware */ - romtype = system_hw; - /* PICO ROM */ if (strstr(rominfo.consoletype, "SEGA PICO") != NULL) { @@ -692,8 +689,11 @@ int load_rom(char *filename) system_hw = SYSTEM_PICO; } + /* Save auto-detected system hardware */ + romtype = system_hw; + /* CD BOOTROM */ - else if (strstr(rominfo.ROMType, "BR") != NULL) + if (strstr(rominfo.ROMType, "BR") != NULL) { /* enable CD hardware */ system_hw = SYSTEM_MCD; @@ -717,7 +717,7 @@ int load_rom(char *filename) (strstr(rominfo.product,"T-5740") != NULL)) { /* check if console hardware is set to AUTO */ - if (config.system == 0x00) + if (!config.system) { /* auto-enable CD hardware */ system_hw = SYSTEM_MCD; @@ -790,7 +790,7 @@ int load_rom(char *filename) } /* force MENACER configuration */ - input.system[0] = SYSTEM_MD_GAMEPAD; + input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_MENACER; input.x_offset = 82; input.y_offset = 0; @@ -808,7 +808,7 @@ int load_rom(char *filename) } /* force MENACER configuration */ - input.system[0] = SYSTEM_MD_GAMEPAD; + input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_MENACER; input.x_offset = 133; input.y_offset = -8; @@ -826,7 +826,7 @@ int load_rom(char *filename) } /* force MENACER configuration */ - input.system[0] = SYSTEM_MD_GAMEPAD; + input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_MENACER; input.x_offset = 68; input.y_offset = -24; @@ -844,7 +844,7 @@ int load_rom(char *filename) } /* force MENACER configuration */ - input.system[0] = SYSTEM_MD_GAMEPAD; + input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_MENACER; input.x_offset = 64; input.y_offset = -8; @@ -862,7 +862,7 @@ int load_rom(char *filename) } /* force MENACER configuration */ - input.system[0] = SYSTEM_MD_GAMEPAD; + input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_MENACER; input.x_offset = 61; input.y_offset = 0; @@ -880,7 +880,7 @@ int load_rom(char *filename) } /* force MENACER configuration */ - input.system[0] = SYSTEM_MD_GAMEPAD; + input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_MENACER; input.x_offset = 70; input.y_offset = 18; @@ -898,7 +898,7 @@ int load_rom(char *filename) } /* force MENACER configuration */ - input.system[0] = SYSTEM_MD_GAMEPAD; + input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_MENACER; input.x_offset = 49; input.y_offset = 0; @@ -916,7 +916,7 @@ int load_rom(char *filename) } /* force MENACER configuration */ - input.system[0] = SYSTEM_MD_GAMEPAD; + input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_MENACER; input.x_offset = 60; input.y_offset = 30; @@ -935,7 +935,7 @@ int load_rom(char *filename) } /* force JUSTIFIER configuration */ - input.system[0] = SYSTEM_MD_GAMEPAD; + input.system[0] = SYSTEM_GAMEPAD; input.system[1] = SYSTEM_JUSTIFIER; input.x_offset = (strstr(rominfo.international,"GUN FIGHTERS") != NULL) ? 24 : 0; input.y_offset = 0; diff --git a/core/loadrom.h b/core/loadrom.h index 5fad9f7..5f13ffa 100644 --- a/core/loadrom.h +++ b/core/loadrom.h @@ -3,7 +3,7 @@ * ROM Loading Support * * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) - * Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX) + * Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: diff --git a/gx/config.c b/gx/config.c index d13b15b..668fa3a 100644 --- a/gx/config.c +++ b/gx/config.c @@ -3,7 +3,7 @@ * * Genesis Plus GX configuration file support * - * Copyright Eke-Eke (2007-2013) + * Copyright Eke-Eke (2007-2014) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: @@ -164,6 +164,13 @@ void config_default(void) config.gamma = VI_GM_1_0 / 10.0; #endif + /* NTSC filter options */ + config.ntsc_sharpness = 0.0; + config.ntsc_resolution = 0.0; + config.ntsc_artifacts = 0.0; + config.ntsc_fringing = 0.0; + config.ntsc_bleed = 0.0; + /* controllers options */ config.gun_cursor[0] = 1; config.gun_cursor[1] = 1; @@ -178,13 +185,13 @@ void config_default(void) config.autocheat = 0; #ifdef HW_RVL config.s_auto = 1; + config.autosleep = 1; #else config.s_auto = 0; config.v_prog = 1; #endif config.s_default = 1; config.s_device = 0; - config.l_device = 0; config.bg_overlay = 0; config.screen_w = 658; config.bgm_volume = 100.0; @@ -192,6 +199,9 @@ void config_default(void) /* default ROM directories */ #ifdef HW_RVL + char dir[16]; + getcwd(dir, 16); + config.l_device = strstr(dir, "sd") ? TYPE_SD : TYPE_USB; sprintf (config.lastdir[0][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[1][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[2][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); @@ -208,6 +218,7 @@ void config_default(void) sprintf (config.lastdir[3][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[4][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); #else + config.l_device = TYPE_SD; sprintf (config.lastdir[0][TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[1][TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[2][TYPE_SD], "%s/roms/", DEFAULT_PATH); @@ -250,7 +261,7 @@ void config_default(void) { /* switch menu video mode to interlaced */ vmode->viTVMode = (vmode->viTVMode & ~3) | VI_INTERLACE; - VIDEO_Configure (vmode); + VIDEO_Configure(vmode); VIDEO_Flush(); VIDEO_WaitVSync(); VIDEO_WaitVSync(); @@ -266,7 +277,7 @@ void config_default(void) } /* default emulated inputs */ - input.system[0] = SYSTEM_MD_GAMEPAD; - input.system[1] = (config.input[1].device != -1) ? SYSTEM_MD_GAMEPAD : NO_SYSTEM; + input.system[0] = SYSTEM_GAMEPAD; + input.system[1] = (config.input[1].device != -1) ? SYSTEM_GAMEPAD : NO_SYSTEM; input_init(); } diff --git a/gx/config.h b/gx/config.h index 59b773e..ddf1fb1 100644 --- a/gx/config.h +++ b/gx/config.h @@ -3,7 +3,7 @@ * * Genesis Plus GX configuration file support * - * Copyright Eke-Eke (2007-2013) + * Copyright Eke-Eke (2007-2014) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: @@ -97,6 +97,7 @@ typedef struct uint16 pad_keymap[4][MAX_KEYS+1]; #ifdef HW_RVL uint32 wpad_keymap[4*3][MAX_KEYS]; + uint8 autosleep; #endif uint8 autoload; uint8 autocheat; @@ -111,6 +112,11 @@ typedef struct float bgm_volume; float sfx_volume; char lastdir[FILETYPE_MAX][TYPE_RECENT][MAXPATHLEN]; + float ntsc_sharpness; + float ntsc_resolution; + float ntsc_artifacts; + float ntsc_fringing; + float ntsc_bleed; } t_config; /* Global data */ diff --git a/gx/gui/menu.c b/gx/gui/menu.c index afb0415..7e12fe1 100644 --- a/gx/gui/menu.c +++ b/gx/gui/menu.c @@ -97,8 +97,7 @@ extern const u8 Button_delete_over_png[]; /* Controller Settings */ extern const u8 Ctrl_4wayplay_png[]; -extern const u8 Ctrl_gamepad_md_png[]; -extern const u8 Ctrl_gamepad_ms_png[]; +extern const u8 Ctrl_gamepad_png[]; extern const u8 Ctrl_justifiers_png[]; extern const u8 Ctrl_menacer_png[]; extern const u8 Ctrl_mouse_png[]; @@ -109,6 +108,9 @@ extern const u8 Ctrl_paddle_png[]; extern const u8 Ctrl_sportspad_png[]; extern const u8 Ctrl_none_png[]; extern const u8 Ctrl_teamplayer_png[]; +extern const u8 Ctrl_ms4play_png[]; +extern const u8 Ctrl_pad_auto_png[]; +extern const u8 Ctrl_pad2b_png[]; extern const u8 Ctrl_pad3b_png[]; extern const u8 Ctrl_pad6b_png[]; extern const u8 Ctrl_config_png[]; @@ -370,9 +372,9 @@ static gui_item items_system[10] = /* Video options */ #ifdef HW_RVL -static gui_item items_video[13] = +static gui_item items_video[18] = #else -static gui_item items_video[11] = +static gui_item items_video[16] = #endif { {NULL,NULL,"Display: PROGRESSIVE", "Select video mode", 56,132,276,48}, @@ -385,6 +387,11 @@ static gui_item items_video[11] = {NULL,NULL,"VI Gamma Correction: 1.0", "Adjust video hardware gamma correction", 56,132,276,48}, #endif {NULL,NULL,"NTSC Filter: COMPOSITE", "Enable/disable NTSC software filtering", 56,132,276,48}, + {NULL,NULL,"NTSC Sharpness: 0.0", "Adjust edge contrast enhancement/blurring", 56,132,276,48}, + {NULL,NULL,"NTSC Resolution: 0.0", "Adjust image resolution", 56,132,276,48}, + {NULL,NULL,"NTSC Artifacts: 0.0", "Adjust artifacts caused by color changes", 56,132,276,48}, + {NULL,NULL,"NTSC Color Bleed: 0.0", "Adjust color resolution reduction", 56,132,276,48}, + {NULL,NULL,"NTSC Color Fringing: 0.0", "Adjust artifacts caused by brightness changes", 56,132,276,48}, {NULL,NULL,"Borders: OFF", "Enable/disable overscan emulation", 56,132,276,48}, {NULL,NULL,"GG screen: ORIGINAL", "Enable/disable Game Gear extended screen", 56,132,276,48}, {NULL,NULL,"Aspect: ORIGINAL (4:3)", "Select display aspect ratio", 56,132,276,48}, @@ -393,7 +400,11 @@ static gui_item items_video[11] = }; /* Menu options */ +#ifdef HW_RVL +static gui_item items_prefs[12] = +#else static gui_item items_prefs[11] = +#endif { {NULL,NULL,"Auto ROM Load: OFF", "Enable/disable automatic ROM loading on startup", 56,132,276,48}, {NULL,NULL,"Auto Cheats: OFF", "Enable/disable automatic cheats activation", 56,132,276,48}, @@ -406,6 +417,9 @@ static gui_item items_prefs[11] = {NULL,NULL,"Screen Width: 658", "Adjust menu screen width in pixels", 56,132,276,48}, {NULL,NULL,"Show CD Leds: OFF", "Enable/disable CD leds display", 56,132,276,48}, {NULL,NULL,"Show FPS: OFF", "Enable/disable FPS counter", 56,132,276,48}, +#ifdef HW_RVL + {NULL,NULL,"Wiimote Timeout: OFF","Enable/disable Wii remote automatic shutodwn", 56,132,276,48}, +#endif }; /* Save Manager */ @@ -614,7 +628,7 @@ static gui_menu menu_prefs = { "Menu Settings", 0,0, - 11,4,6,0, + 12,4,6,0, items_prefs, buttons_list, bg_list, @@ -683,6 +697,12 @@ static void prefmenu () sprintf (items[8].text, "Screen Width: %d", config.screen_w); sprintf (items[9].text, "Show CD Leds: %s", config.cd_leds ? "ON":"OFF"); sprintf (items[10].text, "Show FPS: %s", config.fps ? "ON":"OFF"); +#ifdef HW_RVL + sprintf (items[11].text, "Wiimote Timeout: %s", config.autosleep ? "5min":"30min"); + m->max_items = 12; +#else + m->max_items = 11; +#endif GUI_InitMenu(m); GUI_SlideMenuTitle(m,strlen("Menu ")); @@ -777,6 +797,14 @@ static void prefmenu () sprintf (items[10].text, "Show FPS: %s", config.fps ? "ON":"OFF"); break; +#ifdef HW_RVL + case 11: /*** Wii remote auto switch-off ***/ + config.autosleep ^= 1; + sprintf (items[11].text, "Wiimote Timeout: %s", config.autosleep ? "5min":"30min"); + WPAD_SetIdleTimeout(config.autosleep ? 300 : 1800); + break; +#endif + case -1: quit = 1; break; @@ -1480,6 +1508,7 @@ static void videomenu () int reinit = 0; gui_menu *m = &menu_video; gui_item *items = m->items; + int ntsc_offset = 0; if (config.render == 1) sprintf (items[0].text,"Display: INTERLACED"); @@ -1514,39 +1543,59 @@ static void videomenu () sprintf (items[VI_OFFSET].text, "NTSC Filter: S-VIDEO"); else if (config.ntsc == 3) sprintf (items[VI_OFFSET].text, "NTSC Filter: RGB"); + else if (config.ntsc == 4) + { + sprintf (items[VI_OFFSET].text, "NTSC Filter: MANUAL"); + sprintf(items[VI_OFFSET+1].text, "NTSC Sharpness: %1.2f", config.ntsc_sharpness); + sprintf(items[VI_OFFSET+2].text, "NTSC Resolution: %1.2f", config.ntsc_resolution); + sprintf(items[VI_OFFSET+3].text, "NTSC Artifacts: %1.2f", config.ntsc_artifacts); + sprintf(items[VI_OFFSET+4].text, "NTSC Color Bleed: %1.2f", config.ntsc_bleed); + sprintf(items[VI_OFFSET+5].text, "NTSC Color Fringing: %1.2f", config.ntsc_fringing); + strcpy(items[VI_OFFSET+1].comment, "Adjust edge contrast enhancement/blurring"); + strcpy(items[VI_OFFSET+2].comment, "Adjust image resolution"); + strcpy(items[VI_OFFSET+3].comment, "Adjust artifacts caused by color changes"); + strcpy(items[VI_OFFSET+4].comment, "Adjust color resolution reduction"); + strcpy(items[VI_OFFSET+5].comment, "Adjust artifacts caused by brightness changes"); + ntsc_offset = 5; + } else sprintf (items[VI_OFFSET].text, "NTSC Filter: OFF"); - if (config.overscan == 3) - sprintf (items[VI_OFFSET+1].text, "Borders: FULL"); - else if (config.overscan == 2) - sprintf (items[VI_OFFSET+1].text, "Borders: H ONLY"); - else if (config.overscan == 1) - sprintf (items[VI_OFFSET+1].text, "Borders: V ONLY"); - else - sprintf (items[VI_OFFSET+1].text, "Borders: NONE"); + strcpy(items[VI_OFFSET+1+ntsc_offset].comment, "Enable/disable overscan emulation"); + strcpy(items[VI_OFFSET+2+ntsc_offset].comment, "Enable/disable Game Gear extended screen"); + strcpy(items[VI_OFFSET+3+ntsc_offset].comment, "Select display aspect ratio"); + strcpy(items[VI_OFFSET+4+ntsc_offset].comment, "Adjust display position"); + strcpy(items[VI_OFFSET+5+ntsc_offset].comment, "Adjust display scaling"); - sprintf(items[VI_OFFSET+2].text, "GG Screen: %s", config.gg_extra ? "EXTENDED":"ORIGINAL"); + if (config.overscan == 3) + sprintf (items[VI_OFFSET+1+ntsc_offset].text, "Borders: FULL"); + else if (config.overscan == 2) + sprintf (items[VI_OFFSET+1+ntsc_offset].text, "Borders: H ONLY"); + else if (config.overscan == 1) + sprintf (items[VI_OFFSET+1+ntsc_offset].text, "Borders: V ONLY"); + else + sprintf (items[VI_OFFSET+1+ntsc_offset].text, "Borders: NONE"); + + sprintf(items[VI_OFFSET+2+ntsc_offset].text, "GG Screen: %s", config.gg_extra ? "EXTENDED":"ORIGINAL"); if (config.aspect == 1) - sprintf (items[VI_OFFSET+3].text,"Aspect: ORIGINAL (4:3)"); + sprintf (items[VI_OFFSET+3+ntsc_offset].text,"Aspect: ORIGINAL (4:3)"); else if (config.aspect == 2) - sprintf (items[VI_OFFSET+3].text, "Aspect: ORIGINAL (16:9)"); + sprintf (items[VI_OFFSET+3+ntsc_offset].text, "Aspect: ORIGINAL (16:9)"); else - sprintf (items[VI_OFFSET+3].text, "Aspect: SCALED"); + { + sprintf (items[VI_OFFSET+3+ntsc_offset].text, "Aspect: SCALED"); + } - sprintf (items[VI_OFFSET+4].text, "Screen Position: (%s%02d,%s%02d)", + sprintf (items[VI_OFFSET+4+ntsc_offset].text, "Screen Position: (%s%02d,%s%02d)", (config.xshift < 0) ? "":"+", config.xshift, (config.yshift < 0) ? "":"+", config.yshift); - sprintf (items[VI_OFFSET+5].text, "Screen Scaling: (%s%02d,%s%02d)", + sprintf (items[VI_OFFSET+5+ntsc_offset].text, "Screen Scaling: (%s%02d,%s%02d)", (config.xscale < 0) ? "":"+", config.xscale, (config.yscale < 0) ? "":"+", config.yscale); - if (config.aspect) - m->max_items = VI_OFFSET+5; - else - m->max_items = VI_OFFSET+6; + m->max_items = VI_OFFSET + 5 + ntsc_offset + (config.aspect == 0); GUI_InitMenu(m); GUI_SlideMenuTitle(m,strlen("Video ")); @@ -1555,6 +1604,11 @@ static void videomenu () { ret = GUI_RunMenu(m); + if (ret > VI_OFFSET) + { + ret += (5 - ntsc_offset); + } + switch (ret) { case 0: /*** rendering ***/ @@ -1643,64 +1697,135 @@ static void videomenu () #endif case VI_OFFSET: /*** NTSC filter ***/ - config.ntsc = (config.ntsc + 1) & 3; + config.ntsc = (config.ntsc + 1) % 5; if (config.ntsc == 1) + { sprintf (items[VI_OFFSET].text, "NTSC Filter: COMPOSITE"); + } else if (config.ntsc == 2) + { sprintf (items[VI_OFFSET].text, "NTSC Filter: S-VIDEO"); + } else if (config.ntsc == 3) + { sprintf (items[VI_OFFSET].text, "NTSC Filter: RGB"); + } + else if (config.ntsc == 4) + { + sprintf (items[VI_OFFSET].text, "NTSC Filter: MANUAL"); + strcpy(items[VI_OFFSET+5+1].text, items[VI_OFFSET+1].text); + strcpy(items[VI_OFFSET+5+2].text, items[VI_OFFSET+2].text); + strcpy(items[VI_OFFSET+5+3].text, items[VI_OFFSET+3].text); + strcpy(items[VI_OFFSET+5+4].text, items[VI_OFFSET+4].text); + strcpy(items[VI_OFFSET+5+5].text, items[VI_OFFSET+5].text); + strcpy(items[VI_OFFSET+5+1].comment, items[VI_OFFSET+1].comment); + strcpy(items[VI_OFFSET+5+2].comment, items[VI_OFFSET+2].comment); + strcpy(items[VI_OFFSET+5+3].comment, items[VI_OFFSET+3].comment); + strcpy(items[VI_OFFSET+5+4].comment, items[VI_OFFSET+4].comment); + strcpy(items[VI_OFFSET+5+5].comment, items[VI_OFFSET+5].comment); + sprintf(items[VI_OFFSET+1].text, "NTSC Sharpness: %1.1f", config.ntsc_sharpness); + sprintf(items[VI_OFFSET+2].text, "NTSC Resolution: %1.1f", config.ntsc_resolution); + sprintf(items[VI_OFFSET+3].text, "NTSC Artifacts: %1.1f", config.ntsc_artifacts); + sprintf(items[VI_OFFSET+4].text, "NTSC Color Bleed: %1.1f", config.ntsc_bleed); + sprintf(items[VI_OFFSET+5].text, "NTSC Color Fringing: %1.1f", config.ntsc_fringing); + strcpy(items[VI_OFFSET+1].comment, "Adjust edge contrast enhancement/blurring"); + strcpy(items[VI_OFFSET+2].comment, "Adjust image resolution"); + strcpy(items[VI_OFFSET+3].comment, "Adjust artifacts caused by color changes"); + strcpy(items[VI_OFFSET+4].comment, "Adjust color resolution reduction"); + strcpy(items[VI_OFFSET+5].comment, "Adjust artifacts caused by brightness changes"); + ntsc_offset = 5; + m->max_items = VI_OFFSET + 10 + (config.aspect == 0); + } else + { sprintf (items[VI_OFFSET].text, "NTSC Filter: OFF"); + strcpy(items[VI_OFFSET+1].text, items[VI_OFFSET+5+1].text); + strcpy(items[VI_OFFSET+2].text, items[VI_OFFSET+5+2].text); + strcpy(items[VI_OFFSET+3].text, items[VI_OFFSET+5+3].text); + strcpy(items[VI_OFFSET+4].text, items[VI_OFFSET+5+4].text); + strcpy(items[VI_OFFSET+5].text, items[VI_OFFSET+5+5].text); + strcpy(items[VI_OFFSET+1].comment, items[VI_OFFSET+5+1].comment); + strcpy(items[VI_OFFSET+2].comment, items[VI_OFFSET+5+2].comment); + strcpy(items[VI_OFFSET+3].comment, items[VI_OFFSET+5+3].comment); + strcpy(items[VI_OFFSET+4].comment, items[VI_OFFSET+5+4].comment); + strcpy(items[VI_OFFSET+5].comment, items[VI_OFFSET+5+5].comment); + ntsc_offset = 0; + m->max_items = VI_OFFSET + 5 + (config.aspect == 0); + } break; - case VI_OFFSET+1: /*** overscan emulation ***/ + case VI_OFFSET+1: /*** NTSC Sharpness ***/ + GUI_OptionBox(m,update_bgm,"NTSC Sharpness",(void *)&config.ntsc_sharpness,0.01,-1.0,1.0,0); + sprintf(items[VI_OFFSET+1].text, "NTSC Sharpness: %1.2f", config.ntsc_sharpness); + break; + + case VI_OFFSET+2: /*** NTSC Resolution ***/ + GUI_OptionBox(m,update_bgm,"NTSC Resolution",(void *)&config.ntsc_resolution,0.01,0.0,1.0,0); + sprintf(items[VI_OFFSET+2].text, "NTSC Resolution: %1.2f", config.ntsc_resolution); + break; + + case VI_OFFSET+3: /*** NTSC Artifacts ***/ + GUI_OptionBox(m,update_bgm,"NTSC Artifacts",(void *)&config.ntsc_artifacts,0.01,-1.0,0.0,0); + sprintf(items[VI_OFFSET+3].text, "NTSC Artifacts: %1.2f", config.ntsc_artifacts); + break; + + case VI_OFFSET+4: /*** NTSC Color Bleed ***/ + GUI_OptionBox(m,update_bgm,"NTSC Color Bleed",(void *)&config.ntsc_bleed,0.01,-1.0,1.0,0); + sprintf(items[VI_OFFSET+4].text, "NTSC Color Bleed: %1.2f", config.ntsc_bleed); + break; + + case VI_OFFSET+5: /*** NTSC Color Fringing ***/ + GUI_OptionBox(m,update_bgm,"NTSC Color Fringing",(void *)&config.ntsc_fringing,0.01,-1.0,1.0,0); + sprintf(items[VI_OFFSET+5].text, "NTSC Color Fringing: %1.2f", config.ntsc_fringing); + break; + + case VI_OFFSET+6: /*** overscan emulation ***/ config.overscan = (config.overscan + 1) & 3; if (config.overscan == 3) - sprintf (items[VI_OFFSET+1].text, "Borders: FULL"); + sprintf (items[VI_OFFSET+ntsc_offset+1].text, "Borders: FULL"); else if (config.overscan == 2) - sprintf (items[VI_OFFSET+1].text, "Borders: H ONLY"); + sprintf (items[VI_OFFSET+ntsc_offset+1].text, "Borders: H ONLY"); else if (config.overscan == 1) - sprintf (items[VI_OFFSET+1].text, "Borders: V ONLY"); + sprintf (items[VI_OFFSET+ntsc_offset+1].text, "Borders: V ONLY"); else - sprintf (items[VI_OFFSET+1].text, "Borders: NONE"); + sprintf (items[VI_OFFSET+ntsc_offset+1].text, "Borders: NONE"); break; - case VI_OFFSET+2: /*** Game Gear extended screen */ + case VI_OFFSET+7: /*** Game Gear extended screen */ config.gg_extra ^= 1; - sprintf(items[VI_OFFSET+2].text, "GG Screen: %s", config.gg_extra ? "EXTENDED":"ORIGINAL"); + sprintf(items[VI_OFFSET+ntsc_offset+2].text, "GG Screen: %s", config.gg_extra ? "EXTENDED":"ORIGINAL"); break; - case VI_OFFSET+3: /*** aspect ratio ***/ + case VI_OFFSET+8: /*** aspect ratio ***/ config.aspect = (config.aspect + 1) % 3; if (config.aspect == 1) - sprintf (items[VI_OFFSET+3].text,"Aspect: ORIGINAL (4:3)"); + sprintf (items[VI_OFFSET+ntsc_offset+3].text,"Aspect: ORIGINAL (4:3)"); else if (config.aspect == 2) - sprintf (items[VI_OFFSET+3].text, "Aspect: ORIGINAL (16:9)"); + sprintf (items[VI_OFFSET+ntsc_offset+3].text, "Aspect: ORIGINAL (16:9)"); else - sprintf (items[VI_OFFSET+3].text, "Aspect: SCALED"); + sprintf (items[VI_OFFSET+ntsc_offset+3].text, "Aspect: SCALED"); if (config.aspect) { /* disable items */ - m->max_items = VI_OFFSET+5; + m->max_items = VI_OFFSET + ntsc_offset + 5; /* reset menu selection */ - if (m->offset > VI_OFFSET) + if (m->selected < 2) { - m->offset = VI_OFFSET; - m->selected = 3; + m->offset = VI_OFFSET + ntsc_offset + 1; + m->selected = 2; } } else { /* enable items */ - m->max_items = VI_OFFSET+6; + m->max_items = VI_OFFSET + ntsc_offset + 6; } break; - case VI_OFFSET+4: /*** screen position ***/ + case VI_OFFSET+9: /*** screen position ***/ if (system_hw) { state[0] = m->arrows[0]->state; @@ -1718,7 +1843,7 @@ static void videomenu () m->arrows[1]->state = state[1]; m->screenshot = 0; strcpy(m->title,"Video Settings"); - sprintf (items[VI_OFFSET+4].text, "Screen Position: (%s%02d,%s%02d)", + sprintf (items[VI_OFFSET+ntsc_offset+4].text, "Screen Position: (%s%02d,%s%02d)", (config.xshift < 0) ? "":"+", config.xshift, (config.yshift < 0) ? "":"+", config.yshift); } @@ -1728,7 +1853,7 @@ static void videomenu () } break; - case VI_OFFSET+5: /*** screen scaling ***/ + case VI_OFFSET+10: /*** screen scaling ***/ if (system_hw) { state[0] = m->arrows[0]->state; @@ -1746,7 +1871,7 @@ static void videomenu () m->arrows[1]->state = state[1]; m->screenshot = 0; strcpy(m->title,"Video Settings"); - sprintf (items[VI_OFFSET+5].text, "Screen Scaling: (%s%02d,%s%02d)", + sprintf (items[VI_OFFSET+ntsc_offset+5].text, "Screen Scaling: (%s%02d,%s%02d)", (config.xscale < 0) ? "":"+", config.xscale, (config.yscale < 0) ? "":"+", config.yscale); } @@ -1921,66 +2046,73 @@ static void ctrlmenu(void) int update = 0; gui_item *items = NULL; u8 *special = NULL; - u32 exp; - u8 type = 0; + u32 exp, index = 0; /* System devices */ gui_item items_sys[2][13] = { { {NULL,Ctrl_none_png ,"","Select Port 1 device",110,130,48,72}, - {NULL,Ctrl_gamepad_md_png ,"","Select Port 1 device", 85,117,96,84}, + {NULL,Ctrl_gamepad_png ,"","Select Port 1 device",100,109,68,92}, {NULL,Ctrl_mouse_png ,"","Select Port 1 device", 97,113,64,88}, {NULL,Ctrl_menacer_png ,"","Select Port 1 device", 94,113,80,88}, {NULL,Ctrl_justifiers_png ,"","Select Port 1 device", 88,117,80,84}, {NULL,Ctrl_xe_a1p_png ,"","Select Port 1 device", 98,118,72,84}, {NULL,Ctrl_activator_png ,"","Select Port 1 device", 94,121,72,80}, - {NULL,Ctrl_gamepad_ms_png ,"","Select Port 1 device", 91,125,84,76}, {NULL,Ctrl_lightphaser_png,"","Select Port 1 device", 89,109,88,92}, {NULL,Ctrl_paddle_png ,"","Select Port 1 device", 86,117,96,84}, {NULL,Ctrl_sportspad_png ,"","Select Port 1 device", 95,117,76,84}, + {NULL,Ctrl_ms4play_png ,"","Select Port 1 device", 94,100,80,100}, {NULL,Ctrl_teamplayer_png ,"","Select Port 1 device", 94,109,80,92}, {NULL,Ctrl_4wayplay_png ,"","Select Port 1 device", 98,110,72,92} }, { {NULL,Ctrl_none_png ,"","Select Port 2 device",110,300,48,72}, - {NULL,Ctrl_gamepad_md_png ,"","Select Port 2 device", 85,287,96,84}, + {NULL,Ctrl_gamepad_png ,"","Select Port 2 device",100,279,68,92}, {NULL,Ctrl_mouse_png ,"","Select Port 2 device", 97,283,64,88}, {NULL,Ctrl_menacer_png ,"","Select Port 2 device", 94,283,80,88}, {NULL,Ctrl_justifiers_png ,"","Select Port 2 device", 88,287,80,84}, {NULL,Ctrl_xe_a1p_png ,"","Select Port 2 device", 98,288,72,84}, {NULL,Ctrl_activator_png ,"","Select Port 2 device", 94,291,72,80}, - {NULL,Ctrl_gamepad_ms_png ,"","Select Port 2 device", 91,295,84,76}, {NULL,Ctrl_lightphaser_png,"","Select Port 2 device", 89,279,88,92}, {NULL,Ctrl_paddle_png ,"","Select Port 2 device", 86,287,96,84}, {NULL,Ctrl_sportspad_png ,"","Select Port 2 device", 95,287,76,84}, + {NULL,Ctrl_ms4play_png ,"","Select Port 1 device", 94,270,80,100}, {NULL,Ctrl_teamplayer_png ,"","Select Port 2 device", 94,279,80,92}, {NULL,Ctrl_4wayplay_png ,"","Select Port 2 device", 98,280,72,92} } }; /* Specific controller options */ - gui_item items_special[4][2] = + gui_item items_special[4][4] = { { /* Gamepad option */ {NULL,Ctrl_pad3b_png,"Pad\nType","Use 3-buttons Pad",528,180,44,28}, - {NULL,Ctrl_pad6b_png,"Pad\nType","Use 6-buttons Pad",528,180,44,28} + {NULL,Ctrl_pad6b_png,"Pad\nType","Use 6-buttons Pad",528,180,44,28}, + {NULL,Ctrl_pad2b_png,"Pad\nType","Use 2-buttons Pad",528,180,44,28}, + {NULL,Ctrl_pad_auto_png,"Pad\nType","Auto-detect Pad type",528,180,44,28}, }, { /* Mouse option */ {NULL,ctrl_option_off_png,"Invert\nMouse","Enable/Disable Y-Axis inversion",534,180,24,24}, {NULL,ctrl_option_on_png ,"Invert\nMouse","Enable/Disable Y-Axis inversion",534,180,24,24}, + {NULL,NULL,"","",0,0,0,0}, + {NULL,NULL,"","",0,0,0,0}, }, { /* Gun option */ {NULL,ctrl_option_off_png,"Show\nCursor","Enable/Disable Lightgun cursor",534,180,24,24}, {NULL,ctrl_option_on_png ,"Show\nCursor","Enable/Disable Lightgun cursor",534,180,24,24}, + {NULL,NULL,"","",0,0,0,0}, + {NULL,NULL,"","",0,0,0,0}, }, { /* no option */ {NULL,NULL,"No Option","",436,180,160,52}, {NULL,NULL,"","",0,0,0,0}, + {NULL,NULL,"","",0,0,0,0}, + {NULL,NULL,"","",0,0,0,0}, } }; @@ -2018,6 +2150,8 @@ static void ctrlmenu(void) } items_special[0][0].texture = gxTextureOpenPNG(items_special[0][0].data,0); items_special[0][1].texture = gxTextureOpenPNG(items_special[0][1].data,0); + items_special[0][2].texture = gxTextureOpenPNG(items_special[0][2].data,0); + items_special[0][3].texture = gxTextureOpenPNG(items_special[0][3].data,0); items_special[2][0].texture = items_special[1][0].texture = gxTextureOpenPNG(items_special[1][0].data,0); items_special[2][1].texture = items_special[1][1].texture = gxTextureOpenPNG(items_special[1][1].data,0); items_device[0].texture = items_special[1][0].texture; @@ -2098,7 +2232,7 @@ static void ctrlmenu(void) if (input.system[0] > SYSTEM_WAYPLAY) { input.system[0] = NO_SYSTEM; - input.system[1] = SYSTEM_MD_GAMEPAD; + input.system[1] = SYSTEM_GAMEPAD; } /* reset I/O ports */ @@ -2148,12 +2282,7 @@ static void ctrlmenu(void) /* fixed configurations */ if (system_hw) { - if (cart.special & HW_J_CART) - { - GUI_WaitPrompt("Error","J-CART detected !"); - break; - } - else if (cart.special & HW_TEREBI_OEKAKI) + if (cart.special & HW_TEREBI_OEKAKI) { GUI_WaitPrompt("Error","Terebi Oekaki detected !"); break; @@ -2177,13 +2306,13 @@ static void ctrlmenu(void) /* allow only one gun type */ if ((input.system[0] == SYSTEM_LIGHTPHASER) && (input.system[1] == SYSTEM_MENACER)) { - input.system[1] += 3; + input.system[1]++; } /* allow only one gun type */ if ((input.system[0] == SYSTEM_LIGHTPHASER) && (input.system[1] == SYSTEM_JUSTIFIER)) { - input.system[1] += 2; + input.system[1]++; } /* 4-wayplay uses both ports */ @@ -2196,7 +2325,7 @@ static void ctrlmenu(void) if (input.system[1] > SYSTEM_WAYPLAY) { input.system[1] = NO_SYSTEM; - input.system[0] = SYSTEM_MD_GAMEPAD; + input.system[0] = SYSTEM_GAMEPAD; } /* reset I/O ports */ @@ -2262,10 +2391,13 @@ static void ctrlmenu(void) } } + /* save device index */ + index = m->selected - 2; + /* update player index */ old_player = player; player = 0; - for (i=0; i<(m->selected-2); i++) + for (i=0; ibuttons[9].shift[3] = 1; } - /* emulated device type */ - type = input.dev[m->selected - 2]; - /* retrieve current player informations */ - switch (type) + switch (input.dev[index]) { + case DEVICE_PAD2B: case DEVICE_PAD3B: case DEVICE_PAD6B: { - items = items_special[0]; - special = &config.input[player].padtype; + if (input.system[index/4] == SYSTEM_MS4PLAY) + { + /* force 2-buttons pad */ + items = items_special[3]; + special = NULL; + } + else + { + items = items_special[0]; + special = &config.input[player].padtype; + } break; } @@ -2323,16 +2462,15 @@ static void ctrlmenu(void) case DEVICE_LIGHTGUN: { items = items_special[2]; - if ((input.system[1] == SYSTEM_MENACER) || (input.system[1] == SYSTEM_JUSTIFIER)) { - /* Menacer & Justifiers affected to devices 4 & 5 */ - special = &config.gun_cursor[m->selected & 1]; + /* Menacer & Justifiers affected to entries 4 & 5 */ + special = &config.gun_cursor[index & 1]; } else { - /* Lightphasers affected to devices 0 & 4 */ - special = &config.gun_cursor[m->selected >> 2]; + /* Lightphasers affected to entries 0 & 4 */ + special = &config.gun_cursor[index / 4]; } break; } @@ -2364,11 +2502,11 @@ static void ctrlmenu(void) GUI_DrawMenuFX(m, 20, 0); /* some devices require analog sticks */ - if ((type == DEVICE_XE_A1P) && ((config.input[player].device == -1) || (config.input[player].device == 1))) + if ((input.dev[index] == DEVICE_XE_A1P) && ((config.input[player].device == -1) || (config.input[player].device == 1))) { GUI_WaitPrompt("Warning","One Analog Stick required !"); } - else if ((type == DEVICE_ACTIVATOR) && ((config.input[player].device != 0) && (config.input[player].device != 3))) + else if ((input.dev[index] == DEVICE_ACTIVATOR) && ((config.input[player].device != 0) && (config.input[player].device != 3))) { GUI_WaitPrompt("Warning","Two Analog Sticks required !"); } @@ -2389,18 +2527,20 @@ static void ctrlmenu(void) { if (special) { - /* switch option */ - *special ^= 1; - /* specific case: controller type */ - if (type < 2) + if (input.dev[index] < 0x03) { - /* re-initialize emulated device */ - input_init(); - input_reset(); + /* switch pad type */ + *special = (*special + 1) & 0x03; - /* update emulated device type */ - type = *special; + /* reinitialize emulated device(s) */ + io_init(); + input_reset(); + } + else + { + /* switch option */ + *special ^= 1; } /* update menu items */ @@ -2556,7 +2696,15 @@ static void ctrlmenu(void) if (config.input[player].device >= 0) { GUI_MsgBoxOpen("Keys Configuration", "",0); - gx_input_Config(config.input[player].port, config.input[player].device, type); + if ((*special == 3) && !system_hw) + { + /* no auto-detected pad type, use 6-buttons key mapping as default */ + gx_input_Config(config.input[player].port, config.input[player].device, DEVICE_PAD6B); + } + else + { + gx_input_Config(config.input[player].port, config.input[player].device, input.dev[index]); + } GUI_MsgBoxClose(); } break; @@ -2687,6 +2835,8 @@ static void ctrlmenu(void) } gxTextureClose(&items_special[0][0].texture); gxTextureClose(&items_special[0][1].texture); + gxTextureClose(&items_special[0][2].texture); + gxTextureClose(&items_special[0][3].texture); gxTextureClose(&items_special[1][0].texture); gxTextureClose(&items_special[1][1].texture); gxTextureClose(&items_device[1].texture); diff --git a/gx/gx_input.c b/gx/gx_input.c index b175cb2..0ea17ed 100644 --- a/gx/gx_input.c +++ b/gx/gx_input.c @@ -233,37 +233,40 @@ static void pad_update(s8 chan, u8 i) return; } + /* Default menu key (right analog stick if not needed by emulated device) */ + if ((input.dev[i] < DEVICE_XE_A1P) && (PAD_SubStickX(chan) > ANALOG_SENSITIVITY)) + { + ConfigRequested = 1; + return; + } + /* Emulated device */ switch (input.dev[i]) { case DEVICE_PAD6B: { - /* Extra buttons */ + /* X,Y,Z,MODE buttons */ if (p & pad_keymap[KEY_BUTTONX]) input.pad[i] |= INPUT_X; if (p & pad_keymap[KEY_BUTTONY]) input.pad[i] |= INPUT_Y; if (p & pad_keymap[KEY_BUTTONZ]) input.pad[i] |= INPUT_Z; if (p & pad_keymap[KEY_MODE]) input.pad[i] |= INPUT_MODE; - - /* default inputs are checked below */ } case DEVICE_PAD3B: { - /* Default menu key (right analog stick) */ - if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY) - { - ConfigRequested = 1; - return; - } + /* A button */ + if (p & pad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A; + } + case DEVICE_PAD2B: + { /* D-PAD */ if ((p & PAD_BUTTON_UP) || (y > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_UP; else if ((p & PAD_BUTTON_DOWN) || (y < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_DOWN; if ((p & PAD_BUTTON_LEFT) || (x < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_LEFT; else if ((p & PAD_BUTTON_RIGHT) || (x > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_RIGHT; - /* Buttons */ - if (p & pad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A; + /* default buttons */ if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_B; if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_C; if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_START; @@ -308,19 +311,10 @@ static void pad_update(s8 chan, u8 i) { /* Y analog position [0-255] */ input.analog[i][1] = y ? (127 - y) : (128 - y); - - /* default inputs are checked below */ - } + } case DEVICE_PADDLE: { - /* Default menu key (right analog stick) */ - if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY) - { - ConfigRequested = 1; - return; - } - /* X analog position [0-255] */ input.analog[i][0] = (x + 128); @@ -332,38 +326,8 @@ static void pad_update(s8 chan, u8 i) break; } - case DEVICE_PAD2B: - { - /* Default menu key (right analog stick) */ - if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY) - { - ConfigRequested = 1; - return; - } - - /* D-PAD */ - if ((p & PAD_BUTTON_UP) || (y > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_UP; - else if ((p & PAD_BUTTON_DOWN) || (y < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_DOWN; - if ((p & PAD_BUTTON_LEFT) || (x < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_LEFT; - else if ((p & PAD_BUTTON_RIGHT) || (x > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_RIGHT; - - /* Buttons */ - if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_BUTTON1; - if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_BUTTON2; - if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_START; - - break; - } - case DEVICE_LIGHTGUN: { - /* Default menu key (right analog stick) */ - if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY) - { - ConfigRequested = 1; - return; - } - /* Gun screen position (x,y) */ input.analog[i][0] += x / ANALOG_SENSITIVITY; input.analog[i][1] -= y / ANALOG_SENSITIVITY; @@ -385,13 +349,6 @@ static void pad_update(s8 chan, u8 i) case DEVICE_MOUSE: { - /* Default menu key (right analog stick) */ - if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY) - { - ConfigRequested = 1; - return; - } - /* Mouse relative movement (-255,255) */ input.analog[i][0] = (x / ANALOG_SENSITIVITY) * 2; input.analog[i][1] = (y / ANALOG_SENSITIVITY) * 2; @@ -413,13 +370,6 @@ static void pad_update(s8 chan, u8 i) case DEVICE_PICO: { - /* Default menu key (right analog stick) */ - if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY) - { - ConfigRequested = 1; - return; - } - /* D-PAD */ if (p & PAD_BUTTON_UP) input.pad[0] |= INPUT_UP; else if (p & PAD_BUTTON_DOWN) input.pad[0] |= INPUT_DOWN; @@ -450,13 +400,6 @@ static void pad_update(s8 chan, u8 i) case DEVICE_TEREBI: { - /* Default menu key (right analog stick) */ - if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY) - { - ConfigRequested = 1; - return; - } - /* PEN screen position (x,y) */ input.analog[0][0] += x / ANALOG_SENSITIVITY; input.analog[0][1] -= y / ANALOG_SENSITIVITY; @@ -763,7 +706,7 @@ static void wpad_update(s8 chan, u8 i, u32 exp) { case DEVICE_PAD6B: { - /* Extra buttons */ + /* X,Y,Z,MODE buttons */ if (p & wpad_keymap[KEY_BUTTONX]) input.pad[i] |= INPUT_X; if (p & wpad_keymap[KEY_BUTTONY]) input.pad[i] |= INPUT_Y; if (p & wpad_keymap[KEY_BUTTONZ]) input.pad[i] |= INPUT_Z; @@ -772,14 +715,19 @@ static void wpad_update(s8 chan, u8 i, u32 exp) case DEVICE_PAD3B: { - /* D- PAD */ + /* A button */ + if (p & wpad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A; + } + + case DEVICE_PAD2B: + { + /* D-PAD */ if ((p & wpad_dirmap[exp][PAD_UP]) || (y > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_UP; else if ((p & wpad_dirmap[exp][PAD_DOWN]) || (y < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_DOWN; if ((p & wpad_dirmap[exp][PAD_LEFT]) || (x < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_LEFT; else if ((p & wpad_dirmap[exp][PAD_RIGHT]) || (x > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_RIGHT; - /* Buttons */ - if (p & wpad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A; + /* default buttons */ if (p & wpad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_B; if (p & wpad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_C; if (p & wpad_keymap[KEY_START]) input.pad[i] |= INPUT_START; @@ -791,7 +739,7 @@ static void wpad_update(s8 chan, u8 i, u32 exp) { /* Left Stick analog position [0-255] */ input.analog[i][0] = (x + 128); - input.analog[i][1] = y ? (127 - y) : (128 - y); + input.analog[i][1] = y ? (127 - y) : 128; /* Right Stick analog position [0-255] */ if (exp == WPAD_EXP_CLASSIC) @@ -886,22 +834,6 @@ static void wpad_update(s8 chan, u8 i, u32 exp) break; } - case DEVICE_PAD2B: - { - /* D-PAD */ - if ((p & wpad_dirmap[exp][PAD_UP]) || (y > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_UP; - else if ((p & wpad_dirmap[exp][PAD_DOWN]) || (y < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_DOWN; - if ((p & wpad_dirmap[exp][PAD_LEFT]) || (x < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_LEFT; - else if ((p & wpad_dirmap[exp][PAD_RIGHT]) || (x > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_RIGHT; - - /* Buttons */ - if (p & wpad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_BUTTON1; - if (p & wpad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_BUTTON2; - if (p & wpad_keymap[KEY_START]) input.pad[i] |= INPUT_START; - - break; - } - case DEVICE_LIGHTGUN: { /* Gun screen position (x,y) */ @@ -1126,7 +1058,7 @@ void gx_input_Init(void) PAD_Init(); #ifdef HW_RVL WPAD_Init(); - WPAD_SetIdleTimeout(60); + WPAD_SetIdleTimeout(config.autosleep ? 300 : 1800); WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR); WPAD_SetVRes(WPAD_CHAN_ALL,640,480); #endif @@ -1261,7 +1193,7 @@ void gx_input_SetDefault(void) { config.input[i].device = -1; config.input[i].port = i%4; - config.input[i].padtype = 0; + config.input[i].padtype = DEVICE_PAD2B | DEVICE_PAD3B | DEVICE_PAD6B; /* autodetected */ } #ifdef HW_RVL diff --git a/gx/gx_video.c b/gx/gx_video.c index 662d450..bb3c765 100644 --- a/gx/gx_video.c +++ b/gx/gx_video.c @@ -1557,17 +1557,37 @@ void gx_video_Start(void) switch (config.ntsc) { case 1: + { sms_ntsc_init(sms_ntsc, &sms_ntsc_composite); md_ntsc_init(md_ntsc, &md_ntsc_composite); break; + } + case 2: + { sms_ntsc_init(sms_ntsc, &sms_ntsc_svideo); md_ntsc_init(md_ntsc, &md_ntsc_svideo); break; + } + case 3: + { sms_ntsc_init(sms_ntsc, &sms_ntsc_rgb); md_ntsc_init(md_ntsc, &md_ntsc_rgb); + } + + case 4: + { + md_ntsc_setup_t ntsc_custom = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + ntsc_custom.sharpness = config.ntsc_sharpness; + ntsc_custom.resolution = config.ntsc_resolution; + ntsc_custom.artifacts = config.ntsc_artifacts; + ntsc_custom.fringing = config.ntsc_fringing; + ntsc_custom.bleed = config.ntsc_bleed; + sms_ntsc_init(sms_ntsc, (sms_ntsc_setup_t *)&ntsc_custom); + md_ntsc_init(md_ntsc, &ntsc_custom); break; + } } } @@ -1630,6 +1650,7 @@ void gx_video_Start(void) } /* GX emulation rendering */ + gxClearScreen((GXColor)BLACK); gxResetRendering(0); /* resynchronize emulation with VSYNC */ diff --git a/gx/images/Ctrl_gamepad.png b/gx/images/Ctrl_gamepad.png new file mode 100644 index 0000000..c4e8a2a Binary files /dev/null and b/gx/images/Ctrl_gamepad.png differ diff --git a/gx/images/Ctrl_gamepad_md.png b/gx/images/Ctrl_gamepad_md.png deleted file mode 100644 index 298b352..0000000 Binary files a/gx/images/Ctrl_gamepad_md.png and /dev/null differ diff --git a/gx/images/Ctrl_gamepad_ms.png b/gx/images/Ctrl_gamepad_ms.png deleted file mode 100644 index 4428f41..0000000 Binary files a/gx/images/Ctrl_gamepad_ms.png and /dev/null differ diff --git a/gx/images/Ctrl_ms4play.png b/gx/images/Ctrl_ms4play.png new file mode 100644 index 0000000..3a05924 Binary files /dev/null and b/gx/images/Ctrl_ms4play.png differ diff --git a/gx/images/Ctrl_pad2b.png b/gx/images/Ctrl_pad2b.png new file mode 100644 index 0000000..1d5883e Binary files /dev/null and b/gx/images/Ctrl_pad2b.png differ diff --git a/gx/images/Ctrl_pad_auto.png b/gx/images/Ctrl_pad_auto.png new file mode 100644 index 0000000..8ac41cd Binary files /dev/null and b/gx/images/Ctrl_pad_auto.png differ diff --git a/libretro/libretro.c b/libretro/libretro.c index 087861f..e8b68e5 100644 --- a/libretro/libretro.c +++ b/libretro/libretro.c @@ -443,10 +443,13 @@ static void extract_directory(char *buf, const char *path, size_t size) buf[0] = '\0'; } -static void update_viewport(void) +static bool update_viewport(void) { - vwidth = bitmap.viewport.w + (bitmap.viewport.x * 2); - vheight = bitmap.viewport.h + (bitmap.viewport.y * 2); + int ow = vwidth; + int oh = vheight; + + vwidth = bitmap.viewport.w + (bitmap.viewport.x * 2); + vheight = bitmap.viewport.h + (bitmap.viewport.y * 2); if (config.ntsc) { @@ -460,6 +463,8 @@ static void update_viewport(void) { vheight = vheight * 2; } + + return ((ow != vwidth) || (oh != vheight)); } static void check_variables(void) @@ -712,8 +717,8 @@ static void configure_controls(void) int i; struct retro_variable var; - input.system[0] = SYSTEM_MD_GAMEPAD; - input.system[1] = SYSTEM_MD_GAMEPAD; + input.system[0] = SYSTEM_GAMEPAD; + input.system[1] = SYSTEM_GAMEPAD; var.key = "padtype"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); @@ -726,15 +731,9 @@ static void configure_controls(void) else if (!strcmp(var.value, "2-buttons")) for(i = 0; i < MAX_INPUTS; i++) config.input[i].padtype = DEVICE_PAD2B; - else if ((system_hw & SYSTEM_PBC) != SYSTEM_MD) - for(i = 0; i < MAX_INPUTS; i++) - config.input[i].padtype = DEVICE_PAD2B; - else if (rominfo.peripherals & 2) - for(i = 0; i < MAX_INPUTS; i++) - config.input[i].padtype = DEVICE_PAD6B; else for(i = 0; i < MAX_INPUTS; i++) - config.input[i].padtype = DEVICE_PAD3B; + config.input[i].padtype = DEVICE_PAD2B | DEVICE_PAD3B | DEVICE_PAD6B; var.key = "multitap"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); @@ -746,6 +745,8 @@ static void configure_controls(void) input.system[1] = SYSTEM_TEAMPLAYER; else if (!strcmp(var.value, "teamplayer 1&2")) input.system[0] = input.system[1] = SYSTEM_TEAMPLAYER; + else if (!strcmp(var.value, "master system 4p")) + input.system[0] = SYSTEM_MS4PLAY; var.key = "portb"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); @@ -769,7 +770,7 @@ void retro_set_environment(retro_environment_t cb) { "addr_error", "68k address error; enabled|disabled" }, { "lock_on", "Cartridge lock-on; disabled|game genie|action replay (pro)|sonic & knuckles" }, { "padtype", "Gamepad type; auto|6-buttons|3-buttons|2-buttons" }, - { "multitap", "Multi Tap; disabled|4-wayplay|teamplayer (port 1)|teamplayer (port 2)|teamplayer (both)" }, + { "multitap", "Multi Tap; disabled|4-wayplay|teamplayer (port 1)|teamplayer (port 2)|teamplayer (both)|master system 4p" }, { "portb", "Control Port 2; enabled|disabled" }, { "ym2413", "Master System FM; auto|disabled|enabled" }, { "dac_bits", "YM2612 DAC quantization; disabled|enabled" }, @@ -1004,11 +1005,13 @@ void retro_run(void) if (bitmap.viewport.changed & 1) { - struct retro_system_av_info info; bitmap.viewport.changed &= ~1; - update_viewport(); - retro_get_system_av_info(&info); - environ_cb(RETRO_ENVIRONMENT_SET_SYSTEM_AV_INFO, &info); + if (update_viewport()) + { + struct retro_system_av_info info; + retro_get_system_av_info(&info); + environ_cb(RETRO_ENVIRONMENT_SET_SYSTEM_AV_INFO, &info); + } } video_cb(bitmap.data, vwidth, vheight, 720 * 2); diff --git a/sdl/config.c b/sdl/config.c index 408cac5..00ae20c 100644 --- a/sdl/config.c +++ b/sdl/config.c @@ -40,13 +40,14 @@ void set_config_defaults(void) config.render = 0; /* 1 = double resolution output (only when interlaced mode 2 is enabled) */ /* controllers options */ - input.system[0] = SYSTEM_MD_GAMEPAD; - input.system[1] = SYSTEM_MD_GAMEPAD; + input.system[0] = SYSTEM_GAMEPAD; + input.system[1] = SYSTEM_GAMEPAD; config.gun_cursor[0] = 1; config.gun_cursor[1] = 1; config.invert_mouse = 0; for (i=0;i