コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }