комфортных цветов являются циан и белый.
Каждый, кто имеет серьезные намерения в отношении цветовых
возможностей 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-ПЗУ. В связи с этим мне все-таки неясно, почему все
стремятся использовать именно функции обслуживания (исключение составляют
пользователи, работающие на ассемблере), несмотря на то, что средства