- •Аннотация
- •Введение
- •Как связаться с авторами
- •Благодарности
- •Замечания
- •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
Получить информацию о режиме видеоадаптера
Функция позволяет определить различные характеристики любого режима видеоадаптера, отвечающего стандарту VESA. Программа должна подготовить буфер и передать указатель на него функции. В случае успешного завершения в буфер будут записаны характеристики режима.
На входе: |
AH |
4Fh |
|
AL |
01h |
|
CX |
Номер режима |
|
ES:DI |
Указатель на буфер размером 256 байт (см. ниже) для таблицы описания режима |
На выходе: |
AL |
4Fh |
|
AH |
Результат: 0, в случае успешного завершения, 1 в случае ошибки |
Формат таблицы описания режима представлен ниже:
Смещение |
Размер |
Описание |
00h |
Слово |
Атрибуты режима: D0 режим поддерживается D1 доступна дополнительная информация D2 поддерживаются функции BIOS D3 1 - цветной режим, 0 - монохромный режим D4 1 - графический режим, 0 - текстовый режим |
02h |
Байт |
Атрибуты окна A D0 доступно (поддерживается) D1 окно доступно для чтения D2 окно доступно для записи D3-D7 не используется |
03h |
Байт |
Атрибуты окна B (см. атрибуты окна A) |
04h |
Слово |
Шаг позиционирования окна в Кбайтах |
06h |
Слово |
Размер окна в Кбайтах |
08h |
Слово |
Начало сегмента окна A |
0Ah |
Слово |
Начало сегмента окна B |
0Ch |
Двойное слово |
Указатель на функцию перемещения (позиционирования) окна |
10h |
Слово |
Количество байт на линию сканирования. Не является обязательным для режимов VESA |
Следующие поля таблицы поддерживаются только VBE версии 1.2 | ||
12h |
Слово |
Разрешение по горизонтали в пикселах |
14h |
Слово |
Разрешение по вертикали в пикселах |
16h |
Байт |
Ширина символа в пикселах |
17h |
Байт |
Высота символа в пикселах |
18h |
Байт |
Количество слоев видеопамяти |
19h |
Байт |
Количество бит на пиксел |
1Ah |
Байт |
Количество банков памяти |
1Bh |
Байт |
Тип модели памяти |
1Ch |
Байт |
Размер банка памяти в Кбайтах |
1Dh |
Байт |
Количество страниц видеопамяти, доступных в данном режиме минус один |
1E |
Байт |
Зарезервировано |
1Fh |
Байт |
Количество бит, представляющих красную компоненту цвета пикселов |
20h |
Байт |
Положение младшего бита поля, представляющего красную компоненту цвета пикселов |
21h |
Байт |
Количество бит, представляющих зеленую компоненту цвета пикселов |
22h |
Байт |
Положение младшего бита поля, представляющего зеленую компоненту цвета пикселов |
23h |
Байт |
Количество бит, представляющих синюю компоненту цвета пикселов |
24h |
Байт |
Положение младшего бита поля, представляющего синюю компоненту цвета пикселов |
25h |
Байт |
Количество бит, представляющих запасное поле цвета пикселов |
26h |
Байт |
Положение младшего бита запасного поля, предоставляющего цвет пикселов |
27h |
Байт |
D0 равен единице, если в данном режиме видеоадаптера вы можете программировать регистры ЦАП; D1 равен единице, если в данном режиме видеоадаптера каждое значение пиксела представлено 4 полями (красное, зеленое, синее, дополнительное) и дополнительное поле можно использовать. Если бит равен нулю, тогда дополнительное поле зарезервировано и не используется; D2-D7 зарезервировано |
Следующие поля таблицы поддерживаются только VBE версии 2.0 | ||
28h |
Двойное слово |
Поле содержит физический 32-разрядный адрес начала видеобуфера для использования его в защищенном режиме |
2Сh |
Двойное слово |
Смещение от начала видеобуфера области памяти неиспользуемой для отображения изображения на экране монитора |
30h |
Слово |
Размер области памяти, неиспользуемой для отображения изображения |
32h |
206 байт |
Зарезервировано |
Теперь мы приведем программу VESATEST, которая позволяет собрать различную информацию о видеоадаптере и реализации VBE расширения BIOS. Объем информации, выдаваемой программой достаточно велик. Поэтому для упрощения программы вся выходная информация записывается в файл, который вы можете просмотреть с помощью любого текстового редактора. Программа VESATEST имеет следующий формат:
VESATEST <имя файла>
Параметр <имя файла> должен содержать имя файла, в который будут записаны результаты работы программы. Исходный текст программы представлен в листинге 7.1.
Листинг 7.1. Файл VESATEST.CPP
#include <stdio.h> #include <conio.h> #include <string.h> #include <dos.h> #include "vesa.h" // Описание функций int main( int argc, char * argv[] ); int GetBaseVESAInfo(FILE*); int AnalyseResult(union REGS); // Главная функция int main( int argc, char * argv[] ) { FILE *fileVesaReport; int iResult; // Проверка командной строки программы if( argc != 2 ) { printf("\nФормат вызова: VESATEST <имя файла>" "\n <имя файла>: имя файла, в который будет" " записана информация"); return -1; } // Открываем файл fileVesaReport = fopen(argv[1], "w+"); // Записываем в файл fileVesaReport информацию о VBE и // видеоадаптере iResult = GetBaseVESAInfo(fileVesaReport); // Закрываем файл fclose(fileVesaReport); return ((iResult==0) ? 0 : -1); } //=========================================================== // Функция GetBaseVESAInfo //=========================================================== int GetBaseVESAInfo(FILE *file) { union REGS regs; struct SREGS segregs; int iResult, i; // Структуры для получения информации о VBE VESAINFO vesaInfo; VESAMODEINFO modeInfo; // Подготавливаем буфер для VBE версии 2.0 strcpy( vesaInfo.cSignature, "VBE2" ); // Получаем данные о реализации VBE и видеоадаптере regs.h.ah = 0x4f; regs.h.al = 0x00; segregs.es = FP_SEG((void far *)&vesaInfo); regs.x.di = FP_OFF((void far *)&vesaInfo); int86x(0x10, ®s, ®s, &segregs); // Проверяем результат вызова функции VBE iResult = AnalyseResult(regs); if(iResult != 0) return -1; // Записываем в файл информацию из структуры vesaInfo fprintf(file,"Сигнатура: '%4.4s'\n",vesaInfo.cSignature ); fprintf(file, "Информация фирмы производителя: '%s'\n", vesaInfo.fpInfoOEM ); fprintf(file, "Версия VBE: %Xh \n", vesaInfo.usVersion); fprintf(file, "Возможности видеоадаптера: '%x%x%x%x' \n", vesaInfo.ucCapabilities[0],vesaInfo.ucCapabilities[1], vesaInfo.ucCapabilities[2],vesaInfo.ucCapabilities[3]); fprintf(file, "Поддерживаются следующие режимы VESA: \n"); for( i=0; i<50; i++ ) { if(vesaInfo.fpModeTable[i] == 0xFFFF) break; fprintf(file, " %Xh \n", vesaInfo.fpModeTable[i] ); } // Объем видеопамяти определяется VBE версии не младше 1.2 if( vesaInfo.usVersion >= 0x102 ) fprintf(file, "Объем видеопамяти %d Кбайт\n", vesaInfo.usTotalMemory * 64); // Следующая информация доступна только для // VBE версии 2.0 и старше if( vesaInfo.usVersion >= 0x200 ) { fprintf(file,"Дополнительный номер версии: %04Xh\n", vesaInfo.usRevVersion); fprintf(file, "Дополнительный номер версии" "видеоадаптера: '%s'\n", vesaInfo.fpOEMRevVersion); fprintf(file, "Имя фирмы разработчика: '%s'\n", vesaInfo.fpOEMName); fprintf(file, "Название видеоадаптера: '%s'\n", vesaInfo.fpOEMProductName); } // Теперь получаем информацию для каждого доступного // режима VESA for( i=0; i<50; i++ ) { // Получаем очередной номер режима VESA if(vesaInfo.fpModeTable[i] == 0xFFFF) break; fprintf(file, "\n\nРежим %Xh \n", vesaInfo.fpModeTable[i] ); // Получаем информацию о режиме vesaInfo.fpModeTable[i] regs.h.ah = 0x4f; regs.h.al = 0x01; regs.x.cx = vesaInfo.fpModeTable[i]; segregs.es = FP_SEG((void far *)&modeInfo); regs.x.di = FP_OFF((void far *)&modeInfo); int86x(0x10, ®s, ®s, &segregs); // Проверяем результат вызова функции VBE iResult = AnalyseResult(regs); if(iResult != 0) return -1; // Записываем в файл информацию из структуры modeInfo fprintf(file, "Атрибуты режима: %04Xh \n", modeInfo.usModeAttr); fprintf(file, "Атрибуты окна: A %02Xh \n", modeInfo.ucWinAAttr); fprintf(file, "Атрибуты окна: B %02Xh \n", modeInfo.ucWinBAttr); fprintf(file, "Шаг позиционирования окна: %d Кбайт \n", modeInfo.usWinGranularity); fprintf(file, "Размер окна, Кбайт: %d \n", modeInfo.usWinSize ); fprintf(file, "Начало сегмента окна A: %04Xh \n", modeInfo.usBegSegA ); fprintf(file, "Начало сегмента окна B: %04Xh \n", modeInfo.usBegSegB ); fprintf(file, "Функция перемещения окна: %p \n", modeInfo.fpWinFunc ); fprintf(file, "Байт на линию сканирования: %d \n", modeInfo.usBytesPerScanLine ); // Объем видеопамяти определяется VBE версии не младше 1.2 if(vesaInfo.usVersion >= 0x102) { fprintf(file, "Разрешение по горизонтали: %d \n", modeInfo.usSizeX); fprintf(file, "Разрешение по вертикали: %d \n", modeInfo.usSizeY); fprintf(file, "Ширина символа: %02Xh \n", modeInfo.ucCharSizeX); fprintf(file, "Высота символа: %02Xh \n", modeInfo.ucCharSizeY); fprintf(file, "Количество слоев видеопамяти: %02Xh \n", modeInfo.ucNumPlanes); fprintf(file, "Количество бит на пиксел: %02Xh \n", modeInfo.ucNumPixelBits); fprintf(file, "Количество банков памяти: %02Xh \n", modeInfo.ucBanksNum); fprintf(file, "Тип модели памяти: %02Xh \n", modeInfo.ucTypeMemModel); fprintf(file, "Размер банка памяти: %02Xh \n", modeInfo.ucBankSize); fprintf(file, "Количество доступных страниц видеопамяти: %02Xh \n", modeInfo.ucPageNum); fprintf(file, "Размер поля красного компоненты" " цвета: %02Xh \n", modeInfo.ucRedSize); fprintf(file, "Положение красного поля: %02Xh \n", modeInfo.ucRedField); fprintf(file, "Размер поля зеленой компоненты" "цвета пикселов: %02Xh \n",modeInfo.ucGreenSize); fprintf(file, "Положение зеленого поля: %02Xh \n", modeInfo.ucGreenField); fprintf(file, "Размер поля синей компоненты цвета" " пикселов: %02Xh \n", modeInfo.ucBlueSize); fprintf(file, "Положение синего поля: %02Xh \n", modeInfo.ucBlueField); fprintf(file, "Размер резервной области: %02Xh \n", modeInfo.ucResSize); fprintf(file, "Положение резервного поля: %02Xh \n", modeInfo.ucResField); fprintf(file, "Режим ЦАП: %02X\n", modeInfo.ucDACInfo); } } return iResult; } //=========================================================== // Функция AnalyseResult //=========================================================== int AnalyseResult(union REGS regs) { int iResult; if((regs.h.al == 0x4f) && (regs.h.ah == 0)) iResult = 0; else if(regs.h.al != 0x4f) iResult = -1; else iResult = 1; return iResult; }
Во включаемом файле VESA.H определены структуры VESAINFO и VESAMODEINFO, которые используются при определении возможностей VBE и видеоадаптера. Исходный текст файла VESA.H представлен в листинге 7.2.
Листинг 7.2. Файл VESA.H
// Информация о VBE и видеоадаптере typedef struct { // Поддерживается всеми версиями VBE char cSignature[4]; unsigned short usVersion; char far *fpInfoOEM; unsigned char ucCapabilities[4]; unsigned short far *fpModeTable; // Поддерживается VBE версии 1.2 unsigned short usTotalMemory; // Поддерживается VBE версии 2.0 unsigned short usRevVersion; char far *fpOEMName; char far *fpOEMProductName; char far *fpOEMRevVersion; char cReserv[222]; char cOEMData[256]; } VESAINFO; // Характеристика режима видеоадаптера typedef struct { unsigned short usModeAttr; unsigned char ucWinAAttr; unsigned char ucWinBAttr; unsigned short usWinGranularity; unsigned short usWinSize; unsigned short usBegSegA; unsigned short usBegSegB; void far *fpWinFunc; unsigned short usBytesPerScanLine; // Поддерживается VBE версии 1.2 unsigned short usSizeX; unsigned short usSizeY; unsigned char ucCharSizeX; unsigned char ucCharSizeY; unsigned char ucNumPlanes; unsigned char ucNumPixelBits; unsigned char ucBanksNum; unsigned char ucTypeMemModel; unsigned char ucBankSize; unsigned char ucPageNum; unsigned char ucReserv1; unsigned char ucRedSize; unsigned char ucRedField; unsigned char ucGreenSize; unsigned char ucGreenField; unsigned char ucBlueSize; unsigned char ucBlueField; unsigned char ucResSize; unsigned char ucResField; unsigned char ucDACInfo; // Поддерживается VBE версии 2.0 unsigned char far *VideoBuff; unsigned char far *ScrOffset; unsigned short usScrSize; unsigned char ucReserv2[206]; } VESAMODEINFO;
На рисунке 7.5 мы проиллюстрировали назначение полей структуры VESAMODEINFO, отвечающих за формат видеопамяти.
Рисунок 7.5 Определение образа символа