// Программа отображает переменные видеофункций BIOS

#include <stdio.h>
#include <dos.h>
#include <mem.h>
#include "sysgraph.h"

int	main( int, char ** );

//==============================================================
// Главная функция программы
//==============================================================
int main( int argc, char * argv[] )
{
	BIOS_VAR _far  *bios_var_ptr;
	BIOS_VAR bios_var_table;

	union  REGS    inregs, outregs;
	int	vmode;

	// Проверка командной строки программы
	if( argc != 2 )
	{
		printf( "\nФормат вызова: BIOSVAR <режим>"
				  "\n   <режим>: режим видеоадаптера \n" );
		return -1;
	}
	sscanf(argv[1],"%d",&vmode);

	// Устанавливаем режим работы видеоадаптера,
	// заданный параметром vmode
	inregs.h.ah = 0x0;
	inregs.h.al = vmode;
	int86( 0x10, &inregs, &outregs );

	// Получаем указатель на область переменных видеофункций BIOS
	bios_var_ptr = (BIOS_VAR _far *) FP_MAKE(0x0000, 0x0410);

	// Копируем переменные видеофункций BIOS в структуру bios_var_table
	_fmemcpy(&bios_var_table, (void far*) bios_var_ptr, sizeof(BIOS_VAR) );

	// Устанавливаем текстовые режим видеоадаптера номер 3
	inregs.h.ah = 0x0;
	inregs.h.al = 3;
	int86( 0x10, &inregs, &outregs );

	// Отображаем содержимое переменных BIOS
	printf(  "Флаги конфигурации:                        %Xh\n"
				"Текущий режим работы видеоадаптера:        %Xh\n"
				"Количество символов в строке:              %d\n"
				"Размер страницы видеопамяти:               %d\n"
				"Начальный адрес:                           %Xh\n"
				"Координаты курсора нулевой страницы:       %Xh\n"
				"Форма курсора:                             %Xh\n"
				"Активная страница:                         %Xh\n"
				"Адрес индексного регистра контроллера ЭЛТ: %Xh\n"
				"Регистр режима CGA:                        %Xh\n"
				"Цветовая палитра CGA:                      %Xh\n"
				"Количество текстовых строк:                %d\n"
				"Высота символов:                           %d\n"
				"Информация о EGA 1:                        %Xh\n"
				"Информация о EGA 2:                        %Xh\n"
				"Адрес таблицы окружения:                   %Fp\n",

				(unsigned char) bios_var_table.equipment_flag,
				(unsigned char) bios_var_table.video_mode,
				(unsigned) bios_var_table.columns,
				(unsigned) bios_var_table.page_length,
				(unsigned) bios_var_table.start_addr,
				(unsigned) bios_var_table.cursor_position[0],
				(unsigned) bios_var_table.cursor_shape,
				(unsigned char) bios_var_table.active_page,
				(unsigned) bios_var_table.crt_address,
				(unsigned char) bios_var_table.mode_reg_data,
				(unsigned char) bios_var_table.palette,
				(unsigned char) bios_var_table.rows + 1,
				(unsigned) bios_var_table.char_height,
				(unsigned char) bios_var_table.ega_info_1,
				(unsigned char) bios_var_table.ega_info_2,
				(void far*) bios_var_table.environ_ptr
	  );

	  printf("\nCopyright (C)Frolov G.V., 1992-1995. "
				"E-mail: frolov@glas.apc.org\n");

	  return 1;
}

