Ejemplo n.º 1
0
        public override (Project project, string warning) Load(byte[] data)
        {
            if (!IsBinaryFileFormat(data))
            {
                throw new InvalidDataException($"This is not a binary serialized project file!");
            }

            byte version = data[0];

            ValidateProjectFileVersion(version);

            var project = new Project
            {
                Data = new Data()
            };

            // version 0 needs to convert PC to SNES for some addresses
            ByteUtil.AddressConverter converter = address => address;
            if (version == 0)
            {
                converter = project.Data.ConvertPCtoSnes;
            }

            // read mode, speed, size
            project.Data.RomMapMode = (RomMapMode)data[HeaderSize];
            project.Data.RomSpeed   = (RomSpeed)data[HeaderSize + 1];
            var size = ByteUtil.ByteArrayToInt32(data, HeaderSize + 2);

            // read internal title
            var pointer = HeaderSize + 6;

            project.InternalRomGameName = RomUtil.ReadStringFromByteArray(data, RomUtil.LengthOfTitleName, pointer);
            pointer += RomUtil.LengthOfTitleName;

            // read checksums
            project.InternalCheckSum = ByteUtil.ByteArrayToInt32(data, pointer);
            pointer += 4;

            // read full filepath to the ROM .sfc file
            while (data[pointer] != 0)
            {
                project.AttachedRomFilename += (char)data[pointer++];
            }
            pointer++;

            project.Data.RomBytes.Create(size);

            for (int i = 0; i < size; i++)
            {
                project.Data.SetDataBank(i, data[pointer + i]);
            }
            pointer++;
            for (int i = 0; i < size; i++)
            {
                project.Data.SetDirectPage(i, data[pointer + size + i] | (data[pointer + 1 * size + i] << 8));
            }
            pointer += 2;
            for (int i = 0; i < size; i++)
            {
                project.Data.SetXFlag(i, data[pointer * size + i] != 0);
            }
            pointer++;
            for (int i = 0; i < size; i++)
            {
                project.Data.SetMFlag(i, data[pointer * size + i] != 0);
            }
            pointer++;
            for (int i = 0; i < size; i++)
            {
                project.Data.SetFlag(i, (Data.FlagType)data[pointer * size + i]);
            }
            pointer++;
            for (int i = 0; i < size; i++)
            {
                project.Data.SetArchitecture(i, (Data.Architecture)data[pointer * size + i]);
            }
            pointer++;
            for (int i = 0; i < size; i++)
            {
                project.Data.SetInOutPoint(i, (Data.InOutPoint)data[pointer * size + i]);
            }
            pointer++;
            //for (int i = 0; i < size; i++) project.Data.SetBaseAddr(i, (Data.InOutPoint)data[pointer * size + i]); pointer++;

            ReadLabels(project, data, ref pointer, converter, version >= 2);
            ReadComments(project, data, ref pointer, converter);

            project.UnsavedChanges = false;

            var warning = "";

            if (version != LatestFileFormatVersion)
            {
                warning = "This project file is in an older format.\n" +
                          "You may want to back up your work or 'Save As' in case the conversion goes wrong.\n" +
                          "The project file will be untouched until it is saved again.";
            }

            return(project, warning);
        }