Справочник программиста на персональном компьютере фирмы IBM. Вывод на терминал
Страница 43. Вертикальный сдвиг текстового экрана


     4.5.1 Вертикальный сдвиг текстового экрана.


   Когда  текстовый экран сдвигается вверх, то строки со  2-й  по
25-ю переписываются на строки с  1-й  по 24-ю, а следующая строка
данных  выводится в 25-й строке.  При этом верхняя строка, поверх
которой осуществлется  вывод  теряется,  хотя  она продолжает су-
ществовать в памяти. Сдвиг вниз устроен аналогично.

   Высокий уровень.


   Бейсик  утомительно медлителен при своих манипуляциях с  экра-
ном. Для быстрого сдвига Вы можете пожелать использовать процеду-
ру на машинном языке, которая не делает ничего другого, кроме как
использует прерывание  10H,  как  описано  ниже  в пункте средний
уровень. Процедура позволяет сдвигать весь экран или любое окно в
нем. Приложение Г показывает как  включать подпрограммы на машин-
ном  языке  в Ваши программы.  Ваша программа на  Бейсике  должна
указывать координаты  верхнего  левого  и  нижнего  правого углов
окна,  которые могут лежать в диапазоне от 0 до 24 и от 0 до  79.
Требуется также параметр,  указывающий  направление сдвига: вверх
или  вниз  (6 и 7, соответственно), число строк на которое  нужно
сдвинуть (если 0, то окно  очищается)  и значение байта атрибутов
для очищаемых строк (для "нормальных" - 7).  Используйте для  них
целые переменные. В  нижеприведенно примере экран сдвигается вниз
на одну строку, а затем освободившаяся строка освобождается.

100 '''данные для подпрограммы
110 DATA &H55, &H8B, &HEC, &H8B, &H76, &H12, &H8A
120 DATA &H24, &H8B, &H76, &H10, &H8A, &H04, &H8B
130 DATA &H76, &H0E, &H8A, &H2C, &H8B, &H76, &H0C
140 DATA &H8A, &H0C, &H8B, &H76, &H0A, &H8A, &H34
150 DATA &H8B, &H76, &H08, &H8A, &H14, &H8B, &H76
160 DATA &H06, &H8A, &H3C, &HCD, &H10, &H5D, &HCA
170 DATA &H0E, &H00
180 '''помещаем данные в сегмент &H2000
190 DEF SEG = &H2000      'помещаем данные начиная с &H2000
200 FOR N = 0 TO 43       '44 байта
210 READ Q                'читаем один байт
220 POKE N,Q              'помещаем его в память
230 NEXT                  'следующий

300 '''в программе
310 GOSUB 500             'сдвигаем на строку
320 LOCATE 1,1: PRINT TEXT$(LINEPTR);  'выводим строку текста

500 '''подпрограмма сдвига
510 DEFINT A-Z            'используем целые переменные
520 TLR = 0               'левая верхняя строка
530 TLC = 0               'левый верхний столбец
540 BRR = 24              'нижняя правая строка
550 BRC = 79              'нижний правый столбец
560 NUMROWS = 1           'число строк сдвига
570 DIR = 7               'направление сдвига вниз
580 FILL = 7              'заполнение обычным атрибутом
590 DEF SEG = &H2000      'указываем на подпрограмму
600 SCROLL = 0            'начинаем с 1-го байта
610 CALL SCROLL(DIR,NUMROWS,TLR,TLC,BRR,BRC,FILL)
620 RETURN                'все сделано

   Средний уровень.


   Функция  6 прерывания 10H сдвигает любую часть экрана вверх, а
функция 7 - вниз. В обоих случаях AL содержит число строк сдвига,
а  когда AL = 0, то весь экран чистится, а не сдвигается.   CH:CL
содержат строку и столбец левого  верхнего угла, а DH:DL - содер-
жат  координаты правого нижнего угла.  Появлящиеся  из-за  сдвига
строки чистые и они выводятся с кодом атрибутов из BH.

;---сдвиг вверх на одну строку
   MOV  AH,6      ;номер функции сдвига вверх
   MOV  AL,1      ;число строк сдвига
   MOV  CH,0      ;строка левого верхнего угла
   MOV  CL,0      ;столбец левого верхнего угла
   MOV  DH,24     ;строка правого нижнего угла
   MOV  DL,79     ;столбец правого нижнего угла
   MOV  BH,7      ;атрибуты очищаемой строки
   INT  10H       ;делаем сдвиг

   Низкий уровень.


   Вертикальный сдвиг всего  экрана  это тривиальная задача, пос-
кольку  правая граница одной строки в памяти  продолжается  левой
границей следующей строки. Сдвиг всего содержимого видеобуфера на
160  байт вверх по памяти (80 символов в строке * 2 байта на сим-
вол) приводит к сдвигу экрана вниз на одну строку. Если Вы пишете
свою  собственную  процедуру сдвига экрана,  использующую  прямое
отображение в память, то не  забывайте  об интерференции, которая
возникает на цветном дисплее и PCjr.  Эта проблема обсуждается  в
[4.3.1]. Обычное решение этой проблемы состоит в проверке статус-
ного  байта,  ожидая пока он разрешит запись в  видеобуфер.   Вам
придется поэкспериментировать, чтобы определить сколько данных Вы
можете записать за один цикл.
   Другое  решение этой проблемы состоит в выключении  экрана  на
время операции сдвига, а затем в его восстановлении.  "Выключение
экрана" подразумевает, что вывод содержащихся в видеобуфере  дан-
ных запрещен, но сам буфер при этом  не изменяется.  Этот процесс
используется функцией сдвига BIOS, использованной выше.  Хотя это
не очень приятно для  глаз,  но  все-таки  не  так плохо, как уже
упоминавшаяся интерференция.
   Для  выключения  экрана у цветного графического  дисплея  надо
сбросить бит 3 порта с адресом  3D8H.   Изменение бита назад на 1
моментально включает экран обратно.  Этот адрес порта  соответст-
вует регистру выбора режима цветного графического адаптера.  Этот
однобайтный регистр только для записи, поэтому программа не может
просто прочитать его, изменить  значение  бита 3 и вернуть прочи-
танный  байт.  Вместо этого Вам необходимо определить также  пра-
вильную установку всех остальных битов (перечисленных в [4.1.2]).
Для  PCjr  этот бит расположен в регистре  управления  режимом  1
массива ворот дисплея. В [4.1.1]  объяснено как получить доступ и
запрограммировать этот регистр.

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