public LineSpan[] GetLineSpans(int count) { addrCur = SanitizeAddress(addrCur); var spans = new List <LineSpan>(); ImageSegment seg; ImageMapItem item; program.SegmentMap.TryFindSegment(addrCur, out seg); program.ImageMap.TryFindItem(addrCur, out item); SpanGenerator sp = CreateSpanifier(item, addrCur); while (count != 0 && seg != null && item != null) { bool memValid = true; if (!item.IsInRange(addrCur)) { memValid = program.ImageMap.TryFindItem(addrCur, out item) && addrCur < item.EndAddress; if (memValid) { sp = CreateSpanifier(item, addrCur); } } memValid &= seg.MemoryArea.IsValidAddress(addrCur); if (memValid) { var tuple = sp.GenerateSpan(); if (tuple != null) { addrCur = tuple.Item1; spans.Add(tuple.Item2); --count; } else { sp = null; } } if (sp == null || !memValid) { if (!memValid) { // Find next segment. Address addrSeg; if (program.SegmentMap.Segments.TryGetUpperBoundKey(addrCur, out addrSeg)) { program.SegmentMap.TryFindSegment(addrSeg, out seg); program.ImageMap.TryFindItem(addrSeg, out item); addrCur = addrSeg; } else { seg = null; item = null; addrCur = addrEnd; break; } } sp = CreateSpanifier(item, addrCur); } } addrCur = SanitizeAddress(addrCur); var aSpans = spans.ToArray(); return(aSpans); }
public LineSpan[] GetLineSpans(int count) { curPos = SanitizePosition(curPos); var spans = new List <LineSpan>(); program.SegmentMap.TryFindSegment(curPos.Address, out var seg); program.ImageMap.TryFindItem(curPos.Address, out var item); SpanGenerator sp = CreateSpanifier(item, curPos); while (count != 0 && seg != null && item != null) { if (TryReadComment(out var commentLine)) { spans.Add(commentLine); --count; continue; } bool memValid = true; if (!item.IsInRange(curPos.Address)) { memValid = program.ImageMap.TryFindItem( curPos.Address, out item) && curPos.Address < item.EndAddress; if (memValid) { sp = CreateSpanifier(item, curPos); } } memValid &= seg.MemoryArea.IsValidAddress(curPos.Address); if (memValid) { var tuple = sp.GenerateSpan(); if (tuple != null) { curPos = tuple.Item1; spans.Add(tuple.Item2); --count; } else { sp = null; } } if (sp == null || !memValid) { if (!memValid) { // Find next segment. if (program.SegmentMap.Segments.TryGetUpperBoundKey( curPos.Address, out var addrSeg)) { program.SegmentMap.TryFindSegment(addrSeg, out seg); program.ImageMap.TryFindItem(addrSeg, out item); curPos = Pos(addrSeg); } else { seg = null; item = null; curPos = endPos; break; } } sp = CreateSpanifier(item, curPos); } } curPos = SanitizePosition(curPos); var aSpans = spans.ToArray(); return(aSpans); }