public Range(ushort startAddress, ushort endAddress, AddressModifier map, IHaveAddressedMemory handler) { StartAddress = startAddress; EndAddress = endAddress; Map = map; Handler = handler; }
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); }