public List<String> disassemble(Integer count) {
		if (!emuHalt || isExecuting) {
			throw new IllegalStateException("disassembly not allowed while emulator is executing");
		}

		// TODO: This can provide bad disassembly if reliant on future context state (e.g., end of loop)

		List<String> disassembly = new ArrayList<>();

		EmulateDisassemblerContext disassemblerContext = emulator.getNewDisassemblerContext();
		Address addr = getExecuteAddress();
		EmulateMemoryStateBuffer memBuffer = new EmulateMemoryStateBuffer(memState, addr);

		Disassembler disassembler = Disassembler.getDisassembler(language, addrFactory,
			TaskMonitor.DUMMY, null);

		boolean stopOnError = false;

		while (count > 0 && !stopOnError) {
			memBuffer.setAddress(addr);
			disassemblerContext.setCurrentAddress(addr);

			InstructionBlock block = disassembler.pseudoDisassembleBlock(memBuffer,
				disassemblerContext.getCurrentContextRegisterValue(), count);

			if (block.hasInstructionError() && count > block.getInstructionCount()) {
				InstructionError instructionError = block.getInstructionConflict();
				Msg.error(this,
					"Target disassembler error at " + instructionError.getConflictAddress() + ": " +
						instructionError.getConflictMessage());
				stopOnError = true;
			}

			Instruction lastInstr = null;
			Iterator<Instruction> iterator = block.iterator();
			while (iterator.hasNext() && count != 0) {
				Instruction instr = iterator.next();
				disassembly.add(instr.getAddressString(false, true) + " " + instr.toString());
				lastInstr = instr;
				--count;
			}

			try {
				addr = lastInstr.getAddress().addNoWrap(lastInstr.getLength());
			}
			catch (Exception e) {
				count = 0;
			}
		}

		return disassembly;
	}
Disassemble from the current execute address

@param count number of contiguous instructions to disassemble
@return list of instructions
Ghidra/Framework/Emulation/src/main/java/ghidra/app/emulator/DefaultEmulator.java