Главная » Ассемблер, Железо » Функции VGA BIOS

0

Графические режимы 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 е.: ил.

По теме:

  • Комментарии