Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Различные авторы Весь текст 2311.07 Kb

Программирование и кодирование

Предыдущая страница Следующая страница
1 ... 126 127 128 129 130 131 132  133 134 135 136 137 138 139 ... 198
         режима работы.  В программе 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,  влияющим на перезапись содержания  ре-
         гистра-защелки, является регистр маски матрицы. Если любой из че-
         тырех битов этого регистра нулевой,  соответствующие битовые мат-
Предыдущая страница Следующая страница
1 ... 126 127 128 129 130 131 132  133 134 135 136 137 138 139 ... 198
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 

Реклама