Прямой ввод-вывод: Часть II
3.1. Очистка экрана
Очистку всего экрана можно осуществить с помощью специальной команды или с помощью escape - последовательности Esc[2J. Рассмотрим эти способы поподробнее.
3.1.1. Реализация на ассемблере
1-ый метод: использование функции 6 прерывания 10H
Функция 6 прерывания 10H очищает определённую прямоугольную область экрана. Число строк, на которое надо сдвинуть экран, заносится в регистр AL. Если установлено значение 0, то экран очищается. Строка для верхнего левого угла очищаемой области заносится в регистр CH, столбец для левого верхнего угла - в регистр CL, а значения для правой нижней строки и столбца - в регистры DH и DL соответственно. Атрибут, которым должен чиститься экран, записывается в регистр BH. Он подробно описан в таблице 3.1.
Примечание: нумерация позиций экрана начинается с точки (0, 0) в верхнем левом углу экрана!
Числ. Значение | Цветовой атрибут | Символ или фон? |
---|---|---|
0 | Чёрный | Символ |
1 | Синий | Символ |
2 | Зелёный | Символ |
3 | Циан (голубой) | Символ |
4 | Красный | Символ |
5 | Пурпурный | Символ |
6 | Коричневый | Символ |
7 | Светло-серый | Символ |
8 | Тёмно-серый | Символ |
9 | Светло-синий | Символ |
10 | Светло-зелёный | Символ |
11 | Светло-голубой | Символ |
12 | Светло-красный | Символ |
13 | Светло-пурпурный | Символ |
14 | Жёлтый | Символ |
15 | Белый | Символ |
0 | Чёрный | Фон |
16 | Синий | Фон |
32 | Зелёный | Фон |
48 | Циан (голубой) | Фон |
64 | Красный | Фон |
80 | Пурпурный | Фон |
96 | Коричневый | Фон |
112 | Светло-серый | Фон |
128 | Мигание | Символ |
Примечание: Атрибут = Символ+Фон (+ Мигание) |
Пример 3.1
; --- Очистка экрана между координатами 0, 0 и 24, 79, ; --- нормальное заполнение символов. MOV AH, 6 ; используемая функция. MOV AL, 0 ; очищается весь диапазон MOV BH, 007H ; белые символы на чёрном фоне MOV CH, 0 ; левый верхний MOV CL, 0 ; угол MOV DH, 24 ; правый нижний MOV DL, 79 ; угол INT 10H
2-й метод: использование функции 9 прерывания 10H
Функция 9 прерывания 10H выводит символ и атрибут столько раз, сколько указано в CX. Значение 2000 чистит весь экран, если курсор установлен в позицию 0, 0. AL должен содержать символ пробела (код 020H), BL - байт атрибутов, а BH - номер страницы дисплея.
Пример 3.2.
; --- установка курсора в левый верхний угол экрана MOV AH, 2 ; номер функции MOV BH, 0 ; номер экранной страницы MOV DX, 0 ; обнуляем координату позиции курсора INT 10H ; --- вывод символа 'пробел' 2000 раз MOV AH, 9 ; номер функции MOV CX, 2000 ; число повторений вывода MOV AL, 020H ; символ пробела MOV BL, 7 ; атрибут 'белый по чёрному' INT 10H
Дополнительную информацию смотрите [Абель, Джордейн]
3.1.2. Реализация на языке Си
Реализация очистки экрана средствами языка Си возможна только посредством использования escape-последовательности:
Пример 3.3.
… puts( "\x1B[2J" ); …
3.1.3. Реализация на Бейсике
В бейсике для очистки экрана применяется оператор CLS
3.1.4. Реализация в Command Shell
Очистку экрана в MS-DOS Command Shell можно осуществить следующим способом:
- команда CLS, очищающая экран дисплея и устанавливающая курсор в левый верхний угол. Её синтаксис:
CLS
Дополнительную информацию смотри [Финогентов II]
3.1.5. Реализация в языках Перл, Питон и Пролог
Реализация очистки экрана средствами языков Перл, Питон и Турбо Пролог не предусмотрена.
3.2. Управление курсором
Помимо цвета выводимых символов, гораздо чаще Вам придётся изменять положение курсора на экране дисплея. При этом может потребоваться:
- Абсолютное позиционирование курсора;
- Относительное позиционирование (относительно текущей позиции);
- Запоминание или чтение позиции курсора.
Этим операциям мы научимся в этом разделе.
3.2.1. Абсолютное позиционирование курсора
Курсор служит двум целям. Во-первых, он служит указателем места на экране, в которое операторы программы посылают свой ввод. Во-вторых, он обеспечивает видимую точку отсчёта на экране для пользователя программы. Только для второго применения курсор должен быть видимым. Но даже невидимый курсор указывает на позицию на экране. Это важно, поскольку любой вывод на экран начинается с текущей позиции курсора (который может быть выключен).
Для курсора могут быть установлены абсолютные координаты или координаты относительно текущей позиции. Абсолютные координаты могут меняться в пределах 25 (изредка 50) строк и 80 (иногда 40) столбцов. В языках высокого уровня обычно отсчитывают координаты экрана, начиная с единицы. Таким образом, позиция левого верхнего угла - 1, 1. В ассемблере отсчёт всегда начинается с нуля и позиция левого верхнего угла - 0, 0.
Рассмотрим функции абсолютного позиционирования курсора, реализованные на разных языках.
3.2.1.1. Реализация на ассемблере
1-ый метод.
Функция 2 прерывания 10H устанавливает курсор, относящийся к указанной странице видео памяти.
ФУНКЦИЯ 2 ПРЕРЫВАНИЯ 10H | |
Входные значения: |
|
Пример установки графического курсора в центре экрана:
Пример 3.4.
; --- установка курсора в строку 12, столбец 39. MOV AH, 2 ; номер функции MOV BH, 0 ; номер страницы MOV DH, 12 MOV DL, 39 INT 10H
Подробнее смотри [Абель, Джордейн]
2-ой метод.
Второй метод позиционирования курсора состоит в применении escape-последовательностей драйвера ANSI.SYS. В этом случае можно пользоваться функцией 9 прерывания 21H, выводя escape-последовательность как обычную строку.
Пример 3.5.
; --- установка курсора в строку 12, столбец 39. ; --- в сегменте данных DOS_CENTER DB 27,'[12;39H$' ; строка позиции курсора ; --- в сегменте кода MOV AH, 9 ; номер функции вывода строки. LEA DX, DOS_CENTER ; загрузка адреса строки INT 21H
Подробнее см. [MS_DOS 6.0, Финогентов I]
3.2.1.2. Реализация в языках Си
Не смотря на то, что на языке Си есть свои функции управления позицией курсора, предпочтительней использовать средства, предоставляемые драйвером ANSI.SYS (примеры см. ниже).
Пример 3.6.
1. Реализация в Turbo C/C++ const char POS_CENTER[] = "\x1b[12;39H"; … puts( POS_CENTER); 2. Реализация в SPHINX C-- WRITESTR( "\x1b[13;39H" );
Подробнее см. [Бочков, Финогентов I]
Другие функции задания абсолютной позиции курсора в Си:
Функции Turbo C++
ФУНКЦИЯ | GOTOXY |
ОПИСАНА В: | <conio.h> (содержит прототип функции) |
СИНТАКСИС: |
void gotoxy( x, y ); int x; int y: |
НАЗНАЧЕНИЕ: | Позиционирует курсор в текстовом окне. |
ОПИСАНИЕ: | gotoxy перемещает курсор в текстовом окне в указанную позицию. Если координаты указаны неверно, вызов данной функции игнорируется. Например, это произойдёт при вызове gotoxy(80,30) когда окно имеет размеры 40 столбцов на 25 строк. |
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет. |
ПЕРЕНОСИМОСТЬ: | Работает только на системах, совместимых с IBM PC. Аналогичная функция есть в Turbo Pascal. |
Функции SPHINX C--