Beispiel #1
0
        private void ReadComments(Project project, byte[] bytes, ref int pointer, ByteUtil.AddressConverter converter)
        {
            const int stringsPerEntry = 1;

            pointer += ByteUtil.ReadStringsTable(bytes, pointer, stringsPerEntry, converter,
                                                 (int offset, string[] strings) =>
            {
                Debug.Assert(strings.Length == 1);
                project.Data.AddComment(offset, strings[0], true);
            });
        }
        private void ReadLabels(Project project, byte[] bytes, ref int pointer, ByteUtil.AddressConverter converter, bool readAliasComments)
        {
            var stringsPerEntry = readAliasComments ? 2 : 1;

            pointer += ByteUtil.ReadStringsTable(bytes, pointer, stringsPerEntry, converter,
                                                 (offset, strings) =>
            {
                Debug.Assert(strings.Length == stringsPerEntry);
                var label = new Label
                {
                    Name    = strings[0],
                    Comment = strings.ElementAtOrDefault(1)
                };
                project.Data.Labels.AddLabel(offset, label, true);
            });
        }
Beispiel #3
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);
        }
Beispiel #4
0
    private (Project project, string warning, byte version) LoadProject(byte[] data)
    {
        if (!IsBinaryFileFormat(data))
        {
            throw new InvalidDataException("This is not a binary serialized project file!");
        }

        var version = data[0];

        ValidateProjectFileVersion(version);

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

#if DIZ_3_BRANCH
        project.Session = new ProjectSession(project)
        {
            UnsavedChanges = false
        };
#endif

        // 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
        var mode  = (RomMapMode)data[HeaderSize];
        var speed = (RomSpeed)data[HeaderSize + 1];

#if !DIZ_3_BRANCH
        project.Data.RomMapMode = mode;
        project.Data.RomSpeed   = speed;
#endif

        var size = ByteUtil.ConvertByteArrayToInt32(data, HeaderSize + 2);

        // read internal title
        var pointer = HeaderSize + 6;
        project.InternalRomGameName = ByteUtil.ReadStringFromByteArray(data, pointer, RomUtil.LengthOfTitleName);
        pointer += RomUtil.LengthOfTitleName;

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

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

#if DIZ_3_BRANCH
        project.Data.InitializeEmptyRomMapping(size, mode, speed);
#else
        project.Data.RomBytes.Create(size);
#endif

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

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

#if !DIZ_3_BRANCH
        if (project.Session != null)
        {
            project.Session.UnsavedChanges = false;
        }
#endif

        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, version);
    }