- •Аннотация
- •Введение
- •Как связаться с авторами
- •Благодарности
- •Замечания
- •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
Синхронизатор
Синхронизатор управляет всеми временными параметрами видеоадаптера. С точки зрения программирования, наиболее полезной является функция синхронизатора, управляющая разрешением и запрещением доступа к отдельным цветовым слоям видеопамяти. Рисунок 3.18 иллюстрирует использование функции разрешения записи цветовых слоев.
PICTURE._FIG_17.PCX;6";4.308";PCX
Рисунок 3.18 Разрешение записи в цветовые слои
Процессор передает видеоадаптеру данные для записи в видеопамять. Они проходят через графический контроллер и попадают в синхронизатор. Графический контроллер выполняет над данными, записываемыми в видеопамять, операции, определяемые состоянием его регистров (смотри главу "Исполнение видеоадаптером операции записи" из раздела "Графический контроллер").
В зависимости от значения регистра разрешения записи цветового слоя синхронизатор может оставить данные в цветовом слое без изменения. Регистр разрешения записи цветового слоя содержит четыре бита, управляющие записью в цветовые слои видеопамяти. Если бит регистра управляющий цветовым слоем равен нулю, то данный цветовой слой не изменяется. Если бит регистра равен единице, то в данный слой видеопамяти записываются значения, поступившие от графического контроллера.
4. Регистры видеоадаптеров ega, vga и svga
В этой главе мы опишем все основные регистры видеоадаптеров EGA, VGA и SVGA, которые могут быть полезны при написании программ. Программирование видеоадаптеров на уровне регистров позволяет увеличить скорость работы программ и решить некоторые задачи, которые нельзя решить только при помощи функций BIOS.
Непосредственное использование регистров может вызвать ряд проблем при переносе ваших программ на другие машины. Дело в том, что не все адаптеры совместимы на уровне регистров. Например, оригинальный видеоадаптер CGA создан на основе микросхемы Motorola 6845, а видеоадаптеры EGA и VGA используют более совершенный аналог этой микросхемы. Некоторые регистры CGA располагаются по другим адресам и могут выполнять какие-либо дополнительные функции, чем регистры EGA и VGA. Кроме того, в каждом новом видеоадаптере SVGA расширяется набор используемых регистров.
Существуют модели видеоадаптеров EGA, VGA и SVGA, поддерживающие режим совместимости, когда они эмулируют адаптеры более низкого уровня (например MDA, Hercules, CGA). Эмуляция обычно происходит на уровне регистров, что гарантирует полную их совместимость. Режимы совместимости, если они поддерживаются, описаны в руководстве данного видеоадаптера.
На практике, для управления видеоадаптерами, рекомендуется преимущественно использовать функции BIOS. Это избавит вас от неприятных минут, когда ваша работающая программа, при переносе на другую машину перестанет правильно выполняться.
Краткий обзор
Видеоадаптеры EGA, VGA и SVGA имеют большое количество регистров. Адаптер EGA имеет около шестидесяти регистров, а VGA и SVGA еще больше. Большая часть регистров EGA доступна только для записи, что создает определенные проблемы, особенно для мультизадачных систем.
Некоторые фирмы-изготовители видеоадаптеров выпускают платы видеоадаптеров совместимые с EGA, для регистров которых разрешена также и операция чтения. В адаптерах VGA и SVGA практически все регистры доступны как для записи, так и для чтения.
w В тех случаях, когда видеоадаптеры SVGA и VGA имеют отличия от EGA, мы будем на это специально указывать.
Доступ к большинству регистров видеоадаптеров осуществляется в два этапа: через один порт ввода/вывода выбирается номер интересующего вас регистра, а затем через другой порт ввода/вывода осуществляется обмен данными. Такая организация регистров позволяет сэкономить большое количество портов центрального процессора. Остальные регистры адресуются непосредственно через соответствующие порты ввода/вывода - каждому регистру соответствует один порт ввода/вывода.
Заметим, что в различных режимах работы видеоадаптера, его регистры могут иметь различные адреса.
Приведем список адресов регистров в монохромных режимах:
Адрес |
Регистр |
3C2h |
Регистр определения различных режимов работы (Miscellaneous Output Register - MOR), Регистр состояния 0 (Input Status Register 0 - ISR0) |
3BAh |
Регистр управления дополнительным устройством (Feature Control Register), Регистр состояния 1 (Input Status Register 1 - ISR1) |
3BBh |
Регистр очистки защелки светового пера (Clear Light Pen Latch Register- CLPLR) |
3BCh |
Установка защелки светового пера (Set Light Pen Latch Register - SLPLR) |
3C4h, 3C5h |
Регистры синхронизатора (Sequencer Register's - SR) |
3B4h, 3B5h |
Регистры контроллера ЭЛТ (CRT Controller Register's - CRT_CR) |
3CAh, 3CCh, 3CEh, 3CFh |
Регистры графического контроллера (Graphics Controller Register's - GCR) |
3C0h |
Регистр контроллера атрибутов (Attribute Controller Register - ACR) |
3C3h |
Регистр разрешения работы системы VGA (VGA Enable Register - VGA_ER) |
3C6h, 3C7h, 3C8h, 3C9h |
Регистры цифро-аналогового преобразователя (ЦАП) VGA (VGA Video DAC Register - VGA_DAC_R) |
А теперь перечислим адреса тех же регистров, но уже для цветных режимов видеоадаптера:
Адрес |
Регистр |
3C2h |
Регистр определения различных режимов работы (Miscellaneous Output Register - MOR), Регистр состояния 0 (Input Status Register 0 - ISR0) |
3DAh |
Регистр управления дополнительным устройством Feature Control Register), Регистр состояния 1 (Input Status Register 1 - ISR1) |
3DBh |
Регистр очистки защелки светового пера (Clear Light Pen Latch Register- CLPLR) |
3DCh |
Установка защелки светового пера (Set Light Pen Latch Register - SLPLR) |
3C4h, 3C5h |
Регистры синхронизатора (Sequencer Register's - SR) |
3D4h, 3D5h |
Регистры контроллера ЭЛТ (CRT Controller Register's - CRT_CR) |
3CAh, 3CCh, 3CEh, 3CFh |
Регистры графического контроллера (Graphics Controller Register's - GCR) |
3C0h |
Регистр контроллера атрибутов (Attribute Controller Register - ACR) |
3C3h |
Регистр разрешения работы системы VGA (VGA Enable Register - VGA_ER) |
3C6h, 3C7h, 3C8h, 3C9h |
Регистры ЦАП VGA (VGA Video DAC Register - VGA_DAC_R) |
В зависимости от режима работы видеопамять адаптера занимает различное адресное пространство:
Номер режима работы |
Адрес памяти |
0,1,2,3,4,5,6 |
B000:8000h-B000:FFFFh |
7 |
B000:0000h-B000:7FFFh |
0Dh,0Eh,0Fh,10h,11h,12h,13h |
A000:0000h-A000:FFFFh |
Ниже мы привели исходный текст функции Get_Seg_Vmem. Данная функция определяет текущий режим работы видеоадаптера и возвращает сегментный адрес начала видеопамяти. Если видеоадаптер работает в нестандартном режиме, функция возвращает нулевое значение.
Чтобы узнать номер текущего режима видеоадаптера, используется функция 0Fh прерывания INT 10h. Пример вызова данной функции представлен в листинге 4.1.
Листинг 4.1. Файл SEGVMEM.C
// Файл SYSP.H представлен в листинге 3.2 #include "sysp.h" unsigned GetSegVmem(void) { unsigned char mode; unsigned seg_address; // Определяем текущий режим видеоадаптера _asm { mov ah,0Fh int 10h mov mode,al } // Если видеоадаптер находится в режимах 0, 1, 2, 3, // 4, 5, 6 то видеопамять начинается с сегмента B800h if((mode >= 0) && (mode <= 6)) seg_address = 0xB800; // Если видеоадаптер находится в режиме 7, // то видеопамять начинается с сегмента B000h else if(mode == 7) seg_address = 0xB000; // Если видеоадаптер находится в режимах 0Dh - 13h, // то видеопамять начинается с сегмента A000h else if((mode >= 0x0D) && (mode <= 0x13)) seg_address = 0xA000; // Если видеоадаптер не находится в стандартном режиме // возвращаем ноль else seg_address = 0x0; return(seg_address); }
Ниже подробно рассмотрены регистры видеоадаптеров EGA и VGA. Мы выделили следующие группы регистров:
w Внешние регистры
w Регистры контроллера ЭЛТ
w Регистры графического контроллера
w Регистры контроллера атрибутов
w Регистры синхронизатора
w Регистры цифро-аналогового преобразователя VGA