Иллюстрированный самоучитель по SVGA

Немаскируемый курсор

При построении обычных рисунков их образы копируются в видеопамять, но если таким способом построить рисунок, образ которого приведен в примере 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 возврат из подпрограммы
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.