Справочник программиста на персональном компьютере фирмы IBM. Вывод на терминал
Страница 16. Чтение/сохранение/восстановление позиции курсора


     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.

 
« Предыдущая статья   Следующая статья »