Программирование видеоадаптеров.© Александр Фролов, Григорий ФроловТом 21, М.: Диалог-МИФИ, 1993. Дополнительная таблица окруженияПоследний элемент таблицы окружения содержит указатель на дополнительную таблицу окружения. Эта таблица содержит несколько дальних указателей на структуры данных, используемые BIOS видеоадаптеров VGA и SVGA. Дополнительная таблица окружения (также как таблица окружения), используемая сразу после загрузки компьютера, располагается в ПЗУ BIOS. Чтобы изменить какие-либо элементы этой таблицы, вы должны сначала перенести ее в оперативную память (см. раздел "Таблица окружения"). Ниже описаны элементы дополнительной таблицы окружения:
После загрузки компьютера заполняются только один элемент таблицы окружения - указатель на таблицу кодов комбинаций мониторов. Остальные указатели имеют нулевое значение и не используются. Вторая таблица символов текстового режимаДля видеоадаптера VGA вы можете определить второй набор из 256 символов. Формат второй таблицы символов текстового режима полностью соответствует таблице символов текстового режима. Таблица кодов комбинаций мониторовТаблица кодов комбинаций мониторов содержит список всех комбинаций видеоподсистем, которые поддерживает BIOS (см. прерывание INT 10h, функция 1Ah). Формат таблицы представлен ниже:
Таблица настройки палитрыТаблица настройки палитры содержит значения, загружаемые при выборе режима работы видеоадаптера в регистр положения подчеркивания символа (регистра ULR), регистры палитры, и регистры таблицы цветов.
Программа BIOSVAR, исходный текст которой представлен в листинге 6.1, считывает из оперативной памяти компьютера значения переменных видеофункций BIOS, а затем отображает их на экране монитора. Формат вызова программы BIOSVAR имеет следующий вид: BIOSVAR <номер режима> Единственный параметр программы BIOSVAR должен задавать режим, в который переводится видеоадаптер перед чтением переменных видеофункций BIOS. Листинг 6.1. Файл BIOSVAR.С #include <stdio.h> #include <dos.h> #include <mem.h> #include "sysgraph.h" int main( int, char ** ); //=========================================================== // Главная функция программы //=========================================================== int main( int argc, char * argv[] ) { BIOS_VAR _far *bios_var_ptr; BIOS_VAR bios_var_table; union REGS inregs, outregs; int vmode; // Проверка командной строки программы if( argc != 2 ) { printf( "\nФормат вызова: BIOSVAR <режим>" "\n <режим>: режим видеоадаптера \n" ); return -1; } sscanf(argv[1],"%d",&vmode); // Устанавливаем режим работы видеоадаптера, // заданный параметром vmode inregs.h.ah = 0x0; inregs.h.al = vmode; int86( 0x10, &inregs, &outregs ); // Получаем указатель на область переменных видеофункций BIOS bios_var_ptr = (BIOS_VAR _far *) FP_MAKE(0x0000, 0x0410); // Копируем переменные видеофункций BIOS в структуру // bios_var_table _fmemcpy(&bios_var_table, (void far*) bios_var_ptr, sizeof(BIOS_VAR) ); // Устанавливаем текстовые режим видеоадаптера номер 3 inregs.h.ah = 0x0; inregs.h.al = 3; int86( 0x10, &inregs, &outregs ); // Отображаем содержимое переменных BIOS printf( "Флаги конфигурации: %Xh\n" "Текущий режим работы видеоадаптера: %Xh\n" "Количество символов в строке: %d\n" "Размер страницы видеопамяти: %d\n" "Начальный адрес: %Xh\n" "Координаты курсора нулевой страницы: %Xh\n" "Форма курсора: %Xh\n" "Активная страница: %Xh\n" "Адрес индексного регистра контроллера ЭЛТ: %Xh\n" "Регистр режима CGA: %Xh\n" "Цветовая палитра CGA: %Xh\n" "Количество текстовых строк: %d\n" "Высота символов: %d\n" "Информация о EGA 1: %Xh\n" "Информация о EGA 2: %Xh\n" "Адрес таблицы окружения: %Fp\n", (unsigned char) bios_var_table.bEquipFlags, (unsigned char) bios_var_table.bVideoMode, (unsigned) bios_var_table.wColumns, (unsigned) bios_var_table.wPageLength, (unsigned) bios_var_table.wVidStart, (unsigned) bios_var_table.w8CursorPos[0], (unsigned) bios_var_table.wCursorShape, (unsigned char) bios_var_table.bActivePage, (unsigned) bios_var_table.wAddrCRT, (unsigned char) bios_var_table.bRegMode, (unsigned char) bios_var_table.bRegPalette, (unsigned char) bios_var_table.bRows + 1, (unsigned) bios_var_table.wCharHigh, (unsigned char) bios_var_table.bInfo, (unsigned char) bios_var_table.bInfoTwo, (void far*) bios_var_table.dwSavePtr ); printf("\nCopyright (C)Frolov G.V., 1992-1995. " "E-mail: frolov@glas.apc.org\n"); return 0; } |