- •Аннотация
- •Введение
- •Как связаться с авторами
- •Благодарности
- •Замечания
- •1. Видеоподсистема компьютера
- •Мониторы
- •2. Режимы работы видеоадаптеров
- •Режимы 0 и 1
- •Режимы 0*, 1*
- •Режимы 2 и 3
- •Режимы 2*, 3*
- •Режимы 4 и 5
- •Режим 6
- •Режим 7
- •Режимы 8, 9, 0Ah
- •Режим 0Dh
- •Режим 0Eh
- •Режим 0Fh
- •Режим 10h
- •Режим 11h
- •Режим 12h
- •Режим 13h
- •3. Архитектура видеоадаптеров ega и vga
- •Монитор
- •Видеопамять
- •Текстовый режим
- •Знакогенератор
- •Атрибуты символов
- •Атрибуты символов (монохромный режим)
- •Видеопамять в графических режимах
- •Режимы 4 и 5
- •Режим 6
- •Режимы 0Dh и 0Eh
- •Режим 0Fh
- •Режим 10h
- •Режим 11h
- •Режим 12h
- •Режим 13h
- •Графический контроллер
- •Операция записи
- •Операция чтения
- •Последовательный преобразователь
- •Контроллер атрибутов
- •Контроллер элт
- •Синхронизатор
- •4. Регистры видеоадаптеров ega, vga и svga
- •Краткий обзор
- •Внешние регистры
- •Регистр определения различных режимов работы (Miscellaneous Output Register - mor)
- •Регистр управления дополнительным устройством (Feature Control Register - fcr)
- •Регистр состояния 0 (Input Status Register 0 - isr0)
- •Регистр состояния 1 (Input Status Register 1 - isr0)
- •Регистр разрешения работы системы vga (vga Enable Register - vga_er)
- •Регистр сброса триггера-защелки светового пера (Light Pen Latch Reset Register - lplrr)
- •Регистр установки триггера-защелки светового пера (Light Pen Latch Set Register - lplsr)
- •Регистры контроллера элт
- •Общая длина линии горизонтальной развертки (Horizontal Total Register - htr) (индекс 0)
- •Длина отображаемой части горизонтальной развертки (Horizontal Display Enable End Register - hder) (индекс 1)
- •Начало импульса гашения луча горизонтальной развертки (Start Horizontal Blank Register - shbr) (индекс 2)
- •Конец импульса гашения луча горизонтальной развертки (End Horizontal Blank Register - ehbr) (индекс 3)
- •Начало импульса горизонтального обратного хода луча (Start Horizontal Retrace Register - shrr) (индекс 4)
- •Конец импульса горизонтального обратного хода луча (End Horizontal Retrace Register - ehrr) (индекс 5)
- •Число горизонтальных линий растра (Vertical Total Register - vtr) (индекс 6)
- •Дополнительный регистр (Overflow Register - ovr) (индекс 7)
- •Предварительная установка горизонтальной развертки (Preset Row Scan Register - prsr) (индекс 8)
- •Высота символов текста (Max Scan Line Register - mslr) (индекс 9)
- •Начальная линия курсора (Cursor Start Register - csr) (индекс 0Ah)
- •Конечная линия курсора (Cursor End Register - cer) (индекс 0Bh)
- •Регистры начального адреса
- •Регистры, определяющие положение курсора
- •Начало обратного вертикального хода луча (Vertical Retrace Start Register - vrsr) (индекс 10h)
- •Конец обратного вертикального хода луча (Vertical Retrace End Register - vrer) (индекс 11h)
- •Регистр адреса светового пера (Light Pen Address Register - lpar)
- •Завершение отображения вертикальной развертки (Vertical Display End Register - vder) (индекс 12h)
- •Логическая ширина экрана (Offset Register - ofr) (индекс 13h)
- •Положение подчеркивания символа (Underline Location Register - ulr) (индекс 14h)
- •Начало импульса гашения вертикальной развертки (Start Vertical Blank Register - svbr) (индекс 15h)
- •Конец импульса гашения вертикальной развертки (End Vertical Blank Register - evbr) (индекс 16h)
- •Управление режимом (Mode Control Register - mcr) (индекс 17h)
- •Регистр сравнения линий (Line Compare Register - lcr) (индекс 18h)
- •Регистры синхронизатора
- •Регистр сброса синхронизатора (Reset Register - rr) (индекс 0)
- •Регистр режима синхронизации (Clock Mode Register - cmr) (индекс 1)
- •Регистр разрешения записи цветового слоя (Color Plane Write Enable - cpwe) (индекс 2)
- •Регистр выбора знакогенератора (Character Generator Select Register - cgsr) (индекс 3)
- •Регистр определения структуры памяти (Memory Mode Register - mmr) (индекс 4)
- •Регистры графического контроллера
- •Регистр установки/сброса (Set/Reset Register - srr) (индекс 0)
- •Регистр разрешения установки/сброса (Set/Reset Enable Register - srer) (индекс 1)
- •Регистр сравнения цветов (Color Compare Register - ccr) (индекс 2)
- •Регистр циклического сдвига и выбора функции (Data Rotate & Function Select - drfs) (индекс 3)
- •Регистр выбора читаемого слоя (Read Plane Select Register - rpsr) (индекс 4)
- •Регистр режима работы (Mode Register - mdr) (индекс 5)
- •Регистр смешанного назначения (Miscellaneous Register - mir) (индекс 6)
- •Регистр маскирования цветовых слоев (Color Don't Care Register - cdcr) (индекс 7)
- •Регистр битовой маски (Bit Mask Register - bmr) (индекс 8)
- •Регистры контроллера атрибутов
- •Регистры цветовой палитры (0-15) (Color Palette Register's - cpr)
- •Улучшенный цветной монитор
- •Регистр цвета рамки экрана (Screen Border Color Register - sbcr) (индекс 11)
- •Регистр разрешения цветового слоя (Color Plane Enable Register - cper) (индекс 12)
- •Регистр горизонтального панорамирования (Horizontal Panning Register - hpr) (индекс 13)
- •Регистр выбора цвета (Color Select Register - csr) (индекс 14)
- •Регистры цифро-аналогового преобразователя vga
- •Регистр маскирования пикселов (Pixel Mask Register - pmr)
- •Регистр состояния цап (dac State Register - dac_sr)
- •Индекс читаемого регистра таблицы цветов (Look-up Table Read Index Register - ltrir)
- •Индекс записываемого регистра таблицы цветов (Look-up Table Write Index Register - ltwir)
- •Регистр данных таблицы цветов (Look-up Table Data Register - ltdr)
- •Нестандартные режимы видеоадаптера vga
- •Организация видеопамяти
- •Режим 320х400 пикселов, 256 цветов
- •Режим 360х480 пикселов, 256 цветов
- •5. Использование функций bios для работы с видеоадаптерами
- •Выбор режима работы - функция 00h
- •Изменение формы курсора - функция 01h
- •Изменение положения курсора - функция 02h
- •Определение положения и формы курсора - функция 03h
- •Использование светового пера - функция 04h
- •Выбор активной страницы видеопамяти - функция 05h
- •Свертка окна вверх - функция 06h
- •Свертка текстового окна вниз - функция 07h
- •Чтение символа и его атрибутов - функция 08h
- •Запись символа с атрибутами в текущей позиции курсора - функция 09h
- •Запись символа в текущей позиции курсора - функция 0Ah
- •Установка цветовой палитры (режимы 4,5,6) - функция 0Bh
- •Вывод пиксела - функция 0Ch
- •Чтение пиксела - функция 0Dh
- •Запись символа в режиме телетайпа - функция 0Eh
- •Определение текущего режима работы видеоадаптера - функция 0Fh
- •Управление регистрами палитры - функция 10h
- •Установка регистра палитры - подфункция 00h
- •Установка цвета рамки - подфункция 01h
- •Установка всех регистров палитры - подфункция 02h
- •Управление атрибутом мигания и атрибутом интенсивности - подфункция 03h
- •Чтение регистра палитры - подфункция 07h
- •Чтение регистра цвета рамки - подфункция 08h
- •Чтение всех регистров палитры - подфункция 09h
- •Установка регистра таблицы цветов (регистров цап) - подфункция 10h
- •Установка нескольких регистров таблицы цветов (регистров цап) - подфункция 12h
- •Выбор подмножества цветов - подфункция 13h ???
- •Чтение регистра таблицы цветов - подфункция 15h
- •Чтение нескольких регистров таблицы цветов (регистров цап) - подфункция 17h
- •Определение режима подмножества цветов - подфункция 1Ah ???
- •Установка палитры из градаций серого цвета - подфункция 1Bh
- •Загрузка таблиц знакогенератора - функция 11h
- •Загрузка набора символов пользователя - подфункция 00h
- •Загрузка набора символов из bios - подфункция 01h
- •Загрузка набора символов из bios - подфункция 02h
- •Выбор активных таблиц знакогенератора - подфункция 03h
- •Загрузка набора символов из bios - подфункция 04h
- •Установка вектора прерывания 1Fh - подфункция 20h
- •Установка набора символов для графических режимов - подфункция 21h
- •Установка набора символов 8х14 из пзу bios
- •Установка набора символов 8х8 из пзу bios
- •Установка набора символов 8х16 из пзу bios
- •Получение информации об используемом наборе символов - подфункция 30h
- •Определение конфигурации и выбор программы распечатки экрана - функция 12h
- •Определение конфигурации видеоадаптера - подфункция 10h
- •Выбор программы печати экрана - подфункция 20h
- •Выбор количества линий развертки в текстовом режиме - подфункция 30h
- •Запрещение переустановки палитры - подфункция 31h
- •Управление доступом к видеоадаптеру - подфункция 32h
- •Управление преобразованием серого цвета - подфункция 33h
- •Эмуляция курсора cga - подфункция 34h
- •Выбор активного монитора - подфункция 35h
- •Гашение экрана монитора - подфункция 36h
- •Вывод текстовой строки - функция 13h
- •Чтение/запись конфигурации видеосистемы - функция 1Ah
- •Чтение конфигурации видеосистемы - подфункция 00h
- •Запись конфигурации видеосистемы - подфункция 01h
- •Получение данных о состоянии vga - функция 1Bh
- •Сохранение/восстановление состояния видеоадаптера - функция 1Ch
- •Определение размера буфера - подфункция 00h
- •Сохранение текущего состояния видеоадаптера - подфункция 01h
- •Восстановление текущего состояния видеоадаптера - подфункция 02h
- •Русификация видеоадаптеров
- •6. Область данных видеофункций bios
- •Переменные в младших адресах памяти
- •Область сохранения
- •Дополнительная таблица окружения
- •Вторая таблица символов текстового режима
- •7. Видеоадаптеры svga
- •Видеопамять svga
- •Слоеный пирог
- •Увидеть весь мир через замочную скважину
- •Больше цветов больше бит
- •Стандарт vesa
- •Получить информацию о реализации vbe и видеоадаптере
- •Получить информацию о режиме видеоадаптера
- •Установить режим видеоадаптера
- •Определить текущий режим видеоадаптера
- •Сохранить/восстановить состояние видеоадаптера
- •Управление адресацией видеопамяти
- •Установить/определить длину строки развертки
- •Установить/определить видимую область экрана
- •Установить/определить размер регистров цап
- •Управление монитором
- •Определение возможностей управления
- •Включить режим сохранения электроэнергии
- •Определить состояние монитора
- •8. Использование функций ms-dos для управления видеоадаптерами
- •Функция puts
- •Функция printf
- •Функция putch
- •Функция cputs
- •Функция cprintf
- •Литература
- •Оглавление
- •5. Использование функций bios для работы с видеоадаптерами 100
- •6. Область данных видеофункций bios 152
- •7. Видеоадаптеры svga 159
- •8. Использование функций ms-dos для управления видеоадаптерами 175
- •9. Стандартные функции вывода языка Си 176
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 |