Завершение истории
У гурманов существует золотое правило - самое вкусное оставлять на десерт. Не будем отступать от этого правила и поговорим о программировании курсора мыши. За это отвечают две функции, 09h и 0Ah, 33h прерывания из более чем тридцати. Первая функция позволяет запрограммировать изображение курсора в графическом режиме, вторая - в текстовом.
Прежде чем приступить к рассказу об этих функциях, давайте разберемся, как создается изображение на экране монитора. При покупке монитора Вы, вероятно, обращали внимание на такую характеристику монитора как размер точки. Кто покупал тот знает, кто не имел такой возможности - узнает. Из таких маленьких точек и состоит изображение на экране монитора.
При работе в графическом режиме программист имеет возможность определить текст любой такой точки на экране монитора. С текстовым режимом не все так просто. Здесь программист имеет возможность обращаться только к группе точек, образующих одно знакоместо. На одно знакоместо может быть выведен только один символ. Размер знакоместа зависит от выбранного режима и, обычно, составляет 8 на 8 точек.
Вернемся к нашим баранам, то есть к курсору. Программа обработки 33h прерывания в тестовом режиме поддерживает два типа курсора: жесткий и программируемый. Жесткий курсор не изменяет текущее значение знакоместа, а выделяет его цветом. Курсор полностью занимает по ширине одно знакоместо. Высоту и местоположение курсора внутри знакоместа можно изменять. Для программируемого курсора программист имеет возможность определить форму и цвет.
Чтобы запрограммировать жесткий курсор в текстовом режиме, в регистр AX записываем значение 0Ah, в регистр BX - 01h, в регистры CX и DX - номер верхней и нижней линий пикселов в знакоместе, соответственно.
Цвет и форма, NewScr, программируемого курсора на экране определяется в результате логических поразрядных операций AND и OR кода и атрибута символа, OldScr, в позиции курсора и масок цвета и формы, AndMask и OrMask, курсора. Эти действия описываются формулой:
NewScr = OldScr AND AndMask OR OrMask
Необходимые значения переменных AndMask и OrMask вы можете определить самостоятельно. В качестве отправной точки ваших исследований можете использовать широко распространенные следующие значения: AndMask = FFFFh и OrMask = 7700h. Такой курсор инвентирует цвет символа и фона. Поэтому он всегда будет виден на экране. Другим его достоинством является то, что он не изменяет символ под курсором.
Если Вы хотите использовать в качестве курсора мыши какой-то определенный символ, например, стрелку, создайте его во второй половине ASCII таблицы. После этого используйте курсор со следующими значениями AndMask = 00FFh и OrMask = xx00h. Вместо символов xx подставте код символа в котором сохранен внешний курсора.
Как и в случае с "жестким" текстовым курсором мыши для определения программируемого курсора используется функция 0Ah. Но в регистр BX необходимо записать 0. В регистре CX будет записано значение маски AndMask, а в DX - значение маски OrMask.
В начале статьи было сказано, что в графическом режиме можно определить цвет любой точки на экране, а это, в свою очередь, позволяет задать любую форму курсора. Но это слишком хорошо, чтобы быть правдой. Действительность такова, что курсор мыши имеет размеры 16 на 16 точек, а цвет является результатом слияния AndMask и XorMask масок. Как и при создании программируемого текстового курсора, при формировании графического курсора AndMask маска определяет цвет, а XorMask маска форму курсора.
AndMask и XorMask следует объединить в один конструктивный элемент: массив, запись или структуру. Размер этого элемента будет составлять 64 байта. Первые 32 байта образуют маску AndMask, следующие маску XorMask.
Чтобы иметь курсор видимый на любом фоне все байты AndMask маски должны иметь код FFh, а биты, значение которых в маске XorMask равно 1 образуют форму курсора. В качестве примера приведем рисунок курсора и его битовой карты.
При работе с графическим курсором кроме определения его цвета и формы необходимо указать так называемое "горячее пятно". "Горячее пятно" - это точка на которую в настоящее время указывает курсор. Оно может находится в любой точке маски курсора. Его положение задается в относительных координатах. Отсчет координат ведется с левого верхнего угла, имеющего относительную координату (0,0). Нижний правый угол имеет максимальные координаты (15,15).
Чтобы запрограммировать курсор мыши в графическом режиме необходимо воспользоваться функцией 09h 33h прерывания. Как всегда, номер функции записываем в регистр AX. В регистрах BX и CX сохраняем информацию о координатах "горячего пятна" горизонтальной и вертикальной, соответственно. В паре регистров ES:DX необходимо указать сегмент и смещение обьединенной конструкции AndMask и XorMask масок. Это может быть массив, а может быть структура. Кому, что нравится.
На этом позвольте закончить описание функций 33h прерывания. Мы рассмотрели их малую часть. Если кому-то из вас необходимо более полное описание возможностей драйвера мыши воспользуйтесь документацией по прерываниям DOS или, в крайнем случае, прочтите книгу Р.Данкана "Профессиональная работа в MS-DOS" изданную в издательстве "Мир" в 1993 году.
И не забывайте главное: Навыки могут придти только в процессе работы.
Сергей ОСОКО
Горячие темы