Подготовительные операции программыДля работы по управлению манипулятором и организации ввода информации прикладная программа выполняет различные функции прерывания ЗЗh. В настоящее время большинство драйверов «мыши» поддерживают стандарт, введенный фирмой Мicrosoft для различных функций прерывания ЗЗh. Многие системы программирования имеют в своем составе библиотечные функции, выполняющие обращение к той или иной функции прерывания ЗЗh. Библиотечные функции работают медленнее, чем непосредственное обращение к прерыванию ЗЗh из прикладной программы. Кроме того, многие программисты в нашей стране используют неполные или даже несанкционированные копии систем программирования, в которых библиотеки поддержки манипулятора отсутствуют или работают некорректно. Поэтому в дальнейшем приводятся примеры непосредственного обращения к прерыванию ЗЗh, а не библиотечные функции ТuгЬо С. Каждая программа, использующая для ввода информации манипулятор «мышь», должна выполнить ряд подготовительных операций: 1) определить, инсталлирован ли драйвер «мыши»; 2) задать вид и форму курсора манипулятора; 3) описать границы перемещения курсора «мыши» по экрану; 4) описать «чувствительность» курсора, равную числу «микки», приходящихся на один пиксель экрана по горизонтали и вертикали; 5) установить порог «удвоенной» скорости курсора «мыши»; 6) «включить» курсор манипулятора (сделать его видимым на экране); 7) установить курсор в начальную позицию на экране в соответствии с нуждами программы. Многие из этих действий помогает осуществить функции инициализации и определения текущего состояния драйвера манипулятора (АХ = 0000h). Ниже приводится спецификация этой функции. При вызове в АХ =0000h. Возврат в АХ – состояние оборудования: АХ =0000h – отсутствует драйвер «мыши» (отсутствует аппаратура, не загружен драйвер); АХ =FFFFh — «мышь» готова к работе; ВХ – количество кнопок манипулятора: ВХ =0003h – не две кнопки; ВХ =002h – две кнопки (режим Мicrosoftmode); ВХ =000Зh – три кнопки (режим Мousemode). При выполнении функции АХ = 0000h драйвер манипулятора приводится в состояние по умолчанию: 1) курсор манипулятора установлен в центре экрана и выключен; 2) чувствительность манипулятора по вертикали равна 2 микки/пиксель, по горизонтали – 1 микки/пиксель; 3) порог удвоенной скорости установлен равным 64 микки/с; 4) установлена форма курсора по умолчанию; 5) координаты левого верхнего угла области перемещения курсора манипулятора соответствуют координатам (0, 0), а координатынижнего правого угла области перемещения манипулятора – максимальным координатам текущего видеорежима минус 1. Если необходимо установить значения, отличающиеся от значений по умолчанию, используются функции установки формы курсора, границ его перемещения, задания значений чувствительности и порога удвоенной скорости. Для определения работоспособности «мыши» необходимо выполнить функцию АХ = 0000h и проанализировать возврат в АХ. Если АХ = -1, это указывает на готовность манипулятора к работе. Здесь следует сделать два замечания. Первое из них состоит в том, что операционная система MS-DOS «цепляет» при загрузке за вектор прерывания ЗЗh «заглушку» из единственной инструкции IRET. Поэтому выполнение инструкции INT ЗЗh даже при отсутствии драйвера не порождает никаких проблем. Второе замечание заключается в том, что успешное завершение инициализации не означает, однако, что аппаратура адаптера или самого манипулятора исправна, а свидетельствует только о том, что загружен драйвер «мыши» В ряде случаев драйвер «мыши» передает в манипулятор заранее заданную последовательность слов информации. Эти слова вызывают в манипуляторе генерацию ответного “эха”, анализкоторого позволяет драйверу однозначно опознать “свою” аппаратуру манипулятора и проверить исправность цепей приема информации адаптера асинхронной последовательной связи. Приводимый далее фрагмент С -кода иллюстрирует использование функции инициализации манипулятора «мышь».
Инициализация “мыши”. АХ = 0 Geninterrupt (0x33); If (AX = = 0) Puts (“НЕТ ”мыши! ”); exit (-1); Успешное завершение инициализации позволяет продолжить работу прикладной программы по подготовке к использованию «мыши». Следующая операция связана с определением типа и формы курсора. Драйверы «мыши» в текстовом режиме работы видеоадаптера поддерживают два типа курсора: 1) “жесткий”, совпадающий с обычным курсором текстового режима в форме нескольких сплошных телевизионных строк в пределах знакоместа; 2) программируемый, представляющий собой знакоместос измененным атрибутом символа и, возможно, со специфицированным пользователем символом. Курсор «мыши» в текстовом режиме перемещается по знакоместам экрана. Выбор типа и параметров курсора «мыши» в текстовом режиме работы видеоадаптера выполняется с помощью функции АХ = 0Ah прерывания 33h, спецификация которойприводитсядалее. При вызове: АХ= 000Ah – установка курсора «мыши» в текстовом режиме; ВХ - выбор типа курсора: ВХ =00 – программируемый курсор; ВХ =01 – «жесткий» курсор; СХ – AND-маска (маска экрана) для программируемого курсораили номер верхней скэн-линии для «жесткого» курсора; DX – XOR-маска (маска курсора) для программируемого курсора или номер нижней скэн-линии для жесткого курсора. Возврат: нет. Если выбран «жесткий» курсор, то курсор мыши на экране имеет форму обычного текстового. Преимуществом такого курсора является то, что на экране присутствует только один привычный курсор и при любой операцииввода информации с использованием функций MS-DOS (например, функций стандартного ввода-вывода) кypcор «мыши» автоматически перемещается в текущую текстовую позицию BIOS. Это не означает, однако, что драйвер «мыши» при перемещении курсора обновляет слово текущей позиции курсора в области данных BIOS. Поэтому без дополнительных усилий со стороны программиста не удается поместить символ на экране в позицию, на которую указывает курсор «мыши». При формировании программируемого текстового курсора используется: 1) слово видеопамяти, образованное символом и атрибутом знакоместа экрана, в котором находится курсор манипулятора – screen_word; 2) AND-маска – AND_mask; 3) XOR-маска – XOR_mask. Результирующее представление курсора на экране формируется поразрядными логическими операциями по формуле screen_ word = screen_ word AND AND_ mask XOR XOR_ mask. При перемещении курсора в другую позицию предыдущее содержимое видеобуфера восстанавливается. Таким образом, пользователь может установить различные формы программируемого текстового курсора «мыши». Например, задание AND_mask = 00FFh и XOR_mask = хх00h приведет к тому, что текстовый курсор будет прямоугольником, сохраняющим любой предыдущий символ, атрибут которого хх. Младшая шестнадцатеричная цифра будет задавать цвет контура символа, а старшая – цвет фона. При этом, однако, возможно «исчезновение» курсора, если атрибут символа уже был равен хх. Распространенным является программируемый текстовый курсор со следующими значениями: AND_mask = FFFFh и XOR_mask = 7700h. В этом случае инвертируется как цвет фона, так и цвет атрибута, что гарантирует видимость курсора и не изменяет символ в позиции курсора. Нетрудно добиться того, чтобы курсор «мыши» на экране отображался в виде нужного символа. Например, для того чтобы, текстовый курсор «мыши» имел форму «птички» (ASCII-код FBh), необходимо задать такие маски: AND_mask – 0000h и XOR_mask – xxFBh, где хх задает атрибут символа курсора. В графическом режиме работы видеоадаптера может быть описана любая собственная форма курсора в пределах прямоугольника 16 х 16 пикселей. Курсор в графическом режиме описывается двумя масками размером 16 х 16 бит каждая. Одна из масок называется AND-маской (маской экрана), другая – XOR-маской (маской курсора ). При перемещении курсора предыдущее содержимое экрана восстанавливается драйвером «мыши». Маски, комбинируясь, определяют способ обработки текущего кода цвета пикселя на экране. Результаты обработки представлены в табл. 1.
Табл. 1. Формирование кода цвета пикселей изображения курсора «мыши»
|