Файл: jourdain_spravochnik_programmista.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.07.2020

Просмотров: 3086

Скачиваний: 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 ;устанавливаем режим


И, наконец, примеры трех режимов записи:


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


;---рисуем красную точку в левом верхнем углу экрана

MOV AX,0A000H ;указываем на видеобуфер

MOV ES,AX ;

MOV BX,0 ;указываем на первый байт буфера

;---маскируем все биты, кроме седьмого

MOV DX,3CEH ;указываем на адресный регистр

MOV AL,8 ;номер регистра

OUT DX,AL ;посылаем его

INC DX ;указываем на регистр данных

MOV AL,10000000B ;маска

OUT DX,AL ;посылаем данные

;---чистим текущее содержимое задвижки

MOV AL,ES:[BX] ;читаем содержимое в задвижку

MOV AL,0 ;готовимся к очистке

MOV ES:[BX],AL ;чистим задвижку

;---установка регистра маски карты для красного цвета

MOV DX,3C4H ;указываем на адресный регистр

MOV AL,2 ;индекс регистра маски карты

OUT DX,AL ;установка адреса

INC DX ;указываем на регистр данных

MOV AL,4 ;код цвета

OUT DX,AL ;посылаем код цвета

;---рисуем точку

MOV AL,0FFH ;любое значение с установленным 7 битом

MOV ES:[BX],AL ;выводим точку



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


;---копируем строку в следующую строку

MOV CX,80 ;число байтов в строке

MOV BX,0 ;начинаем с 1-го байта буфера

MOV AX,0A000H ;адрес буфера

MOV ES,AX ;

NEXT_BYTE: MOV AL,ES:[BX] ;заполняем задвижку

MOV ES:[BX]+80,AL ;выводим в следующую строку

INC BX ;переходим к следующему байту

LOOP NEXT_BYTE ;


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


;---рисуем красную точку в левом верхнем углу экрана


MOV AX,0A000H ;адрес буфера

MOV ES,AX ;

MOV BX,0 ;указываем на первый байт буфера

;---установка регистра маски битов

MOV DX,3CEH ;указываем на адресный регистр

MOV AL,8 ;регистр маски битов

OUT DX,AL ;адресуем регистр

INC DX ;указываем на регистр данных

MOV AL,10000000B ;маскируем все биты, кроме 7-го

OUT DX,AL ;посылаем данные

;---рисуем красную точку

MOV AL,ES:[BX] ;заполняем регистры задвижки

MOV AL,4 ;красный цвет

MOV ES:[BX],AL ;рисуем точку




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; обнуление

одного из этих битов приведет к тому, что содержимое соответст-

вующей битовой плоскости будет игнорироваться. Например, если

цепочка битов для точки 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 ;устанавливаем режим чтения 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