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 управление выводом строк
Суть выполняемых в программе действий заключается в следующем. На экран последовательно выводится 200 строк. При выводе каждой строки в видеопамять последовательно записывается содержимое регистра ai, которое в исходе равно 0 и после вывода каждой точки увеличивается на 1. Может показаться, что ai изменяется от 0 до 319, но это не так. Регистр al содержит восемь разрядов, поэтому его содержимое будет монотонно нарастать от 0 до 255, на 256-м шаге оно окажется равным нулю, затем будет снова нарастать и в конце строки достигнет значения 63. Все строки заполнены одинаково, поэтому при выполнении программы на экране возникнут разноцветные полосы ("занавес"), каждая из них показывает, какой цвет закодирован в конкретном оде-регистре. Прежде чем обсуждать получаемую картину, завершим описание программы.
Две первые и две последние строчки программы содержат информацию, относящуюся к ее оформлению. Точка входа в программу имеет метку start. Выполнение программы начинается с установки видеорежима VGA IBM, его код 13h, разрешение составляет 320x200 точек, размер палитры 256 цветов.
Далее в регистр es записывается код сегмента видеобуфера АОООЬ. Прямая запись значений в сегментные регистры невозможна, поэтому используется регистр-посредник ах. В регистре di устанавливается нулевой адрес, соответствующий началу строки. Пара регистров es:di выбрана для того, чтобы записывать коды точек командой stosb.
На экране переход с одной строки на другую выполняет видеоконтроллер при достижении конца очередной строки. Программа же просто выводит в цикле 1р_2 количество точек, совпадающее с размером строки для данного режима. Измените 320 на 319 или 321 и картинка "рассыпается", поскольку начало нового цикла вывода не будет совпадать с началом строки на экране.
После заполнения экрана надо выдержать паузу, чтобы вы могли увидеть и оценить полученный результат. Для этого программа обращается к DOS с запросом на ввод символа с клавиатуры. Никаких предупреждающих сообщений на экран не выводится. Возвращение в программу произойдет после того, как вы нажмете одну из информационных клавиш клавиатуры — букву, цифру, <пробел>, <Enter> и пр. После этого произойдет немедленное завершение задачи (возврат в DOS).
Построенная задача выведет на экран интересующие нас цвета при условии, что палитра установлена. Дело в том, что загрузку палитры при смене режимов работы видеокарты можно запретить, записав 1 в третий разряд слова с адресом оооо:С48Э из области данных BIOS. Обычно этот разряд очищен, и палитра загружается при любых изменениях режимов (как текстовых, так и графических). Одна из функций прерывания int юъ, относящихся к группе i2h, предназначена для разрешения или запрещения загрузки палитры. При ее вызове в регистре ы указывается код 3ih, а в регистре ai — 0 или 1.
Устанавливаемая DOS палитра в книге описана примерно так (это не цитата, а скорее вольный перевод оригинала). Первые 16 DAC-регистров содержат палитру для режима CGA, в следующих 16-ти регистрах записаны коды разных оттенков серого цвета. Затем располагаются три основные группы, занимающие по 72 регистра и содержащие коды цветов высокой, средней и низкой интенсивности. Каждая группа делится на 3 одинаковых подгруппы, содержащие коды цветов высокого, среднего и низкого насыщения. Последние восемь регистров просто очищены, им соответствует черная полоса. Тут автор книги допустил неточность, — фактически при установке палитры последние 8 регистров не заполняются. После включения компьютера они очищаются, но их содержимое могут изменить программы, работающие в графических режимах. Поэтому вместо черной полосы, соответствующей последним восьми линиям, вы можете увидеть другой цвет.
Описанная программа позволяет получить качественное представление о цветах палитры, установленной по умолчанию. Если вас интересуют точные значения, т. е. коды этих цветов, то придется составить собственную программу для распечатки содержимого базовых регистров. В следующем разделе рассмотрены функции BIOS, позволяющие определить содержимое любого DAC-регпстра. Здесь мы опишем младшую часть устанавливаемой BIOS палитры, которая является палитрой CGA.