Опубликован: 15.11.2010 | Уровень: для всех | Доступ: платный
Лекция 2:

Прямой ввод-вывод: организация и функции. Вывод на дисплей. Часть 1

< Лекция 1 || Лекция 2: 123 || Лекция 3 >

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
Входные данные:
  • AH = 0 - номер функции;
  • AL - номер требуемого режима.
Выходные данные: нет.

Пример 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.4. Зарезервированные константы для функции textmode
Константы текстовых режимов
Символьная константа Числовое значение Текстовый режим
LASTMODE -1 предыдущий текстовый режим
BW40 0 черный и белый, 40 колонок
C40 1 цветной, 40 колонок
BW80 2 черный и белый, 80 колонок
C80 3 цветной, 80 колонок
MONO 7 монохромный, 80 колонок
C4350 64 EGA 43 строки и VGA 50 строк

Пример 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;
ФУНКЦИЯ ВОЗВРАЩАЕТ:
  • AH - количество символов в строке в текущем видеорежиме;
  • AL - текущий видеорежим (целое значение, см. таблицу 2.3) и функцию SETVIDEOMODE ;
  • BH - текущая страница дисплея.

Таким образом, пример 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 при программировании программ-фильтров, а также программ-просмотрщиков. Вы обязательно оцените всю мощь "стандартных" средств консольного вывода!

< Лекция 1 || Лекция 2: 123 || Лекция 3 >
Artem Bardakov
Artem Bardakov
Россия
Андрей Алабин
Андрей Алабин
Россия