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