[gens-sdl] EmuLoop::run(): Added support for ROM region auto-detection.
authorDavid Korth <gerbilsoft@gerbilsoft.com>
Sun, 3 Apr 2016 02:29:52 +0000 (22:29 -0400)
committerDavid Korth <gerbilsoft@gerbilsoft.com>
Sun, 3 Apr 2016 02:29:52 +0000 (22:29 -0400)
Currently always uses the 0x4812 detection order. (US, Europe, Japan, Asia)

Options.cpp: Added a region code "auto". This is now the default.

src/gens-sdl/EmuLoop.cpp
src/gens-sdl/Options.cpp

index 2a68135..dd2de87 100644 (file)
@@ -679,8 +679,25 @@ int EmuLoop::run(const Options *options)
                EmuContext::SetTmssEnabled(true);
        }
 
+       // Detect the ROM region.
+       SysVersion::RegionCode_t region = options->region();
+       SysVersion::RegionCode_t region_auto = SysVersion::REGION_AUTO;
+       if (region == SysVersion::REGION_AUTO) {
+               // Auto-detect the region code.
+               // Using region code order 0x4812.
+               // (US, Europe, Japan, Asia)
+               region = SysVersion::DetectRegion(d->rom->regionCode(), 0x4812);
+               if (region == SysVersion::REGION_AUTO) {
+                       // Detection failed.
+                       // Default to US/NTSC.
+                       region = SysVersion::REGION_US_NTSC;
+               }
+
+               region_auto = region;
+       }
+
        // Create the emulation context.
-       d->emuContext = EmuContextFactory::createContext(d->rom, options->region());
+       d->emuContext = EmuContextFactory::createContext(d->rom, region);
        if (!d->emuContext || !d->emuContext->isRomOpened()) {
                // Error loading the ROM into EmuMD.
                // TODO: Error code?
@@ -705,13 +722,25 @@ int EmuLoop::run(const Options *options)
        // Check for startup messages.
        checkForStartupMessages();
 
+       // If the ROM region was auto-detected, print a message.
+       if (region_auto != SysVersion::REGION_AUTO) {
+               static const char *const region_tbl[4] = {
+                       "Japan (NTSC)",
+                       "Asia (PAL)",
+                       "USA (NTSC)",
+                       "Europe (PAL)"
+               };
+
+               const char *region_str = region_tbl[region_auto & 3];
+               d->vBackend->osd_printf(1500, "ROM region detected as %s.", region_str);
+       }
+
        // Set frame timing.
        // TODO: SysVersion convenience function to check if a RegionCode_t is PAL.
        bool isPal;
-       switch (options->region()) {
+       switch (region) {
                case SysVersion::REGION_US_NTSC:
                case SysVersion::REGION_JP_NTSC:
-               case SysVersion::REGION_AUTO:   // TODO: Auto-detect.
                default:
                        isPal = false;
                        break;
index 1a8212a..0c0264b 100644 (file)
@@ -116,7 +116,7 @@ void OptionsPrivate::reset(void)
        // Emulation options.
        sprite_limits = true;
        auto_fix_checksum = false;
-       region = SysVersion::REGION_US_NTSC;
+       region = SysVersion::REGION_AUTO;
 
        // UI options.
        fps_counter = true;
@@ -246,7 +246,7 @@ int Options::parse(int argc, const char *argv[])
                {"no-auto-fix-checksum", '\0', POPT_ARG_VAL, &d->auto_fix_checksum, 0,
                        "* Don't automatically fix checksums.", NULL},
                {"region", '\0', POPT_ARG_STRING, &tmp.region, 0,
-                       "  Set the region code: J,U,E,Asia (default U)", "REGION"},
+                       "  Set the region code: J,U,E,Asia,Auto (default is auto)", "REGION"},
                POPT_TABLEEND
        };
 
@@ -411,11 +411,15 @@ int Options::parse(int argc, const char *argv[])
                {
                        d->region = SysVersion::REGION_ASIA_PAL;
                }
+               else if (!strcasecmp(tmp.region, "auto"))
+               {
+                       d->region = SysVersion::REGION_AUTO;
+               }
                else
                {
                        // Invalid region code.
                        fprintf(stderr, "%s: '--region=%s': invalid region code\n"
-                               "Valid options are J, U, E, Asia.\n"
+                               "Valid options are J, U, E, Asia, and Auto.\n"
                                "Try `%s --help` for more information.\n",
                                argv[0], tmp.region, argv[0]);
                        poptFreeContext(optCon);