Иллюстрированный самоучитель по SVGA

Исходная цветовая палитра

Для того чтобы при включенном компьютере на экране монитора было видно изображение символов или рисунков в DAC-регистры видеокарты должны быть записаны соответствующие коды. Просто очистить все регистры нельзя, поскольку очищенное состояние байтов соответствует черному цвету. Условимся называть палитрой цветов ту совокупность кодов, которая может быть записана в DAC-регистры видеокарты. Если палитра установлена, т. с. находится в DAC-регистрах, то она становится текущей палитрой и используется видеоконтроллером при отображении на экран содержимого видеопамяти.

После включения пли перезагрузки компьютера в DAC-регистры записывается палитра цветов, хранящаяся в BIOS. Ее структура не зависит от установленного видеорежима, но в зависимости от установленного режима прикладным задачам доступны только первые 16 или все 256 цветов. В последнем случае принято говорить о стандартной палитре VGA.

Программа для визуализации палитры

Словесное описание каждого цвета едва ли позволит наглядно представить, как выглядит эта палитра, целесообразнее составить программу, позволяющую увидеть все 256 цветов на экране монитора. Для упрощения программы надо использовать стандартный графический режим VGA IBM (его код I3h). В таком случае потребуется минимум вспомогательных действий, а сравнительно низкое разрешение позволит получить более наглядное изображение. Текст программы приведен в примере 4.1.

Для получения завершенной задачи надо выполнить следующие действия:

  1. Создать исходный файл, содержащий текст примера 4.1. Имя файла вы можете выбрать по своему усмотрению, а тип должен быть asm.
  2. Обработать исходный файл Макроассемблером (произвести компиляцию) для получения объектного модуля, имеющего тип obj.
  3. Обработать объектный модуль с помощью компоновщика (LINK), в результате чего будет получен файл задачи, имеющий тип ехе.

Конкретный способ выполнения перечисленных действий зависит от того, используете вы пакет PWB иди нет. Начиная с версии 6.0, Макроассемблер MASM поставляется в комплекте с пакетом PWB (programmer's workBench – инструментальные средства для программирования). В случае использования пакета все перечисленные в списке действия выполняются непосредственно в рабочей среде, которую поддерживает PWB. Если же он не используется, то сначала создается исходный файл с помощью любого текстового редактора.

Затем для его обработки вызывается MASM, который создает объектный модуль. Наконец, для построения задачи из объектного модуля вызывается компоновщик. В любом случае при построении задачи примера 4.1 будет выдано сообщение об отсутствии сегмента, содержащего стек. Это простое предупреждение, а не признак ошибки.

Пример 4.1. Программа для визуализации стандартной палитры.

Code SEGMENT начало сегмента "code"
ASSUME CS:code связь регистра CS с сегментом "code"
start: mov ax, 13h код установки видеорежима 13h int lOh установка видеорежима
outscr: mov ax, OAOOOh AOOO – сегмент видеопамяти
mov es, ax пишем его в регистр ES
xor di, di 0 – начальный адрес видеопамяти
mov ex, 200 количество строк на экране
1р_1: push ex сохраняем счетчик повторов
mov ex, 320 указываем размер строки
xor al, al код первой точки (0)
1р_2: stosb рисуем точку
inc al увеличиваем код точки на 1
loop lp_2 управление выводом строки
pop ex восстанавливаем счетчик строк
loop iP..1 управление выводом строк
mov ax, OCOlh код функции ожидания ввода
int 21h DOS ждет нажатия на клавишу
mov ax, 03 код установки видеорежима 3
int lOh установка видеорежима
mov ax, 4COOh код функции завершения задачи
int 21h DOS завершает выполнение задачи
ends конец сегмента "code"
end start конец текста программы
code

Суть выполняемых в программе действий заключается в следующем. На экран последовательно выводится 200 строк. При выводе каждой строки в видеопамять последовательно записывается содержимое регистра ai, которое в исходе равно 0 и после вывода каждой точки увеличивается на 1. Может показаться, что ai изменяется от 0 до 319, но это не так. Регистр al содержит восемь разрядов, поэтому его содержимое будет монотонно нарастать от 0 до 255, на 256-м шаге оно окажется равным нулю, затем будет снова нарастать и в конце строки достигнет значения 63. Все строки заполнены одинаково, поэтому при выполнении программы на экране возникнут разноцветные полосы ("занавес"), каждая из них показывает, какой цвет закодирован в конкретном оде-регистре. Прежде чем обсуждать получаемую картину, завершим описание программы.

Две первые и две последние строчки программы содержат информацию, относящуюся к ее оформлению. Точка входа в программу имеет метку start. Выполнение программы начинается с установки видеорежима VGA IBM, его код 13h, разрешение составляет 320x200 точек, размер палитры 256 цветов.

Далее в регистр es записывается код сегмента видеобуфера АОООb. Прямая запись значений в сегментные регистры невозможна, поэтому используется регистр-посредник ах. В регистре di устанавливается нулевой адрес, соответствующий началу строки. Пара регистров es:di выбрана для того, чтобы записывать коды точек командой stosb.

На экране переход с одной строки на другую выполняет видеоконтроллер при достижении конца очередной строки. Программа же просто выводит в цикле 1р_2 количество точек, совпадающее с размером строки для данного режима. Измените 320 на 319 или 321 и картинка "рассыпается", поскольку начало нового цикла вывода не будет совпадать с началом строки на экране.

После заполнения экрана надо выдержать паузу, чтобы вы могли увидеть и оценить полученный результат. Для этого программа обращается к DOS с запросом на ввод символа с клавиатуры. Никаких предупреждающих сообщений на экран не выводится. Возвращение в программу произойдет после того, как вы нажмете одну из информационных клавиш клавиатуры – букву, цифру, Пробел, Enter и пр. После этого произойдет немедленное завершение задачи (возврат в DOS).

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.