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




   Вообще говоря, программа должна  сначала прочитать любую ячей-
ку, в которую она собирается записать меньше чем 8 точек. Имеются
два режима чтения (обсуждаемые в [4.4.4])  и безразлично какой из
них выбран.  Операция чтения загружает регистры задвижки четырьмя
байтами данных для данного  адреса  памяти.  Данные, возвращаемые
процессору операцией чтения, могут быть отброшены.
   До  сих пор были рассмотрены самые простые возможности  режима
записи 0. При  желании  Вы  можете  делать  намного более сложные
манипуляции. Одна из возможностей состоит в модификации регистров
задвижки с помощью логических операций перед записью.  Для реали-
зации этой возможности регистр вращения данных использует следую-
щие биты:

   биты 2-0        число вращений
        4-3        00     данные не модифицируются
                   01     логическое И с регистром задвижки
                   10     логическое ИЛИ с регистром задвижки
                   11     исключающее ИЛИ с регистром задвижки
        7-5        не используются

   Число  вращений,  которое  может  быть  от  0 до 7, показывает
сколько битов данных должны вращаться перед тем, как поместить их
в регистр задвижки.  Обычно это значение равно нулю.  Аналогично,
биты 4-3, как правило равны 00, кроме случаев, когда производятся
логические операции. За счет  манипуляций с этим регистром одни и
те  же данные могут давать различные цвета и изображения без  до-
полнительной  процессорной  обработки.   Регистр  вращения данных
индексируется  посылкой 3 в порт 3CEH; затем данные посылаются  в
3CFH.
   Наконец, режим записи 0 может  работать совсем по-другому если
разрешены  установка/сброс.  В этом случае определенные  цвета  в
младших четырех битах  регистра  установки/сброса  (который  тоже
имеет адрес порта 3CFH, а индексируется посылкой 0 в 3CEH).  Име-
ется соответствующий регистр разрешения установки/сброса, который
разрешает  любой из этих четырех битов, устанавливая свои младшие

биты в 1. Когда все 4 бита в регистре установки/сброса разрешены,
то они помещаются во все 8 адресов битовой плоскости при  получе-
нии данных от процессора, при  этом сами данные процессора отбра-
сываются.  Если разрешены не все биты установки/сброса, то данные
процессора помещаются для запрещенных точек. Отметим, что регистр
маски битов запрещает запись данных установки/сброса в определен-
ные точки, но  установка  регистра  маски  карты игнорируется при
использовании установки/сброса.  BIOS инициализирует регистр раз-
решения установки/сброса в  0,  так  что  он неактивен. Его адрес
порта 3CFH, а индексируется он посылкой 1 в порт 3CEH.

Режим записи 1:
   Режим записи 1 предназначен для специальных приложений. В этом
режиме текущее содержимое  регистра задвижки записывается по ука-
занному  адресу.  Напоминаем, что регистры  задвижки  заполняются
операцией чтения.  Этот режим очень полезен для быстрого переноса
данных при операциях сдвига экрана. Регистр маски битов и регистр
маски  карты не влияют на эту операцию.  Не имеет также  значения
какие данные посылает процессор  -  содержимое регистров задвижки
записывается в память без изменений.

Режим записи 2:
   Режим  записи 2 предоставляет альтернативный способ  установки
отдельных точек.  Процессор посылает данные, у которых имеют зна-
чение  только  4 младших бита, которые рассматриваются  как  цвет
(индекс регистра палетты).  Можно  сказать, что эта цепочка битов
вставляется  поперек битовых плоскостей.  Цепочка дублируется  на
все восемь точек, относящихся к  данному  адресу, до тех пор пока
регистр маски битов не предохраняет определенные точки от измене-
ния. Регистр маски карты активен, как и в режиме записи 0. Конеч-
но процессор должен послать полный байт, но только младшие 4 бита
существенны.

   Высокий уровень.


   Бейсик поддерживает EGA в традиционных режимах цветного графи-
ческого адаптера. Ко времени выхода этой книги поддержки дополни-
тельных режимов EGA не  существовало.  Поэтому  у Вас нет другого
выхода,  кроме как использовать прямое отображение в  видеобуфер,
который начинается с  адреса  A000:0000.  Самая  тяжелая проблема
состоит  в установке режима дисплея.  Для ее решения  используйте
следующую процедуру на машинном языке:

10 S$ = CHR$(&H2A)+CHR$(&HE4)+CHR$(&HB0)+CHR$(&H0D)
        +CHR$(&HCD)+CHR$(&H10)+CHR$(&HCB)
20 DEF SEG                  'установка сегмента
30 Y = VARPTR(S$)           'указатель на строку
40 Z = PEEK(Y+1)+PEEK(Y+2)*256  'вычисление адреса строки
50 CALL Z                   'вызов процедуры

Четвертый байт S$ содержит номер режима, в данном случае режим D.
Вы можете выбрать другой режим.   В  приложении Г объясняется как
эта  процедура работает в Бейсике.  Она полностью завершенная, не
нужно никакой побочной памяти,  в  которой содержался бы машинный
код.   Не  забудьте восстановить режим дисплея  после  завершения
своих манипуляций.

   Затем надо установить  соответствующий  режим  записи. Вот как
устанавливается режим записи 2:

50 OUT &H3CE,5         'индексируем регистр режима записи
60 OUT &H3CF,2         'выбираем режим 2

Режим  записи  также должен быть  восстановлен  после  завершения
программы.
   Наконец, приведем образцы кода, реализующие прямое отображение
в видеобуфер:

Режим записи 0:

100 'рисуем красную точку в левом верхнем углу экрана
110 DEF SEG = &HA000     'указываем на видеобуфер
120 OUT &H3CE,8          'адресуем регистр маски битов
130 OUT &H3CF,128        'маскируем все биты, кроме седьмого
140 X = PEEK(0)          'читаем текущее значение в задвижку
150 POKE 0,0             'чистим
160 OUT &H3C4,2          'адресуем регистр маски карты
170 OUT &H3C5,4          'устанавливаем красный цвет
180 POKE 0,&HFF          'рисуем точку

Режим записи 1:

100 'копируем верхнюю строчку точек в следующую
110 DEF SEG = &HA000     'указываем на видеобуфер
120 FOR N = 0 TO 79      'для всех 80 байтов строки
130 X = PEEK(N)          'заполняем задвижки
140 POKE N+80,Y          'копируем в следующую строку
150 NEXT                 'переходим к следующему сегменту

Режим записи 2:

100 'рисуем красную точку в левом верхнем углу экрана
110 DEF SEG = &HA000     'указываем на видеобуфер
120 OUT &H3CE,8          'адресуем регистр маски битов
130 OUT &H3CF,128        'маскируем все биты, кроме седьмого
140 X = PEEK(0)          'читаем текущее значение в задвижку
150 POKE 0,4             'посылаем красный цвет

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


   EGA поддерживает стандартные графические функции BIOS.   Можно
вывести точку с помощью функции CH прерывания 10H, так же как для
цветного  дисплея или PCjr.  При входе DX должен содержать  номер
строки, а CX - номер столбца, и  то  и другое отсчитывается от 0.
Код цвета помещается в AL.  Содержимое AX меняется при выполнении
прерывания.

;---рисуем точку по адресу 50,100
   MOV  AH,0CH        ;функция вывода точки
   MOV  AL,12         ;выбираем регистр палетты 12
   MOV  CX,100        ;номер строки
   MOV  DX,50         ;номер столбца
   INT  10H           ;рисуем точку

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


   Ниже приведены примеры для  трех  режимов записи. Перед их ис-
пользованием  необходимо  установить режим дисплея,  использующий
видеобуфер с адреса A000:0000. Для этого можно использовать стан-
дартную функцию BIOS, например, для установки режима D:

   MOV  AH,0       ;функция установки режима
   MOV  AL,0DH     ;выбираем режим D
   INT  10H        ;устанавливаем режим

Не забудьте восстановить режим перед завершением программы. Кроме
того, Вам необходимо установить требуемый  режим записи. Вот при-
мер установки режима записи 2:

   MOV  DX,3CEH    ;указываем на регистр адреса
   MOV  AL,5       ;инедксируем регистр 5
   OUT  DX,AL      ;посылаем индекс
   INC  DX         ;указываем на регистр режима
   MOV  AL,2       ;выбираем режим записи 2
   OUT  DX,AL      ;устанавливаем режим

 
« Предыдущая статья   Следующая статья »