Замечания к описанным подпрограммам
В двух предыдущих разделах описаны действия, которые надо выполнить для построения или удаления изображения курсора. Здесь мы рассмотрим, как изменяются команды, выполняющие эти действия в зависимости от тех или иных дополнительных условий. Нас будут интересовать способы ускорения работы с курсором и построения изображения в режимах direct color, когда цвет указывается непосредственно в коде точки.
Ускорение работы с курсором
Курсор является основным средством управления процессом выполнения графических задач. Чем меньше времени затрачивается на перемещение его рисунка, тем больше времени остается на выполнение основных действий. Поэтому ускорение манипуляций с курсором представляет определенный практический интерес.
Для ускорения работы трех описанных подпрограмм надо сократить количество действий, выполняемых в их внутренних циклах.
В подпрограмме Hidepnt (Пример 6.6) основное действие выполняет одна команда n\ovsb (ее метка hid_2), поэтому в этом случае применимы способы ускорения построения строк. В частности, вместо внутреннего цикла можно использовать подпрограмму Примера 3.16, внеся в нее незначительные изменения.
К подпрограммам Tgipntr (см. Пример 6.4) и showpnt (см. Пример 6.5) описанные в предыдущем разделе способы ускорения не применимы, поскольку в них основные действия выполняют несколько (2 или 5) команд.
На первый взгляд достаточно просто изменить основные команды так, чтобы они оперировали не с байтами, а со словами или двойными словами, т. е. обрабатывали коды сразу двух или четырех точек. В первом случае количество повторов внутреннего цикла сократится в 2, а во втором – в 4 раза. Перед входом в цикл содержимое регистра ex (pntxsize) надо уменьшить, соответственно, в 2 или в 4 раза.
Такая замена дает нужный результат, но необходимы дополнительные меры защиты от возможной аварийной ситуации. Давайте разберемся в причине ее возникновения.
Курсор может находиться в любом месте экрана, поэтому вполне вероятно, что одна из строк его изображения расположится в смежных окнах видеопамяти. Если при этом первая точка строки имеет нечетный адрес в видеопамяти, то обрабатывать одной командой сразу две точки такой строки нельзя. При чтении или записи одной из пар точек первый байт операнда окажется в пределах, а второй за пределами текущего сегмента. Это одна из типичных аварийных ситуаций, чаще всего она приводит к тому, что на программистском жаргоне называется "компьютер завис", т. е. он не реагирует ни на какие внешние события, кроме выключения питания.
Для исключения аварийной ситуации можно, например, сделать так, чтобы при работе с курсором адрес его начала в видеопамяти всегда был четным. Изображение курсора следует за манипулятором "мышь". Если при опросе состояния последнего окажется, что он находится в столбце с нечетным номером, то этот номер принудительно делается четным. Такой трюк уменьшает точность позиционирования курсора на экране, поэтому вам придется выбирать меньшее из двух зол. К вопросу о точности позиционирования мы вернемся при описании программирования работы с мышью.
Таким образом, при некотором ограничении точности позиционирования выполнение подпрограмм Tgipntr и showpnt можно ускорить в 2 раза, внеся в них описанные выше изменения. Более существенное ускорение связано со значительным увеличением размеров текстов подпрограмм и едва ли целесообразно.
Изменения для режимов direct color
Подробному описанию особенностей программирования для видеорежимов с указанием цвета в коде точки посвящена Главы 7. Здесь мы только покажем, какие изменения надо внести в описанные подпрограммы для их использования при работе в режимах direct color. Это позволит в дальнейшем не повторять описание способов построения курсора. Вы можете пропустить эту часть раздела и вернуться к ней после прочтения Главы 7.
В режимах PPG код точки является номером регистра цвета видеокарты, а в режимах direct color он является кодом конкретного цвета и занимает 16 разрядов в режиме Hi-Color и 32 разряда в режиме True color.
Прежде всего, вам придется изменить заготовку рисунка и маску, которые хранятся в массивах pntimage и pntmask (см. Пример 6.3).