Глава 4. Вывод на терминал.

Раздел 4. Вывод точечной графики.

4.4.4 Определение цвета точки экрана.

Для графических режимов цветного адаптора или PCjr определение цвета точки на низком уровне состоит в обращении процедуры вывода точки: программа читает из видеобуфера и выделяет интересующие биты. Однако для EGA этот метод непригоден, поскольку в режимах DH - 10H каждому адресу памяти соответствует два или четыре байта. EGA имеет два режима чтения, чтобы преодолеть эту трудность. Имейте ввиду, что для PCjr и EGA, после того, как Вы определили код цвета точки, необходимо еще проверить установку текущего регистра палетты для этого кода, чтобы определить какой цвет ему приписан.

Любой язык программирования имеет доступ к двум режимам чтения EGA. В режиме 0 возвращается байт, содержащийся во всех четырех битовых плоскостях, по указанному адресу. Режим 1 ищет указанный код цвета и возвращает байт, в котором бит установлен в 1, когда соответствующая точка имеет данный цвет. Бит 3 регистра режима определяет какой режим чтения установлен (0 = режим 0). Доступ к этому регистру осуществляется через порт 3CFH и Вы должны предварительно послать 5 в порт 3CEH, чтобы выбрать этот регистр. Обычно все остальные биты этого регистра, который можно только писать, сброшены в 0, кроме битов 0 и 1, которые определяют режим записи. Поскольку при инициализации BIOS устанавливает эти биты в режим записи 0 (так что они оба равны 0), то обычно Вам нужно просто послать в этот регистр 0, чтобы установить режим чтения 0 и послать 8, чтобы установить режим чтения 1.

Режим чтения 0 требует, чтобы Вы предварительно установили регистр выбора карты. Единственная задача этого регистра - установить, какая из карт битов должна быть прочитана. Поэтому в него надо послать число от 0 до 3. Этот регистр имеет адрес порта 3CFH и надо предварительно послать 4 в порт 3CEH, чтобы указать этот регистр.

Режим чтения 1 более сложен. Сначала регистр сравнения цветов должен быть заполнен цепочкой битов для кода цвета, который Вы ищете. Этот код помещается в младшие 4 бита регистра; старшие 4 бита - несущественны. Этот регистр имеет адрес порта 3CFHи указывается предварительной засылкой 2 в порт 3CEH. После чтения ячейки памяти возвращается байт, который имеет биты установленные в 1 для каждой точки, имеющей нужный цвет. Однако за счет использования регистра безразличия цвета (color don't care register) один или более битов кода цвета могут при сравнении игнорироваться. Обычно 4 младших бита этого регистра установлены в 1; обнуление одного из этих битов приведет к тому, что содержимое соответствующей битовой плоскости будет игнорироваться. Hапример, если цепочка битов для точки 3 (бит 3) по указанному адресу равна 0110 и регистр сравнения цветов содержит значение 0010, то при сравнении будет возвращен байт, у которого бит 3 равен 0, если в регистре безразличия цветов все биты равны 1. Hо если регистр без- различия цветов содержит 1011, то в байте, возвращаемом процессору бит 3 будет равен 1.

Регистр безразличия цветов имеет адрес порта 3CFH и индексируется засылкой 7 в порт 3CEH. Старшие 4 его бита не играют никакой роли. Отметим, что документация IBM (от 2 августа 1984 г.) утверждает что регистр действует обратным образом, т.е., что 1 в регистре заставляет операцию сравнения игнорировать соответствующую битовую плоскость. Эксперимент показывает обратное.

Hи один из этих двух режимов чтения не может дать быстрый ответ на вопрос о цвете определенной точки. В режиме чтения 0 необходимы 4 отдельных чтения, по одному для каждой битовой плоскости, после чего надо еще выделить соответствующие биты из каждого байта. В режиме чтения 1, с другой стороны, может потребоваться до 16 чтений, прежде чем для требуемой точки будет возвращен установленный бит, указывающий что эта точка имеет данный цвет. Hо хотя EGA относительно медленно выполняет данную задачу, зато для других целей он работает очень быстро.

Средний уровень.

Функция D прерывания 10H возвращает код цвета указанной точки. BIOS имеющийся на плате EGA обеспечивает, что эта функция работает в любом режиме дисплея. Hадо поместить номер строки (отсчитываемый от 0) в DX, а номер столбца (также отсчитываемый от 0) в CX. Результат возвращается в AL.
;---определяем код палетты точки 100,200
MOV AH,0DH ;номер функции чтения цвета точки
MOV DX,100 ;номер строки
MOV CX,200 ;номер столбца
INT 10H ;теперь код цвета в AL

Hизкий уровень.

Для графических режимов цветного адаптора и PCjr надо просто обратить процесс прямого отображения в память, которым устанавливается цвет точки, как показано в {4.4.2}. Можно испоьзовать приведенный там пример, который надо завершить следующим кодом:
;---изменение битов (место для вставки изменений)
MOV AH,ES:[BX] ;берем байт из нужной позиции
ROR AH,CL ;сдвигаем 2 нужных бита вниз
AND AH,00000011B ;выключаем остальные биты
RET ;теперь в AH - код палетты

Для режимов EGA от DH до 10H надо пользоваться регистрами, которые были описаны выше. В следующем примере режим чтения 0 испоьзуется для чтения битовой плоскости 2 по адресу A000:0012.
;---установка режима чтения
MOV DX,3CEH ;индексный регистр
MOV AL,5 ;сначала адресуем регистр режима
OUT DX,AL ;посылаем индекс
INC DX ;указываем на сам регистр
MOV AL,0 ;устанавливаем режим чтения 0
OUT DX,AL ;
;---установка битовой плоскости, которую будем читать
DEC DX ;назад к индексному регистру
MOV AL,4 ;адрес регистра выбора карты
OUT DX,AL ;посылаем индекс
INC DX ;указываем на сам регистр
MOV AL,2 ;запрос битовой плоскости 2
OUT DX,AL ;посылаем значение
;---чтение битовой плоскости
MOV AX,0A000H ;адрес видеобуфера
MOV ES,AX ;
MOV BX,12 ;смещение в буфере
MOV AL,ES:[BX] ;читаем из битовой плоскости 2
И, наконец, пример поиска кодов цвета 0010 и 1010 с использованием режима чтения 1:
;---установка режима чтения
MOV DX,3CEH ;регистр индекса
MOV AL,5 ;адресуем сначала регистр режима
OUT DX,AL ;посылаем индекс
INC DX ;указываем на сам регистр
MOV AL,8 ;устанавливаем бит 3 для режима 1
OUT DX,AL ;устанавливаем режим
;---установка регистра сравнения цветов
DEC DX ;возвращаемся к индексному регистру
MOV AL,2 ;адрес регистра сравнения цветов
OUT DX,AL ;посылаем индекс
INC DX ;указываем на сам регистр
MOV AL,0010B ;код цвета
OUT DX,AL ;посылаем код
;---установка регистра безразличия цветов
DEC DX ;возвращаемся к индексному регистру
MOV AL,7 ;адрес регистра безразличия цветов
OUT DX,AL ;посылаем индекс
INC DX ;указываем на сам регистр
MOV AL,0111B ;принимаем коды 1010 или 0010
OUT DX,AL ;посылаем данные
;---поиск цвета
MOV AX,0A000H ;адрес видеобуфера
MOV ES,AX ;
MOV BX,12 ;смещение в буфере
MOV AL,ES:[BX] ;читаем позицию буфера
CMP AL,0 ;установлены биты?
JNZ FOUND_IT ;если да, то ищем у какой точки


<~-4.4.3 Рисование точки на экране (EGA).
Содержание
4.4.5 Рисование линий на экране.-~>

Сайт управляется системой uCoz