DisasmBank GetDisasmBank(BankID bankId) { if (_disasmBanks.TryGetValue(bankId, out var d)) { return(d); } d = new DisasmBank() { ID = bankId }; _disasmBanks[bankId] = d; return(d); }
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); }
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; } }