Страница 9 из 47
4.1.5 Очистка части/всего экрана. Очистка экрана состоит просто в записи пробела в каждую из позиций экрана (код ASCII - 32). Однако, если при выводе на экран были использованы ненормальные атрибуты, то должны быть также изменены и байты атрибутов. Операционная система обеспечивает простой способ очистки только части экрана.
Высокий уровень. Бейсик для очистки экрана использует оператор CLS. При этом 25-я строка внизу экрана становится пустой только если был убран список значений функциональных клавиш с помощью команды KEY OFF. Байты атрибутов устанавливаются равными ASCII 7. В [4.5.1] дана процедура прокрутки, которая может быть использована в Бейсике для очистки окон на экране.
Средний уровень. Операционная система предоставляет несколько способов очистки экрана. Какой из них Вы выберете зависит от того, какие средства требуются программе для достижения других целей. Первый метод - это просто сброс режима дисплея, используя функцию 0 прерывания 10H [4.1.2]. Для символьного экрана каждая позиция заполняется пробелом (ASCII 32), а все атрибуты устанавливаются нормальными (ASCII 7). Обычно этот метод хорош только в начале программы, когда все равно надо устанавливать режим работы дисплея. Для цветного графического адаптера и PCjr реинициализация режима дисплея приводит к катавасии на экране. Этот эффект отсутствует у монохромного адаптера и EGA.
;---очистка экрана путем установки нового режима MOV AH,0 ;номер функции установки режима дисплея MOV AL,2 ;код режима 80*25 черно-белого INT 10H ;очистка экрана
Второй метод состоит в использовании функций 6 и 7 прерывания 10H, которые сдвигают экран. Число строк, на которое надо сдви- нуть экран помещается в AL и когда это число равно нулю экран очищается. Прерывание позволяет сдвигать только часть экрана, поэтому таким образом можно очистить отдельное окно на экране. Надо поместить координаты левого верхнего угла окна в CX, а коор- динаты правого нижнего угла в DX (номер строки в CH/DH, а номер столбца в CL/DL). Поместите атрибут, с которым должен чиститься экран в BH. Координаты отсчитываются от 0.
;---очистка окна между 3,4 и 13,15 MOV AH,6 ;используем процедуру сдвига MOV AL,0 ;число строк сдвига делаем равным нулю MOV BH,7 ;байт атрибутов для заполнения MOV CH,3 ;строка для верхнего левого угла MOV CL,4 ;столбец для левого верхнего угла MOV DH,13 ;строка для нижнего левого угла MOV DL,15 ;столбец для нижнего левого угла INT 10H ;чистим окно
Третий метод заключается в использовании фукнции 9 прерывания 10H; которая выводит символ и атрибуты столько раз, сколько ука- зано в CX. Значение 2000 чистит весь экран, если курсор был уста- новлен в 0,0, используя метод показанный в [4.2.1]. AH должен содержать символ пробела, AL - байт атрибутов, а BH - номер стра- ницы дисплея.
;---установка курсора в левый верхний угол экрана MOV AH,2 ;функция установки курсора MOV BH,0 ;номер страницы MOV DX,0 ;координаты 0,0 INT 10H ;устанавливаем курсор ;---вывод символа пробела 2000 раз MOV AH,9 ;номер функции MOV CX,2000 ;число повторений вывода MOV AL,' ' ;символ пробела в AL MOV BL,7 ;атрибуты в BL INT 10H ;очистка экрана
Наконец, DOS обеспечивает очистку экрана с помощью специальных Esc-последовательностей, которые работают с драйвером ANSI.SYS. Основные сведения о нем приведены в приложении Д. Эти последова- тельности - это строки, начинающиеся с символа Esc, а завершаю- щиеся ограничителем $. Такие строки выводятся функцией 9 прерыва- ния 21H, при этом DS:DX должны указывать на первый символ строки. DOS интерпретирует строку не выводя ее на дисплей. Чтобы стереть весь экран строка должна быть [2J. Чтобы стереть конец строки, начиная от позиции курсора (включая эту позицию), строка [K.
;---в сегменте данных CLEAR_LINE DB 27,'[K$'
;---очистка конца строки, начиная от позиции курсора MOV AH,9 ;функция вывода строки LEA DX,CLEAR_LINE ;DX должен указывать на начало строки INT 21H ;стираем конец строки
Низкий уровень. На низком уровне надо просто поместить символы пробела и тре- буемый байт атрибутов в память дисплея, используя инструкцию STOSW. Вот пример для монохромного дисплея:
MOV AX,0B000H ;указываем на память дисплея MOV ES,AX ; MOV DI,0 ;DI указывает на начало буфера MOV AL,32 ;символ пробела MOV AH,7 ;нормальные атрибуты MOV CX,2000 ;число повторений REP STOSW ;посылаем AX в ES:DI 2000 раз
|