6. Область данных видеофункций BIOS

Глава описывает переменные BIOS, размещенные в младших адресах памяти (в так называемой системной области) и используемые видеофункциями BIOS. Знание адресов этих переменных позволяет программе определить количество и тип видеоадаптеров, подключенных к компьютеру, объем видеопамяти, текущий режим работы адаптера.

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

Переменные в младших адресах памяти

В младших адресах памяти 0000:0400h - 0000:0500h расположены переменные, используемые функциями BIOS. В них находятся основные параметры, определяющие состояние компьютера. Прикладные программы должны осторожно обращаться с этой областью памяти, так как нарушения в ней могут вызвать зависание системы, или другие нежелательные эффекты.

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

Например, если вы изменили непосредственно через регистры видеоадаптера положение курсора, а потом желаете определить его положение при помощи функций BIOS, то надо сразу после изменения регистра изменить и соответствующую переменную BIOS (ее адрес 0000:0450h).

Адрес и имя Размер Содержание
0000:0410h
bEquipFlags
Байт Флаги конфигурации: биты D5 и D4 определяют режим видеоадаптера, используемый сразу после включения компьютера:
D5 D4
0   0 зарезервировано;
0   1 40 символов в строке, цветной;
1   0 80 символов в строке, цветной;
1   1 текстовый, монохромный.
Если биты D5 и D4 содержат единицы, значит используется монохромный адаптер. Видеопамять начинается по адресу B000:0000h.
В противном случае активным является цветной видеоадаптер и видеопамять начинается по адресу B800:0000h.
Остальные биты данного байта отвечают за другие подсистемы компьютера. Вы не должны изменять их значения
0000:0449h
bVideoMode
Байт Номер текущего режима работы видеоадаптера
0000:044Ah
wColumns
Слово Количество символов в строке экрана
0000:044Сh
wPageLength
Слово Размер страницы видеопамяти в байтах
0000:044Eh
wVidStart
Слово Смещение отображаемой области видеопамяти от начала видеопамяти (значение регистра начального адреса - SAR)
0000:0450h
w8CursorPos
8 слов Каждое слово определяет координаты курсоров для одной из 8 страниц видеопамяти. Младший байт слова определяет столбец, а старший строку экрана в которой находится курсор
0000:0460h
wCursorShape
Слово Определяет форму курсора (позицию первой и последней линии курсора). Старший байт слова содержит позицию первой строки курсора, а младший - последней. Состояние данной переменной отвечает регистрам начальной и конечной линии курсора (CSR - старший и CER - младший байты соответственно)
0000:0462h
bActivePage
Байт Номер отображаемой (текущей) страницы видеопамяти
0000:0463h
wAddrCRT
Слово Адрес индексного регистра контроллера ЭЛТ. Содержит 3B4h для монохромных или 3D4h для цветных режимов адаптера
0000:0465h
bRegMode
Байт Значение регистра режима для видеоадаптеров CGA и MDA (регистр MCR). Для видеоадаптеров EGA и VGA эмулируется CGA и MDA
0000:0466h
bRegPalette
Байт Значение регистра цветовой палитры CGA (регистр CSR). Для видеоадаптеров EGA и VGA эмулируется CGA и MDA
0000:0484h
bRows
Байт Количество текстовых строк на экране минус единица
0000:0485h
wCharHigh
Слово Высота символов в пикселах
0000:0487h
bInfo
Байт Первый байт информации (для видеоадаптеров EGA и VGA):
D0 если бит равен единице, то разрешена эмуляция курсора CGA
D1 равен единице, видеоадаптер подсоединен к монохрому монитору
D2 единица в этом бите означает, что BIOS будет ожидать обратного вертикального хода луча перед записью в видеопамять (для видеоадаптера EGA).
D3 бит установлен, если видеоподсистема неактивна
D4 зарезервировано
D6 D5 позволяют определить объем видеопамяти, установленной на адаптере EGA. Объем видеопамяти адаптеров VGA и SVGA, как правило, не бывает меньше 256 Кбайт
D6 D5 объем видеопамяти:
0   0 64 Кбайт;
0   1 128 Кбайт;
1   0 192 Кбайт;
1   1 256 Кбайт
D7 единица означает, что последняя операция выбора режима видеоадаптера не очистила видеопамять
0000:0488h
bInfoTwo
Байт Второй байт информации о EGA:
D3-D0 положение переключателей на плате EGA (1 - OFF, 0 - ON)
D3 переключатель 4;
D2 переключатель 3;
D1 переключатель 2;
D0 переключатель 1
BIOS видеоадаптера VGA эмулирует переключатели EGA в соответствии с типом используемого монитора;
D7-D4 значение регистра управления дополнительным устройством видеоадаптера EGA
0000:0489h
bFlags
Байт Набор различных флагов
D7, D4 количество линий развертки для текстовых режимов:
D7 D4
0   0 350 линий;
0   1 400 линий;
1   0 200 линий;
1   1 зарезервировано
D6 содержит единицу, если переключение мониторов разрешено и ноль в противном случае
D5 зарезервировано
D3 если данный бит содержит значение 1, значит загрузка палитры по умолчанию запрещена
D2 содержит единицу, если используется монохромный монитор и ноль - если используется цветной монитор
D1 содержит единицу, если разрешено преобразование серого цвета
D0 содержит единицу, если VGA активен и ноль - если не активен
0000:048Ah
bDCC
Байт Индекс таблицы кодов комбинаций мониторов (Display Combination Code table index)
0000:04A8h
dwSavePtr
Двойное слово Адрес таблицы окружения (см. следующий раздел)

Имена переменных видеофункций BIOS, которые мы привели в таблице соответствуют названиям полей структуры BIOS_VAR. Структура BIOS_VAR определена во включаемом файле SYSGRAPH.H. Вы можете просмотреть этот файл в листинге 3.3.

В конце данной главы мы приведем пример использования структуры BIOS_VAR для доступа к переменным видеофункций BIOS (листинг 6.1).

Таблица окружения

Адрес таблицы окружения содержится в области переменных видеофункций BIOS (см. выше, переменная по адресу 0000:04A8h). Таблица окружения содержит пять двойных слов, представляющих собой указатели на различные структуры (таблицы и буфера памяти), используемые BIOS видеоадаптера.

Таблица окружения, используемая сразу после загрузки компьютера, располагается в ПЗУ BIOS. Поэтому чтобы изменить какие-либо элементы этой таблицы, вы должны сначала перенести ее в оперативную память. Обычно для этого копируется уже существующая таблица и затем в копию вносятся необходимые изменения. Если надо сохранить в памяти новую таблицу окружения после окончания работы программы, то ее оставляют резидентной в памяти.

Вы можете заменить таблицу окружения, записав указатель на новую таблицу по адресу 0000:04A8h. Таким образом, вы можете изменить шрифты и некоторые другие параметры, устанавливаемые BIOS при выборе режима работы видеоадаптера.

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

Смещение Размер Описание
00h Двойное слово Указатель на таблицу параметров, содержащую значения регистров EGA/VGA, устанавливаемые BIOS по умолчанию
04h Двойное слово Указатель на область сохранения значений некоторых регистров EGA/VGA, доступных только для чтения
08h Двойное слово Указатель на таблицу символов текстового режима
0Ch Двойное слово Указатель на таблицу символов графического режима
10h Двойное слово Указатель на дополнительную таблицу окружения, используемую для расширения таблицы окружения (доступна только для видеоадаптеров VGA и SVGA)
14h Двойное слово Зарезервировано
18h Двойное слово Зарезервировано

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

Таблица параметров

Таблица параметров используется функциями BIOS для установки регистров видеоадаптера при изменении режимов его работы. Таблица содержит описания для каждого поддерживаемого адаптером режима (по 64 байта на каждый режим):

Смещение Размер Содержание
0 Байт Количество символов в строке
1 -"- Количество текстовых строк на экране
2 -"- Высота символов в пикселах
3 Слово Объем страницы видеопамяти в байтах

Синхронизатор

5 Байт Регистр режима синхронизации (CMR)
6 -"- Регистр разрешения записи цветового слоя (CPWER)
7 -"- Регистр выбора знакогенератора (CGSR)
8 -"- Регистр определения структуры памяти (MMR)
9 -"- Регистр определения различных режимов работы (MOR)

Контроллер ЭЛТ

0Ah Байт Общая длина линии горизонтальной развертки (HTR)
0Bh -"- Длина отображаемой части горизонтальной развертки (HDER)
0Ch -"- Начало импульса гашения луча горизонтальной развертки (SHBR)
0Dh -"- Конец импульса гашения луча горизонтальной развертки (EHBR)
0Eh -"- Начало импульса горизонтального обратного хода луча (SHRR)
0Fh -"- Конец импульса горизонтального обратного хода луча (EHRR)
10h -"- Количество горизонтальных линий растра (VTR)
11h -"- Дополнительный регистр (OVR)
12h -"- Предварительная установка горизонтальной развертки (PRSR)
13h -"- Высота символов текста (MSLR)
14h -"- Начальная линия курсора (CSR)
15h -"- Конечная линия курсора (CER)
16-19h 4 Байта Не используются
1Ah Байт Начало обратного вертикального хода луча (VRSR)
1Bh -"- Конец обратного вертикального хода луча (VRER)
1Ch -"- Начало гашения вертикальной развертки (VDER)
1Dh -"- Логическая ширина экрана (OFR)
1Eh -"- Положение подчеркивания символа (ULR)
1Fh -"- Начало импульса гашения вертикальной развертки (SVBR)
20h -"- Конец импульса гашения вертикальной развертки (EVBR)
21h -"- Управление режимом (MCR)
22h -"- Разделение экрана монитора (LCR)

Контроллер атрибутов

23-32h Байт Регистры цветовой палитры (0-15) (CPR)
33h -"- Регистр управления режимом (MCR)
34h -"- Регистр цвета рамки экрана (SBCR)
35h -"- Регистр разрешения цветового слоя (CPER)
36h -"- Регистр горизонтального панорамирования (HPR)

Графический контроллер

37h Байт Регистр установки/сброса (SRR)
38h -"- Регистр разрешения установки/сброса (SRER)
39h -"- Регистр сравнения цветов (CCR)
3Ah -"- Регистр циклического сдвига и выбора функции (DRFS)
3Bh -"- Регистр выбора читаемого слоя (RPSR)
3Ch -"- Регистр режима работы (MDR)
3Dh -"- Регистр смешанного назначения (MIR)
3Eh -"- Регистр маскирования цветовых слоев (CDCR)
3Fh -"- Регистр битовой маски (BMR)

В таблице параметров различные режимы размещаются в следующем порядке:

Смешение от начала таблицы параметров Номер режима видеоадаптера
+00h 0h
+40h 1h
+80h 2h
+C0h 3h
+100h 4h
+140h 5h
+180h 6h
+1C0h 7h
+200h 8h
+240h 9h
+280h Ah
+2C0h Bh
+300h Ch
+340h Dh
+380h Eh
+3C0h Fh (адаптер EGA, имеющий 64 Кбайт памяти)
+400h 10h (адаптер EGA, имеющий 64 Кбайт памяти)
+440h Fh
+480h 10h
+4C0h 0*h
+500h 1*h
+540h 2*h
+580h 3*h
+5C0h 0h+,1h+
+600h 2h+,3h+
+640h 7h+
+680h 11h
+6C0h 12h
+700h 13h

Область сохранения

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

Для видеоадаптера EGA регистры цветовой палитры и регистр цвета рамки доступны только для записи. Через таблицу в область сохранения программа может определить значения этих регистров.

Смещение в байтах Размер, байт Содержимое
0 16 Список значений 16 регистров цветовой палитры
10h 1 Значение регистра цвета рамки экрана
11h-0FFh 239 Не используется

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

Когда BIOS устанавливает текстовый режим работы видеоадаптера, он загружает таблицу знакогенератора шрифтами, записанными в ПЗУ. Если определена таблица символов текстового режима, то шрифты загружаются из нее, а не из ПЗУ. Таблица символов текстового режима может отсутствовать. Если соответствующий указатель в таблице окружения равен нулю, то она не используется.

Формат таблицы символов текстового режима:

Смещение (байт) Размер Содержание
0 Байт Количество байт, используемых для определения одного символа шрифта
1 Байт Номер таблицы знакогенератора (для видеоадаптера EGA 0-3, для VGA 0-7)
2 Слово Количество символов в таблице знакогенератора (обычно 256)
4 Слово Номер первого символа, определяемого таблицей
6 Двойное слово Указатель на таблицу символов (см. описание INT 1Fh)
0Ah Байт Высота символов в пикселах
0Bh Массив байт переменной длины Список режимов, использующих данную таблицу символов. На каждый номер режима отводится один байт. Должен оканчиваться числом 0FFh

Вы можете использовать эту таблицу для установки собственных наборов шрифтов.

Таблица символов графического режима

Назначение таблицы символов графического режима практически полностью соответствует назначению таблицы символов текстового режима. За исключением того, что она используется при выборе графических режимов работы видеоадаптера.

Таблица символов графического режима может отсутствовать. Если соответствующий указатель в таблице окружения равен нулю, то она не используется.

Формат таблицы символов графического режима видеоадаптера:

Смещение, байт Размер Содержание
0 Байт Количество строк символов на экране
1 Слово Количество байт, используемых при определении одного символа шрифта
3 Двойное слово Указатель на таблицу символов
7 Массив байт переменной длины Список режимов, использующих данную таблицу символов. На каждый номер режима отводится один байт. Должен оканчиваться числом 0FFh

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

Последний элемент таблицы окружения содержит указатель на дополнительную таблицу окружения. Эта таблица содержит несколько дальних указателей на структуры данных, используемые 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;
}