Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование видеоадаптеров EGA, VGA и SVGA.doc
Скачиваний:
138
Добавлен:
01.05.2014
Размер:
4.51 Mб
Скачать

Получить информацию о режиме видеоадаптера

Функция позволяет определить различные характеристики любого режима видеоадаптера, отвечающего стандарту 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, &regs, &regs, &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, &regs, &regs, &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 Определение образа символа