static IMapper GetMapper(string mapperName)
        {
            if (File.Exists(mapperName)) // LUA script?
            {
                var luaMapper = new LuaMapper();
                luaMapper.Execute(null, mapperName, true);
                return(luaMapper);
            }
            var mapper = MappersContainer.GetMapper(mapperName ?? "0");

            if (mapper == null)
            {
                throw new Exception("can't find mapper");
            }
            return(mapper);
        }
 static void LuaConsole(FamicomDumperConnection dumper, LuaMapper luaMapper)
 {
     luaMapper.Verbose = true;
     Console.WriteLine("Starting interactive Lua console, type \"exit\" to exit.");
     while (true)
     {
         Console.Write("> ");
         var line = Console.ReadLine();
         if (line.ToLower().Trim() == "exit")
         {
             break;
         }
         try
         {
             luaMapper.Execute(dumper, line, false);
         }
         catch (Exception ex)
         {
             Console.WriteLine("Error: " + ex.Message);
         }
     }
 }
Exemple #3
0
        static IMapper GetMapper(string mapperName)
        {
            if (File.Exists(mapperName)) // LUA or CS script?
            {
                switch (Path.GetExtension(mapperName).ToLower())
                {
                case ".cs":
                    return(CompileMapperCS(mapperName));

                case ".lua":
                    var luaMapper = new LuaMapper();
                    luaMapper.Execute(null, mapperName, true);
                    return(luaMapper);

                default:
                    throw new Exception("Unknown mapper extention");
                }
            }

            if (string.IsNullOrEmpty(mapperName))
            {
                mapperName = "0";
            }
            var mapperList = CompileAllMappers()
                             .Where(m => m.Value.Name.ToLower() == mapperName.ToLower() ||
                                    (m.Value.Number >= 0 && m.Value.Number.ToString() == mapperName));

            if (mapperList.Count() == 0)
            {
                throw new Exception("can't find mapper");
            }
            var mapper = mapperList.First();

            Console.WriteLine("Using {0} as mapper file", mapper.Key);
            return(mapper.Value);
        }
        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);
            }
        }
Exemple #5
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);
            }
        }