Esempio n. 1
0
        private static List <PointerText> LoadNewTranslationLines(RomDataWrapper rom)
        {
            var sw = new Stopwatch();

            sw.Start();
            var translatedLines = new List <PointerText>();
            var lockObject      = new Object();
            var numThreads      = Environment.ProcessorCount;
            var numPerThread    = newTranslationLines.Count / numThreads;
            var tasks           = new List <Task>();

            for (int i = 0; i < numThreads - 1; i++)
            {
                var linesToHandle = newTranslationLines.Skip(i * numPerThread).Take(numPerThread);
                tasks.Add(Task.Run(() => LoadNewTranslationLinesTask(rom, linesToHandle, translatedLines, lockObject, newTranslationLines.Count)));
            }
            var finalLinesToHandle = newTranslationLines.Skip((numThreads - 1) * numPerThread);

            tasks.Add(Task.Run(() => LoadNewTranslationLinesTask(rom, finalLinesToHandle, translatedLines, lockObject, newTranslationLines.Count)));

            Task.WaitAll(tasks.ToArray());

            sw.Stop();
            return(translatedLines);
        }
Esempio n. 2
0
        static Int32 Main(string[] args)
        {
            if (args.Length < 3)
            {
                Console.WriteLine("Pass a rom file, output file, start address (HEX) and length to search for (Base 10 Integer)");
                return(1);
            }
            var rom = new RomDataWrapper(new FileInfo(args[0]));

            var outputFile = new FileInfo(args[1]);

            var from     = Int32.Parse(args[2], NumberStyles.HexNumber);
            var distance = Int32.Parse(args[3]);

            var foundPointers = new List <PointerText>();

            for (int i = 0; i < distance; i++)
            {
                var foundPointer = rom.GetOriginalPointerInfo(from + i);
                if (foundPointer.ReferenceCount > 0)
                {
                    foundPointers.Add(foundPointer);
                }
            }

            PointerText.WritePointersToFile(outputFile, foundPointers);

            return(0);
        }
Esempio n. 3
0
        static void Main(string[] args)
        {
            var rom = new RomDataWrapper(new FileInfo(args[0]));

            var lines = LoadTranslationFileLines(args[1]);

            var linesWithReferences = LoadLinereferencesFromRom(rom, lines);

            var outputFile = new FileInfo(args[2]);

            PointerText.WritePointersToFile(outputFile, linesWithReferences.OrderBy(l => l.Address));
        }
Esempio n. 4
0
 private static void LoadNewTranslationLinesTask(RomDataWrapper rom,
                                                 IEnumerable <Int32> linesToGet, List <PointerText> linestotranslate, Object lockObject, Int32 totalCount)
 {
     foreach (var line in linesToGet)
     {
         var lineTotranslate = rom.GetOriginalPointerInfo(line);
         lock (lockObject)
         {
             linestotranslate.Add(lineTotranslate);
             if (linestotranslate.Count % 100 == 0)
             {
                 Console.Write("\rReading progress: {0:##0}%   ", ((Decimal)linestotranslate.Count / totalCount) * 100);
             }
         }
     }
 }
Esempio n. 5
0
 private static void LoadLinereferencesFromRomTask(RomDataWrapper rom,
                                                   IEnumerable <PointerText> lines, List <PointerText> linesWithReferences, Object lockObject, Int32 totalCount)
 {
     foreach (var line in lines)
     {
         var lineWithPointerInfo = rom.GetOriginalPointerInfo(line.Address);
         line.References = lineWithPointerInfo.References;
         lock (lockObject)
         {
             linesWithReferences.Add(line);
             if (linesWithReferences.Count % 100 == 0)
             {
                 Console.Write("\rProgress: {0:##0}%   ", ((Decimal)linesWithReferences.Count / totalCount) * 100);
             }
         }
     }
 }
Esempio n. 6
0
        private static void ProcessBlocks(List <ValueTuple <Int32, Int32> > blocks, RomDataWrapper rom)
        {
            processedBlocks = 0;

            var numThreads   = Environment.ProcessorCount;
            var numPerThread = blocks.Count / numThreads;
            var tasks        = new List <Task>();

            for (int i = 0; i < numThreads - 1; i++)
            {
                var blocksToHandle = blocks.Skip((i * numPerThread) - 1).Take(numPerThread);
                tasks.Add(Task.Run(() => ProcessBlocksTask(rom, blocksToHandle, blocks.Count)));
            }
            var finalBlocksToHandle = blocks.Skip(((numThreads - 1) * numPerThread) - 1);

            tasks.Add(Task.Run(() => ProcessBlocksTask(rom, finalBlocksToHandle, blocks.Count)));

            Task.WaitAll(tasks.ToArray());
        }
Esempio n. 7
0
        private static List <PointerText> LoadLinereferencesFromRom(RomDataWrapper rom, List <PointerText> lines)
        {
            var linesWithReferences = new List <PointerText>();
            var lockObject          = new Object();
            var numThreads          = Environment.ProcessorCount;
            var numPerThread        = lines.Count / numThreads;
            var tasks = new List <Task>();

            for (int i = 0; i < numThreads - 1; i++)
            {
                var translationFileLinesToHandle = lines.Skip(i * numPerThread).Take(numPerThread);
                tasks.Add(Task.Run(() => LoadLinereferencesFromRomTask(rom, translationFileLinesToHandle, linesWithReferences, lockObject, lines.Count)));
            }
            var finalTranslationFileLinesToHandle = lines.Skip((numThreads - 1) * numPerThread);

            tasks.Add(Task.Run(() => LoadLinereferencesFromRomTask(rom, finalTranslationFileLinesToHandle, linesWithReferences, lockObject, lines.Count)));

            Task.WaitAll(tasks.ToArray());

            return(linesWithReferences);
        }
Esempio n. 8
0
        private static void ProcessBlocksTask(RomDataWrapper rom, IEnumerable <ValueTuple <Int32, Int32> > blocksToHandle, Int32 totalBlocks)
        {
            var previousBlock = (0, 0);

            foreach (var block in blocksToHandle)
            {
                var searchFrom = block.Item1 - 2;
                var searchTo   = searchFrom - maxBackSearch;
                if (previousBlock.Item2 > searchTo)
                {
                    searchTo = previousBlock.Item2;
                }

                Console.WriteLine("From {0,6} To {1,6} Length {2,4}", searchFrom, searchTo, searchTo - searchFrom);

                for (int i = searchFrom; i > searchTo; i--)
                {
                    var pointerText = rom.GetOriginalPointerInfo(i);
                    if (pointerText.ReferenceCount > 0 && (pointerText.Address + pointerText.AvailableLength) <= searchFrom)
                    {
                        lock (newTranslationLinesLockObject)
                        {
                            newTranslationLines.Add(i);
                        }
                        break; //we stop after first found pointer.
                    }
                }

                lock (processedBlocksLockObject)
                {
                    processedBlocks++;
                }

                previousBlock = block;

                Console.Write("\rScanning progress: {0:##0}%   ", ((Decimal)processedBlocks / totalBlocks) * 100);
            }
        }
Esempio n. 9
0
        static void Main(string[] args)
        {
            if (args.Length < 3)
            {
                Console.WriteLine("Pass at elast one rom file, output file, and existing translation file");
            }
            var rom = new RomDataWrapper(new FileInfo(args[0]));

            var tmpRomData = new Byte[rom.RomContents.Length - (skipBlockEnd - skipBlockStart)];

            Array.Copy(rom.RomContents, tmpRomData, skipBlockStart);
            Array.Copy(rom.RomContents, skipBlockEnd, tmpRomData, skipBlockStart, rom.RomContents.Length - skipBlockEnd);

            var romWithHole = new RomDataWrapper(tmpRomData);

            FileInfo outputFile = new FileInfo(args[1]);

            var pointers = new List <PointerText>();

            for (int i = 2; i < args.Length; i++)
            {
                pointers.AddRange(PointerText.ReadPointersFromFile(new FileInfo(args[i])));
            }

            pointers = pointers.OrderBy(p => p.Address).ToList();

            foreach (var pointer in pointers)
            {
                if (pointer.Address > skipBlockEnd)
                {
                    pointer.Address -= (skipBlockEnd - skipBlockStart);
                }
            }

            var blocks = new List <ValueTuple <Int32, Int32> >();
            var block  = (pointers[0].Address, pointers[0].Address + pointers[0].AvailableLength);

            foreach (var pointer in pointers.Skip(1))
            {
                if (block.Item2 + 1 == pointer.Address)
                {
                    block = (block.Item1, pointer.Address + pointer.AvailableLength);
                }
                else
                {
                    blocks.Add(block);
                    block = (pointer.Address, pointer.Address + pointer.AvailableLength);
                }
            }

            ProcessBlocks(blocks, romWithHole);

            for (int i = 0; i < newTranslationLines.Count; i++)
            {
                if (newTranslationLines[i] > skipBlockStart)
                {
                    newTranslationLines[i] += (skipBlockEnd - skipBlockStart);
                }
            }

            var linesToTranslate = LoadNewTranslationLines(rom);

            Console.Write("\rReading progress: 100%   ");
            Console.WriteLine();

            Console.WriteLine("Writing missed text entries to file.");

            PointerText.WritePointersToFile(outputFile, linesToTranslate.OrderBy(l => l.Address));

            Console.WriteLine("Done, press any key to continue...");
            Console.ReadLine();
        }