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

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

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

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;
    }
    

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


    Hosted by uCoz