Devotes - Предисловие
Уважаеме посетители, Сайт переезжает на другой хост http://www.devote.ru/
   Поиск по сайту:  
» Главная
Книги
Музыка
Download
Форум
[Назад] [Далее]

4.3.2. Средства BIOS

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


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

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


INT 10h, АН = 00 — Установить видеорежим

Ввод: AL = номер режима в младших 7 битах
Вывод: Обычно никакого, но некоторые BIOS (Phoenix и AMI) помещают в AL 30Н для текстовых режимов и 20h для графических

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


INT 10h, АН = 4Fh, AL = 02 — Установить SuperVGA-видеорежим

Ввод: ВХ = номер режима в младших 13 битах
Вывод: AL = 4Fh, если эта функция поддерживается
АН = 0, если переключение произошло успешно
АН = 1, если произошла ошибка

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


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


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


INT 10h, АН = 02 — Установить положение курсора

Ввод: АН = 02
ВН = номер страницы
DH = строка
DL = столбец

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


INТ 10h, АН = 03 — Считать положение и размер курсора

Ввод: АН = 03
ВН = номер страницы
Вывод: DH, DL = строка и столбец текущей позиции курсора
СН, CL = первая и последняя строки курсора

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


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

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


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

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


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


  Обычный цвет Яркий цвет
000b черный темно-серый
001b синий светло-синий
010b зеленый светло-зеленый
011b голубой светло-голубой
100b красный светло-красный
101b пурпурный светло-пурпурный
110b коричневый желтый
111b светло-серый белый

INT 10h, АН = 08 — Считать символ и атрибут символа в текущей позиции курсора

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

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

Ввод: АН = 09
ВН = номер страницы
AL = ASCII-код символа
BL = атрибут символа
СХ = число повторений символа

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


INT 10h, АН = 0Ah — Вывести символ с текущим атрибутом на экран

Ввод: АН = 0Ah
ВН = номер страницы
AL = ASCII-код символа
СХ = число повторений символа

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


INT 10h, АН = 0Eh — Вывести символ в режиме телетайпа

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

Символы CR (0Dh), LF (0Ah), BEL (7) интерпретируются как управляющие символы. Если текст при записи выходит за пределы нижней строки, экран прокручивается вверх. В качестве атрибута используется атрибут символа, находившегося в этой позиции.


INT 10h, AH = 13h — Вывести строку символов с заданными атрибутами

Ввод: АН = 13h
AL = режим вывода:
    бит 0 — переместить курсор в конец строки после вывода
    бит 1 — строка содержит не только символы, но также и атрибуты, так что каждый символ описывается двумя байтами: ASCII-код и атрибут
    биты 2 – 7 зарезервированы
СХ = длина строки (только число символов)
BL = атрибут, если строка содержит только символы
DH,DL = строка и столбец, начиная с которых будет выводиться строки
ES:BP = адрес начала строки в памяти

Функция 13h выводит на экран строку символов, интерпретируя управляющие символы CR (0Dh), LF (0Ah), BS (08) и BEL (07). Если строка подготовлена в формате символ,атрибут — гораздо быстрее просто скопировать ее в видеопамять, о чем рассказано в следующем разделе.


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

; biosout.asm
; Выводит на экран все ASCII-символы без исключения
        .model   tiny
        .code
        org      100h    ; Начало СОМ-файла
start:
        mov      ax,0003h
        int      10h     ; Видеорежим 3 (очистка экрана
                         ; и установка курсора в 0, 0)
        mov      dx,0    ; DH и DL будут использоваться
                         ; для хранения положения курсора.
                         ; Начальное положение - 0,0
        mov      si,256  ; SI будет счетчиком цикла
        mov      al,0    ; Первый символ - с кодом 00h
        mov      ah,9    ; Номер видеофункции "вывод символа с атрибутом"
        mov      cx,1    ; Выводится один символ за раз
        mov      bl,00011111b
                         ;атрибут символа - белый на синем
cloop:
        int      10h     ; Вывести символ на экран
        push     ax      ; Сохранить текущий символ и номер функции
        mov      ah,2    ; Номер видеофункции 2 -
                         ; изменить положение курсора
        inc      dl      ; Увеличить текущий столбец на 1
        int      10h     ; Переместить курсор
        mov      ax,0920h ; АН = 09, AL = 20h (ASCII-код пробела)
        int      10h     ; Вывести пробел
        mov      ah,2    ; Номер видеофункции 2
        inc      dl      ; Увеличить столбец на 1
        int      10h     ; Переместить курсор
        pop      ax      ; Восстановить номер функции в ah
                         ; и текущий символ в al
        inc      al      ; Увеличить AL на 1 - следующий символ
        test     al,0Fh  ; Если AL не кратен 16,
        jnz      continue_loop
                         ; продолжить цикл,
        push     ax      ; иначе - сохранить номер функции
                         ; и текущий символ
        mov      ah,2    ; Номер видеофункции 2
        inc      dh      ; Увеличить номер строки на 1
        mov      dl,0    ; Столбец = 0
        int      10h     ; Установить курсор на начало следующей строки
        pop      ax      ; Восстановить номер видеофункции
                         ; и текущий символ
continue_loop:
        dec      si      ; Уменьшить SI на 1,
                         ; если он не стал нулем - продолжить
        jnz      cloop   ; CX используется внутри цикла,
                         ; так что нельзя использовать команду LOOP
                         ; для его организации
        ret              ; Завершение СОМ-файла
        end      start

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

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


Hosted by uCoz