#include <stdio.h>
#include <dos.h>

void main(void) {

	unsigned err;
	char ver, ver_hi, ver_lo;

	clrscr();
	printf("Virtual Control Program Interface Demo, (C) Frolov A.V., 1992\n\r"
			 "-------------------------------------------------------------\n\r\n\r");

// Проверяем наличие драйвера EMS/VCPI

	if(ems_init()) {
		printf("Драйвер EMS/VCPI не загружен.");
		exit(-1);
	}
	printf("Драйвер EMS/VCPI загружен");

// Выводим номер версии драйвера

	if((err = ems_ver(&ver)) != 0) {
		printf("\nОшибка %02.2X при определении версии EMM", err);
		exit(-1);
	}
	printf("\nВерсия EMM: %02.2X", ver);

// Определяем присутствие VCPI и его версию

	if(vcpi_ver(&ver_hi, &ver_lo) != 0) {
		printf("\nДрайвер EMM не поддерживает VCPI\n");
		exit(-1);
	}
	printf("\nВерсия VCPI: %02.2X.%02.2X", ver_hi, ver_lo);



}


/**
*.Name         ems_init
*.Title        Функция проверяет установку драйвера EMS
*
*.Descr        Эта функция проверяет наличие драйвера EMS
*
*.Proto        int ems_init(void);
*
*.Params       Не используются
*
*.Return       0 - драйвер EMS установлен;
*              1 - драйвер EMS не установлен.
*
*.Sample       ems_test.c
**/

int ems_init(void) {

	void (_interrupt _far *EMS_driver_adr)(void);
	char _far *EMS_driver_name;
	char test_name[8];
	int i;

	EMS_driver_adr = _dos_getvect(0x67);

	FP_SEG(EMS_driver_name) = FP_SEG (EMS_driver_adr);
	FP_OFF(EMS_driver_name) = 10;

	for(i=0; i<8; i++) test_name[i] = EMS_driver_name[i];

	if(strncmp(test_name, "EMMXXXX0", 8) == 0) return(0);
	else return(1);

}

/**
*.Name         ems_ver
*.Title        Определение версии драйвера EMS
*
*.Descr        Эта функция возвращает номер версии
*              драйвера EMS в двоично-десятичном формате.
*
*.Proto        int ems_ver(char *ver);
*
*.Params       char *ver - указатель на байт, в который
*                 будет записан номер версии.
*
*.Return       Номер версии драйвера EMS в формате BCD
*
*.Sample       ems_test.c
**/

int ems_ver(char *ver) {

	union REGS reg;

	reg.x.ax = 0x4600;
	int86(0x67, &reg, &reg);

	*ver = reg.h.al;
	return(reg.h.ah);
}

int vcpi_ver(char *ver_hi, char *ver_lo) {

	union REGS reg;

	reg.x.ax = 0xDE00;
	int86(0x67, &reg, &reg);

	*ver_hi = reg.h.bh;
	*ver_lo = reg.h.bl;
	return(reg.h.ah);
}
