Регистры графического контроллера (03CEh– 03CFH)
Для обращения к регистрам графического контроллера следует записать индекс нужного регистра в порт 03CEh, после чего можно будет читать и писать данные для выбранного регистра в порт 03CFh. Если требуется только запись в регистры, можно просто поместить индекс в AL, посылаемый байт — в АН и выполнить команду вывода слова в порт 03CEh. Этот контроллер, в первую очередь, предназначен для обеспечения передачи данных между процессором и видеопамятью в режимах, использующих цветовые плоскости, как, например, режим 12h (640x480x16).
00h: Регистр установки/сброса
биты 3 – 0: записывать FFh в цветовую плоскость 3 – 0 соответственно
01h: Регистр разрешения установки/сброса
биты 3 – 0: включить режим установки/сброса для цветовой плоскости 3 – 0
В этом режиме данные для одних цветовых слоев получают от CPU, а для других — из регистра установки/сброса. Режим действует только в нулевом режиме работы (см. регистр 05h).
02h: Регистр сравнения цвета
биты 3 – 0: искомые биты для цветовых плоскостей 3 – 0
Используется для поиска пикселя заданного цвета, чтобы не обращаться по очереди во все цветовые слои.
03h: Регистр циклического сдвига данных
биты 4 – 3: выбор логической операции:
00 — данные от CPU записываются без изменений
01 — операция AND над CPU и регистром-защелкой
10 — операция OR над CPU и регистром-защелкой
11 — операция XOR над CPU и регистром-защелкой
биты 2 – 0: на сколько бит выполнять вправо циклический сдвиг данных перед записью в видеопамять
04h: Регистр выбора читаемой плоскости
биты 1 – 0: номер плоскости (0 – 3)
Запись сюда изменяет номер цветовой плоскости, данные из которой получает CPU при чтении из видеопамяти.
05h: Регистр выбора режима работы
бит 6: 1/0 — 256/16 цветов
бит 4: четные адреса соответствуют плоскостям 0, 2, нечетные — 1,3
бит 3: 1 — режим сравнения цветов
биты 1 – 0: режим:
00: данные из CPU (бит на пиксель) + установка/сброс + циклический сдвиг + логические функции
01: данные в/из регистра-защелки (прочитать в него и записать в другую область памяти быстрее, чем через CPU)
10: данные из CPU, байт на пиксель, младшие 4 бита записываются в соответствующие плоскости
11: то же самое + режим битовой маски
06h: Многоцелевой регистр графического контроллера
биты 3 – 2: видеопамять:
00: A0000h – BFFFFh (128 Кб)
01: A0000h – AFFFFh (64 Кб)
10: B0000h – B7FFFh (32 Кб)
11: B8000h – BFFFFh (32 Кб)
бит 0: 1/0 — графический/текстовый режим
07h: Регистр игнорирования цветовых плоскостей
биты 3 – 0: игнорировать цветовую плоскость 3 – 0
08h: Регистр битовой маски
Если бит этого регистра 0 — соответствующий бит будет браться из регистра-защелки, а не от CPU. (Чтобы занести данные в регистр-защелку, надо выполнить одну операцию чтения из видеопамяти, при этом в каждый из четырех регистров-защелок будет помещено по одному байту из соответствующей цветовой плоскости.)
Графический контроллер предоставляет весьма богатые возможности по управлению режимами, использующими цветовые плоскости. В качестве примера напишем процедуру, выводящую точку на экран в режиме 12h (640x480x16) с использованием механизма установки/сброса:
; процедура putpixel12h ; выводит на экран точку с заданным цветом в режиме 12h (640x480x16) ; Ввод: DX = строка ; СХ = столбец ; ВР = цвет ; ES = 0A000h putpixel12h proc near pusha ; вычислить номер байта в видеопамяти xor bx,bx mov ax,dx ; AX = строка lea еах,[еах+еах*4] ; АХ = АХ * 5 shl ах,4 ; АХ = АХ * 16 ; АХ = строка * байт_в_строке ; (строка * 80) push cx shr cx,3 ; CX = номер байта в строке add ax,cx ; АХ = номер байта в видеопамяти mov di,ax ; сохранить его в DI ; вычислить номер бита в байте pop сх and cx,07h ; остаток от деления на 8 - номер ; бита в байте, считая справа налево mov bx,0080h shr bx,cl ; в BL теперь нужный бит установлен в 1 ; программирование портов mov dx,03CEh ; индексный порт ; графического контроллера mov ax,0F01h ; регистр 01h: разрешение ; установки/сброса out dx,ax ; разрешить установку/сброс для ; всех плоскостей (эту часть лучше ; сделать однажды в программе, например сразу после установки ; видеорежима, и не повторять каждый раз при вызове процедуры) mov ax,bp shl ax,8 ; регистр 00h: регистр ; установки/сброса out dx,ax ; АН = цвет mov al,08 ; порт 08h: битовая маска mov ah,bl ; записать в битовую маску нули ; всюду, кроме out dx,ax ; бита, соответствующего выводимому пикселю mov ah,byte ptr es:[di] ; заполнить ; регистры-защелки mov byte ptr es:[di],ah ; вывод на экран: ; выводится единственный бит ; в соответствии с содержимым регистра битовой маски, остальные ; биты берутся из защелки, то есть не изменяются. Цвет выводимого ; бита полностью определяется значением регистра установки/сброса рора ret putpixel12h endp
Содержание раздела