示例#1
0
        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();
                }
            }
        }
示例#2
0
        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);
                }
            }
        }
示例#3
0
        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);
        }