Назначение полей байта атрибутов в монохромном режиме сходно с их назначениями в цветном режиме (см. выше). Биты 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 байта атрибутов управляет миганием символов.
Исходный текст включаемого файла 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;
// Структура для заполнения таблицы цветов (таблицы ЦАП)