|
|
|
|
Чтение битовых матриц
Поскольку каждый байт адресного пространства центрального
процессора, зарезервированного для EGA, представляет 4 байта графической памяти, память EGA не может быть прочитана непосредственно центральным
процессором. EGA возвратит байт из битовой
матрицы, выбранной в регистре выбора чтения битовой матрицы. Считываемую матрицу необходимо установить перед чтением смещения
EGA, содержащего интересующие Вас элементы изображения.
Для определения цвета заданного элемента изображения требуется отдельное чтение из каждой битовой матрицы. Каждый бит 4-битового значения цвета
расположен в одной из четырех битовых матриц.
Самый значимый бит значения цвета находится в битовой матрице 3,
а менее значимый бит в битовой матрице 0. Регистр выбора чтения
матрицы имеет индекс 4 в графических чипах 1 и 2 EGA. Так как
каждая битовая матрица EGA должна считываться отдельно, значение
регистра выбора чтения матрицы соответствует только одной битовой
матрице EGA в один момент времени.
Функция в программе 9-7 возвращает цвет элемента изображения
на дисплее. Так же как и fastdot(), она читает цвет точки в несколько раз быстрее, чем эквивалентная подпрограмма BIOS.
Смещение байта, содержащего элемент изображения, определяется
точно также, как и в подпрограмме fastdot(). Значение маски бита
вычисляется определением номера бита изменяемого байта. Но значение маски бита не посылается в регистр маски бита EGA. Регистр
маски бита EGA не влияет на байты, читаемые EGA. Маска бита используется для изоляции элемента изображения от байта, считываемого из битовой
матрицы EGA. Биты затем прибавляются матрица за
матрицей к коду цвета элемента изображения. Регистр выбора чтения
матрицы выбирает матрицу для чтения. Битовые матрицы читаются в
обратном порядке (матрица 3, 2, 1, 0), так как это облегчает
трансляцию кода. Обратите внимание, что регистр выбора чтения
матрицы не сбрасывается в конце подпрограммы. При выполнении цикла в последний раз регистр выбора чтения матрицы устанавливается
в 0, значение по умолчанию.
Листинг 9-7. Программа, возвращающая цвет элемента изображения
-----------------------------------------------------------------
/* возвращает цвет элемента изображения */
int readdot(row,col)
int row,col;
{
registr color = 0 ;
registr latch ;
unsigned char far *rgen = (char far *)(0xA0000000L +
(col >> 3) +
(row * GET_CRT_COLS())) ;
int bit_number = (col & 7)^7 ;
int bit_mask = (1 << bit_number) ;
int plane ;
/* Пройти через каждый массив 3, 2, 1, 0 */
for(plane = 3; plane >= 0; plane--)
{
EGA_GRFX(4,plane) ; /* выбрать массив */
latch = *(rgen) & bit_mask ; /* бит из этого массива */
latch >>= bit_number ; /* выровнять справа */
color <<= 1 ; /* место для следующего бита */
color |= latch ; /* прибавить бит */
}
return(color) ;
}
----------------------------------------------------------------
|
|
|