Справочник программиста на персональном компьютере фирмы IBM. Вывод на терминал - Чтение/сохранение/восстановление позиции курсора
ОГЛАВЛЕНИЕ
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.