static int Main(string[] args)
        {
            startTime = DateTime.Now;
            string port       = "auto";
            string mapper     = "0";
            string psize      = null;
            string csize      = null;
            string filename   = null;
            string luaCode    = null;
            string luaFile    = null;
            string unifName   = null;
            string unifAuthor = null;
            bool   reset      = false;
            bool   silent     = true;

            try
            {
                if (args.Length == 0)
                {
                    PrintHelp();
                    return(0);
                }

                string command = args[0];

                for (int i = 1; i < args.Length; i++)
                {
                    string param = args[i];
                    while (param.StartsWith("-"))
                    {
                        param = param.Substring(1);
                    }
                    string value = i < args.Length - 1 ? args[i + 1] : "";
                    switch (param.ToLower())
                    {
                    case "p":
                    case "port":
                        port = value;
                        i++;
                        break;

                    case "m":
                    case "mapper":
                        mapper = value;
                        i++;
                        break;

                    case "f":
                    case "file":
                        filename = value;
                        i++;
                        break;

                    case "lua":
                    case "script":
                        luaCode = value;
                        i++;
                        break;

                    case "luafile":
                    case "scriptfile":
                        luaFile = value;
                        i++;
                        break;

                    case "psize":
                        psize = value;
                        i++;
                        break;

                    case "csize":
                        csize = value;
                        i++;
                        break;

                    case "unifname":
                        unifName = value;
                        i++;
                        break;

                    case "unifauthor":
                        unifAuthor = value;
                        i++;
                        break;

                    case "reset":
                        reset = true;
                        break;

                    case "silent":
                        silent = true;
                        break;

                    case "sound":
                        silent = false;
                        break;

                    default:
                        Console.WriteLine("Unknown parameter: " + param);
                        PrintHelp();
                        return(2);
                    }
                }

                using (var dumper = new FamicomDumperConnection(port))
                {
                    dumper.Open();
                    Console.Write("PRG reader initialization... ");
                    bool prgInit = dumper.PrgReaderInit();
                    if (!prgInit)
                    {
                        throw new Exception("can't init PRG reader");
                    }
                    Console.WriteLine("OK");
                    Console.Write("CHR reader initialization... ");
                    bool chrInit = dumper.ChrReaderInit();
                    if (!chrInit)
                    {
                        throw new Exception("can't init CHR reader");
                    }
                    Console.WriteLine("OK");
                    if (reset)
                    {
                        Reset(dumper);
                    }

                    LuaMapper luaMapper = null;
                    if (!string.IsNullOrEmpty(luaFile) || !string.IsNullOrEmpty(luaCode) || command.ToLower() == "console")
                    {
                        luaMapper = new LuaMapper();
                    }
                    if (!string.IsNullOrEmpty(luaFile))
                    {
                        Console.WriteLine("Executing Lua script \"{0}\"...", Path.GetFileName(luaFile));
                        luaMapper.Verbose = true;
                        luaMapper.Execute(dumper, luaFile, true);
                        luaMapper.Verbose = false;
                    }
                    if (!string.IsNullOrEmpty(luaCode))
                    {
                        Console.WriteLine("Executing Lua code: \"{0}\"", luaCode);
                        luaMapper.Verbose = true;
                        luaMapper.Execute(dumper, luaCode, false);
                        luaMapper.Verbose = false;
                    }

                    switch (command.ToLower())
                    {
                    case "reset":
                        if (!reset)
                        {
                            Reset(dumper);
                        }
                        break;

                    case "list-mappers":
                        ListMappers();
                        break;

                    case "dump":
                        Dump(dumper, filename ?? "output.nes", mapper, parseSize(psize), parseSize(csize), unifName, unifAuthor);
                        break;

                    case "read-prg-ram":
                    case "dump-prg-ram":
                    case "dump-sram":
                        ReadPrgRam(dumper, filename ?? "savegame.sav", mapper);
                        break;

                    case "write-prg-ram":
                    case "write-sram":
                        WritePrgRam(dumper, filename ?? "savegame.sav", mapper);
                        break;

                    case "test-prg-ram":
                    case "test-sram":
                        TestPrgRam(dumper, mapper);
                        break;

                    case "test-prg-ram-coolgirl":
                    case "test-sram-coolgirl":
                        TestPrgRamCoolgirl(dumper);
                        break;

                    case "test-battery":
                        TestBattery(dumper, mapper);
                        break;

                    case "test-chr-ram":
                        TestChrRam(dumper);
                        break;

                    case "test-chr-coolgirl":
                        TestChrRamCoolgirl(dumper);
                        break;

                    case "test-coolgirl":
                        TestCoolgirlFull(dumper);
                        break;

                    case "dump-tiles":
                        DumpTiles(dumper, filename ?? "output.png", mapper, parseSize(csize));
                        break;

                    case "write-flash":
                        WriteFlash(dumper, filename ?? "game.nes");
                        break;

                    case "write-coolboy":
                        WriteCoolboy(dumper, filename ?? "game.nes");
                        break;

                    case "write-coolgirl":
                        WriteCoolgirl(dumper, filename ?? "game.nes");
                        break;

                    case "jtag":
                        WriteJtag(dumper, filename ?? "mapper.fmp");
                        break;

                    case "bootloader":
                        Bootloader(dumper);
                        break;

                    case "console":
                        LuaConsole(dumper, luaMapper);
                        break;

                    case "nop":
                    case "none":
                    case "-":
                        break;

                    default:
                        Console.WriteLine("Unknown command: " + command);
                        PrintHelp();
                        return(2);
                    }
                    Console.WriteLine("Done in {0} seconds", (int)(DateTime.Now - startTime).TotalSeconds);
                    if (!silent)
                    {
                        doneSound.PlaySync();
                    }
                    return(0);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);
                if (!silent)
                {
                    Console.Beep();
                }
                return(1);
            }
        }
Example #2
0
        static int Main(string[] args)
        {
            Console.WriteLine("Famicom Dumper Client v{0}.{1}",
                              Assembly.GetExecutingAssembly().GetName().Version.Major,
                              Assembly.GetExecutingAssembly().GetName().Version.Minor);
            Console.WriteLine("  Commit {0} @ https://github.com/ClusterM/famicom-dumper-client",
                              Properties.Resources.gitCommit);
            Console.WriteLine("  (c) Alexey 'Cluster' Avdyukhin / https://clusterrr.com / [email protected]");
            Console.WriteLine();
            startTime = DateTime.Now;
            string     port       = "auto";
            string     mapper     = "0";
            string     psize      = null;
            string     csize      = null;
            string     filename   = null;
            string     luaCode    = null;
            string     luaFile    = null;
            string     unifName   = null;
            string     unifAuthor = null;
            bool       reset      = false;
            bool       silent     = true;
            bool       needCheck  = false;
            bool       writePBBs  = false;
            List <int> badSectors = new List <int>();
            int        testCount  = -1;

            try
            {
                if (args.Length == 0)
                {
                    PrintHelp();
                    return(0);
                }

                string command = args[0].ToLower();

                for (int i = 1; i < args.Length; i++)
                {
                    string param = args[i];
                    while (param.StartsWith("-") || param.StartsWith("—"))
                    {
                        param = param.Substring(1);
                    }
                    string value = i < args.Length - 1 ? args[i + 1] : "";
                    switch (param.ToLower())
                    {
                    case "p":
                    case "port":
                        port = value;
                        i++;
                        break;

                    case "m":
                    case "mapper":
                        mapper = value;
                        i++;
                        break;

                    case "f":
                    case "file":
                        filename = value;
                        i++;
                        break;

                    case "lua":
                    case "script":
                        luaCode = value;
                        i++;
                        break;

                    case "luafile":
                    case "scriptfile":
                        luaFile = value;
                        i++;
                        break;

                    case "psize":
                        psize = value;
                        i++;
                        break;

                    case "csize":
                        csize = value;
                        i++;
                        break;

                    case "unifname":
                        unifName = value;
                        i++;
                        break;

                    case "unifauthor":
                        unifAuthor = value;
                        i++;
                        break;

                    case "reset":
                        reset = true;
                        break;

                    case "sound":
                        silent = false;
                        break;

                    case "check":
                        needCheck = true;
                        break;

                    case "lock":
                        writePBBs = true;
                        break;

                    case "testcount":
                        testCount = int.Parse(value);
                        i++;
                        break;

                    case "badsectors":
                        foreach (var v in value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
                        {
                            badSectors.Add(int.Parse(v));
                        }
                        i++;
                        break;

                    default:
                        Console.WriteLine("Unknown parameter: " + param);
                        PrintHelp();
                        return(2);
                    }
                }

                if (command == "list-mappers")
                {
                    ListMappers();
                    return(0);
                }

                using (var dumper = new FamicomDumperConnection(port))
                {
                    dumper.Open();
                    Console.Write("PRG reader initialization... ");
                    bool prgInit = dumper.PrgReaderInit();
                    if (!prgInit)
                    {
                        throw new Exception("can't init PRG reader");
                    }
                    Console.WriteLine("OK");
                    Console.Write("CHR reader initialization... ");
                    bool chrInit = dumper.ChrReaderInit();
                    if (!chrInit)
                    {
                        throw new Exception("can't init CHR reader");
                    }
                    Console.WriteLine("OK");
                    if (reset)
                    {
                        Reset(dumper);
                    }

                    LuaMapper luaMapper = null;
                    if (!string.IsNullOrEmpty(luaFile) || !string.IsNullOrEmpty(luaCode) || command.ToLower() == "console")
                    {
                        luaMapper = new LuaMapper();
                    }
                    if (!string.IsNullOrEmpty(luaFile))
                    {
                        Console.WriteLine("Executing Lua script \"{0}\"...", Path.GetFileName(luaFile));
                        luaMapper.Verbose = true;
                        luaMapper.Execute(dumper, luaFile, true);
                        luaMapper.Verbose = false;
                    }
                    if (!string.IsNullOrEmpty(luaCode))
                    {
                        Console.WriteLine("Executing Lua code: \"{0}\"", luaCode);
                        luaMapper.Verbose = true;
                        luaMapper.Execute(dumper, luaCode, false);
                        luaMapper.Verbose = false;
                    }

                    switch (command)
                    {
                    case "reset":
                        if (!reset)
                        {
                            Reset(dumper);
                        }
                        break;

                    case "list-mappers":
                        ListMappers();
                        break;

                    case "dump":
                        Dump(dumper, filename ?? "output.nes", mapper, parseSize(psize), parseSize(csize), unifName, unifAuthor);
                        break;

                    case "read-prg-ram":
                    case "dump-prg-ram":
                    case "dump-sram":
                        ReadPrgRam(dumper, filename ?? "savegame.sav", mapper);
                        break;

                    case "write-prg-ram":
                    case "write-sram":
                        WritePrgRam(dumper, filename ?? "savegame.sav", mapper);
                        break;

                    case "test-prg-ram":
                    case "test-sram":
                        TestPrgRam(dumper, mapper);
                        break;

                    case "test-prg-coolgirl":
                    case "test-prg-ram-coolgirl":
                    case "test-sram-coolgirl":
                        CoolgirlWriter.TestPrgRam(dumper);
                        break;

                    case "test-battery":
                        TestBattery(dumper, mapper);
                        break;

                    case "test-chr-ram":
                        TestChrRam(dumper);
                        break;

                    case "test-chr-coolgirl":
                    case "test-chr-ram-coolgirl":
                        CoolgirlWriter.TestChrRam(dumper);
                        break;

                    case "test-coolgirl":
                        CoolgirlWriter.FullTest(dumper, testCount);
                        break;

                    case "test-bads-coolgirl":
                        CoolgirlWriter.FindBads(dumper, silent);
                        break;

                    case "read-crc-coolgirl":
                        CoolgirlWriter.ReadCrc(dumper);
                        break;

                    case "dump-tiles":
                        DumpTiles(dumper, filename ?? "output.png", mapper, parseSize(csize));
                        break;

                    case "write-coolboy-gpio":
                        CoolboyWriter.WriteWithGPIO(dumper, filename ?? "game.nes");
                        break;

                    case "write-coolboy":
                    case "write-coolboy-direct":
                        CoolboyWriter.Write(dumper, filename ?? "game.nes", badSectors, silent, needCheck, writePBBs);
                        break;

                    case "write-coolgirl":
                        CoolgirlWriter.Write(dumper, filename ?? "game.nes", badSectors, silent, needCheck, writePBBs);
                        break;

                    case "write-eeprom":
                        WriteEeprom(dumper, filename ?? "game.nes");
                        break;

                    case "info-coolboy":
                        CoolboyWriter.GetInfo(dumper);
                        break;

                    case "info-coolgirl":
                        CoolgirlWriter.GetInfo(dumper);
                        break;

                    case "bootloader":
                        Bootloader(dumper);
                        break;

                    case "console":
                        LuaConsole(dumper, luaMapper);
                        break;

                    case "nop":
                    case "none":
                    case "-":
                        break;

                    default:
                        Console.WriteLine("Unknown command: " + command);
                        PrintHelp();
                        return(2);
                    }
                    Console.WriteLine("Done in {0} seconds", (int)(DateTime.Now - startTime).TotalSeconds);
                    if (!silent)
                    {
                        doneSound.PlaySync();
                    }
                    return(0);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);
                if (!silent)
                {
                    errorSound.PlaySync();
                }
                return(1);
            }
        }