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