Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Глава 8. Видеодоступ, часть 1 - текстовый режим

ГЛАВА 8. ВИДЕОДОСТУП, ЧАСТЬ 1 - ТЕКСТОВЫЙ РЕЖИМ

[ Оглавление ]
     Практически любая программа, выполняемая на персональном 
компьютере   фирмы   IBM   выводит   информацию   на    экран 
видеодисплея.  Существует  два  принципиально  различных вида 
информации,представляемой на  экране  дисплея  IBM/PC:  текст 
(т.е.   литеры  алфавита  и  другие  символы)  и  графика.  В 
настоящей и в следующей главах  мы  рассмотрим  все  наиболее 
существенные  аспекты,  связанные  с  доступом  к содержимому 
экрана, расмотрение начнем с символьных текстов. 
     В отличие от остальных  глав  данной  книги,  эти  главы 
практически  не  содержат сведений, общих для всего семейства 
компьютеров, использующих операционную систему MS-DOS.  В  то 
же  время  рассматриваемые  материалы  помогут нам установить 
степень совместимости всего класса персональных компьютеров с 
персональным   компьютером   IBM/PC,   поскольку  большинство 
распространенных программ для  IBM/PC  зависят  от  специфики 
представления информации на экране. 
     
     
     8.1. Типы экранов видеодисплеев
     
     Существует  множество  различных  типов   видеодисплеев,
подключаемых   к  компьютеру  IBM/PC,  обладающих  различными
характеристиками и особенностями программирования. Для  того,
чтобы   разобраться   в  этом  вопросе,  мы  опишем  наиболее
существенные различия и покажем, как они соотносятся  с  теми
сведениями,  которые  мы  приводим  в  настоящей  и следующей
главах.
     Прежде всего,  следует  отметить,  что  к  персональному
компьютеру   в   качестве   дополнительных  плат  могут  быть
подключены   два   дисплейных    адаптера    -    одноцветный
(монохромный)  и  цветной  графический.    Дисплейный адаптер
связывает компьютер с монитором дисплея с помощью микросхемы,
называемой  контроллером  электронно-лучевой трубки (экрана).
Адаптер имеет также ряд программируемых портов  ввода-вывода,
генератор символов в ПЗУ и оперативную память, которая хранит
информацию, выводимой на экран информации.
     Изображение  на  экране,  как  уже   указывалось   выше,
генерируется   в   двух   основных   режимах  -  текстовом  и
графическом. В текстовом режиме  на  экран  выводятся  только
символы,  хотя многие из этих символов можно использовать для
построения простых линейных  конструкций.  Графический  режим
используется   главным   образом  для  представления  сложных
изображений (схем, графиков, диаграмм, рисунков и т.п.), хотя
и  допускает  возможность  представления  символов различного
размера и формы (формата).
     Одноцветный   адаптер   предназначен  для  использования
только с монохромным экраном дисплея фирмы  IBM.  Монохромный
дисплей   не   может   воспроизводить   цвет  и  графику.  Он
предназначен только для работы в текстовом режиме, т.е. может
представлять    только   текстовые   символы   и   простейшие
конструкции   (диаграммы),   синтезируемые    из    символов,
записанных   в   ПЗУ   в   коде  ASCII.  Многие  пользователи
предпочитают  цветному   графическому   дисплею   монохромный
(одноцветный),  поскольку с него легче производить считывание
информации. Но, выбирая  монохромнвй  дисплей,  они  жертвуют
графическими  возможностями  и  цветом  - двумя очень ценными
качествами дисплея.
     Цветной  графический адаптер может работать с различными 
типами дисплеев. Он имеет  выходные  гнезда  для  двух  видов 
подключений  и  поэтому  допускает  подключение разнообразных 
видеотерминалов.  На  одном  из  выходов  формируется  единый 
составной  сигнал цветного изображения. На другом - отдельные 
сигналы для трех  основных  цветов  -  красного,  зеленого  и 
синего;   эти   сигналы   получили   обобщенное   название  - 
RGB-сигнала. Этот адаптер может работать как в текстовом, так 
и  в  графическом  режимах,  формируя на экране изображения и 
символы нескольких форматов и различных цветов. Он разработан 
для работы с любыми видами дисплеев от обычного телевизора до 
цветного монитора с высокой разрешающей способностью. 
     К RGB-выходу подключаются специальные дисплеи, известные 
под  названием  RGB-мониторов.  К  выходу  составного сигнала 
могут быть подключены цветные дисплеи соответствующего  типа. 
К  этому же выходу подключаются и обычные цветные телевизоры, 
снабженные  частотным  преобразователем.  Все   перечисленные 
здесь типы дисплеев способны воспроизводить цвет. 
     К  выходу  составного  сигнала  можно  также  подключать 
черно-белый компьютерный  дисплей.  В  этом  случае  на  вход 
дисплея поступает сигнал цветности, который, однако, не может 
быть в полной  мере  воспроизведен  средствами  дисплея.  При 
использовании    такого    дисплея    теряется    возможность 
воспроизведения цвета, а также высокое  качество  и  четкость 
монохромного  дисплея  фирмы  IBM.  Это  самый дешевый способ 
отображения информации на экране. 
     Для  преодоления  ограничений,   присущих   одноцветному
адаптеру,  некоторые  фирмы-изготовители  перешли  к  выпуску
разновидностей одноцветного адаптера,  таких,  например,  как
популярный  дисплейный  адаптер  Геркулес,  который  сочетает
графические (но не цвет)  возможности  цветного  графического
адаптера   с   высоким   качеством   воспроизведения  текста,
характерным для одноцветного адаптера. В результате  качество
графики   оказывается   выше   качества,   даваемого  цветным
графическим адаптером. Усиленный  графический  адаптер  может
создавать подобную графику на одноцветном экране.
     Приблизительно  две  трети всех персональных компьютеров 
оборудованы стандартными одноцветными адаптерами и поэтому не 
обладают  графическими и цветовыми возможностями.Не смотря на 
определенные  реальные  преимущества  использования  цвета  и 
графики,   большинство   персональных  компьютеров  прекрасно 
обходятся  без  них.  Планируя  использование   персонального 
компьютера   следует  помнить,  что  большинство  дисплеев  - 
текстовые. 
     Различные  аспекты  излагаемой  проблемы  в  настоящей и
следующих  главах   в   той   или   иной   степени   касаются
использования  различных  типов  дисплеев.  Для  того,  чтобы
избежать   возможных   недоразумений,   кратко   опишем    их
возможности.
     Любые  сведения,  относящиеся  к  одноцветному адаптеру, 
касаются только этого адаптера. Они  не  распространяются  на 
различные     аспекты    воспроизведения    цвета,    включая 
использование черно-белого  монитора  с  цветным  графическим 
адаптером. Черно-белый монитор можно рассматривать в качестве 
монохромного;  он  однако  не  используется   с   одноцветным 
адаптером.  Термин  "монохромный"  (одноцветный) используется 
только для монохромного экрана фирмы IBM. 
     Специфика  работы  цветного  графического  адаптера   не
применима   к   монохромному  дисплею.  Все  цветные  дисплеи
разрабатываются с учетом этой специфики. Большинство сигналов
цветного  графического  адаптера  воспринимается  черно-белым
монитором; исключение составляют сигналы цветности.
     Большинство черно-белых мониторов  обрабатывают  сигналы 
цветности    неудовлетворительно.    Черно-белые    мониторы, 
формирующие осмысленное  изображение  при  получении  цветных 
сигналов  большая  редкость. Поэтому любая программа, которая 
может быть использована на компьютере с черно-белым монитором 
не  должна  использовать  цвет; в противном случае она должна 
обладать способностью преобразовать любой цвет в  черно-белую 
палитру. 
     Цветные телевизоры,  как  правило,  имеют  более  низкую 
разрешаемую  способность  по  сравнению  с  обычными цветными 
мониторами  компьютеров.  Поэтому  цветные  телевизоры  могут 
работать   только   в   режиме   самой   низкой   разрешающей 
способности, предусмотренной в IBM/PC, а именно в  режиме  40 
позиционных строк. В большинстве случаев цветной телевизор не 
позволяет использовать  всех  возможностей  IBM/PC;  наиболее 
важные   программы   не   могут  выполняться  на  компьютере, 
оборудованном  цветным  телевизором.  Как   правило   цветной 
телевизор  используется  программами  реализации компьютерных 
игр,   ориентированных   на   использование   интерфейса    с 
накопителем на магнитной кассете. 
     
     
     8.2. Принципы формирования изображения
     
     Прежде чем перейти к дальнейшему рассмотрению текстового
режима  работы  дисплея,  мы  для  уяснения  сути дела кратко
рассмотрим некоторые принципы  представления  изображений  на
экранах видеодисплеев. Существует два основных способа вывода
информации   из    персонального    компьютера    на    экран
видеотерминала. В первом случае компьютер рассматривает экран
дисплея в  качестве  обычного  устройства  ввода/вывода.  При
таком  подходе компьютер выдает контроллеру дисплея различные
команды, включая команды вывода  текстовой  информации.  Ниже
приводится некоторая упрощенная форма этих команд:
     
     ОЧИСТИТЬ ЭКРАН
     ВЫСВЕТИТЬ С 15 ПОЗИЦИИ 10 СТРОКИ СЛЕДУЮЩИЙ ТЕКСТ :
     "В случае готовности нажмите клавишу "ввод"" ...
     ПЕРЕМЕСТИТЕ КУРСОР В 43 ПОЗИЦИю 10-й СТРОКИ
     
     Наиболее существенный аспект взаимодействия такого  рода 
состоит  в  том,  что  в  этом случае дисплей рассматривается 
просто  как   и   любое   другое   периферийное   устройство. 
Разумеется,  дисплей  может  выполнять  и  ряд  специфических 
команд, таких, которые не может выполнять принтер - например, 
команду  "ОЧИСТИТЬ  КАДР" - и все же принцип взаимодействия с 
компьютером остается неизменным. 
     Преимущество  описанного  подхода  состоит  в  том,  что 
использование  команд позволяет рассматривать экраны дисплеев 
в одном ряду с другими устройствами ввода/вывода.  Вследствие 
этого   программное   обеспечение   поддержки   видеодисплеев 
становится  проще  и  более  унифицированным;  это  позволяет 
универсальным   образом   использовать   множество  различных 
компьютерных терминалов. Недостаток такого подхода в том, что 
компьютер  теряет  непосредственную связь с экраном дисплея и 
оказывается не в состоянии "творить чудеса" на экране.  Фирма 
IBM пошла по пути "сотворения чудес" и поэтому выбрала другой 
подход подключения дисплея к IBM/PC. 
     Этот   подход   известен   как   подход,   связанный   с 
регенерацией  изображения на основе образа экрана хранящегося 
в  памяти.  В  этом  случае  компьютер  и  дисплей  совместно 
используют  некоторое  пространство общей памяти. Электронные 
схемы дисплея постоянно производят опрос (считывание)  памяти 
и сразу же отображают результаты на экране. При таком подходе 
компьютерная программа может осуществлять вывод информации на 
экран    путем   простого   изменения   содержимого   памяти. 
Аналогично, считывание  информации  с  экрана  дисплея  может 
осуществляться  путем  обычного  считывания содержимого общей 
памяти.   Таким   образом,   экран   дисплея   представляется 
фактически  областью  памяти  и  выборка/занесение информации 
из(в) память означает считывание или запись информации  с(на) 
экран дисплея. 
     В   персональном   компьютере   фирмы   IBM   фактически 
используется  смешанный  подход.  Для  отображения  данных на 
экране используется хранимый в памяти образ экрана (карта)  , 
а    для    управления   различными   аспектами   отображения 
используется система команд. В дисплейных системах с  жесткой 
реализацией  механизма  отображения  содержимого  памяти даже 
управление   курсором    осуществляется    путем    изменения 
содержимого     общей    памяти.    В    компьютере    IBM/PC 
позиционирование курсора  осуществляется  с  помощью  команд, 
даваемых схемой управления контроллером. Команды используются 
в следующих случаях: установки  размера  мерцающего  курсора, 
очистки  и  обновления  экрана,  а также для изменения режима 
работы дисплея (текстовый-графический, 40  позиционный  -  80 
позиционный). 
     Работа в режиме хранимого в памяти образа экрана (карты) 
связана с двумя потенциальными неудобствами (однако фирме IBM 
удалось  найти  способ их преодоления). Первое состоит в том, 
что этот образ требует для размещения  значительных  ресурсов 
оперативной  памяти;  для восьмиразрядных компьютеров старого 
исполнения  с  малой  оперативной  памятью  это  представляло 
серьезную проблему. В компьютере IBM/PC эта проблема решается 
в два приема. Во-первых, расширением пространства  адресуемой 
памяти  до миллиона байт. Во-вторых, выделением дисплею своей 
собственной встроенной памяти, с тем  чтобы  не  использовать 
обычную  память,  предназначенную  для  хранения  программ  и 
данных. 
     Существуют  и  более  веские  основания  для обеспечения 
дисплейного   адаптера   своей    собственной    памятью    и 
следовательно  разрешение  проблемы  конфликтов при доступе к 
памяти. Дело в том, что дисплей с хранимой копией изображения 
(образа   экрана)  в  памяти  должен  постоянно  осуществлять 
операции чтения из памяти и, следовательно, конкурировать  за 
эту  память  с  микропроцессором.  В  этом  случае образуется 
очередь за обладание схемными ресурсами доступа к памяти. 
     Фирма IBM решила эту проблему  путем  выделения  дисплею
своей  собственной  памяти и организовав доступ к этой памяти
через  два  порта  ввода-вывода.  Такой  подход  обеспечивает
возможность  быстрого  доступа  к  общему  полю  памяти  и со
стороны   процессора   и   со   стороны   дисплея.
     Если   внимательно   присмотреться  к  экрану  в  момент 
генерации кадра изображения, то можно  заметить  что  большую 
часть  времени  экран  дисплея  остается совершенно чистым, и 
только в  некоторых  случаях  возникает  нечто  вроде  быстро 
исчезающей  помехи,  как  если  бы  курсор  попытались быстро 
переместить через весь экран дисплея. Такой эффект  возникает 
как  результат  попыток  одновременного  доступа  к памяти со 
стороны компьютера и со  стороны  дисплея.  Опасного  в  этом 
ничего  нет,  любопытен  лишь  сам эффект и не более. Взяв за 
основу дисплей, хранящий копию изображения в памяти, закрепив 
за  дисплеем  свою  собственную  область  памяти  и обеспечив 
двусторонний  вход  в  память  фирма,   IBM   решила   задачу 
визуализации  информации  наилучшим  образом.  Можно было бы, 
правда, обеспечить и более  высокую  разрешающую  способность 
дисплея    в    текстовом   режиме,   а   также   реализовать 
пиктографический режим, хотя бы в том  объеме  как  это  было 
впервые  сделано  для  рабочей  станции  "Стар"  (STAR) фирмы 
"Ксерокс" или для компьютера "Лиза" ( Lisa) фирмы "Apple". 
     В базовом варианте распределения памяти для  IBM/PC  под
память  дисплея отводилось 128Кбайт. Это верный признак того,
что фирма IBM намеривалась реализовать все эти возможности.
     Это   все,   что  следует  знать  читателю,  прежде  чем 
приступать к более глубокому  изучению  вопросов  отображения 
информации  на  экране  дисплея.  В  следующем  параграфе  мы 
изложим  наши  взгляды  на  принципы  построения  графических 
систем, а затем рассмотрим детали построения хранимого образа 
экрана и обсудим такие понятия как "страницы" и "атрибуты". 
     Память дисплея физически размещается  вместе  с  другими 
схемами  дисплея  на  плате  адаптера.  Однако логически (для 
центрального  процессора)  она  является   частью   основного 
адресного  пространства  компьютера.  Для  дисплея  отводится 
128Кбайт памяти в  блоках  А  и  В  с  адресами  А0000(16)  - 
BFFFF(16),  однако  оба  стандартно  поставляемых  дисплейных 
адаптера используют лишь два небольших фрагмента этой области 
памяти.  Одноцветный адаптер использует 4К дисплейной памяти, 
начиная  с  адреса  B800.  Оставшаяся  память,  в  частности, 
64-килобайтный  блок  от  A000 до B000 отводится для развития 
возможностей дисплея, например, для использования дисплейного 
графического адаптера. 
     Одноцветный и цветной  графические  адаптеры  используют 
для вывода информации на экран дисплея так называемый битовый 
образ  изображения  (экрана)  хранящегося  в  описанной  выше 
памяти.    Каждая   ячейка   области   памяти   соответствует 
определенной позиции экрана, между ними  установлено  взаимно 
однозначное соответствие. 
     Схемы  дисплея  периодически  считывают  информацию   из 
памяти и выводят ее на экран. Программа может непосредственно 
изменять содержимое  памяти,  тем  самым  изменяя  содержимое 
экрана.  Контроллер  экрана служит для связи памяти дисплея с 
монитором, преобразуя поток  получаемых  из  памяти  битов  в 
электронные  пучки, направляемые в определенные точки экрана. 
Точки  экрана  называть  пикселями,  пэлами  или   элементами 
изображения.   Они   образуются   при   столкновении   потока 
электронов  с  люминофором   поверхности   электронно-лучевой 
трубки.  Поток  электронов  испускается  электронной пушкой и 
построчно перемещается сверху  вниз.  По  мере  его  движения 
контроллер    электронно-лучевой    трубки   модулирует   его 
интенсивность в зависимости от комбинации  битов,  полученных 
из памяти дисплея. 
     Видеосхема  обновляет  экран  60  раз  в  секунду, делая
меняющееся изображение отчетливым и ясным.  В  конце  каждого
цикла    обновления    экрана    электронный   пучек   должен
переместиться из нижнего правого угла экрана  в  его  верхний
левый  угол.  Это  перемещение называют вертикальным обратным
ходом. Во время обратного хода луча его подача на поверхность
экрана блокируется.
     Время  обратного  вертикального  хода  луча   составляет
1,25мсек и может учитываться программистом.
     
     
     8.3. Структура копии изображения экрана
     
     
     Выше уже говорилось о том, что дисплеи компьютера IBM/PC
относятся  к классу дисплеев, хранящих битовый образ экрана в
памяти (карту) памяти. В связи с этим  обстоятельством  имеет
смысл  рассмотреть  принципы  построения  этого  образа.  
     Описываемый здесь образ экрана в памяти применим  как  к 
монохромному,  так  и  к  цветному  графическрому  адаптерам, 
работающим  в  тесктовом  режиме.  Графические  режимы  будут 
рассмотрены  в следующей главе с учетом особенностей хранения 
изображений в памяти (Более подробные  сведения  о  различных 
режимах  работы  цветного  графического  адаптера и некоторые 
интересные возможности описаны в разделе 8.11.). 
     Поскольку  дисплейные  адаптеры  используют  специальную 
двухвходовую  память,  не  следует  удивляться  тому, что она 
размещается  особым   образом.   Физически   память   дисплея 
размещается  на  схемной  плате  и плате расширения адаптера. 
Схемная плата содержит также микросхему контроллера дисплея и 
все  вспомогательные  элетронные  схемы.  Эта  плата, подобно 
другим   платам   для   IBM/PC,   вставляется   в   один   из 
дополнительных   разъемов,   предназначенных  для  поключения 
вспомогательного оборудования. 
     Несмотря на то, что память дисплея физически размещается 
на  плате  контроллера  дисплея,  логически  она   ничем   не 
отличается  от  обычной  памяти  в  том смысле, что допускает 
считывание и запись информации  путем  обращения  по  адресу. 
Дисплеям  двух  различных  типов  отводятся различные участки 
памяти  (об  этом  уже  говорилось   при   обсуждении   основ 
использования  памяти  персонального  компьютера  в главе 3), 
поэтому они  могут  быть  одновременно  подключены  к  одному 
компьютеру.  Монохромному  дисплею  отводится область памяти, 
начиная  с  шестнадцатеричного  адреса   B000,   а   цветному 
графическому - с адреса B800. 
     Читателю,  знакомому  с Бейсиком, напомним, что доступ к
памяти осуществляется с помощью операторов PEEK и POKE  после
того, как установлен нужный указатель сегмента
     
     10 DEF SEG = &HB000 (память монохромного дисплея)
     20   DEF  SEG  =  &HB800  (память  цветного  графического
дисплея) 

     После приведенных кратких сведений  о  принципах  работы
дисплея  с  хранимым  образом экрана в памяти имеет смысл еще
раз обратиться к диаграмме на рис. 8.1.
     
     Процесс  отображения   содержимого   экрана   в   память 
начинается  с  определения позиций отдельных символов экрана. 
Каждой  позиции  экрана  соответствует  два   байта   памяти. 
Совместно эти  два байта задают собственно объект подлежащий, 
отображению на экране и то, как его следует отобразить. 
     Первый   из   двух   байтов   (имеющий   четный   адрес) 
специфицирует  собственно  объект (т.е. "что" отображается на 
экране). Это шестнадцатеричный код символа ASCII. Второй байт 
(имеющий  нечетный  адрес)  специфицирует  режим  отображения 
первого байта (т.е. "как" символ отображается на экране). Это 
так называемый байт-атрибутов. В случае цветного графического 
адаптера   байт-атрибутов   управляет   цветом.   В    случае 
монохромного  адаптера  байт-атрибутов  управляет  яркостью и 
подчеркиванием   символа;   это   своего   рода   монохромные 
эквиваленты  цвета.  Кроме  того байт-атрибутов устанавливает 
режим мерцания символа (для адаптеров обоих типов). Детальное 
описание байта-атрибутов приводится в разделах 8.5 и 8.6. 
     Первой  позиции экрана (верхний левый угол соответствует 
таким образом два байта в  памяти  дисплея  со  смещением  0. 
Следующей  позиции  (смещенной  на  одно  знакоместо  вправо) 
соответствуют  два  байта  памяти   со   смещением   2,   Так 
продолжается  до  конца  первой  строки  экрана  дисплея. Для 
монохромного  дисплея,  а  также  для  цветного  графического 
дисплея,  работающего  в  80-ти позиционном режиме последнему 
символу строки  соответствует пара байтов  со  смещением  158 
(т.е. 79х2). Для цветного графического дисплея, работающего в 
40- позиционном  режиме,  последней  позиции  первой   строки 
соответствует пара байтов памяти со смещением 78 (т.е. 39х2). 
     При  переходе  к  новой строке позиции экрана продолжают 
отображаться парой смежных байтов таким образом,  что  первой 
позиции   следующей   строки   соответствует   пара   байтов, 
расположенных  непосредственно  вслед  за  байтами  последней 
позиции  предыдущей  строки.  Область памяти используется без 
промежутков, т.е. какие-либо  пробеловы  между  концом  одной 
строки  и  началом  другой  строки - отсутствуют. Разумеется, 
речь идет о физических промежутках,  поскольку  в  логическом 
плане вполне естественно говорить о вычислении местоположения 
границы между строками. 
     Все  сказанное  выше  распространяется  как   на   80-ти 
позиционный,  так  и  на  40-позиционнный режимы. Поэтому при 
переходе  из  одного  режима  в  другой   должна   измениться 
структура расположения в памяти позиций и строк. 
     Монохромный  и  цветной  графический  дисплеи  в   80-ти
позиционном  режиме требуют 4000 байтов: 80 позиций х 2 байта
х 25 строк. Цветной  графический  адаптер  в  40- позиционном
режиме требует вдвое меньшей памяти, т.е. порядка 2000 байт.
     Следствием  такой  схемы хранения образа экрана в памяти 
является то, что отображаемые символы могут  располагаться  в 
любом  другом  месте  памяти.  А это, в свою очередь, создает 
неудобства  при  перемещении  сообщений  в  память   дисплея. 
Сообщения  или  любые  другие  строки  отображаемых данных не 
могут быть перемещены по месту назначения за один  шаг,  если 
форма  их  хранения  в  программах  не  предполагает  наличия 
байтов-атрибутов.  Сообщение,  таким  образом,  должно   быть 
представлено    в    виде   чередующейся   последовательности 
содержательных и атрибутивных байтов. Поскольку большая часть 
данных  выводятся  на  экран в виде строк символов с одними и 
теми же атрибутами, то возникает  потребность  в  специальных 
программах   перемещения  данных  в  нужную  область  памяти, 
которые бы попутно дополняли их нужными  атрибутами.  Листинг 
8.2  содержит тексты некоторых служебных программ на Паскале, 
реализующих  эти  функции;  в  параграфе  8.7.  этот   вопрос 
рассмотрен более детально. 
     Поскольку  в  памяти,  отведенной  дисплею,  отсутствуют 
физические   границы   между   строками,   то   могут    быть 
автоматически  перенесены  в следующие строки, путем простого 
использования очередных  адресов.  Это  довольно  эффективный 
способ  решения  проблемы  переноса  сообщений с минимальными 
затратами.  В  тех  случаях,  когда  важно  фиксировать  факт 
достижения сообщением конца строки, следует предусматривать в 
программах  проверку   и   обработку   этого   условия.   Для 
использования   монохромного  адаптера  требуется  4000  байт 
памяти. Это приблизительно соответствует 4К (4096). Лишние 96 
байтов   не   используются  и  остаются  свободными.  Цветной 
графический  адаптер  требует  значительно  большего   объема 
памяти, а именно, 16К. Это объясняется большими потребностями 
памяти. 
     Объем    памяти,    используемой   цветным   графическим
адаптером, составляет  16К  байт.  Такой  значительный  объем
памяти   определяется   потребностями   графических  режимов,
детально  описываемых   в   следующей   главе.   Персональный
компьютер использует излишки памяти (когда эта память реально
не используется в графических режимах) путем  организации  (в
текстовом  режиме)  набора  копий  кадров  экрана.  Эти копии
принято  называть  страницами.  В  следующем   параграфе   мы
рассмотрим    принципы    организации    и   функционирования
страничного механизма.
     
     
     8.4. Страничный механизм цветного графическоно дисплея
     
     Материалы  настоящего   параграфа   в   первую   очередь 
относятся    к   компьютерам   IBM/PC,   снабженным   цветным 
графическим адаптером. Однако, по мере изложения станет ясно, 
что  эта  концепция  может быть распространена и на систему с 
монохромным  адаптером.  Поэтому,  если  читателя  интересуют 
только  системы  второго  класса (либо универсальные системы) 
данный параграф, несомненно, представляет интерес. 
     В   отличие   от  монохромного  адаптера,  объем  памяти 
которого в точности соответствует размеру заполненного  кадра 
дисплея,  цветной  графический  адаптер  располагает  памятью 
гораздо большего объема,  чем  это  требуется  для  работы  в 
текстовом  режиме.  Это  объясняется  тем,  что  для работы в 
графическом режиме  требуются  значительные  ресурсы  памяти. 
Фирма  IBM  пошла  по  пути  реализации страничного механизма 
работы с кадрами изображения. 
     Страница представляет собой  образ  (копию)  содержимого 
экрана  дисплея  в  памяти  компьютера.  В  80-ти позиционном 
текстовом режиме цветной графический адаптер требует памяти в 
4  раза  (а  в  40  -  позиционном текстовом режиме в 8 раз ) 
меньше фактически имеющейся. Поэтому  память  этого  адаптера 
может хранить либо 4, либо 8 страниц. 
     Любая  страница  изображения  представляет  собой полную 
копию содержимого экрана дисплея,  включающую  байты  данных, 
байты-атрибутов  и  построчно-логическое  разбиение символов. 
Работая  в  80-ти  позиционном  режиме,  цветной  графический 
адаптер может хранить четыре полных копии одного кадра экрана 
монохромного адаптера. При работе в 40 -  позиционном  режиме 
число  таких  кадров увеличивается до 8; при этом каждый кадр 
обладает вдвое меньшей информационной емкостью. 
     Информация,  хранящаяся  в каждой  из четырех или восьми
страниц, может в любой  момент  времени  быть  отображена  на
экране.  Остальные  страницы  в  это  время, подобно актерам,
ожидающим  выхода  на  сцену,  ждут  своей  очереди.  Получив
команду, дисплейный адаптер переключается с одной страницы на
другую, таким образом мгновенно обновляя содержимое экрана.
     Прользовательская программа  может  формировать  данные,
подлежащие  отображению  на  дисплее, путем обычной записи по
соответствующему адресу,  либо  путем  использования  функций
обслуживания   BIOS,   позволяющих   оперировать   с   нужной
страницей.    После    того,    как    актуализация    данных
закончена, сформированный в памяти образ  экрана  может  быть
мгновенно  отображен  на дисплее путем переключения адаптером
активной  страницы.  Такой  подход  делает  программу   более
оперативной,  поскольку  пользователь  не ощущает трудоемкого
процесса формирования образа экрана - он видит  лишь  быстрое
появление результата.
     Возможности программ в  части  использования  страничной 
техники   представляют   довольно  интересное  явление.  Если 
программа  использует  несколько  стандартных  форматов   для 
представления  информации,  то  она может сформировать каждый 
формат только один раз и сохранить его  в  страничной  памяти 
дисплея.  В  случае  возникновения  потребности  перехода  от 
одного формата к другому программа  может,  сохранив  текущую 
страницу  на  экране,  форматировать данные другой страницы и 
завершив этот процесс, переключить адаптер дисплея  на  новую 
страницу.  Такого  рода  техника  работы  с  памятью  дисплея 
создает впечатление, что  программа  обладает  более  высокой 
производительностью,    поскольку    изображение   появляется 
мгновенно. В выигрыше оказывается и  пользователь  программы, 
получая  более  стабильное  изображение  на  экране  дисплея. 
Поскольку  мелкие   изменения  не  допускаются, то надежность 
человеко-машинного  интерфейса повышается - в этом случае нет 
необходимости каждый раз отыскивать на экране места возможных 
изменений и проверять все ли на месте. 
     Еще  одна  потенциальная  сфера использования страничной
техники при работе с дисплеем  состоит  в  более  совершенной
передаче   динамических   изображений.   Если   же  изменения
производятся "за кадром" и представляются пользователю в виде
цельного  изображения  путем  замены  активной  страницы,  то
динамический характер изображения передается более плавно.
     Дисплейные страницы пронумерованы от 0 до 3, либо  от  0 
до  7  в  случае более мелких 40 позиционных страниц. Нулевая 
страница, как это можно предположить, располагается в  начале 
области  памяти дисплея; вслед за ней располагаются остальные 
страницы. Началу каждой страницы соответствует адрес  кратный 
1К.  Поясним  это  на  примере.  Дисплей,  работающий в 80-ти 
позиционном режиме, требует для  каждой  страницы  4000  байт 
памяти  (25  строк х 80 позиций х 2 байта на позицию). Первая 
страница, то есть страница,  имеющая 0 номер, располагается в 
памяти  цветного  графического  адаптера  с 0 смещением ( это 
соответствует параграфу с адресом B800). Вторая страница,  то 
есть  страница, имеющая номер 1-й, размещается не вплотную за 
первой  страницей  (с  относительного  адреса  4000),   а   с 
ближайшего  адреса  кратного одному килобайту ( относительный 
адрес 4К или 4096 байт). В 80-ти  позиционном  режиме  работы 
дисплея  страницы  размещаются  с интервалом в 4К байтов, а в 
40-позиционном - с интервалом в 2К  байта.  На  рисунке  8.2. 
показано размещение страниц в памяти дисплея. 
     Управление    страничным    механизмом   дисплея   можно
осуществлять в рамках Бэйсика.  Пользователь,  работающий  на
Паскале  такой возможности лишен, если он не выходит за рамки
этого  языкового  процессора;  если  же  связь   с   BIOS-ПЗУ
осуществляется  через программу, написанную на ассемблере, то
эта задача вполне разрешима. В параграфе 8.11 мы покажем  как
это   делается    (готовая   программа  записана  на  дискету,
прилагаемую к настоящей книге).
     Монохромный    дисплей    не     обладает     описанными
функциональными  возможностями,  однако  эта  концепция может
быть   реализована   (имитирована)    в    обычной    памяти.
Пользовательские  программы могут использовать эту память для
хранения  полного  образа  экрана,  своего  рода  эквивалента
дисплейных  страниц.  Эти  пассивные  экранные  образы  можно
переместить в память  дисплея  используя  средства  строковой
пересылки микропроцессора 8086/8088.
     Пользователям,  работающим  на  Паскале, предоставляется 
встроенная процедура MOVESL. Я использовал  эту  процедуру  в 
ряде  своих программ и могу засвидетельствовать, что загрузка 
экрана  происходит  совершенно  незаметно  для  человеческого 
глаза  -  смена  изображения  производится мгновенно, как и в 
случае  смены  страницы  в  цветном   графическом   адаптере. 
Описанный  метод  весьма эффективен - настоятельно рекомендую 
его применять во всех  программах,  не  предъявляющих  особых 
требований к объему используемой памяти. 
     Причина,  по  которой лишь немногие программы используют
страничный механизм цветного графического адаптера  очевидна:
большинство  программ  для  IBM/PC  должны работать одинаково
хорошо как в случае цветного, так  и  в  случае  монохромного
монитора.
     Эффективное  использование  страничного  механизма может
быть  достигнуто  только  в  том   случае,   если   программа
специально   написана   для   применения  в  составе  системы
обработки  графических   образов,    либо   когда   программа
настолько  важна, что можно ожидать подстройку аппаратуры под
нужды этой программы. К числу  известных  примеров  относится
программа Context  MBA.  Следует  также  иметь  в  виду,  что
имитация  описанного  выше  страничного дисплейного механизма
всегда осуществима для  любого  компьютера  IBM/PC,  имеющего
достаточный объем памяти.
     
     
     8.5. Атрибуты изображений
     
     Следом   за  байтом  символа,  расположенного  в  памяти 
дисплея  по  четному  адресу   расположен   байт   атрибутов, 
описывающий  особенности  отображения на экране дисплея этого 
символа. В данном параграфе  мы  рассмотрим  структуру  байта 
атрибутов и назначение всех его компонентов. 
     Программа,  написанная   на   Бэйсике,   приведенная   в
приложении   (листинг   8.1)   демонстрирует   все  возможные
комбинации битов байта атрибутов как для монохромных,  так  и
для  цветных графических дисплеев. В процессе выполнения этой
программы  у   пользователя   формируется   представление   о
функциональных   возможностях   и   особенностях   работы   с
атрибутами изображения.
     Байт атрибутов управляет мерцанием символа и его  цветом
(или монохромным аналогом цвета). Этот байт состоит из восьми
разрядов,  причем  каждому  разряду  отводится  своя  роль  в
процессе  построения  изображения.  На  рисунке 8.3 приведена
схема, иллюстрирующая назначение каждого разряда.  Существует
множество различных способов идентификации отдельных разрядов
байта. Здесь мы будем  придерживаться  схемы  нумерации  этих
разрядов слева-направо (см.рис. 8.3).
     Все  восемь  разрядов  байта  разбиты на четыре класса и 
рассматриваются  в  контексте  этого  разбиения.   Все,   что 
выводится  на  экран  - в конкретную его позицию - состоит из 
двух  компонентов:  собственно  символа  (очертания)  и   его 
окружения  или  фона.  Поскольку  цветной  дисплей  имеет три 
основных цвета (красный, зеленый и  синий),  то  очертанию  и 
фону    соответствуют   по   три   разряда   байта-атрибутов, 
описывающие их цвета (или монохромные аналоги  цвета).  Таким 
образом:  разряды  с  6-го по 8-й управляют цветом символа, а 
разряды с 2-го по 4-й управляют цветом фона. Они  и  образуют 
два класса признаков (из четырех) байта атрибутов. 
     Оставшиеся  два класса признаков фиксируют интенсивность
и мерцание изображения. Под эти признаки отводится по  одному
разряду.  Первый  разряд  каждого  байта  атрибутов описывает
мерцание  фоновой  составляющей  позиции  экрана ( если   бит
установлен  в  1, то имеет место мерцание ). Заметим здесь, что
мерцание распространяется только на фоновую составляющую и не
затрагивает собственно очертания символа.
     Последний  класс  признаков (5-й разряд) байта атрибутов
предназначен для управления  интенсивностью  фона.  Если  5-й
разряд  установлен  в  1,  то  в  случае монохромного дисплея
яркость символа будет повышена;  в  случае  цветного  дисплея
будет  иметь  место  более  яркий  и  светлый  тон. Некоторые
цветные мониторы не используют бит интенсивности  цвета;  для
этих мониторов яркие фоновые цвета совпадают с обычными.
     Для   получения   разнообразных   цветов  соотвествтенно 
устанавливаются или сбрасываются разряды тех или иных цветов. 
Так,  для  получения красного фона следует устанавливать в"1" 
разряд красного цвета (6-й разряд), а два  остальных  разряда 
обнулить.  Комбинация  двух основных цветов дисплея позволяет 
синтезировать дополнительные цвета. Смесь зеленого  и  синего 
цветов  дает сине-зеленый цвет, так называемый циан. Если все 
три разряда находятся в нулевом состоянии,  то  в  результате 
будет  получен  черный  цвет. Смесь всех трех основных цветов 
дает на выходе  белый  цвет.  При  внимательном  рассмотрении 
символов  белого  цвета на цветном экране можно различить все 
три основных цвета. 
     
____________________________________________________________
     Порядковый      Значение *        Функция
     номер раз-
     ряда
____________________________________________________________
     
     1-й               128         Мерцание
     2-й               64          Красная      !   Фоновый
                                   составляющая !    цвет
     3-й               32          Зеленая      !
                                   составляющая !
     4-й               16          Синяя        !
                                   составляющая !
       
     5-й                8          Интенсивность!   Фоновый 
                                                      цвет
     
     6-й                4          Красный      ! Цвет
     7-й                2          Зеленый      ! очертания
     8-й                1          Синий        ! (символа)
     
____________________________________________________________
     
     *)
     Численное  значение  позиции  разряда.  Используется   в
случае  задания  атрибута  в  виде  числа. Например: Мерцание
(128) зеленого  символа (2) на красном (64) фоне - 128 + 2  +
64 = 194
     
     Рис.8.3. Управляющие атрибуты дисплея
     
     Полный  перечень всех возможных цветовых сочетаний будет
приведен   в  следующем  параграфе  .  По  мере  рассмотрения
различных  аспектов,  связанных  с  использованием  атрибутов
изображения мы узнаем много нового, в частности, специфику их
работы как в случае цветного графического,  так  и  в  случае
монохромного адаптера.
     Операционная  система  DOS обеспечивает нормальный режим
работы с белыми символами на черном  фоне  даже  при  наличии
цветного    экрана   видеомонитора.   Большинство   программ,
работающих под управлением DOS, генерируют выходные данные  в
черно-белом варианте. Однако при наличии программы управления
атрибутами  изображения   (например,   программ   Reverse   и
Screen-Atribute   из   библиотеки   "Нортон  Ютилити")  можно
привести  их  к  цветному  варианту.  При  работе  с  цветным
монитором  я  нахожу,  что  ярко-желтые символы на синем фоне
гораэдо меньше утомляют глаза,  чем  любое  другое  сочетание
цветов.  Поэтому  для  себя устанавливаю следующую комбинацию
атрибутов:  00011110  (или  1Е  в  шестнадцатеричной  системе
счисления).  Воспользовавшись программой, написанной на языке
Бэйсик (см. листинг 8.1), Вы имеете  возможность  сопоставить
между  собой все допустимые сочетания цвета очертания символа
и его фона и после этого остановить свой выбор  на  одном  из
них.
     Фирма  IBM  выработала  оригинальный  подход  к  решению 
проблемы  совместимости  монохромного  и  цветного  дисплеев. 
Первое,  что  было  сделано  -  осуществлен  выбор   основных 
технических  решений,  касающихся  цветного  дисплея (наличие 
трех базовых составляющих цвета для очертания символа  и  его 
фона,  а также мерцание и высокая интенсивность); после этого 
средствами  монохромного  дисплея  удалось  добиться   весьма 
эффективной интепретации цветовых составляющих. 
     Атрибуты монохромного дисплея  имеют  ряд  положительных 
качеств,   им   присущи  однако  и  недостатки,  связанные  с 
обеспечением целостности и совместимости. Проиллюстрируем это 
положение  сначала более простыми примерами, а затем перейдем 
к более сложным случаям. 
     Разряд  мерцания  (разряд  1),  как  и  разряд  яркости,
называемый также разрядом повышенной  интенсивности  свечения
(разряд  5),  используется  одинаково  как монохромным, так и
цветным графическим дисплеем. Если разряд мерцания установлен
в единичное состояние, то отображаемый символ мерцает, если в
единичном состоянии находится разряд яркости, то отображаемый
символ выделяется повышенной яркостью.
     Оставшиеся разряды байта атрибутов  специфицируют  цвета 
для   очертания  и  фона  символа.  Заметим  здесь,  что  для 
монохромного дисплея  понятие  цвета  отсутствует.  Последнее 
утверждение  не следует понимать буквально, поскольку, строго 
говоря,    монохромный    дисплей    имеет     два     цвета: 
зеленовато-фосфорный  и  черный. Зеленовато-фосфорный (белый) 
цвет  соответствует  свечению  люминофора,  а   черный   цвет 
свидетельствует   об  отсутствии  свечения.  Любая  возможная 
комбинация цветов очертания  и  фона  в  случае  монохромного 
дисплея  изображена  на экране в виде зеленоватого символа на 
черном фоне. 
     Стандартный  набор  признаков  в   случае   монохромного
дисплея  обеспечивает  режим  отображения  такой  же  как и в
случае цветного графического дисплея, а именно: белые символы
(кодовая  комбинация  разрядов  цветности 111) на черном фоне
(кодовая  комбинация  разрядов  цветности  000);   исключение
составляют  три  особых  случая.  Любой  код  цветности  ( за
исключением  трех  случаев  рассматриваемых  ниже)   вызывает
последствия,  аналогичные стандартному набору признаков, т.е.
свечение зеленоватых символов на черном фоне.
     Два из трех особых  случаев,  представляются  более  или 
менее   очевидными.   Если   кодовая   комбинация   признаков 
соответствует режиму отображения "черное-на черном" (т.е. все 
разряды  цветности  находятся  в нулевом состоянии), то любой 
отображаемый символ становится  невидимым.  Если  же  кодовая 
комбинация   признаков   соответствует   режиму   отображения 
"черное-на-белом"  (разряды  очертания  хранят  код  000,   а 
фоновые  разряды  -  код  111), то имеет место так называемое 
обратное  или  реверсное  изображение  (черные   символы   на 
зеленовато-фосфорном  фоне).  Здесь имеется полная аналогия с 
цветным  дисплеем,  когда  черный  символ  на   черном   фоне 
неразличим,  а  изображение  черного  символа  на  белом фоне 
называется  обратным.   Вполне   естественно   ожидать,   что 
четвертая  комбинация признаков, соответствующая режиму белый 
символ на белом фоне, порождает  невидимые  символы.  Однако, 
фирма  IBM  пошла другим путем. В случае монохромного дисплея 
комбинация признаков байта атрибутов, соответствующая  режиму 
белый   символ   на   белом   фоне,   фактически  сводится  к 
использованию стандартного  формата  изображения  зеленоватых 
символов на черном фоне (аналогично тому, как то происходит в 
случае всех остальных комбинаций цветовых признаков). 
     И  последний  аспект  представления информации на экране
монохромного дисплея  связан  с  возможностью  подчеркивания.
Фирма  IBM предлагает своим пользователм монохромный дисплей,
обладающий возможностью подчеркивания  символов.  В  терминах
признаков   цветности  подчеркивание  представляется  в  виде
синего очертания (код цветности  001)  и  черного  фона  (код
цветности  000).  Собственно  цветной  графический адаптер не
предусматривает реализации функции подчеркивания, однако  сам
факт  использования  синих  символов  на  черном фоне создает
впечатление некоторого акцентирования.
     Поскольку  монохромный  дисплей  допускает представление 
обратных   изображений  и  реализует  функцию  подчеркивания, 
можно  ожидать,  что  допустимо  их сочетание в рамках одного 
кадра. Однако это не так. Цветовые комбинации, которые  можно 
было  бы  здесь  использовать (синий символ на белом фоне или 
черный символ на синем фоне), интерпретируется  системой  как 
стандартные,   ничем   не  отличающиеся  от  других  цветовых 
комбинаций. 
     
     
     8.6. Особенности воспроизведения цвета
     
     В  данном  параграфе мы рассмотрим различные особенности
воспроизведения цвета на  цветном  видеомониторе,  снабженном
цветным  графическим  адаптером.  Следует  иметь  в виду, что
черно-белый  монитор с цветным графическим адаптером цвет  не
воспроизводит.  Здесь  следует  также  отметить,  что  многие
широко распространенные  черно-белые  мониторы  не  корректно
воспринимают    сигналы    цветного    изображения,   поэтому
информация, содержащая цветовые  компоненты  и  выводимая  на
черно-белый монитор, может оказаться искаженной или невидимой.
     Теоретически    цветной    дисплей   компьютера   IBM/PC
воспроизводит  шестнадцать  различных   цветов.   Это   число
получается   следующим  образом.  Во-первых,  имеется  восемь
различных  цветовых  сочетаний,  образуемых  тремя  основными
цветами  -  красным,  зеленым  и синим. Во-вторых, любой цвет
очертания символа может быть воспроизведен в двух режимах;  в
режиме нормальной и в режиме повышенной яркости (цвет высокой
интенсивности). Управление этими  режимами  осуществляется  с
помощью   бита   интенсивности.  Таким  образом,  допускается
воспроизведение шестнадцати цветов при отображении  очертания
символа и восьми цветов при отображении фона. 
     (Графический режим, который будет рассмотрен в следующей
главе  также  допускает  использование  шестнадцати   цветов,
однако  особенности  их использования для очертания символа и
его фона существенно отличаются).
     Все  шестнадцать   цветов   на   практике   никогда   не
используются.  Один  из  восьми  основных  цветов - черный; в
связи  с  этим  неясно,  что  такое  черный  цвет  повышенной
яркости. Фирма IBM называет этот цвет темно серым. В принципе
этот цвет можно воспроизвести  на  экране  цветного  дисплея,
однако  делается  это весьма редко. Таким образом, количество
цветов уменьшается до пятнадцати. Если же  учитывать, что  не
все  цветные  мониторы  используют бит яркости, то количество
воспроизводимых  цветов  ограничивается   только   основными.
Фактически  это  число  еще  меньше - только семь - поскольку
черный цвет используется редко.
     Ниже  приводятся  все  шестнадцать  комбинаций   цветов,
обеспечиваемых 4-мя разрядами, включающими разряд яркости или
повышенной интенсивности свечения.
     
____________________________________________________________
 Яркость  Красный  Зеленый  Синий  Номер  Цвет    Примечание
____________________________________________________________
     0       0        0       0     0     Черный !Изображе-
                                                 !ние отсу-
                                                 !тствует
     0       0        0       1     1     Синий  !
     0       0        1       0     2     Зеленый!
     0       0        1       1     3     Циан   !Сине-зеле-
                                                 !ный
     0       1        0       0     4     Красный!
     0       1        0       1     5     Пурпур-!Светло-
                                          ный    !пурпурный,
                                                 !состоящий
                                                 !из красно-
                                                 !го и сине-
                                                 !го
     0       1        1       0     6     Корич- !Темно-жел-
                                          невый  !тый; для 
                                                 !большинст-
                                                 !ва диспле-
                                                 !ев - жел-
                                                 !тый
     0      1         1       1     7     Светло-!Обычный
                                          серый  !белый
     1      0         0       0     8     Темно- !Черный,
                                          серый  !повышенной
                                                 !яркости
                                                 ! (!?)
     1     0          0       1     9     Светло-!
                                          синий  !
     1     0          1       0    10     Светло-!
                                          зеленый!
     1     0          1       1    11     Циан   !Сине-зеле-
                                          светлый!ный, свет-
                                                 !лый
     1     1          0       0    12     Светло-!
                                          красный!
     1     1          0       1    13     Светло !
                                          пурпур-!
                                          ный    !
     1     1          1       0    14     Желтый !Светло-  
                                                 !желтый
     1     1          1       1    15     Белый  !Белый, 
                                                 !повышенной
                                                 !яркости
_____________________________________________________________
     
     В  столбце  "номер"  указывается  числовое   обозначение 
цвета,  используемое в языке Бейсик. Числа от 16 до 31 служат 
для обозначения тех же цветов, что и числа от 0 до 15,  число 
16 добавляется для установки атрибута мерцания. 
     Для   формирования   у   пользователя   более   строгого
представления об использовании цвета  в  программах, приведем
здесь краткие сведения о цветовых возможностях видеоминитора.
     Каждый   пользователь  должен  отдавать  себе  отчет  в
особенностях воспроизведения цвета повышенной  интенсивности.
Такие   цвета   как   циан   и   пурпурный   зрительно  могут
восприниматься как более интенсивные, но поскольку они  вдвое
ярче  основных  цветов  (красного, зеленого и синего), то они
воспринимаются сравнительно  блеклыми.  Напомним  здесь,  что
яркость - это количество испускаемого света. Количество света
еще не говорит о насыщенности цвета - чаще всего это  говорит
о  размытости  цвета. В то же время в отношении желтого цвета
справедливо следующее утверждение - чем ярче цвет,  тем  выше
его   насыщенность   (интенсивность).  Желтый  цвет,  подобно
красному, зеленому и синему представляет особый цвет.
     Комфортность восприятия цвета меняется в зависимости  от
качества   экрана  дисплея  и  от  специфики  реакции  глаза.
Большинство пользователей, как нам  представляется,  считают,
что  синий,  красный,  желтый и, возможно, черный относятся к
ортогональным цветам, обеспечивающим наибольшую  комфортность
восприятия.  Следующими  (на  шкале комфортности  восприятия)
цветами являются зеленый и пурпурный. И последними  в  списке
наиболее комфортных цветов являются циан и белый.
     Каждый,   кто  имеет  серьезные  намерения  в  отношении
цветовых  возможностей  IBM/PC  должен  довольно  внимательно
отнестись  к  выбору  цвета и (по возможности) проверить свои
решения на нескольких экранах различных типов. Неверный выбор
может осложнить восприятие информации с экрана дисплея.
     
     
     8.7. Режим прямого управления видеомонитором
     
     Существует  два основных способа  отображения информации
на экране компьютера IBM/PC.
     Первый   способ,  который  я  буду  называть  косвенным, 
состоит  в  использовании  копии  изображения,  хранящейся  в 
памяти  дисплея.  Фирма IBM, однако относится к этому способу 
неодобрительно.   В   первой    редакции    руководства    по 
программированию  этот  способ  рассматривается  как  образец 
"дурного  тона"  в  программировании,   поскольку   программы 
становятся  зависимыми  от  аппаратных особенностей IBM/PC. В 
случае замены типа дисплея (что является вполне реальным,(см. 
параграф  8.2)  или  какой-либо  иной  аппаратной модификации 
пользовательские программы подлежат модификации. 
     Наиболее эффективный  способ  генерации  изображения  на 
экране  дисплея  состоит в использовании функций обслуживания 
BIOS; в этом случае при любых модификациях  компьютера  (либо 
для    последующих    моделей    IBM/PC)   фирмы-изготовители 
позаботятся о внесении соответствующих  изменений  в  BIOS  с 
тем,  чтобы  пользовательские программы остались неизменными. 
Следует однако отметить, что функции  обслуживания  BIOS-ПЗУ, 
ориентированные на работу с дисплеями, не вполне корректны; я 
даже считаю их малопригодными. Во многом это объясняется тем, 
что  любая  мало-мальски  серьезная  программа  обходит  их и 
работает  непосредственно   с   памятью   дисплея,   хранящей 
изображение.  В  отличие от точки зрения фирмы IBM на "дурной 
тон" в программировании, я считаю  что  использование  памяти 
дисплея,  хранящей  кодированную  копию  изображения,  вполне 
обоснованным решением в случае потребности получения  быстрых 
и   сложных  изображений.  Генерация  изображения  на  экране 
дисплея  с  помощью  адекватного   образа   памяти   обладает 
огромными  преимуществами.  Изображение  формируется  быстро, 
непосредственно  и  весьма  эффективно.   Процесс   генерации
протекает   достаточно   просто.   Программа,  приведенная  в
приложении 8.1,  иллюстрирует  особенности  реализации  этого
процесса  на  языке  Бейсик, а текст программы приложения 8.2
содержит  ряд  процедур  обслуживания,  предназначенных   для
прямого  обмена  с  памятью  дисплея  программ, написанных на
языке Паскаль. Эти процедуры могут использоваться в  качестве
базиса  для  любых  программ обмена с дисплеем, написанных на
Паскале, или большинстве других языков.
     Принцип работы таких программ весьма прост -  во-первых,
программе  необходимо  сообщить тип дисплея - монохромный или
цветной. Это можно сделать двумя способами: либо путем опроса
пользователя  (программа  в  процессе  своей настройки задает
пользователю прямой вопрос), либо путем  опроса  операционной
системы (программа в этом случае получает доступ к внутренним
таблицам операционной системы, содержащим  сведения  о  типах
устройств).
     Используя функцию обслуживания BIOS-ПЗУ (рассматривается 
в  разделе  8.11),   можно   получить   информацию   о   типе 
используемого   дисплея.   Это  наиболее  эффективный  способ 
настройки программ. 
     После определения типа дисплея  необходимо  сформировать 
ссылку  (указатель)  на  соответствующий  участок  памяти;  в 
случае монохромного  адаптера  это  адрес  шестнадцатеричного 
параграфа  B000,  а  случае  цветного графического адаптера - 
B800. В рамках языка Бейсика это можно осуществить с  помощью 
оператора   DEF   SEG.В   Паскале   это  делается  с  помощью 
сегментированных   типов.   Любой   из   названных   способов 
осуществим весьма просто. 
     Поскольку  пользователь  имеет  возможность обращаться к
памяти дисплея, то тем самым у него появляется возможность  с
одной стороны отображать на экране нужную ему информацию, а с
другой стороны он  имеет  возможность  считать  то,  что  уже
отображено.
     Единственное   возникающее   при   этом   осложнение   - 
относительная  адресация.   Пользователь   обязан   учитывать 
наличие  байтов-атрибутов  (размещаются по нечетным адресам); 
если необходимо принимать в расчет разбивку экрана на строки, 
то  программы  должны  выполнить  соответствующие вычисления. 
Если используется страничный механизм дисплея, то следует так 
же   учитывать  особенности  размещения  страниц  его  адреса 
кратным 2К и 4К. 
     В приложении  8.2  приведены  наиболее  распространенные 
модули,  требуемые  для  программирования  на  Паскале.  Если 
возникает потребность в дополнительных модулях, то они  могут 
быть  легко  добавлены  к существующим по уже известной схеме 
(см. приложение 8.2). 
     
     
     8.8. Управление  курсором
     
     Курсор    представляет    собой    важнейший   компонент
видеодисплея. Обычно он используется  в  качестве  индикатора
местоположения  символа, вводимого  с  клавиатуры, однако  он
используется  также  и  в  качестве  указателя  на   объекты,
расположенные  на  экране.  В  данном параграфе мы рассмотрим
принцип управления курсором. Первое, о чем  мне  хотелось  бы
здесь  сказать, связано  с  тем,  что мерцающий курсор IBM/PC
может оказаться неприемлемым для многих пользователей.
     Рассмотрим некоторые альтернативные варианты.
     В связи с использованием  мерцающего  курсора  возникает 
ряд  проблем  чисто  зрительного восприятия. Компьютер IBM/PC 
имеет курсор стандартной формы, появляющиеся  на  экране  при 
включении  компьютера  в  электрическую  сеть;  это небольшое 
мерцающее  пятно,   расположенное   ниже   позиции   символа. 
Некоторые  считают,  что  такой  курсор  трудно  отыскать  на 
экране, заполненном информацией . 
     Существует возможность увеличить размер  курсора, доведя
его   до   размера  символа.  В  качестве  образца  процедуры
увеличения  размера  курсора  до  половины  размера   символа
следует  запустить  интерпретатор  с  языка  Бейсик  и нажать
клавишу Insert (Вставка). С помощью  оператора  LOCATE  можно
установить любой размер курсора. Но при этом оказывается, что
большой  мерцающий  курсор  действует  на   глаз   утомляюще,
особенно при длительной работе. 
     Мерцающий  курсор  можно  использовать  двумя способами.
Первый  способ связан  с  использованием  атрибута  обратного
изображения   (шестнадцатеричный  код  70)  в  отношении  той
позиции экрана, в которой находится  курсор.  В  этом  случае
генерируется  большое  световое пятно, на фоне которого виден
символ; таким образом,  возникает  сплошной  (имеющий  размер
символа)   немерцающий  курсор.  Курсор  такого  типа  хорошо
воспринимается в зрительном плане и не действует утомляюще на
глаз.   В  тех  случаях,  когда  Бейсик  работает  с  цветным
графическим монитором в графическом режиме, оказывается,  что
курсор генерируется сходным образом. Объясняется это тем, что
графический режим не  предусматривает  аппаратной  реализации
мерцающего   курсора,  поэтому  Бейсик  вынужден  имитировать
курсор. Но даже в тех случаях, когда  предусмотрен  мерцающий
курсор,    реверсивное    изображение   считается   наилучшим
способом представления курсора  (здесь  уместно заметить, что
текстовый  редактор,  использованный  при подготовке рукописи
этой книги (Vedit), имеет именно такой курсор).
     Второй способ использования  курсора  особенно  уместен,
когда  программа выводит на экран перечни (списки) каких-либо
информационных объектов. Назначение курсора состоит не только
в  фиксации  на  экране позиции табуляции (позиции размещения
символа), но также и в реализации процедуры выбора. Последнее
характерно  для  программ  обработки  меню,  списков файлов и
вообще наборов альтернативных вариантов. Для таких случаев  я
бы  предложил  использовать  два  символа  "стрелки",  именно
CHR$(16) для стрелки, направленной  вправо,  и  CHR$(17)  для
стрелки,   направленной  влево.  (Входящая  в  состав  пакета
программ, прилагаемого к данной книге, программа DiskLook,  а
также  многие  другие  программы  из  числа  "Нортон Ютилити"
используют правую стрелку).
     Если задача генерации искусственного курсора  не  стоит,
то  задача  управления курсором практически возникает всегда.
Впрочем,  в  случае  искусственного  создания  курсора  может
возникнуть  потребность  вообще  убрать  его с экрана. Курсор
обладает  двумя  характеристиками,  подлежащими   управлению:
размером и позицией.
     В     случае    аппаратно-генерируемого    курсора    он
представляется в виде совокупности мерцающих строк  из  числа
строк  развертки, генерирующих отображаемый символ. Поскольку
строки,  из  которых  он  состоит,   не   могут   управляться
независимо,  то  у пользователя имеется возможность управлять
лишь группой мерцающих строк. Монохромный  дисплей  имеет  13
строк   развертки,   а   цветной  графический  -  7.  Принято
нумеровать строки сверху, начиная с 0 и  вплоть  до  13  (для
монохромного  дисплея)  или  до  7  (для  цветного  дисплея).
Стандартное положение курсора (в момент запуска IBM/PC) -  12
и  13-я  строки  для  монохромного  дисплея  и 7-я строка для
цветного графического дисплея.
     Пользователь имеет возможность задать положение  курсора
путем  выделения  произвольного количества этих строк, указав
начальный и конечный номер  строк  развертки.  Курсор,  таким
образом,  может  быть  полноразмерным  или  занимать верхнюю,
среднюю и нижнюю часть позиции символа.
     Если  номер  начальной  строки  больше  номера  конечной 
строки (например: начальная строка имеет номер 12, а конечная 
строка номер 2), то курсор будет образован следующим образом: 
используются   строки  развертки,  начинающиеся  с  начальной 
строки вплоть до  конечной  строки,  а  затем  берутся  самые 
верхние  строки,  вплоть  до  конечной строки. Таким образом, 
генерируется курсор весьма причудливой  формы,  состоящий  из 
двух   частей  -  верхней  и  нижней.  Это  весьма  необычная 
конструкция, и у Вас может возникнуть желание  посмотреть  на 
нее;  я  бы, однако, рекомендовал хорошо подумать, прежде чем 
предлагать такое решение пользователям Ваших программ. 
     При необходимости генерации составного  курсора  следует
запустить интерпретатор языка Бейсик и ввести команду
     
     LOCATE ,,, 6,2
     
     В результате на экране появится составной курсор и могут
быть выполнены действия по модификации его  размеров.  Вторым
управляемым  параметром  курсора является его местоположение.
Курсор может быть  расположен  в  любой  строке  или  столбце
экрана  дисплея,  кроме  того,  его  можно  скрыть,  поместив
в несуществующую строку 26. С помощью оператора LOCATE  (язык
Бейсик)  можно  управлять  обоими  параметрами. Для остальных
языков это не так. Многие пользователи языка Паскаль считают,
что отсутствие средств управления курсором является серьезным
недостатком данной версии языка.
     На  дискете,  прилагаемой  к  данной  книге,  содержатся
процедуры,  написанные  на  языке  ассемблера; с помощью этих
процедур  может  быть  осуществлен  доступ  к   курсору   или
реализовано  управление  им в рамках языка Паскаль или любого
другого языка. Особенности реализации этих процедур описаны в
параграфе   8.11;   там   же  приведены  и  другие  сведения,
касающиеся обращения к BIOS-ПЗУ для видеодоступа. 

     
     8.9.  Стандартный режим управления видеомонитором

     
     Стандартный (или штатный)  режим  доступа  к  информации
предполагает,  что  генерация  изображений осуществляется без
модификации    содержимого    участка    памяти,    хранящего
закодированный   образ   экрана.   В   параграфе  8.11  будет
рассмотрена возможность  такого   доступа, используя  функции
обслуживания  BIOS-ПЗУ.  В  связи с этим мне все-таки неясно,
почему все стремятся использовать именно функции обслуживания
(исключение    составляют    пользователи,    работающие   на
ассемблере), несмотря  на  то,  что  средства  вывода  языков
высокого   уровня   (Паскаль   и   другие)  обладают   явными
преимуществами.
     В случае использования средств  вывода  языков  высокого
уровня  (Паскаль  и другие) возникает одна особенность. Вывод
информации всегда осуществляется с учетом положения  курсора.
Поэтому, если производится манипулирование курсором с помощью
функций обслуживания BIOS-ПЗУ, описываемых в параграфе  8.11,
то это вполне согласится  со спецификой работы средств вывода
языков высокого уровня.
     Таким образом, всегда следует  придерживаться  разумного
сочетания    двух    основополагающих    принципов    работы:
использование средств вывода базового языка  программирования
и   достижения   на  этой  основе  высокого  уровня  контроля
отображаемых   данных   и    отказ    от    непосредственного
использования  кодированного  образа экрана в памяти дисплея.
     Придерживаясь  этих  концепций,  можно  достичь высокого
уровня контроля за отображаемой информацией (в первую очередь
это  относится  к  атрибутам  отображения); это может служить
хорошей  основой  для   построения   высокомобильных   систем
программного обеспечения для персональных компьютеров.
     
     
     8.10. Псевдографическиц режим
     
     
     Символьная графика, или псевдографика представляет собой
интересную   и   эффективную    альтернативу    использованию
полномаштабных графических возможностей цветного графического
дисплея.Программы,  написанные  в  расчете  на  использование
псевдографических возможностей имеют важное преимущество, они
не зависят от типа  используемого  дисплея  (черно-белый  или
цветной графический).
     Под  псевдографическими  изображениями  понимаются такие
изображения,   которые   создаются   на   базе   расширенного
символьного   набора   кода  ASCII.  Следом  за  стандартными
символами ASCII (первые 128  символов)  расположены  еще  128
символов, имеющих особую конфигурацию. Примерно половина этих
символов предназначена для представления чертежей и рисунков.
     Прежде всего речь идет о прямых.  В  ASCII  предусмотрен
полный   набор   символов,  позволяющих  вычерчивать  контуры
прямоугольников,  диаграмм  и  схем  одиночными  и   двойными
линиями.     Многие    программы    для    IBM/PC,    включая
демонстрационные   программы,   написанные   на   Бейсике   и
поставляемые   в   составе  DOS,  используют  символы  прямых,
поэтому многим они знакомы.
     
     
     8.11 Средства управления видеотерминалом уровня BIOS-ПЗУ

     
     Ниже  описываются  функции  обслуживания  видеомонитора,
реализуемые средствами BIOS-ПЗУ. Ряд этих функций относится к
графическим  режимам,  которые  будут  детально рассмотрены в
следующей главе; здесь мы опишем их лишь вкратце.
     Существует категория читателей, которые  непосредственно
не будет использовать функции обслуживания, им важно понимать
принципы и возможности системы.
     BIOS-ПЗУ предлагает пользователю  шестнадцать  различных
функций   обслуживания  для  видеомониторов.  Доступ  к  этим
функциям осуществляется через прерывание с номером 16(10/16).
В  данном  параграфе  мы  рассмотрим  все  эти  прерывания  и
осмыслим   их   назначение.   Программы   8.101   и    8.102,
расположенные   на   дискете,  прилагаемой  к  данной  книге,
представляют собой процедуры, написанные на языке  ассемблера
(процедуры   первого   уровня),  для  обращения  к   функциям
обслуживания видеодисплея, реализуемым  с  помощью  BIOS-ПЗУ;
кроме  того, они  содержат  определения  Паскаля  и процедуры
второго уровня, предназначенные для облегчения  использования
первых.
     Первая  процедура  обслуживания  видеомонитора имеет код
обслуживания 0, она используется для фиксации  режима  работы
видеомонитора.   Возможны  восемь  различных  режимов  работы
видеомонитора, причем семь режимов ориентированы  на  цветной
графический  дисплей,  а один на монохромный. Ниже приводится
список  режимов  работы  (в  дальнейшем  мы   прокомментируем
позиции этого списка).
     
____________________________________________________________
     Код                          Режим 
____________________________________________________________
     
     0       Текстовый,  40-позиционный,   черно-белый  (цвет  
             подавлен) режим  для цветного графического дисп-
             лея
     1       Текстовый,  40-позиционный,   цветной  режим для
             цветного графического дисплея
     2       Текстовый,  80-позиционный,   черно-белый  (цвет 
             подавлен) режим для цветного графического  дисп-
             лея
     3       Текстовый,  80-позиционный,   цветной  режим для 
             цветного графического дисплея
     4       Графический, 320 х 200 пикселей,  цветной  режим
             для цветного графического дисплея
     6       Графический, 640 х 200 пикселей, черно-белый ре-
             жим для цветного графического дисплея
     7       Режим монохромного дисплея
     
____________________________________________________________
     
     При  наличии  цветного  графического  адаптера с помощью
указанных функций обслуживания довольно просто обеспечивается
переключение  режима.  Можно  было  бы  предположить, что при
наличии  двух  адаптеров  эта  сервисная  функция   обеспечит
переключение  одного  активного  дисплея  на  другой,  но,  к
сожалению, это не так. В  BIOS-ПЗУ  предусмотрен  специальный
признак, который отмечает факт наличия монохромного адаптера;
если монохромный адаптер подключен, то BIOS  блокирует  любой
запрос,   связанный   с   переключением   в   режим  цветного
графического дисплея. Система, включающая в свой  состав  два
видеомонитора  может переключаться с одного дисплея на второй
лишь с помощью специальных кодовых комбинаций  (эти  сведения
только  недавно  опубликованы  фирмой  IBM).  Что же касается
одновременной активизации обоих дисплеев, то  это,  насколько
мне известно, попросту невозможно.
     Черно-белые  текстовые  режимы  (коды  0  и  2) работают
аналогично соответствующим цветным режимам, но с  блокировкой
цветности.  Смысл,  вкладываемый  в термин "пиксель", а также
сведения о разрешающей способности графических режимов  будут
приведены в следующей главе.
     Вторая функция обслуживания  (код  1)  используется  для 
установки  размера  курсора.  Как  уже  указывалось  ранее  - 
конфигурация и размер корсора фиксируются  путем  определения 
начальной и конечной строк развертки позиции курсора. Верхняя 
строка развертки имеет номер 0, а нижняя строка  развертки  - 
номер  7 (для цветного графического режима) или номер 13 (для 
монохромного режима).  Если  номер  начальной  строки  больше 
номера   конечной  строки,  то  генерируется  (двух)составной 
курсор. Особенности управления курсором описаны  в  параграфе 
8.8. 
     Третья  функция  обслуживания  (код  2) используется для 
перемещения  курсора.  Положение  курсора  описывается  тремя 
параметрами  -  строка,  позиция (столбец) и страница. Отсчет 
строк и позиций  начинается  с  первого  знакоместа  (верхний 
левый   угол   экрана),  имеющего  номер  0.  Если  возникает 
необходимость использовать  нумерацию  от  1  до  25  (вместо 
нумерации  от  0 до 24), то пользовательская программа должна 
выполнить  пересчет  номеров;   программы   обслуживания   на 
Паскале, приведенные в приложении 8.102, реализуют именно эту 
функцию. Номер страницы (памяти дисплея) используется  только 
в  случае  текстового  режима  работы  цветного  графического 
адаптера; при  работе  с  монохромным  дисплеем,  а  также  в 
графических  режимах  номер страницы должен быть установлен в 
0. Курсор можно вывести вообще за  пределы  экрана  и,  таким 
образом,  сделать  его невидимым. Для этого я бы рекомендовал 
использовать первую  позицию  строки,  выходящую  за  пределы 
максимально  возможной  (если,  например,  нумерация  строк и 
позиций ведется с 1, то следует указать первую  позицию  26-й 
строки). 
     Положение  курсора  фиксируется  путем  занесения номера
строки в регистр DH, а номера позиции (столбца) в регистр DL.
Нумерация  строк позиций начинается с нулевых координат (0,0)
верхнего левого угла экрана. В графических режимах  положение
курсора    также    описывается    в    терминах    координат
"строка-позиция"; координаты  пикселя  не  используются.  Для
нумерации  страниц  используются числа 0 - 7  (40-позиционный
режим) или 0 - 3  (80  позиционный  режим).  Для  графических
режимов номер страницы должен быть равным 0.
     Ниже   приведены   обобщенные   сведения   о  содержимом
регистров при обращении к функции обслуживания 2.
     
____________________________________________________________
     Номер функции                  Параметры
      обслуживания                  (регистры)
      (регистры)
____________________________________________________________
        
          AH= 2          DH = номер строки
                         DL = номер позиции
                         BH = номер страницы
                         (для графических режимов равен 0)
____________________________________________________________
     
     Здесь уместно сделать одно важное замечание,  касающееся
работы в цветном  графическом  многостраничном  режиме.  Если
возникает  потребность  в  перемещении  курсора,  то  следует
специфицировать   страницу   -   таким   образом  исключается
возможность поместить  курсор  в  текущую  активную  страницу
дисплея;   любая  другая  страница  в  этом  смысле  является
доступной.  Каждая  страница  имеет  собственное   логическое
местоположение  курсора.  Некоторые  функции обслуживания (из
числа  перечисляемых  ниже),  применимые   к  любой  странице
изображения   ,  действуют  относительно  положения  курсора.
Положение курсора фиксируется для каждой страницы изображения.
     Четвертая   функция   обслуживания   (имеющая   код   3) 
предназначена для считывания положения курсора и его размера. 
В   каком-то   смысле   она   реализует  процедуру,  обратную 
процедуре,   реализуемой   совместным   использованием   двух 
предшествующих  функций  обслуживания.  Здесь  также  следует 
специфицировать  страницу   изображения;   для   монохромного 
дисплея,  а  также  для  графических  режимов ее номер должен 
равняться 0. В  результате  выполнения  функции  пользователь 
получает  номера  строки  и  позиции  курсора, а также номера 
начальной и конечной строки  развертки,  формирующие  курсор. 
Ниже приводятся сведения о составе и содержимом регистров. 
     1 Номер начальной строки должен быть загружен в  регистр
CH,  а номер конечной строки - в регистр CL. По умолчанию для
монохромного адаптера устанавливаются следующие значения CH =
12, CL = 13.
     Здесь  уместно  заметить, что для номеров строк отведено
только три байта (0 - 2) в указанных  регистрах.  Если  пятый
бит  регистра  CH  установлен в состояние "1" (т.е. в регистр
загружено значение 32), то курсор исчезает.  При  переходе  в
графический  режим  этот  бит  автоматически  устанавливается
равным 1, с тем чтобы курсор не  мешал  графическому  выводу.
Этот   прием  также  можно  использовать  для  искусственного
удаления курсора. Поскольку в графических режимах операции  с
курсором  аппаратно  не  поддерживаются, то речь может идти о
его  имитации  с  помощью  символа   CH$(223)   и   изменения
атрибутов фона.
     
____________________________________________________________
     Номер функции                  Параметры
      обслуживания
____________________________________________________________
     
          AH= 1         CH = начальная строка курсора
                        CL =  конечная строка курсора
          AH= 3         BH = номер страницы (для графических
                             режимов устанавливается равным
                             0)
                        DH = номер строки
                        DL = номер позиции (столбца)
                        CH = ночальная строка развертки кур-
                             сора
                        CL = конечная строка развертки кур-
                             сора
     
____________________________________________________________     

     
     Пятая   функция   обслуживания   (функция   с  кодом  4)
предназначена  для  считывания   местоположения,   указанного
световым  пером  (  для  систем,  имеющих  световое  перо). В
результате выполнения фиксируется факт подключения  светового
пера;  если  световое  перо  подключено, то фиксируется также
положение указанной точки. Положение задается как в  терминах
символов,  так  и  в терминах  пикселей (этот вопрос подробно
обсуждается в следующей главе, посвященной графике).
     Регистр  AH  предназначен  для   индикации   подключения
светового  пера:  если  AH=1,  то  световое перо поключено, в
противном  случае  (AH=0),  световое  перо  не  используется.
Положение  объекта,  вычлененного  с  помощью  светового пера
формируется  либо  в  виде  содержимого  регистров   CH,   BX
(положение   пикселя).  Поскольку  величина,  соответствующая
(горизонтальной) позиции пикселя может превышать 255, то  для
нее отводится полное слово (регистр BX).
     Ниже   приводятся   сведения   о  составе  и  содержимом
регистров.
     
____________________________________________________________
     Номер функции               Параметры
      обслуживания
____________________________________________________________
     
         AH = 4         DH = номер строки символов
                        DL = номер позиции (столбца)символа
                        CH = номер строки пикселей
                                  (0 - 199)
                        BX = номер позиции (столбца) пикселя

____________________________________________________________
     
     
     Световое   перо   не   относится   к   числу    наиболее
распространенных  аппаратных  средств  для IBM/PC. Это своего
рода  сдерживающий  фактор,  поскольку  может  использоваться
только   с   дисплеями,   обладающими  очень  малым  временем
послесвечения люминофора,  т.е.  такими  дисплея,  у  которых
светимость   точки   быстро  падает  после  перемещения  луча
развертки в следующую  точку  экрана.  Такие  дисплеи  быстро
утомляют оператора.  Поэтому  хорошие  дисплеи  не  нуждаются
в   световом   пере.   Для  монохромного  дисплея  фирмы  IBM
применяется фосфорный дисплей  с  длительным  послесвечением,
облегчающий   восприятие   изображений.  Можно  считать,  что
световое  перо   получит  ограниченное   распространение   (в
основном  для  специальных  приложений)  в сфере персональных
компьютеров.
     Шестая  функция  обслуживания  (функция   с   кодом   5) 
используется  для установки (подключения) активной страницы в 
многостраничном  текстовом   режиме   цветного   графического 
дисплея.   Номер   страницы   задается  в  регистре  AL.  Для 
40-позиционных режимов номера страницы лежат в диапазоне 0  - 
7,  а  для  80  позиционных  режимов  - в диапазоне 0 - 4. По 
умолчанию номер страницы принимается равным 0.  Эта  страница 
помещается   в   самом   начале   памяти  дисплея,  а  каждая 
последующая страница с интервалом в 2К  (для  40  позиционных 
режимов)  или через 4К (для 80 позиционных режимов). Большему 
номеру  страницы  соответствуют  ячейки  памяти  с   большими 
адресами. 
     
____________________________________________________________
     Номер функции                    Параметры
      обслуживания
____________________________________________________________
     
        AH = 5           AL = номер новой страницы дисплея 
                              (0 - 3 для режимов 2 и 3, 0 -
                              7 для режимов 0 и 1)
____________________________________________________________
     
     Две следующих функции обслуживания /функции с кодами 6 и 
7/   используются   для   реализации    режима    "прокрутки" 
(скроллинга)  информации  на  экране  дисплея.  Использование 
компьютера IBM/PC в  режиме  "прокрутки"  представляет  собой 
одну  из  интереснейших  возможностей отображения информации, 
однако лишь немногие программы, используюь эту возможность. В 
режиме  "прокрутки"  можно перемесить содержимое экрана вверх 
или сниз на любое число строк. При этом отображаемые  символы 
смещаются  за пределы экрана вверх или вниз, а освободившаяся 
часть экрана заполняется пустыми строками. Особенность  этого 
режима  отображения  состоит  в  том, что в роли экрана может 
выступать произвольная прямоугольная область  экрана  (окно), 
на  которую  распространяется  "прокрутка"; остальные участки 
экрана остаются неизменными. Выделив  несколько  окон,  можно 
организовать  в  каждом из них режим "прокрутки". Возможности 
обработки    данных    здесь    огромные,    остается    лишь 
недоумевать, почему большинство программ их редко используют. 
     Функция с кодом 6 предназначена для "прокрутки" вверх, а
функция  с  кодом  7  предназначена для "прокрутки" вниз. И в
том,  и  в  другом  случае   следует   специфицировать    два
противоположных  угла  окна  - верхний левый и нижний правый.
Спецификация задается в терминавх строк и  столбцов.  Следует
также  задать  число  перемещаемых  строк;  это  число  может
совпадать с размером окна. И последний об'ект спецификации  -
атрибут   отображения   строк  заполнителей.  Таким  образом,
имеется возможность управлять цветом окна.  Если  планируется
использование   техники  работы  с  окнами,  то  имеет  смысл
выделить окно путем приписывания  ему  атрибута  отображения,
отличного  от атрибута отображения всего остального экрана. С
помощью механизма прокрутки текст  сообщения  не  может  быть
помещен  в  новые  строки  окна  -  для этого следует принять
специальные меры.
     Число перемещаемых строк указывается в регистре AL. Если
AL=0,  то  все окно заполняется пустыми строками (то же самое
происходит, если число перемещаемых строк  превышает  размеры
окна).  Положение  и размер окна указываются в регистрах CX и
DX: в CH указывается верхняя строка, а в DH -  нижняя;  в  CL
указывается левая позиция (столбец, а в DL - правый. Атрибуты
изображения пустых строк  указываются  в  регистре  BH.  Ниже
приводятся общие сведения о составе и содержимом регистров.
     
____________________________________________________________
     Номер функции                      Параметры
     обслуживания
____________________________________________________________
     
        AH = 6         AL = количество сдвигаемых строк
                       CH = номер строки верхнего левого
                            угла окна
                       CL = номер позиции (столбца) верхнего
                            левого угла окна
                       DH = номер строки нижнего правого угла
                            окна
                       DL = номер позиции (столбца) нижнего
                            правого угла окна
                       BH = атрибуты изображения пустых 
                            строк
____________________________________________________________
     
     
       "Прокрутка"  содержимого окна как правило выполняется 
  в два этапа. Как только новая строка подготовлена к записи 
  в  окно, осуществляется вызов функции обслуживания с кодом 
  6 (или 7) для перемещения текущего содержимого окна. После 
  этого  в  новую  строку  заносится  нужная информация. Для 
  этого   используются   функции   обслуживания   "установка 
  курсора"  и  "запись  символа".  Ниже  приводится  пример, 
  иллюстрирующий излагаемые положения. 
     DEBUG; вызов программы-отладчика DEBUG
       A
     INT 10; вызов  Ассемблеоа
     [Return]; выход из Ассемблера
     R  AX; извлечение содержимого регистра AX  для  просмот-
            ра и изменения
     06 03; установка функции обслуживания с  кодом 6,  коли-
            чество сдвигаемых строк 3
     R  CX; извлечение  содержимого регистра CX для  просмот-
             ра  и изменения
     050A;  установка верхнего левого угла: строка 5, столбец
            10
     R  DX; извлечение содержимого регистра DX для  просмотра 
            и изменения
     1020;  установка  правого нижнего угла: строка 16, стол-
            бец 32
     D  0  L 180; заполнение экрана
     G  100 102; выполнение прерывания 10, стоп.
     
     Следующие три  функции  обслуживания  предназначены  для 
манипулирования    символами.    С   помощью   этих   функций 
осуществляются операции  ввода-вывода  без  непосредственного 
обращения  из  пользовательских  программ  к области памяти,в 
которой хранится закодированный образ экрана дисплея. В связи 
с  уже  упоминавшимся  ранее  аспектами  вывода информации на 
экран дисплея путем прямой  модификации  содержимого  памяти, 
хранящей  копию  изображения,  здесь  следует  заметить,  что 
испоьзование этих функций делает программы пользователя более 
мобильными   и   менее   зависимыми  от  особенностей  Вашего 
компьютера. Рассмотрим эти функции более подробно. 
     Девятая  функция  обслуживания  (функция  обслуживания с
кодом  8)  осуществляет  считывание   символа   и   атрибута,
соответствующих  текущей  позиции  курсора.  Как  и  в случае
некоторых других функций обслуживания, здесь следует  указать
номер  используемой   страницы  (несмотря на то, что страница
применяется только к  текстовому режиму цветного графического
дисплея). Функция  обслуживания 8 работает как в графическом,
так и в текущем режимах; более детальные сведения, касающиеся
отображения   символов   в  графическом  режиме  приведены  в
следующей главе. Заметим лишь, что  поскольку  в  графическом
режиме атрибут изображения отсутствует (это понятие применимо
лишь к текстовому режиму, либо к  монохромному  дисплею),  то
его считывание не осуществляется.
     Особенность этого режима состоит в том, что одни и те же
таблицы изображения символов,  используемые  для  их  записи,
используются   также   и  в  случае  их  распознавания  путем
сличения. Распознование осуществимо даже  в  случае  создания
своего собственного набора графических символов.
     Код символа ASCII заносится в регистр AL. Если символ не
соответствует кодам ASCII, то в графическом режиме в  регистр
заносится  00.  Атрибуты  изображения заносятся в регистр AH.
Страница изображения указывается в регистре BH. Для рабюоты в
графическом режиме установку страницы осуществлять не следует.
     
____________________________________________________________
     Номер функции                  Параметры
      обслуживания
____________________________________________________________
     
         AH = 8        BH = активная страница изображения
                            (для графического режима не требу-
                            ется)
                       AL = счимвол ASCII, считанный из по-
                            зиции, указанной курсором
                       AH = атрибут текстового символа
____________________________________________________________
     
       
     Функция обслуживания с кодом 9 предназначена для  записи
символа   (или  нескольких  его  копий)  и  атрибута.  Символ
задается в регистре AL, а атрибут текстового режима или  цвет
графического  режима  заносится в регист BL. Количество копий
символов помещается в регистр CX.
     Для текстовых режимов в регистре BH должна быть  указана
страница изображения; графические режимы этого не требуют.
     Символ  и  его  атрибуты цвета записываются столько раз,
сколько требуется (начиная с текущей позиции курсора). Курсор
при  этом не перемещается, запись производлится в последующие
позиции экрана. В текстовом режиме при дублировании  символов
может   быть  организован  переход  на  следующую  строку.  В
графическом режиме такая возможность отсутствует.
     Описываемая функция обслуживания весьма  полезна  как  в
одиночном  так  и  групповом  режимах.  Групповой режим часто
используется для  оперативного  вывода  пробелов  или  других
повторящихся  символов (например, горизонтальных линий). Если
требуется сформировать символ в единственном  экземпляре,  то
следует  установить  счетчик в CX равным 1. Если его значение
равно 0, то число повторений есть величина переменная.
     Отличия  функции  обслуживания с кодом  9   от   функции
обслуживания   с   кодом  14  состоит  в  следующем:  имеется
возможность   управлять   атрибутами    цвета,    отсутствует
автоматическое отображение курсора при записи символа.
     В  графическом  режиме  цвет  указанный  в  регистре BL,
является  цветом  собственно  пикселя,  входящего  в   состав
рисунка  символа.  Если  седьмой  бит равен 1,  то биты в BL,
определяющие  цвет,  объединяются  с  битами  цвета  текущего
пикселя  при  помощи операции "исключающего или" (XOR). Такой
подход гарантирует отличие  полученного  цвета  от  прежнего,
обеспечивая  четкость изображения. Если 7-й бит в регистре BL
равен 0, то цвет в BL заменяет существующие  цвета  пикселей.
Сказанное  справедливо также в отношении функций обслуживания
с кодами 10 и 12.
     
____________________________________________________________
     Номер функции                     Параметры
      обслуживания
____________________________________________________________
         
        AH = 9          AL = символ  ASCII,  предназначенный 
                             для вывода на экран
                        BL = атрибуты символа, выводимого  на
                             экран
                        BH = активная страница изображения (в
                             графических режимах отсутствует)
                        CX = число  записываемых  символов  и 
                             атрибутов     
                             
____________________________________________________________
     
     Функция  обслуживания  с  кодом  10  ("запись  символа") 
отличается от предыдущей  только  тем,  что  не  позволяет  в 
текстовом режиме изменять существующие атрибуты цвета. Однако 
для графического режима регистр BL должен содержать  атрибуты 
цвета.   Таким   образом  название  этой  функции  не  совсем 
корректно.  На  функции  обслуживания  с  кодами   9   и   12 
распространяются  одни  и  те  же  правила  работы с цветом в 
графических  режимах:  любой  цвет  можно  использовать  либо 
непосредственно,  либо  в  комбинации  с  существующим цветом 
(операция XOR). 
     
____________________________________________________________
     Номер функции                    Параметры
      обслуживания
____________________________________________________________
     
          AH = 10           AL = символ ASCII, выводимый на
                                 экран
                            BL = атрибуты цвета для графичес-
                                 ких режимов
                            BH = активная страница
                            CX = число записываемы символов
____________________________________________________________     
     
     Функция  обслуживания  с  кодом 11 ("установка палитры")
предназначена для выбора одной  из  двух  графических  палитр
среднего  разрешения.  Прежде  чем  передать  управление этой
функции  обслуживания  следует   загрузить   в   регистр   BH
идентификатор палитры, а в регистр BL - значение цвета.
     Напомним здесь, что в графических режимах (режимы 4 - 6)
каждый   пиксель   на   экране   имеет   свой   цвет.    Цвет
устанавливается  в основном тем же способом, что и атрибуты в
текстовых  режимах,   однако   имеются   некоторые   отличия.
Во-первых, пиксели не  могут  мерцать.  Во-вторых,  поскольку
каждый пиксель является  дискретной  цветной  точкой,  то  не
существует  ни очертания, ни фона; посто каждый пиксель имеет
тот или иной цвет. Когда, в  графическом  режиме  формируется
текст,  то  один  цвет  используется для пикселей, из которых
составляется  фон,  а  другой  для   пикселей,   из   которых
состовляются символы.
     Примечание:  Специфика использования графического режима
в языке Бейсик дает основание  считать,  что  здесь  возможен
фоновый цвет. На самом деле это не так.
     Для   каждого  графического  режима  существуют  заранее 
определенные   наборы   цветов,   известные   как    палитры. 
Стандартные палитры можно изменять в компьютере IBM PC/jr или 
в  установленом   графическом   адаптере;   обычный   цветной 
графический  адаптер  такой  возможности не имеет. Если цвета 
палитры для любого графического адаптера определены, то  цвет 
каждого   пикселя   выбирается   из  имеющихся  цветов  путем 
установки значений битов, определяющих цвет  пикселя.  В  2-х 
цветном  режиме  имеется  один бит для каждого пикселя и цвет 
пикселя задается в  виде  О  или  1.  В  4-х  цветном  режиме 
предусмотрены  два  бита,  принимающие  значения от О до 3. В 
16-ти  цветном  режиме  цвет  задается  с  помощью  4  битов, 
хранящих значение от 0 до 15. 
     Одна  из  модификаций  функции  обслуживания  с кодом 11
применима к  текстовым режимам,  все  остальные  -  только  к
графическим.   Для  текстовых режимов  справедливо  следующее
правило: если BH=0, то BL указывает цвет  окружения текстовой
области,  выбранной  из  полной  16-ти  цветной  палитры. Для
любого графического режима, если BH=0, то BL  указывает  цвет
фона  и  цвет  окружения. Окружение эквивалентно произвольной
области экрана, если речь идет  о  цвете  фона.  Значение  BL
может быть выбрано из полной 16-ти цветной палитры.
     Если  BH=1,  то  BL  определяет  палитру.  Для  цветного 
графического  адаптера  это  применимо  только  к  режиму   4 
(среднее   разрешение   4-х   цветная   графика).  Для  более 
совершенных графических адаптеров, в том числе  и  для  PCjr, 
это  положение  расространяется  и  на  все остальные режимы. 
Здесь  мы  рассматриваем  только  стандартные   4-х   цветные 
палитры, которые характерны для режима 4 (палитры 0 и 1). 
     
     Палитра 0:
            
           0 - текущий цвет фона
           1 - зеленый (2)
           2 - красный (4)
           3 - коричневый (6)
     
     Палитра 1:
     
           0 - текущий цвет фона
           1 - циан (3)
           2 - пурпупный (5)
           3 - белый (7)
     
____________________________________________________________
     Номер функции             Параметры
      обслуживания
____________________________________________________________
     
        AH = 11        BH = указатель палитры (0 или 1 для
                            среднего разрешения
                       BL = цвет или палитра использования
                            с указателем цвета
____________________________________________________________     

     
     Функция обслуживания с кодом 12 (C/16) предназначена для
записи пикселя.  Поскольку  положение  курсора,  используемое
функциями  обслуживания  с  кодами 9,10,14, рассматривается в
контексте символов,  то  здесь  необходимо  указывать  строку
развертки  и  позицию  (столбец)  пикселя. Координаты пикселя
отсчитываются от верхнего левого  угла  экрана  (0,0).  Номер
строки развертки, для которого треуется один байт указывается
в регистре DL, для номера столбца одного байта недостаочно  -
ему отведен регистр CX. 

     Цвет  задается  в  регистре  AL и может быть использован
либо непосредственно, либо  в  сочетании  с  другими  цветами
(операция XOR).
     
____________________________________________________________
     Номер функции                   Параметры
      обслуживания
____________________________________________________________
     
           AH = 12       AL = код цвета пикселя (0 - 15)
                         DL = номер строки пикселя
                         CX = номер столбца пикселя
____________________________________________________________
     
     
     Функция обслуживания с  кодом  13  (D/16)  предназначена
для  чтения  пикселя,  точнее  для получения информации о его
цвете. (Для сравнения напомним, что процедура обслуживания  с
кодом  8 формирует на выходе как код цвета, так и код символа
ASCII). Код цвета пикселя формируется в регистре AL;  старшие
биты   при  этом  устанавливаются  в  0.  Регистры  DL  и  CX
предназначены  для  передачи  процедуре  обслуживания  номера
строки и номера столбца пикселя.
     
____________________________________________________________
     
      Номер функции                   Параметры
       обслуживания
____________________________________________________________     

     
          AH = 13        AL =  код цвета пикселя (0 - 15)      
                         DL = номер строки пикселя
                         CX =  номер столбца пикселя
____________________________________________________________
     
     
     Функция обслуживания с кодом 14(E/16) предназначена  для 
записи  символа  в  режиме  телетайпа. При этом экран дисплея 
оказывается  в  роли  принтера  или  пишущей  машинки.  Такие 
команды  операционной  системы  как  TYPE  или  COPY  (если в 
качестве  результирующего  файла   указана   консоль   "CON") 
используют  эту  функцию  обслуживания для имимтации принтера 
или пишущей  машинки.  В  сущности,  в  рамках  этой  функции 
обслуживания  возможности аппаратуры в части генерации цвета, 
мерцания или управления курсором не используются. 
     При  обращении  к  процедуре  обслуживания  с  кодом  14 
производится запись символа в  текущую  позицию  (указываемую 
курсором)   и   осуществляется   перемещение   курсора.   При 
необходимости выполняется переход к новой  строке  или  сдвиг 
содержимого   экрана.   Записываемый   символ  указывается  в 
регистре AL. Для текстового режима  текущие  атрибуты  экрана 
сохраняются.  Для графического режима цвет фона указывается в 
регистре BL. 
     Из  всего  набора  символов  следующие  четыре   символа
непосредственно   не   отображаются,   а   выступают  в  роли
упрвляющих (интепретируются  аппаратурой):  CHR$(7)  -  звук,
CHRS(8) - возврат на одну позицию, CHR$(10) - перевод строки,
CHR$(13) - возврат каретки.
     
____________________________________________________________
     Номер функции                 Параметры
      обслуживания
____________________________________________________________
     
         AH = 14         AL = записываемый символ ASCII
                         BL = цвет символа (только для
                              графических режимов)
                         BH = страница (для графических
                              режимов не указывается)
____________________________________________________________
     
     
     Приложение 8.1. Текст программы демонстрации 
возможностей управления цветом (Бейсик).     


1000 REM Listing 8.1
1010 REM
1020 REM
1030 GOSUB 2000 ' TITLE
1040 GOSUB 3000 ' GET WHICH DISPLAY TYPE, AND SET ADDRESS
1050 GOSUB 2000 ' SET THE TITLE AGAIN
1060 GOSUB 4000 ' BUILD THE SURROUNDING COMMENTS
1070 GOSUB 5000 ' BUILD THE DISPLAY ARRAY
1080 GOSUB 6000 ' FINISH UP AND RETURN TO DOS

2000 REM Title subroutine
2010 KEY OFF : CLS : WIDTH 80
2020 REM
2030 PRINT "    Programs for INSIDE THE IBM PERSONAL COMPUTER"
2040 PRINT "           (C) Copyright 1983 Peter Norton"
2050 PRINT
2060 PRINT     Program 8-1: Demonstrate all screen attributes"
2999 RETURN

3000 REM Subroutine to inquire about display type
3010 PRINT
3020 PRINT "Before we go any further, is this a color-graphics display? ";
3030 GOTO 3060
3040 PRINT
3050 PRINT " (answer Y or N) ";
3060 ANSWER$=INKEY$
3070 IF LEN(ANSWER$)<1 THEN 3060
3080 IF LEN(ANSWER$)>1 THEN 3040
3090 SEGVAL!=0
3100 IF MID$(ANSWER$,1,1)="Y" THEN SEGVAL!=&HB800 ' Color segment
3110 IF MID$(ANSWER$,1,1)="y" THEN SEGVAL!=&HB800 ' Color segment
3120 IF MID$(ANSWER$,1,1)="N" THEN SEGVAL!=&HB000 ' Monochrome segment
3130 IF MID$(ANSWER$,1,1)="n" THEN SEGVAL!=&HB000 ' Monochrome segment
3140 IF SEGVAL!=0 THEN 3040
3150 DEF SEG=SEGVAL!
3999 RETURN

4000 REM  subroutine to build the surrounding messages
4010 LOCATE 11,1  : PRINT "Normal"
4020 LOCATE 12,1  : PRINT "normal"
4030 LOCATE 19,1  : PRINT "Normal"
4040 LOCATE 20,1  : PRINT "blinking"
4050 LOCATE 11,69 : PRINT "Bright"
4060 LOCATE 12,69 : PRINT "normal"
4070 LOCATE 19,69 : PRINT "Bright"
4080 LOCATE 20,69 : PRINT "blinking"
4090 FOR HEX.DIGIT%=0 TO 15
4100   LOCATE 6,HEX.DIGIT%*3+17
4110   PRINT HEX$(HEX.DIGIT%)
4120   LOCATE HEX.DIGIT%+8,11
4130   PRINT HEX$(HEX.DIGIT%)
4140 NEXT HEX.DIGIT%
4150 LOCATE ,,0
4999 RETURN

5000 REM subroutine to set the display array
5010 FOR ROW%=0 TO 15
5020   FOR COL%=0 TO 15
5030     POKE(ROW%+7)*160+COL%*6+31,ROW%*16+COL%
5040     POKE(ROW%+7)*160+COL%*6+33,ROW%*16+COL%
5050     POKE(ROW%+7)*160+COL%*6+35,ROW%*16+COL%
5060     POKE(ROW%+7)*160+COL%*6+32,ROW%*16+COL%
5070   NEXT COL%
5080 NEXT ROW%
5999 RETURN

6000 LOCATE 25,1,1
6010 PRINT "Press any key to return to DOS... ";
6020 IF LEN(INKEY$)=0 THEN 6020 ' wait to keystroke
6030 CLS
6999 SYSTEM

9999 REM End of program Liisting 8-1





     Приложение 8.2. Текст программы генерации изображений
                     (Паскаль).
                     
module Listing_8_2;

{==========================================================}

type

  screen_position_pair_type=(character_byte,attribute_byte);
  normal_screen_type=array[1..25,1..80,
         character_byte..attribute_byte] of char;
         
  narrow_screen_type=array[1..25,1..40,
         character_byte..attribute_byte] of char;
         
{==========================================================}

var [static]

  screen_pointer     : ads of normal_screen_type;
  
  current_attribute  : char;
  row,column         : integer;
  output_string      : lstring(255);
  
  page               : word;
  eighty_col_mode    : boolean;
  
{==========================================================}

const
  normal_attrib = chr   (7);
  reverse_video = chr (112);
  bright        = chr  (15);
  blinking      = chr (135);
  alert         = chr (140);
  
{==========================================================}  

procedure clear_reset;
  external;
function video_mode : byte;
  external;
  
{==========================================================}  

procedure set_video_address;
  begin
    if video_mode=7 then
      begin
        screen_pointer.s:=#B000;
        screen_pointer.r:=0;
      end
    else
      begin
        screen_pointer.s:=#B800;
        screen_pointer.r:=0;
      end;
  end;
  
{==========================================================}  

procedure clear_screen;
  begin
  {if you have the assembly language routines, just to this: }
    clear_reset;
    return;
  {otherwise, we'll clear the screen the hard way: }
    for row:=1 to 25 do
      for column:=1 to 80 vdo
        begin
          screen_pointer^[row,column,character_byte]:=' ';
          screen_pointer^[row,column,attribute_byte]:=normal_attrib;
        end;
  end;
  
{==========================================================}  

{                      НЕРАЗБОРЧИВО                        }

{==========================================================}

procedure set_pointer_for_page;
  begin
    if eight_col_mode then
      screen_pointer.s:=#B800+page*4096
    else
      screen_pointer.s:=#B800+page*2048
    end;
    
end.
[ Оглавление ]

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог