
|
существляется через порт 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; обнуление одного из этих битов приведет к тому, что содержимое соответст- вующей битовой плоскости будет игнорироваться. Например, если цепочка битов для точки 3 (бит 3) по указанному адресу равна 0110 и регистр сравнения цветов содержит значение 0010, то при сравне- нии будет возвращен байт, у которого бит 3 равен 0, если в ре- гистре безразличия цветов все биты равны 1. Но если регистр без- различия цветов содержит 1011, то в байте, возвращаемом процессо- ру бит 3 будет равен 1. Регистр безразличия цветов имеет адрес порта 3CFH и индекси- руется засылкой 7 в порт 3CEH. Старшие 4 его бита не играют ника- кой роли. Отметим, что документация IBM (от 2 августа 1984 г.) утверждает что регистр действует обратным образом, т.е., что 1 в регистре заставляет операцию сравнения игнорировать соответствую- щую битовую плоскость. Эксперимент показывает обратное. Ни один из этих двух режимов чтения не может дать быстрый ответ на вопрос о цвете определенной точки. В режиме чтения 0 необходимы 4 отдельных чтения, по одному для каждой битовой плос- кости, после чего надо еще выделить соответствующие биты из каж- дого байта. В режиме чтения 1, с другой стороны, может потребо- ваться до 16 чтений, прежде чем для требуемой точки будет возвра- щен установленный бит, указывающий что эта точка имеет данный цвет. Но хотя EGA относительно медленно выполняет данную задачу, зато для других целей он работает очень быстро. Высокий уровень. Бейсик предоставляет функцию POINT, которая возвращает цвет точки. Цвет палетты точки, находящейся в столбце 200 и строке 100 находится путем Q = POINT(200,100). Значение, возвращаемое в Q - это обычный кодовый номер цвета. Если указана точка, находящаяся за пределами экрана, то функция POINT возвращает значение -1. Когда координатная система экрана изменяется оператором WINDOW [4.4.2], то функция POINT переходит к новой системе. POINT может также сообщить позицию последней выведенной точки. При использовании обычной координатной системы, в которой 0,0 соответствует левому верхнему углу экрана, Q = POINT(1) возвра- щает в Q x-координату точки, а Q = POINT(2) - y-координату. Если действует оператор WINDOW, то Q = POINT(3) и Q = POINT(4) возвра- щает x- и y-координаты в новой системе. Когда нет активного опе- ратора WINDOW, то последние два оператора действуют так же, как и первые два. К моменту выхода этой книги Бейсик не поддерживал улучшенные графические режимы EGA (D-10H). В этих режимах программа должна прямо читать содержимое видеобуфера. Вот пример использования режима чтения 1 для поиска кодов цветов 0001 и 1001: 100 OUT &H3CE,5 'адрес регистра режима 110 OUT &H3CF,8 'устанавливаем режим чтения 0 120 OUT &H3CE,2 'адрес регистра сравнения цветов 130 OUT &H3CF,1 'ищем цвет 0001 140 OUT &H3CE,7 'адрес регистра безразличия цветов 150 OUT &H3CF,7 '7 = 0111B, поэтому м. б. 0001 и 1001 160 DEF SEG = &HA000 'адрес видеобуфера для EGA 170 X = PEEK(0) 'читаем первый байт 180 IF X <> 0 THEN... '..то цвет 0001 или 1001 найден Средний уровень. Функция D прерывания 10H возвращает код цвета указанной точки. BIOS имеющийся на плате EGA обеспечивает, что эта функция рабо- тает в любом режиме дисплея. Надо поместить номер строки (отсчи- тываемый от 0) в DX, а номер столбца (также отсчитываемый от 0) - в CX. Результат возвращается в AL. ;---определяем код палетты точки 100,200 MOV AH,0DH ;номер функции чтения цвета точки MOV DX,100 ;номер строки MOV CX,200 ;номер столбца INT 10H ;теперь код цвета в AL Низкий уровень. Для графических режимов цветного адаптора и 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 ;устанавл |