public static void RemoveAndReadFooter(GBAROM rom, GBAMemoryManager memMan) { Stream stream = rom.GetStream(); stream.Seek(-12, SeekOrigin.End); int length; uint crc32; using (BinaryReader reader = new BinaryReader(stream)) { length = reader.ReadInt32(); int signature = reader.ReadInt32(); crc32 = reader.ReadUInt32(); if (signature != 0x1270D1FE) { throw new Exception("No footer present"); } stream.Seek(12 + length + 12, SeekOrigin.End); byte[] version = reader.ReadBytes(12); //Like we care while (stream.Position < stream.Length - 12) { byte[] rawid = reader.ReadBytes(4); string id = new string(Array.ConvertAll(rawid, Convert.ToChar)); int chunkLength = reader.ReadInt32(); if (id == "Free") { long endOffset = stream.Position + length; int offset = 0; while (stream.Position < endOffset) { int relativeOffset = reader.ReadEncodedInteger(); offset += relativeOffset; int freeLength = reader.ReadEncodedInteger(); memMan.AddManagedSpace(offset, freeLength); offset += freeLength; } } else { stream.Seek(chunkLength, SeekOrigin.Current); } } } rom.Length -= 12 + length + 12; //Remove footer }
public void LoadROM(string path) { rom.OpenROM(path); data = GameSpecificData.GetData(rom.GameCode); memoryManager = new GBAMemoryManager(); bool ROMdataFound = false; if (File.Exists(Path.ChangeExtension(path, ".xml"))) { } else { ROMdataFound = FEditor_shit.FEditorSucks.HasFooter(rom); if (ROMdataFound) { FEditor_shit.FEditorSucks.RemoveAndReadFooter(rom, memoryManager); } } if (rom.Length < GBAROM.MaxRomSize) { memoryManager.AddManagedSpace(rom.Length, GBAROM.MaxRomSize - rom.Length); } else if (rom.Length > GBAROM.MaxRomSize) { throw new IOException("ROM is larger than allowed."); } if (!ROMdataFound) { //Check if ROM hasn't been edited. If hasn't, add default free space. uint fileCRC32; using (BinaryReader reader = new BinaryReader(rom.GetStream())) { fileCRC32 = CRC32.CalculateCRC32(reader); } if (fileCRC32 == data.DefaultCRC32) { foreach (var item in data.DefaultFreeSpace) { memoryManager.AddManagedSpace(item.Key, item.Value); } } } int start = rom.ReadPointer(data.TextPointerTableOffset); LoadHuffmanTree( rom.ReadPointer(data.HuffmanTreePtrOffset), rom.ReadPointer(data.HuffmanTreeEndPtrOffset)); LoadRawTextOffsets(data.TextPointerTableOffset, data.TextPointerTableLength); ui.MaxIndex = textPointers.Length - 1; }