コード例 #1
0
        private byte[] SaveVersion(Project project, int version)
        {
            VoidTheWarranty();

            #if ALLOW_OLD_SAVE_FORMATS
            ValidateSaveVersion(version);

            int    size        = project.Data.GetRomSize();
            byte[] romSettings = new byte[31];

            // save these two
            romSettings[0] = (byte)project.Data.RomMapMode;
            romSettings[1] = (byte)project.Data.RomSpeed;

            // save the size, 4 bytes
            ByteUtil.IntegerIntoByteArray((uint)size, romSettings, 2);

            var romName = project.Data.CartridgeTitleName;
            romName.ToCharArray().CopyTo(romSettings, 6);

            var romChecksum = project.Data.RomCheckSumsFromRomBytes;
            BitConverter.GetBytes(romChecksum).CopyTo(romSettings, 27);

            // save all labels ad comments
            List <byte> label = new(), comment = new();
            var         allLabels   = project.Data.Labels;
            var         allComments = project.Data.Comments;

            ByteUtil.AppendIntegerToByteList((uint)allLabels.Count, label);
            foreach (var pair in allLabels)
            {
                ByteUtil.AppendIntegerToByteList((uint)pair.Key, label);

                SaveStringToBytes(pair.Value.Name, label);
                if (version >= 2)
                {
                    SaveStringToBytes(pair.Value.Comment, label);
                }
            }

            ByteUtil.AppendIntegerToByteList((uint)allComments.Count, comment);
            foreach (KeyValuePair <int, Comment> pair in allComments)
            {
                ByteUtil.AppendIntegerToByteList((uint)pair.Key, comment);
                SaveStringToBytes(pair.Value.Text, comment);
            }

            // save current Rom full path - "c:\whatever\someRom.sfc"
            var romLocation = ByteUtil.StringToNullTermByteArray(project.AttachedRomFilename);

            var data = new byte[romSettings.Length + romLocation.Length + 8 * size + label.Count + comment.Count];
            romSettings.CopyTo(data, 0);
            for (int i = 0; i < romLocation.Length; i++)
            {
                data[romSettings.Length + i] = romLocation[i];
            }

            var readOps = new Func <int, byte>[]
            {
                i => (byte)project.Data.GetDataBank(i),
                i => (byte)project.Data.GetDataBank(i),
                i => (byte)project.Data.GetDirectPage(i),
                i => (byte)(project.Data.GetDirectPage(i) >> 8),
                i => (byte)(project.Data.GetXFlag(i) ? 1 : 0),
                i => (byte)(project.Data.GetMFlag(i) ? 1 : 0),
                i => (byte)project.Data.GetFlag(i),
                i => (byte)project.Data.GetArchitecture(i),
                i => (byte)project.Data.GetInOutPoint(i),
            };

            void ReadOperation(int startIdx, int whichOp)
            {
                if (whichOp <= 0 || whichOp > readOps.Length)
                {
                    throw new ArgumentOutOfRangeException(nameof(whichOp));
                }

                var baseidx = startIdx + whichOp * size;
                var op      = readOps[whichOp];

                for (var i = 0; i < size; i++)
                {
                    data[baseidx + i] = op(i);
                }
            }

            for (var i = 0; i < readOps.Length; ++i)
            {
                var start = romSettings.Length + romLocation.Length;
                ReadOperation(start, i);
            }

            // ???
            label.CopyTo(data, romSettings.Length + romLocation.Length + 8 * size);
            comment.CopyTo(data, romSettings.Length + romLocation.Length + 8 * size + label.Count);
            // ???

            return(data);
            #endif
            return(null);
        }