This commit is contained in:
twinaphex 2014-04-13 17:06:34 +02:00
commit ece1907480
29 changed files with 785 additions and 532 deletions

View File

@ -1,7 +1,7 @@
About 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). 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. 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: (*) 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 Features

Binary file not shown.

BIN
builds/genplus_cube.dol Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 MiB

BIN
builds/genplus_wii.dol Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 MiB

View File

@ -2,7 +2,7 @@
* Genesis Plus * Genesis Plus
* Mega Drive cartridge hardware support * 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 * Many cartridge protections were initially documented by Haze
* (http://haze.mameworld.info/) * (http://haze.mameworld.info/)
@ -419,7 +419,7 @@ void md_cart_init(void)
if (input.system[1] != SYSTEM_WAYPLAY) if (input.system[1] != SYSTEM_WAYPLAY)
{ {
old_system[1] = input.system[1]; old_system[1] = input.system[1];
input.system[1] = SYSTEM_MD_GAMEPAD; input.system[1] = SYSTEM_GAMEPAD;
} }
/* extra connectors mapped at $38xxxx or $3Fxxxx */ /* extra connectors mapped at $38xxxx or $3Fxxxx */

View File

@ -77,151 +77,151 @@ typedef struct
static const rominfo_t game_list[] = static const rominfo_t game_list[] =
{ {
/* program requiring Mega Drive VDP (Mode 5) */ /* 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 */ /* 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) */ /* 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 */ /* 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 */ /* games using various Korean mappers */
{0x445525E2, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Penguin Adventure (KR) */ {0x445525E2, 0, 0, SYSTEM_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) */ {0x83F0EEDE, 0, 0, SYSTEM_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) */ {0xA05258F5, 0, 0, SYSTEM_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) */ {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_MS_GAMEPAD, MAPPER_MSX, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Cyborg Z (KR) */ {0x77EFE84A, 0, 0, SYSTEM_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) */ {0xF89AF3CC, 0, 0, SYSTEM_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) */ {0x9195C34C, 0, 0, SYSTEM_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) */ {0xE316C06D, 0, 0, SYSTEM_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) */ {0x0A77FA5E, 0, 0, SYSTEM_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) */ {0xA67F2A5C, 0, 0, SYSTEM_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) */ {0x89B79E77, 0, 0, SYSTEM_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) */ {0x18FB98A3, 0, 0, SYSTEM_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) */ {0x97D03541, 0, 0, SYSTEM_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) */ {0x192949D5, 0, 0, SYSTEM_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) */ {0x9FA727A0, 0, 0, SYSTEM_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) */ {0xFB481971, 0, 0, SYSTEM_GAMEPAD, MAPPER_KOREA_16K, SYSTEM_GGMS, REGION_USA}, /* Street Hero [Proto 1] [SMS-GG] (US) */
/* games using Codemaster mapper */ /* games using Codemaster mapper */
{0x29822980, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Cosmic Spacehead */ {0x29822980, 0, 0, SYSTEM_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] */ {0x8813514B, 0, 0, SYSTEM_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 */ {0xB9664AE1, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Fantastic Dizzy */
{0xA577CE46, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Micro Machines */ {0xA577CE46, 0, 0, SYSTEM_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] */ {0xEA5C3A6F, 0, 0, SYSTEM_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] */ {0xAA140C9C, 0, 0, SYSTEM_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] */ {0xC888222B, 0, 0, SYSTEM_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] */ {0x76C5BDFB, 0, 0, SYSTEM_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]*/ {0x6CAA625B, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Cosmic Spacehead [GG]*/
{0x152F0DCC, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Drop Zone */ {0x152F0DCC, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Drop Zone */
{0x5E53C7F7, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Ernie Els Golf */ {0x5E53C7F7, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Ernie Els Golf */
{0xD9A7F170, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Man Overboard! */ {0xD9A7F170, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Man Overboard! */
{0xF7C524F6, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* Micro Machines [GG] */ {0xF7C524F6, 0, 0, SYSTEM_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 */ {0xDBE8895C, 0, 0, SYSTEM_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 */ {0xC1756BEE, 0, 0, SYSTEM_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 */ {0x72981057, 0, 0, SYSTEM_GAMEPAD, MAPPER_CODIES, SYSTEM_GG, REGION_USA}, /* CJ Elephant Fugitive */
/* games using serial EEPROM */ /* games using serial EEPROM */
{0x36EBCD6D, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_93C46, SYSTEM_GG, REGION_USA}, /* Majors Pro Baseball */ {0x36EBCD6D, 0, 0, SYSTEM_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] */ {0x3D8D0DD6, 0, 0, SYSTEM_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] */ {0xBB38CFD7, 0, 0, SYSTEM_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 */ {0x578A8A38, 0, 0, SYSTEM_GAMEPAD, MAPPER_93C46, SYSTEM_GG, REGION_USA}, /* World Series Baseball '95 */
/* games using Terebi Oekaki graphic board */ /* 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) */ /* games using 2KB external RAM (volatile) */
{0x092F29D6, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_RAM_2K, SYSTEM_SG, REGION_JAPAN_NTSC}, /* The Castle (J) */ {0x092F29D6, 0, 0, SYSTEM_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) */ {0xAF4F14BC, 0, 0, SYSTEM_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) */ {0x1D1A0CA3, 0, 0, SYSTEM_GAMEPAD, MAPPER_RAM_2K, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Othello (TW) */
/* games requiring SG-1000 II 8K RAM extension adapter */ /* 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) */ {0xCE5648C3, 0, 0, SYSTEM_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) */ {0x223397A1, 0, 0, SYSTEM_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) */ {0x281D2888, 0, 0, SYSTEM_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) */ {0x306D5F78, 0, 0, SYSTEM_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) */ {0x29E047CC, 0, 0, SYSTEM_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) */ {0x5CBD1163, 0, 0, SYSTEM_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) */ {0x2E7166D5, 0, 0, SYSTEM_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) */ {0xC550B4F0, 0, 0, SYSTEM_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) */ {0xFC87463C, 0, 0, SYSTEM_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) */ {0x69FC1494, 0, 0, SYSTEM_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) */ {0xFFC4EE3F, 0, 0, SYSTEM_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) */ {0x2E366CCF, 0, 0, SYSTEM_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) */ {0xAAAC12CF, 0, 0, SYSTEM_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) */ {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) */ /* 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) */ {0x7F7F009D, 0, 0, SYSTEM_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 */ {0x77DB4704, 0, 0, SYSTEM_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 */ {0xC5A67B95, 0, 0, SYSTEM_GAMEPAD, MAPPER_NONE, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Othello Multivision BIOS */
/* games requiring Japanese region setting */ /* games requiring Japanese region setting */
{0x71DEBA5A, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GG, REGION_JAPAN_NTSC}, /* Pop Breaker */ {0x71DEBA5A, 0, 0, SYSTEM_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) */ {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) */ /* 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) */ {0xBD1CC7DF, 0, 0, SYSTEM_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) */ {0x6D309AC5, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Power Boggle Boggle (KR) */
/* games requiring random RAM pattern initialization */ /* games requiring random RAM pattern initialization */
{0x08BF3DE3, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_NONE, SYSTEM_MARKIII, REGION_JAPAN_NTSC}, /* Alibaba and 40 Thieves (KR) */ {0x08BF3DE3, 0, 0, SYSTEM_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) */ {0x643B6B76, 0, 0, SYSTEM_GAMEPAD, MAPPER_NONE, SYSTEM_MARKIII, REGION_JAPAN_NTSC}, /* Block Hole (KR) */
/* games requiring PAL timings */ /* games requiring PAL timings */
{0x72420F38, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Addams Familly */ {0x72420F38, 0, 0, SYSTEM_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 */ {0x2D48C1D3, 0, 0, SYSTEM_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) */ {0x1CBB7BF1, 0, 0, SYSTEM_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 */ {0x1B10A951, 0, 0, SYSTEM_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 */ {0xC0E25D62, 0, 0, SYSTEM_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) */ {0x45C50294, 0, 0, SYSTEM_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 */ {0xC9DBF936, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Home Alone */
{0x0047B615, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Predator2 */ {0x0047B615, 0, 0, SYSTEM_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) */ {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_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* RoboCop 3 */ {0x9F951756, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* RoboCop 3 */
{0xF8176918, 0, 0, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* Sensible Soccer */ {0xF8176918, 0, 0, SYSTEM_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 */ {0x1575581D, 0, 0, SYSTEM_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) */ {0x96B3F29E, 0, 0, SYSTEM_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] */ {0x5B3B922C, 0, 0, SYSTEM_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] */ {0xD6F2BFCA, 0, 0, SYSTEM_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] */ {0xCA1D3752, 0, 0, SYSTEM_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. */ {0x85CFC9C9, 0, 0, SYSTEM_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] */ {0x332A847D, 0, 0, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_EUROPE}, /* NBA Jam [Proto] */
/* games running in Game Gear MS compatibility mode */ /* 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] */ {0x59840FD6, 0, 0, SYSTEM_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] */ {0x9C76FB3A, 0, 0, SYSTEM_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] */ {0xC8381DEF, 0, 0, SYSTEM_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] */ {0xDA8E95A9, 0, 0, SYSTEM_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] */ {0x1D93246E, 0, 0, SYSTEM_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] */ {0xA2F9C7AF, 0, 0, SYSTEM_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] */ {0x01EAB89D, 0, 0, SYSTEM_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] */ {0xF037EC00, 0, 0, SYSTEM_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] */ {0xE5F789B9, 0, 0, SYSTEM_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] */ {0x311D2863, 0, 0, SYSTEM_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] */ {0x45F058D6, 0, 0, SYSTEM_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] */ {0x56201996, 0, 0, SYSTEM_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] */ {0x10DBBEF4, 0, 0, SYSTEM_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] */ {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_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Taito Chase H.Q (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_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Alex Kidd in Miracle World (TW) [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_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_GGMS, REGION_JAPAN_NTSC}, /* Olympic Gold (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 */ /* games requiring 3-D Glasses */
{0x6BD5C2BF, 1, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Space Harrier 3-D */ {0x6BD5C2BF, 1, 1, SYSTEM_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 */ {0x8ECD201C, 1, 1, SYSTEM_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) */ {0xFBF96C81, 1, 1, SYSTEM_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] */ {0x58D5FC48, 1, 1, SYSTEM_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 */ {0x31B8040B, 1, 1, SYSTEM_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 */ {0xABD48AD2, 1, 1, SYSTEM_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 */ {0xA3EF13CB, 1, 1, SYSTEM_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] */ {0xBBA74147, 1, 1, SYSTEM_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 */ {0xD6F43DDA, 1, 1, SYSTEM_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 */ {0x871562b0, 1, 1, SYSTEM_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) */ {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 */ /* games requiring 3-D Glasses & Sega Light Phaser */
{0xFBE5CFBB, 1, 0, SYSTEM_LIGHTPHASER, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Missile Defense 3D */ {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 */ {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 */ {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 */ /* games supporting YM2413 FM */
{0x1C951F8E, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* After Burner */ {0x1C951F8E, 0, 1, SYSTEM_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 */ {0xC13896D5, 0, 1, SYSTEM_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 */ {0x5CBFE997, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Alien Syndrome */
{0xBBA2FE98, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Altered Beast */ {0xBBA2FE98, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Altered Beast */
{0xFF614EB3, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Aztec Adventure */ {0xFF614EB3, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Aztec Adventure */
{0x3084CF11, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Bomber Raid */ {0x3084CF11, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Bomber Raid */
{0xAC6009A7, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* California Games */ {0xAC6009A7, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* California Games */
{0xA4852757, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Captain Silver */ {0xA4852757, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Captain Silver */
{0xB81F6FA5, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Captain Silver (U) */ {0xB81F6FA5, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Captain Silver (U) */
{0x3CFF6E80, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Casino Games */ {0x3CFF6E80, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Casino Games */
{0xE7F62E6D, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Cloud Master */ {0xE7F62E6D, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Cloud Master */
{0x908E7524, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Cyborg Hunter */ {0x908E7524, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Cyborg Hunter */
{0xA55D89F3, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Double Dragon */ {0xA55D89F3, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Double Dragon */
{0xB8B141F9, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Fantasy Zone II */ {0xB8B141F9, 0, 1, SYSTEM_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 */ {0xD29889AD, 0, 1, SYSTEM_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 */ {0xA4AC35D8, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Galaxy Force */
{0x6C827520, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Galaxy Force (U) */ {0x6C827520, 0, 1, SYSTEM_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) */ {0x1890F407, 0, 1, SYSTEM_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 */ {0xB746A6F5, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Global Defense */
{0x91A0FC4E, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Global Defense [Proto] */ {0x91A0FC4E, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Global Defense [Proto] */
{0x48651325, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Golfamania */ {0x48651325, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Golfamania */
{0x5DABFDC3, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Golfamania [Proto] */ {0x5DABFDC3, 0, 1, SYSTEM_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 */ {0xA51376FE, 0, 1, SYSTEM_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 */ {0x98E4AE4A, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Great Golf */
{0x516ED32E, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Kenseiden */ {0x516ED32E, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Kenseiden */
{0xE8511B08, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Lord of The Sword */ {0xE8511B08, 0, 1, SYSTEM_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 */ {0x0E333B6E, 0, 1, SYSTEM_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] */ {0x301A59AA, 0, 1, SYSTEM_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) */ {0x01D67C0B, 0, 1, SYSTEM_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 */ {0x5589D8D2, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Out Run */
{0xE030E66C, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Parlour Games */ {0xE030E66C, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Parlour Games */
{0xF97E9875, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Penguin Land */ {0xF97E9875, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Penguin Land */
{0x4077EFD9, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Power Strike */ {0x4077EFD9, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Power Strike */
{0xBB54B6B0, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* R-Type */ {0xBB54B6B0, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* R-Type */
{0x42FC47EE, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Rampage */ {0x42FC47EE, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Rampage */
{0xC547EB1B, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Rastan */ {0xC547EB1B, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Rastan */
{0x9A8B28EC, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Scramble Spirits */ {0x9A8B28EC, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Scramble Spirits */
{0xAAB67EC3, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Shanghai */ {0xAAB67EC3, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Shanghai */
{0x0C6FAC4E, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Shinobi */ {0x0C6FAC4E, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Shinobi */
{0x4752CAE7, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* SpellCaster */ {0x4752CAE7, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* SpellCaster */
{0x1A390B93, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Tennis Ace */ {0x1A390B93, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Tennis Ace */
{0xAE920E4B, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Thunder Blade */ {0xAE920E4B, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Thunder Blade */
{0x51BD14BE, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Time Soldiers */ {0x51BD14BE, 0, 1, SYSTEM_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) */ {0x22CCA9BB, 0, 1, SYSTEM_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 */ {0xB52D60C8, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Ultima IV */
{0xDE9F8517, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Ultima IV [Proto] */ {0xDE9F8517, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Ultima IV [Proto] */
{0xDFB0B161, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS2, REGION_USA}, /* Vigilante */ {0xDFB0B161, 0, 1, SYSTEM_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 */ {0x679E1676, 0, 1, SYSTEM_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 */ {0x8CBEF0C1, 0, 1, SYSTEM_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 */ {0x2F2E3BC9, 0, 1, SYSTEM_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) */ {0x48D44A13, 0, 1, SYSTEM_GAMEPAD, MAPPER_NONE, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* BIOS (J) */
{0xD8C4165B, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Aleste */ {0xD8C4165B, 0, 1, SYSTEM_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) */ {0x4CC11DF9, 0, 1, SYSTEM_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 */ {0xE421E466, 0, 1, SYSTEM_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 */ {0x2BCDB8FA, 0, 1, SYSTEM_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] */ {0x56BD2455, 0, 1, SYSTEM_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) */ {0xC722FB42, 0, 1, SYSTEM_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) */ {0x7ABC70E9, 0, 1, SYSTEM_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 */ {0x6586BD1F, 0, 1, SYSTEM_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] */ {0x4847BC91, 0, 1, SYSTEM_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 */ {0xB9FDF6D9, 0, 1, SYSTEM_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 */ {0x955A009E, 0, 1, SYSTEM_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) */ {0x05EA5353, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Kenseiden (J) */
{0xD11D32E4, 0, 1, SYSTEM_MS_GAMEPAD, MAPPER_SEGA, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Kujakuou */ {0xD11D32E4, 0, 1, SYSTEM_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 */ {0xAA7D6F45, 0, 1, SYSTEM_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 */ {0xBF0411AD, 0, 1, SYSTEM_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] */ {0x21A21352, 0, 1, SYSTEM_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 */ {0x5B5F9106, 0, 1, SYSTEM_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 */ {0xBEA27D5C, 0, 1, SYSTEM_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) */ {0x6605D36A, 0, 1, SYSTEM_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) */ {0xE1FFF1BB, 0, 1, SYSTEM_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 */ {0x11645549, 0, 1, SYSTEM_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 */ {0x7E0EF8CB, 0, 1, SYSTEM_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 */ {0xB1DA6A30, 0, 1, SYSTEM_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 */ {0x8132AB2C, 0, 1, SYSTEM_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) */ {0xC0CE19B1, 0, 1, SYSTEM_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) */ {0x07301F83, 0, 1, SYSTEM_GAMEPAD, MAPPER_SEGA, SYSTEM_PBC, REGION_JAPAN_NTSC} /* Phantasy Star [Megadrive] (J) */
}; };
/* Cartridge & BIOS ROM hardware */ /* Cartridge & BIOS ROM hardware */
@ -373,9 +377,6 @@ void sms_cart_init(void)
/* game CRC */ /* game CRC */
uint32 crc = crc32(0, cart.rom, cart.romsize); 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) */ /* unmapped memory return $FF on read (mapped to unused cartridge areas $510000-$5103FF & $510400-$5107FF) */
memset(cart.rom + 0x510000, 0xFF, 0x800); memset(cart.rom + 0x510000, 0xFF, 0x800);
@ -408,8 +409,18 @@ void sms_cart_init(void)
/* auto-detect cartridge mapper */ /* auto-detect cartridge mapper */
cart_rom.mapper = game_list[i].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 */ /* auto-detect required peripherals */
device = game_list[i].peripheral; input.system[0] = input.system[1] = game_list[i].peripheral;
/* auto-detect 3D glasses support */ /* auto-detect 3D glasses support */
cart.special = game_list[i].g_3d; cart.special = game_list[i].g_3d;
@ -467,25 +478,11 @@ void sms_cart_init(void)
/* enable cartridge backup memory by default */ /* enable cartridge backup memory by default */
sram.on = 1; sram.on = 1;
/* save current settings */ /* default gun offset for Light Phaser */
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 */
input.x_offset = 20; input.x_offset = 20;
input.y_offset = 0; input.y_offset = 0;
/* SpaceGun & Gangster Town use different gun offset */ /* SpaceGun & Gangster Town use specific gun offset */
if ((crc == 0x5359762D) || (crc == 0x5FC74D2A)) if ((crc == 0x5359762D) || (crc == 0x5FC74D2A))
{ {
input.x_offset = 16; input.x_offset = 16;

View File

@ -1,9 +1,9 @@
/*************************************************************************************** /***************************************************************************************
* Genesis Plus * Genesis Plus
* 3-Buttons & 6-Buttons pad support * 2-Buttons, 3-Buttons & 6-Buttons controller support
* Support for J-CART & 4-Way Play adapters * 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 * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -47,7 +47,13 @@ static struct
uint8 Timeout; uint8 Timeout;
} gamepad[MAX_DEVICES]; } gamepad[MAX_DEVICES];
static uint8 pad_index; static struct
{
uint8 Latch;
uint8 Counter;
} flipflop[2];
static uint8 latch;
void gamepad_reset(int port) void gamepad_reset(int port)
@ -57,8 +63,12 @@ void gamepad_reset(int port)
gamepad[port].Counter = 0; gamepad[port].Counter = 0;
gamepad[port].Timeout = 0; gamepad[port].Timeout = 0;
/* reset pad index (4-WayPlay) */ /* reset 4-WayPlay latch */
pad_index = 0; latch = 0;
/* reset Master System multitap flip-flop */
flipflop[port>>2].Latch = 0;
flipflop[port>>2].Counter = 0;
} }
void gamepad_refresh(int port) 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) 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 */ /* TR & TL on port B select controller # (0-3) */
return 0x70; return gamepad_read(latch);
} }
unsigned char wayplay_2_read(void) 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) void wayplay_1_write(unsigned char data, unsigned char mask)
{ {
if (pad_index < 4) /* TR & TL on port B select controller # (0-3) */
{ gamepad_write(latch & 0x03, data, mask);
gamepad_write(pad_index, data, mask);
}
} }
void wayplay_2_write(unsigned char data, unsigned char mask) void wayplay_2_write(unsigned char data, unsigned char mask)
{ {
if ((mask & 0x70) == 0x70) /* latch TH, TR & TL state on port B */
{ latch = ((data & mask) >> 4) & 0x07;
pad_index = (data & 0x70) >> 4;
}
} }
@ -239,3 +247,48 @@ void jcart_write(unsigned int address, unsigned int data)
gamepad_write(6, (data & 1) << 6, 0x40); gamepad_write(6, (data & 1) << 6, 0x40);
return; 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;
}

View File

@ -1,9 +1,9 @@
/*************************************************************************************** /***************************************************************************************
* Genesis Plus * Genesis Plus
* 3-Buttons & 6-Buttons pad support * 2-Buttons, 3-Buttons & 6-Buttons controller support
* Support for J-CART & 4-Way Play adapters * 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 * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * 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 void wayplay_2_write(unsigned char data, unsigned char mask);
extern unsigned int jcart_read(unsigned int address); extern unsigned int jcart_read(unsigned int address);
extern void jcart_write(unsigned int address, unsigned int data); 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 #endif

View File

@ -3,7 +3,7 @@
* Input peripherals support * Input peripherals support
* *
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) * 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 * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -54,7 +54,7 @@ int old_system[2] = {-1,-1};
void input_init(void) void input_init(void)
{ {
int i; int i, padtype;
int player = 0; int player = 0;
for (i=0; i<MAX_DEVICES; i++) for (i=0; i<MAX_DEVICES; i++)
@ -77,18 +77,31 @@ void input_init(void)
return; return;
} }
/* default gamepad type */
if (romtype & SYSTEM_MD)
{
/* 3-buttons or 6-buttons */
padtype = (rominfo.peripherals & 2) ? DEVICE_PAD6B : DEVICE_PAD3B;
}
else
{
/* 2-buttons */
padtype = DEVICE_PAD2B;
}
switch (input.system[0]) switch (input.system[0])
{ {
case SYSTEM_MS_GAMEPAD: case SYSTEM_GAMEPAD:
{ {
input.dev[0] = DEVICE_PAD2B; /* 2-buttons, 3-buttons or 6-buttons control pad */
player++; if (config.input[player].padtype != (DEVICE_PAD2B | DEVICE_PAD3B | DEVICE_PAD6B))
break; {
} input.dev[0] = config.input[player].padtype;
}
case SYSTEM_MD_GAMEPAD: else
{ {
input.dev[0] = config.input[player].padtype; input.dev[0] = padtype;
}
player++; player++;
break; break;
} }
@ -120,7 +133,15 @@ void input_init(void)
{ {
if (player < MAX_INPUTS) if (player < MAX_INPUTS)
{ {
input.dev[i] = config.input[player].padtype; /* only allow 3-buttons or 6-buttons control pad */
if (config.input[player].padtype != (DEVICE_PAD2B | DEVICE_PAD3B | DEVICE_PAD6B))
{
input.dev[i] = config.input[player].padtype & DEVICE_PAD6B;
}
else
{
input.dev[i] = padtype & DEVICE_PAD6B;
}
player++; player++;
} }
} }
@ -133,7 +154,15 @@ void input_init(void)
{ {
if (player < MAX_INPUTS) if (player < MAX_INPUTS)
{ {
input.dev[i] = config.input[player].padtype; /* only allow 3-buttons or 6-buttons control pad */
if (config.input[player].padtype != (DEVICE_PAD2B | DEVICE_PAD3B | DEVICE_PAD6B))
{
input.dev[i] = config.input[player].padtype & DEVICE_PAD6B;
}
else
{
input.dev[i] = padtype & DEVICE_PAD6B;
}
player++; player++;
} }
} }
@ -141,6 +170,19 @@ void input_init(void)
break; break;
} }
case SYSTEM_MS4PLAY:
{
for (i=0; i<4; i++)
{
if (player < MAX_INPUTS)
{
input.dev[i] = DEVICE_PAD2B;
player++;
}
}
break;
}
case SYSTEM_LIGHTPHASER: case SYSTEM_LIGHTPHASER:
{ {
input.dev[0] = DEVICE_LIGHTGUN; input.dev[0] = DEVICE_LIGHTGUN;
@ -170,16 +212,16 @@ void input_init(void)
switch (input.system[1]) switch (input.system[1])
{ {
case SYSTEM_MS_GAMEPAD: case SYSTEM_GAMEPAD:
{ {
input.dev[4] = DEVICE_PAD2B; if (config.input[player].padtype != (DEVICE_PAD2B | DEVICE_PAD3B | DEVICE_PAD6B))
player++; {
break; input.dev[4] = config.input[player].padtype;
} }
else
case SYSTEM_MD_GAMEPAD: {
{ input.dev[4] = padtype;
input.dev[4] = config.input[player].padtype; }
player++; player++;
break; break;
} }
@ -231,7 +273,15 @@ void input_init(void)
{ {
if (player < MAX_INPUTS) if (player < MAX_INPUTS)
{ {
input.dev[i] = config.input[player].padtype; /* only allow 3-buttons or 6-buttons control pad */
if (config.input[player].padtype != (DEVICE_PAD2B | DEVICE_PAD3B | DEVICE_PAD6B))
{
input.dev[i] = config.input[player].padtype & DEVICE_PAD6B;
}
else
{
input.dev[i] = padtype & DEVICE_PAD6B;
}
player++; player++;
} }
} }
@ -239,6 +289,19 @@ void input_init(void)
break; break;
} }
case SYSTEM_MS4PLAY:
{
for (i=4; i<8; i++)
{
if (player < MAX_INPUTS)
{
input.dev[i] = DEVICE_PAD2B;
player++;
}
}
break;
}
case SYSTEM_LIGHTPHASER: case SYSTEM_LIGHTPHASER:
{ {
input.dev[4] = DEVICE_LIGHTGUN; input.dev[4] = DEVICE_LIGHTGUN;
@ -269,7 +332,15 @@ void input_init(void)
{ {
if (player < MAX_INPUTS) if (player < MAX_INPUTS)
{ {
input.dev[i] = config.input[player].padtype; /* only allow 3-buttons or 6-buttons control pad */
if (config.input[player].padtype != (DEVICE_PAD2B | DEVICE_PAD3B | DEVICE_PAD6B))
{
input.dev[i] = config.input[player].padtype & DEVICE_PAD6B;
}
else
{
input.dev[i] = padtype & DEVICE_PAD6B;
}
player ++; player ++;
} }
} }

View File

@ -3,7 +3,7 @@
* Input peripherals support * Input peripherals support
* *
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) * 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 * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -45,16 +45,16 @@
/* Ports configuration */ /* Ports configuration */
#define NO_SYSTEM (0) /* unconnected port*/ #define NO_SYSTEM (0) /* unconnected port*/
#define SYSTEM_MD_GAMEPAD (1) /* single 3-buttons or 6-buttons Control Pad */ #define SYSTEM_GAMEPAD (1) /* 2-buttons, 3-buttons or 6-buttons Control Pad */
#define SYSTEM_MOUSE (2) /* Sega Mouse */ #define SYSTEM_MOUSE (2) /* Sega Mouse */
#define SYSTEM_MENACER (3) /* Sega Menacer (port B only) */ #define SYSTEM_MENACER (3) /* Sega Menacer (port B only) */
#define SYSTEM_JUSTIFIER (4) /* Konami Justifiers (port B only) */ #define SYSTEM_JUSTIFIER (4) /* Konami Justifiers (port B only) */
#define SYSTEM_XE_A1P (5) /* XE-A1P analog controller (port A only) */ #define SYSTEM_XE_A1P (5) /* XE-A1P analog controller (port A only) */
#define SYSTEM_ACTIVATOR (6) /* Sega Activator */ #define SYSTEM_ACTIVATOR (6) /* Sega Activator */
#define SYSTEM_MS_GAMEPAD (7) /* single 2-buttons Control Pad (Master System) */ #define SYSTEM_LIGHTPHASER (7) /* Sega Light Phaser (Master System) */
#define SYSTEM_LIGHTPHASER (8) /* Sega Light Phaser (Master System) */ #define SYSTEM_PADDLE (8) /* Sega Paddle Control (Master System) */
#define SYSTEM_PADDLE (9) /* Sega Paddle Control (Master System) */ #define SYSTEM_SPORTSPAD (9) /* Sega Sports Pad (Master System) */
#define SYSTEM_SPORTSPAD (10) /* Sega Sports Pad (Master System) */ #define SYSTEM_MS4PLAY (10) /* Multi Tap -- Master System homemade */
#define SYSTEM_TEAMPLAYER (11) /* Multi Tap -- Sega TeamPlayer */ #define SYSTEM_TEAMPLAYER (11) /* Multi Tap -- Sega TeamPlayer */
#define SYSTEM_WAYPLAY (12) /* Multi Tap -- EA 4-Way Play (use both ports) */ #define SYSTEM_WAYPLAY (12) /* Multi Tap -- EA 4-Way Play (use both ports) */

View File

@ -2,7 +2,7 @@
* Genesis Plus * Genesis Plus
* Team Player support * 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 * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -87,18 +87,20 @@ INLINE unsigned int teamplayer_read(int port)
/* acquisition sequence */ /* acquisition sequence */
switch (counter) switch (counter)
{ {
case 0: /* initial state: TH = 1, TR = 1 -> 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 2:
case 3: /* ack request: TH=0, TR=0/1 -> RLDU = 0000 */ case 3: /* ack request: xxx0000 */
{ {
/* TL should match TR */ /* TL should match TR */
return ((teamplayer[port].State & 0x20) >> 1); return ((teamplayer[port].State & 0x20) >> 1);
@ -107,7 +109,7 @@ INLINE unsigned int teamplayer_read(int port)
case 4: case 4:
case 5: case 5:
case 6: 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)]; 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); return (((teamplayer[port].State & 0x20) >> 1) | retval);
} }
default: /* PAD status */ default: /* PAD status: xxxRLDU -> xxxSACB -> xxxMXYZ */
{ {
unsigned int retval = 0x0F; 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 */ /* update bits set as output only */
unsigned int state = (teamplayer[port].State & ~mask) | (data & mask); unsigned int state = (teamplayer[port].State & ~mask) | (data & mask);
/* TH & TR handshaking */ /* check if TH is HIGH */
if ((teamplayer[port].State ^ state) & 0x60) if (state & 0x40)
{ {
if (state & 0x40) /* reset counter */
{ teamplayer[port].Counter = 0;
/* TH high -> reset counter */
teamplayer[port].Counter = 0;
}
else
{
/* increment counter */
teamplayer[port].Counter++;
}
/* update internal state */
teamplayer[port].State = state;
} }
/* 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) unsigned char teamplayer_1_read(void)

View File

@ -2,7 +2,7 @@
* Genesis Plus * Genesis Plus
* Team Player support * 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 * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:

View File

@ -5,7 +5,7 @@
* Support for Master System (315-5216, 315-5237 & 315-5297), Game Gear & Mega Drive I/O chips * 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) 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 * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -80,16 +80,9 @@ void io_init(void)
/* Initialize IO Ports handlers & connected peripherals */ /* Initialize IO Ports handlers & connected peripherals */
switch (input.system[0]) switch (input.system[0])
{ {
case SYSTEM_MS_GAMEPAD: case SYSTEM_GAMEPAD:
{ {
port[0].data_w = dummy_write; port[0].data_w = (input.dev[0] == DEVICE_PAD2B) ? dummy_write : gamepad_1_write;
port[0].data_r = gamepad_1_read;
break;
}
case SYSTEM_MD_GAMEPAD:
{
port[0].data_w = gamepad_1_write;
port[0].data_r = gamepad_1_read; port[0].data_r = gamepad_1_read;
break; break;
} }
@ -129,6 +122,13 @@ void io_init(void)
break; break;
} }
case SYSTEM_MS4PLAY:
{
port[0].data_w = ms4play_1_write;
port[0].data_r = ms4play_1_read;
break;
}
case SYSTEM_LIGHTPHASER: case SYSTEM_LIGHTPHASER:
{ {
port[0].data_w = dummy_write; port[0].data_w = dummy_write;
@ -160,16 +160,9 @@ void io_init(void)
switch (input.system[1]) switch (input.system[1])
{ {
case SYSTEM_MS_GAMEPAD: case SYSTEM_GAMEPAD:
{ {
port[1].data_w = dummy_write; port[1].data_w = (input.dev[4] == DEVICE_PAD2B) ? dummy_write : gamepad_2_write;
port[1].data_r = gamepad_2_read;
break;
}
case SYSTEM_MD_GAMEPAD:
{
port[1].data_w = gamepad_2_write;
port[1].data_r = gamepad_2_read; port[1].data_r = gamepad_2_read;
break; break;
} }
@ -223,6 +216,13 @@ void io_init(void)
break; break;
} }
case SYSTEM_MS4PLAY:
{
port[1].data_w = ms4play_2_write;
port[1].data_r = ms4play_2_read;
break;
}
case SYSTEM_LIGHTPHASER: case SYSTEM_LIGHTPHASER:
{ {
port[1].data_w = dummy_write; port[1].data_w = dummy_write;

View File

@ -5,7 +5,7 @@
* Support for Master System (315-5216, 315-5237 & 315-5297), Game Gear & Mega Drive I/O chips * 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) 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 * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:

View File

@ -3,7 +3,7 @@
* ROM Loading Support * ROM Loading Support
* *
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) * 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 * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -682,9 +682,6 @@ int load_rom(char *filename)
} }
#endif #endif
/* Save auto-detected system hardware */
romtype = system_hw;
/* PICO ROM */ /* PICO ROM */
if (strstr(rominfo.consoletype, "SEGA PICO") != NULL) if (strstr(rominfo.consoletype, "SEGA PICO") != NULL)
{ {
@ -692,8 +689,11 @@ int load_rom(char *filename)
system_hw = SYSTEM_PICO; system_hw = SYSTEM_PICO;
} }
/* Save auto-detected system hardware */
romtype = system_hw;
/* CD BOOTROM */ /* CD BOOTROM */
else if (strstr(rominfo.ROMType, "BR") != NULL) if (strstr(rominfo.ROMType, "BR") != NULL)
{ {
/* enable CD hardware */ /* enable CD hardware */
system_hw = SYSTEM_MCD; system_hw = SYSTEM_MCD;
@ -717,7 +717,7 @@ int load_rom(char *filename)
(strstr(rominfo.product,"T-5740") != NULL)) (strstr(rominfo.product,"T-5740") != NULL))
{ {
/* check if console hardware is set to AUTO */ /* check if console hardware is set to AUTO */
if (config.system == 0x00) if (!config.system)
{ {
/* auto-enable CD hardware */ /* auto-enable CD hardware */
system_hw = SYSTEM_MCD; system_hw = SYSTEM_MCD;
@ -790,7 +790,7 @@ int load_rom(char *filename)
} }
/* force MENACER configuration */ /* force MENACER configuration */
input.system[0] = SYSTEM_MD_GAMEPAD; input.system[0] = SYSTEM_GAMEPAD;
input.system[1] = SYSTEM_MENACER; input.system[1] = SYSTEM_MENACER;
input.x_offset = 82; input.x_offset = 82;
input.y_offset = 0; input.y_offset = 0;
@ -808,7 +808,7 @@ int load_rom(char *filename)
} }
/* force MENACER configuration */ /* force MENACER configuration */
input.system[0] = SYSTEM_MD_GAMEPAD; input.system[0] = SYSTEM_GAMEPAD;
input.system[1] = SYSTEM_MENACER; input.system[1] = SYSTEM_MENACER;
input.x_offset = 133; input.x_offset = 133;
input.y_offset = -8; input.y_offset = -8;
@ -826,7 +826,7 @@ int load_rom(char *filename)
} }
/* force MENACER configuration */ /* force MENACER configuration */
input.system[0] = SYSTEM_MD_GAMEPAD; input.system[0] = SYSTEM_GAMEPAD;
input.system[1] = SYSTEM_MENACER; input.system[1] = SYSTEM_MENACER;
input.x_offset = 68; input.x_offset = 68;
input.y_offset = -24; input.y_offset = -24;
@ -844,7 +844,7 @@ int load_rom(char *filename)
} }
/* force MENACER configuration */ /* force MENACER configuration */
input.system[0] = SYSTEM_MD_GAMEPAD; input.system[0] = SYSTEM_GAMEPAD;
input.system[1] = SYSTEM_MENACER; input.system[1] = SYSTEM_MENACER;
input.x_offset = 64; input.x_offset = 64;
input.y_offset = -8; input.y_offset = -8;
@ -862,7 +862,7 @@ int load_rom(char *filename)
} }
/* force MENACER configuration */ /* force MENACER configuration */
input.system[0] = SYSTEM_MD_GAMEPAD; input.system[0] = SYSTEM_GAMEPAD;
input.system[1] = SYSTEM_MENACER; input.system[1] = SYSTEM_MENACER;
input.x_offset = 61; input.x_offset = 61;
input.y_offset = 0; input.y_offset = 0;
@ -880,7 +880,7 @@ int load_rom(char *filename)
} }
/* force MENACER configuration */ /* force MENACER configuration */
input.system[0] = SYSTEM_MD_GAMEPAD; input.system[0] = SYSTEM_GAMEPAD;
input.system[1] = SYSTEM_MENACER; input.system[1] = SYSTEM_MENACER;
input.x_offset = 70; input.x_offset = 70;
input.y_offset = 18; input.y_offset = 18;
@ -898,7 +898,7 @@ int load_rom(char *filename)
} }
/* force MENACER configuration */ /* force MENACER configuration */
input.system[0] = SYSTEM_MD_GAMEPAD; input.system[0] = SYSTEM_GAMEPAD;
input.system[1] = SYSTEM_MENACER; input.system[1] = SYSTEM_MENACER;
input.x_offset = 49; input.x_offset = 49;
input.y_offset = 0; input.y_offset = 0;
@ -916,7 +916,7 @@ int load_rom(char *filename)
} }
/* force MENACER configuration */ /* force MENACER configuration */
input.system[0] = SYSTEM_MD_GAMEPAD; input.system[0] = SYSTEM_GAMEPAD;
input.system[1] = SYSTEM_MENACER; input.system[1] = SYSTEM_MENACER;
input.x_offset = 60; input.x_offset = 60;
input.y_offset = 30; input.y_offset = 30;
@ -935,7 +935,7 @@ int load_rom(char *filename)
} }
/* force JUSTIFIER configuration */ /* force JUSTIFIER configuration */
input.system[0] = SYSTEM_MD_GAMEPAD; input.system[0] = SYSTEM_GAMEPAD;
input.system[1] = SYSTEM_JUSTIFIER; input.system[1] = SYSTEM_JUSTIFIER;
input.x_offset = (strstr(rominfo.international,"GUN FIGHTERS") != NULL) ? 24 : 0; input.x_offset = (strstr(rominfo.international,"GUN FIGHTERS") != NULL) ? 24 : 0;
input.y_offset = 0; input.y_offset = 0;

View File

@ -3,7 +3,7 @@
* ROM Loading Support * ROM Loading Support
* *
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code) * 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 * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:

View File

@ -3,7 +3,7 @@
* *
* Genesis Plus GX configuration file support * 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 * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -164,6 +164,13 @@ void config_default(void)
config.gamma = VI_GM_1_0 / 10.0; config.gamma = VI_GM_1_0 / 10.0;
#endif #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 */ /* controllers options */
config.gun_cursor[0] = 1; config.gun_cursor[0] = 1;
config.gun_cursor[1] = 1; config.gun_cursor[1] = 1;
@ -178,13 +185,13 @@ void config_default(void)
config.autocheat = 0; config.autocheat = 0;
#ifdef HW_RVL #ifdef HW_RVL
config.s_auto = 1; config.s_auto = 1;
config.autosleep = 1;
#else #else
config.s_auto = 0; config.s_auto = 0;
config.v_prog = 1; config.v_prog = 1;
#endif #endif
config.s_default = 1; config.s_default = 1;
config.s_device = 0; config.s_device = 0;
config.l_device = 0;
config.bg_overlay = 0; config.bg_overlay = 0;
config.screen_w = 658; config.screen_w = 658;
config.bgm_volume = 100.0; config.bgm_volume = 100.0;
@ -192,6 +199,9 @@ void config_default(void)
/* default ROM directories */ /* default ROM directories */
#ifdef HW_RVL #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[0][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH);
sprintf (config.lastdir[1][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); 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[3][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH);
sprintf (config.lastdir[4][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[4][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH);
#else #else
config.l_device = TYPE_SD;
sprintf (config.lastdir[0][TYPE_SD], "%s/roms/", DEFAULT_PATH); sprintf (config.lastdir[0][TYPE_SD], "%s/roms/", DEFAULT_PATH);
sprintf (config.lastdir[1][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); sprintf (config.lastdir[2][TYPE_SD], "%s/roms/", DEFAULT_PATH);
@ -250,7 +261,7 @@ void config_default(void)
{ {
/* switch menu video mode to interlaced */ /* switch menu video mode to interlaced */
vmode->viTVMode = (vmode->viTVMode & ~3) | VI_INTERLACE; vmode->viTVMode = (vmode->viTVMode & ~3) | VI_INTERLACE;
VIDEO_Configure (vmode); VIDEO_Configure(vmode);
VIDEO_Flush(); VIDEO_Flush();
VIDEO_WaitVSync(); VIDEO_WaitVSync();
VIDEO_WaitVSync(); VIDEO_WaitVSync();
@ -266,7 +277,7 @@ void config_default(void)
} }
/* default emulated inputs */ /* default emulated inputs */
input.system[0] = SYSTEM_MD_GAMEPAD; input.system[0] = SYSTEM_GAMEPAD;
input.system[1] = (config.input[1].device != -1) ? SYSTEM_MD_GAMEPAD : NO_SYSTEM; input.system[1] = (config.input[1].device != -1) ? SYSTEM_GAMEPAD : NO_SYSTEM;
input_init(); input_init();
} }

View File

@ -3,7 +3,7 @@
* *
* Genesis Plus GX configuration file support * 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 * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -97,6 +97,7 @@ typedef struct
uint16 pad_keymap[4][MAX_KEYS+1]; uint16 pad_keymap[4][MAX_KEYS+1];
#ifdef HW_RVL #ifdef HW_RVL
uint32 wpad_keymap[4*3][MAX_KEYS]; uint32 wpad_keymap[4*3][MAX_KEYS];
uint8 autosleep;
#endif #endif
uint8 autoload; uint8 autoload;
uint8 autocheat; uint8 autocheat;
@ -111,6 +112,11 @@ typedef struct
float bgm_volume; float bgm_volume;
float sfx_volume; float sfx_volume;
char lastdir[FILETYPE_MAX][TYPE_RECENT][MAXPATHLEN]; char lastdir[FILETYPE_MAX][TYPE_RECENT][MAXPATHLEN];
float ntsc_sharpness;
float ntsc_resolution;
float ntsc_artifacts;
float ntsc_fringing;
float ntsc_bleed;
} t_config; } t_config;
/* Global data */ /* Global data */

View File

@ -97,8 +97,7 @@ extern const u8 Button_delete_over_png[];
/* Controller Settings */ /* Controller Settings */
extern const u8 Ctrl_4wayplay_png[]; extern const u8 Ctrl_4wayplay_png[];
extern const u8 Ctrl_gamepad_md_png[]; extern const u8 Ctrl_gamepad_png[];
extern const u8 Ctrl_gamepad_ms_png[];
extern const u8 Ctrl_justifiers_png[]; extern const u8 Ctrl_justifiers_png[];
extern const u8 Ctrl_menacer_png[]; extern const u8 Ctrl_menacer_png[];
extern const u8 Ctrl_mouse_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_sportspad_png[];
extern const u8 Ctrl_none_png[]; extern const u8 Ctrl_none_png[];
extern const u8 Ctrl_teamplayer_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_pad3b_png[];
extern const u8 Ctrl_pad6b_png[]; extern const u8 Ctrl_pad6b_png[];
extern const u8 Ctrl_config_png[]; extern const u8 Ctrl_config_png[];
@ -370,9 +372,9 @@ static gui_item items_system[10] =
/* Video options */ /* Video options */
#ifdef HW_RVL #ifdef HW_RVL
static gui_item items_video[13] = static gui_item items_video[18] =
#else #else
static gui_item items_video[11] = static gui_item items_video[16] =
#endif #endif
{ {
{NULL,NULL,"Display: PROGRESSIVE", "Select video mode", 56,132,276,48}, {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}, {NULL,NULL,"VI Gamma Correction: 1.0", "Adjust video hardware gamma correction", 56,132,276,48},
#endif #endif
{NULL,NULL,"NTSC Filter: COMPOSITE", "Enable/disable NTSC software filtering", 56,132,276,48}, {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,"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,"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}, {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 */ /* Menu options */
#ifdef HW_RVL
static gui_item items_prefs[12] =
#else
static gui_item items_prefs[11] = 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 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}, {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,"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 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}, {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 */ /* Save Manager */
@ -614,7 +628,7 @@ static gui_menu menu_prefs =
{ {
"Menu Settings", "Menu Settings",
0,0, 0,0,
11,4,6,0, 12,4,6,0,
items_prefs, items_prefs,
buttons_list, buttons_list,
bg_list, bg_list,
@ -683,6 +697,12 @@ static void prefmenu ()
sprintf (items[8].text, "Screen Width: %d", config.screen_w); 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[9].text, "Show CD Leds: %s", config.cd_leds ? "ON":"OFF");
sprintf (items[10].text, "Show FPS: %s", config.fps ? "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_InitMenu(m);
GUI_SlideMenuTitle(m,strlen("Menu ")); GUI_SlideMenuTitle(m,strlen("Menu "));
@ -777,6 +797,14 @@ static void prefmenu ()
sprintf (items[10].text, "Show FPS: %s", config.fps ? "ON":"OFF"); sprintf (items[10].text, "Show FPS: %s", config.fps ? "ON":"OFF");
break; 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: case -1:
quit = 1; quit = 1;
break; break;
@ -1480,6 +1508,7 @@ static void videomenu ()
int reinit = 0; int reinit = 0;
gui_menu *m = &menu_video; gui_menu *m = &menu_video;
gui_item *items = m->items; gui_item *items = m->items;
int ntsc_offset = 0;
if (config.render == 1) if (config.render == 1)
sprintf (items[0].text,"Display: INTERLACED"); sprintf (items[0].text,"Display: INTERLACED");
@ -1514,39 +1543,59 @@ static void videomenu ()
sprintf (items[VI_OFFSET].text, "NTSC Filter: S-VIDEO"); sprintf (items[VI_OFFSET].text, "NTSC Filter: S-VIDEO");
else if (config.ntsc == 3) else if (config.ntsc == 3)
sprintf (items[VI_OFFSET].text, "NTSC Filter: RGB"); 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 else
sprintf (items[VI_OFFSET].text, "NTSC Filter: OFF"); sprintf (items[VI_OFFSET].text, "NTSC Filter: OFF");
if (config.overscan == 3) strcpy(items[VI_OFFSET+1+ntsc_offset].comment, "Enable/disable overscan emulation");
sprintf (items[VI_OFFSET+1].text, "Borders: FULL"); strcpy(items[VI_OFFSET+2+ntsc_offset].comment, "Enable/disable Game Gear extended screen");
else if (config.overscan == 2) strcpy(items[VI_OFFSET+3+ntsc_offset].comment, "Select display aspect ratio");
sprintf (items[VI_OFFSET+1].text, "Borders: H ONLY"); strcpy(items[VI_OFFSET+4+ntsc_offset].comment, "Adjust display position");
else if (config.overscan == 1) strcpy(items[VI_OFFSET+5+ntsc_offset].comment, "Adjust display scaling");
sprintf (items[VI_OFFSET+1].text, "Borders: V ONLY");
else
sprintf (items[VI_OFFSET+1].text, "Borders: NONE");
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) 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) 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 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.xshift < 0) ? "":"+", config.xshift,
(config.yshift < 0) ? "":"+", config.yshift); (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.xscale < 0) ? "":"+", config.xscale,
(config.yscale < 0) ? "":"+", config.yscale); (config.yscale < 0) ? "":"+", config.yscale);
if (config.aspect) m->max_items = VI_OFFSET + 5 + ntsc_offset + (config.aspect == 0);
m->max_items = VI_OFFSET+5;
else
m->max_items = VI_OFFSET+6;
GUI_InitMenu(m); GUI_InitMenu(m);
GUI_SlideMenuTitle(m,strlen("Video ")); GUI_SlideMenuTitle(m,strlen("Video "));
@ -1555,6 +1604,11 @@ static void videomenu ()
{ {
ret = GUI_RunMenu(m); ret = GUI_RunMenu(m);
if (ret > VI_OFFSET)
{
ret += (5 - ntsc_offset);
}
switch (ret) switch (ret)
{ {
case 0: /*** rendering ***/ case 0: /*** rendering ***/
@ -1643,64 +1697,135 @@ static void videomenu ()
#endif #endif
case VI_OFFSET: /*** NTSC filter ***/ case VI_OFFSET: /*** NTSC filter ***/
config.ntsc = (config.ntsc + 1) & 3; config.ntsc = (config.ntsc + 1) % 5;
if (config.ntsc == 1) if (config.ntsc == 1)
{
sprintf (items[VI_OFFSET].text, "NTSC Filter: COMPOSITE"); sprintf (items[VI_OFFSET].text, "NTSC Filter: COMPOSITE");
}
else if (config.ntsc == 2) else if (config.ntsc == 2)
{
sprintf (items[VI_OFFSET].text, "NTSC Filter: S-VIDEO"); sprintf (items[VI_OFFSET].text, "NTSC Filter: S-VIDEO");
}
else if (config.ntsc == 3) else if (config.ntsc == 3)
{
sprintf (items[VI_OFFSET].text, "NTSC Filter: RGB"); 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 else
{
sprintf (items[VI_OFFSET].text, "NTSC Filter: OFF"); 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; 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; config.overscan = (config.overscan + 1) & 3;
if (config.overscan == 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) 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) 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 else
sprintf (items[VI_OFFSET+1].text, "Borders: NONE"); sprintf (items[VI_OFFSET+ntsc_offset+1].text, "Borders: NONE");
break; break;
case VI_OFFSET+2: /*** Game Gear extended screen */ case VI_OFFSET+7: /*** Game Gear extended screen */
config.gg_extra ^= 1; 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; break;
case VI_OFFSET+3: /*** aspect ratio ***/ case VI_OFFSET+8: /*** aspect ratio ***/
config.aspect = (config.aspect + 1) % 3; config.aspect = (config.aspect + 1) % 3;
if (config.aspect == 1) 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) 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 else
sprintf (items[VI_OFFSET+3].text, "Aspect: SCALED"); sprintf (items[VI_OFFSET+ntsc_offset+3].text, "Aspect: SCALED");
if (config.aspect) if (config.aspect)
{ {
/* disable items */ /* disable items */
m->max_items = VI_OFFSET+5; m->max_items = VI_OFFSET + ntsc_offset + 5;
/* reset menu selection */ /* reset menu selection */
if (m->offset > VI_OFFSET) if (m->selected < 2)
{ {
m->offset = VI_OFFSET; m->offset = VI_OFFSET + ntsc_offset + 1;
m->selected = 3; m->selected = 2;
} }
} }
else else
{ {
/* enable items */ /* enable items */
m->max_items = VI_OFFSET+6; m->max_items = VI_OFFSET + ntsc_offset + 6;
} }
break; break;
case VI_OFFSET+4: /*** screen position ***/ case VI_OFFSET+9: /*** screen position ***/
if (system_hw) if (system_hw)
{ {
state[0] = m->arrows[0]->state; state[0] = m->arrows[0]->state;
@ -1718,7 +1843,7 @@ static void videomenu ()
m->arrows[1]->state = state[1]; m->arrows[1]->state = state[1];
m->screenshot = 0; m->screenshot = 0;
strcpy(m->title,"Video Settings"); 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.xshift < 0) ? "":"+", config.xshift,
(config.yshift < 0) ? "":"+", config.yshift); (config.yshift < 0) ? "":"+", config.yshift);
} }
@ -1728,7 +1853,7 @@ static void videomenu ()
} }
break; break;
case VI_OFFSET+5: /*** screen scaling ***/ case VI_OFFSET+10: /*** screen scaling ***/
if (system_hw) if (system_hw)
{ {
state[0] = m->arrows[0]->state; state[0] = m->arrows[0]->state;
@ -1746,7 +1871,7 @@ static void videomenu ()
m->arrows[1]->state = state[1]; m->arrows[1]->state = state[1];
m->screenshot = 0; m->screenshot = 0;
strcpy(m->title,"Video Settings"); 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.xscale < 0) ? "":"+", config.xscale,
(config.yscale < 0) ? "":"+", config.yscale); (config.yscale < 0) ? "":"+", config.yscale);
} }
@ -1921,66 +2046,73 @@ static void ctrlmenu(void)
int update = 0; int update = 0;
gui_item *items = NULL; gui_item *items = NULL;
u8 *special = NULL; u8 *special = NULL;
u32 exp; u32 exp, index = 0;
u8 type = 0;
/* System devices */ /* System devices */
gui_item items_sys[2][13] = gui_item items_sys[2][13] =
{ {
{ {
{NULL,Ctrl_none_png ,"","Select Port 1 device",110,130,48,72}, {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_mouse_png ,"","Select Port 1 device", 97,113,64,88},
{NULL,Ctrl_menacer_png ,"","Select Port 1 device", 94,113,80,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_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_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_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_lightphaser_png,"","Select Port 1 device", 89,109,88,92},
{NULL,Ctrl_paddle_png ,"","Select Port 1 device", 86,117,96,84}, {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_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_teamplayer_png ,"","Select Port 1 device", 94,109,80,92},
{NULL,Ctrl_4wayplay_png ,"","Select Port 1 device", 98,110,72,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_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_mouse_png ,"","Select Port 2 device", 97,283,64,88},
{NULL,Ctrl_menacer_png ,"","Select Port 2 device", 94,283,80,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_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_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_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_lightphaser_png,"","Select Port 2 device", 89,279,88,92},
{NULL,Ctrl_paddle_png ,"","Select Port 2 device", 86,287,96,84}, {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_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_teamplayer_png ,"","Select Port 2 device", 94,279,80,92},
{NULL,Ctrl_4wayplay_png ,"","Select Port 2 device", 98,280,72,92} {NULL,Ctrl_4wayplay_png ,"","Select Port 2 device", 98,280,72,92}
} }
}; };
/* Specific controller options */ /* Specific controller options */
gui_item items_special[4][2] = gui_item items_special[4][4] =
{ {
{ {
/* Gamepad option */ /* Gamepad option */
{NULL,Ctrl_pad3b_png,"Pad\nType","Use 3-buttons Pad",528,180,44,28}, {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 */ /* Mouse option */
{NULL,ctrl_option_off_png,"Invert\nMouse","Enable/Disable Y-Axis inversion",534,180,24,24}, {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,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 */ /* Gun option */
{NULL,ctrl_option_off_png,"Show\nCursor","Enable/Disable Lightgun cursor",534,180,24,24}, {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,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 */ /* no option */
{NULL,NULL,"No Option","",436,180,160,52}, {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},
{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][0].texture = gxTextureOpenPNG(items_special[0][0].data,0);
items_special[0][1].texture = gxTextureOpenPNG(items_special[0][1].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][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_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; items_device[0].texture = items_special[1][0].texture;
@ -2098,7 +2232,7 @@ static void ctrlmenu(void)
if (input.system[0] > SYSTEM_WAYPLAY) if (input.system[0] > SYSTEM_WAYPLAY)
{ {
input.system[0] = NO_SYSTEM; input.system[0] = NO_SYSTEM;
input.system[1] = SYSTEM_MD_GAMEPAD; input.system[1] = SYSTEM_GAMEPAD;
} }
/* reset I/O ports */ /* reset I/O ports */
@ -2148,12 +2282,7 @@ static void ctrlmenu(void)
/* fixed configurations */ /* fixed configurations */
if (system_hw) if (system_hw)
{ {
if (cart.special & HW_J_CART) if (cart.special & HW_TEREBI_OEKAKI)
{
GUI_WaitPrompt("Error","J-CART detected !");
break;
}
else if (cart.special & HW_TEREBI_OEKAKI)
{ {
GUI_WaitPrompt("Error","Terebi Oekaki detected !"); GUI_WaitPrompt("Error","Terebi Oekaki detected !");
break; break;
@ -2177,13 +2306,13 @@ static void ctrlmenu(void)
/* allow only one gun type */ /* allow only one gun type */
if ((input.system[0] == SYSTEM_LIGHTPHASER) && (input.system[1] == SYSTEM_MENACER)) if ((input.system[0] == SYSTEM_LIGHTPHASER) && (input.system[1] == SYSTEM_MENACER))
{ {
input.system[1] += 3; input.system[1]++;
} }
/* allow only one gun type */ /* allow only one gun type */
if ((input.system[0] == SYSTEM_LIGHTPHASER) && (input.system[1] == SYSTEM_JUSTIFIER)) if ((input.system[0] == SYSTEM_LIGHTPHASER) && (input.system[1] == SYSTEM_JUSTIFIER))
{ {
input.system[1] += 2; input.system[1]++;
} }
/* 4-wayplay uses both ports */ /* 4-wayplay uses both ports */
@ -2196,7 +2325,7 @@ static void ctrlmenu(void)
if (input.system[1] > SYSTEM_WAYPLAY) if (input.system[1] > SYSTEM_WAYPLAY)
{ {
input.system[1] = NO_SYSTEM; input.system[1] = NO_SYSTEM;
input.system[0] = SYSTEM_MD_GAMEPAD; input.system[0] = SYSTEM_GAMEPAD;
} }
/* reset I/O ports */ /* reset I/O ports */
@ -2262,10 +2391,13 @@ static void ctrlmenu(void)
} }
} }
/* save device index */
index = m->selected - 2;
/* update player index */ /* update player index */
old_player = player; old_player = player;
player = 0; player = 0;
for (i=0; i<(m->selected-2); i++) for (i=0; i<index; i++)
{ {
if (input.dev[i] != NO_DEVICE) player ++; if (input.dev[i] != NO_DEVICE) player ++;
} }
@ -2299,17 +2431,24 @@ static void ctrlmenu(void)
m->buttons[9].shift[3] = 1; m->buttons[9].shift[3] = 1;
} }
/* emulated device type */
type = input.dev[m->selected - 2];
/* retrieve current player informations */ /* retrieve current player informations */
switch (type) switch (input.dev[index])
{ {
case DEVICE_PAD2B:
case DEVICE_PAD3B: case DEVICE_PAD3B:
case DEVICE_PAD6B: case DEVICE_PAD6B:
{ {
items = items_special[0]; if (input.system[index/4] == SYSTEM_MS4PLAY)
special = &config.input[player].padtype; {
/* force 2-buttons pad */
items = items_special[3];
special = NULL;
}
else
{
items = items_special[0];
special = &config.input[player].padtype;
}
break; break;
} }
@ -2323,16 +2462,15 @@ static void ctrlmenu(void)
case DEVICE_LIGHTGUN: case DEVICE_LIGHTGUN:
{ {
items = items_special[2]; items = items_special[2];
if ((input.system[1] == SYSTEM_MENACER) || (input.system[1] == SYSTEM_JUSTIFIER)) if ((input.system[1] == SYSTEM_MENACER) || (input.system[1] == SYSTEM_JUSTIFIER))
{ {
/* Menacer & Justifiers affected to devices 4 & 5 */ /* Menacer & Justifiers affected to entries 4 & 5 */
special = &config.gun_cursor[m->selected & 1]; special = &config.gun_cursor[index & 1];
} }
else else
{ {
/* Lightphasers affected to devices 0 & 4 */ /* Lightphasers affected to entries 0 & 4 */
special = &config.gun_cursor[m->selected >> 2]; special = &config.gun_cursor[index / 4];
} }
break; break;
} }
@ -2364,11 +2502,11 @@ static void ctrlmenu(void)
GUI_DrawMenuFX(m, 20, 0); GUI_DrawMenuFX(m, 20, 0);
/* some devices require analog sticks */ /* 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 !"); 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 !"); GUI_WaitPrompt("Warning","Two Analog Sticks required !");
} }
@ -2389,18 +2527,20 @@ static void ctrlmenu(void)
{ {
if (special) if (special)
{ {
/* switch option */
*special ^= 1;
/* specific case: controller type */ /* specific case: controller type */
if (type < 2) if (input.dev[index] < 0x03)
{ {
/* re-initialize emulated device */ /* switch pad type */
input_init(); *special = (*special + 1) & 0x03;
input_reset();
/* update emulated device type */ /* reinitialize emulated device(s) */
type = *special; io_init();
input_reset();
}
else
{
/* switch option */
*special ^= 1;
} }
/* update menu items */ /* update menu items */
@ -2556,7 +2696,15 @@ static void ctrlmenu(void)
if (config.input[player].device >= 0) if (config.input[player].device >= 0)
{ {
GUI_MsgBoxOpen("Keys Configuration", "",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(); GUI_MsgBoxClose();
} }
break; break;
@ -2687,6 +2835,8 @@ static void ctrlmenu(void)
} }
gxTextureClose(&items_special[0][0].texture); gxTextureClose(&items_special[0][0].texture);
gxTextureClose(&items_special[0][1].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][0].texture);
gxTextureClose(&items_special[1][1].texture); gxTextureClose(&items_special[1][1].texture);
gxTextureClose(&items_device[1].texture); gxTextureClose(&items_device[1].texture);

View File

@ -233,37 +233,40 @@ static void pad_update(s8 chan, u8 i)
return; 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 */ /* Emulated device */
switch (input.dev[i]) switch (input.dev[i])
{ {
case DEVICE_PAD6B: 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_BUTTONX]) input.pad[i] |= INPUT_X;
if (p & pad_keymap[KEY_BUTTONY]) input.pad[i] |= INPUT_Y; 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_BUTTONZ]) input.pad[i] |= INPUT_Z;
if (p & pad_keymap[KEY_MODE]) input.pad[i] |= INPUT_MODE; if (p & pad_keymap[KEY_MODE]) input.pad[i] |= INPUT_MODE;
/* default inputs are checked below */
} }
case DEVICE_PAD3B: case DEVICE_PAD3B:
{ {
/* Default menu key (right analog stick) */ /* A button */
if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY) if (p & pad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A;
{ }
ConfigRequested = 1;
return;
}
case DEVICE_PAD2B:
{
/* D-PAD */ /* D-PAD */
if ((p & PAD_BUTTON_UP) || (y > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_UP; 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; 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; 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; else if ((p & PAD_BUTTON_RIGHT) || (x > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_RIGHT;
/* Buttons */ /* default buttons */
if (p & pad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A;
if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_B; 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_BUTTONC]) input.pad[i] |= INPUT_C;
if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_START; 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] */ /* Y analog position [0-255] */
input.analog[i][1] = y ? (127 - y) : (128 - y); input.analog[i][1] = y ? (127 - y) : (128 - y);
}
/* default inputs are checked below */
}
case DEVICE_PADDLE: case DEVICE_PADDLE:
{ {
/* Default menu key (right analog stick) */
if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY)
{
ConfigRequested = 1;
return;
}
/* X analog position [0-255] */ /* X analog position [0-255] */
input.analog[i][0] = (x + 128); input.analog[i][0] = (x + 128);
@ -332,38 +326,8 @@ static void pad_update(s8 chan, u8 i)
break; 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: case DEVICE_LIGHTGUN:
{ {
/* Default menu key (right analog stick) */
if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY)
{
ConfigRequested = 1;
return;
}
/* Gun screen position (x,y) */ /* Gun screen position (x,y) */
input.analog[i][0] += x / ANALOG_SENSITIVITY; input.analog[i][0] += x / ANALOG_SENSITIVITY;
input.analog[i][1] -= y / ANALOG_SENSITIVITY; input.analog[i][1] -= y / ANALOG_SENSITIVITY;
@ -385,13 +349,6 @@ static void pad_update(s8 chan, u8 i)
case DEVICE_MOUSE: case DEVICE_MOUSE:
{ {
/* Default menu key (right analog stick) */
if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY)
{
ConfigRequested = 1;
return;
}
/* Mouse relative movement (-255,255) */ /* Mouse relative movement (-255,255) */
input.analog[i][0] = (x / ANALOG_SENSITIVITY) * 2; input.analog[i][0] = (x / ANALOG_SENSITIVITY) * 2;
input.analog[i][1] = (y / 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: case DEVICE_PICO:
{ {
/* Default menu key (right analog stick) */
if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY)
{
ConfigRequested = 1;
return;
}
/* D-PAD */ /* D-PAD */
if (p & PAD_BUTTON_UP) input.pad[0] |= INPUT_UP; if (p & PAD_BUTTON_UP) input.pad[0] |= INPUT_UP;
else if (p & PAD_BUTTON_DOWN) input.pad[0] |= INPUT_DOWN; 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: case DEVICE_TEREBI:
{ {
/* Default menu key (right analog stick) */
if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY)
{
ConfigRequested = 1;
return;
}
/* PEN screen position (x,y) */ /* PEN screen position (x,y) */
input.analog[0][0] += x / ANALOG_SENSITIVITY; input.analog[0][0] += x / ANALOG_SENSITIVITY;
input.analog[0][1] -= y / 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: 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_BUTTONX]) input.pad[i] |= INPUT_X;
if (p & wpad_keymap[KEY_BUTTONY]) input.pad[i] |= INPUT_Y; if (p & wpad_keymap[KEY_BUTTONY]) input.pad[i] |= INPUT_Y;
if (p & wpad_keymap[KEY_BUTTONZ]) input.pad[i] |= INPUT_Z; 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: 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; 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; 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; 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; else if ((p & wpad_dirmap[exp][PAD_RIGHT]) || (x > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_RIGHT;
/* Buttons */ /* default buttons */
if (p & wpad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A;
if (p & wpad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_B; 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_BUTTONC]) input.pad[i] |= INPUT_C;
if (p & wpad_keymap[KEY_START]) input.pad[i] |= INPUT_START; 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] */ /* Left Stick analog position [0-255] */
input.analog[i][0] = (x + 128); 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] */ /* Right Stick analog position [0-255] */
if (exp == WPAD_EXP_CLASSIC) if (exp == WPAD_EXP_CLASSIC)
@ -886,22 +834,6 @@ static void wpad_update(s8 chan, u8 i, u32 exp)
break; 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: case DEVICE_LIGHTGUN:
{ {
/* Gun screen position (x,y) */ /* Gun screen position (x,y) */
@ -1126,7 +1058,7 @@ void gx_input_Init(void)
PAD_Init(); PAD_Init();
#ifdef HW_RVL #ifdef HW_RVL
WPAD_Init(); WPAD_Init();
WPAD_SetIdleTimeout(60); WPAD_SetIdleTimeout(config.autosleep ? 300 : 1800);
WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR); WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR);
WPAD_SetVRes(WPAD_CHAN_ALL,640,480); WPAD_SetVRes(WPAD_CHAN_ALL,640,480);
#endif #endif
@ -1261,7 +1193,7 @@ void gx_input_SetDefault(void)
{ {
config.input[i].device = -1; config.input[i].device = -1;
config.input[i].port = i%4; 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 #ifdef HW_RVL

View File

@ -1557,17 +1557,37 @@ void gx_video_Start(void)
switch (config.ntsc) switch (config.ntsc)
{ {
case 1: case 1:
{
sms_ntsc_init(sms_ntsc, &sms_ntsc_composite); sms_ntsc_init(sms_ntsc, &sms_ntsc_composite);
md_ntsc_init(md_ntsc, &md_ntsc_composite); md_ntsc_init(md_ntsc, &md_ntsc_composite);
break; break;
}
case 2: case 2:
{
sms_ntsc_init(sms_ntsc, &sms_ntsc_svideo); sms_ntsc_init(sms_ntsc, &sms_ntsc_svideo);
md_ntsc_init(md_ntsc, &md_ntsc_svideo); md_ntsc_init(md_ntsc, &md_ntsc_svideo);
break; break;
}
case 3: case 3:
{
sms_ntsc_init(sms_ntsc, &sms_ntsc_rgb); sms_ntsc_init(sms_ntsc, &sms_ntsc_rgb);
md_ntsc_init(md_ntsc, &md_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; break;
}
} }
} }
@ -1630,6 +1650,7 @@ void gx_video_Start(void)
} }
/* GX emulation rendering */ /* GX emulation rendering */
gxClearScreen((GXColor)BLACK);
gxResetRendering(0); gxResetRendering(0);
/* resynchronize emulation with VSYNC */ /* resynchronize emulation with VSYNC */

BIN
gx/images/Ctrl_gamepad.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

BIN
gx/images/Ctrl_ms4play.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
gx/images/Ctrl_pad2b.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
gx/images/Ctrl_pad_auto.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 B

View File

@ -443,10 +443,13 @@ static void extract_directory(char *buf, const char *path, size_t size)
buf[0] = '\0'; buf[0] = '\0';
} }
static void update_viewport(void) static bool update_viewport(void)
{ {
vwidth = bitmap.viewport.w + (bitmap.viewport.x * 2); int ow = vwidth;
vheight = bitmap.viewport.h + (bitmap.viewport.y * 2); int oh = vheight;
vwidth = bitmap.viewport.w + (bitmap.viewport.x * 2);
vheight = bitmap.viewport.h + (bitmap.viewport.y * 2);
if (config.ntsc) if (config.ntsc)
{ {
@ -460,6 +463,8 @@ static void update_viewport(void)
{ {
vheight = vheight * 2; vheight = vheight * 2;
} }
return ((ow != vwidth) || (oh != vheight));
} }
static void check_variables(void) static void check_variables(void)
@ -712,8 +717,8 @@ static void configure_controls(void)
int i; int i;
struct retro_variable var; struct retro_variable var;
input.system[0] = SYSTEM_MD_GAMEPAD; input.system[0] = SYSTEM_GAMEPAD;
input.system[1] = SYSTEM_MD_GAMEPAD; input.system[1] = SYSTEM_GAMEPAD;
var.key = "padtype"; var.key = "padtype";
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
@ -726,15 +731,9 @@ static void configure_controls(void)
else if (!strcmp(var.value, "2-buttons")) else if (!strcmp(var.value, "2-buttons"))
for(i = 0; i < MAX_INPUTS; i++) for(i = 0; i < MAX_INPUTS; i++)
config.input[i].padtype = DEVICE_PAD2B; 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 else
for(i = 0; i < MAX_INPUTS; i++) 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"; var.key = "multitap";
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
@ -746,6 +745,8 @@ static void configure_controls(void)
input.system[1] = SYSTEM_TEAMPLAYER; input.system[1] = SYSTEM_TEAMPLAYER;
else if (!strcmp(var.value, "teamplayer 1&2")) else if (!strcmp(var.value, "teamplayer 1&2"))
input.system[0] = input.system[1] = SYSTEM_TEAMPLAYER; input.system[0] = input.system[1] = SYSTEM_TEAMPLAYER;
else if (!strcmp(var.value, "master system 4p"))
input.system[0] = SYSTEM_MS4PLAY;
var.key = "portb"; var.key = "portb";
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); 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" }, { "addr_error", "68k address error; enabled|disabled" },
{ "lock_on", "Cartridge lock-on; disabled|game genie|action replay (pro)|sonic & knuckles" }, { "lock_on", "Cartridge lock-on; disabled|game genie|action replay (pro)|sonic & knuckles" },
{ "padtype", "Gamepad type; auto|6-buttons|3-buttons|2-buttons" }, { "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" }, { "portb", "Control Port 2; enabled|disabled" },
{ "ym2413", "Master System FM; auto|disabled|enabled" }, { "ym2413", "Master System FM; auto|disabled|enabled" },
{ "dac_bits", "YM2612 DAC quantization; disabled|enabled" }, { "dac_bits", "YM2612 DAC quantization; disabled|enabled" },
@ -1004,11 +1005,13 @@ void retro_run(void)
if (bitmap.viewport.changed & 1) if (bitmap.viewport.changed & 1)
{ {
struct retro_system_av_info info;
bitmap.viewport.changed &= ~1; bitmap.viewport.changed &= ~1;
update_viewport(); if (update_viewport())
retro_get_system_av_info(&info); {
environ_cb(RETRO_ENVIRONMENT_SET_SYSTEM_AV_INFO, &info); 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); video_cb(bitmap.data, vwidth, vheight, 720 * 2);

View File

@ -40,13 +40,14 @@ void set_config_defaults(void)
config.render = 0; /* 1 = double resolution output (only when interlaced mode 2 is enabled) */ config.render = 0; /* 1 = double resolution output (only when interlaced mode 2 is enabled) */
/* controllers options */ /* controllers options */
input.system[0] = SYSTEM_MD_GAMEPAD; input.system[0] = SYSTEM_GAMEPAD;
input.system[1] = SYSTEM_MD_GAMEPAD; input.system[1] = SYSTEM_GAMEPAD;
config.gun_cursor[0] = 1; config.gun_cursor[0] = 1;
config.gun_cursor[1] = 1; config.gun_cursor[1] = 1;
config.invert_mouse = 0; config.invert_mouse = 0;
for (i=0;i<MAX_INPUTS;i++) for (i=0;i<MAX_INPUTS;i++)
{ {
config.input[i].padtype = DEVICE_PAD3B; /* autodetected control pad type */
config.input[i].padtype = DEVICE_PAD2B | DEVICE_PAD3B | DEVICE_PAD6B;
} }
} }