public void executeInstruction(boolean stopAtBreakpoint, TaskMonitor monitor)
			throws CancelledException, LowlevelError, InstructionDecodeException {
		if (monitor == null) {
			monitor = TaskMonitor.DUMMY;
		}
		if (executionState == EmulateExecutionState.STOPPED) {
			if (last_execute_address == null && instructionStateModifier != null) {
				instructionStateModifier.initialExecuteCallback(this, current_address,
					nextContextRegisterValue);
			}
			if (breaktable.doAddressBreak(current_address) && stopAtBreakpoint) {
				executionState = EmulateExecutionState.BREAKPOINT;
				return;
			}
		}
		else if (executionState == EmulateExecutionState.FAULT) {
			// re-throw fault
			throw faultCause;
		}
		else if (executionState != EmulateExecutionState.BREAKPOINT) {
			// state is either INSTRUCTION_DECODE or EXECUTE
			throw new LowlevelError("Already executing");
		}
		try {
			executionState = EmulateExecutionState.INSTRUCTION_DECODE;
			if (language.numSections() == 0) {
				uniqueBank.clear(); // OK to clear if named sections and crossbuilds do not exist in language
			}
			pcode = emitPcode(current_address);
			last_execute_address = current_address;
			current_op = 0;
			if (pcode == null) {
				throw new InstructionDecodeException("Unexpected instruction pcode error",
					current_address);
			}
			executionState = EmulateExecutionState.EXECUTE;
			do {
				monitor.checkCancelled();
				executeCurrentOp();
			}
			while (executionState == EmulateExecutionState.EXECUTE);
			if (instructionStateModifier != null) {
				instructionStateModifier.postExecuteCallback(this, last_execute_address, pcode,
					last_op, current_address);
			}
		}
		catch (RuntimeException e) {
			faultCause = e;
			executionState = EmulateExecutionState.FAULT;
			throw e;
		}
	}
This routine executes an entire machine instruction at once, as a conventional debugger step
function would do.  If execution is at the start of an instruction, the breakpoints are checked
and invoked as needed for the current address.  If this routine is invoked while execution is
in the middle of a machine instruction, execution is continued until the current instruction
completes.
@param stopAtBreakpoint 
@param monitor 
@throws CancelledException 
@throws LowlevelError 
@throws InstructionDecodeException
Ghidra/Framework/Emulation/src/main/java/ghidra/pcode/emulate/Emulate.java