Общая характеристика процесса вывода текста
При установке текстовых видеорежимов BIOS вычисляет необходимый для работы объем видеопамяти. Если режим позволяет выводить на экран м строк, содержащих по N символов каждая, то для хранения кодов символов вместе с атрибутами требуется M*N*2 байта видеопамяти. Для определения размера страницы это произведение увеличивается до ближайшего значения, кратного числу 4096, и сохраняется в слове 044Ch области данных BIOS. В зависимости от видеорежима страница может занимать 4096, 8192 или 16384 байта. Соответственно, в сегменте видеопамяти может располагаться 16, 8 или 4 страницы.
Для хранения позиции курсора на каждой странице в области данных BIOS (см. Пример 5.3) выделяется слово, содержащее номер строки (старший байт) и столбца (младший байт), на пересечении которых он расположен. Всего в области данных зарезервировано восемь слов, в соответствии с количеством страниц, поддерживаемых BIOS. В исходном состоянии эти слова очищены, что соответствует расположению курсора в начале каждой страницы.
Номер страницы указывается при вызове всех функций прерывания int 10h, выполняющих вывод символов или строк, но фактически функции 09, ОАЬ и ОЕb прерывания int 10h размещают выводимые символы на нулевой странице. Реально номер страницы использует только функция I3h. По нему она определяет текущее положение курсора на странице и пересчитывает его в относительный адрес (адрес на странице). Затем номер страницы умножается на ее размер и получается смещение начала страницы в видеобуфере. Сумма этих двух величин и является адресом, начиная с которого записываются выводимые символы.
Страница является активной, если ее содержимое отображается на экране. В соответствии со стандартом VGA IBM в состав видеоконтроллера входят два однобайтовых регистра, содержащих адрес видеопамяти, начиная с которого ее содержимое выводится на экран. В регистре 12 (ось) хранится старший байт этого адреса, а в регистре 13 (ось) – младший. Доступ к этим регистрам осуществляется через порт 3D4h, если монитор цветной, или 3B4h, если он черно-белый.
После включения или перезагрузки компьютера BIOS очищает указанные регистры, поэтому активной является нулевая страница, расположенная в начале сегмента видеобуфера. Для изменения отображаемой области надо записать в регистры 12 и 13 новый адрес видеопамяти.
Задача может самостоятельно изменять адрес начала отображаемой области, но если при выводе текста используется поддержка BIOS, то для смены активной страницы лучше вызывать функцию 05 прерывания int 10h. Перед ее вызовом в регистре ai указывается номер новой активной страницы, а в регистре ah – код 05. Эта функция извлекает размер страницы из слова 044сь области данных BIOS, умножает его на указанный номер и результат помещает в регистры 12 и 13. На экране появляется содержимое новой страницы. Кроме того, функция записывает в слово 044Eh (пример 5.3) смещение активной страницы от начала сегмента видеобуфера.
Фрагмент области данных BIOS
При общей характеристике BIOS в разделе говорилось, что ее процедуры используют пространство оперативной памяти, называемое областью данных BIOS. Оно расположено в нулевом сегменте оперативной памяти ПК, начиная с адреса 400h. В частности, при выводе символов на экран функции прерывания int 10h используют следующие слова и байты, расположенные в области данных.
Пример 5.3. Фрагмент области данных BIOS.
0000: 0449 – (байт) установленный видеорежим; 0000: 044А – (слово) количество столбцов (размер строки); 0000: 044С – (слово) размер страницы в байтах; 0000: 044Е – (слово) смещение активной страницы от начала видеобуфера; 0000: 0450 – (8 слов) позиции курсора на восьми страницах видеопамяти; 0000: 0460 – (слово) номера первой и последней строк рисунка курсора; 0000: 0462 – (байт) номер активной страницы; 0000: 0463 – (байт) базовый адрес видеоконтроллера (3D4h или 3B4h); 0000: 0484 – (байт) номер последней строки на экране; 0000: 0485 – (слово) размер рисунка символа в байтах.
Перечисленные в этом примере величины могут пригодиться в тех случаях, когда вы программируете вывод текста без использования функций BIOS.