Файл: jourdain_spravochnik_programmista.docx

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

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

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

Добавлен: 04.07.2020

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

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

дится ли она в четной или нечетной строке. В данном примере стро-

ка помещена в CX, а столбец - в DX. Если бит 0 регистра CX равен

0, то строка имеет четный номер. Четные строки расположены со

смещением 0 относительно начала буфера. Если же строка имеет

нечетный номер, то необходимо добавить смещение 2000H для указа-

ния на начало второй половины буфера.

Затем разделите номер строки на 2, необходимо подсчитать число

только четных или нечетных строк и умножьте результат на 80, т.к.

на одну строку расходуется 80 байт. Для деления можно использо-

вать инструкцию SHL, а результат даст общее число байтов во всех

строках, предшествующих строке, в которой расположена искомая

точка.

Вместо того, чтобы затем вычислять число столбцов в текущей

строке, лучше сначала определить позицию пары битов в байте,

которые содержат эту точку. Это достигается обращением всех битов

в номере столбца (после того как сохранена его копия) и выделения

двух младших битов. Эта процедура покажет находятся ли два бита,

относящиеся к точке на первой, второй, третьей или четвертой

позиции в байте. Умножив это значение на 2 мы получаем номер в

байте первого из двух битов, относящихся к данной точке.

Затем приходит время подсчитать число байтов в строке, пред-

шествующих байту, содержащему итнформацию о требуемой точке. Для

режима умеренного разрешения надо разделить число столбцов на 4,

а для высокого разрешения - на 8. После этого надо сложить три

смещения: смещение за счет номера строки, за счет номера столбца

и смещение начала четных/нечетных строк в буфере. После этого Вы

можете получить требуемый байт из буфера.



Наконец, надо произвести операцию над соответствующими битами

байта. Вращайте байт до тех пор, пока пара битов относящихся к

точке не станет младшими. При вращении необходимо использовать

ранее подсчитанное значение позиции битов. Затем выключите оба

бита поместите в них инструкцией OR требуемый код палетты. Затем

надо произвести обратное вращение и послать байт обратно в буфер.


;---в сегменте данных

PALETTE_COLOR DB 2


;---вызов процедуры

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

MOV ES,AX ;

MOV CX,100 ;номер строки

MOV DX,180 ;номер столбца

CALL SET_DOT ;

.

.

;---определяем число байтов в предшествующих строках

SET_DOT PROC

TEST CL,1 ;номер строки нечетный?

JZ EVEN_ROW ;если нет, то вперед

MOV BX,2000H ;смещение для нечетных строк

JMP SHORT CONTINUE ;переход вперед

EVEN_ROW: MOV BX,0 ;смещение для четных строк

CONTINUE: SHR CX,1 ;делим число строк на 2

MOV AL,80 ;умножаем на 80

MUL CL ;в AX - число байтов

;---определяем положение пары бит в байте

MOV CX,DX ;копируем номер столбца

NOT CL ;обращаем биты

AND CL,00000011B ;в CL - позиция битов (0-3)

SHL CL,1 ;позиция первого бита пары


;---подсчитываем смещение столбца в байтах

SHR DX,1 ;делим номер столбца на 4

SHR DX,1 ;(нужны два младших бита)

;---вычисляем смещение для изменяемого байта

ADD AX,DX ;складываем все три смещения

ADD BX,AX ;

;---изменяем биты нужного байта

MOV AH,ES:[BX] ;читаем нужный байт

ROR AH,CL ;сдвигаем нужные биты вниз

AND AH,11111100B ;чистим младшие 2 бита

MOV AL,PALETTE_COLOR ;изменяем их на цвет палетты

OR AH,AL ;

ROL AH,CL ;обратное вращение

MOV ES:[BX],AH ;возвращаем байт

RET ;

SET_DOT ENDP




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 помещается в этой позиции во всех разрешенных битовых

плоскостях.

Вообще говоря, программа должна сначала прочитать любую ячей-


ку, в которую она собирается записать меньше чем 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 предназначен для специальных приложений. В этом

режиме текущее содержимое регистра задвижки записывается по ука-

занному адресу. Напоминаем, что регистры задвижки заполняются

операцией чтения. Этот режим очень полезен для быстрого переноса

данных при операциях сдвига экрана. Регистр маски битов и регистр