Esempio n. 1
0
        DisasmBank GetDisasmBank(BankID bankId)
        {
            if (_disasmBanks.TryGetValue(bankId, out var d))
            {
                return(d);
            }

            d = new DisasmBank()
            {
                ID = bankId
            };

            _disasmBanks[bankId] = d;

            return(d);
        }
Esempio n. 2
0
        bool NeedDisassembly(ushort address, Slot slot, DisasmBank bank)
        {
            var offset = (ushort)(address - slot.Min);

            for (var i = 0; i < 10; i++)
            {
                if (!bank.Lines.TryGetValue(offset, out var line))
                {
                    return(true);
                }

                if (ShouldFinishDisassembling(line.Instruction.Bytes))
                {
                    break;
                }

                offset += (ushort)line.Instruction.Length;
            }

            return(false);
        }
Esempio n. 3
0
        void WriteDisasmLines(TextWriter stream, DisasmBank bank, ushort bankOffset, ref int line)
        {
            if (bank.ID.Type != BankID.TypeEnum.All)
            {
                line++;

                var memBank = Memory.Bank(bank.ID);

                if (memBank.IsPagedIn)
                {
                    stream.WriteLine("  {0}:", memBank.ID);
                }
                else
                {
                    stream.WriteLine("  {0} ({1}):", memBank.ID, memBank.PagedAddress.ToHex());
                }
            }

            var prev = bank.SortedLines[0].Offset;

            foreach (var disasmLine in bank.SortedLines)
            {
                var doneBlank = false;

                if (disasmLine.Offset - prev > 1)
                {
                    line++;
                    stream.WriteLine();
                    doneBlank = true;
                }

                prev = (ushort)(disasmLine.Offset + disasmLine.Instruction.Length);

                var labelledItem = GetLabels(bank.ID, (ushort)(disasmLine.Offset + bankOffset));

                if (labelledItem != null)
                {
                    var doneComment = false;

                    foreach (var label in labelledItem.Labels)
                    {
                        _tempLabel.Append(' ', 4);
                        _tempLabel.Append(label.Name);
                        _tempLabel.Append(':');

                        if (!doneComment)
                        {
                            if (!string.IsNullOrWhiteSpace(label.Comment))
                            {
                                // line up comment with start of mnemonics at col 21
                                _tempLabel.Append(' ', Math.Max(20 - _tempLabel.Length, 0));
                                _tempLabel.Append(';');
                            }

                            if (!string.IsNullOrWhiteSpace(label.Comment))
                            {
                                _tempLabel.Append(' ');
                                _tempLabel.Append(label.Comment);
                            }

                            doneComment = true;
                        }

                        if (_tempLabel.Length > 0)
                        {
                            if (!doneBlank && Disassembler.Settings.BlankLineBeforeLabel)
                            {
                                line++;
                                stream.WriteLine();
                                doneBlank = true;
                            }

                            line++;
                            stream.WriteLine(_tempLabel.ToString());

                            _tempLabel.Clear();
                        }
                    }
                }

                stream.WriteLine("      {0:X4} {1,-8} {2}",
                                 disasmLine.Offset + bankOffset,
                                 Convert.ToHex(disasmLine.Instruction.Bytes),
                                 FormatInstruction(disasmLine, bank.ID, bankOffset)
                                 );

                disasmLine.FileLine = line;

                _linesToDisasm[line++] = disasmLine;
            }
        }