// (C) Фролов Г.В., 1995
// Адрес E-mail: frolov@glas.apc.org

#include	<windows.h>

BYTE FAR FindCOMPorts( void );

// Идентификатор драйвера асинхронного последовательного адаптера
#define	VCD_Device_ID  0x0E

// ===================================================================
// Функция FindCOMPorts
// Функция вызывает драйвер асинхронного адаптера и определяет какие
// COM-порты установлены на компьютере и доступны для использования
// ===================================================================

BYTE FAR FindCOMPorts( void )
{
	BYTE     bResult;
	FARPROC  lpCOMM;

	asm {

		// Определяем адрес точки входа программного интерфейса
		// драйвера асинхронного последовательного адаптера
		mov   ax, 1684h
		mov   bx, VCD_Device_ID
		xor   di, di
		mov   es, di
		int   2Fh

		// Проверяем значение регистров ES:DI
		mov   ax, es
		or    ax, di

		// Если в регистрах ES:DI записаны нулевые значения,
		// драйвер не имеет программного интерфейса и не доступен
		jz    FunctionFailed

		// Драйвер доступен, сохраняем адрес его интерфейса в
		// переменной lpCOMM
		mov   word ptr lpCOMM,	di
		mov   word ptr lpCOMM+2, es

		// Вызываем функцию из драйвера COM-порта
		mov   dx, 1
		call  dword ptr lpCOMM

		// Сохраняем результат, полученный в регистре AL
		mov   bResult, al

		// Завершаем выполнение функции
		jmp   FunctionQuit
	}

	FunctionFailed:

	asm {

		// В случае возникновения ошибки возвращаем нулевое значение
		mov   bResult, 0
	}

	FunctionQuit:

	return( bResult ) ;
}
