Россия |
Прямой ввод-вывод: организация и функции. Вывод на дисплей. Часть 1
2.2.1. Реализация на Ассемблере
2.2.1.1. Определение текущего графического режима
Для этого применяют функцию F прерывания 10H [8].
Входные параметры: регистр AH должен содержать значение 0FH.
Прерывание возвращает:
- AL - номер режима;
- BH - текущая страница дисплея;
- AH - число символов в строке дисплея.
Пример 2.9
; --- в сегменте данных MODE_SCREEN DB ? NUMBER_COLS DB ? CURRENT_PAGE DB ? ; --- в сегменте кода MOV AH, 0FH ; номер функции INT 10H MOV MODE_SCREEN, AL ; номер режима из AL MOV NUMBER_COLS, AH ; число символов из AH MOV CURRENT_PAGE, BH ; номер текущей страницы из BH
2.2.1.2. Установка режима работы дисплея
Режим работы дисплея на языке ассемблера можно установить при помощи функции 0 прерывания 10H [8] или функции 9 прерывания 21H с помощью escape-последовательности.
ФУНКЦИЯ 0 ПРЕРЫВАНИЯ 10H | |
Входные данные: |
|
Выходные данные: | нет. |
Пример 2.10.
; --- в сегменте данных MODE_SCREEN DB 3 ; разрешение 80х25, текст, цвет ; --- в сегменте кода MOV AH, 0 MOV AL, MODE_SCREEN INT 10H ; устанавливаем режим Функция вывода строки прерывания 21H
Если в системе установлен драйвер ANSI.SYS, то с помощью функции 9 можно также выводить escape-последовательности. Более подробно о esc (escape) последовательностях см. таблицу 2.1. Пока нам важно знать, что с помощью этих последовательностей можно менять режимы работы дисплея.
Пример 2.11.
; --- в сегменте данных NORMAL_RES DB 27,'[=3h$' ; escape-последовательность для норм. разрешения. ; --- в сегменте кода MOV AH, 9 ; номер функции LEA DX, NORMAL_RES ; DS:DX должны указывать на строку INT 21H
2.2.2. Реализация функции в языках Си
Хотя в стандарт ANSI C не входят функции для управления графическим режимом и цветом символов, в реализации языка Си от Borland и SPHINX C-- она имеется. Их синтаксис приведён ниже.
ФУНКЦИЯ | TEXTMODE |
ОПИСАНА В: | <conio.h> |
СИНТАКСИС: | textmode( int newmode ) ; |
НАЗНАЧЕНИЕ: | Функция textmode выбирает указанный режим, в зависимости от символьной переменной, содержащей следующие константы (см. таблицу 2.4). |
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | нет. |
Пример 2.10 на языке Turbo C можно записать строкой:
Пример 2.12.
… textmode( C80 ); …
а пример 2.11 - следующим образом:
Пример 2.13
… const char cNormal_res = "\x1B[=3h"; … puts( cNormal_res ); …
где puts - функция вывода строки на дисплей.
ФУНКЦИЯ | SETVIDEOMODE |
ОПИСАНА В: | файл "VIDEO.H--"; |
СИНТАКСИС: | SETVIDEOMODE( режим ); |
НАЗНАЧЕНИЕ: | Функция изменяет текущий видеорежим, используя прерывание BIOS. |
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Функция не возвращает значений. |
ФУНКЦИЯ | GETVIDEOMODE |
ОПИСАНА В: | файл "VIDEO.H--"; |
СИНТАКСИС: | GETVIDEOMODE(); |
НАЗНАЧЕНИЕ: | Получает величину текущего видеорежима через прерывание BIOS; |
ФУНКЦИЯ ВОЗВРАЩАЕТ: |
|
Таким образом, пример 2.12 на языке C-- реализуется следующим образом:
Пример 2.14
byte bNorm_res; bNorm_res = 3; … SETVIDEOMODE( bNorm_res ); …
Пример 2.9 реализуется на C-- как:
Пример 2.15
byte bmode_screen, bnumber_cols, bcurrent_page; … GETVIDEOMODE(); bmode_screen = AL; bnumber_cols = AH; current_page = BH. …
а пример 2.13 запишется как:
Пример 2.16
… WRITESTR( "\x1B[=3h" ); …
2.2.3. Реализация в Quick Basic
В Quick Basic есть следующие операторы для изменения режима работы дисплея [8]:
ФУНКЦИЯ | SCREEN |
Синтаксис: | SCREEN первый_параметр, второй_параметр |
Назначение: | Функция служит для переключения режимов работы дисплея: "текстовый - графический" (первый_параметр) и "монохромный - цветной" (второй_параметр) |
Например, команда:
SCREEN 0, 1
- переключает экран в цветной текстовый режим, а команда:
SCREEN 1, 0
- в графический монохромный режим.
ОПЕРАТОР | WIDTH |
Синтаксис: | WIDTH [40|80] |
Назначение: | В текстовом режиме данный оператор задаёт 40 символов в строке ( WIDTH 40 ) или 80 символов в строке ( WIDTH 80 ). |
Кроме того, Basic поддерживает также управление дисплеем с помощью escape последовательностей
Таким образом, программа их примера 2.10. на языке Quick Basic будет следующим:
Пример 2.17
… SCREEN 0, 1 WIDTH 80 …
2.2.4. Реализация в Perl, Python и Turbo Prolog
При консольном выводе в Perl, Python и Turbo Prolog невозможно осуществлять управление режимом работы экрана - эти языки не поддерживают escape - последовательности драйвера ANSI.SYS.
Примечание: в языке Турбо Пролог 2.0 всё-таки есть функции для "низкоуровневого" манипулирования разрешением экрана, однако в данном курсе эти возможность не рассматривается. Подробнее смотри "Руководство по языку Turbo Prolog 2.0"[53].
Подробнее об escape - последовательностях см. таблицу 2.1.
2.3. Резюме
В данной лекции Вы познакомились с основными функциями "консольного вывода" символа и строки символов в операционной системе MS-DOS и режимами работы дисплея в той же операционной системе. Эти навыки обязательно потребуются Вам при создании "консольных приложений" в операционных системах MS-DOS и MS Windows. Например, консольные приложения можно использовать вместо вызовов API при программировании программ-фильтров, а также программ-просмотрщиков. Вы обязательно оцените всю мощь "стандартных" средств консольного вывода!