Лабораторная работа. Вывод на экран в текстовом режиме средствами BIOS
Данная работа является продолжением лабораторной работы «Вывод на экран в текстовом режиме средствами MS-DOS». Как отмечалось ранее функции MS-DOS вывода на экран позволяют перенаправлять вывод в файл, но не позволяют вывести текст в любую позицию экрана и не позволяют изменить цвет текста.
Для реализации данных возможностей программа должна использовать видеофункции BIOS. BIOS (Basic Input/Output System — базовая система ввода-вывода) — это набор программ, расположенных в постоянной памяти компьютера, которые выполняют его загрузку сразу после включения и обеспечивают доступ к некоторым устройствам, в частности к видеоадаптеру.
Все функции видеосервиса BIOS вызываются через прерывание 10h. Рассмотрим функции, которые могут быть полезны для вывода текстов на экран.
Выбор видеорежима. BIOS предоставляет возможность переключения экрана в различные текстовые и графические режимы. Режимы отличаются друг от друга разрешением (для графических) и количеством строк и столбцов (для текстовых), а также количеством возможных цветов.
АН = 00 — Установить видеорежим Ввод: AL = номер режима в младших 7 битах
Вызов этой функции приводит к тому, что экран переводится в выбранный режим. Если старший бит AL установлен в 0, то экран не очищается. Номера текстовых режимов — 0, 1, 2, 3 и 7. Режимы отличаются между собой количеством строк и столбцов, а также количеством видеостраниц. Отметим, что данная функция позволяет переводить и в графические режимы. Но работу в графических режимах рассмотрим позднее. По умолчанию стоит 3-й текстовый режим.
Установить положение курсора Ввод: АН = 02 ВН = номер страницы DH = строка DL = столбец
С помощью этой функции можно установить курсор в любую позицию экрана, и дальнейший вывод текста будет происходить из этой позиции. Отсчет номера строки и столбца ведется от верхнего левого угла экрана (символ в левой верхней позиции имеет координаты 0, 0). Номера страниц 0 – 3 (для режимов 2 и 3)и 0 – 7 (для режимов 1 и 2) соответствуют области памяти, содержимое которой в данный момент отображается на экране. Можно вывести текст в неактивную в настоящий момент страницу, а затем переключиться на нее, чтобы изображение изменилось мгновенно.
Считать положение и размер курсора Ввод: АН = 03 ВН = номер страницы Вывод: DH, DL = строка и столбец текущей позиции курсора СН, CL = первая и последняя строки курсора
Возвращает текущее состояние курсора на выбранной странице (каждая страница использует собственный независимый курсор).
Вывод символов на экран
Каждый символ на экране описывается двумя байтами — ASCII-кодом символа и байтом атрибута, указывающим цвет символа и фона, а также является ли символ мигающим.
Каждый бит атрибута символа имеет свое назначение: Бит 7: символ мигает или фон яркого цвета в зависимости от настроек видеофункции. Биты 6 – 4 задают цвет фона. Бит 3: символ яркого цвета или фон мигает в зависимости от настроек видеофункции. Биты 2 – 0 задают цвет символа.
Цвета кодируются следующим способом (первое значение для обычного цвета, второе — для яркого):
- 000b — черный (темно-серый),
- 001b — синий (светло-синий),
- 010b — зеленый (светло-зеленый),
- 011b — голубой (светло-голубой),
- 100b — красный (светло-красный),
- 101b — пурпурный (светло-пурпурный),
- 110b — коричневый (желтый),
- 111b — светло-серый (белый).
Обратите внимание на то, что цвета соответствуют шкале RGB.
Считать символ и атрибут символа в текущей позиции курсора
Ввод: АН = 08 ВН = номер страницы Вывод: АН = атрибут символа AL = ASCII-код символа.
Вывести символ с заданным атрибутом на экран Ввод: АН = 09 ВН = номер страницы AL = ASCII-код символа BL = атрибут символа СХ = число повторений символа.
С помощью этой функции можно вывести на экран любой символ, включая даже символы CR и LF, которые обычно интерпретируются как конец строки. В графических режимах СХ не должен превышать число позиций, оставшееся до правого края экрана.
Вывести символ с текущим атрибутом на экран, т.е. с атрибутом символа, находящегося ранее в этой позиции. Ввод: АН = 0Ah ВН = номер страницы AL = ASCII-код символа СХ = число повторений символа.
Вывести символ в режиме телетайпа Ввод: АН = 0Eh ВН = номер страницы AL = ASCII-код символа
Вывести строку символов с заданными атрибутами Ввод: АН = 13h AL = режим вывода:
бит 0 — переместить курсор в конец строки после вывода бит 1 — строка содержит не только символы, но также и атрибуты, так что каждый символ описывается двумя байтами: ASCII-код и атрибут биты 2 – 7 зарезервированы СХ = длина строки (только число символов) BL = атрибут, если строка содержит только символы DH,DL = строка и столбец, начиная с которых будет выводиться строки ES:BP = адрес начала строки в памяти
Задания
Задание. 4.1. Создайте com-файл (или файлы), в котором должны использоваться все указанные функции.
Задание. 4.2. Нарисуйте «разноцветную рожицу» — глаза в виде ноликов, рот из тире и т.д.
Задание. 4.3. Используя функции BIOS выведите все 256 символов таблицы ASCII по 16 символов в каждой строке. Для этого используйте следующий код, ориентированный на NASM:
Обратим внимание на то, что управляющие символы тоже выведены.
Задание. 4.4. Модифицируйте программу так, чтобы она выдавала русские буквы красным цветом, а цифры — зеленым.
При подготовке материала использована книга С.В.Зубкова «Assembler. Язык неограниченных возможностей».