Аппаратные возможности VGA.
Аппаратный скролинг поддерживается видео картам стандарта VGA. Он не тратит процессорного времени, просто, пишите в пару портов, и все остальное делает сама видео карта вплоть до синхронизации с обратным ходом луча.
1. Некоторые функции VGA:
1.1 Графический Контроллер.
Графический контроллер является прмежуточным устройством между процессором и видео-памятью. По умолчанию настройки видео-карты прозрачны, но с помощью портов вы можете изменять аппаратное состояние видео-карты.
1.2 Регистры Видео Контроллера.
Видео контроллер управляет выводом на экран генерируя сигналы синхронизации и гашения. Он отображает цвета полученные в результате ударения потока электронов о люминисцентную поверхность обратной стороны ЭЛТ. Поток электронов (луч) перемещается черезь весь экран с лева на право (по горизонтали) и сверху вниз (по вертикали). Луч должен проходить весь экран 50, 60, 70 или более раз в секунду, в зависимости от времени перерисовки (обычно эту величиноу называют просто частотой монитора - для разных видео-режимов частоты разные). При возврате из конца одной строки в начало следующей происходит горизонтальное гашение луча. А при возврате из нижней строки в верхнюю происходит вертикальное гашение луча.
Именно вертикальное гашение наиболее стабильно, и применяется для синхронизации динамических сцен. (Очень неплохо перерисовывать содержимое видеопамяти в тот момент, когда она не отображается на экране).
1.3 Видео память.
Сегодня VGA видео карты могут иметь до 256Kb (или более) видео памяти, разбитой на блоки по 64kb, их иногда называют цветовымы (битовыми) слоями. Эти слои находятся в адресном пространстые процессора. Отображающийся в текущий момент слой можно менять путем программирования видео контроллера через порты.
1.4 Контроллер паллитры.
Этот контроллер определяет цвет, который будет отображен на экране, как для текстового, так и для графического режимов. Сердцем контроллера является таблица перекодировки цвета, которая переводит четырех битную информацию из видео памяти в 6 битовую информацию (EGA) или 12 битовую информацию (VGA).
2. Использование портов ввода/вывода.
2.1 Запись/чтение битовых планов.
Порт контроллера: 03CEh
Значения | Описание |
---|---|
00 | Установить/сбросить регистр |
01 | Установить/сбросить активный регистр |
02 | Цветовое сравнение регистров |
03 | Сдвиг данных и выбор функции |
04 | Чтение регистра выбора слоя |
05 | Регистр режима |
06 | Смешанный регистр |
07 | Color Don't care register |
08 | Регистр бтовой маски |
Запись в экран... (Запись в слой... включение слоя (порт 3CEh = 01)).
Пример:
mov dx,3CEh mov al,1 out dx,al inc dx
порт 3CEh = 01 | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||
* = Не используется для переключения слоев | |||||||||||||||||
d0=1 | слой 0 включен для записи | ||||||||||||||||
d0=0 | слой 0 выключен для записи | ||||||||||||||||
d1 | слой 1. | ||||||||||||||||
d2 | слой 2. | ||||||||||||||||
d3 | слой 3. |
Отсюда видно, что можно использовать один movsb для записи 4 пекселей (да и 8 тоже). Таким образом очистить экран 320x200x256 можно с такой-же скоростью, что и два экрана в текстовом режиме.
mov al,00 --> in al,dx and al,11110000b ; вырубаем для записи все слои or al,1 ; включаем для записи нулевой слой out dx,al ; пишем в порт
слой 1 | mov al,02h |
слой 2 | mov al,04h |
слой 3 | mov al,08h |
все слои | mov al,0Fh |
Чтение из памяти/экрана (Читаем регистр установки слоя... (порт 3CEh = 04))
порт 3CEh = 04 | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||
* = Не используется для переключения слоев | |||||||||||||||||
d0 & d1=00 | слой 0 read enbale. | ||||||||||||||||
01 | слой 0 включен для чтения. | ||||||||||||||||
10 | слой 1 включен для чтения. | ||||||||||||||||
11 | слой 2 включен для чтения. |
2.2 Логическая ширина экрана.
Обычно логическая ширина экрана совпадает с реальной шириной, но вы можете ее изменить, что-бы сделать экран шире, нарисовать в невидимой части экрана изображение и плавно (или не плавно) вывести его на экран.
Порт 3B4/3D4h | |||
---|---|---|---|
00h | Horizontal total | 0CH | Начало высвечиания (старший байт) |
01h | Horizontal display end | 0DH | Начало высвечиания (младший байт) |
02h | Start horizontal blank | 0EH | Cursor location high |
03h | End horizontal blank | 0FH | Cursor location low |
04h | Start horizontal retrace | 10H | Vertikal retrace start |
05h | End horizontal retrace | 11H | Vertikal Retrace end |
06h | Vertical total | 12H | Vertikal Display end |
07h | Overflow | 13H | Логическая ширина экарана |
08h | Preset row scan | 14H | Underline location |
09h | Maximum scan line | 15H | Start Vertikal Blank |
0Ah | Cursor Start | 16H | End Vertikal Blank |
0Bh | Cursor end | 17H | Mode Control register |
18h | Line Compare register |
Интересующее нас значение - 13h:
port[$3d4]:=$13 { порт 3D4h = 13h - логическая ширина экарана. } port[$3d5]:= { ...длина экрана... в нашем случае 40*4 =160 слов. }
3. Аппаратный скроллинг.
a) Байтовая Горизонтальная Прокрутка.
Если мы взглянем на порт 3D4h видео контроллера, то увидим функции с 0Ch и 0Dh. С помощью них производится управление началом высвечивания - 16 битный адресс записанный в эти регистры будет адресом высвечиваемым в верхнеи левом углу экрана.
0CH = Адрес (Старший байт); 0DH = Адрес (Младший байт);
b) Плавная Горизонтальная Прокрутка.
Для плавного скроллинга в текстовом режиме можно испоьзовать индекс 08h - Preset row scan.
порт 3CEh = 01 | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||
* = Не используется. | |||||||||||||||||
d4-d0 | Устанавливает row scan. |
с) Horizontal Pel Pan Register
Прежде всего этот регистр располагается в порту 3C0h (= Вспомогательный Регистр Контроллера.)
Порт 3C0h | |||
---|---|---|---|
00h | Color palette Register 0 | 0Ah | Color palete Register 10 |
01h | Color palette Register 1 | 0Bh | Color palete Register 11 |
02h | Color palette Register 2 | 0Ch | Color palete Register 12 |
03h | Color palette Register 3 | 0Dh | Color palete Register 13 |
04h | Color palette Register 4 | 0Eh | Color palete Register 14 |
05h | Color palette Register 5 | 0Fh | Color palete Register 15 |
06h | Color palette Register 6 | 10h | Mode Control Register |
07h | Color palette Register 7 | 11h | Screen Border color |
08h | Color palette Register 8 | 12h | Color plane enable register |
09h | Color palette Register 9 | 13h | Horizontal Panning regsiter |
14h | Color Select register |
порт 3C0h = 13h | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||
* = Зарезервированно. | |||||||||||||||||
d3-d0 | Сдвиг экрана по горизонтали на 1 пиксел (До 16 пикселей) |
Пример: В текстовом режиме:
Примечание: Если вы хотите сделать разделенный экран, и поместить статичное изображение в нижнюю часть и плавно скроллировать верхнюю, то вы можете обмануть контроллер, например как это сделано в MN2-Dentro...