Программирование EGA и VGA
3. BIOS экранного ввода/вывода
Описываемый ниже набор функций BIOS (номера 8 - fh) работает непосредственно с экранными изображениями, то есть осуществляет запись или чтение содержимого экранной памяти или схемы управления цветом. Исключение составляет функция fh, которая возвращает текущий видеорежим. Как и функции 0 - 7, функции видеообмена поддерживаются всеми IBM-адаптерами. Рассматриваемые процедуры обмена с видеопамятью достаточно медленные, поэтому большинство программистов стараются свести к минимуму их использование в конечном продукте. Однако некоторые из процедур успешно используются в прикладных программах.
Например, процедура записи символа работает во всех режимах. Эта возможность особенно полезна для вывода текста в графических режимах в тех случаях, когда не требуется сложная обработка текста (такая как различение размера букв или выравнивание пикселей). Процедуры вывода символа в графическом режиме сложны для написания и, возможно, данная задача не стоит затрачиваемых усилий.
Вызов функции 8: Чтение атрибута/символа в текущей позиции курсора.
Комментарии
Функция может быть использована для чтения символа с любой страницы. Возвращаемая информация содержит символ, расположенный в текущей позиции курсора указанной страницы (см. функцию 2 для установки текущей позиции курсора). Атрибут представляет собой однобайтовое значение, описывающее символ и фон в соответствии со следующим форматом:
При работе с цветными мониторами три бита цвета фона и символа позволяют получить восемь различных цветов. При использовании монохромных мониторов могут быть установлены следующие значения битов, описывающих цвет фона: все 0 - черный, все 1 - альтернативный цвет. Биты, описывающие цвет символа, могут принимать значения: 000 - черный, 001 для подчеркивания, 111 - для обычного символа. Байт атрибута имеет смысл только в алфавитно-цифровых (текстовых) режимах. См. функции 10h и 11h для получения дополнительных сведений о кодах атрибутов и символов.
Исходные данные
Регистры (устанавливаются до вызова функции):
- AH: устанавливается 8
- BH: номер страницы (см. функцию 5)
Выходные данные
Регистры (опрашиваются после вызова функции):
- AL: ASCII-код символа в текущей позиции курсора
- AH: код атрибута (для текстового режима)
Приводимая ниже программа возвращает символ ASCII (и значение байта атрибута), расположенного на строке 5 столбца 15. Можно попробовать выполнить эту программу после работы одного из двух следующих примеров (вызов функции 9 или 0ah). Если используются оба примера, их выполнение рекомендуется провести в следующем порядке: функции 0ah, 8, 9 и 8. Это позволит продемонстрировать изменение байта атрибута.
Пример на языке ассемблера:
data segment public msg db 'Row 5, Column 15 contains ASCII' db 'character' char db 3 dup (?) db ', and attribute value ' attr db 3 dup (?) m_len equ $-msg ;формирование константы от текущей ;метки до начала сообщения data ends code segment public assume CS:code main proc far start: push DS sub AX,AX push AX mov AX,data mov DS,AX assume DS:data mov AX,data mov ES,AX assume ES:data mov BH,0 ;страница 0 mov DH,5 ;строка 5 mov DL,15 ;столбец 15 mov AH,2 ;функция 2 - установка позиции курсора int 10h ;обращение к видео-BIOS mov BH,0 ;страница 0 mov AH,8 ;функция 8 - чтение символа и атрибута int 10h ;обращение к видео-BIOS mov BL,AH ;временная запись атрибута в BL mov DI,offset char call bin2asc mov AL,BL ;получение атрибута mov DI,offset attr call bin2asc mov DH,20 ;строка 20 mov DL,0 ;столбец 0 mov BH,0 ;страница 0 mov BP,offset msg ;ES:BP указатель на строку mov BL,0fh ;белый высокой яркости mov CX,m_len ;длина строки mov AL,1 ;курсор перемещается ;только строка символов ;атрибут в BL mov AH,13h ;функция 13h - запись строки int 10h ;вызов видео-BIOS ret main endp bin2asc proc near COMMENT*Эта подпрограмма перевода двоичных чисел в формат ASCII написана специально для рассматриваемой в приме- ре программы и позволяет работать только с числами, меньшими 256. AL:8-битовое переводимое значение,DI: смещение в DS, получающее 2-байтовое значение ASCII * xor AH,AH ;0 в AH mov DL,100 div DL ;перевод в десятичные сотни add AL,30h ;перевод сотен в ASCII mov [DI],AL mov AL,AH xor AH,AH ;0 в AH mov DL,10 div DL ;перевод в десятичные цифры add AL,3030h ;увеличение на 30h для получения ;ASCII-кода mov [DI+1],AL ;запись десятков mov [DI+2],AH ;запись единиц ret mov DH,21 ;строка 21 mov DL,0 ;столбец 0 mov AH,2 ;функция 2 - установка поз. курсора int 10h ;вызов видео-BIOS bin2asc endp code ends end start
Вызов функции 9: Запись атрибута/символа в текущую позицию курсора.
Комментарии
Функция может быть использована для записи символа (или копий символа) на любую страницу. Символы записываются начиная с текущей позиции курсора, которая определяется с помощью обращения к функции 2. Атрибут представляет собой однобайтовое значение, описывающее символ и фон в соответствии со следующим форматом:
При работе с цветными мониторами три бита цвета фона и символа позволяют получить восемь различных цветов. При использовании монохромных мониторов могут быть установлены следующие значения битов, описывающих цвет фона: все 0 - черный, все 1 - альтернативный цвет. Биты, описывающие цвет символа, могут принимать значения: 000 - черный, 001 для подчеркивания, 111 - для обычного символа.
В графических режимах байт атрибута используется для установки цвета символа. Установка бита 7 приводит к тому, что символ накладывается на текущее содержимое экрана по принципу "Исключающее ИЛИ". См. вызов функций 10h и 11h для получения дополнительных сведений о кодах атрибутов и символов.
В алфавитно-цифровых режимах вывод большего количества копий символа, чем может поместиться на строке, приведет к переносу символов на следующую строку. В графическом режиме все выводимые копии должны помещаться на одной строке. После завершения обращения к функции позиция курсора не изменяется (даже при выводе большого количества копий символа). Позиционирование символа должно выполняться средствами программы.
Вывод управляющих символов выполняется так же, как и вывод отображаемых символов. Поэтому управляющие символы "Забой", "Возврат каретки", "Перевод строки" и т.д. должны выполняться путем позиционирования курсора.
Исходные данные
Регистры (устанавливаются до вызова функции):
- AH: устанавливается 9
- AL: ASCII-код символа
- BH: номер страницы (см. функцию 5). В режиме 13h [регистр BH используется для задания цвета фона]
- BL: атрибут символа
- CX: количество отображаемых символов
Приведенная ниже программа выполняет посимвольную печать сообщения, изменяя атрибут (цвет) каждого символа. Следует обратить внимание на действие управляющих кодов 7, 10 и 13. Сравните результат действия функций ah, eh и 13h.
Пример на языке ассемблера:
data segment public msg db 'This line demonstrates printing' db 'ASCII 7 (',7,'), 10(',10,') and' db '13(',13,').' m_len equ $-msg ;формирование константы от текущей ;метки до начала сообщения ;(длина сообщения) data ends code segment public assume CS:code main proc far start: push DS sub AX,AX push AX mov AX,data mov DS,AX assume DS:data mov DH,05 ;строка 5( для вызова функции 2) mov DL,0 ;столбец 0 (для вызова функции 2) mov CX,m_len ;число итераций mov BP,offset msg ;указатель на сообщение mov BL,1 ;инициализация BL в 1 ;начало с цвета 1 lp1: inc DX ;следующий столбец mov AH,2 ;функция 2 - установка курсора int 10h ;вызов видео-BIOS push CX ;сохранение счетчика итераций mov CX,1 ;запись одного символа mov BH,0 ;страница 0 mov AL,msg[BP];получение ASCII-кода mov AH,9 ;вызов функции 9 int 10h ;вызов видео-BIOS inc BP ;указатель на следующий символ inc BX ;следующий цвет ;(номер увеличивается на 1) cmp BL,15 ;если 15 jbe skp ;пропустить до skp mov BL,1 ;если 15, установить цвет 1 skp: pop CX ;восстановление счетчика итераций loop lp1 mov DH,21 ;строка 21 mov DL,0 ;столбец 0 mov AH,2 ;функция 2 - установка курсора int 10h ;вызов видео-BIOS ret main endp code ends end start