public void registerPcodeCallback(String name, BreakCallBack func) {
		func.setEmulate(emulate);
		if (DEFAULT_NAME.equals(name)) {
			defaultPcodeCallback = func;
			return;
		}
		int numUserOps = language.getNumberOfUserDefinedOpNames();
		for (int i = 0; i < numUserOps; i++) {
			if (name.equals(language.getUserDefinedOpName(i))) {
				pcodeCallback.add((long) i, func);
				return;
			}
		}
		// tell them what names are valid, probably not worth doing, but hate just getting no context on an error...
		StringBuilder names = new StringBuilder();
		for (int i = 0; i < numUserOps; i++) {
			names.append(language.getUserDefinedOpName(i));
			if (i < (numUserOps - 1))
				names.append(", ");
		}
		throw new LowlevelError("Bad userop name: " + name + "\n" + "Must be one of:\n" + names);
	}
Any time the emulator is about to execute a user-defined pcode op with the given name,
the indicated breakpoint is invoked first. The break table does not assume responsibility
for freeing the breakpoint object.
@param name is the name of the user-defined pcode op
@param func is the breakpoint object to associate with the pcode op
Ghidra/Framework/Emulation/src/main/java/ghidra/pcode/emulate/BreakTableCallBack.java