- •Аннотация
- •Введение
- •Как связаться с авторами
- •Благодарности
- •Замечания
- •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
Атрибуты символов
Внешний вид символа, отображаемого на экране в текстовом режиме, определяется не только его кодом ASCII, но и байтом атрибутов. Атрибуты задают цвет символа, цвет фона, а также некоторые другие параметры:
Биты байта атрибутов |
Назначение |
D2-D0 |
Цвет символа |
D3 |
Интенсивность символа и выбор таблицы знакогенератора |
D6-D4 |
Цвет фона символа |
D7 |
Мигание символа или интенсивность фона символа |
Биты D0-D2 байта атрибутов определяют цвет символа, а биты D4-D6 цвет фона, на котором отображается символ. Таким образом, можно независимо задавать до 23= 8 различных цветов для текста и фона.
Бит D3 играет различную роль в зависимости от числа активных таблиц знакогенератора. Если активной является одна таблица, бит D3 используется для управления интенсивностью цвета символа, что позволяет увеличить количество воспроизводимых цветов от 8 до 16.
Если одновременно определены две таблицы знакогенератора, то бит D3 также задает таблицу знакогенератора, которая будет использована при отображении данного символа.
Бит D7 выполняет две различные функции в зависимости от состояния регистра режима контроллера атрибутов. Данный бит управляет либо интенсивностью цвета фона, увеличивая количество одновременно отображаемых цветов до 16, либо разрешением гашения символа, в результате чего символ на экране монитора будет мигать. По умолчанию D7 бит управляет разрешением гашения символа (миганием).
В следующей таблице представлено соответствие цвета символа и цвета фона значению поля цвета символа байта атрибутов:
Код цвета в байте атрибутов |
Стандартный цвет |
Цвет с повышенной интенсивностью |
000 |
Черный |
Серый |
001 |
Синий |
Светло-синий |
010 |
Зеленый |
Светло-зеленый |
011 |
Морской волны |
Голубой |
100 |
Красный |
Светло-красный |
101 |
Фиолетовый |
Малиновый |
110 |
Коричневый |
Желтый |
111 |
Белый |
Ярко-белый |
Атрибуты символов (монохромный режим)
Назначение полей байта атрибутов в монохромном режиме сходно с их назначениями в цветном режиме (см. выше). Биты D0-D2 управляют типом символа, который может быть обычным, мигающим или подчеркнутым, биты D4-D6 могут выбрать обратный (инвертированный) символ.
Бит D3 играет различную роль в зависимости от того, сколько таблиц знакогенератора одновременно являются активными. Если активной является одна таблица, то бит D3 используется для управления интенсивностью символа.
Если одновременно определены две таблицы знакогенератора, тогда бит D3 также задает таблицу знакогенератора, которая будет использована при отображении данного символа.
Бит D7 выполняет две различные функции в зависимости от состояния регистра режима контроллера атрибутов. Он управляет либо интенсивностью фона, либо миганием символа. По умолчанию бит D7 управляет миганием символа.
Перечислим все возможные значения атрибутов символов в текстовом монохромном режиме:
Атрибут |
Внешний вид символа |
00000000b (00h) |
Черный символ на черном фоне |
00000001b (01h) |
Подчеркнутый символ |
00000111b (07h) |
Обычный символ (светлый символ на черном фоне) |
00001001b (09h) |
Подчеркнутый символ с повышенной интенсивностью |
00001111b (0Fh) |
Символ с повышенной интенсивностью |
01110000b (70h) |
Обратное отображение символа (черный символ на светлом фоне) |
10000001b (81h) |
Подчеркнутый мигающий символ |
10000111b (87h) |
Мигающий символ |
10001001b (89h) |
Подчеркнутый мигающий символ с повышенной интенсивностью |
11110000b (0F0h) |
Мигающее обратное отображение символа |
В случае использования других значений атрибутов результат зависит от конкретной модели видеоадаптера.
Теперь приведем программу TEXTATTR (листинг 3.1), иллюстрирующую непосредственный доступ к видеопамяти в текстовых режимах работы адаптера. При запуске программы TEXTATTR вы должны указать ей два числовых параметра.
Первый параметр определяет режим работы видеоадаптера. Вы можете задать любой текстовый режим. Второй параметр управляет атрибутами символов, отображаемых на экране монитора. Если второй параметр равен 0, то бит D7 байта атрибутов управляет интенсивностью фона символов, а если он равен 1, то бит D7 байта атрибутов управляет миганием символов.
Листинг 3.1. Файл TEXTATTR.C
#include <stdio.h> #include <conio.h> #include <dos.h> // Файл для определения макрокоманды FP_MAKE #include "sysp.h" // Файл для определения структуры VIDEOBUF #include "sysgraph.h" // Описание функций void SetVideoMode( unsigned char vmode ); void SetBlinkIntensity( unsigned char mode ); int GetColumn(void); int GetVideoBuf(int); void Hello(void); int main( int, char ** ); //====================================================== // Главная функция программы //====================================================== int main( int argc, char * argv[] ) { union REGS inregs, outregs; VIDEOBUF _far *vbuf, _far *ptr_vbuf; unsigned char background, foreground; unsigned char char_attr; int vmode, bl_in_mode; char szText[4]; // Проверка командной строки программы if( argc != 3 ) { Hello(); return -1; } // Разбор строки параметров sscanf(argv[1],"%d",&vmode); sscanf(argv[2],"%d",&bl_in_mode); // Если указан графический режим, завершаем программу if(vmode > 3 && vmode != 7) return(-2); // Если неправильно указан параметр <интенсивность>, // завершаем программу if((bl_in_mode != 0)&&(bl_in_mode != 1)) return(-3); // Устанавливаем новый режим работы видеоадаптера, // указанный параметром <режим> SetVideoMode((unsigned char) vmode ); // Выбираем как будут интерпритироваться атрибуты // символов. Если параметр <интенсивность> равен 0 // атрибуты управляют интенсивностью цвета символов, // если параметр равен 1 атрибуты управляют миганием //символов SetBlinkIntensity((unsigned char) bl_in_mode ); // Определяем адрес начала активной страницы // видеопамяти ptr_vbuf = vbuf= (VIDEOBUF _far *) FP_MAKE(GetVideoBuf((unsigned char) vmode ),0); // Отображаем на экране массив символов, имеющих // различные атрибуты for( background=0; background<16; background++) { for( foreground=0; foreground<16; foreground++) { char_attr = (unsigned char)((background<<4) | foreground); sprintf( szText, "%02X", char_attr ); // Отображаем на экране символ. Записываем // в видеопамять код символа и его атрибут ptr_vbuf->chr = szText[0]; ptr_vbuf->attr = char_attr; ptr_vbuf++; ptr_vbuf->chr = szText[1]; ptr_vbuf->attr = char_attr; ptr_vbuf++; } ptr_vbuf = vbuf = vbuf + GetColumn(); } // Ожидаем нажатие на любую клавишу клавиатуры getch(); // Устанавливаем текстотвый режим номер 3 SetVideoMode(3); return 0; } //====================================================== // Функция возвращает сегментный адрес активной страницы // видеопамяти (учитывается значение регистров смещения // адреса видеопамяти) //====================================================== int GetVideoBuf(int vmode) { unsigned vbase; unsigned adr_CRT; unsigned high; unsigned low; unsigned offs; // В зависимости от режима видеоадаптера базовый адрес // видеопамяти может быть 0xb000 или 0xb800 vbase = (vmode == 7) ? 0xb000 : 0xb800; // Определяем адрес порта контроллера ЭЛТ adr_CRT = *(unsigned _far *)(FP_MAKE(0x40,0x63)); // Считываем содержимое регистров начального адреса outp(adr_CRT,0xc); high = inp(adr_CRT+1); outp(adr_CRT,0xd); low = inp(adr_CRT+1); offs = ((high << 8) + low) >> 4; // Добавляем к базовому адресу видеопамяти смещение, // взятое из регистров начального адреса vbase += offs; return(vbase); } //====================================================== // Функция возвращает количество символов в строке //====================================================== int GetColumn(void) { // Считываем содержимое переменной BIOS, расположенной по // адресу 0000:044Ah. В ней записано количество символов // в строке для текущего режима return(*(int _far *)(FP_MAKE(0x40,0x4a))); } //====================================================== // Функция устанавливает режим работы видеоадаптера, заданный // параметром vmode //====================================================== void SetVideoMode( unsigned char vmode ) { union REGS inregs, outregs; // Устанавливаем режим vmode inregs.h.ah = 0x0; inregs.h.al = vmode; int86( 0x10, &inregs, &outregs ); } //====================================================== // Функция управляет назначением атрибутов символов. // mode = 0 атрибут управляет интенсивностью цвета символов // mode = 1 атрибут управляет миганием символов //====================================================== void SetBlinkIntensity( unsigned char mode ) { union REGS inregs, outregs; inregs.h.ah = 0x10; inregs.h.al = 0x3; inregs.h.bl = mode; int86( 0x10, &inregs, &outregs ); } //====================================================== // Функция выводит на экран краткую справку о программе //====================================================== void Hello(void) { printf( "\nCopyright (C)Frolov G.V.,1995. E-mail:" "frolov@glas.apc.org\n" "\nФормат вызова: TEXTATTR <режим> <интенсивность>" "\n <режим>: любые текстовые режимы" "\n <интенсивность>: 0 - интенсивность цвета, " "1 - мигание символа" ); }
Исходный текст включаемого файла SYSP.H, который используется в примере TEXTATTR.C, а также в других примерах книги, представлен в листинге 3.2. Файл SYSP.H содержит определение макрокоманды FP_MAKE, служащей для получения дальнего указателя из сегмента и смещения.
Листинг 3.2. Файл SYSP.H
// Макрокоманда FP_MAKE составляет дальний указатель // из сегмента и смещения #define FP_MAKE(seg,off) ((void far *) \ ((((unsigned long) (unsigned)(seg)) << 16L) | \ ((unsigned long) (unsigned) (off))))
Включаемый файл SYSGRAPH.H содержит определения нескольких типов структур, используемых в примерах нашей книги. Исходный текст файла SYSGRAPH.H представлен в листинге 3.3.
Листинг 3.2. Файл SYSGRAPH.H
#pragma pack(1) // Структура для определения символа и его атрибута typedef struct _VIDEOBUF_ { unsigned char chr; unsigned char attr; } VIDEOBUF; // Структура для доступа к переменным видеофункций BIOS typedef struct _BIOS_VAR_ { unsigned char bEquipFlags; unsigned char bReserv1[0x38]; unsigned char bVideoMode; unsigned wColumns; unsigned wPageLength; unsigned wVidStart; unsigned w8CursorPos[8]; unsigned wCursorShape; unsigned char bActivePage; unsigned wAddrCRT; unsigned char bRegMode; unsigned char bRegPalette; unsigned char bReserv2[0x1D]; unsigned char bRows; unsigned wCharHigh; unsigned char bInfo; unsigned char bInfoTwo; unsigned char bReserv3[0x1F]; void far dwSavePtr; } BIOS_VAR; // Структура для заполнения таблицы цветов (таблицы ЦАП) typedef struct _RGB_ { unsigned char red; unsigned char green; unsigned char blue; } RGB; #pragma pack()