示例#1
0
 static void DisassembleFile(DisassembleFileOptions opts)
 {
     TryDisassemble(opts, (v, p) =>
     {
         return(GetDisassembleOverlayFilter(opts, v, p));
     });
 }
示例#2
0
        private static Func <DisassemblyTask, bool> GetDisassembleOverlayFilter(DisassembleFileOptions opts, RomVersion version, string path)
        {
            Func <DisassemblyTask, bool> filter = x => false;

            if (opts.FileStart != null)
            {
                if (int.TryParse(opts.FileStart, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int fileStart))
                {
                    filter = x => x.VRom.Start == fileStart;
                }
                else
                {
                    Console.WriteLine($"invalid start address {opts.FileStart}");
                    return(null);
                }
            }
            else if (opts.File != null)
            {
                filter = x => x.Name == opts.File || x.Name == $"ovl_{opts.File}";
            }
            else
            {
                Rom           rom = Rom.New(path, version);
                OverlayRecord dlf_record;

                if (!int.TryParse(opts.ActorIndex, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int actorIndex))
                {
                    Console.WriteLine($"actor index {actorIndex} is invalid");
                    return(null);
                }

                if (actorIndex == 0)
                {
                    dlf_record = rom.Files.GetPlayPauseOverlayRecord(1);
                }
                else
                {
                    dlf_record = rom.Files.GetActorOverlayRecord(actorIndex);
                    if (dlf_record.VRom.Size == 0)
                    {
                        Console.WriteLine($"actor 0x{opts.ActorIndex:X4} does not have an overlay file");
                        return(null);
                    }
                }
                filter = x => x.VRom.Start == dlf_record.VRom.Start;
            }

            return(filter);
        }