Замечания к описанным подпрограммам
Проще всего изменить описание маски и черно-белого рисунка курсора. В пояснениях к примеру 6.3 мы советовали при его использовании в конкретной программе заменить все коды OFF десятичным числом – 1. Если вы это сделали, то остается только заменить все директивы db на dw для режима Hi-color или на dd для True color. Макроассемблер зарезервирует требуемое пространство памяти и заменит число – 1 кодами OFFFFh или OFFFFFFFFII, в зависимости от указанной директивы (dw или dd).
Изменить описание цветного рисунка курсора сложнее, в этом случае недостаточно простой замены директив db на dw или dd. У заготовок цветных рисунков распакованный код точки является порядковым номером строки палитры, хранящейся вместе с рисунком. По коду точки надо выбрать из палитры код цвета, преобразовать его в нужную форму и поместить в описание рисунка. Такое преобразование делается программно, а не вручную. В Главе 7 описаны способы преобразования рисунков из формата PPG в форматы direct color, их и можно использовать. Однако на первое время лучше ограничиться черно-белым курсором, а к работе с цветным перейти позже, по мере накопления опыта программирования графики.
В режимах direct color размеры массивов pntimage и pntmask увеличиваются в 2 или в 4 раза, во столько же раз надо увеличить размер массива pntbuff. Это можно сделать одним из двух способов: заменить в его описании директиву db на dw или dd, либо оставить директиву db, а количество резервируемых байтов умножить на 2 или на 4.
Изменения в текстах подпрограмм примеров 6.4, 6.5 и 6.6 связаны только с увеличением размера кода точки в 2 (режим Hi-Color) или 4 (режим True color) раза. Прежде всего, нужно увеличить значение константы, которая используется для коррекции адресов строк. Во всех примерах ее вычисляют две следующие команды:
mov bx, horsize; вычисляем константу для sub bx, pntXsize; коррекции адресов строк
После них надо записать третью команду, сдвигающую содержимое регистра bх на один (shi bx, i) или на 2 (shi bx, 2) разряда влево. Значение константы увеличится, соответственно, в 2 или в 4 раза.
Остальные изменяемые команды расположены во внутренних циклах. Комментарий к ним начинается с двух восклицательных знаков. Изменения этих команд делятся на следующие три категории:
- у строковых команд lodsb, stosb и movsb последняя буква (b) заменяется буквами w (Hi-Color) или d (True Color);
- если один из операндов команды находится в регистре ai, то имя регистра надо изменить на ах (Hi-Color) или на еах (True Color);
- команды inc di и inc si увеличивают значение адреса на 1. Они заменяются командой сложения (add), которая прибавляет к регистру число 2 (Hi-Color) или 4 (True Color).
Перечисленные изменения делают возможным применение описанных подпрограмм при работе в видеорежимах с указанием цвета в коде точки.
Промежуточные итоги
При программировании конкретной задачи важно не только составить нужную подпрограмму, но и корректно ее использовать. Применительно к нашему случаю это означает следующее:
- При выводе изображения курсора на экран вы должны быть уверены в том, что его там уже нет, в противном случае на экране может оказаться несколько изображений курсоров или будет испорчен фон, сохраненный при выводе предыдущего изображения. Такая уверенность есть при первом выводе курсора в начале выполнения задачи, но после этого задача должна контролировать его текущее состояние.
- Перед удалением курсора также надо убедиться в том, что он находится на экране, а исходный фон сохранен в массиве pntbuff. В противном случае при попытке удалить курсор на экране появится прямоугольник, цвет и узор которого не соответствует ожидаемым.
При организации работы с текстовым курсором в разделах "Текстовый курсор в графическом режиме" и "Ввод символов с клавиатуры" мы использовали специальный признак, указывающий текущее состояние текстового курсора. Работа с графическим курсором имеет специфические особенности, а способы определения его текущего состояния зависят от того, как задача получает данные от манипулятора "мышь".
Если текущее положение манипулятора задача определяет в режиме опроса, то специальный признак состояния курсора не нужен, – оно определяется логикой выполняемых действий. Однако если задача взаимодействует с манипулятором в режиме прерываний, то без указанного признака не обойтись. Подробное обсуждение этих вопросов будет производиться в процессе описания программирования работы с манипулятором "мышь", к которому мы и переходим.