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