Программирование видеоадаптеров

       

Таблица настройки палитры


Таблица настройки палитры содержит значения, загружаемые при выборе режима работы видеоадаптера в регистр положения подчеркивания символа (регистра ULR), регистры палитры, и регистры таблицы цветов.



Смещение

Размер

Описание

00h

Байт

Управление подчеркиванием символов в текстовых режимах:

1 подчеркивание разрешено во всех текстовых режимах;

0 подчеркивание разрешено во всех монохромных текстовых режимах;

-1 подчеркивание не используется

01h

Байт

Зарезервировано

02h

Слово

Зарезервировано

04h

Слово

Количество регистров контроллера атрибутов, определенных в таблице

06h

Слово

Номер первого регистра контроллера атрибутов

08h

Двойное слово

Адрес таблицы, содержащей значения регистров контроллера атрибутов

0Ch

Слово

Количество регистров таблицы цветов

0Eh

Слово

Номер первого регистра таблицы цветов

10h

Двойное слово

Адрес таблицы, содержащей значения регистров таблицы цветов

14h

Массив байт переменной длины

Список режимов, в которых используется данная таблица. Каждый байт содержит номер режима. Список заканчивается числом 0FFh

Программа 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;

}

Содержание раздела