Программирование EGA и VGA
Подфункция 7: (только VGA) Чтение отдельного регистра палитры.
Регистры, устанавливаемые до вызова функции:
- AL: установить 7
- BL: номер считываемого регистра (цвета)
Регистры, опрашиваемые после вызова функции:
- BH: содержимое регистра палитры
Подфункция 8: (только VGA) Чтение регистра цвета рамки.
Регистры, устанавливаемые до вызова функции:
- AL: установить 8
Регистры, опрашиваемые после вызова функции:
- BH: содержимое регистра цвета рамки
Подфункция 9: (только VGA) Чтение всех регистров палитры.
Подфункция требует резервирования 17-байтовой области памяти. После обращения первые 16 байтов содержат значения регистров палитры 0 -15, а 17-й байт - значение регистра цвета рамки.
Регистры (устанавливаются до вызова функции):
- AL: установить 9
- ES: сегмент, содержащий таблицу
- DX: смещение первого байта таблицы в сегменте
Подфункция 10h: (только VGA) Установка отдельного регистра цап.
Подфункция устанавливает 18-битовое значение цвета в указанный регистр ЦАП. Каждый из составляющих цвета (красный, зеленый, синий) должен быть 6-битовым значением.
Регистры (устанавливаются до вызова функции):
- AL: установить 10h
- BX: регистр ЦАП (0-255)
- CH: яркость зеленого
- CL: яркость синего
- DH: яркость красного
Подфункция 12h (только VGA) Установка блока регистров цап
Функция устанавливает 18-битовое значение цвета для некоторого количества регистров ЦАП.Программа помещает значения в таблицу. Таблица содержит последовательно значения байтов регистров цветов: красного,зеленого и синего соответственно (3 байта для каждого программируемого регистра.
Регистры (устанавливаются до вызова функции):
- AL: установить 12h
- BX: начальный регистр ЦАП (0-255, обычно 64 или 256)
- CH: число программируемых регистров (1-256, обычно 64 или 256)
- ES: сегмент таблицы
- DX: смещение таблицы
Подфункция 13h (только VGA) Выбор подмножества цветов.
Функция устанавливает число возможных подмножеств в 16-цветном режиме подмножеств ЦАП (4 подмножества из 64 цветов или 16 подмножеств из 16 цветов). Функция также может быть использована для выбора активного подмножества.
Регистры (устанавливаются до вызова функции):
- AL: установить 13h
Первый вариант вызова:
- BL: 0-режим выбора страниц
- BH: 0-четыре набора из 64 регистров ЦАП 1-16 наборов из 16 регистров ЦАП
Второй вариант вызова:
- BL: 0-режим выбора страниц
- BH: активное подмножество ЦАП(0-3 или 0-15)
Подфункция 15h только(VGA) Чтение отдельного регистра ЦАП.
Регистры (устанавливаются до вызова функции):
- AL: установить 15h
- BX: регистр ЦАП (0-255)
Регистры (считываются после вызова функции)
- CH: текущая яркость зеленого
- CL: текущая яркость синего
- DH: текущая яркость красного
Подфункция 17h(только VGA) Чтение блока регистров ЦАП.
Функция считывает 18-битовое значение цвета для некоторого количества регистров ЦАП.Программа должна резервировать 3 байта памяти для каждого считываемого регистра. После обращения к функции таблица содержит последовательно расположенные значения байтов регистров цветов:красного, зеленого и синего соответственно.
Регистры (устанавливаются до вызова функции)
- AL: установить 17h
- BX: начальный регистр ЦАП(0-255,как правило 64 или 256)
- CH: число считываемых регистров(1-256,как правило 64 или 256)
- ES: смещение таблицы
- DX: сегмент таблицы
Подфункция 1Ah(только VGA) Чтение цвета состояния страницы
Функция возвращает число регистров активного подмножества ЦАП и число возможных подмножеств.
Регистры (устанавливаются до вызова функции):
- AL: установить 1ан
Регистры (считываются после вызова функции):
- BH: число активных подсистем
- BL: 0-возможны 4 подмножества, 1-возможны 16 подмножеств
Подфункции 1Bh (только VGA): Суммирование регистров ЦАП
Для получения оттенков серого
Функция позволяет осуществить преобразование имеющегося блока регистров ЦАП в эквивалентные оттенки серого. Красный составляет 30% текущего значения , зеленый-59%, синий-11%.
Регистры (устанавливаются до вызова функции):
- AL: установить 1dh
- BX: начальный регистр ЦАП (0-255)
- CX: количество изменяемых регистров (1-256)
Пример на языке ассемблера
; Приведенная ниже программа выполняет печать строки чисел ; поперек экрана (одно число для каждого регистра палитры). ; Печать начинается справа и осуществляется циклически, ; изменение предыдущего значения происходит по окончании ; полного цикла. cry-f equ 1 ; эмуляция флага переноса data segment public clrs db 16,15,14,13,12,11,10,9,8 db 7,6,5,4,3,2,1,0 overscan db 0 flags db 0 data ends code segment public assum CS:code main proc far start: push DS sub AX,A push AX mov AX,data mov DS,AX assume DS:data mov ES,AX assum ES:data mov AH,2 ; функция 2-установка курсора mov DH,05 ; строка 5 mov DL,0ah ; столбец 10 mov BH,0 ; страница 0 int 10h ; обращение mov CX,16 ; вывод каждого регистра палитры d_lp: mov BX,CX dec BX ; номер регистра палитры mov AL,сlrsх[BX]; определение цвет call show_new ; вывод текущего значения loop d_lp mov CX,1000h ; число световых комбинаций для демонстрации ; В случае установки начального значения цвета 0 и использования ; большого количества вложенных циклов,эта программа позволяет ; получить все возможные комбинации цветов. ; Конечно,чтобы выполнить эту операцию, потребуется очень ; много времени, поэтому следует ограничить интересующие начальные ; значения несколькими тысячами итераций. lp2: push CX mov CX,16 ;проверка каждого регистра ;палитры or flags,cry_f ;установка флага переноса ;(для увеличения на 1) lp1: mov BX,CX ;поместить счетчик в ВХ dec BX ;номер регистра палитры mov AL,clrs[BX] ;получение цвета test flags,cry_f ;был установлен флаг переноса? jz no_c ;нет-перейти к следующему ;регистру палитры inc AX ;быстрее,чем INC AL and flags,not cry_f ;сбросить флаг переноса cmp AL,64 ;это максимум? jb no_cry ;нет-не устанавливать флаг ;переноса sub AL,AL ;вновь установить цвет 0 or flags,cry_f ;установить флаг переноса no_cry: call show_new ;обновление экрана mov clrs[BX],AL ;сохранить новый цвет no_c: loop lpl ;проверка следующего регистра ;палитры poop CX ;восстановить счетчик loop lp2 ;выполнить следующую установку ret main endp show_new proc near push AX ;сохранить текущий цвет push BX ;сохранить текущее состояние ;регистра палитры push CX ;сохранить текущее значение ;счетчика значение в DX уничтожено ;Для установки палитры используется подфункция 0 (установка одного ;регистра). ПРИМЕЧАНИЕ: для этого также может быть использована ;подфункция 2, при этом следует символы"'" удалить из строк ;"mov AL,2" и "mov DX,..." mov BH,AL ; mov AH,10h ; ; mov AL,0 ; 'mov AL,2' ; 'mov DX,offset CLRS' ; int 10h ;BIOS push BX ; mov AH,2 ; mov BH,0 ; sub DH,DH ;DH=0 (номер строки) mov DL,BL ;поместить значение регистра ;палитры в DL shl DX,1 shl DX,1 ; номер столбца = 4* значение ; регистра палитры int 10h ;обращение к видео BIOS pop BX ;восстановить регистр цвет/ ;палитра mov AL,BH ;поместить цвет обратно в AL call bin2asc ;перевод AL в ASCII в AX push AX ;сохранить AX xchg AH,AL ;поместить старшую цифру в AL mov AH,9 ;запись атрибута/символа mov BL,BH ;поместить номер цвета в BL mov BH,0 ;страница 0 push BX ;сохранение для следующей цифры mov CX,1 ;запись одного символа int 10h ;обращение к видео BIOS mov AH,2 ;установить позицию курсора mov BH,0 ;страница 0 inc DX ;следующий столбец int 10h ;обращение к видео BIOS pop CX pop BX ;восстановление текущего регистра pop AX ;восстановление цвета show_new endp bin2asc proc near COMMENT* ПРИМЕЧАНИЕ: в отличие от первых вариантов этой подпрограммы ААМ используется вместо операции DIV 10 AL: 8-битовое число для перевода * aam ;AH=AL/10, AL=остатку add AX,3030h ;прибавление 30h для получения ;ASCII-кода ret bih2asc endp code ends end star
Оставить комментарий
Комментарии
Регистры (устанавливаются до вызова функции)
AL: установить 17h
BX: начальный регистр ЦАП(0-255,как правило 64 или 256)
CH: число считываемых регистров(1-256,как правило 64 или 256)
ES: смещение таблицы
DX: сегмент таблицы
-------------------------------------------------
ES: сегмент
DX: смещение