Страница 16 из 47
4.2.5 Чтение/сохранение/восстановление позиции курсора. Программы иногда читают и сохраняют текущее положение курсора, с тем чтобы можно было временно перевести курсор в командную строку, а затем вернуть его в исходную позицию. Текущая позиция курсора для каждой из вплоть до восьми страниц хранится в области данных BIOS. Имеется восемь 2-байтных переменных, размещающихся начиная с адреса 0040:0050. Первая позиция соответствует странице 0, вторая - странице 1 и т.д. Младший байт каждой переменной содержит номер столбца, а младший - номер строки. Как столбцы, так и строки нумеруются, начиная с нуля.
Высокий уровень. В Бейсике оператор CRSLIN возвращает строку, а POS - столбец. Оператор POS должен быть снабжен фиктивным аргументом, т.е. он всегда должен записываться в виде POS(0). В данном примере курсор переводится в нижнюю строку экрана, а затем возвращается на мес- то. Отметим, что курсор возвращается на место после выполнения оператора INPUT [4.2.3].
100 ROW = CRSLIN 'получаем строку курсора 110 COL = POS(0) 'получаем столбец курсора 120 LOCATE 25,1 'переводим курсор в командную строку 130 INPUT "Enter file name", F$ 'запрос на ввод 140 LOCATE ROW,COL,1 'восстанавливаем позицию курсора
Средний уровень. Функция 3 прерывания 10H возвращает строку курсора в DH, а столбец - в DL. На входе надо поместить в BH номер страницы (всегда 0 для монохромного дисплея).
;---определение позиции курсора MOV AH,3 ;номер функции MOV BH,0 ;страница 0 INT 10H ;строка:столбец в DH:DL
MS DOS предоставляет две Esc-последовательности для сохранения и восстановления позиции курсора. Это специальные строки, которые если их "вывести" на терминал управляют монитором. Основы исполь- зования этих последовательностей описаны в приложении Д. Последо- вательность для запоминания позиции курсора - Esc[s, а для восс- тановления - Esc[u. Нет нужды запоминать координаты в переменной.
;---в сегменте данных SAVE_CURSOR DB 27,'[s$' RESTORE_CURSOR DB 27,'[u$'
;---сохранение курсора LEA DX,SAVE_CURSOR ;адрес начала строки в DX MOV AH,9 ;номер функции вывода строки INT 21H ;сохраняем позицию курсора
;---восстановление курсора LEA DX,RESTORE_CURSOR ;адрес начала строки в DX MOV AH,9 ;номер функции вывода строки INT 21H ;восстанавливаем позицию курсора
Низкий уровень. Регистры 14 и 15 микросхемы 6845 хранят текущую позицию курсо- ра, как объяснялось в [4.1.1]. Старший байт хранится в регистре 14. Два байта хранят числа от 0 до 1999 в режиме 80 символов в строке и от 0 до 999 в режиме 40 символов. Вам необходимо пере- вести получаемое число в координаты строки и столбца. Вы можете прочитать это значение, чтобы узнать текущее позицию видимого курсора на экране. Но запоминание этого значения и последующее восстановление его в регистрах не обязательно приведет к возврату курсора в предыдущую позицию, особенно если Ваша программа ис- пользует любую из обычных функций работы с экраном, предоставляе- мых операционной системой. Это происходит потому, что BIOS хранит положение курсора в своих переменных, для того чтобы иметь воз- можность управлять страницами дисплея [4.5.3]. После того как Вы восстановите регистры 14 и 15 курсор переместится в соответствую- щую позицию, но при следующем вызове прерывания вывода на экран курсор вернется назад к той позиции, в которой он должен нахо- диться согласно значениям переменных BIOS.
|