// определение типа первичного адаптера

#include <stdio.h>
#include <graph.h>
#include <bios.h>
#include "sysp.h"

unsigned char  get_adapter( void );

void main()
{
	printf("\nПервичный видеоадаптер: ");
	switch(get_adapter()) {
		case _MDPA : puts("MDPA."); break;
		case _CGA  : puts("CGA.");  break;
		case _EGA  : puts("EGA.");  break;
		case _VGA  : puts("VGA.");  break;
		case _MCGA : puts("MCGA."); break;
		case _HGC  : puts("HGC.");  break;
		default    : puts("не известный.");
	}

	getch();
}


/**
*.Name         get_adapter
*
*.Title        Определить тип первичного адаптера
*
*.Descr        Эта функция отображает логические страницы
*              пула дополнительной памяти на физические.
*
*.Proto        unsigned char  get_adapter(void);
*
*.Params       int phys_pages - номер физической страницы
*                 окна доступа (от 0 до 3), на которую необходимо
*                 отобразить логическую страницу пула;
*
*              int_log_page - номер логической страницы пула;
*
*              int *handle - индекс полученного пула;
*
*.Return       Байт состояния драйвера EMS
*
*.Sample       ems_test.c
**/

unsigned char get_adapter()
{
	union REGS reg;
	unsigned char eg_flag;

	// определяем наличие VGA

	reg.x.ax = 0x1A00;
	int86(0x10, &reg, &reg);

	// если VGA является первичным видиоадаптером, то адаптер определен

	if(reg.h.al == 0x1A && (reg.h.bl == 0x07 || reg.h.bl == 0x08))
		return(_VGA);

	// если VGA нет, то проверяем наличие EGA

	reg.h.ah = 0x12;
	reg.h.bl = 0x10;
	int86(0x10, &reg, &reg);

	// в случае отсутствия EGA тестируем ячейку памяти по адресу
	// 0040:0010 и определяем наличие адаптеров CGA или MDA/Hercules

	if(reg.h.bl == 0x10) {
		eg_flag = *((unsigned char*)FP_MAKE(0x0040, 0x0010));
		switch(eg_flag & 0x30) {
			case 0x00 : return(_EGA);
			case 0x10 :
			case 0x20 : return(_CGA);
			case 0x30 : return(_MDPA);
		}
	}

	else return(_EGA);
}
