Вывод на экран средствами BIOS
Рассмотрим теперь средства вывода на экран, реализуемые драйвером BIOS, программное обращение к которому осуществляется с помощью прерывания Int 10h. При работе в текстовом режиме обычно используются следующие функции драйвера:
02h - установить позицию курсора;
03h - получить позицию курсора;
05h - установить видеостраницу;
06h - инициализировать или прокрутить вверх окно;
07h - инициализировать или прокрутить вниз окно;
08h - прочитать символ и атрибут в позиции курсора;
09h - вывести символ и атрибут в позицию курсора;
0Ah - вывести символ в позицию курсора;
0Eh - вывести символ в режиме телетайпа;
10h, подфункция 03h - переключить бит мерцание/яркость;
13h - вывести строку в режиме телетайпа.
Функция 02h позволяет позиционировать текстовый курсор, задавая его местоположение в виде номера строки (0...24) и номера столбца (0...79). Видео драйвер поддерживает 8 независимых курсоров - по одному на каждую страницу, причем функция 02h позиционирует курсор независимо от того, какая страница является активной.
Функция 03h позволяет получить и сохранить текущее положение курсора. Это дает возможность перейти временно в другое место экрана, сформировать там изображение, а затем вернуться на старое место.
Функция 05h переключает видеостраницы дисплея. Если дисплей находится в текстовом режиме, то переключаются текстовые страницы (0...7), если установлен графический режим, то переключаются графические страницы (0...1).
Большая часть описываемых ниже функций вывода на экран (кроме подфункции переключения мерцания/яркости и функции вывода строки в режиме телетайпа) позволяют формировать изображение на любой видеостранице, как активной в настоящей момент, так и скрытой. Это дает возможность либо подготовить заранее несколько страниц и по мере необходимости быстро их переключать, либо, пока одна страница выводиться на экран, готовить изображение на следующей.
С помощью функций 06h и 07h в заданном месте экрана дисплея создаются цветные прямоугольные окна заданного размера. Если в созданные ранее окна выведен какой-либо текст то с помощью этих же функций можно прокручивать текст вверх или вниз. При этом текст, уходящий за край окна, пропадает, а из-под противоположного края появляются пустые строки с заданными атрибутами цвета. Для заполнения появляющихся строк текстом следует использовать подходящие функции DOS или BIOS, причем контроль местоположения, длины и цвета строк возлагается на программиста. Драйвер только прокручивает заданную прямоугольную область экрана (вместе с текстом в ней).
Функции 09h, 0Ah, 0Eh и 13h служат для вывода на экран отдельных символов и символьных строк (в цикле), функции 09h и 0Ah не выполняют фильтрации управляющих символов, поэтому с их помощью можно выводить все символы кодовой страницы. Предусмотрен вывод одного и того же символа заданное число раз, что можно использовать при создании рамок и других орнаментов. Вывод символа не перемещает курсор поэтому каждый раз перед применением функций 09h или 0Ah следует позиционировать курсор с помощью функции 02h. Различие функций 09h и 0Ah заключается в том, что первая позволяет вывести символ с любым атрибутом, а вторая использует прежний атрибут той позиции, куда выводится символ.
Функция 0Eh фильтрует управляющие коды 07h (звуковой сигнал), 08h (возврат на шаг), 10h (перевод строки) и 13h (возврат каретки), выполняя соответствующие им действия. Курсор перемещается после вывода каждого символа, что дает возможность выводить целые строки. Однако атрибут символа установить нельзя, выводимый символ приобретает прежний атрибут той позиции, куда он выводится. При необходимости вывода символа с новым атрибутом следует сначала вывести в заданную позицию символ пробела с требуемым атрибутом (функцией 09h), а затем туда же послать символ с помощью функции 0Eh.
Важным свойством функции 0Eh является автоматический переход на следующую строку после завершения предыдущей, а также прокрутка экрана вверх на одну строку после заполнения самой нижней строки.
Функция 13h предназначена для вывода строк с указанием атрибутов как каждого символа в отдельности, так и всей строки. Функция может выполняться в четырех вариантах в зависимости от кода режима, указываемого в регистре AL. В режимах 0 и 1 атрибут символов указывается сразу для всей строки в регистре BL, причем в режиме 0 курсор не смещается в процессе вывода, а в режиме 1 - смещается на длину строки. В режимах 2 и 3 атрибуты символов включаются в выводимую строку, в которой, таким образом, чередуются коды атрибутов и коды символов, что усложняет формат строки, но позволяет устанавливать атрибуты для каждого символа независимо. Режим 2 отличается от режима 3 тем, что в первом случае курсор не смещается, а во втором смещается на длину строки.
При вызове функции 13h в регистре DX задаются координаты начала выводимой строки (в DH - строка экрана и в DL -столбец), а в регистре СХ - длина выводимой строки, которая в режимах 2 и 3 оказывается за счет байтов с атрибутом в два раза больше длины строки, реально появляющейся на экране. Несколько необычно указывается адрес выводимой строки. Она должен быть помещен в регистры ES:BP (ES- сегментный адрес и ВР - смещение в пределах сегмента).
Функция 13h выводит не все символы, так как коды 07h, 08h, 0Ah и 0Dh рассматриваются ею, как управляющие.
При выводе на экран средствами драйвера BIOS необходимо иметь в виду, что ввод с клавиатуры <Ctrl>/C не приводит к завершению программы. Следует опасаться бесконечных циклов вывода на экран - выход из них возможен только путем перезагрузки компьютера.
Подфункция 03h функции 10h (прерывание 10h), в отличие от описанных выше функций вывода символов и строк, воздействует сразу на весь экран, влияя на отображение тех символов, у которых установлен старший бит атрибута фона. Функция позволяет либо приписать этот бит яркости фона, давая тем самым возможность выводить на экран 16 цветов фона, либо назначить его атрибуту мерцания символа. В последнем случае цвет фона может принимать только 8 значений.