Глава описывает переменные BIOS, размещенные в младших адресах памяти (в так называемой системной области) и используемые видеофункциями BIOS. Знание адресов этих переменных позволяет программе определить количество и тип видеоадаптеров, подключенных к компьютеру, объем видеопамяти, текущий режим работы адаптера.
По содержимому переменных BIOS можно также узнать значения регистров видеоадаптера, используемые по умолчанию в каждом поддерживаемом видеоадаптером режиме.
В младших адресах памяти 0000:0400h - 0000:0500h расположены переменные, используемые функциями BIOS. В них находятся основные параметры, определяющие состояние компьютера. Прикладные программы должны осторожно обращаться с этой областью памяти, так как нарушения в ней могут вызвать зависание системы, или другие нежелательные эффекты.
Если вы программируете видеоадаптер непосредственно через регистры, вам следует самостоятельно изменять соответствующие переменные в младших адресах памяти. Это даст вам возможность пользоваться функциями BIOS.
Например, если вы изменили непосредственно через регистры видеоадаптера положение курсора, а потом желаете определить его положение при помощи функций BIOS, то надо сразу после изменения регистра изменить и соответствующую переменную BIOS (ее адрес 0000:0450h).
Адрес и имя |
Размер |
Содержание |
0000:0410h |
Байт |
Флаги конфигурации: биты D5 и D4 определяют режим видеоадаптера, используемый сразу после включения компьютера: |
0000:0449h |
Байт |
Номер текущего режима работы видеоадаптера |
0000:044Ah |
Слово |
Количество символов в строке экрана |
0000:044Сh |
Слово |
Размер страницы видеопамяти в байтах |
0000:044Eh |
Слово |
Смещение отображаемой области видеопамяти от начала видеопамяти (значение регистра начального адреса - SAR) |
0000:0450h |
8 слов |
Каждое слово определяет координаты курсоров для одной из 8 страниц видеопамяти. Младший байт слова определяет столбец, а старший строку экрана в которой находится курсор |
0000:0460h |
Слово |
Определяет форму курсора (позицию первой и последней линии курсора). Старший байт слова содержит позицию первой строки курсора, а младший - последней. Состояние данной переменной отвечает регистрам начальной и конечной линии курсора (CSR - старший и CER - младший байты соответственно) |
0000:0462h |
Байт |
Номер отображаемой (текущей) страницы видеопамяти |
0000:0463h |
Слово |
Адрес индексного регистра контроллера ЭЛТ. Содержит 3B4h для монохромных или 3D4h для цветных режимов адаптера |
0000:0465h |
Байт |
Значение регистра режима для видеоадаптеров CGA и MDA (регистр MCR). Для видеоадаптеров EGA и VGA эмулируется CGA и MDA |
0000:0466h |
Байт |
Значение регистра цветовой палитры CGA (регистр CSR). Для видеоадаптеров EGA и VGA эмулируется CGA и MDA |
0000:0484h |
Байт |
Количество текстовых строк на экране минус единица |
0000:0485h |
Слово |
Высота символов в пикселах |
0000:0487h |
Байт |
Первый байт информации (для видеоадаптеров EGA и VGA): |
0000:0488h |
Байт |
Второй байт информации о EGA: |
0000:0489h |
Байт |
Набор различных флагов |
0000:048Ah |
Байт |
Индекс таблицы кодов комбинаций мониторов (Display Combination Code table index) |
0000:04A8h |
Двойное слово |
Адрес таблицы окружения (см. следующий раздел) |
Имена переменных видеофункций 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 |
Байт |
Управление подчеркиванием символов в текстовых режимах: |
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; }