Немаскируемый курсор
При построении обычных рисунков их образы копируются в видеопамять, но если таким способом построить рисунок, образ которого приведен в примере 6.3, то изображение белой стрелки будет расположено на фоне черного прямоугольника. Очевидно, что работать с подобным изображением курсора неудобно и черный фон, окружающий стрелку, надо убрать. Для исключения окружающего фона применяются маскировка, или специальные способы построения изображения курсора.
Один из таких способов мы уже использовали при построении текстового курсора, он описан в разделе, Пример 5.24. Здесь нас интересует более универсальный вариант подобной подпрограммы, позволяющий строить изображение курсора произвольного размера и формы. Для записи кодов точек в видеопамять, по-прежнему, будет использоваться логическая операция XOR, вычисляющая функцию "исключающее ИЛИ" (exclusive OR).
Предварительные замечания
Образ рисунка курсора можно хранить в любом сегменте оперативной памяти. Учитывая его небольшой размер (294 байта). мы будем считать, что он расположен в сегменте данных (см. пример 6.3) и имеет имя pntimage. Маска при построении не используется, поэтому массив pntmask нас в данном случае не интересует.
Учитывая, что размеры рисунка не фиксированы и зависят от его формы, в разделе данных задачи надо описать две следующие переменные:
PntXsize dw 14; количество точек в строке рисунка курсора pntYsize dw 21; количество строк в рисунке курсора
В приведенном описании значения переменных соответствуют размерам рисунка, показанного в примере 6.3.
Курсор является особым рисунком, его координаты в видеопамяти могут использоваться в различных целях. Поэтому они хранятся в специальных переменных, значение которых может изменяться только при перемещении манипулятора "мышь". В примере 6.8 будет описано несколько переменных, используемых при работе с курсором. Здесь нас интересуют только две из них. Переменная winpnt содержит текущее окно видеопамяти, a offspnt – адрес (смешение) точки левого верхнего угла рисунка курсора в этом окне.
Подпрограмма Tglpntr
Текст подпрограммы, изменяющей состояние курсора на противоположное, приведен в примере 6.4. При каждом нечетном вызове Tglpntr рисунок курсора появляется на экране, а при каждом четном на ею месте восстанавливается исходный фон. Явно задаваемые входные параметры отсутствуют. Регистр es должен содержать код видеосегмента.
Пример 6.4. Подпрограмма переключения состояния курсора.
Tglpntr: pusha сохранение содержимого регистров push Cur_win сохранение исходного окна ir.ov ax, Winpnt ax = окно с рисунком курсора mov Cur_win, ax Cur_win = Winpnt call setwin установка исходного окна lea si, pntimage si = адрес массива pntimage mov di, Offspnt di = адрес Е сегменте видеопамяти mov ex, pntYsize ex = кол-во повторов внешнего цикла mov bx, horsize вычисляем константу для sub bx, pntXsize коррекции адресов строк Displ 1: push ex сохраняем счетчик строк mov ex, pntXsize сх = количество точек в строке рисунка Displ 2: lodsb!! al = код очередной точки рисунка xor es: [di], al!! корректируем байт видеопамяти inc di!! увеличение адреса видеопамяти jnz @F › адрес в пределах текущего сегмента call nxtwin конец сегмента, смена окна @@: loop Displ 2 управление повторами цикла pop ex восстанавливаем счетчик строк add di, bx адрес начала следующей строки jnc @F › адрес в пределах текущего сегмента call nxtwin конец сегмента, смена окна @@: loop Displ 1 управление повторами цикла pop Cur win восстановление Cur win popa восстановление содержимого регистров call setwin восстановление исходного окна ret возврат из подпрограммы