Главная · Поиск книг · Поступления книг · 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 ... 125 126 127 128 129 130 131  132 133 134 135 136 137 138 ... 198
         информацию о конфигурации EGA, памяти и мониторе. Этот байт явля-
         ется одним из байтов состояния,  которые EGA  BIOS  содержит  для
         внутреннего  использования  и обеспечения программ необходимой им
         информацией.
            Мы интересуемся битами 5 и 6, которые показывают полную память
         EGA;  битом 3, который показывает, является ли EGA активным дисп-
         леем; и битом 1, который указывает тип используемого монитора.
             Функция также  вызывает один из новых вызовов BIOS EGA,  аль-
         тернативную функцию 10,  которая возвращает информацию  EGA.  EGA
         вызывается  помещением  0х12 в регистр АН и 0х10 в регистр BL,  а
         также использованием прерывания 10h. Вызов EGA BIOS содержит сле-
         дующую информацию:

                                      - 9-6 -

                           Возвращаемая информация о EGA

             Результат:  Int 0x10
             Вызывается: AH = 0х12
                         для выбора альтернативных функций EGA
                         BL = 0x10
                         Альтернативная функция для информации EGA
             Возвращает: BH =  0 = Цветной монитор
                               1 = Монохромный монитор
                         BL =  Расшифрованная память EGA:
                               0 = 64К
                               1 = 128К
                               2 = 192К
                               3 = 256К
                         СН =  Биты признаков
                         CL =  Установки переключателей платы EGA

             Так как BIOS персонального компьютера  не  использует  видео-
         функцию  0х12,  этот вызов может быть использован в качестве про-
         верки наличия EGA.  BIOS персонального компьютера спокойно откло-
         нит   неизвестное  ей  прерывание  10h  и  не  изменит  состояния
         регистров.  Таким образом,  если выходящие регистры не изменяются
         вызовом или входящие регистры не соответствуют данным о байте ин-
         формации EGA, значит EGA отсутствует. Если EGA имеется в наличии,
         то  тип используемого монитора определяется считыванием положения
         установочных переключателей.  Вы предполагаете,  что пользователь
         правильно  установил  переключатели  и их положение соответствует
         типу монитора.
             После обнаружения  EGA  функция проведет тестирование системы
         на наличие карты VGA. Большинство регистров EGA только записывае-
         мые,  в то время как в VGA они являются считываемыми/записываемы-
         ми. Регистр устанавливается в определенное значение и затем дела-
         ется  попытка  считать  это  значение.  Если  считанный  байт  не
         соответствует записанному,  то имеющаяся карта - EGA, в противном
         случае - VGA. Используемый регистр является регистром маски бита,
         который далее будет детально рассмотрен.
             Программа EGACHECK.C,  приведенная в листинге 9-1,  выполняет
         проверку активной карты EGA. (В системе может присутствовать дру-
         гая дисплейная карта. Если активна другая карта, то бит 3 байта
         0х40:0х87 будет иметь значение 1). Если обнаружена активная карта
         EGA, то сохраняется информация об установке.
             Макрокоманда PEEK_BYTE(seg,off),  представленная  в  листинге
         9-1, позволяет выбирать байт из любого места памяти персонального
         компьютера.  Макрокоманда работает путем сдвига значения сегмента
         влево  на  одно слово (16 бит) с последующим логическим сложением
         бита смещения для формирования длинного прерывания.  Это прерыва-
         ние затем сбрасывается в указатель far.

                         Листинг 9-1. Программа EGACHECK.C

         ----------------------------------------------------------------

         /* egacheck.c */
         /* Проверяет наличие карты EGA или VGA */
         /* При нахождении одной из них, информация сохраняется */
         #include 

                                      - 9-7 -
         #include 
         #include 

         #define PEEK_BYTE(seg,off) \
              (*(char far *) ( (long)(seg)<<16 | (off) ) )

         struct Ega_info     /* для хранения информации о EGA */
         {
           char card ;       /* для хранения типа карты */
           char monitor ;    /* для хранения типа монитора */
           int memory ;      /* объем памяти: 64, 128, 192, 256К */
           char high_res_graphics ;
           char text_mode ;
         }  ;

         int get_ega_info(struct Ega_info *) ;

         main()
         {
         struct Ega_info info ;

         if(get_ega_info(&info))   /* тест на наличие EGA */
          {
          if(info.card == 'E')
            {
            printf("\n\nИспользуется EGA.") ;
            printf("\nПодключена к") ;
            switch(info.monit)
            {
              case 'C': puts(" цветному монитору") ;
                        break ;
              case 'M': puts(" монохромному монитору") ;
                        break ;
              case 'H': puts("усовершенствованному цветному монитору");
                        break ;
              default:  break ;  /* не определен */
            }
            printf("n\%iK байт памяти EGA.", info.memory);
            }
            else
               printf("\n\nИспользуется VGA.") ;
            printf("\nРежим %#2i - графика с высоким разрешением.",
                  (int)info.high_res_graphics) ;
            printf("\nРежим %#2i - текстовый режим.\n\n",
                  (int)info.text_mode) ;
          }
         else
          puts("\nНет активного EGA.") ;
         }                               /* конец main() */


         int get_ega_info(info)
         struct Ega_info *info ;

         /* Эта функция проверяет, есть ли в системе активный EGA */
         {
         union REGS regs ;

                                      - 9-8 -
         int i, test_mask = 1 ;
         /* Принять байт информации EGA из области данных BIOS */
            char bios_info = PEEK_BYTE(0x40,0x87) ;

            /* Бит 3 показывает, активный EGA или нет
             * если нет, то проверить наличие */
            if(bios_info & 0x8)
               return (0) ; /* если бит 3 = 1, EGA не активный */

            regs.h.ah = 0x12 ; /* альтернативная функция BIOS EGA */
            regs.h.bl = 0x10 ; /* получить информацию */
            regs.h.bh = 0xFF ; /* не возможное значение */
            int86(0x10, ®s, ®s) ; /* видео вызов EGA BIOS */

         /* bios_info биты 5 + 6 и BL(расшифрованная память EGA) и */
         /* bios_info бит 1 и ВН должны быть равны для EGA */
         if((regs.h.bl != ((bios_info & 0x60) >> 5 || /* память */
            (regs.h.bh != ((bios_info & 0x2) >> 1  || /* монитор */
            (regs.h.bh == 0xFF))            /* ВН должен изменить*/
           /* EGA есть, сохранить тип монитора */
           /* Код тип монитора:
                'C' для цветного,
                'M' для монохромного,
                'H' для hercules */
          switch(regs.h.cl) /* cl имеет установку переключателей EGA */
          {
             case 0: /* первоначально моно, EGA цветной 40х25 */
             case 6: /* моно второй, EGA цветной 40х25 */
                    info->monitor = 'C' ;
                    info->high_res_graphics = 0xD ;
                    info->text_mode = 0x1 ;
                    break ;
             case 1:  /* первоначально моно, EGA цветной 80х25 */
             case 2:  /* то же, что 1 */
             case 7:  /* моно второй, EGA цветной 80х25 */
             case 8:  /* то же, что 7 */
                    info->monitor = 'C' ;
                    info->high_res_graphics = 0xE ;
                    info->text_mode = 0x3 ;
                    break ;
             case 3: /* первоначально моно, EGA с высоким разрешением */
             case 9: /* сначала EGA с высоким разрешением, потом моно */
                    info->monitor = 'H' ;
                    info->high_res_graphics = 0x10 ;
                    info->text_mode = 0x3 ;
                    break ;
             case 4:  /* сначала 40 цветной, EGA моно */
             case 5:  /* сначала 80 цветной, EGA моно */
             case 10: /* сначала EGA моно, затем 40 цветной */
             case 11: /* сначала EGA моно, затем 80 цветной */
                    info->monitor = 'M' ;
                    info->high_res_graphics = 0xF ;
                    info->text_mode = 0x7 ;
                    break ;
             default: /* зарезервированные установки переключателей */
             return (0) ;
          }

                                      - 9-9 -
          info->memory = 64 * (regs.h.bl + 1) ;

          /* Различить EGA и VGA: */
          /* Это выполняется посредством записи значения в только
             считываемый регистр в EGA, но считываемый/записываемый
             в VGA */
         outp(0x3CE, 8) ;         /* маска бита EGA/VGA */
         outp(0x3CF, test_mask) ; /* направить значение теста */
         outp(0x3CE, 8) ;         /* снова маска бита */
         if(inp(0x3CF) == test_mask)
            {
            info->card = 'V' ;    /* регистр можно считать */
            if(info->monitor != 'M')
               {
               info->high_res_graphics = 0x12 ;
               info->text_mode = 0x3 ;
               }
            /* Если подключено к монохромному, то значения уже
             * установлены.
             */
            }
         else
            info->card = 'E' ; /* EGA */
         outp(0x3CE, 8) ;      /* сбросить маску бита */
         outp(0x3CF, 0xFF) ;
         /* В этой системе активен EGA/VGA, вернуть память */
         return(info->memory) ;
         }
         ---------------------------------------------------------------

             В новый заглавный файл, названный ega.h, должны быть добавле-
         ны  прототип  функции get_ega_info() и скелет структуры Ega_info.
         Эти функция и скелет будут использованы в последующих примерах.
             Теперь мы знаем,  какой режим надо использовать для графики и
         можем изобразить что-нибудь на дисплее.  EGA BIOS,  также  как  и
         BIOS  персонального компьютера имеет вызов Write Dot (писать точ-
         ку).  Этот вызов работает медленно, но очень полезен во всех гра-
         фических картах IBM. Вот некоторые характеристики вызова EGA BIOS
         Write Dot:

             Write Dot

             Результат:  Int 0x10

             Вызывается: AН =  0хС для выбора функции Write Dot
                         BH =  Страница
                         DX =  Номер строки
                         СХ =  Номер столбца
                         AL =  Значение цвета

             Возвращает: Ничего

             Обратите внимание на добавление в ВН номера страницы. Если Вы
         преобразуете  старое программное обеспечение для работы с EGA, то
         убедитесь, что номер страницы находится в ВН перед вызовом преры-
         вания  10h.  Программы,  написанные для монохромного адаптера или

                                      - 9-10 -
         CGA в графическом режиме,  наиболее чувствительны к этому  недос-
         татку.
             Вызов BIOS для переключения в графический режим  точно  такой
         же,  как и функция 0 прерывания 10h персонального компьютера. Тем
         не менее, BIOS не выполняет проверку на предмет того, не повредит
         ли выбранный Вами режим Ваш монитор. Монохромный монитор, подклю-
         ченный к EGA, может быть поврежден сигналом режима цветного текс-
         та или графики,  поэтому важно проверить совместимость монитора и
Предыдущая страница Следующая страница
1 ... 125 126 127 128 129 130 131  132 133 134 135 136 137 138 ... 198
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 

Реклама