private static int TryDisassemble(DisassemblyOptions opts, Func <RomVersion, string, Func <DisassemblyTask, bool> > getFilter) { string path; if (!RomVersion.TryGet(opts.GameId, opts.VersionId, out RomVersion version)) { Console.WriteLine($"Unrecognized version {opts.GameId} {opts.VersionId}"); return(-1); } if (opts.RomPath != null) { path = opts.RomPath; } else if (!PathUtil.TryGetRomLocation(version, out path)) { Console.WriteLine($"Cannot find path for {opts.GameId} {opts.VersionId}"); return(-1); } Disassemble.MipsToC = opts.MipsToCOutput; Disassemble.GccOutput = Disassemble.MipsToC || !opts.ReadableOutput; Disassemble.PrintRelocations = true; Disassemble.SetGprNames(); Func <DisassemblyTask, bool> filter = getFilter(version, path); if (filter == null) { return(-1); } DisassembleRom(version, path, filter); return(0); }
static void OverlayTest(RomVersion ver, string testOvl) { PathUtil.TryGetRomLocation(ver, out string path); Rom rom = Rom.New(path, ver); var tasks = DisassemblyTask.CreateTaskList(rom); Disassemble.PrintRelocations = true; Disassemble.GccOutput = true; var task = tasks.SingleOrDefault(x => x.Name == testOvl || x.Name == $"ovl_{testOvl}"); if (task == null) { Console.WriteLine("Cannot find overlay"); return; } //var taskbss = tasks.Where(x => x.Sections["bss"]?.Size > 0).ToList(); var reader = new BinaryReader(rom.Files.GetFile(task.VRom)); //using (StreamWriter sw = new StreamWriter("__test.txt")) //{ // foreach (var rel in task.Map.Relocations.Where(x => x.SectionId == Overlay.RelocationWord.Section.text)) // { // reader.BaseStream.Position = rel.Offset; // sw.WriteLine($"{rel.Offset:X6}: {rel.RelocType} {GetOP(reader.ReadBigInt32())}"); // } //} using (StreamWriter sw = new StreamWriter($"__{testOvl}.txt")) { BinaryReader br = new BinaryReader(rom.Files.GetFile(task.VRom)); Disassemble.FirstParse(br, task); if (Disassemble.GccOutput) { sw.WriteLine("#include <mips.h>"); sw.WriteLine(".set noreorder"); sw.WriteLine(".set noat"); sw.WriteLine(); } Disassemble.Task(sw, br, task); } using (StreamWriter sw = new StreamWriter($"__{testOvl}_f.txt")) { foreach (var item in Disassemble.Symbols.OrderBy(x => x.Key)) { sw.WriteLine($"{item.Value.ToString()} = 0x{item.Key}"); } } }
static void MMDebugTest() { RomVersion ver = MRom.Build.DBG; PathUtil.TryGetRomLocation(ver, out string path); Rom rom = new MRom(path, ver); DisassemblyTask task = null; Disassemble.PrintRelocations = true; using StreamWriter sw = File.CreateText("__code.txt"); using BinaryReader br = new BinaryReader(rom.Files.GetFile(task.VRom)); Disassemble.FirstParse(br, task); Disassemble.Task(sw, br, task); }
private static int UpdateRomPath(PathOptions a) { if (!RomVersion.TryGet(a.GameId, a.VersionId, out RomVersion ver)) { Console.WriteLine($"Unrecognized version {a.GameId} {a.VersionId}"); return(-1); } string path = a.RomPath; if (!File.Exists(path)) { Console.WriteLine($"Cannot find file {path}"); return(-1); } PathUtil.SetRomLocation(ver, path); Console.WriteLine($"Path updated! Re-run program to continue"); return(0); }
static void Main(string[] args) { PathUtil.Initialize(); var result = Parser.Default.ParseArguments(args, VerbTypes) .WithParsed <PathOptions>( a => UpdateRomPath(a)) .WithParsed <AllOptions>( a => DisassembleAll(a)) .WithParsed <DisassembleFileOptions>( a => DisassembleFile(a)) .WithParsed <ScriptOptions>( a => HandleInjectionScript(a)) .WithParsed <OvlOptions>( a => ElfToOverlay(a)) .WithParsed <VersionOptions>( a => ListSupportedVersions()); }
/* prototype: * adis o stalfo.s 2 ZELOOTMA.z64 */ //80A44CD0 80A46710 //int NAMETABLE_ADD = 0xA771A0; static void Main(string[] a) { PathUtil.Initialize(); if (a.Length == 0) { Console.WriteLine("Help:"); Console.WriteLine("path [gameid] [versionid] [path] //sets a path to a rom"); Console.WriteLine("all [gameid] [versionid] //creates a gcc compatible disassembly of the entire rom"); Console.WriteLine("all_r [gameid] [versionid] //creates a more readable disassembly of the entire rom"); Console.WriteLine("df [gameid] [versionid] [name] //creates a disassembly of a specific overlay file"); //Console.WriteLine("daf [gameid] [versionid] [id] //creates a disassembly of a specific actor file, using the actor"); Console.WriteLine("script [path] //converts elf (.o) files to overlay form, and injects into the rom"); Console.WriteLine("newscript //creates a file called dummy.xml for easy templating"); Console.WriteLine("ovl [vram] [path] //creates an overlay file named [path].ovl from an elf (.o) file"); Console.WriteLine("dcust [pc] [path]"); Console.WriteLine(); Console.WriteLine("Enter a command:"); var read = Console.ReadLine(); a = ParseArguments(read); if (a.Length == 0) { Console.WriteLine("Terminated!"); return; } } if (a[0] == "path" && (a.Length == 3 || a.Length == 4)) { string path = ""; if (!RomVersion.TryGet(a[1], a[2], out RomVersion ver)) { Console.WriteLine($"Unrecognized version {a[1]} {a[2]}"); return; } if (a.Length == 4) { path = a[3]; } else { Console.Write("Enter a path: "); path = Console.ReadLine(); } if (!File.Exists(path)) { Console.WriteLine($"Cannot find file {path}"); return; } PathUtil.SetRomLocation(ver, path); Console.WriteLine($"Path updated! Re-run program to continue"); } else if (a.Length == 3 && a[0] == "all") { if (!RomVersion.TryGet(a[1], a[2], out RomVersion version)) { Console.WriteLine($"Unrecognized version {a[1]} {a[2]}"); return; } if (PathUtil.TryGetRomLocation(version, out string path)) { Disassemble.GccOutput = true; Disassemble.PrintRelocations = true; DisassembleRom(version, path); } } else if (a.Length == 3 && a[0] == "all_r") { if (!RomVersion.TryGet(a[1], a[2], out RomVersion version)) { Console.WriteLine($"Unrecognized version {a[1]} {a[2]}"); return; } if (PathUtil.TryGetRomLocation(version, out string path)) { Disassemble.GccOutput = false; Disassemble.PrintRelocations = true; DisassembleRom(version, path); } } else if (a.Length == 3 && a[0] == "ovl") { if (!int.TryParse(a[1], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int addr)) { Console.WriteLine("Cannot parse address given"); return; } ElfToOverlay(a[2], addr); } else if (a.Length == 2 && a[0] == "script") { ElfUtil.ProcessInjectScript(a[1]); } else if (a[0] == "newscript") { ElfUtil.CreateDummyScript("dummy.xml"); } else if (a[0] == "df" && a.Length == 4) { if (!RomVersion.TryGet(a[1], a[2], out RomVersion version)) { Console.WriteLine($"Unrecognized version {a[1]} {a[2]}"); return; } OverlayTest(version, a[3]); //ovl_Boss_Fd // "ovl_Fishing"; } else if (a[0] == "elftest") { ElfToOverlayTest(); } }