Мигающий курсор постоянно присутствует на экране дисплея, если он отображает текстовую информацию (во время счета или {489} ввода-вывода данных на экран). Иногда он совершенно не нужен, например при работе систем меню на экране или при выводе заставки программы и т.п.
Можно управлять формой курсора до полного его отключения с помощью функции номер 1 аппаратного прерывания 10H. Нужно лишь загрузить в определенные регистры начальную и конечную линии курсора и вызвать прерывание.
Размер курсора по вертикали не может превышать размер символа: какова высота матрицы текущего шрифта, таково и число линий (строк) в курсоре. Ширина курсора неизменна и равна ширине матрицы шрифта. Начальная и конечная линии отсчитываются сверху вниз, причем самая верхняя линия нумеруется как нулевая. Подразумевается, что конечная линия находится ниже начальной, но может быть и наоборот. Варианты вида курсора в зависимости от расположения этих линий показаны на рис. 20.12. Темные области соответствуют видимой мигающей части курсора.
Начало равно Концу или на 1 строку выше него
Верх матрицы Верх матрицы Верх матрицы
────
────
← Начало
<===
← Конец
← Начало
← Конец
────
────
Низ матрицы Низ матрицы Низ матрицы
Рис. 20.12
Если верх матрицы имеет четкий номер 0, то ее низ «плавает» в зависимости от текущего шрифта. Так, для адаптера CGA рабочий диапазон будет 0..7, для MDA/Hercules — 0..13. Адаптер EGA использует оба этих интервала в зависимости от режима работы (шрифт 8x8 или 8x14). Для адаптеров класса VGA этот диапазон может вырасти до размеров соответствующих шрифтов (но в режимах эмуляции CGA и MDA на этих адаптерах диапазоны будут по-прежнему 0..7 и 0..13).
Формально прерывание принимает значения номеров линий от 0 до 31. Попытайтесь, когда будет свободное время, изменить форму курсора в таком диапазоне. Нам кажется, что уловить логику в реакции курсора на эти значения, да еще на разных адаптерах, достаточно сложно. {490}
Значение стартовой линии, равное 32, отключает курсор (делает его невидимым). Отключить мигание курсора нельзя, так как оно реализовано аппаратно. Пример процедур, меняющих форму курсора, приведен на рис. 20.13.
USES { ПРИМЕР ПРОЦЕДУР ИЗМЕНЕНИЯ ФОРМЫ КУРСОРА }
CRT, DOS; { используются модули CRT и DOS }
{ Процедура устанавливает форму курсора, }
PROCEDURE SetCursorSize(c_Start, c_End : Byte );
VAR
Regs : Registers; { доступ к регистрам }
BEGIN
with Regs do begin
AH = $01; { функция формы курсора }
CH = c_Start; { стартовая линия курсора }
CL = c_End; { конечная линия курсора }
end; {with}
Intr($10, Regs) { вызов прерывания 10H БСВВ }
END;
{ Процедура устанавливает нормальную форму курсора. }
PROCEDURE SetNormalCursor;
VAR SE : Word; { компактная запись линий }
BEGIN
if ( LastMode >= Font8x8 )
then
SE:=$0507
else
if (LastMode = Mono ) then SE:=$0B0C
else SE:=$0607;
SetCursorSize( Hi(SE ), Lo(SE))
END;
{ Процедура устанавливает крупный блок-курсор. }
PROCEDURE SetBlockCursor;
VAR с_End : Byte;
BEGIN
if ( LastMode >= Font8x8 ) or ( LastMode <> Mono )
then c_End := 7
else c_End := 13;
SetCursorSize( 0, с_End )
END;