Графические режимы VGA за прошедшее с момента создания (1987 год) этого типа видеоконтроллеров время сильно устарели, а текстовые используются двадцать лет и продолжают успешно применяться (благодаря простоте выполнения операций в этих режимах). Поэтому в настоящее время интерес для программистов представляет только небольшая подгруппа функций из стандартного набора VGA BIOS, предназначенная для работы в текстовом режиме:
• установка режима;
• управление положением и размером курсора;
• переключение страниц;
• управление шрифтами.
Для вызова функций VGA BIOS используется прерывание Int 10h. Набор функций очень большой, но в целом — устаревший. Ниже рассматриваются только те функции, применение которых до сих пор является целесообразным. Более подробную информацию о функциях можно получить в книгах [3,10, 29,33, 40].
Прерывание Int 10h, функция OOh: установить видеорежим
Функция предназначена для установки заданного видеорежима. Коды VGA-режимов приведены в табл. 4.1. Все современные видеоконтроллеры поддерживают текстовый режим, а также сохраняют совместимость с устаревшими графическими режимами VGA на тот случай, если пользователю понадобится запустить какую-нибудь из старых программ.
Перед вызовом прерывания требуется занести в регистры следующие значения:
• в АН — значение OOh;
• в AL — код видеорежима.
Таблица 4.1. Коды VGA-совместимых режимов
Код |
Тип режима |
Разре |
Число |
Адрес |
режима |
|
шение |
цветов |
буфера |
OOh |
Текстовый цветной* |
40×25 |
16 |
B8000h |
01 h |
Текстовый цветной |
40×25 |
16 |
B8000h |
02h |
Текстовый цветной* |
80×25 |
16 |
B8000h |
03h |
Текстовый цветной |
80×25 |
16 |
B8000h |
04h |
Графический цветной |
320×200 |
4 |
B8000h |
05h |
Графический цветной* |
320×200 |
4 |
B8000h |
06h |
Графический цветной |
640×200 |
2 |
B8000h |
07h |
Текстовый монохромный |
80×25 |
2 |
BOOOOh |
ODh |
Графический цветной |
320×200 |
16 |
AOOOOh |
OEh |
Графический цветной |
640×200 |
16 |
AOOOOh |
OFh |
Графический монохромный |
640×350 |
2 |
AOOOOh |
10h |
Графический цветной |
640×350 |
16 |
AOOOOh |
11 h |
Графический монохромный |
640×480 |
2 |
AOOOOh |
12h |
Графический цветной |
640×480 |
16 |
AOOOOh |
13h |
Графический цветной |
320×200 |
256 |
AOOOOh |
Знак «*» означает, что в данном режиме отключен механизм преобразования палитры.
Функцию установки текстового режима обычно нужно вызывать при входе в программу, работающую в этом режиме (поскольку, вообще говоря, неизвестно, в каком режиме работала DOS перед запуском программы). Функцию также вызывают перед возвратом в DOS из программы, использовавшей какой-либо графический режим — чтобы не было проблем с запуском последующих программ. Мы неоднократно пользовались данной функцией в примерах, приведенных в предыдущих главах.
Фрагмент программного кода, в котором выполняется установка текстового режима, выглядит следующим образом:
mov АН.О :код функция установки режима
mov AL,03h ;код режима
int 10h ;вызов прерывания
Прерывание Int 10h, функция 01 h: установить размер курсора
Функция предназначена для задания размера курсора в текстовом видеорежиме. Применяется она обычно в текстовых редакторах для уведомления пользователя о текущем режиме работы (вставка или замещение символов).
Перед вызовом прерывания требуется занести в регистры следующие значения:
• в АН — код Olh;
• в СН — номер начальной строки курсора в знакоместе;
• в CL — номер конечной строки курсора в знакоместе.
Номера начальной и конечной строк курсора задаются относительно верхней границы знакоместа. Для задания номеров начальной и конечной строк в регистрах CL и СН используются только разряды 0-4, в разряды 5-7 требуется записать нули.
ПРИМЕЧАНИЕ
Курсор можно сделать невидимым, если установить номер строки текущей позиции курсора за пределами нижней границы экрана (при помощи функции 02h). Это — самый надежный способ; существуют и другие приемы, но далеко не на всех видеоконтроллерах они дают нужный результат.
Прерывание Int 10h, функция 02h: установить позицию курсора
Функция позиционирует курсор на экране.
Перед вызовом прерывания требуется занести в регистры следующие значения:
• в АН — код 02h;
• в ВН — номер текстовой видеостраницы;
• в DH — номер строки (Y);
• в DL — номер столбца (X).
ПРИМЕЧАНИЕ
За начало системы координат принят левый верхний угол экрана, причем ось X направлена слева направо, а ось Y — сверху вниз В стандартном текстовом режиме значение X можно задавать в пределах от 0 до 79, значение Y — от 0 до 24. Если задать значение Y = 25, то курсор становится невидимым (уходит за нижнюю границу видеостраницы).
Прерывание Int 10h, функция 03h: получить позицию и размер курсора
Функция определяет текущую позицию курсора на заданной видеостранице, а также размер курсора.
Перед вызовом прерывания требуется занести в регистры следующие значения:
• в АИ — код 03h;
• в ВИ — номер видеостраницы.
После выполнения функции в регистрах будут размещены следующие значения:
• в СИ — номер начальной строки курсора в знакоместе;
• в CL — номер конечной строки курсора в знакоместе;
• в DH — номер строки текущей позиции курсора;
• в DL — номер столбца текущей позиции курсора.
Прерывание Int 10h, функция 05h: установить видеостраницу
В текстовом режиме данная функция позволяет выбрать в качестве текущей (рабочей) одну из нескольких доступных видеостраниц. Перед вызовом прерывания требуется занести в регистры следующие значения:
• в АИ — код 05h;
• в AL — номер видеостраницы, которую требуется установить.
Прерывание Int 10h, функция 10h, подфункция OOh: установить один регистр палитры
Функция предназначена для 16-цветных режимов (текстовых и графических). Она позволяет переопределить цвет, соответствующий одному из кодов цвета.
Перед вызовом прерывания требуется занести в регистры следующие значения:
• в АХ – код lOOOh;
• в BL — номер регистра палитры (0-15);
• в ВН — цвет.
Прерывание Int 10h, функция 10h, подфункция 01 h: установить цвет рамки экрана
Функция позволяет изменить цвет рамки экрана (по умолчанию он черный).
Перед вызовом прерывания требуется занести в регистры следующие значения:
• в АХ – код lOOlh;
• в ВН — цвет.
Прерывание Int 10h, функция 10h, подфункция 02h: установить все регистры палитры
Функция предназначена для 16-цветных режимов. Она позволяет переопределить значения 16 регистров палитры и регистра рамки экрана.
Перед вызовом прерывания требуется занести в регистры следующие значения:
• в АХ – код 1002h;
• в ES: DX — указатель на массив из 17 байт (байты 0-15 содержат цвета палитры, байт 16 — цвет рамки).
Прерывание Int 10h, функция 10h, подфункция 03h: переключить бит атрибута «мерцание/яркость»
Функция переключает значение седьмого бита байта атрибутов символа: мерцание или яркий фон.
Перед вызовом прерывания требуется занести в регистры следующие значения:
• в АХ – код 1003h;
• в BL — значение бита 7 в байте атрибутов (0 — яркий фон, 1 — мерцание символа).
ПРИМЕЧАНИЕ
Функция воздействует на режим отображения всех символов, а не на один конкретный символ. По умолчанию установка бита 7 в байте атрибутов символа вызывает его мерцание.
Ни мерцание, ни яркий фон не следует применять без особой необходимости — они утомляют оператора, сидящего за экраном монитора.
Прерывание Int 10h, функция 10h, подфункция 07h: прочитать один регистр палитры
Функция предназначена для 16-цветных режимов. Она позволяет прочитать значение цвета из заданного регистра палитры.
Перед вызовом прерывания требуется занести в регистры следующие значения:
• в АХ – код 1007h;
• в BL — номер регистра палитры (0-15).
После выполнения функция возвращает значение цвета в ВН.
Прерывание Int 10h, функция 10h, подфункция 08h: прочитать один регистр палитры
Функция позволяет прочитать значение цвета рамки экрана из соответствующего регистра видеоконтроллера.
Перед вызовом прерывания требуется занести: в регистр АХ код lOOBh.
После выполнения функция возвращает значение цвета в регистре ВН.
Прерывание Int 10h, функция 10h, подфункция 09h: прочитать все регистры палитры
Функция предназначена для 16-цветных режимов. Она позволяет прочитать и сохранить в оперативной памяти значения 16 регистров палитры и регистра рамки экрана.
Перед вызовом прерывания требуется занести в регистры следующие значения:
• в АХ – код 1009h;
• в ES:DX — указатель на массив из 17 байт для сохранения кодов цвета.
После выполнения функции байты 0-15 указанного массива содержат цвета палитры, байт 16 — цвет рамки.
Прерывание Int 10h, функция 10h, подфункция 10h: установить один регистр ЦАП
Функция предназначена для 256-цветных режимов. Она позволяет изменить оттенок, соответствующий одному из кодов цвета, путем перезаписи значений интенсивностей красного, зеленого и синего цветов в соответствующем регистре цифро-аналогового преобразователя.
Перед вызовом прерывания требуется занести в регистры следующие значения:
• в АХ – код 1010h;
• в ВХ — номер регистра ЦАП (0-255);
• в DH — новое значение интенсивности красного цвета (0-63);
• в СН — новое значение интенсивности зеленого цвета (0-63);
• в CL — новое значение интенсивности синего цвета (0-63).
Прерывание Int 10h, функция 10h, подфункция 12h: перезагрузить группу регистров ЦАП
Функция предназначена для 256-цветных режимов. Она позволяет изменить набор оттенков, соответствующих группе цветовых кодов, путем перезаписи значений интенсивностей красного, зеленого и синего цветов в последовательно расположенных регистрах цифро- аналогового преобразователя.
Перед вызовом прерывания требуется занести в регистры следующие значения:
• в АХ – код 1012h;
• в BX — номер начального регистра ЦАП (0-255);
• в СХ — число перезагружаемых регистров (1-256);
• в ES: DX — указатель на массив загружаемых оттенков из ЗхСХ байт.
Массив оттенков должен содержать число 3-байтных строк, равное значению, записанному в СХ. Первый байт в строке кодирует интенсивность красного, второй — зеленого, третий — синего цветов.
Прерывание Int 10h, функция 10h, подфункция 15h: прочитать один регистр ЦАП
Функция предназначена для 256-цветных режимов. Она позволяет прочитать содержимое заданного регистра цифро-аналогового преобразователя.
Перед вызовом прерывания требуется занести в регистры следующие значения:
• в АХ – код 1015h;
• в BX — номер регистра ЦАП (0-255).
После завершения функции в регистрах будут размещены следующие значения:
• в DH — значение интенсивности красного цвета;
• в СН — значение интенсивности зеленого цвета;
• в CL — значение интенсивности синего цвета.
Прерывание Int 10h, функция 10h, подфункция 17h: прочитать группу регистров ЦАП
Функция предназначена для 256-цветных режимов. Она позволяет сохранить в оперативной памяти компьютера набор оттенков, соответствующих группе цветовых кодов.
Перед вызовом прерывания требуется занести в регистры следующие значения:
• в АХ – код 1017h;
• в BX — номер начального регистра ЦАП (0-255);
• в СХ — число считываемых регистров (1-256);
• в ES-DX- указатель на область памяти для сохранения считанной информации (массив размером ЗхСХ байт).
После выполнения функции массив оттенков будет содержать 3-байт- ные строки: первый байт в строке кодирует интенсивность красного, второй — зеленого, третий — синего цветов.
Прерывание Int 10h, функция 11 h, подфункция OOh: загрузить шрифт пользователя для текстового видеорежима
Функция обеспечивает загрузку заданного пользователем шрифта в знакогенератор. Применяется в текстовом видеорежиме.
ПРИМЕЧАНИЕ
Обычно весь шрифт загружается целиком (СХ = 256, DX = 0), однако при необходимости возможна перезапись отдельного участка в наборе символов (в СХ записывается число заменяемых символов, в DX —номер первого символа в заменяемом участке). Память знакогенератора может содержать до восьми наборов шрифтов, однако обычно используется только блок с нулевым номером (BL = 0). В цветном текстовом режиме VGA используется шрифт 8×16, то есть ВН = 16. Символы представлены в растровой форме, каждой точке изображения соответствует один бит в маске символа, а каждой строке — один байт; символ кодируется 16 байтами, а полная таблица шрифта занимает 4 Кбайт.
Перед вызовом прерывания требуется занести в регистры следующие значения:
• в АХ – код llOOh;
• в ВН — число байтов в матрице символа;
• в BL — номер загружаемого блока знакогенератора;
• в СХ — число загружаемых символов;
• в DX — номер первого загружаемого символа в таблице кодов;
• в ES: BP — указатель на таблицу, содержащую маски символов загружаемого шрифта.
Источник: Кулаков В. К90 Программирование на аппаратном уровне: специальный справочник (+дискета). 2-е издание. — СПб.: Питер, 2003. — 847 е.: ил.