class SegmentedAddressSpace extends GenericAddressSpace {

	@Override
	public Address subtract(Address addr, long displacement) {

		if (displacement < 0) {
			return add(addr, -displacement);
		}

		testAddressSpace(addr);
		if (displacement > spaceSize) {
			throw new AddressOutOfBoundsException(
				"Address Overflow in subtract: " + addr + " + " + displacement);
		}
		long off = addr.getOffset() - displacement;
		if (off >= 0) {
			SegmentedAddress saddr = (SegmentedAddress) addr;
			Address resaddr = getAddressInSegment(off, saddr.getSegment());
			if (resaddr == null) {	// Could not map into desired segment
				resaddr = new SegmentedAddress(this, off);	// just use default
			}
			return resaddr;
		}
		throw new AddressOutOfBoundsException(
			"Address Overflow in subtract: " + addr + " + " + displacement);
	}

	protected  SegmentedAddressSpace(String name, int size, int unique);
	public  SegmentedAddressSpace(String name, int unique);

}