private void importCDLToolStripMenuItem_Click(object sender, EventArgs e) { openCDLDialog.InitialDirectory = Project.currentFile; DialogResult result = openCDLDialog.ShowDialog(); if (result == DialogResult.OK) { if (ContinueUnsavedChanges()) { try { var cdl = BizHawkCdl.LoadFromFile(openCDLDialog.FileName); Manager.ImportBizHawkCDL(cdl); } catch (InvalidDataException ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (EndOfStreamException ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } UpdatePercent(); UpdateWindowTitle(); InvalidateTable(); } } }
public static void ImportBizHawkCDL(BizHawkCdl cdl) { if (!cdl.TryGetValue("CARTROM", out var cdlRomFlags)) { throw new InvalidDataException("The CDL file does not contain CARTROM block."); } var size = Math.Min(cdlRomFlags.Count, Data.GetROMSize()); bool m = false; bool x = false; for (var offset = 0; offset < size; offset++) { var cdlFlag = cdlRomFlags[offset]; if (cdlFlag == BizHawkCdl.Flag.None) { continue; } var type = Data.FlagType.Unreached; if ((cdlFlag & BizHawkCdl.Flag.ExecFirst) != 0) { type = Data.FlagType.Opcode; m = (cdlFlag & BizHawkCdl.Flag.CPUMFlag) != 0; x = (cdlFlag & BizHawkCdl.Flag.CPUXFlag) != 0; } else if ((cdlFlag & BizHawkCdl.Flag.ExecOperand) != 0) { type = Data.FlagType.Operand; } else if ((cdlFlag & BizHawkCdl.Flag.CPUData) != 0) { type = Data.FlagType.Data8Bit; } else if ((cdlFlag & BizHawkCdl.Flag.DMAData) != 0) { type = Data.FlagType.Data8Bit; } Mark(offset, type, 1); if (type == Data.FlagType.Opcode || type == Data.FlagType.Operand) { // Operand reuses the last M and X flag values used in Opcode, // since BizHawk CDL records M and X flags only in Opcode. MarkMFlag(offset, m, 1); MarkXFlag(offset, x, 1); } } }
public static BizHawkCdl LoadFromStream(Stream input) { var br = new BinaryReader(input); string id = br.ReadString(); string subType; if (id == "BIZHAWK-CDL-1") { subType = "PCE"; } else if (id == "BIZHAWK-CDL-2") { subType = br.ReadString().TrimEnd(' '); } else { throw new InvalidDataException("File is not a BizHawk CDL file."); } if (subType != "SNES") { throw new InvalidDataException("The CDL file is not for SNES."); } var cdl = new BizHawkCdl(); int count = br.ReadInt32(); for (int i = 0; i < count; i++) { string key = br.ReadString(); int len = br.ReadInt32(); var data = br.ReadBytes(len).Select(b => (Flag)b).ToArray(); cdl[key] = data; } return(cdl); }