Справочник программиста на персональном компьютере фирмы IBM. Вывод на терминал - Рисование точки на экране (EGA)

ОГЛАВЛЕНИЕ

     4.4.3 Рисование точки на экране (EGA).


   У EGA графика более сложная. С  точки зрения процессора режимы
экрана 0-7 действуют так же, как соответствующие режимы для цвет-
ного адаптера или PCjr, но режимы от DH до 10H совершенно другие.
Организация  памяти  для этих режимов меняется, в зависимости  от
числа используемых цветов и количества памяти, имеющейся на плате
дисплея. Смотрите рис. 4-4 в [4.4.0].
   В  режимах D, E и 10H память разбита на 4  битовые  плоскости.
Каждая плоскость организована таким же образом, как для черно-бе-
лого режима высокого разрешения цветного адаптера, который обсуж-
дался в [4.4.2]:  когда  байт  данных  посылается  в определенный
адрес  видеобуфера, то каждый бит соответствует точке на  экране,
причем весь байт соответствует  горизонтальному сегменту линии, а
бит  7 соответствует самой левой точке.  Выводятся  четыре  таких
битовых плоскости, относящиеся к  одним и тем же адресам в видео-
буфере. Это приводит к тому, что каждая точка описывается четырь-
мя битами (давая 16 цветов), причем каждый бит находится вотдель-
ном байте отдельной битовой плоскости.
   Но  как Вы можете записать 4 различных байта данных,  располо-
женных по одному и тому же адресу? Ответ на этот вопрос состоит в
том,  что  Вы не посылаете последовательно четыре байта по  этому
адресу.  Вместо этого один из трех режимов записи позволяет изме-
нить все 4 байта, на основании одного байта данных полученного от
процессора. Влияние данных посланных процессором зависит от уста-
новки  нескольких регистров, включающих два регистра маски, кото-
рые определяют на какие биты и  в  каких битовых плоскостях будут
изменяться биты.
   Для  понимания этих регистров мы должны сначала разобраться  с
четырьмя регистрами задвижки (latch register).  Они содержат дан-
ные для четырех битовых плоскостей в той позиции, к которой  было
последнее обращение. (Заметим,  что  термин битовая плоскость ис-
пользуется как для целой области видеобуфера, так и для однобайт-
ного буфера,  временно  хранящегося  в  регистре задвижки.) Когда
процессор  посылает данные по определенному адресу, то эти данные
могут изменить или полностью сменить  данные регистра задвижки, а
впоследствии  именно данные из регистра задвижки  записываются  в
видеобуфер. Каким  образом  данные  процессора  влияют на регистр
задвижки зависит от используемого режима записи, а также от уста-
новки некоторых других регистров. При чтении адреса из видеобуфе-
ра  регистры  задвижки заполняются четырьмя  байтами  из  четырех
битовых плоскостей по данному адресу.   Регистрами задвижки легко
манипулировать,  производя  их  содержимым  различные  логические
операции, что позволяет устраивать различные графические трюки.
   Регистр маски битов и регистр маски карты действуют на регист-
ры  задвижки, защищая определенные биты или битовые плоскости  от
изменения под действием данных,  поступающих  от процессора.  Ре-
гистр  маски  битов  это регистр только для записи,  адрес  порта
которого 3CFH.  Сначала надо послать 8 в порт 3CEH, чтобы указать
на этот регистр. Установка бита этого регистра в 1 маскирует этот
бит во всех четырех  битовых  плоскостях,  делая  соответствующую
точку  недоступной для изменения.  Однако, поскольку оборудование
работает  в  байтовых  терминах, то реально  "неизменяемые"  биты
перезаписываются в  четыре  битовые  плоскости.  Данные  для этих
маскируемых битов хранятся в регистрах задвижки, поэтому програм-

ма должна быть уверена, что текущее содержимое регистров задвижки
относится  к  правильному адресу памяти.  По этой  причине  перед
записью по данному адресу надо считывать из него.
   Регистр маски карты имеет адрес порта 3C5H. Этот регистр толь-
ко для записи. Перед посылкой данных надо послать по этому адресу
2 как указатель. Биты 0-3  этого  регистра  соответствуют битовым
плоскостям  0-3; старшие 4 бита регистра не используются.   Когда
биты 0-3 равны 0, то  сответствующие  битовые  плоскости не изме-
няются при операциях записи. Это свойство используется по-разному
в различных режимах записи, как Вы увидите в дальнейшем.
   Три режима записи  устанавливаются  регистром  режима, который
является  регистром  только для записи, а адрес  порта  для  него
3CFH, который  индексируется  предварительной  засылкой  5 в этот
порт.  Режим записи устанавливается в битах 0 и 1, как число от 0
до 2.  Бит 2 должен быть равным  0, так же как и биты 4-7.  Бит 3
устанавливает  один из двух режимов чтения из видеобуфера.   Этот
бит может быть 0 или 1. BIOS EGA устанавливает режим записи в 00.

   Режим записи 0:
   В простейшем случае режим записи  0 копирует данные процессора
в каждую из четырех битовых плоскостей.  Например, пусть по опре-
деленному адресу видеобуфера  послано  11111111B  и разрешены все
биты и все битовые плоскости (т.е. ничто не маскировано описанны-
ми выше регистрами масок). Тогда каждый бит во всех четырех плос-
костях будет установлен в 1, так что цепочка битов для каждой  из
соответствующих точек  будет  1111B.   Это  означает, что 8 точек
будут выведены в цвете 15, который изначально соответствует ярко-
белому цвету, хотя  регистры  палетты  позволяют,  чтобы на самом
деле это был любой из допустимых цветов.
   Теперь  рассмотрим  тот  же  случай,  но  посылается  значение
00001000B. Цепочка битов для  точки 3 будет 1111, а для остальных
- 0000, что соответствует черному (изначально).  Поэтому в данном
случае только точка 3 появится на экране (яркобелая), а остальные
7  точек будут выключены.  Даже если остальные 7 точек перед этим
выводились в каком-то цвете, то теперь  все они будут переключены
на 0000.
   Теперь  рассмотрим другие цвета, кроме 1111B.  Если Вы пошлете
код палетты желаемого цвета  в  регистр  маски  карты, то регистр
маскирует определенные битовые плоскости таким образом, что будет
воспроизведен требуемый  цвет.  Например,  если  Вы хотите цвет с
кодом 0100, то пошлите 0100 в регистр маски карты.  Тогда битовые
плоскости 0, 1 и 3 не будут изменяться.  Когда Вы пошлете по нуж-
ному  адресу 11111111B, то это значение будет помещено  только  в
битовую плоскость 2 и цепочка  битов для каждой точки будет 0100.
Если Вы пошлете по этому адресу 00001000B, то точка 3 будет иметь
цепочку битов 0100, а остальные точки - 0000.
   Имеется, однако, одна сложность. Регистр маски карты запрещает
изменение битовых плоскостей, но не обнуляет их. Предположим, что
битовая плоскость 0 была заполнена единицами, а битовые плоскости
1  и 3 были заполнены нулями.  Если Вы запретите изменения в этих
трех плоскостях, а затем пошлете 11111111B по определенному адре-
су,  то битовая плоскость 2 будет заполнена 11111111B, а  битовая
плоскость 0 сохранит  свои  единицы,  поэтому  результирующий код
цвета  каждой точки станет 0101B.  Встречаются случаи, когда  это
свойство можно использовать для изменения цветов экрана. Но вооб-

ще говоря, необходимо очищать  все четыре битовые плоскости (т.е.
все  четыре  регистра задвижки) перед тем, как писать туда  любые
цвета кроме 1111B или 0000B.   Это  делается просто посылкой 0 по
указанному  адресу.  Необходимо чтобы при этом была разрешена за-
пись во все четыре битовые плоскости.
   Вышеприведенное  обсуждение   касалось  одновременного  вывода
восьми точек.  Ну а как вывести меньшее количество точек? В  этом
случае, конечно,  необходимо  сохранить  существующие  данные для
некоторых  точек,  а чтобы это было возможно  текущее  содержимое
данного адреса сохраняется в  регистрах  задвижки.  Затем исполь-
зуется регистр маски битов для маскирования тех точек, которые не
должны изменяться. Если бит этого регистра сброшен в 0, то данные
получаемые от процессора для этого бита игнорируются и вместо них
используются данные, хранящиеся  в  регистрах  задвижки. Равен ли
этот бит в данных процессора 0 или 1 - не имеет значения; если Вы
изменяете только бит 2, а все  остальные  маскированы, то данные,
которые  приходят от процессора могут быть 0FFH или 4H, или любое
другое значение, для которого бит  2 установлен. Если бит 2 сьро-
шен,  то 0 помещается в этой позиции во всех разрешенных  битовых
плоскостях.