From a7094fb1fb0f7604343a19cce4090c0e74d2d928 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Ahlstro=CC=88m?= Date: Tue, 31 Oct 2023 17:45:24 +0100 Subject: [PATCH] Fixed arcade rom loading. --- History.txt | 4 +- README.md | 22 ++++- source/Equates.h | 2 + source/Gui.c | 2 +- source/RomLoading.c | 227 ++++++++++++++++++++++++++++++-------------- 5 files changed, 180 insertions(+), 77 deletions(-) diff --git a/History.txt b/History.txt index 70da8f4..90f7d86 100644 --- a/History.txt +++ b/History.txt @@ -2,10 +2,12 @@ S8DS revision history -=-=-=-=-=-=-=-=-=-=-=- -V1.1.7 - 2023-10-28 (FluBBa) +V1.1.7 - 2023-10-31 (FluBBa) Added support for "Megumi Rescue" on System-E. Added support for "Opa Opa unencrypted" on System-E. Added support for "Slap Shooter" on System-E. + Added support for "Super Derby (satellite board)" on SG-AC (not working). + Added support for "Super Derby II (satellite board)" on SG-AC (not working). Added new debug menu. Fixed envelope handling on the AY38910. Fixed pause on older Sega machines (again). diff --git a/README.md b/README.md index aed271f..c92ee22 100644 --- a/README.md +++ b/README.md @@ -88,8 +88,6 @@ better 3D effect, I have only tested with red/cyan glasses. * GG Border: Lets you change between black, bordercolor and none. * Perfect Sprites: Uses a bit more cpu but is worth it. * 3D Display: Terminator vs Robocop needs this off. - * Disable Background: Turn on/off background rendering. - * Disable Sprites: Turn on/off sprite rendering. * Machine: * Region: Change the region of the SMS and video standard. * Machine: Here you can select the hardware, Auto should work for most games. @@ -116,8 +114,12 @@ better 3D effect, I have only tested with red/cyan glasses. screen when menu is not active. * Emulator on Bottom: Select if top or bottom screen should be used for emulator, when menu is active emulator screen is allways on top. - * Debug Output: Toggle fps meter & more. * Autosleep: Change the autosleep time, also see Sleep. !!!DoesntWork!!! +* Debug: + * Debug Output: Toggle fps meter & more. + * Disable Background: Turn on/off background rendering. + * Disable Sprites: Turn on/off sprite rendering. + * Step Frame: Emulate one frame. * Dipswitches: For arcade games ### About @@ -126,27 +128,37 @@ Some dumb info... ## Arcade roms +## MegaTech + * After Burner MT - mt_aftrb.zip * Alien Syndrom MT - mt_asyn.zip * Astro Warrior MT - mt_astro.zip * Fantasy Zone MT - mt_fz.zip * Great Football MT - mt_gfoot.zip * Great Golf MT - mt_ggolf.zip -* Great Soccer MT - mt_gsocr.zip +* Great Soccer MT - mt_gsocr.zip (bad dump) * Out Run MT - mt_orun.zip * Parlour Games MT - mt_parlg.zip * Shinobi MT - mt_shnbi.zip +## SG AC + * Champion Boxing SG-AC - chboxing.zip * Champion Wrestling SG-AC - chwrestl.zip (encrypted) * Doki Doki Penguin SG-AC - dokidoki.zip +* Super Derby (satellite board) SG-AC - sderbys (not working) +* Super Derby II (satellite board) SG-AC - sderby2s (not working) + +## System-E * Astro Flash System-E - astrofl.zip (encrypted) * Fantasy Zone 2 System-E - fantzn2.zip (encrypted) * Hang On Jr System-E - hangonjr.zip * Megumi Rescue System-E - megrescu.zip * Opa Opa System-E - opaopa.zip (encrypted) +* Opa Opa System-E - opaopan.zip * Riddle Of Pythagoras System-E - ridleofp.zip +* Slap Shooter System-E - slapshtr.zip * Tetris System-E - tetrisse.zip * Transformer System-E - transfrm.zip @@ -163,6 +175,6 @@ The crew at PocketHeaven for their support. Fredrik Ahlström -Twitter/X @TheRealFluBBa +X/Twitter @TheRealFluBBa http://www.github.com/FluBBaOfWard diff --git a/source/Equates.h b/source/Equates.h index 2c4d32d..2415ca6 100644 --- a/source/Equates.h +++ b/source/Equates.h @@ -51,6 +51,8 @@ #define AC_CHAMPION_BOXING (0x01) #define AC_CHAMPION_WRESTLING (0x02) #define AC_DOKI_DOKI_PENGUIN (0x03) +#define AC_SUPER_DERBY (0x04) +#define AC_SUPER_DERBY_II (0x05) #define AC_HANG_ON_JR (0x10) #define AC_SLAP_SHOOTER (0x11) #define AC_TRANSFORMER (0x12) diff --git a/source/Gui.c b/source/Gui.c index b20d2ff..a7d45a9 100644 --- a/source/Gui.c +++ b/source/Gui.c @@ -30,7 +30,7 @@ #include "AY38910/Version.h" #include "SCC/Version.h" -#define EMUVERSION "V1.1.7 2023-10-28" +#define EMUVERSION "V1.1.7 2023-10-31" #define ENABLE_LIVE_UI (1<<12) diff --git a/source/RomLoading.c b/source/RomLoading.c index 99b8fe9..6ab951a 100644 --- a/source/RomLoading.c +++ b/source/RomLoading.c @@ -34,19 +34,15 @@ // Shinobi // Spellcaster? +const ArcadeGame megaTechGames[10]; const ArcadeGame systemeGames[10]; - -static char *const megatechNames[] ={"Great Golf MT", "Great Soccer MT", "Out Run MT", "Alien Syndrom MT","Shinobi MT", "Fantasy Zone MT", "After Burner MT", "Astro Warrior MT","Great Football MT","Parlour Games MT"}; -static char *const megatechFiles[] ={"mt_ggolf.zip", "mt_gsocr.zip", "mt_orun.zip", "mt_asyn.zip", "mt_shnbi.zip", "mt_fz.zip", "mt_aftrb.zip", "mt_astro.zip", "mt_gfoot.zip", "mt_parlg.zip"}; -static char *const megatechGames[] ={"mp11129f.ic1", "mp10747f.ic1", "mpr-11078.ic1", "mpr-11194.ic1", "mp11706.ic1", "mpr-10118.ic1", "mp11271.ic1", "ep13817.ic2", "mpr-10576f.ic1", "mp11404.ic1"}; -//static char *const megatechGuides[]={"epr-12368-04.ic2","epr-12368-05.ic2","epr-12368-06.ic2","epr-12368-07.ic2","epr-12368-08.ic2","epr-12368-09.bin","epr-12368-10.ic2","epr-12368-13.ic1","epr-12368-19.ic2", "epr-12368-29.ic2"}; -static const int megatechSizes[] ={0x20000, 0x20000, 0x40000, 0x40000, 0x40000, 0x20000, 0x80000, 0x20000, 0x20000, 0x20000}; +const ArcadeGame sgacGames[5]; static const char syseDefines[] = {AC_HANG_ON_JR, AC_SLAP_SHOOTER, AC_TRANSFORMER, AC_ASTRO_FLASH, AC_RIDDLE_OF_PYTHAGORAS, AC_OPA_OPA, AC_OPA_OPA_N, AC_FANTASY_ZONE_2, AC_TETRIS, AC_MEGUMI_RESCUE}; +static const char sgacDefines[] = {AC_CHAMPION_BOXING, AC_CHAMPION_WRESTLING, AC_DOKI_DOKI_PENGUIN, AC_SUPER_DERBY, AC_SUPER_DERBY_II}; int loadArcadeROM(void *dest, const char *fName) { int i; - int size = 0; char fNameLowercase[16]; char zipSubName[32]; @@ -57,12 +53,12 @@ int loadArcadeROM(void *dest, const char *fName) { // drawtext("Checking for Arcade Roms", 23, 0); strcasel(fNameLowercase, fName); for (i = 0; i < 10; i++) { - if (strstr(fNameLowercase, megatechFiles[i])) { - if (loadFileInZip(dest, fName, megatechGames[i], megatechSizes[i]) == 0) { - size = cenHead.ucSize; - strlcpy(currentFilename, megatechNames[i], sizeof(currentFilename)); + strlMerge(zipSubName, megaTechGames[i].gameName, ".zip", sizeof(zipSubName)); + if (strstr(fNameLowercase, zipSubName)) { + if (!loadACRoms(dest, megaTechGames, i, ARRSIZE(megaTechGames), true)) { + strlcpy(currentFilename, megaTechGames[i].fullName, sizeof(currentFilename)); gEmuFlags |= MT_MODE; - return size; + return megaTechGames[i].roms[0].romSize; } } } @@ -71,6 +67,7 @@ int loadArcadeROM(void *dest, const char *fName) { strlMerge(zipSubName, systemeGames[i].gameName, ".zip", sizeof(zipSubName)); if (strstr(fNameLowercase, zipSubName)) { if (!loadACRoms(dest, systemeGames, i, ARRSIZE(systemeGames), true)) { + strlcpy(currentFilename, systemeGames[i].fullName, sizeof(currentFilename)); gEmuFlags |= SYSE_MODE; gArcadeGameSet = syseDefines[i]; return 0x80000; @@ -78,64 +75,101 @@ int loadArcadeROM(void *dest, const char *fName) { } } - if (strstr(fNameLowercase, "chboxing.zip")) { - if (loadFileInZip(dest, fName, "cb6105.bin", 0x4000) == 0) { - if (loadFileInZip(dest+0x4000, fName, "cb6106.bin", 0x4000) == 0) { - if (loadFileInZip(dest+0x8000, fName, "cb6107.bin", 0x2000) == 0) { - size = 0x10000; - strlcpy(currentFilename, "Champion Boxing SG-AC", sizeof(currentFilename)); - gEmuFlags |= SGAC_MODE; - gArcadeGameSet = AC_CHAMPION_BOXING; - dipSwitch0 = 0x40; - } - } - } - } - else if (strstr(fNameLowercase, "chwrestl.zip")) { - if (loadFileInZip(dest, fName, "5732", 0x4000) == 0) { - if (loadFileInZip(dest+0x4000, fName, "5733", 0x4000) == 0) { - if (loadFileInZip(dest+0x8000, fName, "5734", 0x4000) == 0) { - size = 0x10000; - strlcpy(currentFilename, "Champion Wrestling SG-AC", sizeof(currentFilename)); - gEmuFlags |= SGAC_MODE; - gArcadeGameSet = AC_CHAMPION_WRESTLING; - dipSwitch0 = 0xC0; - } - } - } - } - else if (strstr(fNameLowercase, "dokidoki.zip")) { - if (loadFileInZip(dest, fName, "epr-7356.ic1", 0x4000) == 0) { - if (loadFileInZip(dest+0x4000, fName, "epr-7357.ic2", 0x4000) == 0) { - if (loadFileInZip(dest+0x8000, fName, "epr-7358.ic3", 0x4000) == 0) { - size = 0x10000; - strlcpy(currentFilename, "Doki Doki Penguin SG-AC", sizeof(currentFilename)); - gEmuFlags |= SGAC_MODE; - gArcadeGameSet = AC_DOKI_DOKI_PENGUIN; - dipSwitch0 = 0xC0; - } + for (i = 0; i < 5; i++) { + strlMerge(zipSubName, sgacGames[i].gameName, ".zip", sizeof(zipSubName)); + if (strstr(fNameLowercase, zipSubName)) { + if (!loadACRoms(dest, sgacGames, i, ARRSIZE(sgacGames), true)) { + strlcpy(currentFilename, sgacGames[i].fullName, sizeof(currentFilename)); + gEmuFlags |= SGAC_MODE; + dipSwitch0 = 0xC0; + gArcadeGameSet = sgacDefines[i]; + return 0x10000; } } } - return size; + return 0; } void strcasel(char *dest, const char *source) { int i; - strncpy(dest, source, 15); + strlcpy(dest, source, 16); for (i = 0; i < 16; i++) { if (dest[i] > 0x40 && dest[i] < 0x5B) dest[i] |= 0x20; } } +// Game 04 - Great Golf (SMS) +// Also known to have the ID# MPR-11128 instead of MPR-11129F, same contents +static const ArcadeRom mt_ggolfRoms[2] = { + {"mp11129f.ic1", 0x20000, 0xc6611c84}, + {"epr-12368-04.ic2", 0x8000, 0x62e5579b}, +}; + +// Game 05 - Great Soccer (SMS) - bad dump +static const ArcadeRom mt_gsocrRoms[2] = { + {"mp10747f.ic1", 0x20000, 0x9cf53703}, + {"epr-12368-05.ic2", 0x8000, 0xbab91fcc}, +}; + +// Game 06 - Out Run (SMS) +static const ArcadeRom mt_orunRoms[2] = { + {"mpr-11078.ic1", 0x40000, 0x5589d8d2}, + {"epr-12368-06.ic2", 0x8000, 0xc7c74429}, +}; + +// Game 07 - Alien Syndrome (SMS) +static const ArcadeRom mt_asynRoms[2] = { + {"mpr-11194.ic1", 0x40000, 0x4cc11df9}, + {"epr-12368-07.ic2", 0x8000, 0x14f4a17b}, +}; + +// Game 08 - Shinobi (SMS) +static const ArcadeRom mt_shnbiRoms[2] = { + {"mp11706.ic1", 0x40000, 0x0c6fac4e}, + {"epr-12368-08.ic2", 0x8000, 0x103a0459}, +}; + +// Game 09 - Fantasy Zone (SMS) +// note, dump was bad, but the good (uniquely identifiable) parts matched the 'fantasy zone (world) (v1.2).bin' SMS rom +// so I'm using that until it gets verified. +static const ArcadeRom mt_fzRoms[2] = { + {"mpr-10118.ic1", 0x20000, 0x65d7e4e0}, + {"epr-12368-09.bin", 0x8000, 0x373d2a70}, +}; + +// Game 10 - After Burner (SMS) +static const ArcadeRom mt_aftrbRoms[2] = { + {"mp11271.ic1", 0x80000, 0x1c951f8e}, + {"epr-12368-10.ic2", 0x8000, 0x2a7cb590}, +}; + +// Game 13 - Astro Warrior (SMS) +static const ArcadeRom mt_astroRoms[2] = { + {"ep13817.ic2", 0x20000, 0x299cbb74}, + {"epr-12368-13.ic1", 0x8000, 0x4038cbd1}, +}; + +// Game 19 - Great Football (SMS) +static const ArcadeRom mt_gfootRoms[2] = { + {"mpr-10576f.ic1", 0x20000, 0x2055825f}, + {"epr-12368-19.ic2", 0x8000, 0xe27cb37a}, +}; + +// Game 29 - Parlour Games (SMS) +static const ArcadeRom mt_parlgRoms[2] = { + {"mp11404.ic1", 0x20000, 0xe030e66c}, + {"epr-12368-29.ic2", 0x8000, 0x534151e8}, +}; + + // Hang-On Jr., Sega System E // Game ID# 833-5911 HANG ON JR. REV. // ROM BD # 834-5910 REV.B // // Analog control board: 834-5805 (required for game to boot) // ICs on this board are LS244 (IC1), ADC0804 (IC2), LS367 (IC3) and CD4051 (IC4). -static const ArcadeRom hangOnJrRoms[5] = { +static const ArcadeRom hangonjrRoms[5] = { {"epr-7257b.ic7", 0x8000, 0xd63925a7}, {"epr-7258.ic5", 0x8000, 0xee3caab3}, {"epr-7259.ic4", 0x8000, 0xd2ba9bc9}, @@ -145,7 +179,7 @@ static const ArcadeRom hangOnJrRoms[5] = { // Slap Shooter, Sega System E // ROM BD # 834-5930 -static const ArcadeRom slapShooterRoms[5] = { +static const ArcadeRom slapshtrRoms[5] = { {"epr-7351.ic7", 0x8000, 0x894adb04}, {"epr-7352.ic5", 0x8000, 0x61c938b6}, {"epr-7353.ic4", 0x8000, 0x8ee2951a}, @@ -156,7 +190,7 @@ static const ArcadeRom slapShooterRoms[5] = { // Transformers, Sega System E // Game ID# 833-5927-01 // ROM BD # 834-5929-01 -static const ArcadeRom transformerRoms[5] = { +static const ArcadeRom transfrmRoms[5] = { {"epr-7605.ic7", 0x8000, 0xccf1d123}, {"epr-7347.ic5", 0x8000, 0xdf0f639f}, {"epr-7348.ic4", 0x8000, 0x0f38ea96}, @@ -165,7 +199,7 @@ static const ArcadeRom transformerRoms[5] = { }; // Astro Flash (Japan), Sega System E -static const ArcadeRom astroFlashRoms[5] = { +static const ArcadeRom astroflRoms[5] = { {"epr-7723.ic7", 0x8000, 0x66061137}, {"epr-7347.ic5", 0x8000, 0xdf0f639f}, {"epr-7348.ic4", 0x8000, 0x0f38ea96}, @@ -176,7 +210,7 @@ static const ArcadeRom astroFlashRoms[5] = { // Riddle of Pythagoras (Japan), Sega System E // Game ID# 833-6200 ピタゴラス ノ ナゾ // I/O board 834-6193 © SEGA 1986 -static const ArcadeRom riddleOfPythagorasRoms[5] = { +static const ArcadeRom ridleofpRoms[5] = { {"epr-10426.bin", 0x8000, 0x4404c7e7}, {"epr-10425.bin", 0x8000, 0x35964109}, {"epr-10424.bin", 0x8000, 0xfcda1dfa}, @@ -186,7 +220,7 @@ static const ArcadeRom riddleOfPythagorasRoms[5] = { // Opa Opa (MC-8123, 317-0042), Sega System E // Game ID# 833-6407-01 OPA OPA -static const ArcadeRom opaOpaRoms[6] = { +static const ArcadeRom opaopaRoms[6] = { {"epr-11054.ic7", 0x8000, 0x024b1244}, {"epr-11053.ic5", 0x8000, 0x6bc41d6e}, {"epr-11052.ic4", 0x8000, 0x395c1d0a}, @@ -197,7 +231,7 @@ static const ArcadeRom opaOpaRoms[6] = { // Opa Opa, Sega System E // Game ID# 833-6407 OPA OPA -static const ArcadeRom opaOpaNRoms[5] = { +static const ArcadeRom opaopanRoms[5] = { {"epr-11023a.ic7", 0x8000, 0x101c5c6a}, {"epr-11022.ic5", 0x8000, 0x15203a42}, {"epr-11021.ic4", 0x8000, 0xb4e83340}, @@ -206,7 +240,7 @@ static const ArcadeRom opaOpaNRoms[5] = { }; // Fantasy Zone II - The Tears of Opa-Opa (MC-8123, 317-0057), Sega System E -static const ArcadeRom fantasyZone2Roms[6] = { +static const ArcadeRom fantzn2Roms[6] = { {"epr-11416.ic7", 0x8000, 0x76db7b7b}, {"epr-11415.ic5", 0x10000, 0x57b45681}, {"epr-11413.ic3", 0x10000, 0xa231dc85}, @@ -216,14 +250,14 @@ static const ArcadeRom fantasyZone2Roms[6] = { }; // Tetris (Japan), Sega System E -static const ArcadeRom tetrisRoms[3] = { +static const ArcadeRom tetrisseRoms[3] = { {"epr-12213.7", 0x8000, 0xef3c7a38}, {"epr-12212.5", 0x8000, 0x28b550bf}, {"epr-12211.4", 0x8000, 0x5aa114e9}, }; // Megumi Rescue, Sega System E -static const ArcadeRom megumiRescueRoms[5] = { +static const ArcadeRom megrescuRoms[5] = { {"megumi_rescue_version_10.30_final_version_ic-7.ic7", 0x8000, 0x490d0059}, {"megumi_rescue_version_10.30_final_version_ic-7.ic5", 0x8000, 0x278caba8}, {"megumi_rescue_version_10.30_final_version_ic-7.ic4", 0x8000, 0xbda242d1}, @@ -231,15 +265,68 @@ static const ArcadeRom megumiRescueRoms[5] = { {"megumi_rescue_version_10.30_final_version_ic-7.ic2", 0x8000, 0x5b74c767}, }; +// Champion Boxing SGAC +static const ArcadeRom chboxingRoms[3] = { + {"cb6105.bin", 0x4000, 0x43516f2e}, + {"cb6106.bin", 0x4000, 0x65e2c750}, + {"cb6107.bin", 0x2000, 0xc2f8e522}, +}; + +// Champion Wrestling SGAC (encrypted) +static const ArcadeRom chwrestlRoms[3] = { + {"5732", 0x4000, 0xa4e44370}, + {"5733", 0x4000, 0x4f493538}, + {"5734", 0x4000, 0xd99b6301}, +}; + +// Doki Doki Penguin Land SGAC +static const ArcadeRom dokidokiRoms[3] = { + {"epr-7356.ic1", 0x4000, 0x95658c31}, + {"epr-7357.ic2", 0x4000, 0xe8dbad85}, + {"epr-7358.ic3", 0x4000, 0xc6f26b0b}, +}; + +// Super Derby (satellite board) SGAC +static const ArcadeRom sderbysRoms[1] = { + {"v1.2.ic10", 0x4000, 0xcf29b579}, +}; + +// Super Derby II (satellite board) SGAC +static const ArcadeRom sderby2sRoms[2] = { + {"epr-6450d.ic10", 0x4000, 0xe56986d3}, + {"epr-6504d.ic11", 0x4000, 0x7bb364b9}, +}; + +const ArcadeGame megaTechGames[10] = { + AC_GAME("mt_ggolf", "Great Golf (Mega-Tech, SMS based)", mt_ggolfRoms) + AC_GAME("mt_gsocr", "Great Soccer (Mega-Tech, SMS based)", mt_gsocrRoms) + AC_GAME("mt_orun", "Out Run (Mega-Tech, SMS based)", mt_orunRoms) + AC_GAME("mt_asyn", "Alien Syndrome (Mega-Tech, SMS based)", mt_asynRoms) + AC_GAME("mt_shnbi", "Shinobi (Mega-Tech, SMS based)", mt_shnbiRoms) + AC_GAME("mt_fz", "Fantasy Zone (Mega-Tech, SMS based)", mt_fzRoms) + AC_GAME("mt_aftrb", "After Burner (Mega-Tech, SMS based)", mt_aftrbRoms) + AC_GAME("mt_astro", "Astro Warrior (Mega-Tech, SMS based)", mt_astroRoms) + AC_GAME("mt_gfoot", "Great Football (Mega-Tech, SMS based)", mt_gfootRoms) + AC_GAME("mt_parlg", "Parlour Games (Mega-Tech, SMS based)", mt_parlgRoms) +}; + const ArcadeGame systemeGames[10] = { - AC_GAME("hangonjr", "Hang-On Jr. (Rev. B)", hangOnJrRoms) - AC_GAME("slapshtr", "Slap Shooter", slapShooterRoms) - AC_GAME("transfrm", "Transformer", transformerRoms) - AC_GAME("astrofl", "Astro Flash (Japan)", astroFlashRoms) - AC_GAME("ridleofp", "Riddle of Pythagoras (Japan)", riddleOfPythagorasRoms) - AC_GAME("opaopa", "Opa Opa (MC-8123, 317-0042)", opaOpaRoms) - AC_GAME("opaopan", "Opa Opa (Rev A, unprotected)", opaOpaNRoms) - AC_GAME("fantzn2", "Fantasy Zone II - The Tears of Opa-Opa (MC-8123, 317-0057)", fantasyZone2Roms) - AC_GAME("tetrisse", "Tetris (Japan, System E)", tetrisRoms) - AC_GAME("megrescu", "Megumi Rescue", megumiRescueRoms) + AC_GAME("hangonjr", "Hang-On Jr. (Rev. B)", hangonjrRoms) + AC_GAME("slapshtr", "Slap Shooter", slapshtrRoms) + AC_GAME("transfrm", "Transformer", transfrmRoms) + AC_GAME("astrofl", "Astro Flash (Japan)", astroflRoms) + AC_GAME("ridleofp", "Riddle of Pythagoras (Japan)", ridleofpRoms) + AC_GAME("opaopa", "Opa Opa (MC-8123, 317-0042)", opaopaRoms) + AC_GAME("opaopan", "Opa Opa (Rev A, unprotected)", opaopanRoms) + AC_GAME("fantzn2", "Fantasy Zone II - The Tears of Opa-Opa (MC-8123, 317-0057)", fantzn2Roms) + AC_GAME("tetrisse", "Tetris (Japan, System E)", tetrisseRoms) + AC_GAME("megrescu", "Megumi Rescue", megrescuRoms) +}; + +const ArcadeGame sgacGames[5] = { + AC_GAME("chboxing", "Champion Boxing", chboxingRoms) + AC_GAME("chwrestl", "Champion Pro Wrestling", chwrestlRoms) + AC_GAME("dokidoki", "Doki Doki Penguin Land", dokidokiRoms) + AC_GAME("sderbys", "Super Derby (satellite board)", sderbysRoms) + AC_GAME("sderby2s", "Super Derby II (satellite board)", sderby2sRoms) };