@Override
	public void setChunk(long offset, int size, byte[] src) {
		if (size == 0 || src.length == 0) {
			return;
		}
		int currentPosition = 0;
		//align if necessary
		int adjustment = (int) offset % WORD_SIZE;
		if (adjustment != 0) {
			WordInfo word = map.get(offset & ALIGNMENT_MASK);
			if (word == null) {
				word = new WordInfo();
				map.put(offset & ALIGNMENT_MASK, word);
			}
			for (int i = adjustment; i < WORD_SIZE; ++i) {
				word.setByte(src[currentPosition], i);
				offset += 1;
				currentPosition += 1;
			}
		}
		while (size > currentPosition) {
			WordInfo word = map.get(offset & ALIGNMENT_MASK);
			if (word == null) {
				word = new WordInfo();
				map.put(offset & ALIGNMENT_MASK, word);
			}
			int bytesToWrite = Math.min(WORD_SIZE, size - currentPosition);
			for (int i = 0; i < bytesToWrite; i++) {
				word.setByte(src[currentPosition + i], i);
			}
			offset += bytesToWrite;
			currentPosition += bytesToWrite;
		}
		return;
	}
A map from {@link Long} offsets to byte values would require many lookups.
As an optimization, this map is defined from {@link Long} values to 
{@link WordInfo} objects, each of which represents an eight-byte word
of memory.  Each key in this map must be 0 mod 8.
Ghidra/Framework/Emulation/src/main/java/ghidra/pcode/memstate/UniqueMemoryBank.java