Assembler - язык неограниченных возможностей
0e1cc9b4

Регистры графического контроллера (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


Содержание раздела