6. Область данных видеофункций BIOSГлава описывает переменные BIOS, размещенные в младших адресах памяти (в так называемой системной области) и используемые видеофункциями BIOS. Знание адресов этих переменных позволяет программе определить количество и тип видеоадаптеров, подключенных к компьютеру, объем видеопамяти, текущий режим работы адаптера. По содержимому переменных BIOS можно также узнать значения регистров видеоадаптера, используемые по умолчанию в каждом поддерживаемом видеоадаптером режиме. Переменные в младших адресах памятиВ младших адресах памяти 0000:0400h - 0000:0500h расположены переменные, используемые функциями BIOS. В них находятся основные параметры, определяющие состояние компьютера. Прикладные программы должны осторожно обращаться с этой областью памяти, так как нарушения в ней могут вызвать зависание системы, или другие нежелательные эффекты. Если вы программируете видеоадаптер непосредственно через регистры, вам следует самостоятельно изменять соответствующие переменные в младших адресах памяти. Это даст вам возможность пользоваться функциями BIOS. Например, если вы изменили непосредственно через регистры видеоадаптера положение курсора, а потом желаете определить его положение при помощи функций BIOS, то надо сразу после изменения регистра изменить и соответствующую переменную BIOS (ее адрес 0000:0450h).
Имена переменных видеофункций BIOS, которые мы привели в таблице соответствуют названиям полей структуры BIOS_VAR. Структура BIOS_VAR определена во включаемом файле SYSGRAPH.H. Вы можете просмотреть этот файл в листинге 3.3. В конце данной главы мы приведем пример использования структуры BIOS_VAR для доступа к переменным видеофункций BIOS (листинг 6.1). Таблица окруженияАдрес таблицы окружения содержится в области переменных видеофункций BIOS (см. выше, переменная по адресу 0000:04A8h). Таблица окружения содержит пять двойных слов, представляющих собой указатели на различные структуры (таблицы и буфера памяти), используемые BIOS видеоадаптера. Таблица окружения, используемая сразу после загрузки компьютера, располагается в ПЗУ BIOS. Поэтому чтобы изменить какие-либо элементы этой таблицы, вы должны сначала перенести ее в оперативную память. Обычно для этого копируется уже существующая таблица и затем в копию вносятся необходимые изменения. Если надо сохранить в памяти новую таблицу окружения после окончания работы программы, то ее оставляют резидентной в памяти. Вы можете заменить таблицу окружения, записав указатель на новую таблицу по адресу 0000:04A8h. Таким образом, вы можете изменить шрифты и некоторые другие параметры, устанавливаемые BIOS при выборе режима работы видеоадаптера. Ниже описаны элементы таблицы окружения:
Сразу после загрузки компьютера заполняются только два элемента таблицы окружения - указатель на таблицу параметров и указатель на дополнительную таблицу окружения. Остальные указатели имеют нулевое значение и не используются. Таблица параметровТаблица параметров используется функциями BIOS для установки регистров видеоадаптера при изменении режимов его работы. Таблица содержит описания для каждого поддерживаемого адаптером режима (по 64 байта на каждый режим):
Синхронизатор
Контроллер ЭЛТ
Контроллер атрибутов
Графический контроллер
В таблице параметров различные режимы размещаются в следующем порядке:
Область сохраненияВ таблице области сохранения хранятся значения регистров цветовой палитры и регистра цвета рамки. Когда функции BIOS изменяют содержимое этих регистров, они одновременно обновляют таблицу области сохранения. Для видеоадаптера EGA регистры цветовой палитры и регистр цвета рамки доступны только для записи. Через таблицу в область сохранения программа может определить значения этих регистров.
Таблица символов текстового режимаКогда BIOS устанавливает текстовый режим работы видеоадаптера, он загружает таблицу знакогенератора шрифтами, записанными в ПЗУ. Если определена таблица символов текстового режима, то шрифты загружаются из нее, а не из ПЗУ. Таблица символов текстового режима может отсутствовать. Если соответствующий указатель в таблице окружения равен нулю, то она не используется. Формат таблицы символов текстового режима:
Вы можете использовать эту таблицу для установки собственных наборов шрифтов. Таблица символов графического режимаНазначение таблицы символов графического режима практически полностью соответствует назначению таблицы символов текстового режима. За исключением того, что она используется при выборе графических режимов работы видеоадаптера. Таблица символов графического режима может отсутствовать. Если соответствующий указатель в таблице окружения равен нулю, то она не используется. Формат таблицы символов графического режима видеоадаптера:
Дополнительная таблица окруженияПоследний элемент таблицы окружения содержит указатель на дополнительную таблицу окружения. Эта таблица содержит несколько дальних указателей на структуры данных, используемые BIOS видеоадаптеров VGA и SVGA. Дополнительная таблица окружения (также как таблица окружения), используемая сразу после загрузки компьютера, располагается в ПЗУ BIOS. Чтобы изменить какие-либо элементы этой таблицы, вы должны сначала перенести ее в оперативную память (см. раздел "Таблица окружения"). Ниже описаны элементы дополнительной таблицы окружения:
После загрузки компьютера заполняются только один элемент таблицы окружения - указатель на таблицу кодов комбинаций мониторов. Остальные указатели имеют нулевое значение и не используются. Вторая таблица символов текстового режимаДля видеоадаптера VGA вы можете определить второй набор из 256 символов. Формат второй таблицы символов текстового режима полностью соответствует таблице символов текстового режима. Таблица кодов комбинаций мониторовТаблица кодов комбинаций мониторов содержит список всех комбинаций видеоподсистем, которые поддерживает BIOS (см. прерывание INT 10h, функция 1Ah). Формат таблицы представлен ниже:
Таблица настройки палитрыТаблица настройки палитры содержит значения, загружаемые при выборе режима работы видеоадаптера в регистр положения подчеркивания символа (регистра ULR), регистры палитры, и регистры таблицы цветов.
Программа 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;
}
|

