Пример #1
0
 public Range(ushort startAddress, ushort endAddress, AddressModifier map, IHaveAddressedMemory handler)
 {
     StartAddress = startAddress;
     EndAddress   = endAddress;
     Map          = map;
     Handler      = handler;
 }
Пример #2
0
        public void MapRange(ushort startAddress, ushort endAddress, AddressModifier addressModifier, IHaveAddressedMemory handler)
        {
            if (startAddress >= endAddress)
            {
                throw new Exception("Invalid start and end addresses.");
            }
            var newRange = new Range(startAddress, endAddress, addressModifier, handler);

            TotalBytesAvailable += endAddress - startAddress + 1;

            // NB: ranges in sorted order...
            Link       previous   = null;
            Enumerator enumerator = GetForwardEnumerator();

            while (enumerator.MoveNext())
            {
                var range = (Range)enumerator.Current;
                if (range.EndAddress < startAddress)
                {
                    previous = enumerator.CurrentLink;
                    continue;
                }
                if (endAddress < range.StartAddress)
                {
                    InsertAfter(previous, newRange);
                    return;
                }
                var message = new StringBuilder("Address range overlaps are not allowed.", 80);
                if (previous != null)
                {
                    var previousRange = (Range)previous.Value;
                    message.Append("\r\n\tPrevious: [");
                    message.Append(HexString.GetString(previousRange.StartAddress));
                    message.Append(",");
                    message.Append(HexString.GetString(previousRange.EndAddress));
                    message.Append("]");
                }
                message.Append("\r\n\t **NEW**: [");
                message.Append(HexString.GetString(startAddress));
                message.Append(",");
                message.Append(HexString.GetString(endAddress));
                message.Append("]\r\n\t    Next: [");
                message.Append(HexString.GetString(range.StartAddress));
                message.Append(",");
                message.Append(HexString.GetString(range.EndAddress));
                message.Append("]");
                throw new Exception(message.ToString());
            }

            InsertTail(newRange);
        }