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); } }
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); } }