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