режима работы. В программе 9-1 функция get_ega_info(&info) ис-
пользуется для проверки монитора и нахождения безопасного в ис-
пользовании режима работы с высокой разрешающей способностью.
Программа, представленная в листинге 9-2, демонстрирует использо-
вание функции set_crt_mode() для установки графического режима и
использование dot(), которая применяет функцию BIOS Write Dot.
Эта программа начертит серию параллельных диагональных линий.
Листинг 9-2. Программа DIAGONAL.C
---------------------------------------------------------------
/* diagonal.c */
/* Демонстрирует графический режим с высоким разрешением */
#include
#include
#include
void set_crt_mode( char ) ; /* добавить это в "ega.h" */
void dot( int, int, int, int ) ;
main()
{
registr i,j ;
struct Ega_info info ;
if(get_ega_info(&info))
set_crt_mode(info.high_res_graphics);
else
return(1) ;
for(j = 0; j <= 500; j += 5)
for(i = 0; i <= 100; ++i)
dot(i,i+j,13,0) ;
getch() ; /* ожидать символ, который надо изобразить */
set_crt_mode(info.text_mode) ;
return(0) ;
}
/*==========================================================*/
void dot(row,col,color,page)
int row, col, color, page;
{
union REGS regs ;
regs.x.dx = row ;
regs.x.cx = col ;
regs.h.al = (char)color ;
regs.h.ah = (char)0xC ; /* Вызов Write Dot */
regs.h.bh = (char)page ;
int86(0x10, ®s, ®s) ;
}
- 9-11 -
/*==========================================================*/
void set_crt_mode(mode)
char mode ;
{
union REGS regs ;
regs.h.al = mode ; /* al = установить режим */
regs.h.ah = (char)0 ; /* Функция "установить режим" */
int86(0x10, ®s, ®s); /*Выполнить прерывание BIOS 10h*/
}
/*==========================================================*/
---------------------------------------------------------------
Как только Вы увидите, как медленно работает функция BIOS
Write Dot, то, вероятно, спросите, можно ли ускорить ее работу.
Реализация этого требует обхода EGA BIOS и помещения элементов
изображения непосредственно в память EGA. Тем не менее, сначала
Вы должны понять, каким образом организована память EGA, и то,
как можно ею управлять.
Организация памяти
Для графики EGA использует два различных способа организации
памяти дисплея. В режимах с 4 по 6 EGA использует такую же орга-
низацию памяти, что и CGA. В этих режимах сегмент памяти дисплея
начинается в 0хВ800 и использует 80 битов на каждую строку скани-
рования (линию развертки). Так как линий развертки 200, использу-
ется 16,000 байтов. В режиме средней разрешающей способности
320х200, каждый байт представляет 4 элемента изображения с одним
из четырех цветов, или два бита на элемент изображения. В режиме
6 каждый байт представляет 8 элементов изображения с двумя цвета-
ми, или один бит на элемент изображения. Если бит имеет значение
0, то соответствующий элемент изображения выключен. Кроме того,
четные линии развертки расположены в первых 8К дисплейной памяти,
а нечетные занимают вторые 8К памяти. Разделенная память линий
развертки требует тестирования каждого смещения элемента изобра-
жения для определения того, четное оно или нечетное.
Дисплейная память режимов с 13 по 16 (по режим 18 VGA) начи-
нается с сегмента 0хA000 и использует до 64К адресного пространс-
тва центрального процессора 80х86. Каждый байт представляет 8
элементов изображения, причем самый значимый бит расположен пер-
вым слева. Линии развертки не разделены в памяти, как в режимах
CGA, поэтому смещение байта элемента изображения проще в вычисле-
нии. В режиме 16 EGA имеет максимальную разрешающую способность
640 х 350, или 224,000 элементов изображения. Так как имеется до
16 цветов, каждый элемент изображения должен использовать 4 бита
для определения цвета. Все вместе это составляет использование
общей памяти, равной (640 х 350 элементов изображения / 8 элемен-
тов изображения на байт х 4 бита на элемент изображения) 109К.
Центральный процессор 80х86, применяемый в персональном
компьютере РС, может адресовываться только к сегменту объемом
64К. EGA приспосабливается к 64К сегментному пределу путем деле-
ния 128К из ее 256К памяти на четыре битовые матрицы объемом 32К.
Каждая битовая матрица (или битовый массив) соответствуют одному
- 9-12 -
биту цвета элемента изображения. Представьте, что эти битовые
матрицы сложены друг на друга по одному адресу центрального про-
цессора. Каждый адрес дисплейной памяти реально представляет
4 байта памяти EGA.
В режимах VGA 17 и 18 организация памяти EGA просто расширя-
ется на следующие 130 линий развертки. VGA имеет режим разрешения
320 х 200 с 256 цветами. Позже этот режим будет рассмотрен от-
дельно.
Регистры-защелки
Чтение или запись 4 различных байтов (одного для каждой бито-
вой матрицы) по одному адресу центрального процессора является
проблемой. Для ее преодоления EGA имеет четыре регистра-защелки.
Регистры-защелки EGA временно сохраняют 1 байт из каждого из че-
тырех битовых матриц. Логическая схема EGA заполняет каждый из
четырех регистров-защелок байтом каждой битовой матрицы по адре-
су, который центральный процессор считал последним. Когда цент-
ральный процессор посылает байт по последнему считанному адресу,
содержание каждого из четырех регистров может остаться неизмен-
ным, модифицироваться или быть полностью заменено данными цент-
рального процессора. Содержание регистра-защелки затем пишется
обратно в каждую из битовых матриц EGA.
После обратной записи содержания регистров-защелок в битовые
матрицы EGA, регистры снова "складируются", сохранив один бит
каждого из четырех байтов, формируя 4-битовый цвет для восьми
элементов изображения. Взаимоотношения между регистрами-защелка-
ми и битовыми матрицами проиллюстрированы на рисунке 9-1, который
демонстрирует состояние памяти EGA и содержание четырех регистров
-защелок после считывания центральным процессором байта по адресу
А000:0000. Восемь элементов изображения в байте содержат цвета с
0 по 7.
Важно понять, что байт, возвращенный центральным процессором
после чтения A000:0000, не используется. Этот байт только читает-
ся для установления того, с какими элементами изображения рабо-
тать (в данном случае, элементы изображения с 0 по 7 в строке 0)
и для "подготовки" регистров-защелок, позволяющих данным цент-
рального процессора манипулировать отдельными байтами битовых
матриц. Это позволяет центральному процессору персонального
компьютера модифицировать, заменять или очищать восемь элементов
изображения, содержащихся в четырех байтах. Для работы с элемен-
тами изображения в другой строке или столбце, происходит смещение
с A000 и центральный процессор считывает новый байт, содержащий
элементы изображения.
Установка нескольких управляющих регистров EGA влияет на то,
что центральный процессор модифицирует, заменяет или оставляет
неизменными регистры-защелки. Доступ к этим регистрам осуществля-
ется посредством одного из пяти индексированных чипов сверхболь-
ших интегральных схем (СБИС) на плате EGA. Установка чипов СБИС
происходит направлением номера индекса, соответствующего необхо-
димой функции, одному из внутренних регистров EGA, и следующей за
номером информацией для этой функции. Существенно то, что индекс
соответствует одному из многих внутренних регистров EGA, но этот
регистр связан с единственным портом вывода персонального компь-
ютера. Данные для этих регистров направляются при помощи команды
- 9-13 -
ЪДВДВДВДВДВДВДВДВДДДДДДДДДД¬
¦0¦0¦0¦0¦0¦0¦0¦0¦ Битовая ¦ ¦
ГДБДБДБДБДБДБДБДЩ матрица 3¦ ¦ Регистры - защелки
ЪД†ДВДВДВДВДВДВДВДДДДДДДДДД¬ ¦ ¦ ЪДВДВДВДВДВДВДВД¬
¦0¦0¦0¦0¦1¦1¦1¦1¦ Битовая ¦ ¦ ¦0¦0¦0¦0¦0¦0¦0¦0¦ 3
ГДБДБДБДБДБДБДБДЩ матрица 2¦ ¦ Ц АДБДБДБДБДБДБДБДЩ
ЪД†ДВДВДВДВДВДВДВДДДДДДДДДД¬ ¦ ¦ ЪДВДВДВДВДВДВДВД¬
¦0¦0¦1¦1¦0¦0¦1¦1¦ Битовая ¦ ¦ ¦ В ¦0¦0¦0¦0¦1¦1¦1¦1¦ 2
ГДБДБДБДБДБДБДБДЩ матрица 1¦ ¦ ¦ АДБДБДБДБДБДБДБДЩ
ЪД†ДВДВДВДВДВДВДВДДДДДДДДДД¬ ¦ ¦ ¦ Е ЪДВДВДВДВДВДВДВД¬
A000:0000¦0¦1¦0¦1¦0¦1¦0¦1¦ Битовая ¦ ¦ ГДЩ ¦0¦0¦1¦1¦0¦0¦1¦1¦ 1
ГДБДБДБДБДБДБДБДЩ матрица 0¦ ¦ ¦ Т АДБДБДБДБДБДБДБДЩ
¦ ¦ ГДЩ ЪДВДВДВДВДВДВДВД¬
¦ ¦ ¦ ¦ ¦0¦1¦0¦1¦0¦1¦0¦1¦ 0
¦ ГДЩ ¦ АДБДБДБДБДБДБДБДЩ
¦ ¦ ¦ Позиции пикселей
АДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Рис.9-1. Битовые матрицы и регистры-защелки EGA
OUT процессора 80х86 или библиотечной функции языка Си outp().
Например, EGA имеет регистр битовой маски, который защищает
от изменения отдельные биты регистров-защелок. Установка в этом
регистре бита в 0 маскирует соответствующий бит в регистре-защел-
ке, а установка в 1 разрешает изменять бит записью данных цент-
ральным процессором. Кроме того, регистр битовой маски позволяет
изменять отдельные элементы изображения без изменения смежных
элементов изображения, адресуемых битом.
Регистр битовой маски имеет номер функции 8 в графическом чи-
пе 1 и 2 EGA. Он программируется направлением индекса 8 в порт
0х3CЕ и данных маски бита в порт 0хCF. Следующие операторы языка
Си установят регистр маски бита для защиты всех битов, кроме би-
та 2:
outp(0x3CE, 8) ; /* индекс маски бита */
outp(0x3CF, 0x2) ; /* все биты, кроме 2, в 0 */
Но эти операторы не дают ключ к разгадке, кроме комментирования
того, что они делают. Чуть дальше мы рассмотрим макрокоманду Си,
с помощью которой проще установить регистры EGA.
Вторым регистром EGA, влияющим на перезапись содержания ре-
гистра-защелки, является регистр маски матрицы. Если любой из че-
тырех битов этого регистра нулевой, соответствующие битовые мат-