Программирование 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: смещение
