На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 9 / Использование режимов записи EGA Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Использование режимов записи EGA

EGA имеет три режима записи: 0, 1 и 2. Изменение режима записи меняет реакцию аппаратных средств EGA на направление центральным процессором байта в дисплейный буфер. Каждый режим записи оптимизирован для различного использования. Режим записи 0 является режимом записи общего назначения, режим записи 1 оптимизирован для копирования областей памяти EGA и режим записи 2 наилучшим образом используется для закрашивания. Изменение режима записи может существенно ускорить выполнение операции.


Режим записи 0 является режимом, применяемым EGA BIOS. Это наиболее общий режим записи. В режиме 0 цвет элемента изображения может быть установлен с помощью как регистра маски матрицы, так и регистра установки/сброса. Регистр маски матрицы используется EGA BIOS и подпрограммой fastdot(). Функция line() применяет регистр установки/сброса для определения цвета. При использовании регистра маски матрицы отдельные элементы изображения могут быть установлены посылаемым центральным процессором байтом с соответствующими битами, установленными в 1. Тем не менее, смежные элементы изображения в байте должны быть защищены с помощью регистра маски бита. При применении регистра установки/сброса биты посылаемого центральным процессором байта не соответствуют элементам изображения. Байт записывается только для определения смещения изменяемых элементов изображения. Цвет определяется в регистре установки/сброса, а регистр маски бита позволяет управлять отдельными элементами изображения.


Режим записи 2 очень похож на режим записи 0. В режиме 2 байт, посылаемый центральным процессором, скорее устанавливает цвет, чем отдельные элементы изображения. Регистр маски бита позволяет управлять отдельными элементами изображения и, если регистр маски бита не установлен, весь байт элементов изображения заполняется цветом, значение которого посылается центральным процессором. Режим записи определяется в битах 0 и 1 байта, направляемого регистром режима графических чипов 1 и 2. Регистр режима имеет индекс 5. Программа, приведенная в листинге 9-5, демонстрирует режим записи 2. Подпрограмма rect() использует режим 2 для заполнения прямоугольника заданным цветом.


                           Листинг 9-5. Программа RECT.C
         ---------------------------------------------------------------

         /* rect.c */
         /* Эта программа демонстрирует режим записи 2 */
         #include 
         #include 
         #include 
         #include "ega.h"

         void rect(int,int,int,int,char); /* добавить это в ega.h */

         main()
         {
         int i,j;
         struct Ega_info info ;
         if(get_ega_info(&info))
            set_crt_mode(info.high_res_graphics) ;
         else
            return(1) ;
         printf("\nЦвет #:\n");
         for (i=0,j=0;i<16;++i,j+=40)
         {
            printf(" %2i  ",i);
            rect(50,j,349,j+39,(char)i);
         }
         getch();
         set_crt_mode(3) ;
         }
         void rect(row1,col1,row2,col2,color)
         int col1,row1,col2,row2 ;
         char color ;
         { /* Эта функция генерирует заполненный прямоугольник */
           /* Предполагается, что row1 < row2 и col1 < col2 */
         unsigned char far *rgen = (char far *)(0xA0000000L) ;
         int rows = row2 - row1 ;  /* число строк */
         int cols = (col2 >> 3) - (col1 >> 3) - 1; /* всего столбцов */
         char left = (char)(0xFF >> (col1 & 7)) ;  /* левая маска */
         char rght = (char)~(0xFF >> (col2 & 7)) ; /* правая маска */
         char next_row ;
         char byte_per_line = (char)GET_CRT_COLS() ;
         register x,y ;
         char latch ;

         if (cols < 0)   /* Находятся ли col1 и col2 в одном байте? */
             left &= rght, cols = 0, rght = 0 ;
         rgen += bytes_per_line*row1 +(col1 >> 3) ;
         next_row = bytes_per_line - cols - 2 ;

         EGA_GRFX(5,2);               /* установить режим записи 2 */
         for(y = 0 ; y < rows ; y++)  /* выполнить каждую строку */
         {
           EGA_BIT_MASK(left) ; /* установить левую маску бита */
           latch = *(rgen) ;    /* защелкнуть битовые матрицы EGA */
           *(rgen++) = color ;  /* установить цвет, указать для
                                   следующего байта */
           EGA_BIT_MASK(0xFF) ; /* отменить маску центра */
           for(x = 0; x < cols; x++)  /* выполнить каждый столбец */
              {
                 latch = *(rgen) ;
                 *(rgen++) = color ;
              }
           EGA_BIT_MASK(rght) ; /* установить правую маску бита */
           latch = *(rgen) ;    /* защелкнуть битовые матрицы EGA */
           *(rgen++) = color ;  /* установить цвет */
           rgen += next_row ;   /* перейти к следующей строке */
         }
         EGA_BIT_MASK(0xFF) ;   /* отменить маску бита */
         EGA_GRFX(5,0) ;        /* сбросить режим записи */
         }
         ----------------------------------------------------------------

В программе 9-5 режим записи 2 устанавливается макрокомандой EGA_GRFX(5,2). Вы должны быть внимательными и не посылать значения, отличные от 0, 1, или 2 для EGA (0, 1, 2 или 3 для VGA), так как другие биты байта, направляемые регистру режима, имеют значение для EGA. Регистры маски матрицы и маски бита эффективны в режиме записи 2, а регистр установки/сброса бесполезен. Режим записи 0, режим записи BIOS по умолчанию, устанавливается с помощью EGA_GRFX(5,0). Перед использованием других программ или вызовов BIOS режим записи должен быть сброшен в 0.


Режим записи 1 применяется для быстрого копирования одной области памяти EGA в другую. Это очень полезно для прокрутки, мультипликации, а также сохранения и восстановления областей на экране. Режим записи 1 позволяет Вам копировать 4 байта в каждой из четырех битовых матриц за один цикл чтения или записи центрального процессора и во много раз быстрее чтения 4 отдельных байтов из битовых матриц с последующей записью 4 байтов по новому адресу.


Для копирования 8 элементов смещение изображения памяти EGA, содержащее 8 элементов изображения, считывается для подготовки регистров-защелок; затем смещение, содержащее назначение, записывается центральным процессором. Когда центральный процессор записывает байт, а режим записи установлен в 1, EGA сбрасывает байт центрального процессора и копирует содержание регистров-защелок в каждую битовую матрицу. Регистр маски бита не используется с режимом записи 1. Все четыре байта в регистрах-защелках записываются во все четыре битовые матрицы независимо от установки маски бита. Регистр маски матрицы может быть использован для защиты отдельных битовых матриц.


Программа, представленная в листинге 9-6, демонстрирует режим записи 1. Серия линий чертится в верхней части экрана. Затем эта серия копируется с использованием режима записи 1. Наконец, граница образца быстро перечерчивается для демонстрации возможности мультипликации.


                          Листинг 9-6. Программа MODEL.C
         ---------------------------------------------------------------
         /* mode1.c */
         /* Эта программа демонстрирует режим записи 1 EGA */
         #include 
         #include 
         #include 
         #include "ega.h"
         void copy( int,int,int,int,int,int );
         void main()
         {
            registr i,j;
            int k = 0;
            set_crt_mode(16) ; /*только усовершенствованный монитор!*/
            /* Рисует интересующую серию: */
            for(k = 0; k <= 4; ++k)
            for(j = 0+k; j <= 500+k; j += 5)
            for(i = 0+k; i <= 100+k; ++i)
               fastdot(i,i+j,13) ;
            for(k = 0; k <= 3; ++k)
            for(j = 0+k; j <= 500+k; j += 5)
            for(i = 0+k; i <= 100+k; ++i)
               fastdot(i,i+j,3) ;
            /* Скопировать серию на 120 строк вниз: */
            copy(0,0,105,639,    120,0) ;
            while(!kbhit())
            {
         /* Скопировать границу повторно,
         ** создает иллюзию движения: */
                copy(99,100,106,592,   219,100) ;
                copy(99,100,106,592,   219,108) ;
            }
            set_crt_modes(3) ;
         }

         void copy(r1_1, c1_1, r2_1, c2_1, r1_2, c1_2)
         int  r1_1, c1_1,   /* верхний левый угол источника */
              r2_1, c2_1,   /* нижний правый угол источника */
              r1_2, c1_2 ;  /* верхний левый угол назначения */
         {
         /* Быстро копирует одну область экрана в другую.
         ** Использует режим записи 1. Надо задать только
         ** верхний угол назначения.
         */
            char far *source = (char far *)(0xA0000000L) ;
            char far *destination = (char far *)(0xA0000000L) ;
            int rows = r2_1 - r1_1 ;
            int cols = (c2_1 >> 3) - (c1_1 >> 3) ;
            int bytes_per_line = GET_CRT_COLS() ;
            int next_row = bytes_per_line - cols ;
            registr x,y ;
            source += bytes_per_line * r1_1 + (c1_1 >> 3) ;
            destination += bytes_per_line * r1_2 + (c1_2 >> 3) ;

            EGA_GRFX(5,1) ;     /* установить режим записи 1 */
            for(y = 0 ; y < rows ; y++)
            {
               for(x = 0; x < cols; x++)
                 *(destination++) = *(source++) ;
               source += next_row ;
               destination += next_row ;
            }
            EGA_GRFX(5,0) ;   /* сбросить режим записи */
         }
         ----------------------------------------------------------------

Поскольку регистр маски бита не пригоден для использования в режиме записи 1, подпрограмма copy() будет копировать восемь элементов изображения исходных байтов в байты назначения. Другими словами, режим записи 1 применяется для манипулирования байтами, а не элементами изображения. Режим записи 1 можно использовать для сохранения области экрана на невидимой странице. Это полезно для реализации спускающихся меню. Область под спускающимся меню может быть сохранена на невидимой странице и затем восстановлена после использования меню. Режим записи 1 способен копировать данные только в другую область памяти EGA. Для чтения цвета из памяти EGA требуется отдельное чтение четырех битовых матриц.


VGA имеет один новый режим записи. Режим записи 3 VGA сходен с использованием пары регистров установки/сброса и разрешения установки/сброса в режиме записи 0 EGA для установки цвета (применяется подпрограммой line() программы 9-4). Разница заключается в том, что в режиме записи 3 регистр разрешения установки/сброса не используется, поэтому значение, содержащееся в регистре установки/сброса не маскируется регистром разрешения установки/сброса.


НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz