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


     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 раз

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