void setBytes(Memory memory, Address mappedSourceBaseAddress, long offsetInSubBlock,
			byte[] b,
			int off, int len) throws MemoryAccessException, AddressOverflowException {

		if (isOneToOneMapping()) {
			memory.setBytes(mappedSourceBaseAddress.addNoWrap(offsetInSubBlock), b, off, len);
			return;
		}

		long patternCount = offsetInSubBlock / mappedByteCount;
		int partialByteCount = (int) (offsetInSubBlock % mappedByteCount);
		long mappedOffset = (mappedSourceByteCount * patternCount) + partialByteCount;

		Address destAddr = mappedSourceBaseAddress.addNoWrap(mappedOffset);

		int index = off;
		int cnt = 0;
		int i = mappedByteCount - partialByteCount;
		while (cnt < len) {
			memory.setBytes(destAddr, b, index, i);
			index += i;
			cnt += i;
			destAddr = destAddr.addNoWrap(i + nonMappedByteCount);
			i = mappedByteCount;
		}
	}
Write an array of bytes to memory utilizing this mapping scheme.  
@param memory program memory
@param mappedSourceBaseAddress base source memory address for byte-mapped subblock
@param offsetInSubBlock byte offset from start of subblock where writing should begin
@param b an array to get bytes from
@param off start source index within byte array b where bytes should be read
@param len number of bytes to be written
@throws MemoryAccessException if write of uninitialized or non-existing memory occurs
@throws AddressOverflowException if address computation error occurs
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/ByteMappingScheme.java