Страница 43 из 47
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] объяснено как получить доступ и запрограммировать этот регистр.
|