4.3.2. Средства BIOS

Функции DOS вывода на экран позволяют перенаправлять вывод в файл, но не дают возможности вывести текст в любую позицию экрана и не разрешают из­менить цвет текста. DOS предполагает, что для более тонкой работы с экраном программы должны использоваться видеофункции BIOS. BIOS (базовая система ввода-вывода) - это набор программ, расположенных в постоянной памяти ком­пьютера, которые выполняют его загрузку сразу после включения и обеспечива­ют доступ к отдельным устройствам, в частности к видеоадаптеру. Все функции видеосервиса BIOS вызываются через прерывание 10h. Рассмотрим функции, ко­торые могут быть полезны для вывода текстов на экран.

Выбор видеорежима

BIOS позволяет переключать экран в различные текстовые и графические режимы. Режимы отличаются друг от друга разрешением (для графических) и ко­личеством строк и столбцов (для текстовых), а также количеством возможных цветов.

Вывод на экран в текстовом режиме ї

INT 10h, АН = ООк Установить видеорежим Вход:   AH = 00h

AL = номер режима в младших У битах

Вызов этой функции приводит к тому, что экран переводится в выбранный режим. Если старший бит AL не установлен в 1, экран очищается. Номера тексто­вых режимов - О, І, 2, 3 и У. О и І - 16-цветные режимы 40x25 (с 25 строками по 40 символов в строке), 2 и 3 - І6-цветньіе режимы 80x25, У - монохромный ре­жим 80x25. Мы не будем пока рассматривать графические режимы, хотя функ­ции вывода текста на экран DOS и BIOS могут работать и в них. Существуют и дру­гие текстовые режимы с более высоким разрешением (80x43,80x60,132x50 и т. д.), но их номера для вызова через эту функцию отличаются для разных видеоадапте­ров (например, режим 61h - 132x50 для Cirrus 5320 и 132x29 для Genoa 6400). Однако, если видеоадаптер поддерживает стандарт VESA BIOS Extention, в режи -мы с высоким разрешением можно переключаться, используя функцию 4Fh.

INT 10h, АН =4Fh, AL = 02h. Установить видеорежим ' SuperVGA Вход:    AX = 4F02h

BX = номер режима в младших 13 битах

Если бит І5 регистра ВХ установлен в 1, видеопамять не очищается. Тексто­вые режимы, которые можно вызвать с использованием этой функции: 80x60 (ре­жим 1081т), 132x25 (1091т), 132x43 (10Ah), 132x50 (10Bh), 132x60 (10Ch).

Видеорежим, используемый в DOS по умолчанию, - текстовый режим 3.

Управление положением курсора

INT 10h, АН- 02kУстановить положение курсора Вход:    АН = 02h

ВН = номер страницы DH = строка DL = столбец

С помощью этой функции можно установить курсор в любую позицию экра­на, и дальнейший вывод текста будет происходить из этой позиции. Отсчет номе­ра строки и столбца ведется от верхнего левого угла экрана (символ в левой вер­хней позиции имеет координаты 0, 0). Номера страниц 0-3 (для режимов 2 и 3) и 0-У (для режимов 0 и І) соответствуют области памяти, содержимое которой в данный момент отображается на экране. Можно вывести текст в неактивную в настоящий момент страницу, а затем переключиться на нее, чтобы изображение изменилось мгновенно.

INT 10h,AH = 03k Считать положение и размер курсора Вход:   АН = 03h

ВН = номер страницы Выход:  DH, DL = строка и столбец текущей позиции курсора

СН, CL = первая и последняя строки курсора

{ЦИЦЩЦЦ1   Основы программирования для MS DOS

Возвращает текущее состояние курсора на выбранной странице (каждая стра­ница использует собственный независимый курсор).

Вывод символов на экран

Каждый символ на экране описывается двумя байтами - ASCII-кодом симво­ла и байтом атрибута, указывающим цвет символа и фона, а также является ли символ мигающим.

Атрибут символа

□ бит 7: символ мигает (по умолчанию) или фон яркого цвета (если его дей­ствие было переопределено видеофункцией 10h);

□ биты 6-4: цвет фона;

□ бит 3: символ яркого цвета (по умолчанию) или фон мигает (если его дей­ствие было переопределено видеофункцией llh);

□ биты 2-0: цвет символа.

Цвета кодируются в битах, как показано в табл. 18.

INT 10h, АН- 08k. Считать символ и атрибут символа в текущей позиции 'курсора Вход:    АН - 08h        ■ -

ВН = номер страницы Выход: АН = атрибут символа AL = ASCII-код символа

INT 10h, АН- 09h: Вывести символ с заданным атрибутом на экран Вход:   AH = 09h

ВН    номер страницы

AL = ASCII-код символа

BL = атрибут символа

СХ = число повторений символа

С помощью этой функции можно вывести на экран любой символ, включая даже символы CR и LF, которые обычно интерпретируются как конец строки. В графических режимах СХ не должен превышать число позиций, оставшееся до правого края экрана.

INT 10h, АН=* OAh: Вывести символ с текущим атрибутом на экран Вход:   АН = OAh

ВН    номер страницы AL - ASCII-код символа

СХ = число повторений символа

Эта функция также выводит любой символ на экран, но в качестве атрибута символа используется атрибут, который имел символ, находившийся ранее «дан­ной позиции.

Вывод на экран в текстовом режиме .^вШННИ

Таблица 13. _Атрибуты символов

Атрибут

Обычный цвет

Яркий цвет

оооь

Черный

Темно-серый

001b

Синий

Светло-синий

оюь

Зеленый

Светло-зеленый

011Ь

Голубой

Светло-голубой

100b

Красный

Светло-красный

101b

Пурпурный

Светло-пурпурный

110Ь

Коричневый

Желтый

111В

Светло-серый

Белый

INTWh, АН =0Eh: Вывести символ в режиме телетайпа

Вход: АН = OEh

ВН = номер страницы AL = ASCII-код символа

Символы CR LF BEL (7) интерпретируются как управляющие

символы. Если текст при записи выходит за пределы нижней строки, экран про­кручивается вверх. В качестве атрибута используется атрибут символа, находив­шегося в данной позиции.

INT 10h, АН = 13к Вывести строку символов с заданными атрибутами Вход:    АН - 13h

AL = режим вывода:

бит 0: переместить курсор в конец строки после вывода бит l: строка содержит не только символы, но и атрибуты, так что каждый символ описывается двумя байтами: ASCII-код

и атрибут

биты 2-7: зарезервированы СХ = длина строки (только число символов) BL = атрибут, если строка содержит только символы DH, DL   строка и столбец, начиная с которых будет выводиться строка = адрес начала строки в памяти

выводит на экран символов, интерпретируя управляю-

щие символы CR (ODh), LF (OAh), BS (0S) и BEL (07). Если строка подготовлена

в формате символ,атрибут - гораздо быстрее просто скопировать ее в видеопа­мять, о чем рассказано в следующей главе.

Воспользуемся теперь функциями BIOS, чтобы усовершенствовать программу

DOSOUT1 и вывести на экран все 256 символов, включая даже символы перевода строки. Кроме того, для лучшей читаемости таблицы после каждого символа бу­дет выводиться пробел.

I;

программирования для MS DOS

biosout.asm

Выводит на экран

все ASCII-символы без исключения.

start:

Cloop:

.model

tiny

 

. code

 

 

org

100h

Начало СОМ-файла.

mov

ax,O003h

 

int

10h

Видеорежим З (очистка экрана

 

 

и установка курсора в О, О).

mov

dx,0"

БН и     будут использоваться

 

 

для хранения положения курсора.

 

 

Начальное положение - 0,0.

mov

si,256

81 будет счетчиком цикла.

mov

al,0

Первый символ - с кодом ОСЛ.

mov

ah, 9 .

Номер видеофункции "вывод символа с атрибутом

mov

cx,l

Выводится один символ за раз..

mov

bl,00011111b

Атрибут символа - белый на синем.

int

10h

Вывести символ на экран

push

ax

Сохранить текущий символ и номер функции;

mov

ah,2

Номер видеофункции 2 -

 

 

изменить положение курсора.

inc

dl

Увеличить текущий столбец на 1.

int

10h

Переместить курсор

mov

ax,0920h

АН = 09, АЬ = 20ґі (АЗШ-код пробела)

int ■

10h

Вывести пробел.

mov

ah, 2

Номер видеофункции 2.

inc

dl

Увеличить столбец на 1.

int

10h

Переместить курсор.

pop

ax

Восстановить номер функции в аіі

 

 

и текущий символ в а1.

inc

al

Увеличить АЬ на 1 - следующий символ.

test

al.OFh

Если АЬ не кратен 16,

jnz

continue_loop

 

 

 

продолжить цикл.

push

ax

Иначе - сохранить номер функции

 

 

и текущий символ.

mov

ah,2

Номер видеофункции 2.

inc

dh

Увеличить номер строки на 1.

mov

dl,0

Столбец =0.

int

10h •

Установить курсор на начало следующей строки.

pop

ax

Восстановить номер видеофункции

 

 

и текущий символ.

_loop:

 

 

dec

si

Уменьшить 81 на 1.

 

 

Если он не стал нулем - продолжить.

jnz

cloop

СХ используется внутри цикла,

ret

end

так что нельзя применить команду LOOP для его организации.

Завершение СОМ-файла.

start

Так как функция выводит символ в позиции курсора, но ,не перемещает сам курсор, это приходится делать каждый раз специально.

Функции BIOS удобны для переключения и настройки видеорежимов, но ча­сто что вывод текста на экран гораздо быстрее и проще выполнять

обычным копированием изображения в видеопамять.