Beispiel #1
0
        // https://stackoverflow.com/a/29679597
        private void UpdateSample()
        {
            // cheeky way of using the same methods for disassembling a different set of data :^)
            while (sampleTable.Count < 0x8000)
            {
                sampleTable.Add(new ROMByte());
            }

            using (MemoryStream mem = new MemoryStream())
                using (StreamWriter sw = new StreamWriter(mem))
                {
                    List <ROMByte>             tempTable = Data.GetTable();
                    Data.ROMMapMode            tempMode = Data.GetROMMapMode();
                    Data.ROMSpeed              tempSpeed = Data.GetROMSpeed();
                    Dictionary <int, string>   tempAlias = Data.GetAllLabels(), tempComment = Data.GetAllComments();
                    LogCreator.FormatStructure tempStructure = LogCreator.structure;
                    Data.Restore(sampleTable, Data.ROMMapMode.LoROM, Data.ROMSpeed.FastROM, sampleAlias, sampleComment);
                    LogCreator.structure = LogCreator.FormatStructure.SingleFile;

                    LogCreator.CreateLog(sw, StreamWriter.Null);

                    Data.Restore(tempTable, tempMode, tempSpeed, tempAlias, tempComment);
                    LogCreator.structure = tempStructure;

                    sw.Flush();
                    mem.Seek(0, SeekOrigin.Begin);

                    textSample.Text = Encoding.UTF8.GetString(mem.ToArray(), 0, (int)mem.Length);
                }
        }
Beispiel #2
0
        public static int CreateLog(StreamWriter sw, StreamWriter er)
        {
            Dictionary <int, string> tempAlias = Data.GetAllLabels();

            Data.Restore(a: new Dictionary <int, string>(tempAlias));
            AliasList.me.locked = true;
            bankSize            = Data.GetROMMapMode() == Data.ROMMapMode.LoROM ? 0x8000 : 0x10000; // todo

            AddTemporaryLabels();

            string[] split = format.Split('%');
            err        = er;
            errorCount = 0;
            usedLabels = new List <int>();

            list = new List <Tuple <string, int> >();
            for (int i = 0; i < split.Length; i++)
            {
                if (i % 2 == 0)
                {
                    list.Add(Tuple.Create(split[i], int.MaxValue));
                }
                else
                {
                    int colon = split[i].IndexOf(':');
                    if (colon < 0)
                    {
                        list.Add(Tuple.Create(split[i], parameters[split[i]].Item2));
                    }
                    else
                    {
                        list.Add(Tuple.Create(split[i].Substring(0, colon), int.Parse(split[i].Substring(colon + 1))));
                    }
                }
            }

            int pointer = 0, size = (Data.GetTable() == ExportDisassembly.sampleTable) ? 0x7B : Data.GetROMSize(), bank = -1;

            if (structure == FormatStructure.OneBankPerFile)
            {
                folder = Path.GetDirectoryName(((FileStream)sw.BaseStream).Name);
                sw.WriteLine(GetLine(pointer, "map"));
                sw.WriteLine(GetLine(pointer, "empty"));
                for (int i = 0; i < size; i += bankSize)
                {
                    sw.WriteLine(GetLine(i, "incsrc"));
                }
                sw.WriteLine(GetLine(-1, "incsrc"));
            }
            else
            {
                sw.WriteLine(GetLine(pointer, "map"));
                sw.WriteLine(GetLine(pointer, "empty"));
            }

            while (pointer < size)
            {
                int snes = Util.ConvertPCtoSNES(pointer);
                if ((snes >> 16) != bank)
                {
                    if (structure == FormatStructure.OneBankPerFile)
                    {
                        sw.Close();
                        sw = new StreamWriter(string.Format("{0}/bank_{1}.asm", folder, Util.NumberToBaseString((snes >> 16), Util.NumberBase.Hexadecimal, 2)));
                    }

                    sw.WriteLine(GetLine(pointer, "empty"));
                    sw.WriteLine(GetLine(pointer, "org"));
                    sw.WriteLine(GetLine(pointer, "empty"));
                    if ((snes % bankSize) != 0)
                    {
                        err.WriteLine("({0}) Offset 0x{1:X}: An instruction crossed a bank boundary.", ++errorCount, pointer);
                    }
                    bank = snes >> 16;
                }

                string label;
                if ((Data.GetInOutPoint(pointer) & (Data.InOutPoint.ReadPoint)) != 0 || (tempAlias.TryGetValue(pointer, out label) && label.Length > 0))
                {
                    sw.WriteLine(GetLine(pointer, "empty"));
                }
                sw.WriteLine(GetLine(pointer, null));
                if ((Data.GetInOutPoint(pointer) & (Data.InOutPoint.EndPoint)) != 0)
                {
                    sw.WriteLine(GetLine(pointer, "empty"));
                }
                pointer += GetLineByteLength(pointer);
            }

            if (structure == FormatStructure.OneBankPerFile)
            {
                sw.Close();
                sw = new StreamWriter(string.Format("{0}/labels.asm", folder));
            }
            else
            {
                sw.WriteLine(GetLine(pointer, "empty"));
            }

            foreach (KeyValuePair <int, string> pair in Data.GetAllLabels())
            {
                if (!usedLabels.Contains(pair.Key))
                {
                    sw.WriteLine(GetLine(pair.Key, "labelassign"));
                }
            }

            if (structure == FormatStructure.OneBankPerFile)
            {
                sw.Close();
            }
            Data.Restore(a: tempAlias);
            AliasList.me.locked = false;
            return(errorCount);
        }