Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsia_8-11_Massivy-struktury.doc
Скачиваний:
11
Добавлен:
21.12.2018
Размер:
1.47 Mб
Скачать

Прокрутка областей экрана, копирование областей экрана.

Прием основан на использовании регистра Режим (индекс 5) и принципа действия регистров-защелок - для выполнения копирования 8-ми бытовых ячеек без изменения в пределах видеопамяти программе не нужно получать значения цветов, распределенных по 4-м битовым матрицам. Используется режим записи 1 регистра Режим.

; На входе: di - смещение видеопамяти, по которому производится копирование

; si - смещение видеопамяти, по которому находится копируемая ячейка

; * Пример копирует только одну 8-ми пиксельную ячейку. Нетрудно модиицировать его для копирования/прокрутки любых областей экрана.

CopyPixels PROC

push ES

push 0A000h

pop ES

mov DX, 3CEh

mov AX, 0105h

out DX, AX ; Выбор регистра Режим и одновременная установка режима записи 1

mov AH, ES:[DI] ; Чтение ячейки в регистры-защелки

mov ES:[SI], AH ; Запись регистров-защелок в память

pop ES

ret

CopyPixels ENDP

Следует отметить, что пример эффективен только в том случае, если прокручиваемая/копируемая область по ширине и начальная координата области по горизонтали кратны 8-ми пикселям.

Чтение отдельных пикселей с экрана.

Прием основан на использовании регистров Выбор Схемы Чтения (индекс 4) и Режим (индекс 5). В зависимости от установки бита 3 регистра Режим можно выбрать 2 режима чтения. В режиме чтения 0 чтение из байта памяти возвращает байт, записанный в битовой матрице, заданной в регистре Выбор Схемы Чтения. Таким образом, чтобы считать 8-ми пиксельную ячейку экрана потребуется 4 операции чтения и, соответственно, 4 байта в области данных для сохранения прочитанной ячейки. Режим 1 более сложен для программирования и на мой взгляд менее функционален для решения простых прикладных задач, поэтому я опускаю его подробное рассмотрение.

Следующий пример демонстрирует чтение 8-ми пиксельной ячейки с координатами 0, 0 в область данных со смещением DI

; На входе: DI - смещение области данных для сохранения значений.

; SI - смещение ячейки в видеопамяти

ReadPixels PROC

push ES

push 0A000h

pop ES

mov DX, 3CEh

mov AX, 0005h

out DX, AX ; Выбор регистра Режим и одновременная установка режима чтения 0

xor AH, AH

@Again: mov AL, 04h

out DX, AX ; Выбор регистра Выбор Схемы Чтения и установка битовой матрицы AH

mov AL, ES:[SI]

mov DS:[DI], AL

inc DI

inc AH

cmp AH, 4

jnz @Again

pop ES

ret

ReadPixels ENDP

Следует заметить, что восстановление сохраненной таким образом области экрана - восстановление с использованием регистров Графического Контроллера - вызовет определенные трудности. Может потребоваться не 4 операции записи, а значительно больше - в зависимости от "разноцветья" пикселей в сохраненных ячейках. Однако, здесь нам на помощь приходит другой прием - рисование с помощью регистров Указателя Последовательности.

Рисование с помощью регистров Указателя Последовательности

Регистры Указателя Последовательности также доступны только косвенно через порт 3C5h. Индекс требуемого регистра следует записать в порт 3C4h - в регистр Адреса Указателя Последовательности.

Установка цвета ячейки пикселей.

Прием основан на использовании регистра Маскирования Растра (индекс 2), позволяющего разрешить/запретить для записи отдельные битовые матрицы.

Следующий пример демонстрирует вывод 8-ми пиксельной ячейки на экран. Предполагается, что в области данных по смещению SI находятся 4 байта ячейки, эквивалентные полученным в результате Чтения ячейки экрана в предыдущем примере. Следует отметить, что формат регистра AH, идентифицирующего текущую битовую матрицу отличается от предыдущего примера. Матрица в регистре Выбор Схемы Чтения задается обычным числовым индексом (в битах 0..2) матрицы. В регистре Маскирования Растра матрица задается с помощью битовой маски:

Бит 0 - Матрица 0

1 - Матрица 1

2 - Матрица 2

3 - Матрица 3

Остальные биты регистра не используются.

Установка бита в 1 разрешает запись в Матрицу, сброс бита - запрещает.

; На входе: SI - Смещение области данных, по которому располагаются

; подготовленные 4 байта ячейки.

; DI - Смещение в видеопамяти, по которому записывается ячейка

WritePixels PROC

push ES

push 0A000h

pop ES

mov DX, 3C4h

mov AH, 01h

@Again: mov AL, 02h

out DX, AX ; Выбор регистра Маскирования Растра и установка битовой матрицы AH

mov AL, DS:[SI]

mov ES:[DI], AL

inc SI

shl AH, 1

cmp AH, 10h

jnz @Again

mov AX,0F02h

out DX,AX ; *

pop ES

ret

WritePixels ENDP

* Запись в регистр Маскирования Растра, осуществляемая командами mov AX, 0F02h; out DX, AX разрешает запись во все битовые матрица. Необходимость выдачи этих команд обусловлена тем, что установки регистра Маскирования Растра действуют для всех режимов записи (в том числе для записи через регистры Графического Контроллера, рассмотренной выше).

Регистр Маскирования Растра кроме того очень удобен для выполнения операций только над определенными цветами определенных пикселей. Режим записи 0 регистра Режим Графического Контроллера позволяет комбинировать установки регистра Маскирования Растра (разрешающего матрицы) и регистра Битовой Маски (разрешающего пиксели).

Следующий фрагмент устанавливает яркость каждого второго пикселя ячейки не изменяя цвет (при стандартной настройке палитры):

mov DX 3C4h

mov AX, 0802h ; Разрешаем битовую матрицу 3

out DX, AX

mov DX, 3CEh

mov AH, 01010101b ; Маскируем пиксели

mov AL, 8

out DX, AX

mov AX, 0005h ; Устанавливаем режим записи 0

out DX, AX

mov AL, 0FFh

mov AH, ES:[DI]

mov ES:[DI], AL ; Изменяем цвет

Графический режим 13h

Графический режим 13h (320*200 пикселей, 256 цветов) представляется значительно более простым для программирования. Видеобуфер в этом режиме располагается также по адресу 0A0000h, однако каждому экранному пикселю соответствует один байт видеобуфера. Иными словами, запись в видеопамять байта означает установку цвета (в диапазоне 0..255) экранного пикселя. Так как байты-пиксели располагаются в памяти последовательно, непосредственно один за другим, вычисление адреса пикселя в памяти по заданным координатам полностью эквивалентно вычислению адреса символа в текстовом режиме.

Конечно, это описание возможностей регистрового программирования видеоадаптеров далеко не полно. Целью данной статьи было дать возможность читателю быстро и легко оснастить программу наиболее существенными в большинстве практических приложений графическими функциями, а также показать на примерах, что регистровое программирование далеко не так сложно, как может показаться неискушенному кодеру на первый взгляд. А при более глубоком ознакомлении с документацией по этому вопросу можно творить с обычным видеоадаптером почти фантастические вещи :)

114

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]