Страница 13 из 47
4.2.2 Относительное позиционирование курсора Иногда бывает полезным сдвинуть курсор относительно его преды- дущей позиции: на строку вверх, на три столбца вправо, и т.д. Достаточно просто использовать для этой цели уже описанное абсо- лютное позиционирование курсора. Но для удобства MS DOS предос- тавляет некоторые возможности относительного перемещения курсора.
Средний уровень. Функции относительного перемещения курсора выполняются Esc-последовательностями. Это строки, которые выводятся на экран с помощью функции 9 прерывания 21H. В приложении Д даны основы их использования. Такие последовательности интерпретируются MS DOS как команды перемещения курсора, а не вывод символов строки. Строка начинается с символа Esc (ASCII 27), затем идет символ [, а символ $ отмечает конец строки. Сама строка состоит из числа позиций, на которое надо сдвинуться, и кода направления. Чтобы сдвинуться на 3 позиции:
вверх 3A вниз 3B вправо 3C влево 3D
Числа записываются как коды ASCII. Не преобразуйте, например, 33C (33 пробела вправо) в 33,'C'; должно быть '33C'. В нижеприведен- ном примере цифры 1-8 помещаются через определенные интервалы поперек экрана, как метки столбцов данных. Промежутки между циф- рами генерируются Esc-последовательностями, которые сдвигают курсор вправо после вывода каждой цифры.
;---в сегменте данных CURSOR_RIGHT DB 27,'[9C$'
;---установка начальной позиции курсора MOV BH,0 ;ноиер страницы MOV DH,1 ;строка MOV DL,5 ;столбец MOV AH,2 ;функция установки курсора INT 10H ;установка курсора ;---вывод цифр LEA BX,CURSOR_RIGHT ;BX будет обмениваться с DX MOV CX,8 ;число цифр для вывода MOV DL,'0' ;начинаем с 0 NEXT_NUMBER: MOV AH,2 ;функция DOS для вывода символа INT 21H ;выводим символ INC DL ;переходим к следующему коду ASCII XCHG DX,BX ;помещаем указатель на строку в DX MOV AH,9 ;функция вывода строки INT 21H ;сдвигаем курсор на 9 позиций вправо XCHG DX,BX ;возвращаем в DX код ASCII LOOP NEXT_NUMBER ;переходим к следующей цифре
Имеется также пара Esc-последовательностей, которые управляют переносом курсора на следующую строку при достижении им конца текущей строки. Когда устанавливается отсутствие переноса, то лишние символы при выводе отбрасываются. Строка, запрещающая перенос - Esc [=7h (или как данные, 27,'[=7h'). Для возврата к режиму автоматического переноса на следующую строку используется строка Esc [=7l (27,'[=7l').
|