Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Программирование видеоадаптеров.

© Александр Фролов, Григорий Фролов
Том 21, М.: Диалог-МИФИ, 1993.

[Назад] [Содеожание] [Дальше]

Дополнительная таблица окружения

Последний элемент таблицы окружения содержит указатель на дополнительную таблицу окружения. Эта таблица содержит несколько дальних указателей на структуры данных, используемые BIOS видеоадаптеров VGA и SVGA.

Дополнительная таблица окружения (также как таблица окружения), используемая сразу после загрузки компьютера, располагается в ПЗУ BIOS. Чтобы изменить какие-либо элементы этой таблицы, вы должны сначала перенести ее в оперативную память (см. раздел "Таблица окружения").

Ниже описаны элементы дополнительной таблицы окружения:

Смещение

Размер

Описание

00h

Слово

Длина дополнительной таблицы окружения в байтах

02h

Двойное слово

Указатель на таблицу кодов комбинаций мониторов

06h

"-"

Указатель на вторую таблицу символов текстового режима

0Ah

"-"

Указатель на таблицу настройки палитры

0Eh

"-"

Зарезервировано

12h

"-"

"-"

16h

"-"

"-"

После загрузки компьютера заполняются только один элемент таблицы окружения - указатель на таблицу кодов комбинаций мониторов. Остальные указатели имеют нулевое значение и не используются.

Вторая таблица символов текстового режима

Для видеоадаптера VGA вы можете определить второй набор из 256 символов. Формат второй таблицы символов текстового режима полностью соответствует таблице символов текстового режима.

Таблица кодов комбинаций мониторов

Таблица кодов комбинаций мониторов содержит список всех комбинаций видеоподсистем, которые поддерживает BIOS (см. прерывание INT 10h, функция 1Ah). Формат таблицы представлен ниже:

Смещение

Размер

Описание

00h

Байт

Количество элементов в массиве комбинаций кодов (см. смещение 04h)

01h

"-"

Номер версии таблицы кодов комбинаций мониторов

02h

"-"

Максимальный код комбинаций мониторов

03h

"-"

Зарезервировано

04h

Массив слов

Каждое слово в массиве описывает пару видеоподсистем, поддерживаемых BIOS

Таблица настройки палитры

Таблица настройки палитры содержит значения, загружаемые при выборе режима работы видеоадаптера в регистр положения подчеркивания символа (регистра ULR), регистры палитры, и регистры таблицы цветов.

Смещение

Размер

Описание

00h

Байт

Управление подчеркиванием символов в текстовых режимах:

1 подчеркивание разрешено во всех текстовых режимах;

0 подчеркивание разрешено во всех монохромных текстовых режимах;

-1 подчеркивание не используется

01h

Байт

Зарезервировано

02h

Слово

Зарезервировано

04h

Слово

Количество регистров контроллера атрибутов, определенных в таблице

06h

Слово

Номер первого регистра контроллера атрибутов

08h

Двойное слово

Адрес таблицы, содержащей значения регистров контроллера атрибутов

0Ch

Слово

Количество регистров таблицы цветов

0Eh

Слово

Номер первого регистра таблицы цветов

10h

Двойное слово

Адрес таблицы, содержащей значения регистров таблицы цветов

14h

Массив байт переменной длины

Список режимов, в которых используется данная таблица. Каждый байт содержит номер режима. Список заканчивается числом 0FFh

Программа BIOSVAR, исходный текст которой представлен в листинге 6.1, считывает из оперативной памяти компьютера значения переменных видеофункций BIOS, а затем отображает их на экране монитора.

Формат вызова программы BIOSVAR имеет следующий вид:


BIOSVAR <номер режима>

Единственный параметр программы BIOSVAR должен задавать режим, в который переводится видеоадаптер перед чтением переменных видеофункций BIOS.

Листинг 6.1. Файл BIOSVAR.С


#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.bEquipFlags,
		(unsigned char) bios_var_table.bVideoMode,
		(unsigned) bios_var_table.wColumns,
		(unsigned) bios_var_table.wPageLength,
		(unsigned) bios_var_table.wVidStart,
		(unsigned) bios_var_table.w8CursorPos[0],
		(unsigned) bios_var_table.wCursorShape,
		(unsigned char) bios_var_table.bActivePage,
		(unsigned) bios_var_table.wAddrCRT,
		(unsigned char) bios_var_table.bRegMode,
		(unsigned char) bios_var_table.bRegPalette,
		(unsigned char) bios_var_table.bRows + 1,
		(unsigned) bios_var_table.wCharHigh,
		(unsigned char) bios_var_table.bInfo,
		(unsigned char) bios_var_table.bInfoTwo,
		(void far*) bios_var_table.dwSavePtr
	);

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

	return 0;
}
[Назад] [Содеожание] [Дальше]