Программирование видеоадаптеров CGA, EGA и VGA© Александр Фролов, Григорий ФроловТом 3, М.: Диалог-МИФИ, 1992, 287 стр. 9.1. Управление регистрами палитры - функция 10hФункция 10h предоставляет возможность программирования регистров цветовой палитры, таблицы цветов (VGA), а также управляет некоторыми атрибутами символов. Для EGA эта функция содержит следующие четыре
подфункции:
VGA поддерживает дополнительно еще 10 подфункций:
Установка одного регистра палитры - подфункция 00hФункция выполняет запись в регистр палитры: На входе: AH = 10h - функция 10h; AL = 00h - установка регистра палитры; BL = номер регистра палитры (0-Fh); BH = данные, записываемые в регистр. На выходе: Не используются. Следующий фрагмент записывает в регистр палитры с номером reg_num содержимое переменной data: mov ah,10h ; функция 10h xor al,al ; подфункция 0h mov bl,num_reg ; задаем номер регистра палитры mov bh,data ; новое значение регистра int 10h Установка цвета рамки - подфункция 01hФункция выполняет запись значения в регистр цвета рамки контроллера атрибутов. Надо иметь в виду, что эта функция не работает в некоторых режимах EGA. На входе: AH = 10h; AL = 01h - устновка цвета рамки; BH = значение, записываемое в регистр (цвет). На выходе: Не используются. Пример, приведенный ниже, использует подфункцию 01h для изменения цвета рамки экрана: #include <dos.h> #include <stdio.h> void main(void); void main(void) { union REGS inregs, outregs; unsigned char i; // пробуем 16 цветов для рамки for(i = 0; i < 16; i++) { // функция управления контроллером атрибутов inregs.h.ah = 0x10; // подфункция установки цвета рамки inregs.h.al = 0x1; // номер нового цвета рамки inregs.h.bh = i; int86( 0x10, &inregs, &outregs ); // ожидаем нажатия на любую клавишу getch(); } } Установка всех регистров палитры - подфункция 02hФункция обеспечивает быстрое заполнение новыми значениями всех регистров палитры и регистра цвета рамки. Новые значения регистров записываются в 17-байтовой таблице где-нибудь в оперативной памяти компьютера. Байты 0 - 15 содержат новые значения для регистров палитры, а байт 16 для регистра цвета рамки. На входе: AH = 10h; AL = 02h - установка регистров палитры и регистра цвета рамки; ES:DX = адрес таблицы с новыми значениями регистров. На выходе: Не используются. Управление атрибутом мигания и атрибутом интенсивности - подфункция 03hУправляет битом D7 байта атрибутов символа (см. главу "Атрибуты символов"): На входе: AH = 10h; AL = 03h - управление битом D7 байта атрибутов; BL = 0 - бит D7 управляет интенсивностью фона, 1 - бит D7 управляет миганием символа. На выходе: Не используются. /** *.Name ControlBlinkIntens *.Title Управление атрибутом мигания/интенсивности * *.Descr Эта функция управляет назначением бита D7 байта * атрибутов символа. * *.Proto void ControlBlinkIntens(unsigneg char blink) * *.Params unsigneg char blink - если параметр функции * равен нулю, то бит D7 будет определять * интенсивность фона символа. Если параметр равен * единице, то бит D7 управляет миганием символа. * *.Return Не определено. **/ ControlBlinkIntens(unsigneg char blink) { union REGS inregs, outregs; // функция управления контроллером атрибутов inregs.h.ah = 0x10; // подфункция управления атрибутом мигания/интенсивности inregs.h.al = 0x3; inregs.h.bl = blink; int86( 0x10, &inregs, &outregs ); } Чтение регистра палитры - подфункция 07hФункция поддерживается только видеоадаптером VGA. Она позволяет прочитать содержимое любого регистра палитры: На входе: AH = 10h; AL = 07h - чтение регистра палитры; BL = номер читаемого регистра палитры (0-15). На выходе: BH = содержимое регистра палитры. ... mov ah,10h mov al,7h mov bl,num_reg int 10h mov reg_value,bh ... Чтение регистра цвета рамки - подфункция 08hФункция поддерживается только видеоадаптером VGA. Позволяет прочитать содержимое регистра цвета рамки: На входе: AH = 10h; AL = 08h - чтение регистра цвета рамки. На выходе: BH = содержимое регистра цвета рамки. Чтение всех регистров палитры - подфункция 09hДля видеоадаптера VGA данная функция позволяет прочитать значения всех регистров палитры и регистра цвета рамки. Для чтения регистров надо зарезервировать участок памяти (17 байт). После вызова функции байты 0 - 15 будут содержать значения соответствующих регистров палитры, а байт 16 - значение регистра цвета рамки. На входе: AH = 10h; AL = 9 - чтение всех регистров палитры; ES:DX - указатель на 17-байтовую таблицу. На выходе: По адресу ES:DX содержится таблица, заполненная значениями из регистров палитры. Приведем фрагмент программы, который считывает значения всех регистров палитры и регистра цвета рамки в буфер памяти buffer: ; определяем адрес буфера для записи значений регистров ; палитры и регистра цвета рамки mov ax,SEG buffer mov es,ax mov dx,OFFSET buffer ; считываем значения всех регистров палитры и регистра ; цвета рамки mov ah,10h mov al,9 int 10h Установка одного регистра таблицы цветов (регистров ЦАП) - подфункция 10hФункция производит запись 18-битной величины в один из 256 регистров таблицы цветов: На входе: AH = 10h; AL = 10h - установка регистра таблицы цветов; BX = номер регистра таблицы цветов (0-255); DH = интенсивность красного цвета (6 бит); CH = интенсивность зеленого цвета (6 бит); CL = интенсивность синего цвета (6 бит). На выходе: Не используются. Пример использования функции установки одного регистра таблицы цветов приведен ниже: mov ah,10h ; выбираем функцию установки регистра цветов mov al,ah ; устанавливаем номер регистра таблицы цветов mov bx,num_reg ; определяем величины красной, зеленой и синей составляющих mov dh,red mov ch,green mov cl,blue int 10h Установка нескольких регистров таблицы цветов (регистров ЦАП) - подфункция 12hФункция производит запись 18-битной величины в несколько последовательно расположенных регистров таблицы цветов: На входе: AH = 10h; AL = 12h - установка нескольких регистров таблицы цветов; BX = номер первого регистра таблицы цветов (0 -255); CX = число устанавливаемых регистров (1-256); ES:DX - адрес таблицы цветов. На выходе: Не используются. Таблица цветов содержит по три байта на один регистр таблицы цветов. В каждом байте значимыми являются только 6 младших бит. Выбор подмножества цветов - подфункция 13hФункция предназначена для выбора числа подмножеств цветов и выбора активного подмножества: На входе: AH = 10h; AL = 13h - выбор подмножества цветов; BL = 0 - выбор режима: BH = 0 - 4 подмножества из 64 цветов; BH = 1 - 16 подмножеств из 16 цветов; BL = 1 - выбор активного подмножества: BH = номер подмножества (0-4 или 0-15). На выходе: Не используются. Приведем фрагмент программы использующий данную функцию: ; выбираем режим (bh = 1) mov ah,10h mov al,13h xor bx,bx inc bh int 10h ; устанавливаем активное подмножество subset_num mov ah,10h mov al,13h mov bl,1 mov bh,subset_num int 10h Чтение регистра таблицы цветов - подфункция 15hФункция поддерживается только для видеоадаптеров VGA. Она выполняет чтение одного из регистров таблицы цветов: На входе: AH = 10h; AL = 15h - чтение регистра таблицы цветов; BL = номер читаемого регистра (0-255). На выходе: DH = интенсивность красного цвета (6 бит); CH = интенсивность зеленого цвета (6 бит); CL = интенсивность синего цвета (6 бит); Следующий пример позволяет считать значение регистра таблицы цветов с номером num_color_reg: mov ah,10h mov al,15h mov bx,num_color_reg int 10h mov red_data,dh mov green_data,ch mov blue_data,cl Чтение нескольких регистров таблицы цветов (регистров ЦАП) - подфункция 17hФункция производит чтение 18-битовых значений из нескольких последовательно расположенных регистров таблицы цветов: На входе: AH = 10h; AL = 17h - чтение нескольких регистров таблицы цветов; BL = номер первого регистра таблицы цветов (0 -255); CX = число считываемых регистров (1-256); ES:DX - адрес таблицы цветов; На выходе: Данные в таблице по адресу ES:DX. Таблица цветов содержит по три байта на один регистр таблицы цветов. В каждом байте значащимии являются только младшие 6 бит. Определение режима подмножества цветов - подфункция 1AhВозвращает число текущих цветовых подмножеств: На входе: AH = 10h; AL = 1Ah - определение числа цветовых подмножеств. На выходе: BL = 0 - используются 4 цветовых подмножества по 64 цвета; 1 - используются 16 цветовых подмножеств по 16 цветов; BH - номер подмножества, используемого в данный момент. mov ah,10h mov al,1ah int 10h mov num_subset,bh Установка палитры из градаций серого цвета - подфункция 1BhФункция заполняет часть таблицы цветов значениями, соответствующими различным оттенкам серого цвета. Для каждого модифицируемого регистра таблицы цветов сначала читаются записанные в нем данные, а затем записываются обратно по следующему правилу: красного 30 - процентов, зеленого - 59 процентов и голубого - 11 прцентов от считанного значения. На входе: AH = 10h; AL = 1Bh - установка палитры из градаций серого цвета; BX = номер первого регистра таблицы цветов (0 -255); CX = число модифицируемых регистров (1-256). На выходе: Не используются. Следующий пример демонстрирует, как преобразовать таблицу цветов для отображения различных градаций серого цвета. Модифицируются значения регистров таблицы цветов, имеющих номера от first_num до end_num: mov ah,10h mov al,1Bh mov bx,first_num ; номер первого модифицируемого регистра mov cx,end_num ; номер последнего модифицируемого регистра sub cx,bx ; определяем число изменяемых регистров int 10h |