private void setMemoryConstraintError(InstructionBlock block, Address flowFrom) {
		Address startAddr = block.getStartAddress();
		MemoryBlock memBlock = program.getMemory().getBlock(startAddr);
		if (memBlock != null) {
			String reason;
			if (MemoryBlock.EXTERNAL_BLOCK_NAME.equals(memBlock.getName())) {
				// TODO: EXTERNAL block could be more formal other than by name
				return; // return empty block without error
			}
			else if (!memBlock.isLoaded()) {
				reason = "non-loaded";
			}
			else if (memBlock.isInitialized()) {
				// assume non-execute restriction was imposed
				reason = "non-execute";
			}
			else if (memBlock.isMapped()) {
				// Bit/Byte mapped blocks are considered uninitialized by memory manager
				reason = "mapped";
			}
			else {
				reason = "uninitialized";
			}
			String message = "Disassembly not permitted within " + reason + " memory block";
			block.setInstructionMemoryError(startAddr, flowFrom, message);
		}
		else {
			block.setInstructionMemoryError(startAddr, flowFrom,
				"Could not follow disassembly flow into non-existing memory at " + startAddr);
		}
	}
Examine delay-slotted instruction to determine if it has a fall-through
@param dsInstr pseudo-instruction within existingBlock
@param existingBlock InstructionBlock containing dsInstr
@return true if fallthrough exists
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/Disassembler.java